Use manifest assets instead of building manifests with code

PiperOrigin-RevId: 322739943
This commit is contained in:
bachinger 2020-07-23 09:02:54 +01:00 committed by Oliver Woodman
parent 6d92eebe51
commit b041c59f1e
7 changed files with 216 additions and 267 deletions

View File

@ -18,9 +18,8 @@ package com.google.android.exoplayer2.source.dash;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import android.net.Uri; import android.net.Uri;
import androidx.annotation.Nullable; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.drm.DrmSessionEventListener;
import com.google.android.exoplayer2.drm.DrmSessionManager; 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.PlayerEmsgHandler.PlayerEmsgCallback;
import com.google.android.exoplayer2.source.dash.manifest.AdaptationSet; 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.DashManifest;
import com.google.android.exoplayer2.source.dash.manifest.Descriptor; import com.google.android.exoplayer2.source.dash.manifest.DashManifestParser;
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.testutil.MediaPeriodAsserts; 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.Allocator;
import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy;
import com.google.android.exoplayer2.upstream.LoaderErrorThrower; import com.google.android.exoplayer2.upstream.LoaderErrorThrower;
import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.upstream.TransferListener;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import java.util.Arrays; import java.io.IOException;
import java.util.Collections; import java.io.InputStream;
import java.util.List; import java.util.List;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -54,7 +50,7 @@ import org.junit.runner.RunWith;
public final class DashMediaPeriodTest { public final class DashMediaPeriodTest {
@Test @Test
public void getStreamKeys_isCompatibleWithDashManifestFilter() { public void getStreamKeys_isCompatibleWithDashManifestFilter() throws IOException {
// Test manifest which covers various edge cases: // Test manifest which covers various edge cases:
// - Multiple periods. // - Multiple periods.
// - Single and multiple representations per adaptation set. // - Single and multiple representations per adaptation set.
@ -62,54 +58,7 @@ public final class DashMediaPeriodTest {
// - Embedded track groups. // - Embedded track groups.
// All cases are deliberately combined in one test to catch potential indexing problems which // All cases are deliberately combined in one test to catch potential indexing problems which
// only occur in combination. // only occur in combination.
DashManifest manifest = DashManifest manifest = parseManifest("mpd/sample_mpd_stream_keys");
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"))));
// Ignore embedded metadata as we don't want to select primary group just to get embedded track. // Ignore embedded metadata as we don't want to select primary group just to get embedded track.
MediaPeriodAsserts.assertGetStreamKeysAndManifestFilterIntegration( MediaPeriodAsserts.assertGetStreamKeysAndManifestFilterIntegration(
@ -120,32 +69,8 @@ public final class DashMediaPeriodTest {
} }
@Test @Test
public void adaptationSetSwitchingProperty_mergesTrackGroups() { public void adaptationSetSwitchingProperty_mergesTrackGroups() throws IOException {
DashManifest manifest = DashManifest manifest = parseManifest("mpd/sample_mpd_switching_property");
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))));
DashMediaPeriod dashMediaPeriod = createDashMediaPeriod(manifest, 0); DashMediaPeriod dashMediaPeriod = createDashMediaPeriod(manifest, 0);
List<AdaptationSet> adaptationSets = manifest.getPeriod(0).adaptationSets; List<AdaptationSet> adaptationSets = manifest.getPeriod(0).adaptationSets;
@ -165,32 +90,8 @@ public final class DashMediaPeriodTest {
} }
@Test @Test
public void trickPlayProperty_mergesTrackGroups() { public void trickPlayProperty_mergesTrackGroups() throws IOException {
DashManifest manifest = DashManifest manifest = parseManifest("mpd/sample_mpd_trick_play_property");
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))));
DashMediaPeriod dashMediaPeriod = createDashMediaPeriod(manifest, 0); DashMediaPeriod dashMediaPeriod = createDashMediaPeriod(manifest, 0);
List<AdaptationSet> adaptationSets = manifest.getPeriod(0).adaptationSets; List<AdaptationSet> adaptationSets = manifest.getPeriod(0).adaptationSets;
@ -211,32 +112,9 @@ public final class DashMediaPeriodTest {
} }
@Test @Test
public void adaptationSetSwitchingProperty_andTrickPlayProperty_mergesTrackGroups() { public void adaptationSetSwitchingProperty_andTrickPlayProperty_mergesTrackGroups()
DashManifest manifest = throws IOException {
createDashManifest( DashManifest manifest = parseManifest("mpd/sample_mpd_switching_and_trick_play_property");
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))));
DashMediaPeriod dashMediaPeriod = createDashMediaPeriod(manifest, 0); DashMediaPeriod dashMediaPeriod = createDashMediaPeriod(manifest, 0);
List<AdaptationSet> adaptationSets = manifest.getPeriod(0).adaptationSets; List<AdaptationSet> adaptationSets = manifest.getPeriod(0).adaptationSets;
@ -256,21 +134,8 @@ public final class DashMediaPeriodTest {
} }
@Test @Test
public void cea608AccessibilityDescriptor_createsCea608TrackGroup() { public void cea608AccessibilityDescriptor_createsCea608TrackGroup() throws IOException {
Descriptor descriptor = DashManifest manifest = parseManifest("mpd/sample_mpd_cea_608_accessibility");
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())));
DashMediaPeriod dashMediaPeriod = createDashMediaPeriod(manifest, 0); DashMediaPeriod dashMediaPeriod = createDashMediaPeriod(manifest, 0);
List<AdaptationSet> adaptationSets = manifest.getPeriod(0).adaptationSets; List<AdaptationSet> adaptationSets = manifest.getPeriod(0).adaptationSets;
@ -299,22 +164,8 @@ public final class DashMediaPeriodTest {
} }
@Test @Test
public void cea708AccessibilityDescriptor_createsCea708TrackGroup() { public void cea708AccessibilityDescriptor_createsCea708TrackGroup() throws IOException {
Descriptor descriptor = DashManifest manifest = parseManifest("mpd/sample_mpd_cea_708_accessibility");
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())));
DashMediaPeriod dashMediaPeriod = createDashMediaPeriod(manifest, 0); DashMediaPeriod dashMediaPeriod = createDashMediaPeriod(manifest, 0);
List<AdaptationSet> adaptationSets = manifest.getPeriod(0).adaptationSets; List<AdaptationSet> adaptationSets = manifest.getPeriod(0).adaptationSets;
@ -363,105 +214,9 @@ public final class DashMediaPeriodTest {
mock(PlayerEmsgCallback.class)); mock(PlayerEmsgCallback.class));
} }
private static DashManifest createDashManifest(Period... periods) { private static DashManifest parseManifest(String fileName) throws IOException {
return new DashManifest( InputStream inputStream =
/* availabilityStartTimeMs= */ 0, TestUtil.getInputStream(ApplicationProvider.getApplicationContext(), fileName);
/* durationMs= */ 5000, return new DashManifestParser().parse(Uri.EMPTY, inputStream);
/* 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");
} }
} }

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<MPD availabilityStartTime="2014-06-19T23:07:42" type="dynamic">
<Period start="PT7462826.784S" id="0">
<AdaptationSet id="123" mimeType="video/mp4">
<Accessibility schemeIdUri="urn:scte:dash:cc:cea-608:2015" value="CC1=eng;CC3=deu"/>
<Representation id="1231" bandwidth="0" codecs="avc1.42c01f"/>
<Representation id="1232" bandwidth="1" codecs="avc1.42c01f"/>
</AdaptationSet>
</Period>
</MPD>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<MPD availabilityStartTime="2014-06-19T23:07:42" type="dynamic">
<Period start="PT7462826.784S" id="0">
<AdaptationSet id="123" mimeType="video/mp4">
<Accessibility
schemeIdUri="urn:scte:dash:cc:cea-708:2015"
value="1=lang:eng;2=lang:deu,war:1,er:1"/>
<Representation id="1231" bandwidth="0" codecs="avc1.42c01f"/>
<Representation id="1232" bandwidth="1" codecs="avc1.42c01f"/>
</AdaptationSet>
</Period>
</MPD>

View File

@ -0,0 +1,88 @@
<?xml version="1.0" encoding="UTF-8"?>
<MPD availabilityStartTime="2014-06-19T23:07:42" type="dynamic">
<Period start="PT6462826.784S" id="0">
<AdaptationSet id="0" mimeType="video/mp4">
<Representation id="135" bandwidth="1000000" codecs="avc1.42c01f"/>
</AdaptationSet>
</Period>
<Period start="PT7462826.784S" id="1">
<AdaptationSet id="100" mimeType="video/mp4">
<SupplementalProperty
schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016"
value="103,104"/>
<Representation id="1001" bandwidth="200000" codecs="avc1.42c01f">
<InbandEventStream
id="inBandId"
schemeIdUri="urn:mpeg:dash:event:2012"
value="inBandValue"/>
</Representation>
<Representation id="1002" bandwidth="400000" codecs="avc1.42c01f">
<InbandEventStream
id="inBandId"
schemeIdUri="urn:mpeg:dash:event:2012"
value="inBandValue"/>
</Representation>
<Representation id="1003" bandwidth="600000" codecs="avc1.42c01f">
<InbandEventStream
id="inBandId"
schemeIdUri="urn:mpeg:dash:event:2012"
value="inBandValue"/>
</Representation>
</AdaptationSet>
<AdaptationSet id="101" mimeType="audio/mp4">
<SupplementalProperty
schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016"
value="102"/>
<Representation id="1011" bandwidth="48000" codecs="mp4a.40.2"/>
<Representation id="1012" bandwidth="96000" codecs="mp4a.40.2"/>
</AdaptationSet>
<AdaptationSet id="102" mimeType="audio/mp4">
<SupplementalProperty
schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016"
value="101"/>
<Representation id="1021" bandwidth="256000" codecs="mp4a.40.2"/>
</AdaptationSet>
<AdaptationSet id="103" mimeType="video/mp4">
<SupplementalProperty
schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016"
value="100,104"/>
<Representation id="1031" bandwidth="800000" codecs="avc1.42c01f">
<InbandEventStream
id="inBandId"
schemeIdUri="urn:mpeg:dash:event:2012"
value="inBandValue"/>
</Representation>
<Representation id="1032" bandwidth="1000000" codecs="avc1.42c01f">
<InbandEventStream
id="inBandId"
schemeIdUri="urn:mpeg:dash:event:2012"
value="inBandValue"/>
</Representation>
</AdaptationSet>
<AdaptationSet id="104" mimeType="video/mp4">
<SupplementalProperty
schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016"
value="100,103"/>
<Representation id="1041" bandwidth="2000000" codecs="avc1.42c01f">
<InbandEventStream
id="inBandId"
schemeIdUri="urn:mpeg:dash:event:2012"
value="inBandValue"/>
</Representation>
</AdaptationSet>
<AdaptationSet id="105"
lang="eng"
mimeType="application/mp4"
contentType="text"
codecs="wvtt">
<Representation id="1051" bandwidth="100"/>
</AdaptationSet>
<AdaptationSet id="106"
lang="ger"
mimeType="application/mp4"
contentType="text"
codecs="wvtt">
<Representation id="1061" bandwidth="100"/>
</AdaptationSet>
</Period>
</MPD>

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<MPD availabilityStartTime="2014-06-19T23:07:42" type="dynamic">
<Period start="PT7462826.784S" id="0">
<AdaptationSet id="0" mimeType="video/mp4">
<SupplementalProperty
schemeIdUri="http://dashif.org/guidelines/trickmode"
value="1"/>
<Representation id="0" bandwidth="0" codecs="avc1.42c01f"/>
<Representation id="1" bandwidth="1" codecs="avc1.42c01f"/>
</AdaptationSet>
<AdaptationSet id="1" mimeType="video/mp4">
<SupplementalProperty
schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016"
value="2"/>
<Representation id="11" bandwidth="100" codecs="avc1.42c01f"/>
</AdaptationSet>
<AdaptationSet id="2" mimeType="video/mp4">
<SupplementalProperty
schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016"
value="1"/>
<Representation id="21" bandwidth="200" codecs="avc1.42c01f"/>
<Representation id="22" bandwidth="201" codecs="avc1.42c01f"/>
</AdaptationSet>
<AdaptationSet id="3" mimeType="video/mp4">
<SupplementalProperty
schemeIdUri="http://dashif.org/guidelines/trickmode"
value="2"/>
<Representation id="31" bandwidth="300" codecs="avc1.42c01f"/>
</AdaptationSet>
</Period>
</MPD>

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<MPD availabilityStartTime="2014-06-19T23:07:42" type="dynamic">
<Period start="PT7462826.784S" id="0">
<AdaptationSet id="0" mimeType="video/mp4">
<SupplementalProperty
schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016"
value="1,2"/>
<Representation id="1" bandwidth="0" codecs="avc1.42c01f"/>
<Representation id="2" bandwidth="1" codecs="avc1.42c01f"/>
</AdaptationSet>
<AdaptationSet id="3" mimeType="video/mp4">
<Representation id="31" bandwidth="300" codecs="avc1.42c01f"/>
</AdaptationSet>
<AdaptationSet id="2" mimeType="video/mp4">
<SupplementalProperty
schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016"
value="0,1"/>
<Representation id="21" bandwidth="200" codecs="avc1.42c01f"/>
<Representation id="21" bandwidth="201" codecs="avc1.42c01f"/>
</AdaptationSet>
<AdaptationSet id="1" mimeType="video/mp4">
<SupplementalProperty
schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016"
value="0,2"/>
<Representation id="11" bandwidth="100" codecs="avc1.42c01f"/>
</AdaptationSet>
</Period>
</MPD>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<MPD availabilityStartTime="2014-06-19T23:07:42" type="dynamic">
<Period start="PT7462826.784S" id="0">
<AdaptationSet id="0" mimeType="video/mp4">
<SupplementalProperty
schemeIdUri="http://dashif.org/guidelines/trickmode"
value="1"/>
<Representation id="0" bandwidth="0" codecs="avc1.42c01f"/>
<Representation id="1" bandwidth="1" codecs="avc1.42c01f"/>
</AdaptationSet>
<AdaptationSet id="1" mimeType="video/mp4">
<Representation id="11" bandwidth="100" codecs="avc1.42c01f"/>
</AdaptationSet>
<AdaptationSet id="2" mimeType="video/mp4">
<Representation id="21" bandwidth="200" codecs="avc1.42c01f"/>
<Representation id="22" bandwidth="201" codecs="avc1.42c01f"/>
</AdaptationSet>
<AdaptationSet id="3" mimeType="video/mp4">
<SupplementalProperty
schemeIdUri="http://dashif.org/guidelines/trickmode"
value="2"/>
<Representation id="31" bandwidth="300" codecs="avc1.42c01f"/>
</AdaptationSet>
</Period>
</MPD>