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.)
This commit is contained in:
wm4 2014-08-14 01:18:18 +02:00
parent e7cab32fae
commit 061a5af544
3 changed files with 35 additions and 3 deletions

View File

@ -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 ?

View File

@ -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 \

View File

@ -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',