diff options
author | wm4 <wm4@nowhere> | 2014-07-19 12:26:24 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2014-07-19 12:27:25 +0200 |
commit | cfdb1312dad025ca29c0841d9cbe3cdb9885a1d5 (patch) | |
tree | a161c988068e481a33c6f4618a265cb27ed6e65b /demux | |
parent | 24efaa3ad7a2a23644a1872c6b9535342bc71df1 (diff) | |
download | mpv-cfdb1312dad025ca29c0841d9cbe3cdb9885a1d5.tar.bz2 mpv-cfdb1312dad025ca29c0841d9cbe3cdb9885a1d5.tar.xz |
demux: ensure demux_read_packet_async() always reads
In corner cases, it might be possible that a demux_read_packet_async()
call fails to make the demuxer thread to read more packets.
If a packet is queued, the function will simply return a packet, without
marking the stream as active. As a consequence, read_packet() might
decide not to read any further packets, and the demuxer will never read
a packet and wake up the playback thread.
This was originally done to align it with demux_read_packet() semantics;
just drop this.
Diffstat (limited to 'demux')
-rw-r--r-- | demux/demux.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/demux/demux.c b/demux/demux.c index d5be9446e7..65642fe824 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -462,6 +462,8 @@ struct demux_packet *demux_read_packet(struct sh_stream *sh) // Poll the demuxer queue, and if there's a packet, return it. Otherwise, just // make the demuxer thread read packets for this stream, and if there's at // least one packet, call the wakeup callback. +// Unlike demux_read_packet(), this always enables readahead (which means you +// must not use it on interleaved subtitle streams). // Returns: // < 0: EOF was reached, *out_pkt=NULL // == 0: no new packet yet, but maybe later, *out_pkt=NULL @@ -476,8 +478,7 @@ int demux_read_packet_async(struct sh_stream *sh, struct demux_packet **out_pkt) pthread_mutex_lock(&ds->in->lock); *out_pkt = dequeue_packet(ds); r = *out_pkt ? 1 : (ds->eof ? -1 : 0); - if (r < 1 && ds->selected) - ds->active = true; + ds->active = ds->selected; // enable readahead ds->in->eof = false; // force retry pthread_cond_signal(&ds->in->wakeup); // possibly read more pthread_mutex_unlock(&ds->in->lock); |