Commit 9bd79ebd by kimvde Committed by Rohit Singh

Move sample processing to transformer thread

PiperOrigin-RevId: 491623586
parent 4cf877b8
...@@ -39,7 +39,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -39,7 +39,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
@Nullable private DecoderInputBuffer inputBuffer; @Nullable private DecoderInputBuffer inputBuffer;
private boolean muxerWrapperTrackAdded; private boolean muxerWrapperTrackAdded;
private boolean isEnded;
public BaseSamplePipeline( public BaseSamplePipeline(
Format inputFormat, Format inputFormat,
...@@ -81,11 +80,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -81,11 +80,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
return feedMuxer() || processDataUpToMuxer(); return feedMuxer() || processDataUpToMuxer();
} }
@Override
public boolean isEnded() {
return isEnded;
}
@Nullable @Nullable
protected abstract DecoderInputBuffer dequeueInputBufferInternal() throws TransformationException; protected abstract DecoderInputBuffer dequeueInputBufferInternal() throws TransformationException;
...@@ -148,7 +142,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -148,7 +142,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
if (isMuxerInputEnded()) { if (isMuxerInputEnded()) {
muxerWrapper.endTrack(trackType); muxerWrapper.endTrack(trackType);
isEnded = true;
return false; return false;
} }
......
...@@ -20,7 +20,6 @@ import static com.google.android.exoplayer2.DefaultLoadControl.DEFAULT_BUFFER_FO ...@@ -20,7 +20,6 @@ import static com.google.android.exoplayer2.DefaultLoadControl.DEFAULT_BUFFER_FO
import static com.google.android.exoplayer2.DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS; import static com.google.android.exoplayer2.DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS;
import static com.google.android.exoplayer2.DefaultLoadControl.DEFAULT_MAX_BUFFER_MS; import static com.google.android.exoplayer2.DefaultLoadControl.DEFAULT_MAX_BUFFER_MS;
import static com.google.android.exoplayer2.DefaultLoadControl.DEFAULT_MIN_BUFFER_MS; import static com.google.android.exoplayer2.DefaultLoadControl.DEFAULT_MIN_BUFFER_MS;
import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
import android.content.Context; import android.content.Context;
import android.os.Handler; import android.os.Handler;
...@@ -55,11 +54,10 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener; ...@@ -55,11 +54,10 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener;
void onAllTracksRegistered(); void onAllTracksRegistered();
SamplePipeline onTrackAdded(Format format, long streamStartPositionUs, long streamOffsetUs) SamplePipeline.Input onTrackAdded(
Format format, long streamStartPositionUs, long streamOffsetUs)
throws TransformationException; throws TransformationException;
void onEnded();
void onError(Exception e); void onError(Exception e);
} }
...@@ -111,6 +109,7 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener; ...@@ -111,6 +109,7 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener;
public void start() { public void start() {
player.setMediaItem(mediaItem); player.setMediaItem(mediaItem);
player.prepare(); player.prepare();
player.play();
} }
public void release() { public void release() {
...@@ -168,13 +167,6 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener; ...@@ -168,13 +167,6 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener;
} }
@Override @Override
public void onPlaybackStateChanged(int state) {
if (state == Player.STATE_ENDED) {
listener.onEnded();
}
}
@Override
public void onTimelineChanged(Timeline timeline, int reason) { public void onTimelineChanged(Timeline timeline, int reason) {
if (hasSentDuration) { if (hasSentDuration) {
return; return;
...@@ -184,7 +176,6 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener; ...@@ -184,7 +176,6 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener;
if (!window.isPlaceholder) { if (!window.isPlaceholder) {
listener.onDurationMs(Util.usToMs(window.durationUs)); listener.onDurationMs(Util.usToMs(window.durationUs));
hasSentDuration = true; hasSentDuration = true;
checkNotNull(player).play();
} }
} }
......
...@@ -45,7 +45,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -45,7 +45,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
private boolean isTransformationRunning; private boolean isTransformationRunning;
private long streamStartPositionUs; private long streamStartPositionUs;
private long streamOffsetUs; private long streamOffsetUs;
private @MonotonicNonNull SamplePipeline samplePipeline; private SamplePipeline.@MonotonicNonNull Input samplePipelineInput;
private boolean isEnded;
public ExoPlayerAssetLoaderRenderer( public ExoPlayerAssetLoaderRenderer(
int trackType, int trackType,
...@@ -88,7 +89,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -88,7 +89,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
@Override @Override
public boolean isEnded() { public boolean isEnded() {
return samplePipeline != null && samplePipeline.isEnded(); return isEnded;
} }
@Override @Override
...@@ -98,7 +99,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -98,7 +99,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
return; return;
} }
while (samplePipeline.processData() || feedPipelineFromInput()) {} while (feedPipelineFromInput()) {}
} catch (TransformationException e) { } catch (TransformationException e) {
isTransformationRunning = false; isTransformationRunning = false;
assetLoaderListener.onError(e); assetLoaderListener.onError(e);
...@@ -127,16 +128,9 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -127,16 +128,9 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
isTransformationRunning = false; isTransformationRunning = false;
} }
@Override @EnsuresNonNullIf(expression = "samplePipelineInput", result = true)
protected void onReset() {
if (samplePipeline != null) {
samplePipeline.release();
}
}
@EnsuresNonNullIf(expression = "samplePipeline", result = true)
private boolean ensureConfigured() throws TransformationException { private boolean ensureConfigured() throws TransformationException {
if (samplePipeline != null) { if (samplePipelineInput != null) {
return true; return true;
} }
...@@ -147,7 +141,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -147,7 +141,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
return false; return false;
} }
Format inputFormat = checkNotNull(formatHolder.format); Format inputFormat = checkNotNull(formatHolder.format);
samplePipeline = samplePipelineInput =
assetLoaderListener.onTrackAdded(inputFormat, streamStartPositionUs, streamOffsetUs); assetLoaderListener.onTrackAdded(inputFormat, streamStartPositionUs, streamOffsetUs);
return true; return true;
} }
...@@ -156,11 +150,11 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -156,11 +150,11 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
* Attempts to read input data and pass the input data to the sample pipeline. * Attempts to read input data and pass the input data to the sample pipeline.
* *
* @return Whether it may be possible to read more data immediately by calling this method again. * @return Whether it may be possible to read more data immediately by calling this method again.
* @throws TransformationException If a {@link SamplePipeline} problem occurs.
*/ */
@RequiresNonNull("samplePipeline") @RequiresNonNull("samplePipelineInput")
private boolean feedPipelineFromInput() throws TransformationException { private boolean feedPipelineFromInput() {
@Nullable DecoderInputBuffer samplePipelineInputBuffer = samplePipeline.dequeueInputBuffer(); @Nullable
DecoderInputBuffer samplePipelineInputBuffer = samplePipelineInput.dequeueInputBuffer();
if (samplePipelineInputBuffer == null) { if (samplePipelineInputBuffer == null) {
return false; return false;
} }
...@@ -171,11 +165,12 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -171,11 +165,12 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
case C.RESULT_BUFFER_READ: case C.RESULT_BUFFER_READ:
samplePipelineInputBuffer.flip(); samplePipelineInputBuffer.flip();
if (samplePipelineInputBuffer.isEndOfStream()) { if (samplePipelineInputBuffer.isEndOfStream()) {
samplePipeline.queueInputBuffer(); samplePipelineInput.queueInputBuffer();
isEnded = true;
return false; return false;
} }
mediaClock.updateTimeForTrackType(getTrackType(), samplePipelineInputBuffer.timeUs); mediaClock.updateTimeForTrackType(getTrackType(), samplePipelineInputBuffer.timeUs);
samplePipeline.queueInputBuffer(); samplePipelineInput.queueInputBuffer();
return true; return true;
case C.RESULT_FORMAT_READ: case C.RESULT_FORMAT_READ:
throw new IllegalStateException("Format changes are not supported."); throw new IllegalStateException("Format changes are not supported.");
......
...@@ -69,6 +69,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -69,6 +69,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
private int trackCount; private int trackCount;
private int trackFormatCount; private int trackFormatCount;
private boolean isReady; private boolean isReady;
private boolean isEnded;
private @C.TrackType int previousTrackType; private @C.TrackType int previousTrackType;
private long minTrackTimeUs; private long minTrackTimeUs;
private @MonotonicNonNull ScheduledFuture<?> abortScheduledFuture; private @MonotonicNonNull ScheduledFuture<?> abortScheduledFuture;
...@@ -216,9 +217,15 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -216,9 +217,15 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
trackTypeToIndex.delete(trackType); trackTypeToIndex.delete(trackType);
if (trackTypeToIndex.size() == 0) { if (trackTypeToIndex.size() == 0) {
abortScheduledExecutorService.shutdownNow(); abortScheduledExecutorService.shutdownNow();
isEnded = true;
} }
} }
/** Returns whether all the tracks are {@linkplain #endTrack(int) ended}. */
public boolean isEnded() {
return isEnded;
}
/** /**
* Finishes writing the output and releases any resources associated with muxing. * Finishes writing the output and releases any resources associated with muxing.
* *
......
...@@ -26,6 +26,17 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer; ...@@ -26,6 +26,17 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
*/ */
/* package */ interface SamplePipeline { /* package */ interface SamplePipeline {
/** Input of a {@link SamplePipeline}. */
interface Input {
/** See {@link SamplePipeline#dequeueInputBuffer()}. */
@Nullable
DecoderInputBuffer dequeueInputBuffer();
/** See {@link SamplePipeline#queueInputBuffer()}. */
void queueInputBuffer();
}
/** A listener for the sample pipeline events. */ /** A listener for the sample pipeline events. */
interface Listener { interface Listener {
...@@ -63,9 +74,6 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer; ...@@ -63,9 +74,6 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
*/ */
boolean processData() throws TransformationException; boolean processData() throws TransformationException;
/** Returns whether the pipeline has ended. */
boolean isEnded();
/** Releases all resources held by the pipeline. */ /** Releases all resources held by the pipeline. */
void release(); void release();
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment