[FFmpeg-cvslog] avcodec: consider an error during decoder draining as EOF

wm4 git at videolan.org
Mon Mar 6 12:08:16 EET 2017


ffmpeg | branch: master | wm4 <nfxjfg at googlemail.com> | Thu Mar  2 10:37:26 2017 +0100| [a755b725ec1d657609c8bd726ce37e7cf193d03f] | committer: wm4

avcodec: consider an error during decoder draining as EOF

There is no reason that draining couldn't return an error or two. But
some decoders don't handle this very well, and might always return an
error. This can lead to API users getting into an infinite loop and
burning CPU, because no progress is made and EOF is never returned.

In fact, ffmpeg.c contains a hack against such a case. It is made
unnecessary with this commit, and removed with the next one. (This
particular error case seems to have been fixed since the hack was
added, though.)

This might lose frames if decoding returns errors during draining.

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

 libavcodec/utils.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 1156e43..db3adb1 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -2807,12 +2807,12 @@ static int do_decode(AVCodecContext *avctx, AVPacket *pkt)
     if (ret == AVERROR(EAGAIN))
         ret = pkt->size;
 
-    if (ret < 0)
-        return ret;
-
     if (avctx->internal->draining && !got_frame)
         avctx->internal->draining_done = 1;
 
+    if (ret < 0)
+        return ret;
+
     if (ret >= pkt->size) {
         av_packet_unref(avctx->internal->buffer_pkt);
     } else {



More information about the ffmpeg-cvslog mailing list