diff --git a/RELEASENOTES.md b/RELEASENOTES.md index d12b369eb4..f5b1dd7fc6 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -5,6 +5,7 @@ * Update to Mockito 2 * Add new `ExoPlaybackException` types for remote exceptions and out-of-memory errors. +* DASH: Parse role and accessibility descriptors into `Format.roleFlags`. * HLS: * Work around lack of LA_URL attribute in PlayReady key request init data. * Prevent unnecessary reloads of initialization segments. diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastUtils.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastUtils.java index 997857f6b5..3633526f42 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastUtils.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastUtils.java @@ -109,6 +109,7 @@ import com.google.android.gms.cast.MediaTrack; /* codecs= */ null, /* bitrate= */ Format.NO_VALUE, /* selectionFlags= */ 0, + /* roleFlags= */ 0, mediaTrack.getLanguage()); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/C.java b/library/core/src/main/java/com/google/android/exoplayer2/C.java index c3619f1dc3..601cdd5e09 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/C.java @@ -979,6 +979,69 @@ public final class C { */ public static final int NETWORK_TYPE_OTHER = 8; + /** + * Track role flags. Possible values are {@link #ROLE_FLAG_MAIN}, {@link #ROLE_FLAG_ALTERNATE}, + * {@link #ROLE_FLAG_SUPPLEMENTARY}, {@link #ROLE_FLAG_COMMENTARY}, {@link #ROLE_FLAG_DUB}, {@link + * #ROLE_FLAG_EMERGENCY}, {@link #ROLE_FLAG_CAPTION}, {@link #ROLE_FLAG_SUBTITLE}, {@link + * #ROLE_FLAG_SIGN}, {@link #ROLE_FLAG_ENHANCED_AUDIO_INTELLIGIBILITY}, {@link + * #ROLE_FLAG_DESCRIPTION}. + */ + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef( + flag = true, + value = { + ROLE_FLAG_MAIN, + ROLE_FLAG_ALTERNATE, + ROLE_FLAG_SUPPLEMENTARY, + ROLE_FLAG_COMMENTARY, + ROLE_FLAG_DUB, + ROLE_FLAG_EMERGENCY, + ROLE_FLAG_CAPTION, + ROLE_FLAG_SUBTITLE, + ROLE_FLAG_SIGN, + ROLE_FLAG_ENHANCED_AUDIO_INTELLIGIBILITY, + ROLE_FLAG_DESCRIPTION + }) + public @interface RoleFlags {} + /** Indicates a main track. */ + public static final int ROLE_FLAG_MAIN = 1; + /** + * Indicates an alternate track. For example a video track recorded from an different view point + * than the main track(s). + */ + public static final int ROLE_FLAG_ALTERNATE = 1 << 1; + /** + * Indicates a supplementary track, meaning the track has lower importance than the main track(s). + * For example a video track that provides a visual accompaniment to a main audio track. + */ + public static final int ROLE_FLAG_SUPPLEMENTARY = 1 << 2; + /** Indicates the track contains commentary, for example from the director. */ + public static final int ROLE_FLAG_COMMENTARY = 1 << 3; + /** + * Indicates the track is in a different language from the original, for example dubbed audio or + * translated captions. + */ + public static final int ROLE_FLAG_DUB = 1 << 4; + /** Indicates the track contains information about a current emergency. */ + public static final int ROLE_FLAG_EMERGENCY = 1 << 5; + /** + * Indicates the track contains captions. This flag may be set on video tracks to indicate the + * presence of burned in captions. + */ + public static final int ROLE_FLAG_CAPTION = 1 << 6; + /** + * Indicates the track contains subtitles. This flag may be set on video tracks to indicate the + * presence of burned in subtitles. + */ + public static final int ROLE_FLAG_SUBTITLE = 1 << 7; + /** Indicates the track contains a visual sign-language interpretation of an audio track. */ + public static final int ROLE_FLAG_SIGN = 1 << 8; + /** Indicates the track is designed for improved intelligibility of dialogue. */ + public static final int ROLE_FLAG_ENHANCED_AUDIO_INTELLIGIBILITY = 1 << 9; + /** Indicates the track contains an audio or textual description of a video track. */ + public static final int ROLE_FLAG_DESCRIPTION = 1 << 10; + /** * Converts a time in microseconds to the corresponding time in milliseconds, preserving * {@link #TIME_UNSET} and {@link #TIME_END_OF_SOURCE} values. 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 da330bcf03..140da38337 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 @@ -50,6 +50,8 @@ public final class Format implements Parcelable { public final @Nullable String label; /** Track selection flags. */ @C.SelectionFlags public final int selectionFlags; + /** Track role flags. */ + @C.RoleFlags public final int roleFlags; /** * The average bandwidth in bits per second, or {@link #NO_VALUE} if unknown or not applicable. */ @@ -189,7 +191,8 @@ public final class Format implements Parcelable { height, frameRate, initializationData, - selectionFlags); + selectionFlags, + /* roleFlags= */ 0); } public static Format createVideoContainerFormat( @@ -203,11 +206,13 @@ public final class Format implements Parcelable { int height, float frameRate, @Nullable List initializationData, - @C.SelectionFlags int selectionFlags) { + @C.SelectionFlags int selectionFlags, + @C.RoleFlags int roleFlags) { return new Format( id, label, selectionFlags, + roleFlags, bitrate, codecs, /* metadata= */ null, @@ -311,6 +316,7 @@ public final class Format implements Parcelable { id, /* label= */ null, /* selectionFlags= */ 0, + /* roleFlags= */ 0, bitrate, codecs, /* metadata= */ null, @@ -362,6 +368,7 @@ public final class Format implements Parcelable { sampleRate, initializationData, selectionFlags, + /* roleFlags= */ 0, language); } @@ -376,11 +383,13 @@ public final class Format implements Parcelable { int sampleRate, @Nullable List initializationData, @C.SelectionFlags int selectionFlags, + @C.RoleFlags int roleFlags, @Nullable String language) { return new Format( id, label, selectionFlags, + roleFlags, bitrate, codecs, /* metadata= */ null, @@ -485,6 +494,7 @@ public final class Format implements Parcelable { id, /* label= */ null, selectionFlags, + /* roleFlags= */ 0, bitrate, codecs, metadata, @@ -550,6 +560,7 @@ public final class Format implements Parcelable { codecs, bitrate, selectionFlags, + /* roleFlags= */ 0, language, /* accessibilityChannel= */ NO_VALUE); } @@ -562,12 +573,14 @@ public final class Format implements Parcelable { @Nullable String codecs, int bitrate, @C.SelectionFlags int selectionFlags, + @C.RoleFlags int roleFlags, @Nullable String language, int accessibilityChannel) { return new Format( id, label, selectionFlags, + roleFlags, bitrate, codecs, /* metadata= */ null, @@ -680,6 +693,7 @@ public final class Format implements Parcelable { id, /* label= */ null, selectionFlags, + /* roleFlags= */ 0, bitrate, codecs, /* metadata= */ null, @@ -721,6 +735,7 @@ public final class Format implements Parcelable { id, /* label= */ null, selectionFlags, + /* roleFlags= */ 0, bitrate, codecs, /* metadata=*/ null, @@ -766,6 +781,7 @@ public final class Format implements Parcelable { codecs, bitrate, selectionFlags, + /* roleFlags= */ 0, language); } @@ -777,11 +793,13 @@ public final class Format implements Parcelable { @Nullable String codecs, int bitrate, @C.SelectionFlags int selectionFlags, + @C.RoleFlags int roleFlags, @Nullable String language) { return new Format( id, label, selectionFlags, + roleFlags, bitrate, codecs, /* metadata= */ null, @@ -814,6 +832,7 @@ public final class Format implements Parcelable { id, /* label= */ null, /* selectionFlags= */ 0, + /* roleFlags= */ 0, /* bitrate= */ NO_VALUE, /* codecs= */ null, /* metadata= */ null, @@ -850,6 +869,7 @@ public final class Format implements Parcelable { id, /* label= */ null, /* selectionFlags= */ 0, + /* roleFlags= */ 0, bitrate, codecs, /* metadata= */ null, @@ -880,6 +900,7 @@ public final class Format implements Parcelable { @Nullable String id, @Nullable String label, @C.SelectionFlags int selectionFlags, + @C.RoleFlags int roleFlags, int bitrate, @Nullable String codecs, @Nullable Metadata metadata, @@ -912,6 +933,7 @@ public final class Format implements Parcelable { this.id = id; this.label = label; this.selectionFlags = selectionFlags; + this.roleFlags = roleFlags; this.bitrate = bitrate; this.codecs = codecs; this.metadata = metadata; @@ -950,6 +972,7 @@ public final class Format implements Parcelable { id = in.readString(); label = in.readString(); selectionFlags = in.readInt(); + roleFlags = in.readInt(); bitrate = in.readInt(); codecs = in.readString(); metadata = in.readParcelable(Metadata.class.getClassLoader()); @@ -986,12 +1009,12 @@ public final class Format implements Parcelable { accessibilityChannel = in.readInt(); } - public Format copyWithMaxInputSize(int maxInputSize) { return new Format( id, label, selectionFlags, + roleFlags, bitrate, codecs, metadata, @@ -1023,6 +1046,7 @@ public final class Format implements Parcelable { id, label, selectionFlags, + roleFlags, bitrate, codecs, metadata, @@ -1064,6 +1088,7 @@ public final class Format implements Parcelable { id, label, selectionFlags, + roleFlags, bitrate, codecs, metadata, @@ -1128,6 +1153,7 @@ public final class Format implements Parcelable { // Merge manifest and sample format values. @C.SelectionFlags int selectionFlags = this.selectionFlags | manifestFormat.selectionFlags; + @C.RoleFlags int roleFlags = this.roleFlags | manifestFormat.roleFlags; DrmInitData drmInitData = DrmInitData.createSessionCreationData(manifestFormat.drmInitData, this.drmInitData); @@ -1135,6 +1161,7 @@ public final class Format implements Parcelable { id, label, selectionFlags, + roleFlags, bitrate, codecs, metadata, @@ -1166,6 +1193,7 @@ public final class Format implements Parcelable { id, label, selectionFlags, + roleFlags, bitrate, codecs, metadata, @@ -1197,6 +1225,7 @@ public final class Format implements Parcelable { id, label, selectionFlags, + roleFlags, bitrate, codecs, metadata, @@ -1228,6 +1257,7 @@ public final class Format implements Parcelable { id, label, selectionFlags, + roleFlags, bitrate, codecs, metadata, @@ -1259,6 +1289,7 @@ public final class Format implements Parcelable { id, label, selectionFlags, + roleFlags, bitrate, codecs, metadata, @@ -1290,6 +1321,7 @@ public final class Format implements Parcelable { id, label, selectionFlags, + roleFlags, bitrate, codecs, metadata, @@ -1321,6 +1353,7 @@ public final class Format implements Parcelable { id, label, selectionFlags, + roleFlags, bitrate, codecs, metadata, @@ -1393,6 +1426,7 @@ public final class Format implements Parcelable { result = 31 * result + (id == null ? 0 : id.hashCode()); result = 31 * result + (label != null ? label.hashCode() : 0); result = 31 * result + selectionFlags; + result = 31 * result + roleFlags; result = 31 * result + bitrate; result = 31 * result + (codecs == null ? 0 : codecs.hashCode()); result = 31 * result + (metadata == null ? 0 : metadata.hashCode()); @@ -1441,6 +1475,7 @@ public final class Format implements Parcelable { } // Field equality checks ordered by type, with the cheapest checks first. return selectionFlags == other.selectionFlags + && roleFlags == other.roleFlags && bitrate == other.bitrate && maxInputSize == other.maxInputSize && subsampleOffsetUs == other.subsampleOffsetUs @@ -1537,6 +1572,7 @@ public final class Format implements Parcelable { dest.writeString(id); dest.writeString(label); dest.writeInt(selectionFlags); + dest.writeInt(roleFlags); dest.writeInt(bitrate); dest.writeString(codecs); dest.writeParcelable(metadata, 0); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/FormatTest.java b/library/core/src/test/java/com/google/android/exoplayer2/FormatTest.java index e2e6b6cdfa..96bb606eae 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/FormatTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/FormatTest.java @@ -39,7 +39,6 @@ import org.junit.runner.RunWith; public final class FormatTest { private static final List initData; - static { byte[] initData1 = new byte[] {1, 2, 3}; byte[] initData2 = new byte[] {4, 5, 6}; @@ -68,6 +67,7 @@ public final class FormatTest { "id", "label", C.SELECTION_FLAG_DEFAULT, + C.ROLE_FLAG_MAIN, /* bitrate= */ 1024, "codec", metadata, diff --git a/library/core/src/test/java/com/google/android/exoplayer2/extractor/rawcc/RawCcExtractorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/extractor/rawcc/RawCcExtractorTest.java index 4210bebd54..bd7a63e43a 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/extractor/rawcc/RawCcExtractorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/extractor/rawcc/RawCcExtractorTest.java @@ -39,6 +39,7 @@ public final class RawCcExtractorTest { /* codecs= */ "cea608", /* bitrate= */ Format.NO_VALUE, /* selectionFlags= */ 0, + /* roleFlags= */ 0, /* language= */ null, /* accessibilityChannel= */ 1)), "rawcc/sample.rawcc"); 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..8cdc54bec8 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,9 +276,9 @@ 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; boolean seenFirstBaseUrl = false; do { @@ -300,7 +300,7 @@ 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); + roleDescriptors.add(parseDescriptor(xpp, "Role")); } else if (XmlPullParserUtil.isStartTag(xpp, "AudioChannelConfiguration")) { audioChannels = parseAudioChannelConfiguration(xpp); } else if (XmlPullParserUtil.isStartTag(xpp, "Accessibility")) { @@ -321,7 +321,7 @@ public class DashManifestParser extends DefaultHandler audioChannels, audioSamplingRate, language, - selectionFlags, + roleDescriptors, accessibilityDescriptors, segmentBase); contentType = checkContentTypeConsistency(contentType, @@ -464,24 +464,6 @@ public class DashManifestParser extends DefaultHandler return Pair.create(schemeType, schemeData); } - /** - * Parses a Role element. - * - * @param xpp The parser from which to read. - * @throws XmlPullParserException If an error occurs parsing the element. - * @throws IOException If an error occurs reading the element. - * @return {@link C.SelectionFlags} parsed from the element. - */ - protected int parseRole(XmlPullParser xpp) throws XmlPullParserException, IOException { - String schemeIdUri = parseString(xpp, "schemeIdUri", null); - String value = parseString(xpp, "value", null); - do { - xpp.next(); - } while (!XmlPullParserUtil.isEndTag(xpp, "Role")); - return "urn:mpeg:dash:role:2011".equals(schemeIdUri) && "main".equals(value) - ? C.SELECTION_FLAG_DEFAULT : 0; - } - /** * Parses children of AdaptationSet elements not specifically parsed elsewhere. * @@ -508,7 +490,7 @@ public class DashManifestParser extends DefaultHandler int adaptationSetAudioChannels, int adaptationSetAudioSamplingRate, String adaptationSetLanguage, - @C.SelectionFlags int adaptationSetSelectionFlags, + List adaptationSetRoleDescriptors, List adaptationSetAccessibilityDescriptors, SegmentBase segmentBase) throws XmlPullParserException, IOException { @@ -572,7 +554,7 @@ public class DashManifestParser extends DefaultHandler audioSamplingRate, bandwidth, adaptationSetLanguage, - adaptationSetSelectionFlags, + adaptationSetRoleDescriptors, adaptationSetAccessibilityDescriptors, codecs, supplementalProperties); @@ -593,11 +575,14 @@ public class DashManifestParser extends DefaultHandler int audioSamplingRate, int bitrate, String language, - @C.SelectionFlags int selectionFlags, + List roleDescriptors, List accessibilityDescriptors, String codecs, List supplementalProperties) { String sampleMimeType = getSampleMimeType(containerMimeType, codecs); + @C.SelectionFlags int selectionFlags = parseSelectionFlagsFromRoleDescriptors(roleDescriptors); + @C.RoleFlags int roleFlags = parseRoleFlagsFromRoleDescriptors(roleDescriptors); + roleFlags |= parseRoleFlagsFromAccessibilityDescriptors(accessibilityDescriptors); if (sampleMimeType != null) { if (MimeTypes.AUDIO_E_AC3.equals(sampleMimeType)) { sampleMimeType = parseEac3SupplementalProperties(supplementalProperties); @@ -614,7 +599,8 @@ public class DashManifestParser extends DefaultHandler height, frameRate, /* initializationData= */ null, - selectionFlags); + selectionFlags, + roleFlags); } else if (MimeTypes.isAudio(sampleMimeType)) { return Format.createAudioContainerFormat( id, @@ -627,6 +613,7 @@ public class DashManifestParser extends DefaultHandler audioSamplingRate, /* initializationData= */ null, selectionFlags, + roleFlags, language); } else if (mimeTypeIsRawText(sampleMimeType)) { int accessibilityChannel; @@ -645,12 +632,21 @@ public class DashManifestParser extends DefaultHandler codecs, bitrate, selectionFlags, + roleFlags, language, accessibilityChannel); } } return Format.createContainerFormat( - id, label, containerMimeType, sampleMimeType, codecs, bitrate, selectionFlags, language); + id, + label, + containerMimeType, + sampleMimeType, + codecs, + bitrate, + selectionFlags, + roleFlags, + language); } protected Representation buildRepresentation( @@ -1064,6 +1060,103 @@ public class DashManifestParser extends DefaultHandler return audioChannels; } + // Selection flag parsing. + + protected int parseSelectionFlagsFromRoleDescriptors(List roleDescriptors) { + for (int i = 0; i < roleDescriptors.size(); i++) { + Descriptor descriptor = roleDescriptors.get(i); + if ("urn:mpeg:dash:role:2011".equalsIgnoreCase(descriptor.schemeIdUri) + && "main".equals(descriptor.value)) { + return C.SELECTION_FLAG_DEFAULT; + } + } + return 0; + } + + // Role and Accessibility parsing. + + @C.RoleFlags + protected int parseRoleFlagsFromRoleDescriptors(List roleDescriptors) { + @C.RoleFlags int result = 0; + for (int i = 0; i < roleDescriptors.size(); i++) { + Descriptor descriptor = roleDescriptors.get(i); + if ("urn:mpeg:dash:role:2011".equalsIgnoreCase(descriptor.schemeIdUri)) { + result |= parseDashRoleSchemeValue(descriptor.value); + } + } + return result; + } + + @C.RoleFlags + protected int parseRoleFlagsFromAccessibilityDescriptors( + List accessibilityDescriptors) { + @C.RoleFlags int result = 0; + for (int i = 0; i < accessibilityDescriptors.size(); i++) { + Descriptor descriptor = accessibilityDescriptors.get(i); + if ("urn:mpeg:dash:role:2011".equalsIgnoreCase(descriptor.schemeIdUri)) { + result |= parseDashRoleSchemeValue(descriptor.value); + } else if ("urn:tva:metadata:cs:AudioPurposeCS:2007" + .equalsIgnoreCase(descriptor.schemeIdUri)) { + result |= parseTvaAudioPurposeCsValue(descriptor.value); + } + } + return result; + } + + @C.RoleFlags + protected int parseDashRoleSchemeValue(String value) { + if (value == null) { + return 0; + } + switch (value) { + case "main": + return C.ROLE_FLAG_MAIN; + case "alternate": + return C.ROLE_FLAG_ALTERNATE; + case "supplementary": + return C.ROLE_FLAG_SUPPLEMENTARY; + case "commentary": + return C.ROLE_FLAG_COMMENTARY; + case "dub": + return C.ROLE_FLAG_DUB; + case "emergency": + return C.ROLE_FLAG_EMERGENCY; + case "caption": + return C.ROLE_FLAG_CAPTION; + case "subtitle": + return C.ROLE_FLAG_SUBTITLE; + case "sign": + return C.ROLE_FLAG_SIGN; + case "description": + return C.ROLE_FLAG_DESCRIPTION; + case "enhanced-audio-intelligibility": + return C.ROLE_FLAG_ENHANCED_AUDIO_INTELLIGIBILITY; + default: + return 0; + } + } + + @C.RoleFlags + protected int parseTvaAudioPurposeCsValue(String value) { + if (value == null) { + return 0; + } + switch (value) { + case "1": // Audio description for the visually impaired. + return C.ROLE_FLAG_DESCRIPTION; + case "2": // Audio description for the hard of hearing. + return C.ROLE_FLAG_ENHANCED_AUDIO_INTELLIGIBILITY; + case "3": // Supplemental commentary. + return C.ROLE_FLAG_SUPPLEMENTARY; + case "4": // Director's commentary. + return C.ROLE_FLAG_COMMENTARY; + case "6": // Main programme audio. + return C.ROLE_FLAG_MAIN; + default: + return 0; + } + } + // Utility methods. /** diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaPeriodTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaPeriodTest.java index 87656422e1..9f92e7df3c 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaPeriodTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaPeriodTest.java @@ -193,6 +193,7 @@ public final class DashMediaPeriodTest { /* codecs= */ null, bitrate, /* selectionFlags= */ 0, + /* roleFlags= */ 0, /* language= */ null); } @@ -207,6 +208,7 @@ public final class DashMediaPeriodTest { /* codecs= */ null, bitrate, /* selectionFlags= */ 0, + /* roleFlags= */ 0, /* language= */ null), /* baseUrl= */ "", new SingleSegmentBase()); @@ -223,6 +225,7 @@ public final class DashMediaPeriodTest { /* codecs= */ null, /* bitrate= */ Format.NO_VALUE, /* selectionFlags= */ 0, + /* roleFlags= */ 0, language), /* baseUrl= */ "", new SingleSegmentBase()); diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashUtilTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashUtilTest.java index 5bef7d1bf2..a53b1ff80d 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashUtilTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashUtilTest.java @@ -85,7 +85,8 @@ public final class DashUtilTest { /* height= */ 768, Format.NO_VALUE, /* initializationData= */ null, - /* selectionFlags= */ 0); + /* selectionFlags= */ 0, + /* roleFlags= */ 0); if (drmInitData != null) { format = format.copyWithDrmInitData(drmInitData); } diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java index 1c3e2f141d..e4e0245605 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java @@ -702,7 +702,8 @@ public final class HlsMediaPeriod implements MediaPeriod, HlsSampleStreamWrapper variantFormat.height, variantFormat.frameRate, /* initializationData= */ null, - variantFormat.selectionFlags); + variantFormat.selectionFlags, + /* roleFlags= */ 0); } private static Format deriveAudioFormat( @@ -740,6 +741,7 @@ public final class HlsMediaPeriod implements MediaPeriod, HlsSampleStreamWrapper /* sampleRate= */ Format.NO_VALUE, /* initializationData= */ null, selectionFlags, + /* roleFlags= */ 0, language); } diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylist.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylist.java index ac14ea6de5..0e7f07cd7c 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylist.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylist.java @@ -78,6 +78,7 @@ public final class HlsMasterPlaylist extends HlsPlaylist { /* codecs= */ null, /* bitrate= */ Format.NO_VALUE, /* selectionFlags= */ 0, + /* roleFlags= */ 0, /* language= */ null); return new HlsUrl(url, format, /* name= */ ""); } 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..177c9aaeff 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 @@ -329,7 +329,8 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser { height, /* frameRate= */ Format.NO_VALUE, codecSpecificData, - /* selectionFlags= */ 0); + /* selectionFlags= */ 0, + /* roleFlags= */ 0); } else if (type == C.TRACK_TYPE_AUDIO) { sampleMimeType = sampleMimeType == null ? MimeTypes.AUDIO_AAC : sampleMimeType; int channels = parseRequiredInt(parser, KEY_CHANNELS); @@ -705,6 +706,7 @@ public class SsManifestParser implements ParsingLoadable.Parser { samplingRate, codecSpecificData, /* selectionFlags= */ 0, + /* roleFlags= */ 0, language); } else if (type == C.TRACK_TYPE_TEXT) { String language = (String) getNormalizedAttribute(KEY_LANGUAGE); @@ -728,6 +730,7 @@ public class SsManifestParser implements ParsingLoadable.Parser { /* codecs= */ null, bitrate, /* selectionFlags= */ 0, + /* roleFlags= */ 0, /* language= */ null); } } diff --git a/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriodTest.java b/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriodTest.java index 948be70712..cb1dd2b700 100644 --- a/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriodTest.java +++ b/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriodTest.java @@ -89,6 +89,7 @@ public class SsMediaPeriodTest { /* codecs= */ null, bitrate, /* selectionFlags= */ 0, + /* roleFlags= */ 0, /* language= */ null); } @@ -101,6 +102,7 @@ public class SsMediaPeriodTest { /* codecs= */ null, bitrate, /* selectionFlags= */ 0, + /* roleFlags= */ 0, /* language= */ null); } @@ -113,6 +115,7 @@ public class SsMediaPeriodTest { /* codecs= */ null, /* bitrate= */ Format.NO_VALUE, /* selectionFlags= */ 0, + /* roleFlags= */ 0, language); } } diff --git a/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifestTest.java b/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifestTest.java index 26afe5d666..427cd9b5da 100644 --- a/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifestTest.java +++ b/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifestTest.java @@ -122,6 +122,7 @@ public class SsManifestTest { /* codecs= */ null, /* bitrate= */ Format.NO_VALUE, /* selectionFlags= */ 0, + /* roleFlags= */ 0, /* language= */ null); } }