diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/BaseUrlExclusionList.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/BaseUrlExclusionList.java index 86a65f66bf..ebf923e23b 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/BaseUrlExclusionList.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/BaseUrlExclusionList.java @@ -68,7 +68,9 @@ public final class BaseUrlExclusionList { public void exclude(BaseUrl baseUrlToExclude, long exclusionDurationMs) { long excludeUntilMs = SystemClock.elapsedRealtime() + exclusionDurationMs; addExclusion(baseUrlToExclude.serviceLocation, excludeUntilMs, excludedServiceLocations); - addExclusion(baseUrlToExclude.priority, excludeUntilMs, excludedPriorities); + if (baseUrlToExclude.priority != BaseUrl.PRIORITY_UNSET) { + addExclusion(baseUrlToExclude.priority, excludeUntilMs, excludedPriorities); + } } /** diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/BaseUrl.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/BaseUrl.java index 79bbc018ae..6f2dc6c800 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/BaseUrl.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/BaseUrl.java @@ -23,10 +23,12 @@ import com.google.common.base.Objects; @UnstableApi public final class BaseUrl { - /** The default priority. */ - public static final int DEFAULT_PRIORITY = 1; /** The default weight. */ public static final int DEFAULT_WEIGHT = 1; + /** The default priority. */ + public static final int DEFAULT_DVB_PRIORITY = 1; + /** Constant representing an unset priority in a manifest that does not declare a DVB profile. */ + public static final int PRIORITY_UNSET = Integer.MIN_VALUE; /** The URL. */ public final String url; @@ -38,11 +40,11 @@ public final class BaseUrl { public final int weight; /** - * Creates an instance with {@link #DEFAULT_PRIORITY default priority}, {@link #DEFAULT_WEIGHT + * Creates an instance with {@link #PRIORITY_UNSET an unset priority}, {@link #DEFAULT_WEIGHT * default weight} and using the URL as the service location. */ public BaseUrl(String url) { - this(url, /* serviceLocation= */ url, DEFAULT_PRIORITY, DEFAULT_WEIGHT); + this(url, /* serviceLocation= */ url, PRIORITY_UNSET, DEFAULT_WEIGHT); } /** Creates an instance. */ diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/DashManifestParser.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/DashManifestParser.java index 7b7fc2c618..e1d4e070b6 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/DashManifestParser.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/DashManifestParser.java @@ -15,6 +15,10 @@ */ package androidx.media3.exoplayer.dash.manifest; +import static androidx.media3.exoplayer.dash.manifest.BaseUrl.DEFAULT_DVB_PRIORITY; +import static androidx.media3.exoplayer.dash.manifest.BaseUrl.DEFAULT_WEIGHT; +import static androidx.media3.exoplayer.dash.manifest.BaseUrl.PRIORITY_UNSET; + import android.net.Uri; import android.text.TextUtils; import android.util.Base64; @@ -105,14 +109,16 @@ public class DashManifestParser extends DefaultHandler "inputStream does not contain a valid media presentation description", /* cause= */ null); } - return parseMediaPresentationDescription(xpp, new BaseUrl(uri.toString())); + return parseMediaPresentationDescription(xpp, uri); } catch (XmlPullParserException e) { throw ParserException.createForMalformedManifest(/* message= */ null, /* cause= */ e); } } - protected DashManifest parseMediaPresentationDescription( - XmlPullParser xpp, BaseUrl documentBaseUrl) throws XmlPullParserException, IOException { + protected DashManifest parseMediaPresentationDescription(XmlPullParser xpp, Uri documentBaseUri) + throws XmlPullParserException, IOException { + boolean dvbProfileDeclared = + isDvbProfileDeclared(parseProfiles(xpp, "profiles", new String[0])); long availabilityStartTime = parseDateTime(xpp, "availabilityStartTime", C.TIME_UNSET); long durationMs = parseDuration(xpp, "mediaPresentationDuration", C.TIME_UNSET); long minBufferTimeMs = parseDuration(xpp, "minBufferTime", C.TIME_UNSET); @@ -130,6 +136,12 @@ public class DashManifestParser extends DefaultHandler Uri location = null; ServiceDescriptionElement serviceDescription = null; long baseUrlAvailabilityTimeOffsetUs = dynamic ? 0 : C.TIME_UNSET; + BaseUrl documentBaseUrl = + new BaseUrl( + documentBaseUri.toString(), + /* serviceLocation= */ documentBaseUri.toString(), + dvbProfileDeclared ? DEFAULT_DVB_PRIORITY : PRIORITY_UNSET, + DEFAULT_WEIGHT); ArrayList parentBaseUrls = Lists.newArrayList(documentBaseUrl); List periods = new ArrayList<>(); @@ -145,7 +157,7 @@ public class DashManifestParser extends DefaultHandler parseAvailabilityTimeOffsetUs(xpp, baseUrlAvailabilityTimeOffsetUs); seenFirstBaseUrl = true; } - baseUrls.addAll(parseBaseUrl(xpp, parentBaseUrls)); + baseUrls.addAll(parseBaseUrl(xpp, parentBaseUrls, dvbProfileDeclared)); } else if (XmlPullParserUtil.isStartTag(xpp, "ProgramInformation")) { programInformation = parseProgramInformation(xpp); } else if (XmlPullParserUtil.isStartTag(xpp, "UTCTiming")) { @@ -162,7 +174,8 @@ public class DashManifestParser extends DefaultHandler nextPeriodStartMs, baseUrlAvailabilityTimeOffsetUs, availabilityStartTime, - timeShiftBufferDepthMs); + timeShiftBufferDepthMs, + dvbProfileDeclared); Period period = periodWithDurationMs.first; if (period.startMs == C.TIME_UNSET) { if (dynamic) { @@ -282,7 +295,8 @@ public class DashManifestParser extends DefaultHandler long defaultStartMs, long baseUrlAvailabilityTimeOffsetUs, long availabilityStartTimeMs, - long timeShiftBufferDepthMs) + long timeShiftBufferDepthMs, + boolean dvbProfileDeclared) throws XmlPullParserException, IOException { @Nullable String id = xpp.getAttributeValue(null, "id"); long startMs = parseDuration(xpp, "start", defaultStartMs); @@ -304,7 +318,7 @@ public class DashManifestParser extends DefaultHandler parseAvailabilityTimeOffsetUs(xpp, baseUrlAvailabilityTimeOffsetUs); seenFirstBaseUrl = true; } - baseUrls.addAll(parseBaseUrl(xpp, parentBaseUrls)); + baseUrls.addAll(parseBaseUrl(xpp, parentBaseUrls, dvbProfileDeclared)); } else if (XmlPullParserUtil.isStartTag(xpp, "AdaptationSet")) { adaptationSets.add( parseAdaptationSet( @@ -315,7 +329,8 @@ public class DashManifestParser extends DefaultHandler baseUrlAvailabilityTimeOffsetUs, segmentBaseAvailabilityTimeOffsetUs, periodStartUnixTimeMs, - timeShiftBufferDepthMs)); + timeShiftBufferDepthMs, + dvbProfileDeclared)); } else if (XmlPullParserUtil.isStartTag(xpp, "EventStream")) { eventStreams.add(parseEventStream(xpp)); } else if (XmlPullParserUtil.isStartTag(xpp, "SegmentBase")) { @@ -375,7 +390,8 @@ public class DashManifestParser extends DefaultHandler long baseUrlAvailabilityTimeOffsetUs, long segmentBaseAvailabilityTimeOffsetUs, long periodStartUnixTimeMs, - long timeShiftBufferDepthMs) + long timeShiftBufferDepthMs, + boolean dvbProfileDeclared) throws XmlPullParserException, IOException { int id = parseInt(xpp, "id", AdaptationSet.ID_UNSET); @C.TrackType int contentType = parseContentType(xpp); @@ -408,7 +424,7 @@ public class DashManifestParser extends DefaultHandler parseAvailabilityTimeOffsetUs(xpp, baseUrlAvailabilityTimeOffsetUs); seenFirstBaseUrl = true; } - baseUrls.addAll(parseBaseUrl(xpp, parentBaseUrls)); + baseUrls.addAll(parseBaseUrl(xpp, parentBaseUrls, dvbProfileDeclared)); } else if (XmlPullParserUtil.isStartTag(xpp, "ContentProtection")) { Pair contentProtection = parseContentProtection(xpp); if (contentProtection.first != null) { @@ -452,7 +468,8 @@ public class DashManifestParser extends DefaultHandler periodDurationMs, baseUrlAvailabilityTimeOffsetUs, segmentBaseAvailabilityTimeOffsetUs, - timeShiftBufferDepthMs); + timeShiftBufferDepthMs, + dvbProfileDeclared); contentType = checkContentTypeConsistency( contentType, MimeTypes.getTrackType(representationInfo.format.sampleMimeType)); @@ -652,7 +669,8 @@ public class DashManifestParser extends DefaultHandler long periodDurationMs, long baseUrlAvailabilityTimeOffsetUs, long segmentBaseAvailabilityTimeOffsetUs, - long timeShiftBufferDepthMs) + long timeShiftBufferDepthMs, + boolean dvbProfileDeclared) throws XmlPullParserException, IOException { String id = xpp.getAttributeValue(null, "id"); int bandwidth = parseInt(xpp, "bandwidth", Format.NO_VALUE); @@ -681,7 +699,7 @@ public class DashManifestParser extends DefaultHandler parseAvailabilityTimeOffsetUs(xpp, baseUrlAvailabilityTimeOffsetUs); seenFirstBaseUrl = true; } - baseUrls.addAll(parseBaseUrl(xpp, parentBaseUrls)); + baseUrls.addAll(parseBaseUrl(xpp, parentBaseUrls, dvbProfileDeclared)); } else if (XmlPullParserUtil.isStartTag(xpp, "AudioChannelConfiguration")) { audioChannels = parseAudioChannelConfiguration(xpp); } else if (XmlPullParserUtil.isStartTag(xpp, "SegmentBase")) { @@ -1373,35 +1391,42 @@ public class DashManifestParser extends DefaultHandler * * @param xpp The parser from which to read. * @param parentBaseUrls The parent base URLs for resolving the parsed URLs. + * @param dvbProfileDeclared Whether the dvb profile is declared. * @throws XmlPullParserException If an error occurs parsing the element. * @throws IOException If an error occurs reading the element. * @return The list of parsed and resolved URLs. */ - protected List parseBaseUrl(XmlPullParser xpp, List parentBaseUrls) + protected List parseBaseUrl( + XmlPullParser xpp, List parentBaseUrls, boolean dvbProfileDeclared) throws XmlPullParserException, IOException { @Nullable String priorityValue = xpp.getAttributeValue(null, "dvb:priority"); int priority = - priorityValue != null ? Integer.parseInt(priorityValue) : BaseUrl.DEFAULT_PRIORITY; + priorityValue != null + ? Integer.parseInt(priorityValue) + : (dvbProfileDeclared ? DEFAULT_DVB_PRIORITY : PRIORITY_UNSET); @Nullable String weightValue = xpp.getAttributeValue(null, "dvb:weight"); - int weight = weightValue != null ? Integer.parseInt(weightValue) : BaseUrl.DEFAULT_WEIGHT; + int weight = weightValue != null ? Integer.parseInt(weightValue) : DEFAULT_WEIGHT; @Nullable String serviceLocation = xpp.getAttributeValue(null, "serviceLocation"); String baseUrl = parseText(xpp, "BaseURL"); - if (serviceLocation == null) { - serviceLocation = baseUrl; - } if (UriUtil.isAbsolute(baseUrl)) { + if (serviceLocation == null) { + serviceLocation = baseUrl; + } return Lists.newArrayList(new BaseUrl(baseUrl, serviceLocation, priority, weight)); } List baseUrls = new ArrayList<>(); for (int i = 0; i < parentBaseUrls.size(); i++) { BaseUrl parentBaseUrl = parentBaseUrls.get(i); - priority = parentBaseUrl.priority; - weight = parentBaseUrl.weight; - serviceLocation = parentBaseUrl.serviceLocation; - baseUrls.add( - new BaseUrl( - UriUtil.resolve(parentBaseUrl.url, baseUrl), serviceLocation, priority, weight)); + String resolvedBaseUri = UriUtil.resolve(parentBaseUrl.url, baseUrl); + String resolvedServiceLocation = serviceLocation == null ? resolvedBaseUri : serviceLocation; + if (dvbProfileDeclared) { + // Inherit parent properties only if dvb profile is declared. + priority = parentBaseUrl.priority; + weight = parentBaseUrl.weight; + resolvedServiceLocation = parentBaseUrl.serviceLocation; + } + baseUrls.add(new BaseUrl(resolvedBaseUri, resolvedServiceLocation, priority, weight)); } return baseUrls; } @@ -1583,6 +1608,14 @@ public class DashManifestParser extends DefaultHandler } } + protected String[] parseProfiles(XmlPullParser xpp, String attributeName, String[] defaultValue) { + @Nullable String attributeValue = xpp.getAttributeValue(/* namespace= */ null, attributeName); + if (attributeValue == null) { + return defaultValue; + } + return attributeValue.split(","); + } + // Utility methods. /** @@ -1909,6 +1942,15 @@ public class DashManifestParser extends DefaultHandler return availabilityTimeOffsetUs; } + private boolean isDvbProfileDeclared(String[] profiles) { + for (String profile : profiles) { + if (profile.startsWith("urn:dvb:dash:profile:dvb-dash:")) { + return true; + } + } + return false; + } + /** A parsed Representation element. */ protected static final class RepresentationInfo { diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/Representation.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/Representation.java index 043510096e..e3422a8a2f 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/Representation.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/Representation.java @@ -215,7 +215,7 @@ public abstract class Representation { new RangedUri(null, initializationStart, initializationEnd - initializationStart + 1); SingleSegmentBase segmentBase = new SingleSegmentBase(rangedUri, 1, 0, indexStart, indexEnd - indexStart + 1); - List baseUrls = ImmutableList.of(new BaseUrl(uri)); + ImmutableList baseUrls = ImmutableList.of(new BaseUrl(uri)); return new SingleSegmentRepresentation( revisionId, format, diff --git a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/BaseUrlExclusionListTest.java b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/BaseUrlExclusionListTest.java index 9e70d90af6..845cdedeea 100644 --- a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/BaseUrlExclusionListTest.java +++ b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/BaseUrlExclusionListTest.java @@ -15,6 +15,8 @@ */ package androidx.media3.exoplayer.dash; +import static androidx.media3.exoplayer.dash.manifest.BaseUrl.DEFAULT_DVB_PRIORITY; +import static androidx.media3.exoplayer.dash.manifest.BaseUrl.DEFAULT_WEIGHT; import static androidx.media3.exoplayer.upstream.DefaultLoadErrorHandlingPolicy.DEFAULT_LOCATION_EXCLUSION_MS; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; @@ -173,6 +175,32 @@ public class BaseUrlExclusionListTest { assertThat(baseUrlExclusionList.getPriorityCountAfterExclusion(baseUrls)).isEqualTo(2); } + @Test + public void selectBaseUrl_priorityUnset_isNotExcluded() { + BaseUrlExclusionList baseUrlExclusionList = new BaseUrlExclusionList(); + ImmutableList baseUrls = + ImmutableList.of( + new BaseUrl( + /* url= */ "a-1", + /* serviceLocation= */ "a", + BaseUrl.PRIORITY_UNSET, + /* weight= */ 1), + new BaseUrl( + /* url= */ "a-2", + /* serviceLocation= */ "a", + BaseUrl.PRIORITY_UNSET, + /* weight= */ 1), + new BaseUrl( + /* url= */ "b", + /* serviceLocation= */ "b", + BaseUrl.PRIORITY_UNSET, + /* weight= */ 1)); + + baseUrlExclusionList.exclude(baseUrls.get(0), 10_000); + + assertThat(baseUrlExclusionList.selectBaseUrl(baseUrls).serviceLocation).isEqualTo("b"); + } + @Test public void selectBaseUrl_emptyBaseUrlList_selectionIsNull() { BaseUrlExclusionList baseUrlExclusionList = new BaseUrlExclusionList(); @@ -183,7 +211,8 @@ public class BaseUrlExclusionListTest { @Test public void reset_dropsAllExclusions() { BaseUrlExclusionList baseUrlExclusionList = new BaseUrlExclusionList(); - List baseUrls = ImmutableList.of(new BaseUrl("a")); + ImmutableList baseUrls = + ImmutableList.of(new BaseUrl("a", "a", DEFAULT_DVB_PRIORITY, DEFAULT_WEIGHT)); baseUrlExclusionList.exclude(baseUrls.get(0), 5000); baseUrlExclusionList.reset(); diff --git a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/manifest/DashManifestParserTest.java b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/manifest/DashManifestParserTest.java index da3e7ee9f9..cc6d480e0e 100644 --- a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/manifest/DashManifestParserTest.java +++ b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/manifest/DashManifestParserTest.java @@ -61,6 +61,10 @@ public class DashManifestParserTest { "media/mpd/sample_mpd_availabilityTimeOffset_baseUrl"; private static final String SAMPLE_MPD_MULTIPLE_BASE_URLS = "media/mpd/sample_mpd_multiple_baseUrls"; + private static final String SAMPLE_MPD_RELATIVE_BASE_URLS_DVB_PROFILE_NOT_DECLARED = + "media/mpd/sample_mpd_relative_baseUrls_dvb_profile_not_declared"; + private static final String SAMPLE_MPD_RELATIVE_BASE_URLS_DVB_PROFILE_DECLARED = + "media/mpd/sample_mpd_relative_baseUrls_dvb_profile_declared"; private static final String SAMPLE_MPD_AVAILABILITY_TIME_OFFSET_SEGMENT_TEMPLATE = "media/mpd/sample_mpd_availabilityTimeOffset_segmentTemplate"; private static final String SAMPLE_MPD_AVAILABILITY_TIME_OFFSET_SEGMENT_LIST = @@ -748,6 +752,41 @@ public class DashManifestParserTest { assertThat(textBaseUrls.get(0).serviceLocation).isEqualTo("e"); } + @Test + public void baseUrl_relativeBaseUrlsNoDvbNamespace_hasDifferentPrioritiesAndServiceLocation() + throws IOException { + DashManifestParser parser = new DashManifestParser(); + DashManifest manifest = + parser.parse( + Uri.parse("https://example.com/test.mpd"), + TestUtil.getInputStream( + ApplicationProvider.getApplicationContext(), + SAMPLE_MPD_RELATIVE_BASE_URLS_DVB_PROFILE_NOT_DECLARED)); + + ImmutableList baseUrls = + manifest.getPeriod(0).adaptationSets.get(0).representations.get(0).baseUrls; + assertThat(baseUrls.get(0).priority).isEqualTo(BaseUrl.PRIORITY_UNSET); + assertThat(baseUrls.get(1).priority).isEqualTo(BaseUrl.PRIORITY_UNSET); + assertThat(baseUrls.get(0).serviceLocation).isNotEqualTo(baseUrls.get(1).serviceLocation); + } + + @Test + public void baseUrl_relativeBaseUrlsWithDvbNamespace_inheritsPrioritiesAndServiceLocation() + throws IOException { + DashManifestParser parser = new DashManifestParser(); + DashManifest manifest = + parser.parse( + Uri.parse("https://example.com/test.mpd"), + TestUtil.getInputStream( + ApplicationProvider.getApplicationContext(), + SAMPLE_MPD_RELATIVE_BASE_URLS_DVB_PROFILE_DECLARED)); + + ImmutableList baseUrls = + manifest.getPeriod(0).adaptationSets.get(0).representations.get(0).baseUrls; + assertThat(baseUrls.get(0).priority).isEqualTo(baseUrls.get(1).priority); + assertThat(baseUrls.get(0).serviceLocation).isEqualTo(baseUrls.get(1).serviceLocation); + } + @Test public void serviceDescriptionElement_allValuesSet() throws IOException { DashManifestParser parser = new DashManifestParser(); diff --git a/libraries/test_data/src/test/assets/media/mpd/sample_mpd_availabilityTimeOffset_baseUrl b/libraries/test_data/src/test/assets/media/mpd/sample_mpd_availabilityTimeOffset_baseUrl index 365416825c..7db98f166a 100644 --- a/libraries/test_data/src/test/assets/media/mpd/sample_mpd_availabilityTimeOffset_baseUrl +++ b/libraries/test_data/src/test/assets/media/mpd/sample_mpd_availabilityTimeOffset_baseUrl @@ -3,7 +3,7 @@ xmlns="urn:mpeg:DASH:schema:MPD:2011" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd" xmlns:dvb="urn:dvb:dash:dash-extensions:2014-1" - profiles="urn:mpeg:dash:profile:isoff-main:2011" + profiles="urn:mpeg:dash:profile:isoff-main:2011,urn:dvb:dash:profile:dvb-dash:2014" type="dynamic" availabilityStartTime="2016-10-14T17:00:17"> http://video.com/baseUrl diff --git a/libraries/test_data/src/test/assets/media/mpd/sample_mpd_multiple_baseUrls b/libraries/test_data/src/test/assets/media/mpd/sample_mpd_multiple_baseUrls index 228e64a03b..cb09376176 100644 --- a/libraries/test_data/src/test/assets/media/mpd/sample_mpd_multiple_baseUrls +++ b/libraries/test_data/src/test/assets/media/mpd/sample_mpd_multiple_baseUrls @@ -3,7 +3,7 @@ xmlns="urn:mpeg:DASH:schema:MPD:2011" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd" xmlns:dvb="urn:dvb:dash:dash-extensions:2014-1" - profiles="urn:mpeg:dash:profile:isoff-main:2011" + profiles="urn:mpeg:dash:profile:isoff-main:2011,urn:dvb:dash:profile:dvb-dash:2014" type="dynamic" availabilityStartTime="2016-10-14T17:00:17"> http://video.com/baseUrl/a/ diff --git a/libraries/test_data/src/test/assets/media/mpd/sample_mpd_relative_baseUrls_dvb_profile_declared b/libraries/test_data/src/test/assets/media/mpd/sample_mpd_relative_baseUrls_dvb_profile_declared new file mode 100644 index 0000000000..270df26127 --- /dev/null +++ b/libraries/test_data/src/test/assets/media/mpd/sample_mpd_relative_baseUrls_dvb_profile_declared @@ -0,0 +1,17 @@ + + + + //anotherhost.com/some/url/1/ + //anotherhost.com/some/url/2/ + + + + + + diff --git a/libraries/test_data/src/test/assets/media/mpd/sample_mpd_relative_baseUrls_dvb_profile_not_declared b/libraries/test_data/src/test/assets/media/mpd/sample_mpd_relative_baseUrls_dvb_profile_not_declared new file mode 100644 index 0000000000..c622ba56a3 --- /dev/null +++ b/libraries/test_data/src/test/assets/media/mpd/sample_mpd_relative_baseUrls_dvb_profile_not_declared @@ -0,0 +1,16 @@ + + + + //anotherhost.com/some/url/1/ + //anotherhost.com/some/url/2/ + + + + + + diff --git a/libraries/test_data/src/test/assets/media/mpd/sample_mpd_vod_location_fallback b/libraries/test_data/src/test/assets/media/mpd/sample_mpd_vod_location_fallback index 32207dde45..acc7886b83 100644 --- a/libraries/test_data/src/test/assets/media/mpd/sample_mpd_vod_location_fallback +++ b/libraries/test_data/src/test/assets/media/mpd/sample_mpd_vod_location_fallback @@ -4,7 +4,7 @@ xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011" xmlns:dvb="urn:dvb:dash:dash-extensions:2014-1" minBufferTime="PT1S" - profiles="urn:mpeg:dash:profile:isoff-main:2011" + profiles="urn:mpeg:dash:profile:isoff-main:2011,urn:dvb:dash:profile:dvb-dash:2014" type="static" mediaPresentationDuration="PT904S"> http://video.com/baseUrl/a/