summaryrefslogtreecommitdiffstats
path: root/demux
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
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')
-rw-r--r--demux/demux.c33
-rw-r--r--demux/demux.h10
-rw-r--r--demux/demux_lavf.c1
3 files changed, 22 insertions, 22 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)
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