diff --git a/libavcodec/ac3enc_fixed.c b/libavcodec/ac3enc_fixed.c index 1430c3352c..e471edf08c 100644 --- a/libavcodec/ac3enc_fixed.c +++ b/libavcodec/ac3enc_fixed.c @@ -149,7 +149,7 @@ AVCodec ff_ac3_fixed_encoder = { .init = ac3_fixed_encode_init, .encode2 = ff_ac3_fixed_encode_frame, .close = ff_ac3_encode_close, - .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, + .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_NONE }, .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), .priv_class = &ac3enc_class, diff --git a/libavcodec/ac3enc_float.c b/libavcodec/ac3enc_float.c index 45645da655..a225d9b4bd 100644 --- a/libavcodec/ac3enc_float.c +++ b/libavcodec/ac3enc_float.c @@ -148,7 +148,7 @@ AVCodec ff_ac3_encoder = { .init = ff_ac3_encode_init, .encode2 = ff_ac3_float_encode_frame, .close = ff_ac3_encode_close, - .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLT, + .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE }, .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), .priv_class = &ac3enc_class, diff --git a/libavcodec/ac3enc_template.c b/libavcodec/ac3enc_template.c index 6e0a2b6f34..388d75377e 100644 --- a/libavcodec/ac3enc_template.c +++ b/libavcodec/ac3enc_template.c @@ -65,30 +65,23 @@ alloc_fail: /* - * Deinterleave input samples. + * Copy input samples. * Channels are reordered from Libav's default order to AC-3 order. */ -static void deinterleave_input_samples(AC3EncodeContext *s, - const SampleType *samples) +static void copy_input_samples(AC3EncodeContext *s, SampleType **samples) { - int ch, i; + int ch; - /* deinterleave and remap input samples */ + /* copy and remap input samples */ for (ch = 0; ch < s->channels; ch++) { - const SampleType *sptr; - int sinc; - /* copy last 256 samples of previous frame to the start of the current frame */ memcpy(&s->planar_samples[ch][0], &s->planar_samples[ch][AC3_BLOCK_SIZE * s->num_blocks], AC3_BLOCK_SIZE * sizeof(s->planar_samples[0][0])); - /* deinterleave */ - sinc = s->channels; - sptr = samples + s->channel_map[ch]; - for (i = AC3_BLOCK_SIZE; i < AC3_BLOCK_SIZE * (s->num_blocks + 1); i++) { - s->planar_samples[ch][i] = *sptr; - sptr += sinc; - } + /* copy new samples for current frame */ + memcpy(&s->planar_samples[ch][AC3_BLOCK_SIZE], + samples[s->channel_map[ch]], + AC3_BLOCK_SIZE * s->num_blocks * sizeof(s->planar_samples[0][0])); } } @@ -400,7 +393,6 @@ int AC3_NAME(encode_frame)(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr) { AC3EncodeContext *s = avctx->priv_data; - const SampleType *samples = (const SampleType *)frame->data[0]; int ret; if (s->options.allow_per_frame_metadata) { @@ -412,7 +404,7 @@ int AC3_NAME(encode_frame)(AVCodecContext *avctx, AVPacket *avpkt, if (s->bit_alloc.sr_code == 1 || s->eac3) ff_ac3_adjust_frame_size(s); - deinterleave_input_samples(s, samples); + copy_input_samples(s, (SampleType **)frame->extended_data); apply_mdct(s); diff --git a/libavcodec/eac3enc.c b/libavcodec/eac3enc.c index c5ba9d6c40..3c7a611e87 100644 --- a/libavcodec/eac3enc.c +++ b/libavcodec/eac3enc.c @@ -254,7 +254,7 @@ AVCodec ff_eac3_encoder = { .init = ff_ac3_encode_init, .encode2 = ff_ac3_float_encode_frame, .close = ff_ac3_encode_close, - .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLT, + .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE }, .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52 E-AC-3"), .priv_class = &eac3enc_class,