Make DashMediaSource reusable.

GitHub:#3498

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=183253017
This commit is contained in:
tonihei 2018-01-25 09:52:30 -08:00 committed by Oliver Woodman
parent 3d320e9506
commit bc9dbdb49e

View File

@ -266,6 +266,8 @@ public final class DashMediaSource implements MediaSource {
private static final String TAG = "DashMediaSource"; private static final String TAG = "DashMediaSource";
private final Uri initialManifestUri;
private final DashManifest initialManifest;
private final boolean sideloadedManifest; private final boolean sideloadedManifest;
private final DataSource.Factory manifestDataSourceFactory; private final DataSource.Factory manifestDataSourceFactory;
private final DashChunkSource.Factory chunkSourceFactory; private final DashChunkSource.Factory chunkSourceFactory;
@ -280,11 +282,12 @@ public final class DashMediaSource implements MediaSource {
private final Runnable refreshManifestRunnable; private final Runnable refreshManifestRunnable;
private final Runnable simulateManifestRefreshRunnable; private final Runnable simulateManifestRefreshRunnable;
private final PlayerEmsgCallback playerEmsgCallback; private final PlayerEmsgCallback playerEmsgCallback;
private final LoaderErrorThrower manifestLoadErrorThrower;
private Listener sourceListener; private Listener sourceListener;
private DataSource dataSource; private DataSource dataSource;
private Loader loader; private Loader loader;
private LoaderErrorThrower manifestLoadErrorThrower;
private IOException manifestFatalError; private IOException manifestFatalError;
private Handler handler; private Handler handler;
@ -440,6 +443,8 @@ public final class DashMediaSource implements MediaSource {
long livePresentationDelayMs, long livePresentationDelayMs,
Handler eventHandler, Handler eventHandler,
MediaSourceEventListener eventListener) { MediaSourceEventListener eventListener) {
this.initialManifestUri = manifestUri;
this.initialManifest = manifest;
this.manifest = manifest; this.manifest = manifest;
this.manifestUri = manifestUri; this.manifestUri = manifestUri;
this.manifestDataSourceFactory = manifestDataSourceFactory; this.manifestDataSourceFactory = manifestDataSourceFactory;
@ -459,8 +464,10 @@ public final class DashMediaSource implements MediaSource {
manifestCallback = null; manifestCallback = null;
refreshManifestRunnable = null; refreshManifestRunnable = null;
simulateManifestRefreshRunnable = null; simulateManifestRefreshRunnable = null;
manifestLoadErrorThrower = new LoaderErrorThrower.Dummy();
} else { } else {
manifestCallback = new ManifestCallback(); manifestCallback = new ManifestCallback();
manifestLoadErrorThrower = new ManifestLoadErrorThrower();
refreshManifestRunnable = new Runnable() { refreshManifestRunnable = new Runnable() {
@Override @Override
public void run() { public void run() {
@ -491,15 +498,12 @@ public final class DashMediaSource implements MediaSource {
@Override @Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
Assertions.checkState(sourceListener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
sourceListener = listener; sourceListener = listener;
if (sideloadedManifest) { if (sideloadedManifest) {
manifestLoadErrorThrower = new LoaderErrorThrower.Dummy();
processManifest(false); processManifest(false);
} else { } else {
dataSource = manifestDataSourceFactory.createDataSource(); dataSource = manifestDataSourceFactory.createDataSource();
loader = new Loader("Loader:DashMediaSource"); loader = new Loader("Loader:DashMediaSource");
manifestLoadErrorThrower = new ManifestLoadErrorThrower();
handler = new Handler(); handler = new Handler();
startLoadingManifest(); startLoadingManifest();
} }
@ -543,19 +547,24 @@ public final class DashMediaSource implements MediaSource {
public void releaseSource() { public void releaseSource() {
manifestLoadPending = false; manifestLoadPending = false;
dataSource = null; dataSource = null;
manifestLoadErrorThrower = null;
if (loader != null) { if (loader != null) {
loader.release(); loader.release();
loader = null; loader = null;
} }
manifestLoadStartTimestampMs = 0; manifestLoadStartTimestampMs = 0;
manifestLoadEndTimestampMs = 0; manifestLoadEndTimestampMs = 0;
manifest = null; manifest = initialManifest;
manifestUri = initialManifestUri;
manifestFatalError = null;
if (handler != null) { if (handler != null) {
handler.removeCallbacksAndMessages(null); handler.removeCallbacksAndMessages(null);
handler = null; handler = null;
} }
elapsedRealtimeOffsetMs = 0; elapsedRealtimeOffsetMs = 0;
staleManifestReloadAttempt = 0;
expiredManifestPublishTimeUs = C.TIME_UNSET;
dynamicMediaPresentationEnded = false;
firstPeriodId = 0;
periodsById.clear(); periodsById.clear();
} }