diff options
author | Zhang Rui <bbcallen@gmail.com> | 2015-07-22 02:47:25 +0800 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2015-07-25 01:43:44 +0200 |
commit | c0a4af408ee56e38aed32dc75749014e21261b13 (patch) | |
tree | 2cc2282e706e1d468582b13969d0dba23f9c3f44 /libavformat/async.c | |
parent | dee551bbd280c5f43b9f100d944944c27f188549 (diff) | |
download | ffmpeg-c0a4af408ee56e38aed32dc75749014e21261b13.tar.gz |
avformat/async: move more code into locked area in background thread
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavformat/async.c')
-rw-r--r-- | libavformat/async.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/libavformat/async.c b/libavformat/async.c index c523b3def5..0bcc3ae711 100644 --- a/libavformat/async.c +++ b/libavformat/async.c @@ -95,15 +95,15 @@ static void *async_buffer_task(void *arg) while (1) { int fifo_space, to_copy; + pthread_mutex_lock(&c->mutex); if (async_check_interrupt(h)) { c->io_eof_reached = 1; c->io_error = AVERROR_EXIT; + pthread_mutex_unlock(&c->mutex); break; } if (c->seek_request) { - pthread_mutex_lock(&c->mutex); - ret = ffurl_seek(c->inner, c->seek_pos, c->seek_whence); if (ret < 0) { c->io_eof_reached = 1; @@ -126,15 +126,17 @@ static void *async_buffer_task(void *arg) fifo_space = av_fifo_space(fifo); if (c->io_eof_reached || fifo_space <= 0) { - pthread_mutex_lock(&c->mutex); pthread_cond_signal(&c->cond_wakeup_main); pthread_cond_wait(&c->cond_wakeup_background, &c->mutex); pthread_mutex_unlock(&c->mutex); continue; } + pthread_mutex_unlock(&c->mutex); to_copy = FFMIN(4096, fifo_space); ret = av_fifo_generic_write(fifo, c->inner, to_copy, (void *)ffurl_read); + + pthread_mutex_lock(&c->mutex); if (ret <= 0) { c->io_eof_reached = 1; if (ret < 0) { @@ -142,7 +144,6 @@ static void *async_buffer_task(void *arg) } } - pthread_mutex_lock(&c->mutex); pthread_cond_signal(&c->cond_wakeup_main); pthread_mutex_unlock(&c->mutex); } |