diff options
author | Zhang Rui <bbcallen@gmail.com> | 2015-10-10 17:51:08 +0800 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2015-10-10 17:58:45 +0200 |
commit | 7dc42c9e657196d5b30cd27edbf8c7f8c6bbc678 (patch) | |
tree | 1c6556cfc4f3a3c8e3bb36181b2e2cfada27a28c | |
parent | c3d312bb7f396d948c538dc31f88c8ef7694f3d8 (diff) | |
download | ffmpeg-7dc42c9e657196d5b30cd27edbf8c7f8c6bbc678.tar.gz |
avformat/async: pass internal I/O error
av_fifo_generic_write() does not return any error code.
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r-- | libavformat/async.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/libavformat/async.c b/libavformat/async.c index a01673dc6d..9172f5d178 100644 --- a/libavformat/async.c +++ b/libavformat/async.c @@ -55,6 +55,7 @@ typedef struct Context { int seek_completed; int64_t seek_ret; + int inner_io_error; int io_error; int io_eof_reached; @@ -85,6 +86,18 @@ static int async_check_interrupt(void *arg) return c->abort_request; } +static int wrapped_url_read(void *src, void *dst, int size) +{ + URLContext *h = src; + Context *c = h->priv_data; + int ret; + + ret = ffurl_read(c->inner, dst, size); + c->inner_io_error = ret < 0 ? ret : 0; + + return ret; +} + static void *async_buffer_task(void *arg) { URLContext *h = arg; @@ -136,14 +149,13 @@ static void *async_buffer_task(void *arg) pthread_mutex_unlock(&c->mutex); to_copy = FFMIN(4096, fifo_space); - ret = av_fifo_generic_write(fifo, c->inner, to_copy, (void *)ffurl_read); + ret = av_fifo_generic_write(fifo, (void *)h, to_copy, (void *)wrapped_url_read); pthread_mutex_lock(&c->mutex); if (ret <= 0) { c->io_eof_reached = 1; - if (ret < 0) { - c->io_error = ret; - } + if (c->inner_io_error < 0) + c->io_error = c->inner_io_error; } pthread_cond_signal(&c->cond_wakeup_main); @@ -270,8 +282,12 @@ static int async_read_internal(URLContext *h, void *dest, int size, int read_com if (to_read <= 0 || !read_complete) break; } else if (c->io_eof_reached) { - if (ret <= 0) - ret = AVERROR_EOF; + if (ret <= 0) { + if (c->io_error) + ret = c->io_error; + else + ret = AVERROR_EOF; + } break; } pthread_cond_signal(&c->cond_wakeup_background); |