[FFmpeg-devel] [PATCH v2] lavf/mpegts: add supplementary audio descriptor

Marton Balint cus at passwd.hu
Tue Feb 20 01:13:16 EET 2018



On Mon, 19 Feb 2018, Aman Gupta wrote:

> On Fri, Feb 16, 2018 at 11:22 AM, Stefan Pöschel <basic.master at gmx.de>
> wrote:
>
>> The supplementary audio descriptor is defined in ETSI EN 300 468 and
>> provides more details regarding accessibility audio tracks, especially
>> the normative annex J contains a detailed description of its use.
>>
>> Its language code (if present) overrides the language code of an also
>> present ISO 639 language descriptor.
>>
>> Note that this also changes the priority of multiple descriptors with
>> language from "the last descriptor with language within the ES loop" to
>> "specific descriptor over general ISO 639 descriptor".
>> ---
>>  libavformat/mpegts.c | 37 ++++++++++++++++++++++++++++++++++++-
>>  1 file changed, 36 insertions(+), 1 deletion(-)
>>
>> diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
>> index 0a3ad05..c3b522b 100644
>> --- a/libavformat/mpegts.c
>> +++ b/libavformat/mpegts.c
>> @@ -1840,7 +1840,9 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc,
>> AVStream *st, int stream_type
>>          }
>>          if (i && language[0]) {
>>              language[i - 1] = 0;
>> -            av_dict_set(&st->metadata, "language", language, 0);
>> +            /* don't overwrite language, as it may already have been set
>> by
>> +             * another, more specific descriptor (e.g. supplementary
>> audio) */
>> +            av_dict_set(&st->metadata, "language", language,
>> AV_DICT_DONT_OVERWRITE);
>>          }
>>          break;
>>      case 0x05: /* registration descriptor */
>> @@ -1895,6 +1897,39 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc,
>> AVStream *st, int stream_type
>>                  st->internal->need_context_update = 1;
>>              }
>>          }
>> +        if (ext_desc_tag == 0x06) { /* supplementary audio descriptor */
>> +            char flags;

Change this to int, I see no reason why this is a char.

>> +
>> +            if (desc_len < 1)
>> +                return AVERROR_INVALIDDATA;
>> +            flags = get8(pp, desc_end);
>> +
>> +            switch ((flags >> 2) & 0x1F) { /* editorial_classification */
>> +            case 0x01:
>> +                st->disposition |= AV_DISPOSITION_VISUAL_IMPAIRED;
>> +                break;
>> +            case 0x02:
>> +                st->disposition |= AV_DISPOSITION_HEARING_IMPAIRED;
>> +                break;
>> +            case 0x03:
>> +                st->disposition |= AV_DISPOSITION_VISUAL_IMPAIRED;
>> +                break;
>> +            }
>> +
>> +            if (flags & 0x01) { /* language_code_present */
>> +                if (desc_len < 4)
>> +                    return AVERROR_INVALIDDATA;
>> +                language[0] = get8(pp, desc_end);
>> +                language[1] = get8(pp, desc_end);
>> +                language[2] = get8(pp, desc_end);
>> +                language[3] = 0;
>> +
>> +                /* This language always has to override a possible
>> +                 * ISO 639 language descriptor language */
>> +                if (language[0])
>> +                    av_dict_set(&st->metadata, "language", language, 0);
>> +            }
>> +        }
>>          break;
>>      default:
>>          break;
>>
>
> LGTM. Will commit in a couple days along with my AV_DISPOSITION_DEPENDENT
> if no one objects.

LGTM too otherwise.

Thanks,
Marton


More information about the ffmpeg-devel mailing list