From 0a8de3c96bf198b50206a90527a6250ba65315b7 Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Thu, 7 Nov 2013 13:36:30 +0200 Subject: avformat: support for audio stream language codes --- src/combined/ffmpeg/demux_avformat.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/combined/ffmpeg/demux_avformat.c b/src/combined/ffmpeg/demux_avformat.c index e9b9f7bda..ac18908d1 100644 --- a/src/combined/ffmpeg/demux_avformat.c +++ b/src/combined/ffmpeg/demux_avformat.c @@ -542,11 +542,43 @@ static int demux_avformat_get_stream_length (demux_plugin_t *this_gen) { } static uint32_t demux_avformat_get_capabilities(demux_plugin_t *this_gen) { - return DEMUX_CAP_NOCAP; + return DEMUX_CAP_AUDIOLANG; } static int demux_avformat_get_optional_data(demux_plugin_t *this_gen, void *data, int data_type) { + avformat_demux_plugin_t *this = (avformat_demux_plugin_t *) this_gen; + + if (!data || !this || !this->fmt_ctx) { + return DEMUX_OPTIONAL_UNSUPPORTED; + } + + char *str = data; + int channel = *((int *)data); + + switch (data_type) { + case DEMUX_OPTIONAL_DATA_AUDIOLANG: + if (channel >= 0 && channel < this->audio_track_count) { + + AVStream *st = this->fmt_ctx->streams[this->audio_stream_idx[channel]]; + AVDictionaryEntry *tag = NULL; + if ((tag = av_dict_get(st->metadata, "language", tag, AV_DICT_IGNORE_SUFFIX)) && tag->value[0]) { + strcpy(str, tag->value); + return DEMUX_OPTIONAL_SUCCESS; + } + + /* input plugin may know the language */ + if (this->stream->input_plugin->get_capabilities(this->stream->input_plugin) & INPUT_CAP_AUDIOLANG) + return DEMUX_OPTIONAL_UNSUPPORTED; + sprintf(str, "%3i", channel); + return DEMUX_OPTIONAL_SUCCESS; + + } else { + strcpy(str, "none"); + } + return DEMUX_OPTIONAL_UNSUPPORTED; + } + return DEMUX_OPTIONAL_UNSUPPORTED; } -- cgit v1.2.3