diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java index 03d967e895..e2954fb6ff 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java @@ -16,7 +16,6 @@ package com.google.android.exoplayer2.source.dash; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; -import static com.google.android.exoplayer2.util.Util.castNonNull; import android.net.Uri; import android.os.Handler; @@ -453,6 +452,8 @@ public final class DashMediaSource extends BaseMediaSource { private final Runnable simulateManifestRefreshRunnable; private final PlayerEmsgCallback playerEmsgCallback; private final LoaderErrorThrower manifestLoadErrorThrower; + private final MediaItem mediaItem; + private final MediaItem.PlaybackProperties playbackProperties; private DataSource dataSource; private Loader loader; @@ -461,9 +462,8 @@ public final class DashMediaSource extends BaseMediaSource { private IOException manifestFatalError; private Handler handler; - private MediaItem mediaItem; - private MediaItem.PlaybackProperties playbackProperties; private Uri manifestUri; + private Uri initialManifestUri; private DashManifest manifest; private boolean manifestLoadPending; private long manifestLoadStartTimestampMs; @@ -604,6 +604,7 @@ public final class DashMediaSource extends BaseMediaSource { this.mediaItem = mediaItem; this.playbackProperties = checkNotNull(mediaItem.playbackProperties); this.manifestUri = playbackProperties.uri; + this.initialManifestUri = playbackProperties.uri; this.manifest = manifest; this.manifestDataSourceFactory = manifestDataSourceFactory; this.manifestParser = manifestParser; @@ -642,8 +643,7 @@ public final class DashMediaSource extends BaseMediaSource { public void replaceManifestUri(Uri manifestUri) { synchronized (manifestUriLock) { this.manifestUri = manifestUri; - this.mediaItem = mediaItem.buildUpon().setUri(manifestUri).build(); - this.playbackProperties = castNonNull(mediaItem.playbackProperties); + this.initialManifestUri = manifestUri; } } @@ -722,7 +722,7 @@ public final class DashMediaSource extends BaseMediaSource { manifestLoadStartTimestampMs = 0; manifestLoadEndTimestampMs = 0; manifest = sideloadedManifest ? manifest : null; - manifestUri = playbackProperties.uri; + manifestUri = initialManifestUri; manifestFatalError = null; if (handler != null) { handler.removeCallbacksAndMessages(null); diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java index 9771d09370..aa65237095 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java @@ -17,14 +17,14 @@ package com.google.android.exoplayer2.source.dash; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; -import static org.mockito.Mockito.mock; +import android.net.Uri; import androidx.annotation.Nullable; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.offline.StreamKey; -import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.FileDataSource; import com.google.android.exoplayer2.upstream.ParsingLoadable; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; @@ -81,7 +81,7 @@ public final class DashMediaSourceTest { Object tag = new Object(); MediaItem mediaItem = MediaItem.fromUri("http://www.google.com"); DashMediaSource.Factory factory = - new DashMediaSource.Factory(mock(DataSource.Factory.class)).setTag(tag); + new DashMediaSource.Factory(new FileDataSource.Factory()).setTag(tag); MediaItem dashMediaItem = factory.createMediaSource(mediaItem).getMediaItem(); @@ -99,7 +99,7 @@ public final class DashMediaSourceTest { MediaItem mediaItem = new MediaItem.Builder().setUri("http://www.google.com").setTag(mediaItemTag).build(); DashMediaSource.Factory factory = - new DashMediaSource.Factory(mock(DataSource.Factory.class)).setTag(factoryTag); + new DashMediaSource.Factory(new FileDataSource.Factory()).setTag(factoryTag); MediaItem dashMediaItem = factory.createMediaSource(mediaItem).getMediaItem(); @@ -115,7 +115,7 @@ public final class DashMediaSourceTest { Object tag = new Object(); MediaItem mediaItem = MediaItem.fromUri("http://www.google.com"); DashMediaSource.Factory factory = - new DashMediaSource.Factory(mock(DataSource.Factory.class)).setTag(tag); + new DashMediaSource.Factory(new FileDataSource.Factory()).setTag(tag); @Nullable Object mediaSourceTag = factory.createMediaSource(mediaItem).getTag(); @@ -130,7 +130,7 @@ public final class DashMediaSourceTest { MediaItem mediaItem = new MediaItem.Builder().setUri("http://www.google.com").setTag(tag).build(); DashMediaSource.Factory factory = - new DashMediaSource.Factory(mock(DataSource.Factory.class)).setTag(new Object()); + new DashMediaSource.Factory(new FileDataSource.Factory()).setTag(new Object()); @Nullable Object mediaSourceTag = factory.createMediaSource(mediaItem).getTag(); @@ -144,7 +144,7 @@ public final class DashMediaSourceTest { MediaItem mediaItem = MediaItem.fromUri("http://www.google.com"); StreamKey streamKey = new StreamKey(/* groupIndex= */ 0, /* trackIndex= */ 1); DashMediaSource.Factory factory = - new DashMediaSource.Factory(mock(DataSource.Factory.class)) + new DashMediaSource.Factory(new FileDataSource.Factory()) .setStreamKeys(ImmutableList.of(streamKey)); MediaItem dashMediaItem = factory.createMediaSource(mediaItem).getMediaItem(); @@ -165,7 +165,7 @@ public final class DashMediaSourceTest { .setStreamKeys(ImmutableList.of(mediaItemStreamKey)) .build(); DashMediaSource.Factory factory = - new DashMediaSource.Factory(mock(DataSource.Factory.class)) + new DashMediaSource.Factory(new FileDataSource.Factory()) .setStreamKeys( ImmutableList.of(new StreamKey(/* groupIndex= */ 1, /* trackIndex= */ 0))); @@ -176,6 +176,17 @@ public final class DashMediaSourceTest { assertThat(dashMediaItem.playbackProperties.streamKeys).containsExactly(mediaItemStreamKey); } + @Test + public void replaceManifestUri_doesNotChangeMediaItem() { + DashMediaSource.Factory factory = new DashMediaSource.Factory(new FileDataSource.Factory()); + MediaItem mediaItem = MediaItem.fromUri("http://www.google.com"); + DashMediaSource mediaSource = factory.createMediaSource(mediaItem); + + mediaSource.replaceManifestUri(Uri.EMPTY); + + assertThat(mediaSource.getMediaItem()).isEqualTo(mediaItem); + } + private static void assertParseStringToLong( long expected, ParsingLoadable.Parser parser, String data) throws IOException { long actual = parser.parse(null, new ByteArrayInputStream(Util.getUtf8Bytes(data)));