Commit b48b618b by bachinger Committed by Oliver Woodman

Parse multiple BaseURL elements

After this change, multiple BaseURL elements are parsed, but the player still only uses the first BaseURL element appearing in the manifest and its corresponding availabilityTimeOffsetUs.

PiperOrigin-RevId: 380775256
parent 341e66ce
...@@ -29,7 +29,7 @@ public final class BaseUrl { ...@@ -29,7 +29,7 @@ public final class BaseUrl {
/** The URL. */ /** The URL. */
public final String url; public final String url;
/** The service location. */ /** The service location. */
@Nullable public final String serviceLocation; public final String serviceLocation;
/** The priority. */ /** The priority. */
public final int priority; public final int priority;
/** The weight. */ /** The weight. */
...@@ -44,7 +44,7 @@ public final class BaseUrl { ...@@ -44,7 +44,7 @@ public final class BaseUrl {
} }
/** Creates an instance. */ /** Creates an instance. */
public BaseUrl(String url, @Nullable String serviceLocation, int priority, int weight) { public BaseUrl(String url, String serviceLocation, int priority, int weight) {
this.url = url; this.url = url;
this.serviceLocation = serviceLocation; this.serviceLocation = serviceLocation;
this.priority = priority; this.priority = priority;
......
...@@ -29,6 +29,7 @@ import com.google.android.exoplayer2.testutil.TestUtil; ...@@ -29,6 +29,7 @@ import com.google.android.exoplayer2.testutil.TestUtil;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import com.google.common.base.Charsets; import com.google.common.base.Charsets;
import com.google.common.collect.ImmutableList;
import java.io.IOException; import java.io.IOException;
import java.io.StringReader; import java.io.StringReader;
import java.util.Collections; import java.util.Collections;
...@@ -55,6 +56,8 @@ public class DashManifestParserTest { ...@@ -55,6 +56,8 @@ public class DashManifestParserTest {
private static final String SAMPLE_MPD_TRICK_PLAY = "media/mpd/sample_mpd_trick_play"; private static final String SAMPLE_MPD_TRICK_PLAY = "media/mpd/sample_mpd_trick_play";
private static final String SAMPLE_MPD_AVAILABILITY_TIME_OFFSET_BASE_URL = private static final String SAMPLE_MPD_AVAILABILITY_TIME_OFFSET_BASE_URL =
"media/mpd/sample_mpd_availabilityTimeOffset_baseUrl"; "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_AVAILABILITY_TIME_OFFSET_SEGMENT_TEMPLATE = private static final String SAMPLE_MPD_AVAILABILITY_TIME_OFFSET_SEGMENT_TEMPLATE =
"media/mpd/sample_mpd_availabilityTimeOffset_segmentTemplate"; "media/mpd/sample_mpd_availabilityTimeOffset_segmentTemplate";
private static final String SAMPLE_MPD_AVAILABILITY_TIME_OFFSET_SEGMENT_LIST = private static final String SAMPLE_MPD_AVAILABILITY_TIME_OFFSET_SEGMENT_LIST =
...@@ -602,6 +605,54 @@ public class DashManifestParserTest { ...@@ -602,6 +605,54 @@ public class DashManifestParserTest {
} }
@Test @Test
public void baseUrl_multipleBaseUrls_correctParsingAndUnfolding() throws IOException {
DashManifestParser parser = new DashManifestParser();
DashManifest manifest =
parser.parse(
Uri.parse("https://example.com/test.mpd"),
TestUtil.getInputStream(
ApplicationProvider.getApplicationContext(), SAMPLE_MPD_MULTIPLE_BASE_URLS));
ImmutableList<BaseUrl> audioBaseUrls =
manifest.getPeriod(0).adaptationSets.get(0).representations.get(0).baseUrls;
assertThat(audioBaseUrls).hasSize(6);
assertThat(audioBaseUrls.get(0).url).endsWith("/baseUrl/a/media/audio");
assertThat(audioBaseUrls.get(1).url).endsWith("/baseUrl/b/media/audio");
assertThat(audioBaseUrls.get(2).url).endsWith("/baseUrl/c/media/audio");
assertThat(audioBaseUrls.get(3).url).endsWith("/baseUrl/a/files/audio");
assertThat(audioBaseUrls.get(4).url).endsWith("/baseUrl/b/files/audio");
assertThat(audioBaseUrls.get(5).url).endsWith("/baseUrl/c/files/audio");
assertThat(audioBaseUrls.get(0).serviceLocation).isEqualTo("a");
assertThat(audioBaseUrls.get(1).serviceLocation).isEqualTo("b");
assertThat(audioBaseUrls.get(2).serviceLocation).isEqualTo("c");
assertThat(audioBaseUrls.get(3).serviceLocation).isEqualTo("a");
assertThat(audioBaseUrls.get(4).serviceLocation).isEqualTo("b");
assertThat(audioBaseUrls.get(5).serviceLocation).isEqualTo("c");
ImmutableList<BaseUrl> videoBaseUrls =
manifest.getPeriod(0).adaptationSets.get(1).representations.get(0).baseUrls;
assertThat(videoBaseUrls).hasSize(7);
assertThat(videoBaseUrls.get(0).url).endsWith("/baseUrl/a/media/video");
assertThat(videoBaseUrls.get(1).url).endsWith("/baseUrl/b/media/video");
assertThat(videoBaseUrls.get(2).url).endsWith("/baseUrl/c/media/video");
assertThat(videoBaseUrls.get(3).url).endsWith("/baseUrl/a/files/video");
assertThat(videoBaseUrls.get(4).url).endsWith("/baseUrl/b/files/video");
assertThat(videoBaseUrls.get(5).url).endsWith("/baseUrl/c/files/video");
assertThat(videoBaseUrls.get(6).url).endsWith("/baseUrl/d/alternative/");
assertThat(videoBaseUrls.get(0).serviceLocation).isEqualTo("a");
assertThat(videoBaseUrls.get(1).serviceLocation).isEqualTo("b");
assertThat(videoBaseUrls.get(2).serviceLocation).isEqualTo("c");
assertThat(videoBaseUrls.get(3).serviceLocation).isEqualTo("a");
assertThat(videoBaseUrls.get(4).serviceLocation).isEqualTo("b");
assertThat(videoBaseUrls.get(5).serviceLocation).isEqualTo("c");
assertThat(videoBaseUrls.get(6).serviceLocation).isEqualTo("d");
ImmutableList<BaseUrl> textBaseUrls =
manifest.getPeriod(0).adaptationSets.get(2).representations.get(0).baseUrls;
assertThat(textBaseUrls).hasSize(1);
assertThat(textBaseUrls.get(0).url).endsWith("/baseUrl/e/text/");
assertThat(textBaseUrls.get(0).serviceLocation).isEqualTo("e");
}
@Test
public void serviceDescriptionElement_allValuesSet() throws IOException { public void serviceDescriptionElement_allValuesSet() throws IOException {
DashManifestParser parser = new DashManifestParser(); DashManifestParser parser = new DashManifestParser();
......
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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"
type="dynamic"
availabilityStartTime="2016-10-14T17:00:17">
<BaseURL serviceLocation="a" dvb:priority="1" dvb:weight="1">http://video.com/baseUrl/a/</BaseURL>
<BaseURL serviceLocation="b" dvb:priority="1" dvb:weight="2">http://video.com/baseUrl/b/</BaseURL>
<BaseURL serviceLocation="c" dvb:priority="1" dvb:weight="3">http://video.com/baseUrl/c/</BaseURL>
<Period start="PT0.000S">
<BaseURL>media/</BaseURL>
<BaseURL>files/</BaseURL>
<AdaptationSet contentType="audio">
<BaseURL>audio</BaseURL>
<SegmentTemplate/>
<Representation/>
</AdaptationSet>
<AdaptationSet contentType="video">
<BaseURL>video</BaseURL>
<BaseURL serviceLocation="d" dvb:priority="1" dvb:weight="4">http://video.com/baseUrl/d/alternative/</BaseURL>
<SegmentTemplate/>
<Representation/>
</AdaptationSet>
<AdaptationSet contentType="text">
<BaseURL serviceLocation="e" dvb:priority="1" dvb:weight="1">http://video.com/baseUrl/e/text/</BaseURL>
<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