diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Format.java b/library/core/src/main/java/com/google/android/exoplayer2/Format.java index 8778a4244b..3ed5a99f23 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Format.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Format.java @@ -167,6 +167,16 @@ public final class Format implements Parcelable { */ public final int accessibilityChannel; + /** + * The Role descriptor value. + */ + public final String role; + + /** + * The Accessibility descriptor value. + */ + public final String accessibility; + // Lazily initialized hashcode. private int hashCode; @@ -234,6 +244,8 @@ public final class Format implements Parcelable { selectionFlags, /* language= */ null, /* accessibilityChannel= */ NO_VALUE, + /* role= */ null, + /* accessibility= */ null, OFFSET_SAMPLE_RELATIVE, initializationData, /* drmInitData= */ null, @@ -337,6 +349,8 @@ public final class Format implements Parcelable { /* selectionFlags= */ 0, /* language= */ null, /* accessibilityChannel= */ NO_VALUE, + /* role= */ null, + /* accessibility= */ null, OFFSET_SAMPLE_RELATIVE, initializationData, drmInitData, @@ -407,6 +421,8 @@ public final class Format implements Parcelable { selectionFlags, language, /* accessibilityChannel= */ NO_VALUE, + /* role= */ null, + /* accessibility= */ null, OFFSET_SAMPLE_RELATIVE, initializationData, /* drmInitData= */ null, @@ -511,6 +527,8 @@ public final class Format implements Parcelable { selectionFlags, language, /* accessibilityChannel= */ NO_VALUE, + /* role= */ null, + /* accessibility= */ null, OFFSET_SAMPLE_RELATIVE, initializationData, drmInitData, @@ -557,7 +575,9 @@ public final class Format implements Parcelable { bitrate, selectionFlags, language, - /* accessibilityChannel= */ NO_VALUE); + /* accessibilityChannel= */ NO_VALUE, + /* role= */ null, + /* accessibility= */ null); } public static Format createTextContainerFormat( @@ -569,7 +589,9 @@ public final class Format implements Parcelable { int bitrate, @C.SelectionFlags int selectionFlags, @Nullable String language, - int accessibilityChannel) { + int accessibilityChannel, + @Nullable String role, + @Nullable String accessibility) { return new Format( id, label, @@ -594,6 +616,8 @@ public final class Format implements Parcelable { selectionFlags, language, accessibilityChannel, + role, + accessibility, OFFSET_SAMPLE_RELATIVE, /* initializationData= */ null, /* drmInitData= */ null, @@ -706,6 +730,8 @@ public final class Format implements Parcelable { selectionFlags, language, accessibilityChannel, + /* role= */ null, + /* accessibility= */ null, subsampleOffsetUs, initializationData, drmInitData, @@ -747,6 +773,8 @@ public final class Format implements Parcelable { selectionFlags, language, /* accessibilityChannel= */ NO_VALUE, + /* role= */ null, + /* accessibility= */ null, OFFSET_SAMPLE_RELATIVE, initializationData, drmInitData, @@ -808,6 +836,8 @@ public final class Format implements Parcelable { selectionFlags, language, /* accessibilityChannel= */ NO_VALUE, + /* role= */ null, + /* accessibility= */ null, OFFSET_SAMPLE_RELATIVE, /* initializationData= */ null, /* drmInitData= */ null, @@ -840,6 +870,8 @@ public final class Format implements Parcelable { /* selectionFlags= */ 0, /* language= */ null, /* accessibilityChannel= */ NO_VALUE, + /* role= */ null, + /* accessibility= */ null, subsampleOffsetUs, /* initializationData= */ null, /* drmInitData= */ null, @@ -876,6 +908,8 @@ public final class Format implements Parcelable { /* selectionFlags= */ 0, /* language= */ null, /* accessibilityChannel= */ NO_VALUE, + /* role= */ null, + /* accessibility= */ null, OFFSET_SAMPLE_RELATIVE, /* initializationData= */ null, drmInitData, @@ -906,6 +940,8 @@ public final class Format implements Parcelable { @C.SelectionFlags int selectionFlags, @Nullable String language, int accessibilityChannel, + @Nullable String role, + @Nullable String accessibility, long subsampleOffsetUs, @Nullable List initializationData, @Nullable DrmInitData drmInitData, @@ -934,6 +970,8 @@ public final class Format implements Parcelable { this.selectionFlags = selectionFlags; this.language = Util.normalizeLanguageCode(language); this.accessibilityChannel = accessibilityChannel; + this.role = role; + this.accessibility = accessibility; this.subsampleOffsetUs = subsampleOffsetUs; this.initializationData = initializationData == null ? Collections.emptyList() : initializationData; @@ -967,6 +1005,8 @@ public final class Format implements Parcelable { selectionFlags = in.readInt(); language = in.readString(); accessibilityChannel = in.readInt(); + role = in.readString(); + accessibility = in.readString(); subsampleOffsetUs = in.readLong(); int initializationDataSize = in.readInt(); initializationData = new ArrayList<>(initializationDataSize); @@ -1002,6 +1042,8 @@ public final class Format implements Parcelable { selectionFlags, language, accessibilityChannel, + role, + accessibility, subsampleOffsetUs, initializationData, drmInitData, @@ -1033,6 +1075,8 @@ public final class Format implements Parcelable { selectionFlags, language, accessibilityChannel, + role, + accessibility, subsampleOffsetUs, initializationData, drmInitData, @@ -1073,6 +1117,8 @@ public final class Format implements Parcelable { selectionFlags, language, accessibilityChannel, + role, + accessibility, subsampleOffsetUs, initializationData, drmInitData, @@ -1144,6 +1190,8 @@ public final class Format implements Parcelable { selectionFlags, language, accessibilityChannel, + role, + accessibility, subsampleOffsetUs, initializationData, drmInitData, @@ -1175,6 +1223,8 @@ public final class Format implements Parcelable { selectionFlags, language, accessibilityChannel, + role, + accessibility, subsampleOffsetUs, initializationData, drmInitData, @@ -1206,6 +1256,8 @@ public final class Format implements Parcelable { selectionFlags, language, accessibilityChannel, + role, + accessibility, subsampleOffsetUs, initializationData, drmInitData, @@ -1237,6 +1289,8 @@ public final class Format implements Parcelable { selectionFlags, language, accessibilityChannel, + role, + accessibility, subsampleOffsetUs, initializationData, drmInitData, @@ -1268,6 +1322,8 @@ public final class Format implements Parcelable { selectionFlags, language, accessibilityChannel, + role, + accessibility, subsampleOffsetUs, initializationData, drmInitData, @@ -1299,6 +1355,8 @@ public final class Format implements Parcelable { selectionFlags, language, accessibilityChannel, + role, + accessibility, subsampleOffsetUs, initializationData, drmInitData, @@ -1330,6 +1388,8 @@ public final class Format implements Parcelable { selectionFlags, language, accessibilityChannel, + role, + accessibility, subsampleOffsetUs, initializationData, drmInitData, @@ -1439,6 +1499,8 @@ public final class Format implements Parcelable { && Util.areEqual(label, other.label) && Util.areEqual(language, other.language) && accessibilityChannel == other.accessibilityChannel + && Util.areEqual(role, other.role) + && Util.areEqual(accessibility, other.accessibility) && Util.areEqual(containerMimeType, other.containerMimeType) && Util.areEqual(sampleMimeType, other.sampleMimeType) && Util.areEqual(codecs, other.codecs) @@ -1540,6 +1602,8 @@ public final class Format implements Parcelable { dest.writeInt(selectionFlags); dest.writeString(language); dest.writeInt(accessibilityChannel); + dest.writeString(role); + dest.writeString(accessibility); dest.writeLong(subsampleOffsetUs); int initializationDataSize = initializationData.size(); dest.writeInt(initializationDataSize); diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java index c0aa2a7819..41a460075e 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java @@ -276,6 +276,7 @@ public class DashManifestParser extends DefaultHandler ArrayList drmSchemeDatas = new ArrayList<>(); ArrayList inbandEventStreams = new ArrayList<>(); ArrayList accessibilityDescriptors = new ArrayList<>(); + ArrayList roleDescriptors = new ArrayList<>(); ArrayList supplementalProperties = new ArrayList<>(); List representationInfos = new ArrayList<>(); @C.SelectionFlags int selectionFlags = 0; @@ -300,7 +301,10 @@ public class DashManifestParser extends DefaultHandler language = checkLanguageConsistency(language, xpp.getAttributeValue(null, "lang")); contentType = checkContentTypeConsistency(contentType, parseContentType(xpp)); } else if (XmlPullParserUtil.isStartTag(xpp, "Role")) { - selectionFlags |= parseRole(xpp); + Descriptor descriptor = parseDescriptor(xpp, "Role"); + selectionFlags |= "urn:mpeg:dash:role:2011".equals(descriptor.schemeIdUri) + && "main".equals(descriptor.value) ? C.SELECTION_FLAG_DEFAULT : 0; + roleDescriptors.add(descriptor); } else if (XmlPullParserUtil.isStartTag(xpp, "AudioChannelConfiguration")) { audioChannels = parseAudioChannelConfiguration(xpp); } else if (XmlPullParserUtil.isStartTag(xpp, "Accessibility")) { @@ -322,6 +326,7 @@ public class DashManifestParser extends DefaultHandler audioSamplingRate, language, selectionFlags, + roleDescriptors, accessibilityDescriptors, segmentBase); contentType = checkContentTypeConsistency(contentType, @@ -509,6 +514,7 @@ public class DashManifestParser extends DefaultHandler int adaptationSetAudioSamplingRate, String adaptationSetLanguage, @C.SelectionFlags int adaptationSetSelectionFlags, + List adaptationSetRoleDescriptors, List adaptationSetAccessibilityDescriptors, SegmentBase segmentBase) throws XmlPullParserException, IOException { @@ -573,6 +579,7 @@ public class DashManifestParser extends DefaultHandler bandwidth, adaptationSetLanguage, adaptationSetSelectionFlags, + adaptationSetRoleDescriptors, adaptationSetAccessibilityDescriptors, codecs, supplementalProperties); @@ -594,6 +601,7 @@ public class DashManifestParser extends DefaultHandler int bitrate, String language, @C.SelectionFlags int selectionFlags, + List roleDescriptors, List accessibilityDescriptors, String codecs, List supplementalProperties) { @@ -637,6 +645,10 @@ public class DashManifestParser extends DefaultHandler } else { accessibilityChannel = Format.NO_VALUE; } + + String role = parseRole(roleDescriptors); + String accessibility = parseAccessibility(accessibilityDescriptors); + return Format.createTextContainerFormat( id, label, @@ -646,7 +658,9 @@ public class DashManifestParser extends DefaultHandler bitrate, selectionFlags, language, - accessibilityChannel); + accessibilityChannel, + role, + accessibility); } } return Format.createContainerFormat( @@ -1266,6 +1280,32 @@ public class DashManifestParser extends DefaultHandler return MimeTypes.AUDIO_E_AC3; } + protected static String parseRole(List roleDescriptors) { + for (int i = 0; i < roleDescriptors.size(); i++) { + Descriptor descriptor = roleDescriptors.get(i); + if ("urn:mpeg:dash:role:2011".equals(descriptor.schemeIdUri) && descriptor.value != null) { + return descriptor.value; + } + } + return null; + } + + protected static String parseAccessibility(List accessibilityDescriptors) { + for (int i = 0; i < accessibilityDescriptors.size(); i++) { + Descriptor descriptor = accessibilityDescriptors.get(i); + if ("urn:mpeg:dash:role:2011".equals(descriptor.schemeIdUri) && descriptor.value != null) { + return descriptor.value; + } + + if ("urn:tva:metadata:cs:AudioPurposeCS:2007".equals(descriptor.schemeIdUri)) { + if ("1".equals(descriptor.value) || "2".equals(descriptor.value)) { + return descriptor.value; + } + } + } + return null; + } + protected static float parseFrameRate(XmlPullParser xpp, float defaultValue) { float frameRate = defaultValue; String frameRateAttribute = xpp.getAttributeValue(null, "frameRate"); diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java index 100323b862..e9fd1fb803 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java @@ -405,7 +405,9 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser