summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-08-14 01:18:18 +0200
committerwm4 <wm4@nowhere>2014-08-14 01:18:18 +0200
commit061a5af54439fedbe6e89d03e643631fafd988a0 (patch)
treee33856d801527b9d306a7c060ad9b7b91a2735b7
parente7cab32faeb0816423cf5dbfb4f651d25274fde6 (diff)
downloadmpv-061a5af54439fedbe6e89d03e643631fafd988a0.tar.bz2
mpv-061a5af54439fedbe6e89d03e643631fafd988a0.tar.xz
demux_lavf: support new metadata update API
This Libav-invented API is of course completely different from the FFmpeg-one. (The fun part is that I approved of both.)
-rw-r--r--demux/demux_lavf.c26
-rwxr-xr-xold-configure6
-rw-r--r--wscript6
3 files changed, 35 insertions, 3 deletions
diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c
index 0987508a14..2733e04fd4 100644
--- a/demux/demux_lavf.c
+++ b/demux/demux_lavf.c
@@ -606,10 +606,29 @@ static void add_new_streams(demuxer_t *demuxer)
static void update_metadata(demuxer_t *demuxer, AVPacket *pkt)
{
-#if HAVE_AVCODEC_METADATA_UPDATE_SIDE_DATA
+#if HAVE_AVFORMAT_METADATA_UPDATE_FLAG
+ lavf_priv_t *priv = demuxer->priv;
+ if (priv->avfc->event_flags & AVFMT_EVENT_FLAG_METADATA_UPDATED) {
+ mp_tags_copy_from_av_dictionary(demuxer->metadata, priv->avfc->metadata);
+ priv->avfc->event_flags = 0;
+ demux_changed(demuxer, DEMUX_EVENT_METADATA);
+ }
+ if (priv->merge_track_metadata) {
+ for (int n = 0; n < priv->num_streams; n++) {
+ AVStream *st = priv->streams[n] ? priv->avfc->streams[n] : NULL;
+ if (st->event_flags & AVSTREAM_EVENT_FLAG_METADATA_UPDATED) {
+ mp_tags_copy_from_av_dictionary(demuxer->metadata, st->metadata);
+ st->event_flags = 0;
+ demux_changed(demuxer, DEMUX_EVENT_METADATA);
+ }
+ }
+ }
+#elif HAVE_AVCODEC_METADATA_UPDATE_SIDE_DATA
lavf_priv_t *priv = demuxer->priv;
int md_size;
const uint8_t *md;
+ if (!pkt)
+ return;
md = av_packet_get_side_data(pkt, AV_PKT_DATA_METADATA_UPDATE, &md_size);
if (md && priv->merge_track_metadata) {
AVDictionary *dict = NULL;
@@ -740,8 +759,6 @@ static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check)
add_new_streams(demuxer);
- mp_tags_copy_from_av_dictionary(demuxer->metadata, avfc->metadata);
-
// Often useful with OGG audio-only files, which have metadata in the audio
// track metadata instead of the main metadata.
if (demuxer->num_streams == 1) {
@@ -752,6 +769,9 @@ static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check)
}
}
+ mp_tags_copy_from_av_dictionary(demuxer->metadata, avfc->metadata);
+ update_metadata(demuxer, NULL);
+
demuxer->ts_resets_possible = priv->avif->flags & AVFMT_TS_DISCONT;
demuxer->start_time = priv->avfc->start_time == AV_NOPTS_VALUE ?
diff --git a/old-configure b/old-configure
index 910ebf7cc8..cc0945f956 100755
--- a/old-configure
+++ b/old-configure
@@ -810,6 +810,12 @@ api_statement_check \
'enum AVPacketSideDataType type = AV_PKT_DATA_METADATA_UPDATE'
api_statement_check \
+ "libavformat metadata update flags" \
+ HAVE_AVFORMAT_METADATA_UPDATE_FLAG \
+ libavformat/avformat.h \
+ 'int x = AVFMT_EVENT_FLAG_METADATA_UPDATED'
+
+api_statement_check \
"libavcodec replaygain side data" \
HAVE_AVCODEC_REPLAYGAIN_SIDE_DATA \
libavcodec/avcodec.h \
diff --git a/wscript b/wscript
index 7786ebf7d2..464be54b09 100644
--- a/wscript
+++ b/wscript
@@ -387,6 +387,12 @@ Libav libraries ({0}). Aborting.".format(" ".join(libav_pkg_config_checks))
'enum AVPacketSideDataType type = AV_PKT_DATA_METADATA_UPDATE',
use='libav')
}, {
+ 'name': 'avformat-metadata-update-flag',
+ 'desc': "libavformat metadata update flags",
+ 'func': check_statement('libavformat/avformat.h',
+ 'int x = AVFMT_EVENT_FLAG_METADATA_UPDATED',
+ use='libav')
+ }, {
'name': 'avcodec-replaygain-side-data',
'desc': 'libavcodec AV_PKT_DATA_REPLAYGAIN side data type',
'func': check_statement('libavcodec/avcodec.h',