summaryrefslogtreecommitdiffstats
path: root/demux/demux.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-07-05 16:45:56 +0200
committerwm4 <wm4@nowhere>2014-07-05 17:07:14 +0200
commit7e209185f1fa804dda4474de7246a4d85418315e (patch)
treeee709c1236297a8757186907f8236315d979d02e /demux/demux.c
parent58880c00eeca254a5391dd61a920081bb16bc2c1 (diff)
downloadmpv-7e209185f1fa804dda4474de7246a4d85418315e.tar.bz2
mpv-7e209185f1fa804dda4474de7246a4d85418315e.tar.xz
demux, stream: change metadata notification
(Again.) This time, we simply make it event-based, as it should be. This is done for both demuxer metadata and stream metadata. For some ogg-over-icy streams, 2 updates are reported on stream start. This is because libavformat reports an update right on start, while including the same info in the "static" metadata. I don't know if that's a bug or a feature.
Diffstat (limited to 'demux/demux.c')
-rw-r--r--demux/demux.c33
1 files changed, 12 insertions, 21 deletions
diff --git a/demux/demux.c b/demux/demux.c
index 92a68d260e..b13225e642 100644
--- a/demux/demux.c
+++ b/demux/demux.c
@@ -651,31 +651,22 @@ char *demux_info_get(demuxer_t *demuxer, const char *opt)
bool demux_info_update(struct demuxer *demuxer)
{
- struct mp_tags *tags = demuxer->metadata;
+ bool r = false;
// Take care of stream metadata as well
- char **meta;
- if (stream_control(demuxer->stream, STREAM_CTRL_GET_METADATA, &meta) > 0) {
- for (int n = 0; meta[n + 0]; n += 2)
- mp_tags_set_str(tags, meta[n + 0], meta[n + 1]);
- talloc_free(meta);
+ struct mp_tags *s_meta = NULL;
+ if (stream_control(demuxer->stream, STREAM_CTRL_GET_METADATA, &s_meta) > 0) {
+ talloc_free(demuxer->stream_metadata);
+ demuxer->stream_metadata = talloc_steal(demuxer, s_meta);
+ demuxer->events |= DEMUX_EVENT_METADATA;
}
- // Check for metadata changes the hard way.
- char *data = talloc_strdup(demuxer, "");
- for (int n = 0; n < tags->num_keys; n++) {
- data = talloc_asprintf_append_buffer(data, "%s=%s\n", tags->keys[n],
- tags->values[n]);
- }
- if (!demuxer->previous_metadata ||
- strcmp(demuxer->previous_metadata, data) != 0)
- {
- talloc_free(demuxer->previous_metadata);
- demuxer->previous_metadata = data;
+ if (demuxer->events & DEMUX_EVENT_METADATA) {
+ demuxer->events &= ~DEMUX_EVENT_METADATA;
+ if (demuxer->stream_metadata)
+ mp_tags_merge(demuxer->metadata, demuxer->stream_metadata);
demux_info_print(demuxer);
- return true;
- } else {
- talloc_free(data);
- return false;
+ r = true;
}
+ return r;
}
int demux_control(demuxer_t *demuxer, int cmd, void *arg)