}
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 */
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);
+
+ if ((flags & 0x80) == 0) /* mix_type */
+ st->disposition |= AV_DISPOSITION_DEPENDENT;
+
+ 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;
}
}
+ if (packet[1] & 0x80) {
+ av_log(ts->stream, AV_LOG_DEBUG, "Packet had TEI flag set; marking as corrupt\n");
+ if (tss->type == MPEGTS_PES) {
+ PESContext *pc = tss->u.pes_filter.opaque;
+ pc->flags |= AV_PKT_FLAG_CORRUPT;
+ }
+ }
+
p = packet + 4;
if (has_adaptation) {
int64_t pcr_h;