From 59744fe788d69211f543baa04923a084439db1ad Mon Sep 17 00:00:00 2001 From: huangdarwin Date: Mon, 21 Aug 2023 13:02:32 +0100 Subject: [PATCH] Effect: Minimize calls to configure in default impl. In case BaseShaderProgram implementations have an expensive configure() call, we can only call configure() when absolutely necessary, aka when the input size changes. To reduce scope, this doesn't reduce the amount of configure() calls that may be made outside this class, in DefaultFrameDroppingShaderProgram and FinalShaderProgramWrapper. PiperOrigin-RevId: 558754314 --- .../media3/effect/BaseGlShaderProgram.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/libraries/effect/src/main/java/androidx/media3/effect/BaseGlShaderProgram.java b/libraries/effect/src/main/java/androidx/media3/effect/BaseGlShaderProgram.java index 774fef4342..008fea8b43 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/BaseGlShaderProgram.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/BaseGlShaderProgram.java @@ -16,6 +16,7 @@ package androidx.media3.effect; import androidx.annotation.CallSuper; +import androidx.media3.common.C; import androidx.media3.common.GlObjectsProvider; import androidx.media3.common.GlTextureInfo; import androidx.media3.common.VideoFrameProcessingException; @@ -46,6 +47,8 @@ public abstract class BaseGlShaderProgram implements GlShaderProgram { private OutputListener outputListener; private ErrorListener errorListener; private Executor errorListenerExecutor; + private int inputWidth; + private int inputHeight; /** * Creates a {@code BaseGlShaderProgram} instance. @@ -61,6 +64,8 @@ public abstract class BaseGlShaderProgram implements GlShaderProgram { outputListener = new OutputListener() {}; errorListener = (frameProcessingException) -> {}; errorListenerExecutor = MoreExecutors.directExecutor(); + inputWidth = C.LENGTH_UNSET; + inputHeight = C.LENGTH_UNSET; } /** @@ -125,9 +130,15 @@ public abstract class BaseGlShaderProgram implements GlShaderProgram { public void queueInputFrame( GlObjectsProvider glObjectsProvider, GlTextureInfo inputTexture, long presentationTimeUs) { try { - Size outputTextureSize = configure(inputTexture.width, inputTexture.height); - outputTexturePool.ensureConfigured( - glObjectsProvider, outputTextureSize.getWidth(), outputTextureSize.getHeight()); + if (inputWidth != inputTexture.width + || inputHeight != inputTexture.height + || !outputTexturePool.isConfigured()) { + inputWidth = inputTexture.width; + inputHeight = inputTexture.height; + Size outputTextureSize = configure(inputTexture.width, inputTexture.height); + outputTexturePool.ensureConfigured( + glObjectsProvider, outputTextureSize.getWidth(), outputTextureSize.getHeight()); + } // Focus on the next free buffer. GlTextureInfo outputTexture = outputTexturePool.useTexture();