From 83b79461300710a98fb7a1eb6115bf32a353b660 Mon Sep 17 00:00:00 2001 From: tofunmi Date: Wed, 15 Feb 2023 11:51:07 +0000 Subject: [PATCH] Move inputExternalSurfaceTexture to the ExternalTextureManager Now that the GLEffectFrameProcessor handles external (video) and internal (image) input, components used only for external input needs should be moved to the ExternalTextureManager for code clarity PiperOrigin-RevId: 509787494 --- .../media3/effect/ExternalTextureManager.java | 21 ++++++++++++++----- .../effect/GlEffectsFrameProcessor.java | 10 ++------- 2 files changed, 18 insertions(+), 13 deletions(-) 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(); } }