[FFmpeg-devel] [PATCH 3/5] mpegts: add channel specific languages into metadata

Måns Rullgård mans
Tue Feb 15 14:24:19 CET 2011


Anssi Hannula <anssi.hannula at iki.fi> writes:

> On 15.02.2011 01:11, M?ns Rullg?rd wrote:
>> Anssi Hannula <anssi.hannula at iki.fi> writes:
>> 
>>> ---
>>>  libavformat/mpegts.c |   27 +++++++++++++++++++++++++++
>>>  1 files changed, 27 insertions(+), 0 deletions(-)
>>>
>>> diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
>>> index 8b67db4..fafd9f9 100644
>>> --- a/libavformat/mpegts.c
>>> +++ b/libavformat/mpegts.c
>>> @@ -949,6 +949,32 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type
>>>          av_metadata_set2(&st->metadata, "language", language, 0);
>>>          break;
>>>      case 0x0a: /* ISO 639 language descriptor */
>>> +        if (desc_len >= 8 && desc_len % 4 == 0) {
>>> +            /* channel-specific language tags */
>>> +            int ch;
>>> +            int tag_count = FFMIN(desc_len / 4, 10);
>>> +            char *combined_lang = av_malloc(tag_count * 4);
>>> +            if (!combined_lang)
>>> +                break;
>>> +            for (ch = 0; ch < tag_count; ch++) {
>>> +                char *language_key = av_strdup("channelX/language");
>> 
>> What does channel refer to here?
>
> To a single audio channel of a dual-mono audio stream.
>
>>> +                if (!language_key)
>>> +                    break;
>>> +                language_key[7] = '0' + ch;
>>> +                language[0] = combined_lang[ch * 4 + 0] = get8(pp, desc_end);
>>> +                language[1] = combined_lang[ch * 4 + 1] = get8(pp, desc_end);
>>> +                language[2] = combined_lang[ch * 4 + 2] = get8(pp, desc_end);
>>> +                language[3] = 0;
>>> +                combined_lang[ch * 4 + 3] = '+';
>>> +                av_metadata_set2(&st->metadata, language_key, language,
>>> +                                 AV_METADATA_DONT_STRDUP_KEY);
>>> +                if (get8(pp, desc_end))
>>> +                    av_log_ask_for_sample(fc, "Multiple languages and non-zero audio_type.");
>>> +            }
>>> +            combined_lang[tag_count * 4 - 1] = 0;
>>> +            av_metadata_set2(&st->metadata, "language", combined_lang,
>>> +                             AV_METADATA_DONT_STRDUP_VAL);
>> 
>> I don't understand the idea behind this.  The descriptor applies to one
>> program element (AVStream).  If it contains several language codes, this
>> simply means the stream contains multiple languages.  The MPEG spec
>> doesn't specify any further interpretation.  Does DVB use this to
>> indicate multiple mono streams coded as one elementary stream?  I don't
>> have those specs at hand.
>
> Looked up:
>
> ETSI TS 102 154 V1.2.1 (2004-05) [1] section 4.1.8.8:
> For an audio stream coded as dual-mono (e.g. MPEG dual-channel, or AC-3
> 1+1 mode), the descriptor should contain two language codes describing
> the two audio channels contained in the dual-mono stream. The sequence
> of codes identifies the language for each audio channel as follows: the
> first code signals the language of the left channel, channel 1, of the
> dual-mono stream, and the second code signals the language of the right
> channel, channel 2.
>
> [1] This is the DVB spec for "Contribution and Primary Distribution
> Applications". Interestingly, this passage is missing from the TS 101
> 154, the spec for "Broadcasting Applications".
>
> Nevertheless, this dual-mono coding was used until recently on DVB-C
> here (I just looked at Eurosport and the 4 languages seem to be all
> transmitted as full stereo now).

Thanks for the spec reference.

> As Janne said, though, this seems to be deprecated in DVB, so I guess it
> would make sense to just do the language=xxx+yyy thing, and drop the
> more complex channelN/language=xxx stuff? It would also be more generic
> in case some TS streams do not use them to indicate channel languages.

Let's do that first.

-- 
M?ns Rullg?rd
mans at mansr.com



More information about the ffmpeg-devel mailing list