mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Replace manifest uri without changing the media item
We aim to have the same media item instance published in the timeline that is passed to the createMediaSource(mediaItem) method. This means when the manifest uri is manually replaced by a developer, the media item published in the next timeline update is still the same. Note: This leads to the fact that the manifest published in that timeline is loaded from a different URI than the URI of the media item in the same timeline. PiperOrigin-RevId: 313375421
This commit is contained in:
parent
82e199445a
commit
f84bd4635a
@ -16,7 +16,6 @@
|
|||||||
package com.google.android.exoplayer2.source.dash;
|
package com.google.android.exoplayer2.source.dash;
|
||||||
|
|
||||||
import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
|
import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
|
||||||
import static com.google.android.exoplayer2.util.Util.castNonNull;
|
|
||||||
|
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
@ -453,6 +452,8 @@ public final class DashMediaSource extends BaseMediaSource {
|
|||||||
private final Runnable simulateManifestRefreshRunnable;
|
private final Runnable simulateManifestRefreshRunnable;
|
||||||
private final PlayerEmsgCallback playerEmsgCallback;
|
private final PlayerEmsgCallback playerEmsgCallback;
|
||||||
private final LoaderErrorThrower manifestLoadErrorThrower;
|
private final LoaderErrorThrower manifestLoadErrorThrower;
|
||||||
|
private final MediaItem mediaItem;
|
||||||
|
private final MediaItem.PlaybackProperties playbackProperties;
|
||||||
|
|
||||||
private DataSource dataSource;
|
private DataSource dataSource;
|
||||||
private Loader loader;
|
private Loader loader;
|
||||||
@ -461,9 +462,8 @@ public final class DashMediaSource extends BaseMediaSource {
|
|||||||
private IOException manifestFatalError;
|
private IOException manifestFatalError;
|
||||||
private Handler handler;
|
private Handler handler;
|
||||||
|
|
||||||
private MediaItem mediaItem;
|
|
||||||
private MediaItem.PlaybackProperties playbackProperties;
|
|
||||||
private Uri manifestUri;
|
private Uri manifestUri;
|
||||||
|
private Uri initialManifestUri;
|
||||||
private DashManifest manifest;
|
private DashManifest manifest;
|
||||||
private boolean manifestLoadPending;
|
private boolean manifestLoadPending;
|
||||||
private long manifestLoadStartTimestampMs;
|
private long manifestLoadStartTimestampMs;
|
||||||
@ -604,6 +604,7 @@ public final class DashMediaSource extends BaseMediaSource {
|
|||||||
this.mediaItem = mediaItem;
|
this.mediaItem = mediaItem;
|
||||||
this.playbackProperties = checkNotNull(mediaItem.playbackProperties);
|
this.playbackProperties = checkNotNull(mediaItem.playbackProperties);
|
||||||
this.manifestUri = playbackProperties.uri;
|
this.manifestUri = playbackProperties.uri;
|
||||||
|
this.initialManifestUri = playbackProperties.uri;
|
||||||
this.manifest = manifest;
|
this.manifest = manifest;
|
||||||
this.manifestDataSourceFactory = manifestDataSourceFactory;
|
this.manifestDataSourceFactory = manifestDataSourceFactory;
|
||||||
this.manifestParser = manifestParser;
|
this.manifestParser = manifestParser;
|
||||||
@ -642,8 +643,7 @@ public final class DashMediaSource extends BaseMediaSource {
|
|||||||
public void replaceManifestUri(Uri manifestUri) {
|
public void replaceManifestUri(Uri manifestUri) {
|
||||||
synchronized (manifestUriLock) {
|
synchronized (manifestUriLock) {
|
||||||
this.manifestUri = manifestUri;
|
this.manifestUri = manifestUri;
|
||||||
this.mediaItem = mediaItem.buildUpon().setUri(manifestUri).build();
|
this.initialManifestUri = manifestUri;
|
||||||
this.playbackProperties = castNonNull(mediaItem.playbackProperties);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -722,7 +722,7 @@ public final class DashMediaSource extends BaseMediaSource {
|
|||||||
manifestLoadStartTimestampMs = 0;
|
manifestLoadStartTimestampMs = 0;
|
||||||
manifestLoadEndTimestampMs = 0;
|
manifestLoadEndTimestampMs = 0;
|
||||||
manifest = sideloadedManifest ? manifest : null;
|
manifest = sideloadedManifest ? manifest : null;
|
||||||
manifestUri = playbackProperties.uri;
|
manifestUri = initialManifestUri;
|
||||||
manifestFatalError = null;
|
manifestFatalError = null;
|
||||||
if (handler != null) {
|
if (handler != null) {
|
||||||
handler.removeCallbacksAndMessages(null);
|
handler.removeCallbacksAndMessages(null);
|
||||||
|
@ -17,14 +17,14 @@ package com.google.android.exoplayer2.source.dash;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
import static org.mockito.Mockito.mock;
|
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import com.google.android.exoplayer2.MediaItem;
|
import com.google.android.exoplayer2.MediaItem;
|
||||||
import com.google.android.exoplayer2.ParserException;
|
import com.google.android.exoplayer2.ParserException;
|
||||||
import com.google.android.exoplayer2.offline.StreamKey;
|
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.upstream.ParsingLoadable;
|
||||||
import com.google.android.exoplayer2.util.Util;
|
import com.google.android.exoplayer2.util.Util;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
@ -81,7 +81,7 @@ public final class DashMediaSourceTest {
|
|||||||
Object tag = new Object();
|
Object tag = new Object();
|
||||||
MediaItem mediaItem = MediaItem.fromUri("http://www.google.com");
|
MediaItem mediaItem = MediaItem.fromUri("http://www.google.com");
|
||||||
DashMediaSource.Factory factory =
|
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();
|
MediaItem dashMediaItem = factory.createMediaSource(mediaItem).getMediaItem();
|
||||||
|
|
||||||
@ -99,7 +99,7 @@ public final class DashMediaSourceTest {
|
|||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder().setUri("http://www.google.com").setTag(mediaItemTag).build();
|
new MediaItem.Builder().setUri("http://www.google.com").setTag(mediaItemTag).build();
|
||||||
DashMediaSource.Factory factory =
|
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();
|
MediaItem dashMediaItem = factory.createMediaSource(mediaItem).getMediaItem();
|
||||||
|
|
||||||
@ -115,7 +115,7 @@ public final class DashMediaSourceTest {
|
|||||||
Object tag = new Object();
|
Object tag = new Object();
|
||||||
MediaItem mediaItem = MediaItem.fromUri("http://www.google.com");
|
MediaItem mediaItem = MediaItem.fromUri("http://www.google.com");
|
||||||
DashMediaSource.Factory factory =
|
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();
|
@Nullable Object mediaSourceTag = factory.createMediaSource(mediaItem).getTag();
|
||||||
|
|
||||||
@ -130,7 +130,7 @@ public final class DashMediaSourceTest {
|
|||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder().setUri("http://www.google.com").setTag(tag).build();
|
new MediaItem.Builder().setUri("http://www.google.com").setTag(tag).build();
|
||||||
DashMediaSource.Factory factory =
|
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();
|
@Nullable Object mediaSourceTag = factory.createMediaSource(mediaItem).getTag();
|
||||||
|
|
||||||
@ -144,7 +144,7 @@ public final class DashMediaSourceTest {
|
|||||||
MediaItem mediaItem = MediaItem.fromUri("http://www.google.com");
|
MediaItem mediaItem = MediaItem.fromUri("http://www.google.com");
|
||||||
StreamKey streamKey = new StreamKey(/* groupIndex= */ 0, /* trackIndex= */ 1);
|
StreamKey streamKey = new StreamKey(/* groupIndex= */ 0, /* trackIndex= */ 1);
|
||||||
DashMediaSource.Factory factory =
|
DashMediaSource.Factory factory =
|
||||||
new DashMediaSource.Factory(mock(DataSource.Factory.class))
|
new DashMediaSource.Factory(new FileDataSource.Factory())
|
||||||
.setStreamKeys(ImmutableList.of(streamKey));
|
.setStreamKeys(ImmutableList.of(streamKey));
|
||||||
|
|
||||||
MediaItem dashMediaItem = factory.createMediaSource(mediaItem).getMediaItem();
|
MediaItem dashMediaItem = factory.createMediaSource(mediaItem).getMediaItem();
|
||||||
@ -165,7 +165,7 @@ public final class DashMediaSourceTest {
|
|||||||
.setStreamKeys(ImmutableList.of(mediaItemStreamKey))
|
.setStreamKeys(ImmutableList.of(mediaItemStreamKey))
|
||||||
.build();
|
.build();
|
||||||
DashMediaSource.Factory factory =
|
DashMediaSource.Factory factory =
|
||||||
new DashMediaSource.Factory(mock(DataSource.Factory.class))
|
new DashMediaSource.Factory(new FileDataSource.Factory())
|
||||||
.setStreamKeys(
|
.setStreamKeys(
|
||||||
ImmutableList.of(new StreamKey(/* groupIndex= */ 1, /* trackIndex= */ 0)));
|
ImmutableList.of(new StreamKey(/* groupIndex= */ 1, /* trackIndex= */ 0)));
|
||||||
|
|
||||||
@ -176,6 +176,17 @@ public final class DashMediaSourceTest {
|
|||||||
assertThat(dashMediaItem.playbackProperties.streamKeys).containsExactly(mediaItemStreamKey);
|
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(
|
private static void assertParseStringToLong(
|
||||||
long expected, ParsingLoadable.Parser<Long> parser, String data) throws IOException {
|
long expected, ParsingLoadable.Parser<Long> parser, String data) throws IOException {
|
||||||
long actual = parser.parse(null, new ByteArrayInputStream(Util.getUtf8Bytes(data)));
|
long actual = parser.parse(null, new ByteArrayInputStream(Util.getUtf8Bytes(data)));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user