diff options
author | wm4 <wm4@nowhere> | 2014-07-19 12:34:07 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2014-07-19 12:34:07 +0200 |
commit | 887140b7d4c79f3afd3edc26591f9938a0acae38 (patch) | |
tree | 24dbb92784947fbf39c83fdf05f657ef55880733 | |
parent | cfdb1312dad025ca29c0841d9cbe3cdb9885a1d5 (diff) | |
download | mpv-887140b7d4c79f3afd3edc26591f9938a0acae38.tar.bz2 mpv-887140b7d4c79f3afd3edc26591f9938a0acae38.tar.xz |
demux: fix a corner case (2)
It can happen that read_packet() doesn't read a packet, even if it
succeeds. Typically this is because a packet was read, but then thrown
away, because it's not part of a selected stream. The result would be a
bogus EOF condition.
Fix by explicitly checking for EOF.
-rw-r--r-- | demux/demux.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/demux/demux.c b/demux/demux.c index 65642fe824..927c8488e2 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -534,7 +534,8 @@ bool demux_stream_eof(struct sh_stream *sh) struct demux_packet *demux_read_any_packet(struct demuxer *demuxer) { assert(!demuxer->in->threading); // doesn't work with threading - for (int retry = 0; retry < 2; retry++) { + bool read_more = true; + while (read_more) { for (int n = 0; n < demuxer->num_streams; n++) { struct sh_stream *sh = demuxer->streams[n]; sh->ds->active = sh->ds->selected; // force read_packet() to read @@ -544,7 +545,8 @@ struct demux_packet *demux_read_any_packet(struct demuxer *demuxer) } // retry after calling this pthread_mutex_lock(&demuxer->in->lock); - read_packet(demuxer->in); + read_more = read_packet(demuxer->in); + read_more &= !demuxer->in->eof; pthread_mutex_unlock(&demuxer->in->lock); } return NULL; |