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

Marton Balint git at videolan.org
Mon Aug 12 00:41:54 EEST 2019


ffmpeg | branch: master | Marton Balint <cus at passwd.hu> | Sat Aug  3 21:44:28 2019 +0200| [686755f02b0214155f3a044f263c2b60abdf9800] | committer: Marton Balint

avcodec/encode: only allow undersized audio frames if they are the last

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>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=686755f02b0214155f3a044f263c2b60abdf9800
---

 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;



More information about the ffmpeg-cvslog mailing list