summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2020-02-28 00:08:36 +0100
committerwm4 <wm4@nowhere>2020-02-28 00:08:36 +0100
commit2b628d4352de09c5ec4663d2dfeebd4e11065f74 (patch)
treed677734fed56be087c1bf4026dc6e51c0cc0cc5c
parent1e57f457b040fada62daeb67b96098c9e881bb59 (diff)
downloadmpv-2b628d4352de09c5ec4663d2dfeebd4e11065f74.tar.bz2
mpv-2b628d4352de09c5ec4663d2dfeebd4e11065f74.tar.xz
demux_timeline: fix bad EOF reporting
Exposed by commit b56e2efd5f3d. demux_timeline reported a bogus EOF if "parallel" streams were used. If a virtual source reported EOF, it was propagated as global EOF, without serving packets of other virtual sources that have not ended yet. Fix this by not reporting global EOF just because a source has not returned a packet. Instead make the reader retry by returning no packet and no EOF state, which will call d_read_packet() again with a different source. Rely on the eof_reached flags to signal global EOF. Since eof_reached is now more important, set it in a certain other case when it apparently should have been set. do_read_next_packet()'s return value is now ignored, so get rid of it.
-rw-r--r--demux/demux_timeline.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/demux/demux_timeline.c b/demux/demux_timeline.c
index eb923d92e4..9b4a049aee 100644
--- a/demux/demux_timeline.c
+++ b/demux/demux_timeline.c
@@ -261,15 +261,17 @@ static void switch_segment(struct demuxer *demuxer, struct virtual_source *src,
src->eos_packets = 0;
}
-static bool do_read_next_packet(struct demuxer *demuxer,
+static void do_read_next_packet(struct demuxer *demuxer,
struct virtual_source *src)
{
if (src->next)
- return 1;
+ return;
struct segment *seg = src->current;
- if (!seg || !seg->d)
- return 0;
+ if (!seg || !seg->d) {
+ src->eof_reached = true;
+ return;
+ }
struct demux_packet *pkt = demux_read_any_packet(seg->d);
if (!pkt || (!src->no_clip && pkt->pts >= seg->end))
@@ -310,10 +312,10 @@ static bool do_read_next_packet(struct demuxer *demuxer,
}
if (!next) {
src->eof_reached = true;
- return false;
+ return;
}
switch_segment(demuxer, src, next, next->start, 0, true);
- return true; // reader will retry
+ return; // reader will retry
}
if (pkt->stream < 0 || pkt->stream >= seg->num_stream_map)
@@ -358,17 +360,15 @@ static bool do_read_next_packet(struct demuxer *demuxer,
pkt->stream = vs->sh->index;
src->next = pkt;
- return true;
+ return;
drop:
talloc_free(pkt);
- return true;
}
static bool d_read_packet(struct demuxer *demuxer, struct demux_packet **out_pkt)
{
struct priv *p = demuxer->priv;
-
struct virtual_source *src = NULL;
for (int x = 0; x < p->num_sources; x++) {
@@ -391,8 +391,7 @@ static bool d_read_packet(struct demuxer *demuxer, struct demux_packet **out_pkt
if (!src)
return false;
- if (!do_read_next_packet(demuxer, src))
- return false;
+ do_read_next_packet(demuxer, src);
*out_pkt = src->next;
src->next = NULL;
return true;