[FFmpeg-cvslog] avcodec/decode: reset codec on receiving packet after EOF in compat_decode

James Cowgill git at videolan.org
Sat Dec 9 22:34:48 EET 2017

ffmpeg | branch: master | James Cowgill <jcowgill at debian.org> | Thu Nov  9 12:21:23 2017 +0000| [02ba4b91b5616ecbebee5c9565e1be7af2a6b980] | committer: Marton Balint

avcodec/decode: reset codec on receiving packet after EOF in compat_decode

In commit 061a0c14bb57 ("decode: restructure the core decoding code"), the
deprecated avcodec_decode_* APIs were reworked so that they called into the
new avcodec_send_packet / avcodec_receive_frame API. This had the side effect
of prohibiting sending new packets containing data after a drain
packet, but in previous versions of FFmpeg this "worked" and some
applications relied on it.

To restore some compatibility, reset the codec if we receive a new non-drain
packet using the old API after draining has completed. While this does
not give the same behaviour as the old API did, in the majority of cases
it works and it does not require changes to any other part of the decoding

Fixes ticket #6775
Signed-off-by: James Cowgill <jcowgill at debian.org>
Signed-off-by: Marton Balint <cus at passwd.hu>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=02ba4b91b5616ecbebee5c9565e1be7af2a6b980

 libavcodec/decode.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index 3f5b086f7e..f67b214759 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -749,6 +749,11 @@ static int compat_decode(AVCodecContext *avctx, AVFrame *frame,
     av_assert0(avci->compat_decode_consumed == 0);
+    if (avci->draining_done && pkt && pkt->size != 0) {
+        av_log(avctx, AV_LOG_WARNING, "Got unexpected packet after EOF\n");
+        avcodec_flush_buffers(avctx);
+    }
     *got_frame = 0;
     avci->compat_decode = 1;

More information about the ffmpeg-cvslog mailing list