Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwm4 <nfxjfg@googlemail.com>2017-03-02 12:37:26 +0300
committerwm4 <nfxjfg@googlemail.com>2017-03-06 13:06:09 +0300
commita755b725ec1d657609c8bd726ce37e7cf193d03f (patch)
treecf8eab6bd5d474d068a929d53f604e906bfad735 /libavcodec/utils.c
parent3267e1703b32e83bce1329676fd007cc66a592c7 (diff)
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.
Diffstat (limited to 'libavcodec/utils.c')
-rw-r--r--libavcodec/utils.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 1156e43079..db3adb18d4 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 {