[FFmpeg-devel] [PATCH] avcodec/encode: only allow undersized audio frames if they are the last

Marton Balint cus at passwd.hu
Sun Aug 4 01:16:24 EEST 2019



On Sat, 3 Aug 2019, Lynne wrote:

> Aug 3, 2019, 9:40 PM by cus at passwd.hu:
>
>> Otherwise the user might get a silence padded frame in the beginning or in the
>> middle of the encoding.
>>
>> Some other bug uncovered this:
>>
>> ./ffmpeg -loglevel verbose -y -f data -i /dev/zero \
>> -filter_complex "nullsrc=s=60x60:d=10[v0];sine=d=10[a]" \
>> -map '[v0]' -c:v:0 rawvideo \
>> -map '[a]'  -c:a:0 mp2 \
>> -f mpegts out.ts
>>
>> Signed-off-by: Marton Balint <cus at passwd.hu>
>> ---
>>  libavcodec/encode.c | 10 ++++++++--
>>  1 file changed, 8 insertions(+), 2 deletions(-)
>>
>> diff --git a/libavcodec/encode.c b/libavcodec/encode.c
>> index d12c42526b..d81b32b983 100644
>> --- a/libavcodec/encode.c
>> +++ b/libavcodec/encode.c
>> @@ -174,8 +174,14 @@ int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx,
>>  goto end;
>>  }
>>  } else if (!(avctx->codec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE)) {
>> -            if (frame->nb_samples < avctx->frame_size &&
>> -                !avctx->internal->last_audio_frame) {
>> +            /* if we already got an undersized frame, that must have been the last */
>> +            if (avctx->internal->last_audio_frame) {
>> +                av_log(avctx, AV_LOG_ERROR, "frame_size (%d) was not respected for a non-last frame (avcodec_encode_audio2)\n", avctx->frame_size);
>> +                ret = AVERROR(EINVAL);
>> +                goto end;
>> +            }
>> +
>> +            if (frame->nb_samples < avctx->frame_size) {
>>  ret = pad_last_frame(avctx, &padded_frame, frame);
>>  if (ret < 0)
>>  goto end;
>>
>
> You haven't fixed the bug, you've just made it an error. You have to fix the encoder instead.
> The check might be useful if its made a warning instead though.

The command line was also failing before the patch with an invalid frame 
size error at the end of the stream. So ffmpeg.c / libavfilter not 
providing fixed frame sizes is a different bug to the one this patch 
supposed to fix.

This fix disallows padding a frame with silence in the middle of the 
encoding if the user provides an undersized frame. libavcodec should 
reject such encoding attempts and not corrupt the output with silence.

Regards,
Marton


More information about the ffmpeg-devel mailing list