[FFmpeg-devel] [PATCH]Addition of MLP encoder
Disha Singh
directionstar86 at gmail.com
Mon Mar 21 21:29:35 CET 2016
Qualification task for project TrueHD encoder.
There are two patches.
One has the changes made to other files to support mlpenc.c and the other
only has mlpenc.c.
Also attached is the diff file of mlpenc.c.
(Modified the file :
https://github.com/ramiropolla/soc/blob/master/mlp/mlpenc.c)
-------------- next part --------------
diff --git a/mlpenc.c b/ffmpeg/libavcodec/mlpenc.c
old mode 100644
new mode 100755
index 70cb7d8..e4939d0
--- a/mlpenc.c
+++ b/ffmpeg/libavcodec/mlpenc.c
@@ -24,9 +24,15 @@
#include "libavutil/crc.h"
#include "libavutil/avstring.h"
#include "mlp.h"
-#include "dsputil.h"
#include "lpc.h"
+#include "libavutil/internal.h"
+#include "libavutil/intreadwrite.h"
+#include "libavutil/channel_layout.h"
+#include "internal.h"
+#include "mlpdsp.h"
+#include "get_bits.h"
+
#define MAJOR_HEADER_INTERVAL 16
#define MLP_MIN_LPC_ORDER 1
@@ -187,8 +193,9 @@ typedef struct {
DecodingParams *seq_decoding_params;
unsigned int max_codebook_search;
+
- DSPContext dsp;
+ MLPDSPContext mlp_dsp;
} MLPEncodeContext;
static ChannelParams restart_channel_params[MAX_CHANNELS];
@@ -368,10 +375,10 @@ static void copy_matrix_params(MatrixParams *dst, MatrixParams *src)
static void copy_restart_frame_params(MLPEncodeContext *ctx,
unsigned int substr)
{
- ChannelParams (*seq_cp)[ctx->avctx->channels] = (ChannelParams (*)[ctx->avctx->channels]) ctx->seq_channel_params;
- DecodingParams (*seq_dp)[ctx->num_substreams] = (DecodingParams (*)[ctx->num_substreams]) ctx->seq_decoding_params;
unsigned int index;
-
+ ChannelParams **seq_cp = &ctx->seq_channel_params;
+ DecodingParams **seq_dp = &ctx->seq_decoding_params;
+
for (index = 0; index < ctx->number_of_subblocks; index++) {
DecodingParams *dp = &seq_dp[index][substr];
unsigned int channel;
@@ -549,12 +556,12 @@ static av_cold int mlp_encode_init(AVCodecContext *avctx)
}
switch (avctx->sample_fmt) {
- case SAMPLE_FMT_S16:
+ case AV_SAMPLE_FMT_S16:
ctx->coded_sample_fmt[0] = BITS_16;
ctx->wordlength = 16;
break;
/* TODO 20 bits: */
- case SAMPLE_FMT_S32:
+ case AV_SAMPLE_FMT_S32:
ctx->coded_sample_fmt[0] = BITS_24;
ctx->wordlength = 24;
break;
@@ -565,7 +572,7 @@ static av_cold int mlp_encode_init(AVCodecContext *avctx)
}
ctx->coded_sample_fmt[1] = -1 & 0xf;
- avctx->coded_frame = avcodec_alloc_frame();
+ avctx->coded_frame = av_frame_alloc();
ctx->dts = -avctx->frame_size;
@@ -622,8 +629,8 @@ static av_cold int mlp_encode_init(AVCodecContext *avctx)
ctx->channel_arrangement = avctx->channels - 1;
ctx->num_substreams = 1;
ctx->flags = FLAGS_DVDA;
- ctx->channel_occupancy = ff_mlp_ch_info[avctx->channels - 1].channel_occupancy;
- ctx->summary_info = ff_mlp_ch_info[avctx->channels - 1].summary_info ;
+ //ctx->channel_occupancy = ff_mlp_ch_info[avctx->channels - 1].channel_occupancy;
+ //ctx->summary_info = ff_mlp_ch_info[avctx->channels - 1].summary_info ;
size = sizeof(unsigned int) * ctx->max_restart_interval;
@@ -680,7 +687,7 @@ static av_cold int mlp_encode_init(AVCodecContext *avctx)
clear_channel_params(ctx, restart_channel_params);
clear_decoding_params(ctx, restart_decoding_params);
- dsputil_init(&ctx->dsp, avctx);
+ ff_mlpdsp_init(&ctx->mlp_dsp);
return 0;
}
@@ -801,11 +808,12 @@ static unsigned int bitcount_decoding_params(MLPEncodeContext *ctx,
return bitcount;
}
+
/****************************************************************************
****************** Functions that write to the bitstream *******************
****************************************************************************/
-/** Writes a major sync header to the bitstream. */
+/* Writes a major sync header to the bitstream. */
static void write_major_sync(MLPEncodeContext *ctx, uint8_t *buf, int buf_size)
{
PutBitContext pb;
@@ -835,14 +843,14 @@ static void write_major_sync(MLPEncodeContext *ctx, uint8_t *buf, int buf_size)
put_bits(&pb, 8, ctx->substream_info );
put_bits(&pb, 5, ctx->fs );
put_bits(&pb, 5, ctx->wordlength );
- put_bits(&pb, 6, ctx->channel_occupancy );
+ //put_bits(&pb, 6, ctx->channel_occupancy );
put_bits(&pb, 3, 0 ); /* ignored */
put_bits(&pb, 10, 0 ); /* speaker_layout */
put_bits(&pb, 3, 0 ); /* copy_protection */
put_bits(&pb, 16, 0x8080 ); /* ignored */
put_bits(&pb, 7, 0 ); /* ignored */
put_bits(&pb, 4, 0 ); /* source_format */
- put_bits(&pb, 5, ctx->summary_info );
+ //put_bits(&pb, 5, ctx->summary_info );
flush_put_bits(&pb);
@@ -1232,7 +1240,7 @@ static unsigned int write_access_unit(MLPEncodeContext *ctx, uint8_t *buf,
int buf_size, int restart_frame)
{
uint16_t substream_data_len[MAX_SUBSTREAMS];
- uint8_t *buf2, *buf1, *buf0 = buf;
+ uint8_t *buf1, *buf0 = buf;
unsigned int substr;
int total_length;
@@ -1258,9 +1266,7 @@ static unsigned int write_access_unit(MLPEncodeContext *ctx, uint8_t *buf,
buf += 2;
buf_size -= 2;
}
-
- buf2 = buf;
-
+
buf = write_substrs(ctx, buf, buf_size, restart_frame, substream_data_len);
total_length = buf - buf0;
@@ -1325,7 +1331,7 @@ static void input_data_internal(MLPEncodeContext *ctx, const uint8_t *samples,
/** Wrapper function for inputting data in two different bit-depths. */
static void input_data(MLPEncodeContext *ctx, void *samples)
{
- if (ctx->avctx->sample_fmt == SAMPLE_FMT_S32)
+ if (ctx->avctx->sample_fmt == AV_SAMPLE_FMT_S32)
input_data_internal(ctx, samples, 1);
else
input_data_internal(ctx, samples, 0);
@@ -1458,7 +1464,7 @@ static void set_filter_params(MLPEncodeContext *ctx,
sample_buffer += ctx->num_channels;
}
- order = ff_lpc_calc_coefs(&ctx->dsp, ctx->lpc_sample_buffer, ctx->number_of_samples,
+ order = ff_lpc_calc_coefs((LPCContext *)&ctx->mlp_dsp, ctx->lpc_sample_buffer, ctx->number_of_samples,
MLP_MIN_LPC_ORDER, max_order, 11,
coefs, shift, 1,
ORDER_METHOD_EST, MLP_MIN_LPC_SHIFT, MLP_MAX_LPC_SHIFT, MLP_MIN_LPC_SHIFT);
@@ -1869,13 +1875,17 @@ static int apply_filter(MLPEncodeContext *ctx, unsigned int channel)
{
FilterParams *fp[NUM_FILTERS] = { &ctx->cur_channel_params[channel].filter_params[FIR],
&ctx->cur_channel_params[channel].filter_params[IIR], };
- int32_t filter_state_buffer[NUM_FILTERS][ctx->number_of_samples];
+ int32_t **filter_state_buffer = (int32_t**)av_malloc((NUM_FILTERS)*sizeof(int32_t*));
int32_t mask = MSB_MASK(ctx->cur_decoding_params->quant_step_size[channel]);
int32_t *sample_buffer = ctx->sample_buffer + channel;
unsigned int number_of_samples = ctx->number_of_samples;
unsigned int filter_shift = fp[FIR]->shift;
int filter;
int i;
+
+ for (i = 0; i < NUM_FILTERS; i++) {
+ filter_state_buffer[i] = (int32_t*)av_malloc((ctx->number_of_samples)*sizeof(int32_t));
+ }
for (i = 0; i < 8; i++) {
filter_state_buffer[FIR][i] = *sample_buffer;
@@ -1965,7 +1975,7 @@ static void rematrix_channels(MLPEncodeContext *ctx)
maxchan = ctx->num_channels;
for (mat = 0; mat < mp->count; mat++) {
- unsigned int msb_mask_bits = (ctx->avctx->sample_fmt == SAMPLE_FMT_S16 ? 8 : 0) - mp->shift[mat];
+ unsigned int msb_mask_bits = (ctx->avctx->sample_fmt == AV_SAMPLE_FMT_S16 ? 8 : 0) - mp->shift[mat];
int32_t mask = MSB_MASK(msb_mask_bits);
unsigned int outch = mp->outch[mat];
@@ -2045,7 +2055,7 @@ static int best_codebook_path_cost(MLPEncodeContext *ctx, unsigned int channel,
static void set_best_codebook(MLPEncodeContext *ctx)
{
- ChannelParams (*seq_cp)[ctx->avctx->channels] = (ChannelParams (*)[ctx->avctx->channels]) ctx->seq_channel_params;
+ ChannelParams **seq_cp = &ctx->seq_channel_params;
DecodingParams *dp = ctx->cur_decoding_params;
RestartHeader *rh = ctx->cur_restart_header;
unsigned int channel;
@@ -2130,20 +2140,16 @@ static void set_best_codebook(MLPEncodeContext *ctx)
static void set_major_params(MLPEncodeContext *ctx)
{
RestartHeader *rh = ctx->cur_restart_header;
- ChannelParams (*channel_params)[ctx->sequence_size][ctx->avctx->channels] =
- (ChannelParams (*)[ctx->sequence_size][ctx->avctx->channels]) ctx->channel_params;
- DecodingParams (*decoding_params)[ctx->sequence_size][ctx->num_substreams] =
- (DecodingParams (*)[ctx->sequence_size][ctx->num_substreams]) ctx->decoding_params;
+ ChannelParams **channel_params = &ctx->channel_params;
+ DecodingParams **decoding_params = &ctx->decoding_params;
unsigned int index;
unsigned int substr;
uint8_t max_huff_lsbs = 0;
uint8_t max_output_bits = 0;
-
+
for (substr = 0; substr < ctx->num_substreams; substr++) {
- DecodingParams (*seq_dp)[ctx->num_substreams] =
- (DecodingParams (*)[ctx->num_substreams]) &decoding_params[ctx->restart_intervals - 1][ctx->seq_offset[ctx->restart_intervals - 1]];
- ChannelParams (*seq_cp)[ctx->avctx->channels] =
- (ChannelParams (*)[ctx->avctx->channels]) &channel_params[ctx->restart_intervals - 1][ctx->seq_offset[ctx->restart_intervals - 1]];
+ DecodingParams **seq_dp = (DecodingParams**)&decoding_params[ctx->restart_intervals - 1][ctx->seq_offset[ctx->restart_intervals - 1]];
+ ChannelParams **seq_cp = (ChannelParams**)&channel_params[ctx->restart_intervals - 1][ctx->seq_offset[ctx->restart_intervals - 1]];
unsigned int channel;
for (index = 0; index < ctx->seq_size[ctx->restart_intervals-1]; index++) {
memcpy(&ctx->major_decoding_params[index][substr], &seq_dp[index][substr], sizeof(DecodingParams));
@@ -2187,11 +2193,11 @@ static void set_major_params(MLPEncodeContext *ctx)
static void analyze_sample_buffer(MLPEncodeContext *ctx)
{
- ChannelParams (*seq_cp)[ctx->avctx->channels] = (ChannelParams (*)[ctx->avctx->channels]) ctx->seq_channel_params;
- DecodingParams (*seq_dp)[ctx->num_substreams] = (DecodingParams (*)[ctx->num_substreams]) ctx->seq_decoding_params;
+ ChannelParams **seq_cp = &ctx->seq_channel_params;
+ DecodingParams **seq_dp = &ctx->seq_decoding_params;
unsigned int index;
unsigned int substr;
-
+
for (substr = 0; substr < ctx->num_substreams; substr++) {
ctx->cur_restart_header = &ctx->restart_header[substr];
@@ -2263,7 +2269,7 @@ static void process_major_frame(MLPEncodeContext *ctx)
/****************************************************************************/
static int mlp_encode_frame(AVCodecContext *avctx, uint8_t *buf, int buf_size,
- void *data)
+ const struct AVSubtitle *data)
{
MLPEncodeContext *ctx = avctx->priv_data;
unsigned int bytes_written = 0;
@@ -2314,7 +2320,6 @@ static int mlp_encode_frame(AVCodecContext *avctx, uint8_t *buf, int buf_size,
if (ctx->min_restart_interval == ctx->max_restart_interval)
ctx->write_buffer = ctx->sample_buffer;
-
avctx->coded_frame->key_frame = restart_frame;
bytes_written = write_access_unit(ctx, buf, buf_size, restart_frame);
@@ -2336,17 +2341,15 @@ input_and_return:
restart_frame = (ctx->frame_index + 1) % ctx->min_restart_interval;
if (!restart_frame) {
- ChannelParams (*channel_params)[ctx->sequence_size][ctx->avctx->channels] =
- (ChannelParams (*)[ctx->sequence_size][ctx->avctx->channels]) ctx->channel_params;
- DecodingParams (*decoding_params)[ctx->sequence_size][ctx->num_substreams] =
- (DecodingParams (*)[ctx->sequence_size][ctx->num_substreams]) ctx->decoding_params;
+ ChannelParams **channel_params = &ctx->channel_params;
+ DecodingParams **decoding_params = &ctx->decoding_params;
int seq_index;
for (seq_index = 0;
seq_index < ctx->restart_intervals && (seq_index * ctx->min_restart_interval) <= ctx->avctx->frame_number;
seq_index++) {
- ChannelParams (*seq_cp)[ctx->avctx->channels] = &channel_params[(ctx->frame_index / ctx->min_restart_interval)][ctx->seq_offset[seq_index]];
- DecodingParams (*seq_dp)[ctx->num_substreams] = &decoding_params[(ctx->frame_index / ctx->min_restart_interval)][ctx->seq_offset[seq_index]];
+ ChannelParams **seq_cp = (ChannelParams**)&channel_params[(ctx->frame_index / ctx->min_restart_interval)][ctx->seq_offset[seq_index]];
+ DecodingParams **seq_dp = (DecodingParams**)&decoding_params[(ctx->frame_index / ctx->min_restart_interval)][ctx->seq_offset[seq_index]];
unsigned int number_of_samples = 0;
unsigned int index;
@@ -2408,15 +2411,24 @@ static av_cold int mlp_encode_close(AVCodecContext *avctx)
return 0;
}
-AVCodec mlp_encoder = {
- "mlp",
- CODEC_TYPE_AUDIO,
- CODEC_ID_MLP,
- sizeof(MLPEncodeContext),
- mlp_encode_init,
- mlp_encode_frame,
- mlp_encode_close,
- .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY,
- .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_S32,SAMPLE_FMT_NONE},
- .long_name = NULL_IF_CONFIG_SMALL("MLP (Meridian Lossless Packing)"),
+static const AVClass mlp_encoder_class = {
+ .class_name = "MLP encoder",
+ .item_name = av_default_item_name,
+ .version = LIBAVUTIL_VERSION_INT,
+};
+
+AVCodec ff_mlp_encoder = {
+ .name = "mlp",
+ .long_name = NULL_IF_CONFIG_SMALL("MLP (Meridian Lossless Packing))"),
+ .type = AVMEDIA_TYPE_AUDIO,
+ .id = AV_CODEC_ID_MLP,
+ .priv_data_size = sizeof(MLPEncodeContext),
+ .init = mlp_encode_init,
+ .encode_sub = mlp_encode_frame,
+ .close = mlp_encode_close,
+ .capabilities = AV_CODEC_CAP_SMALL_LAST_FRAME | AV_CODEC_CAP_DELAY,
+ .sample_fmts = (enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
+ AV_SAMPLE_FMT_S32,
+ AV_SAMPLE_FMT_NONE },
+ .priv_class = &mlp_encoder_class,
};
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Changes-in-existing-files-to-read-mlp-encoder.patch
Type: text/x-patch
Size: 2514 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20160322/1008eac4/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Addition-of-Mlp-encoder.patch
Type: text/x-patch
Size: 84850 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20160322/1008eac4/attachment-0001.bin>
More information about the ffmpeg-devel
mailing list