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

Lynne dev at lynne.ee
Sun Aug 4 00:20:47 EEST 2019


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.



More information about the ffmpeg-devel mailing list