Commit 2a0dc414 by kimvde Committed by Rohit Singh

Add Transformer internal thread

This thread just starts the player and handles the player callbacks for
now. Sample pipelines are still run on the playback thread.

PiperOrigin-RevId: 491299671
parent bf77290f
...@@ -63,6 +63,7 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener; ...@@ -63,6 +63,7 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener;
void onError(Exception e); void onError(Exception e);
} }
private final MediaItem mediaItem;
private final ExoPlayer player; private final ExoPlayer player;
public ExoPlayerAssetLoader( public ExoPlayerAssetLoader(
...@@ -71,8 +72,10 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener; ...@@ -71,8 +72,10 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener;
boolean removeAudio, boolean removeAudio,
boolean removeVideo, boolean removeVideo,
MediaSource.Factory mediaSourceFactory, MediaSource.Factory mediaSourceFactory,
Looper looper,
Listener listener, Listener listener,
Clock clock) { Clock clock) {
this.mediaItem = mediaItem;
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
trackSelector.setParameters( trackSelector.setParameters(
new DefaultTrackSelector.Parameters.Builder(context) new DefaultTrackSelector.Parameters.Builder(context)
...@@ -92,7 +95,8 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener; ...@@ -92,7 +95,8 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener;
new ExoPlayer.Builder(context, new RenderersFactoryImpl(removeAudio, removeVideo, listener)) new ExoPlayer.Builder(context, new RenderersFactoryImpl(removeAudio, removeVideo, listener))
.setMediaSourceFactory(mediaSourceFactory) .setMediaSourceFactory(mediaSourceFactory)
.setTrackSelector(trackSelector) .setTrackSelector(trackSelector)
.setLoadControl(loadControl); .setLoadControl(loadControl)
.setLooper(looper);
if (clock != Clock.DEFAULT) { if (clock != Clock.DEFAULT) {
// Transformer.Builder#setClock is also @VisibleForTesting, so if we're using a non-default // Transformer.Builder#setClock is also @VisibleForTesting, so if we're using a non-default
// clock we must be in a test context. // clock we must be in a test context.
...@@ -101,11 +105,11 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener; ...@@ -101,11 +105,11 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener;
} }
player = playerBuilder.build(); player = playerBuilder.build();
player.setMediaItem(mediaItem);
player.addListener(new PlayerListener(listener)); player.addListener(new PlayerListener(listener));
} }
public void start() { public void start() {
player.setMediaItem(mediaItem);
player.prepare(); player.prepare();
} }
...@@ -113,10 +117,6 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener; ...@@ -113,10 +117,6 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener;
player.release(); player.release();
} }
public Looper getPlaybackLooper() {
return player.getPlaybackLooper();
}
private static final class RenderersFactoryImpl implements RenderersFactory { private static final class RenderersFactoryImpl implements RenderersFactory {
private final TransformerMediaClock mediaClock; private final TransformerMediaClock mediaClock;
......
...@@ -16,12 +16,10 @@ ...@@ -16,12 +16,10 @@
package com.google.android.exoplayer2.transformer; package com.google.android.exoplayer2.transformer;
import static com.google.android.exoplayer2.transformer.TransformerInternal.END_TRANSFORMATION_REASON_CANCELLED;
import static com.google.android.exoplayer2.util.Assertions.checkState; import static com.google.android.exoplayer2.util.Assertions.checkState;
import static java.lang.annotation.ElementType.TYPE_USE; import static java.lang.annotation.ElementType.TYPE_USE;
import android.content.Context; import android.content.Context;
import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
...@@ -43,6 +41,7 @@ import com.google.android.exoplayer2.util.Clock; ...@@ -43,6 +41,7 @@ import com.google.android.exoplayer2.util.Clock;
import com.google.android.exoplayer2.util.DebugViewProvider; import com.google.android.exoplayer2.util.DebugViewProvider;
import com.google.android.exoplayer2.util.Effect; import com.google.android.exoplayer2.util.Effect;
import com.google.android.exoplayer2.util.FrameProcessor; import com.google.android.exoplayer2.util.FrameProcessor;
import com.google.android.exoplayer2.util.HandlerWrapper;
import com.google.android.exoplayer2.util.ListenerSet; import com.google.android.exoplayer2.util.ListenerSet;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
...@@ -732,6 +731,7 @@ public final class Transformer { ...@@ -732,6 +731,7 @@ public final class Transformer {
encoderFactory, encoderFactory,
frameProcessorFactory, frameProcessorFactory,
muxerFactory, muxerFactory,
looper,
transformerInternalListener, transformerInternalListener,
fallbackListener, fallbackListener,
debugViewProvider, debugViewProvider,
...@@ -778,11 +778,10 @@ public final class Transformer { ...@@ -778,11 +778,10 @@ public final class Transformer {
return; return;
} }
try { try {
transformerInternal.release(END_TRANSFORMATION_REASON_CANCELLED); transformerInternal.cancel();
} catch (TransformationException impossible) { } finally {
throw new IllegalStateException(impossible); transformerInternal = null;
} }
transformerInternal = null;
} }
private void verifyApplicationThread() { private void verifyApplicationThread() {
...@@ -794,18 +793,17 @@ public final class Transformer { ...@@ -794,18 +793,17 @@ public final class Transformer {
private final class TransformerInternalListener implements TransformerInternal.Listener { private final class TransformerInternalListener implements TransformerInternal.Listener {
private final MediaItem mediaItem; private final MediaItem mediaItem;
private final Handler handler; private final HandlerWrapper handler;
public TransformerInternalListener(MediaItem mediaItem) { public TransformerInternalListener(MediaItem mediaItem) {
this.mediaItem = mediaItem; this.mediaItem = mediaItem;
handler = Util.createHandlerForCurrentLooper(); handler = clock.createHandler(looper, /* callback= */ null);
} }
@Override @Override
public void onTransformationCompleted(TransformationResult transformationResult) { public void onTransformationCompleted(TransformationResult transformationResult) {
// TODO(b/213341814): Add event flags for Transformer events. // TODO(b/213341814): Add event flags for Transformer events.
Util.postOrRun( handler.post(
handler,
() -> { () -> {
transformerInternal = null; transformerInternal = null;
listeners.queueEvent( listeners.queueEvent(
...@@ -817,8 +815,7 @@ public final class Transformer { ...@@ -817,8 +815,7 @@ public final class Transformer {
@Override @Override
public void onTransformationError(TransformationException exception) { public void onTransformationError(TransformationException exception) {
Util.postOrRun( handler.post(
handler,
() -> { () -> {
transformerInternal = null; transformerInternal = null;
listeners.queueEvent( listeners.queueEvent(
......
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