[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