diff --git a/ffmpeg.c b/ffmpeg.c index 94abd74948..92f009421c 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -936,6 +936,11 @@ static int av_encode(AVFormatContext **output_files, ost->resample = audio_resample_init(codec->channels, icodec->channels, codec->sample_rate, icodec->sample_rate); + if(!ost->resample) + { + printf("Can't resample. Aborting.\n"); + av_abort(); + } } /* Request specific number of channels */ icodec->channels = codec->channels; @@ -944,6 +949,11 @@ static int av_encode(AVFormatContext **output_files, ost->resample = audio_resample_init(codec->channels, icodec->channels, codec->sample_rate, icodec->sample_rate); + if(!ost->resample) + { + printf("Can't resample. Aborting.\n"); + av_abort(); + } } } ist->decoding_needed = 1; diff --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c index 3e83fb1fcf..4093fb75d8 100644 --- a/libavcodec/ac3enc.c +++ b/libavcodec/ac3enc.c @@ -978,7 +978,7 @@ static void output_audio_block(AC3EncodeContext *s, int8_t global_exp[AC3_MAX_CHANNELS], int block_num) { - int ch, nb_groups, group_size, i, baie; + int ch, nb_groups, group_size, i, baie, rbnd; uint8_t *p; uint16_t qmant[AC3_MAX_CHANNELS][N/2]; int exp0, exp1; @@ -1000,14 +1000,28 @@ static void output_audio_block(AC3EncodeContext *s, put_bits(&s->pb, 1, 0); /* no new coupling strategy */ } - if (s->acmod == 2) { - put_bits(&s->pb, 1, 0); /* no matrixing (but should be used in the future) */ - } + if (s->acmod == 2) + { + if(block_num==0) + { + /* first block must define rematrixing (rematstr) */ + put_bits(&s->pb, 1, 1); + + /* dummy rematrixing rematflg(1:4)=0 */ + for (rbnd=0;rbnd<4;rbnd++) + put_bits(&s->pb, 1, 0); + } + else + { + /* no matrixing (but should be used in the future) */ + put_bits(&s->pb, 1, 0); + } + } #if defined(DEBUG) { - static int count = 0; - printf("Block #%d (%d)\n", block_num, count++); + static int count = 0; + printf("Block #%d (%d)\n", block_num, count++); } #endif /* exponent strategy */ @@ -1329,7 +1343,8 @@ static int output_frame_end(AC3EncodeContext *s) frame = s->pb.buf; n = 2 * s->frame_size - (pbBufPtr(&s->pb) - frame) - 2; assert(n >= 0); - memset(pbBufPtr(&s->pb), 0, n); + if(n>0) + memset(pbBufPtr(&s->pb), 0, n); /* Now we must compute both crcs : this is not so easy for crc1 because it is at the beginning of the data... */ diff --git a/libavcodec/resample.c b/libavcodec/resample.c index 86bed847c4..c4ae085f93 100644 --- a/libavcodec/resample.c +++ b/libavcodec/resample.c @@ -194,6 +194,23 @@ static void stereo_mux(short *output, short *input1, short *input2, int n) } } +static void ac3_5p1_mux(short *output, short *input1, short *input2, int n) +{ + int i; + short l,r; + + for(i=0;i 2 || input_channels > 2) - return NULL; + if ( input_channels > 2) + { + printf("Resampling with input channels greater than 2 unsupported."); + return NULL; + } s = av_mallocz(sizeof(ReSampleContext)); if (!s) - return NULL; + { + printf("Can't allocate memory for resample context."); + return NULL; + } s->ratio = (float)output_rate / (float)input_rate; @@ -241,6 +264,14 @@ ReSampleContext *audio_resample_init(int output_channels, int input_channels, if (s->output_channels < s->filter_channels) s->filter_channels = s->output_channels; +/* + * ac3 output is the only case where filter_channels could be greater than 2. + * input channels can't be greater than 2, so resample the 2 channels and then + * expand to 6 channels after the resampling. + */ + if(s->filter_channels>2) + s->filter_channels = 2; + for(i=0;ifilter_channels;i++) { init_mono_resample(&s->channel_ctx[i], s->ratio); } @@ -279,10 +310,10 @@ int audio_resample(ReSampleContext *s, short *output, short *input, int nb_sampl buftmp2[0] = bufin[0]; buftmp3[0] = output; stereo_to_mono(buftmp2[0], input, nb_samples); - } else if (s->output_channels == 2 && s->input_channels == 1) { + } else if (s->output_channels >= 2 && s->input_channels == 1) { buftmp2[0] = input; buftmp3[0] = bufout[0]; - } else if (s->output_channels == 2) { + } else if (s->output_channels >= 2) { buftmp2[0] = bufin[0]; buftmp2[1] = bufin[1]; buftmp3[0] = bufout[0]; @@ -303,6 +334,8 @@ int audio_resample(ReSampleContext *s, short *output, short *input, int nb_sampl mono_to_stereo(output, buftmp3[0], nb_samples1); } else if (s->output_channels == 2) { stereo_mux(output, buftmp3[0], buftmp3[1], nb_samples1); + } else if (s->output_channels == 6) { + ac3_5p1_mux(output, buftmp3[0], buftmp3[1], nb_samples1); } av_free(bufin[0]); diff --git a/tests/ffmpeg.regression.ref b/tests/ffmpeg.regression.ref index de33c3a38c..a20dcf3727 100644 --- a/tests/ffmpeg.regression.ref +++ b/tests/ffmpeg.regression.ref @@ -52,4 +52,4 @@ stddev: 19.19 bytes:7602176 stddev: 8.19 bytes:7602176 21f8ff9f1daacd9133683bb4ea0f50a4 *./data/a-mp2.mp2 116d1290ba1b4eb98fdee52e423417b1 *./data/out.wav -048b9c3444c788bac6ce5cc3a8f4db00 *./data/a-ac3.rm +d056da679e6d6682812fffb28a7f0db6 *./data/a-ac3.rm diff --git a/tests/rotozoom.regression.ref b/tests/rotozoom.regression.ref index af1ab41b5f..e1e264537f 100644 --- a/tests/rotozoom.regression.ref +++ b/tests/rotozoom.regression.ref @@ -52,4 +52,4 @@ bee27a404ab6a1b7ab1d3551eb4f1877 *./data/a-flv.flv stddev: 5.29 bytes:7602176 21f8ff9f1daacd9133683bb4ea0f50a4 *./data/a-mp2.mp2 116d1290ba1b4eb98fdee52e423417b1 *./data/out.wav -048b9c3444c788bac6ce5cc3a8f4db00 *./data/a-ac3.rm +d056da679e6d6682812fffb28a7f0db6 *./data/a-ac3.rm