diff --git a/demux/demux.c b/demux/demux.c index fe5ac6a3d6..ceaa9db79c 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -720,19 +720,11 @@ int demux_info_add(demuxer_t *demuxer, const char *opt, const char *param) int demux_info_add_bstr(demuxer_t *demuxer, struct bstr opt, struct bstr param) { - char *oldval = mp_tags_get_bstr(demuxer->metadata, opt); - if (oldval) { - if (bstrcmp0(param, oldval) == 0) - return 0; - MP_INFO(demuxer, "Demuxer info %.*s changed to %.*s\n", - BSTR_P(opt), BSTR_P(param)); - } - mp_tags_set_bstr(demuxer->metadata, opt, param); return 1; } -int demux_info_print(demuxer_t *demuxer) +static int demux_info_print(demuxer_t *demuxer) { struct mp_tags *info = demuxer->metadata; int n; @@ -760,14 +752,29 @@ char *demux_info_get(demuxer_t *demuxer, const char *opt) void demux_info_update(struct demuxer *demuxer) { - demux_control(demuxer, DEMUXER_CTRL_UPDATE_INFO, NULL); + struct mp_tags *tags = demuxer->metadata; // 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) - demux_info_add(demuxer, meta[n + 0], meta[n + 1]); + mp_tags_set_str(tags, meta[n + 0], meta[n + 1]); talloc_free(meta); } + // 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; + demux_info_print(demuxer); + } else { + talloc_free(data); + } } int demux_control(demuxer_t *demuxer, int cmd, void *arg) diff --git a/demux/demux.h b/demux/demux.h index a979a357c1..2c8211e246 100644 --- a/demux/demux.h +++ b/demux/demux.h @@ -50,8 +50,7 @@ enum demuxer_type { #define DEMUXER_CTRL_GUESS 2 enum demux_ctrl { - DEMUXER_CTRL_UPDATE_INFO = 1, - DEMUXER_CTRL_SWITCHED_TRACKS, + DEMUXER_CTRL_SWITCHED_TRACKS = 1, DEMUXER_CTRL_GET_TIME_LENGTH, DEMUXER_CTRL_GET_START_TIME, DEMUXER_CTRL_RESYNC, @@ -199,6 +198,7 @@ typedef struct demuxer { struct playlist *playlist; struct mp_tags *metadata; + char *previous_metadata; void *priv; // demuxer-specific internal data struct MPOpts *opts; @@ -247,7 +247,6 @@ int demux_info_add(struct demuxer *demuxer, const char *opt, const char *param); int demux_info_add_bstr(struct demuxer *demuxer, struct bstr opt, struct bstr param); char *demux_info_get(struct demuxer *demuxer, const char *opt); -int demux_info_print(struct demuxer *demuxer); void demux_info_update(struct demuxer *demuxer); int demux_control(struct demuxer *demuxer, int cmd, void *arg); diff --git a/player/loadfile.c b/player/loadfile.c index 13335db886..685d87d380 100644 --- a/player/loadfile.c +++ b/player/loadfile.c @@ -1256,7 +1256,7 @@ goto_reopen_demuxer: ; } reselect_demux_streams(mpctx); - demux_info_print(mpctx->master_demuxer); + demux_info_update(mpctx->master_demuxer); print_file_properties(mpctx); #if HAVE_ENCODING