Commit b320f7d7 by olly Committed by Ian Baker

Support relative MPD.Location URIs

#minor-release
Issue: google/ExoPlayer#9939
PiperOrigin-RevId: 426394339
parent f8c3a2c1
...@@ -94,6 +94,8 @@ ...@@ -94,6 +94,8 @@
priority in manifests that do not declare the dvb namespace. This priority in manifests that do not declare the dvb namespace. This
prevents the exclusion logic to exclude base URL when they actually prevents the exclusion logic to exclude base URL when they actually
should be used as a fallback base URL. should be used as a fallback base URL.
* Support relative `MPD.Location` URLs
([#9939](https://github.com/google/ExoPlayer/issues/9939)).
* HLS: * HLS:
* Use chunkless preparation by default to improve start up time. If your * Use chunkless preparation by default to improve start up time. If your
renditions contain muxed closed-caption tracks that are *not* declared renditions contain muxed closed-caption tracks that are *not* declared
......
...@@ -161,7 +161,7 @@ public class DashManifestParser extends DefaultHandler ...@@ -161,7 +161,7 @@ public class DashManifestParser extends DefaultHandler
} else if (XmlPullParserUtil.isStartTag(xpp, "UTCTiming")) { } else if (XmlPullParserUtil.isStartTag(xpp, "UTCTiming")) {
utcTiming = parseUtcTiming(xpp); utcTiming = parseUtcTiming(xpp);
} else if (XmlPullParserUtil.isStartTag(xpp, "Location")) { } else if (XmlPullParserUtil.isStartTag(xpp, "Location")) {
location = Uri.parse(xpp.nextText()); location = UriUtil.resolveToUri(documentBaseUri.toString(), xpp.nextText());
} else if (XmlPullParserUtil.isStartTag(xpp, "ServiceDescription")) { } else if (XmlPullParserUtil.isStartTag(xpp, "ServiceDescription")) {
serviceDescription = parseServiceDescription(xpp); serviceDescription = parseServiceDescription(xpp);
} else if (XmlPullParserUtil.isStartTag(xpp, "Period") && !seenEarlyAccessPeriod) { } else if (XmlPullParserUtil.isStartTag(xpp, "Period") && !seenEarlyAccessPeriod) {
......
...@@ -46,6 +46,10 @@ import org.xmlpull.v1.XmlPullParserFactory; ...@@ -46,6 +46,10 @@ import org.xmlpull.v1.XmlPullParserFactory;
public class DashManifestParserTest { public class DashManifestParserTest {
private static final String SAMPLE_MPD_LIVE = "media/mpd/sample_mpd_live"; private static final String SAMPLE_MPD_LIVE = "media/mpd/sample_mpd_live";
private static final String SAMPLE_MPD_LIVE_LOCATION_REDIRECT_RELATIVE =
"media/mpd/sample_mpd_live_location_redirect_relative";
private static final String SAMPLE_MPD_LIVE_LOCATION_REDIRECT_ABSOLUTE =
"media/mpd/sample_mpd_live_location_redirect_absolute";
private static final String SAMPLE_MPD_UNKNOWN_MIME_TYPE = private static final String SAMPLE_MPD_UNKNOWN_MIME_TYPE =
"media/mpd/sample_mpd_unknown_mime_type"; "media/mpd/sample_mpd_unknown_mime_type";
private static final String SAMPLE_MPD_SEGMENT_TEMPLATE = "media/mpd/sample_mpd_segment_template"; private static final String SAMPLE_MPD_SEGMENT_TEMPLATE = "media/mpd/sample_mpd_segment_template";
...@@ -202,6 +206,32 @@ public class DashManifestParserTest { ...@@ -202,6 +206,32 @@ public class DashManifestParserTest {
} }
@Test @Test
public void parseMediaPresentationDescription_locationRedirectRelative() throws IOException {
DashManifestParser parser = new DashManifestParser();
DashManifest manifest =
parser.parse(
Uri.parse("https://example.com/a/b/test.mpd"),
TestUtil.getInputStream(
ApplicationProvider.getApplicationContext(),
SAMPLE_MPD_LIVE_LOCATION_REDIRECT_RELATIVE));
Uri expectedLocation = Uri.parse("https://example.com/a/relative/redirect.mpd");
assertThat(manifest.location).isEqualTo(expectedLocation);
}
@Test
public void parseMediaPresentationDescription_locationRedirectAbsolute() throws IOException {
DashManifestParser parser = new DashManifestParser();
DashManifest manifest =
parser.parse(
Uri.parse("https://example.com/a/b/test.mpd"),
TestUtil.getInputStream(
ApplicationProvider.getApplicationContext(),
SAMPLE_MPD_LIVE_LOCATION_REDIRECT_ABSOLUTE));
Uri expectedLocation = Uri.parse("https://example2.com/absolute/redirect.mpd");
assertThat(manifest.location).isEqualTo(expectedLocation);
}
@Test
public void parseMediaPresentationDescription_images() throws IOException { public void parseMediaPresentationDescription_images() throws IOException {
DashManifestParser parser = new DashManifestParser(); DashManifestParser parser = new DashManifestParser();
DashManifest manifest = DashManifest manifest =
......
<?xml version="1.0" encoding="utf-8"?>
<MPD
type="dynamic"
suggestedPresentationDelay="PT2S"
availabilityStartTime="2020-01-01T00:00:00Z"
minimumUpdatePeriod="PT4M"
timeShiftBufferDepth="PT8.0S">
<Location>https://example2.com/absolute/redirect.mpd</Location>
<Period start="PT0.0S">
<AdaptationSet contentType="video">
<Representation id="0" mimeType="video/mp4">
<SegmentTemplate
timescale="1000000"
duration="2000000"
availabilityTimeOffset="2"
startNumber="1">
</SegmentTemplate>
</Representation>
</AdaptationSet>
</Period>
</MPD>
<?xml version="1.0" encoding="utf-8"?>
<MPD
type="dynamic"
suggestedPresentationDelay="PT2S"
availabilityStartTime="2020-01-01T00:00:00Z"
minimumUpdatePeriod="PT4M"
timeShiftBufferDepth="PT8.0S">
<Location>../relative/redirect.mpd</Location>
<Period start="PT0.0S">
<AdaptationSet contentType="video">
<Representation id="0" mimeType="video/mp4">
<SegmentTemplate
timescale="1000000"
duration="2000000"
availabilityTimeOffset="2"
startNumber="1">
</SegmentTemplate>
</Representation>
</AdaptationSet>
</Period>
</MPD>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment