From 061a5af54439fedbe6e89d03e643631fafd988a0 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 14 Aug 2014 01:18:18 +0200 Subject: 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.) --- demux/demux_lavf.c | 26 +++++++++++++++++++++++--- old-configure | 6 ++++++ wscript | 6 ++++++ 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 @@ -809,6 +809,12 @@ api_statement_check \ libavcodec/avcodec.h \ '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 \ diff --git a/wscript b/wscript index 7786ebf7d2..464be54b09 100644 --- a/wscript +++ b/wscript @@ -386,6 +386,12 @@ Libav libraries ({0}). Aborting.".format(" ".join(libav_pkg_config_checks)) 'func': check_statement('libavcodec/avcodec.h', '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', -- cgit v1.2.3