summaryrefslogtreecommitdiffstats
path: root/demux
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-07-19 12:34:07 +0200
committerwm4 <wm4@nowhere>2014-07-19 12:34:07 +0200
commit887140b7d4c79f3afd3edc26591f9938a0acae38 (patch)
tree24dbb92784947fbf39c83fdf05f657ef55880733 /demux
parentcfdb1312dad025ca29c0841d9cbe3cdb9885a1d5 (diff)
downloadmpv-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.
Diffstat (limited to 'demux')
-rw-r--r--demux/demux.c6
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;