diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRenderersFactory.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRenderersFactory.java
index a4894b30e2..092e8d9110 100644
--- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRenderersFactory.java
+++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRenderersFactory.java
@@ -163,22 +163,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
return this;
}
- /**
- * Enable synchronizing codec interactions with asynchronous buffer queueing.
- *
- *
This method is experimental, and will be renamed or removed in a future release.
- *
- * @param enabled Whether codec interactions will be synchronized with asynchronous buffer
- * queueing.
- * @return This factory, for convenience.
- */
- @CanIgnoreReturnValue
- public DefaultRenderersFactory experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(
- boolean enabled) {
- codecAdapterFactory.experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(enabled);
- return this;
- }
-
/**
* Sets whether to enable fallback to lower-priority decoders if decoder initialization fails.
* This may result in using a decoder that is less efficient or slower than the primary decoder.
diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/AsynchronousMediaCodecAdapter.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/AsynchronousMediaCodecAdapter.java
index 9377aaace6..cfca26309b 100644
--- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/AsynchronousMediaCodecAdapter.java
+++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/AsynchronousMediaCodecAdapter.java
@@ -53,35 +53,27 @@ import java.nio.ByteBuffer;
public static final class Factory implements MediaCodecAdapter.Factory {
private final Supplier callbackThreadSupplier;
private final Supplier queueingThreadSupplier;
- private final boolean synchronizeCodecInteractionsWithQueueing;
/**
* Creates an factory for {@link AsynchronousMediaCodecAdapter} instances.
*
* @param trackType One of {@link C#TRACK_TYPE_AUDIO} or {@link C#TRACK_TYPE_VIDEO}. Used for
* labelling the internal thread accordingly.
- * @param synchronizeCodecInteractionsWithQueueing Whether the adapter should synchronize {@link
- * MediaCodec} interactions with asynchronous buffer queueing. When {@code true}, codec
- * interactions will wait until all input buffers pending queueing wil be submitted to the
- * {@link MediaCodec}.
*/
- public Factory(@C.TrackType int trackType, boolean synchronizeCodecInteractionsWithQueueing) {
+ public Factory(@C.TrackType int trackType) {
this(
/* callbackThreadSupplier= */ () ->
new HandlerThread(createCallbackThreadLabel(trackType)),
/* queueingThreadSupplier= */ () ->
- new HandlerThread(createQueueingThreadLabel(trackType)),
- synchronizeCodecInteractionsWithQueueing);
+ new HandlerThread(createQueueingThreadLabel(trackType)));
}
@VisibleForTesting
/* package */ Factory(
Supplier callbackThreadSupplier,
- Supplier queueingThreadSupplier,
- boolean synchronizeCodecInteractionsWithQueueing) {
+ Supplier queueingThreadSupplier) {
this.callbackThreadSupplier = callbackThreadSupplier;
this.queueingThreadSupplier = queueingThreadSupplier;
- this.synchronizeCodecInteractionsWithQueueing = synchronizeCodecInteractionsWithQueueing;
}
@Override
@@ -95,10 +87,7 @@ import java.nio.ByteBuffer;
codec = MediaCodec.createByCodecName(codecName);
codecAdapter =
new AsynchronousMediaCodecAdapter(
- codec,
- callbackThreadSupplier.get(),
- queueingThreadSupplier.get(),
- synchronizeCodecInteractionsWithQueueing);
+ codec, callbackThreadSupplier.get(), queueingThreadSupplier.get());
TraceUtil.endSection();
codecAdapter.initialize(
configuration.mediaFormat,
@@ -130,19 +119,14 @@ import java.nio.ByteBuffer;
private final MediaCodec codec;
private final AsynchronousMediaCodecCallback asynchronousMediaCodecCallback;
private final AsynchronousMediaCodecBufferEnqueuer bufferEnqueuer;
- private final boolean synchronizeCodecInteractionsWithQueueing;
private boolean codecReleased;
private @State int state;
private AsynchronousMediaCodecAdapter(
- MediaCodec codec,
- HandlerThread callbackThread,
- HandlerThread enqueueingThread,
- boolean synchronizeCodecInteractionsWithQueueing) {
+ MediaCodec codec, HandlerThread callbackThread, HandlerThread enqueueingThread) {
this.codec = codec;
this.asynchronousMediaCodecCallback = new AsynchronousMediaCodecCallback(callbackThread);
this.bufferEnqueuer = new AsynchronousMediaCodecBufferEnqueuer(codec, enqueueingThread);
- this.synchronizeCodecInteractionsWithQueueing = synchronizeCodecInteractionsWithQueueing;
this.state = STATE_CREATED;
}
@@ -250,7 +234,6 @@ import java.nio.ByteBuffer;
@Override
public void setOnFrameRenderedListener(OnFrameRenderedListener listener, Handler handler) {
- maybeBlockOnQueueing();
codec.setOnFrameRenderedListener(
(codec, presentationTimeUs, nanoTime) ->
listener.onFrameRendered(
@@ -260,26 +243,22 @@ import java.nio.ByteBuffer;
@Override
public void setOutputSurface(Surface surface) {
- maybeBlockOnQueueing();
codec.setOutputSurface(surface);
}
@Override
public void setParameters(Bundle params) {
- maybeBlockOnQueueing();
codec.setParameters(params);
}
@Override
public void setVideoScalingMode(@C.VideoScalingMode int scalingMode) {
- maybeBlockOnQueueing();
codec.setVideoScalingMode(scalingMode);
}
@Override
@RequiresApi(26)
public PersistableBundle getMetrics() {
- maybeBlockOnQueueing();
return codec.getMetrics();
}
@@ -293,19 +272,6 @@ import java.nio.ByteBuffer;
asynchronousMediaCodecCallback.onOutputFormatChanged(codec, format);
}
- private void maybeBlockOnQueueing() {
- if (synchronizeCodecInteractionsWithQueueing) {
- try {
- bufferEnqueuer.waitUntilQueueingComplete();
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- // The playback thread should not be interrupted. Raising this as an
- // IllegalStateException.
- throw new IllegalStateException(e);
- }
- }
- }
-
private static String createCallbackThreadLabel(@C.TrackType int trackType) {
return createThreadLabel(trackType, /* prefix= */ "ExoPlayer:MediaCodecAsyncAdapter:");
}
diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/DefaultMediaCodecAdapterFactory.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/DefaultMediaCodecAdapterFactory.java
index 0bca3b7140..ec46fadd8e 100644
--- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/DefaultMediaCodecAdapterFactory.java
+++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/DefaultMediaCodecAdapterFactory.java
@@ -54,7 +54,6 @@ public final class DefaultMediaCodecAdapterFactory implements MediaCodecAdapter.
private static final String TAG = "DMCodecAdapterFactory";
private @Mode int asynchronousMode;
- private boolean enableSynchronizeCodecInteractionsWithQueueing;
public DefaultMediaCodecAdapterFactory() {
asynchronousMode = MODE_DEFAULT;
@@ -84,18 +83,6 @@ public final class DefaultMediaCodecAdapterFactory implements MediaCodecAdapter.
return this;
}
- /**
- * Enable synchronizing codec interactions with asynchronous buffer queueing.
- *
- * This method is experimental, and will be renamed or removed in a future release.
- *
- * @param enabled Whether codec interactions will be synchronized with asynchronous buffer
- * queueing.
- */
- public void experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean enabled) {
- enableSynchronizeCodecInteractionsWithQueueing = enabled;
- }
-
@Override
public MediaCodecAdapter createAdapter(MediaCodecAdapter.Configuration configuration)
throws IOException {
@@ -108,8 +95,7 @@ public final class DefaultMediaCodecAdapterFactory implements MediaCodecAdapter.
"Creating an asynchronous MediaCodec adapter for track type "
+ Util.getTrackTypeString(trackType));
AsynchronousMediaCodecAdapter.Factory factory =
- new AsynchronousMediaCodecAdapter.Factory(
- trackType, enableSynchronizeCodecInteractionsWithQueueing);
+ new AsynchronousMediaCodecAdapter.Factory(trackType);
return factory.createAdapter(configuration);
}
return new SynchronousMediaCodecAdapter.Factory().createAdapter(configuration);
diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/mediacodec/AsynchronousMediaCodecAdapterTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/mediacodec/AsynchronousMediaCodecAdapterTest.java
index f8e52ca4c6..1656f0b0fe 100644
--- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/mediacodec/AsynchronousMediaCodecAdapterTest.java
+++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/mediacodec/AsynchronousMediaCodecAdapterTest.java
@@ -53,8 +53,7 @@ public class AsynchronousMediaCodecAdapterTest {
adapter =
new AsynchronousMediaCodecAdapter.Factory(
/* callbackThreadSupplier= */ () -> callbackThread,
- /* queueingThreadSupplier= */ () -> queueingThread,
- /* synchronizeCodecInteractionsWithQueueing= */ false)
+ /* queueingThreadSupplier= */ () -> queueingThread)
.createAdapter(configuration);
bufferInfo = new MediaCodec.BufferInfo();
// After starting the MediaCodec, the ShadowMediaCodec offers input buffer 0. We advance the
@@ -222,6 +221,6 @@ public class AsynchronousMediaCodecAdapterTest {
Integer.TYPE, Integer.TYPE, String.class);
constructor.setAccessible(true);
return constructor.newInstance(
- /* errorCode= */ 0, /* actionCode= */ 0, /* detailMessage= */ "error from codec");
+ /* errorCode */ 0, /* actionCode */ 0, /* detailMessage */ "error from codec");
}
}