summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--demux/demux.c29
-rw-r--r--demux/demux.h5
-rw-r--r--player/loadfile.c2
3 files changed, 21 insertions, 15 deletions
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