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
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel