diff --git a/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java b/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java index dff2b16ded..cea977ef6b 100644 --- a/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java @@ -298,6 +298,10 @@ public class DashChunkSource implements ChunkSource { if (finishedCurrentManifest && (android.os.SystemClock.elapsedRealtime() > manifestFetcher.getManifestLoadTimestamp() + minUpdatePeriod)) { + String newManifestURL = currentManifest.location; + if (newManifestURL != null) { + manifestFetcher.updateManifestUrl(newManifestURL); + } manifestFetcher.requestRefresh(); } } @@ -589,7 +593,7 @@ public class DashChunkSource implements ChunkSource { firstRepresentation.periodDurationMs, Collections.singletonList(adaptationSet)); long duration = firstRepresentation.periodDurationMs - firstRepresentation.periodStartMs; return new MediaPresentationDescription(-1, duration, -1, false, -1, -1, null, - Collections.singletonList(period)); + Collections.singletonList(period), null); } private static class RepresentationHolder { diff --git a/library/src/main/java/com/google/android/exoplayer/dash/mpd/MediaPresentationDescription.java b/library/src/main/java/com/google/android/exoplayer/dash/mpd/MediaPresentationDescription.java index b1946645c7..7004401798 100644 --- a/library/src/main/java/com/google/android/exoplayer/dash/mpd/MediaPresentationDescription.java +++ b/library/src/main/java/com/google/android/exoplayer/dash/mpd/MediaPresentationDescription.java @@ -39,9 +39,11 @@ public class MediaPresentationDescription { public final UtcTimingElement utcTiming; + public final String location; + public MediaPresentationDescription(long availabilityStartTime, long duration, long minBufferTime, boolean dynamic, long minUpdatePeriod, long timeShiftBufferDepth, UtcTimingElement utcTiming, - List periods) { + List periods, String location) { this.availabilityStartTime = availabilityStartTime; this.duration = duration; this.minBufferTime = minBufferTime; @@ -50,6 +52,7 @@ public class MediaPresentationDescription { this.timeShiftBufferDepth = timeShiftBufferDepth; this.utcTiming = utcTiming; this.periods = Collections.unmodifiableList(periods); + this.location = location; } } 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 4e94a75d1a..614ec76063 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 @@ -111,6 +111,7 @@ public class MediaPresentationDescriptionParser extends DefaultHandler long timeShiftBufferDepthMs = (dynamic) ? parseDuration(xpp, "timeShiftBufferDepth", -1) : -1; UtcTimingElement utcTiming = null; + String location = null; List periods = new ArrayList<>(); do { @@ -121,19 +122,21 @@ public class MediaPresentationDescriptionParser extends DefaultHandler utcTiming = parseUtcTiming(xpp); } else if (isStartTag(xpp, "Period")) { periods.add(parsePeriod(xpp, baseUrl, durationMs)); + } else if (isStartTag(xpp, "Location")) { + location = xpp.nextText(); } } while (!isEndTag(xpp, "MPD")); return buildMediaPresentationDescription(availabilityStartTime, durationMs, minBufferTimeMs, - dynamic, minUpdateTimeMs, timeShiftBufferDepthMs, utcTiming, periods); + dynamic, minUpdateTimeMs, timeShiftBufferDepthMs, utcTiming, periods, location); } protected MediaPresentationDescription buildMediaPresentationDescription( long availabilityStartTime, long durationMs, long minBufferTimeMs, boolean dynamic, long minUpdateTimeMs, long timeShiftBufferDepthMs, UtcTimingElement utcTiming, - List periods) { + List periods, String location) { return new MediaPresentationDescription(availabilityStartTime, durationMs, minBufferTimeMs, - dynamic, minUpdateTimeMs, timeShiftBufferDepthMs, utcTiming, periods); + dynamic, minUpdateTimeMs, timeShiftBufferDepthMs, utcTiming, periods, location); } protected UtcTimingElement parseUtcTiming(XmlPullParser xpp) {