From a7ba393d54637c693f54ae372a1b605848d19a80 Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Thu, 10 Sep 2015 18:16:23 +0100 Subject: [PATCH] When multiple BaseURL elements are present, prefer the first one. Issue: #771 --- .../MediaPresentationDescriptionParser.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer/dash/mpd/MediaPresentationDescriptionParser.java b/library/src/main/java/com/google/android/exoplayer/dash/mpd/MediaPresentationDescriptionParser.java index 4d45967a43..64c387e7ed 100644 --- a/library/src/main/java/com/google/android/exoplayer/dash/mpd/MediaPresentationDescriptionParser.java +++ b/library/src/main/java/com/google/android/exoplayer/dash/mpd/MediaPresentationDescriptionParser.java @@ -117,10 +117,14 @@ public class MediaPresentationDescriptionParser extends DefaultHandler List periods = new ArrayList<>(); long nextPeriodStartMs = dynamic ? -1 : 0; boolean seenEarlyAccessPeriod = false; + boolean seenFirstBaseUrl = false; do { xpp.next(); if (isStartTag(xpp, "BaseURL")) { - baseUrl = parseBaseUrl(xpp, baseUrl); + if (!seenFirstBaseUrl) { + baseUrl = parseBaseUrl(xpp, baseUrl); + seenFirstBaseUrl = true; + } } else if (isStartTag(xpp, "UTCTiming")) { utcTiming = parseUtcTiming(xpp); } else if (isStartTag(xpp, "Location")) { @@ -183,10 +187,14 @@ public class MediaPresentationDescriptionParser extends DefaultHandler long durationMs = parseDuration(xpp, "duration", -1); SegmentBase segmentBase = null; List adaptationSets = new ArrayList<>(); + boolean seenFirstBaseUrl = false; do { xpp.next(); if (isStartTag(xpp, "BaseURL")) { - baseUrl = parseBaseUrl(xpp, baseUrl); + if (!seenFirstBaseUrl) { + baseUrl = parseBaseUrl(xpp, baseUrl); + seenFirstBaseUrl = true; + } } else if (isStartTag(xpp, "AdaptationSet")) { adaptationSets.add(parseAdaptationSet(xpp, baseUrl, segmentBase)); } else if (isStartTag(xpp, "SegmentBase")) { @@ -223,10 +231,14 @@ public class MediaPresentationDescriptionParser extends DefaultHandler ContentProtectionsBuilder contentProtectionsBuilder = new ContentProtectionsBuilder(); List representations = new ArrayList<>(); + boolean seenFirstBaseUrl = false; do { xpp.next(); if (isStartTag(xpp, "BaseURL")) { - baseUrl = parseBaseUrl(xpp, baseUrl); + if (!seenFirstBaseUrl) { + baseUrl = parseBaseUrl(xpp, baseUrl); + seenFirstBaseUrl = true; + } } else if (isStartTag(xpp, "ContentProtection")) { contentProtectionsBuilder.addAdaptationSetProtection(parseContentProtection(xpp)); } else if (isStartTag(xpp, "ContentComponent")) { @@ -352,10 +364,14 @@ public class MediaPresentationDescriptionParser extends DefaultHandler int audioSamplingRate = parseInt(xpp, "audioSamplingRate", adaptationSetAudioSamplingRate); String language = adaptationSetLanguage; + boolean seenFirstBaseUrl = false; do { xpp.next(); if (isStartTag(xpp, "BaseURL")) { - baseUrl = parseBaseUrl(xpp, baseUrl); + if (!seenFirstBaseUrl) { + baseUrl = parseBaseUrl(xpp, baseUrl); + seenFirstBaseUrl = true; + } } else if (isStartTag(xpp, "AudioChannelConfiguration")) { audioChannels = parseAudioChannelConfiguration(xpp); } else if (isStartTag(xpp, "SegmentBase")) {