Hi,

if AVERROR(EAGAIN) is returned from ffm_is_avail_data it always causes an infinite EAGAIN loop.

Best regards,
Andreas
>From 115425287fe1f898baa79705f05d495c061e310a Mon Sep 17 00:00:00 2001
From: Andreas Cadhalpun <andreas.cadhal...@googlemail.com>
Date: Sun, 8 Mar 2015 23:34:29 +0100
Subject: [PATCH 7/8] ffmdec: don't return AVERROR(EAGAIN) from
 ffm_is_avail_data

If AVERROR(EAGAIN) is returned, ffm_read_packet is called again
immediately, which calls ffm_is_avail_data before changing the ffm
context, so that this will return AVERROR(EAGAIN) again, leading
to an infinite loop (again).

Signed-off-by: Andreas Cadhalpun <andreas.cadhal...@googlemail.com>
---
 libavformat/ffmdec.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/libavformat/ffmdec.c b/libavformat/ffmdec.c
index 60df51d..9f00fc4 100644
--- a/libavformat/ffmdec.c
+++ b/libavformat/ffmdec.c
@@ -46,10 +46,7 @@ static int ffm_is_avail_data(AVFormatContext *s, int size)
             return AVERROR_EOF;
         avail_size = ffm->file_size - pos;
     } else {
-    if (pos == ffm->write_index) {
-        /* exactly at the end of stream */
-        return AVERROR(EAGAIN);
-    } else if (pos < ffm->write_index) {
+    if (pos < ffm->write_index) {
         avail_size = ffm->write_index - pos;
     } else {
         avail_size = (ffm->file_size - pos) + (ffm->write_index - FFM_PACKET_SIZE);
@@ -59,7 +56,7 @@ static int ffm_is_avail_data(AVFormatContext *s, int size)
     if (size <= avail_size)
         return 1;
     else
-        return AVERROR(EAGAIN);
+        return AVERROR_INVALIDDATA;
 }
 
 static int ffm_resync(AVFormatContext *s, int state)
-- 
2.1.4

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to