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

Aman Gupta ffmpeg at tmm1.net
Thu Feb 15 21:52:54 EET 2018


On Thu, Feb 15, 2018 at 4:12 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..e5d0e1e 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;
> +
> +            if (desc_len < 1)
> +                return AVERROR_INVALIDDATA;
> +            flags = get8(pp, desc_end);
> +
> +            switch ((flags >> 2) & 0x1F) {
> +            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) {
> +                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;


Patch looks reasonable to me.

It might also be worth surfacing when the audio descriptor flags contain
mix_type=0, as this indicates a dependent stream which cannot be played
standalone.

Aman


> --
> 2.7.4
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list