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 3d6bd3d6df..199bd049d5 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 @@ -18,9 +18,8 @@ package com.google.android.exoplayer2.source.dash; import static org.mockito.Mockito.mock; import android.net.Uri; -import androidx.annotation.Nullable; +import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; -import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.drm.DrmSessionManager; @@ -32,19 +31,16 @@ import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerEmsgCallback; import com.google.android.exoplayer2.source.dash.manifest.AdaptationSet; import com.google.android.exoplayer2.source.dash.manifest.DashManifest; -import com.google.android.exoplayer2.source.dash.manifest.Descriptor; -import com.google.android.exoplayer2.source.dash.manifest.Period; -import com.google.android.exoplayer2.source.dash.manifest.Representation; -import com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase; -import com.google.android.exoplayer2.source.dash.manifest.UtcTimingElement; +import com.google.android.exoplayer2.source.dash.manifest.DashManifestParser; import com.google.android.exoplayer2.testutil.MediaPeriodAsserts; +import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.LoaderErrorThrower; import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.MimeTypes; -import java.util.Arrays; -import java.util.Collections; +import java.io.IOException; +import java.io.InputStream; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; @@ -54,7 +50,7 @@ import org.junit.runner.RunWith; public final class DashMediaPeriodTest { @Test - public void getStreamKeys_isCompatibleWithDashManifestFilter() { + public void getStreamKeys_isCompatibleWithDashManifestFilter() throws IOException { // Test manifest which covers various edge cases: // - Multiple periods. // - Single and multiple representations per adaptation set. @@ -62,54 +58,7 @@ public final class DashMediaPeriodTest { // - Embedded track groups. // All cases are deliberately combined in one test to catch potential indexing problems which // only occur in combination. - DashManifest manifest = - createDashManifest( - createPeriod( - createAdaptationSet( - /* id= */ 0, - C.TRACK_TYPE_VIDEO, - /* descriptor= */ null, - createVideoRepresentation(/* bitrate= */ 1000000))), - createPeriod( - createAdaptationSet( - /* id= */ 100, - C.TRACK_TYPE_VIDEO, - createSwitchDescriptor(/* ids...= */ 103, 104), - createVideoRepresentationWithInbandEventStream(/* bitrate= */ 200000), - createVideoRepresentationWithInbandEventStream(/* bitrate= */ 400000), - createVideoRepresentationWithInbandEventStream(/* bitrate= */ 600000)), - createAdaptationSet( - /* id= */ 101, - C.TRACK_TYPE_AUDIO, - createSwitchDescriptor(/* ids...= */ 102), - createAudioRepresentation(/* bitrate= */ 48000), - createAudioRepresentation(/* bitrate= */ 96000)), - createAdaptationSet( - /* id= */ 102, - C.TRACK_TYPE_AUDIO, - createSwitchDescriptor(/* ids...= */ 101), - createAudioRepresentation(/* bitrate= */ 256000)), - createAdaptationSet( - /* id= */ 103, - C.TRACK_TYPE_VIDEO, - createSwitchDescriptor(/* ids...= */ 100, 104), - createVideoRepresentationWithInbandEventStream(/* bitrate= */ 800000), - createVideoRepresentationWithInbandEventStream(/* bitrate= */ 1000000)), - createAdaptationSet( - /* id= */ 104, - C.TRACK_TYPE_VIDEO, - createSwitchDescriptor(/* ids...= */ 100, 103), - createVideoRepresentationWithInbandEventStream(/* bitrate= */ 2000000)), - createAdaptationSet( - /* id= */ 105, - C.TRACK_TYPE_TEXT, - /* descriptor= */ null, - createTextRepresentation(/* language= */ "eng")), - createAdaptationSet( - /* id= */ 105, - C.TRACK_TYPE_TEXT, - /* descriptor= */ null, - createTextRepresentation(/* language= */ "ger")))); + DashManifest manifest = parseManifest("mpd/sample_mpd_stream_keys"); // Ignore embedded metadata as we don't want to select primary group just to get embedded track. MediaPeriodAsserts.assertGetStreamKeysAndManifestFilterIntegration( @@ -120,32 +69,8 @@ public final class DashMediaPeriodTest { } @Test - public void adaptationSetSwitchingProperty_mergesTrackGroups() { - DashManifest manifest = - createDashManifest( - createPeriod( - createAdaptationSet( - /* id= */ 0, - C.TRACK_TYPE_VIDEO, - createSwitchDescriptor(/* ids...= */ 1, 2), - createVideoRepresentation(/* bitrate= */ 0), - createVideoRepresentation(/* bitrate= */ 1)), - createAdaptationSet( - /* id= */ 3, - C.TRACK_TYPE_VIDEO, - /* descriptor= */ null, - createVideoRepresentation(/* bitrate= */ 300)), - createAdaptationSet( - /* id= */ 2, - C.TRACK_TYPE_VIDEO, - createSwitchDescriptor(/* ids...= */ 0, 1), - createVideoRepresentation(/* bitrate= */ 200), - createVideoRepresentation(/* bitrate= */ 201)), - createAdaptationSet( - /* id= */ 1, - C.TRACK_TYPE_VIDEO, - createSwitchDescriptor(/* ids...= */ 0, 2), - createVideoRepresentation(/* bitrate= */ 100)))); + public void adaptationSetSwitchingProperty_mergesTrackGroups() throws IOException { + DashManifest manifest = parseManifest("mpd/sample_mpd_switching_property"); DashMediaPeriod dashMediaPeriod = createDashMediaPeriod(manifest, 0); List adaptationSets = manifest.getPeriod(0).adaptationSets; @@ -165,32 +90,8 @@ public final class DashMediaPeriodTest { } @Test - public void trickPlayProperty_mergesTrackGroups() { - DashManifest manifest = - createDashManifest( - createPeriod( - createAdaptationSet( - /* id= */ 0, - C.TRACK_TYPE_VIDEO, - createTrickPlayDescriptor(/* mainAdaptationSetId= */ 1), - createVideoRepresentation(/* bitrate= */ 0), - createVideoRepresentation(/* bitrate= */ 1)), - createAdaptationSet( - /* id= */ 1, - C.TRACK_TYPE_VIDEO, - /* descriptor= */ null, - createVideoRepresentation(/* bitrate= */ 100)), - createAdaptationSet( - /* id= */ 2, - C.TRACK_TYPE_VIDEO, - /* descriptor= */ null, - createVideoRepresentation(/* bitrate= */ 200), - createVideoRepresentation(/* bitrate= */ 201)), - createAdaptationSet( - /* id= */ 3, - C.TRACK_TYPE_VIDEO, - createTrickPlayDescriptor(/* mainAdaptationSetId= */ 2), - createVideoRepresentation(/* bitrate= */ 300)))); + public void trickPlayProperty_mergesTrackGroups() throws IOException { + DashManifest manifest = parseManifest("mpd/sample_mpd_trick_play_property"); DashMediaPeriod dashMediaPeriod = createDashMediaPeriod(manifest, 0); List adaptationSets = manifest.getPeriod(0).adaptationSets; @@ -211,32 +112,9 @@ public final class DashMediaPeriodTest { } @Test - public void adaptationSetSwitchingProperty_andTrickPlayProperty_mergesTrackGroups() { - DashManifest manifest = - createDashManifest( - createPeriod( - createAdaptationSet( - /* id= */ 0, - C.TRACK_TYPE_VIDEO, - createTrickPlayDescriptor(/* mainAdaptationSetId= */ 1), - createVideoRepresentation(/* bitrate= */ 0), - createVideoRepresentation(/* bitrate= */ 1)), - createAdaptationSet( - /* id= */ 1, - C.TRACK_TYPE_VIDEO, - createSwitchDescriptor(/* ids...= */ 2), - createVideoRepresentation(/* bitrate= */ 100)), - createAdaptationSet( - /* id= */ 2, - C.TRACK_TYPE_VIDEO, - createSwitchDescriptor(/* ids...= */ 1), - createVideoRepresentation(/* bitrate= */ 200), - createVideoRepresentation(/* bitrate= */ 201)), - createAdaptationSet( - /* id= */ 3, - C.TRACK_TYPE_VIDEO, - createTrickPlayDescriptor(/* mainAdaptationSetId= */ 2), - createVideoRepresentation(/* bitrate= */ 300)))); + public void adaptationSetSwitchingProperty_andTrickPlayProperty_mergesTrackGroups() + throws IOException { + DashManifest manifest = parseManifest("mpd/sample_mpd_switching_and_trick_play_property"); DashMediaPeriod dashMediaPeriod = createDashMediaPeriod(manifest, 0); List adaptationSets = manifest.getPeriod(0).adaptationSets; @@ -256,21 +134,8 @@ public final class DashMediaPeriodTest { } @Test - public void cea608AccessibilityDescriptor_createsCea608TrackGroup() { - Descriptor descriptor = - new Descriptor("urn:scte:dash:cc:cea-608:2015", "CC1=eng;CC3=deu", /* id= */ null); - DashManifest manifest = - createDashManifest( - createPeriod( - new AdaptationSet( - /* id= */ 123, - C.TRACK_TYPE_VIDEO, - Arrays.asList( - createVideoRepresentation(/* bitrate= */ 0), - createVideoRepresentation(/* bitrate= */ 1)), - /* accessibilityDescriptors= */ Collections.singletonList(descriptor), - /* essentialProperties= */ Collections.emptyList(), - /* supplementalProperties= */ Collections.emptyList()))); + public void cea608AccessibilityDescriptor_createsCea608TrackGroup() throws IOException { + DashManifest manifest = parseManifest("mpd/sample_mpd_cea_608_accessibility"); DashMediaPeriod dashMediaPeriod = createDashMediaPeriod(manifest, 0); List adaptationSets = manifest.getPeriod(0).adaptationSets; @@ -299,22 +164,8 @@ public final class DashMediaPeriodTest { } @Test - public void cea708AccessibilityDescriptor_createsCea708TrackGroup() { - Descriptor descriptor = - new Descriptor( - "urn:scte:dash:cc:cea-708:2015", "1=lang:eng;2=lang:deu,war:1,er:1", /* id= */ null); - DashManifest manifest = - createDashManifest( - createPeriod( - new AdaptationSet( - /* id= */ 123, - C.TRACK_TYPE_VIDEO, - Arrays.asList( - createVideoRepresentation(/* bitrate= */ 0), - createVideoRepresentation(/* bitrate= */ 1)), - /* accessibilityDescriptors= */ Collections.singletonList(descriptor), - /* essentialProperties= */ Collections.emptyList(), - /* supplementalProperties= */ Collections.emptyList()))); + public void cea708AccessibilityDescriptor_createsCea708TrackGroup() throws IOException { + DashManifest manifest = parseManifest("mpd/sample_mpd_cea_708_accessibility"); DashMediaPeriod dashMediaPeriod = createDashMediaPeriod(manifest, 0); List adaptationSets = manifest.getPeriod(0).adaptationSets; @@ -363,105 +214,9 @@ public final class DashMediaPeriodTest { mock(PlayerEmsgCallback.class)); } - private static DashManifest createDashManifest(Period... periods) { - return new DashManifest( - /* availabilityStartTimeMs= */ 0, - /* durationMs= */ 5000, - /* minBufferTimeMs= */ 1, - /* dynamic= */ false, - /* minUpdatePeriodMs= */ 2, - /* timeShiftBufferDepthMs= */ 3, - /* suggestedPresentationDelayMs= */ 4, - /* publishTimeMs= */ 12345, - /* programInformation= */ null, - new UtcTimingElement("", ""), - Uri.EMPTY, - Arrays.asList(periods)); - } - - private static Period createPeriod(AdaptationSet... adaptationSets) { - return new Period(/* id= */ null, /* startMs= */ 0, Arrays.asList(adaptationSets)); - } - - private static AdaptationSet createAdaptationSet( - int id, int trackType, @Nullable Descriptor descriptor, Representation... representations) { - return new AdaptationSet( - id, - trackType, - Arrays.asList(representations), - /* accessibilityDescriptors= */ Collections.emptyList(), - /* essentialProperties= */ Collections.emptyList(), - descriptor == null ? Collections.emptyList() : Collections.singletonList(descriptor)); - } - - private static Representation createVideoRepresentation(int bitrate) { - return Representation.newInstance( - /* revisionId= */ 0, - createVideoFormat(bitrate), - /* baseUrl= */ "", - new SingleSegmentBase()); - } - - private static Representation createVideoRepresentationWithInbandEventStream(int bitrate) { - return Representation.newInstance( - /* revisionId= */ 0, - createVideoFormat(bitrate), - /* baseUrl= */ "", - new SingleSegmentBase(), - Collections.singletonList(getInbandEventDescriptor())); - } - - private static Format createVideoFormat(int bitrate) { - return new Format.Builder() - .setContainerMimeType(MimeTypes.VIDEO_MP4) - .setSampleMimeType(MimeTypes.VIDEO_H264) - .setPeakBitrate(bitrate) - .build(); - } - - private static Representation createAudioRepresentation(int bitrate) { - Format format = - new Format.Builder() - .setContainerMimeType(MimeTypes.AUDIO_MP4) - .setSampleMimeType(MimeTypes.AUDIO_AAC) - .setPeakBitrate(bitrate) - .build(); - return Representation.newInstance( - /* revisionId= */ 0, format, /* baseUrl= */ "", new SingleSegmentBase()); - } - - private static Representation createTextRepresentation(String language) { - Format format = - new Format.Builder() - .setContainerMimeType(MimeTypes.APPLICATION_MP4) - .setSampleMimeType(MimeTypes.TEXT_VTT) - .setLanguage(language) - .build(); - return Representation.newInstance( - /* revisionId= */ 0, format, /* baseUrl= */ "", new SingleSegmentBase()); - } - - private static Descriptor createSwitchDescriptor(int... ids) { - StringBuilder idString = new StringBuilder(); - idString.append(ids[0]); - for (int i = 1; i < ids.length; i++) { - idString.append(",").append(ids[i]); - } - return new Descriptor( - /* schemeIdUri= */ "urn:mpeg:dash:adaptation-set-switching:2016", - /* value= */ idString.toString(), - /* id= */ null); - } - - private static Descriptor createTrickPlayDescriptor(int mainAdaptationSetId) { - return new Descriptor( - /* schemeIdUri= */ "http://dashif.org/guidelines/trickmode", - /* value= */ Integer.toString(mainAdaptationSetId), - /* id= */ null); - } - - private static Descriptor getInbandEventDescriptor() { - return new Descriptor( - /* schemeIdUri= */ "inBandSchemeIdUri", /* value= */ "inBandValue", /* id= */ "inBandId"); + private static DashManifest parseManifest(String fileName) throws IOException { + InputStream inputStream = + TestUtil.getInputStream(ApplicationProvider.getApplicationContext(), fileName); + return new DashManifestParser().parse(Uri.EMPTY, inputStream); } } diff --git a/testdata/src/test/assets/mpd/sample_mpd_cea_608_accessibility b/testdata/src/test/assets/mpd/sample_mpd_cea_608_accessibility new file mode 100644 index 0000000000..6aea1d1c53 --- /dev/null +++ b/testdata/src/test/assets/mpd/sample_mpd_cea_608_accessibility @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/testdata/src/test/assets/mpd/sample_mpd_cea_708_accessibility b/testdata/src/test/assets/mpd/sample_mpd_cea_708_accessibility new file mode 100644 index 0000000000..03786b99c0 --- /dev/null +++ b/testdata/src/test/assets/mpd/sample_mpd_cea_708_accessibility @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/testdata/src/test/assets/mpd/sample_mpd_stream_keys b/testdata/src/test/assets/mpd/sample_mpd_stream_keys new file mode 100644 index 0000000000..59f068ae3d --- /dev/null +++ b/testdata/src/test/assets/mpd/sample_mpd_stream_keys @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testdata/src/test/assets/mpd/sample_mpd_switching_and_trick_play_property b/testdata/src/test/assets/mpd/sample_mpd_switching_and_trick_play_property new file mode 100644 index 0000000000..145d0b132e --- /dev/null +++ b/testdata/src/test/assets/mpd/sample_mpd_switching_and_trick_play_property @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testdata/src/test/assets/mpd/sample_mpd_switching_property b/testdata/src/test/assets/mpd/sample_mpd_switching_property new file mode 100644 index 0000000000..4f10ee5842 --- /dev/null +++ b/testdata/src/test/assets/mpd/sample_mpd_switching_property @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/testdata/src/test/assets/mpd/sample_mpd_trick_play_property b/testdata/src/test/assets/mpd/sample_mpd_trick_play_property new file mode 100644 index 0000000000..58841df081 --- /dev/null +++ b/testdata/src/test/assets/mpd/sample_mpd_trick_play_property @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + +