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;
@Nullable private DecoderInputBuffer inputBuffer;
private boolean muxerWrapperTrackAdded;
private boolean isEnded;
public BaseSamplePipeline(
Format inputFormat,
......@@ -81,11 +80,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
return feedMuxer() || processDataUpToMuxer();
}
@Override
public boolean isEnded() {
return isEnded;
}
@Nullable
protected abstract DecoderInputBuffer dequeueInputBufferInternal() throws TransformationException;
......@@ -148,7 +142,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
if (isMuxerInputEnded()) {
muxerWrapper.endTrack(trackType);
isEnded = true;
return false;
}
......
......@@ -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_MAX_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.os.Handler;
......@@ -55,11 +54,10 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener;
void onAllTracksRegistered();
SamplePipeline onTrackAdded(Format format, long streamStartPositionUs, long streamOffsetUs)
SamplePipeline.Input onTrackAdded(
Format format, long streamStartPositionUs, long streamOffsetUs)
throws TransformationException;
void onEnded();
void onError(Exception e);
}
......@@ -111,6 +109,7 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener;
public void start() {
player.setMediaItem(mediaItem);
player.prepare();
player.play();
}
public void release() {
......@@ -168,13 +167,6 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener;
}
@Override
public void onPlaybackStateChanged(int state) {
if (state == Player.STATE_ENDED) {
listener.onEnded();
}
}
@Override
public void onTimelineChanged(Timeline timeline, int reason) {
if (hasSentDuration) {
return;
......@@ -184,7 +176,6 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener;
if (!window.isPlaceholder) {
listener.onDurationMs(Util.usToMs(window.durationUs));
hasSentDuration = true;
checkNotNull(player).play();
}
}
......
......@@ -45,7 +45,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
private boolean isTransformationRunning;
private long streamStartPositionUs;
private long streamOffsetUs;
private @MonotonicNonNull SamplePipeline samplePipeline;
private SamplePipeline.@MonotonicNonNull Input samplePipelineInput;
private boolean isEnded;
public ExoPlayerAssetLoaderRenderer(
int trackType,
......@@ -88,7 +89,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
@Override
public boolean isEnded() {
return samplePipeline != null && samplePipeline.isEnded();
return isEnded;
}
@Override
......@@ -98,7 +99,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
return;
}
while (samplePipeline.processData() || feedPipelineFromInput()) {}
while (feedPipelineFromInput()) {}
} catch (TransformationException e) {
isTransformationRunning = false;
assetLoaderListener.onError(e);
......@@ -127,16 +128,9 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
isTransformationRunning = false;
}
@Override
protected void onReset() {
if (samplePipeline != null) {
samplePipeline.release();
}
}
@EnsuresNonNullIf(expression = "samplePipeline", result = true)
@EnsuresNonNullIf(expression = "samplePipelineInput", result = true)
private boolean ensureConfigured() throws TransformationException {
if (samplePipeline != null) {
if (samplePipelineInput != null) {
return true;
}
......@@ -147,7 +141,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
return false;
}
Format inputFormat = checkNotNull(formatHolder.format);
samplePipeline =
samplePipelineInput =
assetLoaderListener.onTrackAdded(inputFormat, streamStartPositionUs, streamOffsetUs);
return true;
}
......@@ -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.
*
* @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")
private boolean feedPipelineFromInput() throws TransformationException {
@Nullable DecoderInputBuffer samplePipelineInputBuffer = samplePipeline.dequeueInputBuffer();
@RequiresNonNull("samplePipelineInput")
private boolean feedPipelineFromInput() {
@Nullable
DecoderInputBuffer samplePipelineInputBuffer = samplePipelineInput.dequeueInputBuffer();
if (samplePipelineInputBuffer == null) {
return false;
}
......@@ -171,11 +165,12 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
case C.RESULT_BUFFER_READ:
samplePipelineInputBuffer.flip();
if (samplePipelineInputBuffer.isEndOfStream()) {
samplePipeline.queueInputBuffer();
samplePipelineInput.queueInputBuffer();
isEnded = true;
return false;
}
mediaClock.updateTimeForTrackType(getTrackType(), samplePipelineInputBuffer.timeUs);
samplePipeline.queueInputBuffer();
samplePipelineInput.queueInputBuffer();
return true;
case C.RESULT_FORMAT_READ:
throw new IllegalStateException("Format changes are not supported.");
......
......@@ -69,6 +69,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
private int trackCount;
private int trackFormatCount;
private boolean isReady;
private boolean isEnded;
private @C.TrackType int previousTrackType;
private long minTrackTimeUs;
private @MonotonicNonNull ScheduledFuture<?> abortScheduledFuture;
......@@ -216,9 +217,15 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
trackTypeToIndex.delete(trackType);
if (trackTypeToIndex.size() == 0) {
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.
*
......
......@@ -26,6 +26,17 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
*/
/* 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. */
interface Listener {
......@@ -63,9 +74,6 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
*/
boolean processData() throws TransformationException;
/** Returns whether the pipeline has ended. */
boolean isEnded();
/** Releases all resources held by the pipeline. */
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