From 7e209185f1fa804dda4474de7246a4d85418315e Mon Sep 17 00:00:00 2001 From: wm4 Date: Sat, 5 Jul 2014 16:45:56 +0200 Subject: 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. --- demux/demux.c | 33 ++++++++++++--------------------- demux/demux.h | 10 +++++++++- demux/demux_lavf.c | 1 + 3 files changed, 22 insertions(+), 22 deletions(-) (limited to 'demux') 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) diff --git a/demux/demux.h b/demux/demux.h index df1762eb08..3929e23c94 100644 --- a/demux/demux.h +++ b/demux/demux.h @@ -87,6 +87,10 @@ enum demux_check { DEMUX_CHECK_NORMAL, // normal, safe detection }; +enum demux_event { + DEMUX_EVENT_METADATA = (1 << 0), +}; + #define MAX_SH_STREAMS 256 struct demuxer; @@ -181,6 +185,9 @@ typedef struct demuxer { bool ts_resets_possible; bool warned_queue_overflow; + // Bitmask of DEMUX_EVENT_* + int events; + struct sh_stream **streams; int num_streams; bool stream_autoselect; @@ -203,7 +210,8 @@ typedef struct demuxer { struct playlist *playlist; struct mp_tags *metadata; - char *previous_metadata; + + struct mp_tags *stream_metadata; void *priv; // demuxer-specific internal data struct MPOpts *opts; diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c index f10c23a753..76a7d50471 100644 --- a/demux/demux_lavf.c +++ b/demux/demux_lavf.c @@ -616,6 +616,7 @@ static void update_metadata(demuxer_t *demuxer, AVPacket *pkt) mp_tags_clear(demuxer->metadata); mp_tags_copy_from_av_dictionary(demuxer->metadata, dict); av_dict_free(&dict); + demuxer->events |= DEMUX_EVENT_METADATA; } } #endif -- cgit v1.2.3