From ef68cfcc8a1f0179bbdade48225907a881ba0abd Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 18 Oct 2013 21:50:08 -0400 Subject: demux_lavf: get updated metadata from a packet if available The side_data type is brand new in ffmpeg. --- demux/demux_lavf.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'demux') diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c index 6c440bcb23..c92e4850b2 100644 --- a/demux/demux_lavf.c +++ b/demux/demux_lavf.c @@ -518,6 +518,23 @@ static void add_metadata(demuxer_t *demuxer, AVDictionary *metadata) demux_info_add(demuxer, t->key, t->value); } +static void update_metadata(demuxer_t *demuxer, AVPacket *pkt) +{ +#if HAVE_AVCODEC_METADATA_UPDATE_SIDE_DATA + int md_size; + const uint8_t *md; + md = av_packet_get_side_data(pkt, AV_PKT_DATA_METADATA_UPDATE, &md_size); + if (md) { + AVDictionary *dict = NULL; + av_packet_unpack_dictionary(md, md_size, &dict); + if (dict) { + add_metadata(demuxer, dict); + av_dict_free(&dict); + } + } +#endif +} + static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check) { struct MPOpts *opts = demuxer->opts; @@ -542,6 +559,12 @@ static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check) avfc->flags |= AVFMT_FLAG_GENPTS; if (opts->index_mode == 0) avfc->flags |= AVFMT_FLAG_IGNIDX; + /* Keep side data as side data instead of mashing it into the packet + * stream. */ + if (av_opt_set(avfc, "fflags", "+keepside", 0) < 0) { + MP_WARN(demuxer, "demux_lavf, couldn't set option keepdata; " + "in-stream metadata updates will be ignored\n"); + } if (lavfdopts->probesize) { if (av_opt_set_int(avfc, "probesize", lavfdopts->probesize, 0) < 0) @@ -705,6 +728,8 @@ static int demux_lavf_fill_buffer(demuxer_t *demux) if (av_dup_packet(pkt) < 0) abort(); + update_metadata(demux, pkt); + dp = new_demux_packet_fromdata(pkt->data, pkt->size); dp->avpacket = talloc_steal(dp, pkt); -- cgit v1.2.3