diff options
author | Marton Balint <cus@passwd.hu> | 2019-08-03 21:44:28 +0200 |
---|---|---|
committer | Marton Balint <cus@passwd.hu> | 2019-08-11 22:32:42 +0200 |
commit | 686755f02b0214155f3a044f263c2b60abdf9800 (patch) | |
tree | 1c0c3dd8c88dc9dd8e38fe956d83994a48a3f0a4 /libavcodec/encode.c | |
parent | da8936969fe695a042282d5686e12227745d299a (diff) |
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@passwd.hu>
Diffstat (limited to 'libavcodec/encode.c')
-rw-r--r-- | libavcodec/encode.c | 10 |
1 files 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; |