[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