This is the modified diff with few changes in mlp_encode_frame function. -Disha
On Tue, Mar 22, 2016 at 1:59 AM, Disha Singh <directionsta...@gmail.com> wrote: > 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) >
diff --git a/mlpenc.c b/ffmpeg_sources/ffmpeg/libavcodec/mlpenc.c old mode 100644 new mode 100755 index 70cb7d8..7035ad9 --- a/mlpenc.c +++ b/ffmpeg_sources/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 @@ -97,6 +103,7 @@ typedef struct BestOffset { #define NUM_CODEBOOKS 4 typedef struct { + const AVClass *class; AVCodecContext *avctx; int num_substreams; ///< Number of substreams contained within this stream. @@ -187,8 +194,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 +376,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 +557,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 +573,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 +630,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 +688,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 +809,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 +844,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 +1241,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 +1267,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; @@ -1323,9 +1330,9 @@ 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) +static void input_data(MLPEncodeContext *ctx, const uint8_t *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 +1465,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 +1876,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 +1976,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 +2056,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 +2141,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 +2194,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]; @@ -2262,10 +2269,13 @@ static void process_major_frame(MLPEncodeContext *ctx) /****************************************************************************/ -static int mlp_encode_frame(AVCodecContext *avctx, uint8_t *buf, int buf_size, - void *data) +static int mlp_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, + int *got_packet_ptr) { MLPEncodeContext *ctx = avctx->priv_data; + uint8_t *buf = avpkt->data; + int buf_size = avpkt->size; + uint8_t *data = frame->data; unsigned int bytes_written = 0; int restart_frame; @@ -2314,10 +2324,10 @@ 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); + avpkt->size = bytes_written; ctx->timestamp += ctx->frame_size[ctx->frame_index]; ctx->dts += ctx->frame_size[ctx->frame_index]; @@ -2328,7 +2338,7 @@ input_and_return: ctx->frame_size[ctx->frame_index] = avctx->frame_size; ctx->next_major_frame_size += avctx->frame_size; ctx->next_major_number_of_frames++; - input_data(ctx, data); + input_data(ctx, (const uint8_t *)data); } else if (!ctx->last_frame) { ctx->last_frame = ctx->inout_buffer; } @@ -2336,17 +2346,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; @@ -2389,6 +2397,8 @@ input_and_return: no_data_left: + *got_packet_ptr = 1; + return bytes_written; } @@ -2408,15 +2418,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, + .encode2 = 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, };
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel