diff -up ffmpeg-1.2.1/libavcodec/aac_ac3_parser.c.no-planar-ac3 ffmpeg-1.2.1/libavcodec/aac_ac3_parser.c --- ffmpeg-1.2.1/libavcodec/aac_ac3_parser.c.no-planar-ac3 2013-05-09 20:16:04.000000000 -0400 +++ ffmpeg-1.2.1/libavcodec/aac_ac3_parser.c 2013-06-08 07:52:03.002233033 -0400 @@ -94,7 +94,7 @@ get_next: avctx->channels = s->channels; avctx->channel_layout = s->channel_layout; } - s1->duration = s->samples; + avctx->frame_size = s->samples; avctx->audio_service_type = s->service_type; } diff -up ffmpeg-1.2.1/libavcodec/ac3enc_fixed.c.no-planar-ac3 ffmpeg-1.2.1/libavcodec/ac3enc_fixed.c --- ffmpeg-1.2.1/libavcodec/ac3enc_fixed.c.no-planar-ac3 2013-05-09 20:16:04.000000000 -0400 +++ ffmpeg-1.2.1/libavcodec/ac3enc_fixed.c 2013-06-08 07:52:03.013232922 -0400 @@ -160,7 +160,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_S16P, + .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE }, .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), .priv_class = &ac3enc_class, diff -up ffmpeg-1.2.1/libavcodec/ac3enc_float.c.no-planar-ac3 ffmpeg-1.2.1/libavcodec/ac3enc_float.c --- ffmpeg-1.2.1/libavcodec/ac3enc_float.c.no-planar-ac3 2013-05-09 20:16:04.000000000 -0400 +++ ffmpeg-1.2.1/libavcodec/ac3enc_float.c 2013-06-08 07:52:03.013232922 -0400 @@ -158,7 +158,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_FLTP, + .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_NONE }, .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), .priv_class = &ac3enc_class, diff -up ffmpeg-1.2.1/libavcodec/ac3enc_template.c.no-planar-ac3 ffmpeg-1.2.1/libavcodec/ac3enc_template.c --- ffmpeg-1.2.1/libavcodec/ac3enc_template.c.no-planar-ac3 2013-05-09 20:16:04.000000000 -0400 +++ ffmpeg-1.2.1/libavcodec/ac3enc_template.c 2013-06-08 07:52:03.013232922 -0400 @@ -72,20 +72,26 @@ alloc_fail: * Copy input samples. * Channels are reordered from FFmpeg's default order to AC-3 order. */ -static void copy_input_samples(AC3EncodeContext *s, SampleType **samples) +static void deinterleave_input_samples(AC3EncodeContext *s, const SampleType *samples) { int ch; /* copy and remap input samples */ for (ch = 0; ch < s->channels; ch++) { + const SampleType *sptr; + int i, 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])); /* 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])); + 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; + } } } @@ -389,6 +395,7 @@ int AC3_NAME(encode_frame)(AVCodecContex 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) { @@ -400,7 +407,7 @@ int AC3_NAME(encode_frame)(AVCodecContex if (s->bit_alloc.sr_code == 1 || s->eac3) ff_ac3_adjust_frame_size(s); - copy_input_samples(s, (SampleType **)frame->extended_data); + deinterleave_input_samples(s, samples); apply_mdct(s); diff -up ffmpeg-1.2.1/libavcodec/eac3enc.c.no-planar-ac3 ffmpeg-1.2.1/libavcodec/eac3enc.c --- ffmpeg-1.2.1/libavcodec/eac3enc.c.no-planar-ac3 2013-05-09 20:16:04.000000000 -0400 +++ ffmpeg-1.2.1/libavcodec/eac3enc.c 2013-06-08 07:52:03.013232922 -0400 @@ -258,7 +258,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_FLTP, + .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_NONE }, .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52 E-AC-3"), .priv_class = &eac3enc_class,