vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Thu Sep 3 22:08:27 2015 +0300| [3e45073b87cfd50b1811286f1c00934226c44b0d] | committer: Rémi Denis-Courmont
prefetch: continue fetching while paused If downstream is paused while the buffer is not full, continue fetching. When the buffer is full, pause. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=3e45073b87cfd50b1811286f1c00934226c44b0d --- modules/stream_filter/prefetch.c | 63 +++++++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 15 deletions(-) diff --git a/modules/stream_filter/prefetch.c b/modules/stream_filter/prefetch.c index 2b97513..bbc7430 100644 --- a/modules/stream_filter/prefetch.c +++ b/modules/stream_filter/prefetch.c @@ -110,6 +110,7 @@ static int ThreadRead(stream_t *stream, size_t length) assert((size_t)val <= length); sys->buffer_length += val; assert(sys->buffer_length <= sys->buffer_size); + //msg_Dbg(stream, "buffer: %zu/%zu", sys->buffer_length, sys->buffer_size); return 0; } @@ -136,6 +137,25 @@ static int ThreadSeek(stream_t *stream, uint64_t seek_offset) return 0; } +static int ThreadControl(stream_t *stream, int query, ...) +{ + stream_sys_t *sys = stream->p_sys; + int canc = vlc_savecancel(); + + vlc_mutex_unlock(&sys->lock); + + va_list ap; + int ret; + + va_start(ap, query); + ret = stream_vaControl(stream->p_source, query, ap); + va_end(ap); + + vlc_mutex_lock(&sys->lock); + vlc_restorecancel(canc); + return ret; +} + #define MAX_READ 65536 #define SEEK_THRESHOLD MAX_READ @@ -151,21 +171,18 @@ static void *Thread(void *data) mutex_cleanup_push(&sys->lock); for (;;) { - if (paused != sys->paused) - { /* Update pause state */ - int canc = vlc_savecancel(); - - paused = sys->paused; - vlc_mutex_unlock(&sys->lock); - stream_Control(stream->p_source, STREAM_SET_PAUSE_STATE, paused); - vlc_mutex_lock(&sys->lock); - vlc_restorecancel(canc); - continue; - } - if (paused) - { /* Wait for resumption */ - vlc_cond_wait(&sys->wait_space, &sys->lock); + { + if (sys->paused) + { /* Wait for resumption */ + vlc_cond_wait(&sys->wait_space, &sys->lock); + continue; + } + + /* Resume the underlying stream */ + msg_Dbg(stream, "resuming"); + ThreadControl(stream, STREAM_SET_PAUSE_STATE, false); + paused = false; continue; } @@ -203,7 +220,17 @@ static void *Thread(void *data) if (unused == 0) { /* Buffer is full */ if (history == 0) - { /* Wait for data to be read */ + { + if (sys->paused) + { /* Pause the stream once the buffer is full + * (and assuming pause was actually requested) */ + msg_Dbg(stream, "pausing"); + ThreadControl(stream, STREAM_SET_PAUSE_STATE, true); + paused = true; + continue; + } + + /* Wait for data to be read */ vlc_cond_wait(&sys->wait_space, &sys->lock); continue; } @@ -285,6 +312,12 @@ static ssize_t Read(stream_t *stream, void *buf, size_t buflen) } vlc_mutex_lock(&sys->lock); + if (sys->paused) + { + msg_Err(stream, "reading while paused (buggy demux?)"); + sys->paused = false; + } + while ((copy = BufferLevel(stream, &eof)) == 0 && !eof) { void *data[2]; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
