[FFmpeg-devel] [PATCH] avcodec/encode: only allow undersized audio frames if they are the last
Marton Balint
cus at passwd.hu
Sat Aug 10 23:41:47 EEST 2019
On Sun, 4 Aug 2019, Marton Balint wrote:
>
>
> 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.
>
Ping, will apply soon.
Regards,
Marton
More information about the ffmpeg-devel
mailing list