Allow multiple renderers with MediaClock as long as only one is enabled.
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=117236319
This commit is contained in:
parent
d0fa6bdbcc
commit
eeddd6d8df
@ -17,7 +17,6 @@ package com.google.android.exoplayer;
|
|||||||
|
|
||||||
import com.google.android.exoplayer.ExoPlayer.ExoPlayerComponent;
|
import com.google.android.exoplayer.ExoPlayer.ExoPlayerComponent;
|
||||||
import com.google.android.exoplayer.TrackSelector.InvalidationListener;
|
import com.google.android.exoplayer.TrackSelector.InvalidationListener;
|
||||||
import com.google.android.exoplayer.util.Assertions;
|
|
||||||
import com.google.android.exoplayer.util.PriorityHandlerThread;
|
import com.google.android.exoplayer.util.PriorityHandlerThread;
|
||||||
import com.google.android.exoplayer.util.TraceUtil;
|
import com.google.android.exoplayer.util.TraceUtil;
|
||||||
import com.google.android.exoplayer.util.Util;
|
import com.google.android.exoplayer.util.Util;
|
||||||
@ -66,8 +65,6 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
|
|
||||||
private final TrackSelector trackSelector;
|
private final TrackSelector trackSelector;
|
||||||
private final TrackRenderer[] renderers;
|
private final TrackRenderer[] renderers;
|
||||||
private final TrackRenderer rendererMediaClockSource;
|
|
||||||
private final MediaClock rendererMediaClock;
|
|
||||||
private final StandaloneMediaClock standaloneMediaClock;
|
private final StandaloneMediaClock standaloneMediaClock;
|
||||||
private final long minBufferUs;
|
private final long minBufferUs;
|
||||||
private final long minRebufferUs;
|
private final long minRebufferUs;
|
||||||
@ -77,6 +74,8 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
private final Handler eventHandler;
|
private final Handler eventHandler;
|
||||||
private final AtomicInteger pendingSeekCount;
|
private final AtomicInteger pendingSeekCount;
|
||||||
|
|
||||||
|
private TrackRenderer rendererMediaClockSource;
|
||||||
|
private MediaClock rendererMediaClock;
|
||||||
private SampleSource source;
|
private SampleSource source;
|
||||||
private TrackRenderer[] enabledRenderers;
|
private TrackRenderer[] enabledRenderers;
|
||||||
private boolean released;
|
private boolean released;
|
||||||
@ -103,22 +102,6 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
this.state = ExoPlayer.STATE_IDLE;
|
this.state = ExoPlayer.STATE_IDLE;
|
||||||
this.durationUs = C.UNKNOWN_TIME_US;
|
this.durationUs = C.UNKNOWN_TIME_US;
|
||||||
this.bufferedPositionUs = C.UNKNOWN_TIME_US;
|
this.bufferedPositionUs = C.UNKNOWN_TIME_US;
|
||||||
|
|
||||||
MediaClock rendererMediaClock = null;
|
|
||||||
TrackRenderer rendererMediaClockSource = null;
|
|
||||||
for (int i = 0; i < renderers.length; i++) {
|
|
||||||
renderers[i].setIndex(i);
|
|
||||||
MediaClock mediaClock = renderers[i].getMediaClock();
|
|
||||||
if (mediaClock != null) {
|
|
||||||
Assertions.checkState(rendererMediaClock == null);
|
|
||||||
rendererMediaClock = mediaClock;
|
|
||||||
rendererMediaClockSource = renderers[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.rendererMediaClock = rendererMediaClock;
|
|
||||||
this.rendererMediaClockSource = rendererMediaClockSource;
|
|
||||||
|
|
||||||
standaloneMediaClock = new StandaloneMediaClock();
|
standaloneMediaClock = new StandaloneMediaClock();
|
||||||
pendingSeekCount = new AtomicInteger();
|
pendingSeekCount = new AtomicInteger();
|
||||||
trackSelections = new TrackSelection[renderers.length];
|
trackSelections = new TrackSelection[renderers.length];
|
||||||
@ -510,10 +493,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
|
|
||||||
private void resetRendererInternal(TrackRenderer renderer) {
|
private void resetRendererInternal(TrackRenderer renderer) {
|
||||||
try {
|
try {
|
||||||
ensureStopped(renderer);
|
ensureDisabled(renderer);
|
||||||
if (renderer.getState() == TrackRenderer.STATE_ENABLED) {
|
|
||||||
renderer.disable();
|
|
||||||
}
|
|
||||||
} catch (ExoPlaybackException e) {
|
} catch (ExoPlaybackException e) {
|
||||||
// There's nothing we can do.
|
// There's nothing we can do.
|
||||||
Log.e(TAG, "Stop failed.", e);
|
Log.e(TAG, "Stop failed.", e);
|
||||||
@ -573,8 +553,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
// over timing responsibilities.
|
// over timing responsibilities.
|
||||||
standaloneMediaClock.setPositionUs(rendererMediaClock.getPositionUs());
|
standaloneMediaClock.setPositionUs(rendererMediaClock.getPositionUs());
|
||||||
}
|
}
|
||||||
ensureStopped(renderer);
|
ensureDisabled(renderer);
|
||||||
renderer.disable();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -602,6 +581,16 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
}
|
}
|
||||||
// Enable the renderer.
|
// Enable the renderer.
|
||||||
renderer.enable(formats, trackStream, positionUs, joining);
|
renderer.enable(formats, trackStream, positionUs, joining);
|
||||||
|
MediaClock mediaClock = renderer.getMediaClock();
|
||||||
|
if (mediaClock != null) {
|
||||||
|
if (rendererMediaClock != null) {
|
||||||
|
throw ExoPlaybackException.createForUnexpected(
|
||||||
|
new IllegalStateException("Multiple renderer media clocks enabled."));
|
||||||
|
}
|
||||||
|
rendererMediaClock = mediaClock;
|
||||||
|
rendererMediaClockSource = renderer;
|
||||||
|
}
|
||||||
|
// Start the renderer if playing.
|
||||||
if (playing) {
|
if (playing) {
|
||||||
renderer.start();
|
renderer.start();
|
||||||
}
|
}
|
||||||
@ -622,6 +611,17 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
handler.sendEmptyMessage(MSG_DO_SOME_WORK);
|
handler.sendEmptyMessage(MSG_DO_SOME_WORK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ensureDisabled(TrackRenderer renderer) throws ExoPlaybackException {
|
||||||
|
ensureStopped(renderer);
|
||||||
|
if (renderer.getState() == TrackRenderer.STATE_ENABLED) {
|
||||||
|
renderer.disable();
|
||||||
|
if (renderer == rendererMediaClockSource) {
|
||||||
|
rendererMediaClock = null;
|
||||||
|
rendererMediaClockSource = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void ensureStopped(TrackRenderer renderer) throws ExoPlaybackException {
|
private void ensureStopped(TrackRenderer renderer) throws ExoPlaybackException {
|
||||||
if (renderer.getState() == TrackRenderer.STATE_STARTED) {
|
if (renderer.getState() == TrackRenderer.STATE_STARTED) {
|
||||||
renderer.stop();
|
renderer.stop();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user