summaryrefslogtreecommitdiffstats
path: root/demux/demux_timeline.c
diff options
context:
space:
mode:
Diffstat (limited to 'demux/demux_timeline.c')
-rw-r--r--demux/demux_timeline.c56
1 files changed, 37 insertions, 19 deletions
diff --git a/demux/demux_timeline.c b/demux/demux_timeline.c
index a9a762d3e4..5572fb53bf 100644
--- a/demux/demux_timeline.c
+++ b/demux/demux_timeline.c
@@ -116,6 +116,7 @@ static void associate_streams(struct demuxer *demuxer,
for (int n = 0; n < num_streams; n++) {
struct sh_stream *sh = demux_get_stream(seg->d, n);
struct virtual_stream *other = NULL;
+
for (int i = 0; i < src->num_streams; i++) {
struct virtual_stream *vs = src->streams[i];
@@ -134,6 +135,11 @@ static void associate_streams(struct demuxer *demuxer,
other = vs;
}
+ if (!other) {
+ MP_WARN(demuxer, "Source stream %d (%s) unused and hidden.\n",
+ n, stream_type_name(sh->type));
+ }
+
MP_TARRAY_APPEND(seg, seg->stream_map, seg->num_stream_map, other);
}
}
@@ -255,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))
@@ -304,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)
@@ -352,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++) {
@@ -385,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;
@@ -460,7 +465,7 @@ static void d_seek(struct demuxer *demuxer, double seek_pts, int flags)
for (int x = 0; x < p->num_sources; x++) {
struct virtual_source *src = p->sources[x];
- if (src != master)
+ if (src != master && src->any_selected)
seek_source(demuxer, src, seek_pts, flags);
}
}
@@ -520,6 +525,18 @@ static void apply_meta(struct sh_stream *dst, struct sh_stream *src)
dst->missing_timestamps = src->missing_timestamps;
if (src->attached_picture)
dst->attached_picture = src->attached_picture;
+ dst->image = src->image;
+}
+
+// This is mostly for EDL user-defined metadata.
+static struct sh_stream *find_matching_meta(struct timeline_par *tl, int index)
+{
+ for (int n = 0; n < tl->num_sh_meta; n++) {
+ struct sh_stream *sh = tl->sh_meta[n];
+ if (sh->index == index || sh->index < 0)
+ return sh;
+ }
+ return NULL;
}
static bool add_tl(struct demuxer *demuxer, struct timeline_par *tl)
@@ -547,7 +564,7 @@ static bool add_tl(struct demuxer *demuxer, struct timeline_par *tl)
// delay_open streams normally have meta==NULL, and 1 virtual stream
int num_streams = 0;
if (tl->delay_open) {
- num_streams = 1;
+ num_streams = tl->num_sh_meta;
} else if (meta) {
num_streams = demux_get_num_stream(meta);
}
@@ -555,9 +572,10 @@ static bool add_tl(struct demuxer *demuxer, struct timeline_par *tl)
struct sh_stream *new = NULL;
if (tl->delay_open) {
- assert(tl->sh_meta);
- new = demux_alloc_sh_stream(tl->sh_meta->type);
- new->codec = tl->sh_meta->codec;
+ struct sh_stream *tsh = tl->sh_meta[n];
+ new = demux_alloc_sh_stream(tsh->type);
+ new->codec = tsh->codec;
+ apply_meta(new, tsh);
demuxer->is_network = true;
demuxer->is_streaming = true;
} else {
@@ -565,11 +583,11 @@ static bool add_tl(struct demuxer *demuxer, struct timeline_par *tl)
new = demux_alloc_sh_stream(sh->type);
apply_meta(new, sh);
new->codec = sh->codec;
+ struct sh_stream *tsh = find_matching_meta(tl, n);
+ if (tsh)
+ apply_meta(new, tsh);
}
- if (tl->sh_meta)
- apply_meta(new, tl->sh_meta);
-
demux_add_sh_stream(demuxer, new);
struct virtual_stream *vs = talloc_ptrtype(p, vs);
*vs = (struct virtual_stream){