Commit c9b9054c 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 fc5d1783
...@@ -63,6 +63,7 @@ import androidx.media3.exoplayer.video.VideoRendererEventListener; ...@@ -63,6 +63,7 @@ import androidx.media3.exoplayer.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 androidx.media3.exoplayer.video.VideoRendererEventListener; ...@@ -71,8 +72,10 @@ import androidx.media3.exoplayer.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 androidx.media3.exoplayer.video.VideoRendererEventListener; ...@@ -92,7 +95,8 @@ import androidx.media3.exoplayer.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 androidx.media3.exoplayer.video.VideoRendererEventListener; ...@@ -101,11 +105,11 @@ import androidx.media3.exoplayer.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 androidx.media3.exoplayer.video.VideoRendererEventListener; ...@@ -113,10 +117,6 @@ import androidx.media3.exoplayer.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;
......
...@@ -17,11 +17,9 @@ ...@@ -17,11 +17,9 @@
package androidx.media3.transformer; package androidx.media3.transformer;
import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.common.util.Assertions.checkState;
import static androidx.media3.transformer.TransformerInternal.END_TRANSFORMATION_REASON_CANCELLED;
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;
...@@ -37,6 +35,7 @@ import androidx.media3.common.MediaLibraryInfo; ...@@ -37,6 +35,7 @@ import androidx.media3.common.MediaLibraryInfo;
import androidx.media3.common.MimeTypes; import androidx.media3.common.MimeTypes;
import androidx.media3.common.audio.AudioProcessor; import androidx.media3.common.audio.AudioProcessor;
import androidx.media3.common.util.Clock; import androidx.media3.common.util.Clock;
import androidx.media3.common.util.HandlerWrapper;
import androidx.media3.common.util.ListenerSet; import androidx.media3.common.util.ListenerSet;
import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.UnstableApi;
import androidx.media3.common.util.Util; import androidx.media3.common.util.Util;
...@@ -734,6 +733,7 @@ public final class Transformer { ...@@ -734,6 +733,7 @@ public final class Transformer {
encoderFactory, encoderFactory,
frameProcessorFactory, frameProcessorFactory,
muxerFactory, muxerFactory,
looper,
transformerInternalListener, transformerInternalListener,
fallbackListener, fallbackListener,
debugViewProvider, debugViewProvider,
...@@ -780,12 +780,11 @@ public final class Transformer { ...@@ -780,12 +780,11 @@ 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() {
if (Looper.myLooper() != looper) { if (Looper.myLooper() != looper) {
...@@ -796,18 +795,17 @@ public final class Transformer { ...@@ -796,18 +795,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(
...@@ -819,8 +817,7 @@ public final class Transformer { ...@@ -819,8 +817,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