diff --git a/libraries/effect/src/main/java/androidx/media3/effect/ExternalTextureManager.java b/libraries/effect/src/main/java/androidx/media3/effect/ExternalTextureManager.java index 51060d9dee..52f3b6bdbb 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/ExternalTextureManager.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/ExternalTextureManager.java @@ -18,6 +18,7 @@ package androidx.media3.effect; import static androidx.media3.common.util.Assertions.checkStateNotNull; import android.graphics.SurfaceTexture; +import android.view.Surface; import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; import androidx.media3.common.C; @@ -39,6 +40,7 @@ import java.util.concurrent.atomic.AtomicInteger; private final FrameProcessingTaskExecutor frameProcessingTaskExecutor; private final ExternalShaderProgram externalShaderProgram; private final int externalTexId; + private final Surface surface; private final SurfaceTexture surfaceTexture; private final float[] textureTransformMatrix; private final Queue pendingFrames; @@ -71,6 +73,8 @@ import java.util.concurrent.atomic.AtomicInteger; * @param frameProcessingTaskExecutor The {@link FrameProcessingTaskExecutor}. * @throws FrameProcessingException If a problem occurs while creating the external texture. */ + // The onFrameAvailableListener will not be invoked until the constructor returns. + @SuppressWarnings("nullness:method.invocation.invalid") public ExternalTextureManager( ExternalShaderProgram externalShaderProgram, FrameProcessingTaskExecutor frameProcessingTaskExecutor) @@ -86,11 +90,7 @@ import java.util.concurrent.atomic.AtomicInteger; textureTransformMatrix = new float[16]; pendingFrames = new ConcurrentLinkedQueue<>(); externalShaderProgramInputCapacity = new AtomicInteger(); - previousStreamOffsetUs = C.TIME_UNSET; - } - - public SurfaceTexture getSurfaceTexture() { surfaceTexture.setOnFrameAvailableListener( unused -> frameProcessingTaskExecutor.submit( @@ -104,7 +104,17 @@ import java.util.concurrent.atomic.AtomicInteger; maybeQueueFrameToExternalShaderProgram(); } })); - return surfaceTexture; + surface = new Surface(surfaceTexture); + } + + /** See {@link GlEffectsFrameProcessor#setInputDefaultBufferSize}. */ + public void setDefaultBufferSize(int width, int height) { + surfaceTexture.setDefaultBufferSize(width, height); + } + + /** Returns the {@linkplain Surface input surface} that wraps the external texture. */ + public Surface getInputSurface() { + return surface; } @Override @@ -173,6 +183,7 @@ import java.util.concurrent.atomic.AtomicInteger; public void release() { surfaceTexture.release(); + surface.release(); } @WorkerThread diff --git a/libraries/effect/src/main/java/androidx/media3/effect/GlEffectsFrameProcessor.java b/libraries/effect/src/main/java/androidx/media3/effect/GlEffectsFrameProcessor.java index 5b5c3ad449..968c4f3133 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/GlEffectsFrameProcessor.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/GlEffectsFrameProcessor.java @@ -358,8 +358,6 @@ public final class GlEffectsFrameProcessor implements FrameProcessor { private final FrameProcessingTaskExecutor frameProcessingTaskExecutor; private @MonotonicNonNull InternalTextureManager inputInternalTextureManager; private @MonotonicNonNull ExternalTextureManager inputExternalTextureManager; - // TODO(262693274): Move this variable to ExternalTextureManager. - private @MonotonicNonNull Surface inputExternalSurface; private final boolean releaseFramesAutomatically; private final FinalMatrixShaderProgramWrapper finalShaderProgramWrapper; private final ImmutableList allShaderPrograms; @@ -398,7 +396,6 @@ public final class GlEffectsFrameProcessor implements FrameProcessor { new ExternalTextureManager( (ExternalShaderProgram) inputShaderProgram, frameProcessingTaskExecutor); inputShaderProgram.setInputListener(inputExternalTextureManager); - inputExternalSurface = new Surface(inputExternalTextureManager.getSurfaceTexture()); } else { inputInternalTextureManager = new InternalTextureManager(inputShaderProgram, frameProcessingTaskExecutor); @@ -432,9 +429,7 @@ public final class GlEffectsFrameProcessor implements FrameProcessor { * @param height The default height for input buffers, in pixels. */ public void setInputDefaultBufferSize(int width, int height) { - checkNotNull(inputExternalTextureManager) - .getSurfaceTexture() - .setDefaultBufferSize(width, height); + checkNotNull(inputExternalTextureManager).setDefaultBufferSize(width, height); } @Override @@ -445,7 +440,7 @@ public final class GlEffectsFrameProcessor implements FrameProcessor { @Override public Surface getInputSurface() { - return checkNotNull(inputExternalSurface); + return checkNotNull(inputExternalTextureManager).getInputSurface(); } @Override @@ -523,7 +518,6 @@ public final class GlEffectsFrameProcessor implements FrameProcessor { } if (inputExternalTextureManager != null) { inputExternalTextureManager.release(); - checkNotNull(inputExternalSurface).release(); } }