On Sat, Jan 28, 2012 at 2:59 PM, Justin Ruggles <[email protected]> wrote: > Fixes handling of CODEC_CAP_SMALL_LAST_FRAME. > --- > It only happens to currently work because avconv allocates enough data to > cover 1024 samples and zeros out unused samples when it's passing fewer > samples for the final small frame. However, the API does not specify this, > so we should not read more samples than are being provided by the user. > > libavcodec/aacenc.c | 8 +++++--- > 1 files changed, 5 insertions(+), 3 deletions(-) > > diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c > index e610a80..db8308d 100644 > --- a/libavcodec/aacenc.c > +++ b/libavcodec/aacenc.c > @@ -476,7 +476,7 @@ static void put_bitstream_info(AVCodecContext *avctx, > AACEncContext *s, > * Channels are reordered from Libav's default order to AAC order. > */ > static void deinterleave_input_samples(AACEncContext *s, > - const float *samples) > + const float *samples, int nb_samples) > { > int ch, i; > const int sinc = s->channels; > @@ -490,10 +490,12 @@ static void deinterleave_input_samples(AACEncContext *s, > memcpy(&s->planar_samples[ch][1024], &s->planar_samples[ch][2048], > 1024 * sizeof(s->planar_samples[0][0])); > > /* deinterleave */ > - for (i = 2048; i < 3072; i++) { > + for (i = 2048; i < 2048 + nb_samples; i++) { > s->planar_samples[ch][i] = *sptr; > sptr += sinc; > } > + memset(&s->planar_samples[ch][i], 0, > + (3072 - i) * sizeof(s->planar_samples[0][0])); > } > } > > @@ -511,7 +513,7 @@ static int aac_encode_frame(AVCodecContext *avctx, > return 0; > > if (data) { > - deinterleave_input_samples(s, data); > + deinterleave_input_samples(s, data, avctx->frame_size); > if (s->psypp) > ff_psy_preprocess(s->psypp, s->planar_samples, s->channels); > } > -- > 1.7.1
Looks Good _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
