summaryrefslogtreecommitdiff
path: root/libavformat/mpegts.c
diff options
context:
space:
mode:
authorStefan Pöschel <basic.master@gmx.de>2018-02-20 18:15:00 +0100
committerAman Gupta <aman@tmm1.net>2018-02-23 08:30:06 -0800
commit8720d3ffddbb3e03a72123322d67e12083c56c73 (patch)
tree650774e9f004f46902132ffd95085566e858336e /libavformat/mpegts.c
parent85e6a33bdfddfc9532dc10079368649a23c2b6c4 (diff)
lavf/mpegts: add supplementary audio descriptor
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". Signed-off-by: Aman Gupta <aman@tmm1.net>
Diffstat (limited to 'libavformat/mpegts.c')
-rw-r--r--libavformat/mpegts.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index 0a3ad05726..bca7a7af4e 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 */
+ int flags;
+
+ 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;