diff --git a/libraries/common/src/main/java/androidx/media3/common/util/GlUtil.java b/libraries/common/src/main/java/androidx/media3/common/util/GlUtil.java index 38cf24299b..ac349145e2 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/GlUtil.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/GlUtil.java @@ -645,6 +645,14 @@ public final class GlUtil { return fboId[0]; } + /** Deletes a framebuffer. */ + public static void deleteFbo(int fboId) throws GlException { + int[] fboIdArray = new int[1]; + fboIdArray[0] = fboId; + GLES20.glDeleteFramebuffers(/* n= */ 1, fboIdArray, /* offset= */ 0); + checkGlError(); + } + /** * Throws a {@link GlException} with the given message if {@code expression} evaluates to {@code * false}. diff --git a/libraries/effect/src/main/java/androidx/media3/effect/FrameCacheGlShaderProgram.java b/libraries/effect/src/main/java/androidx/media3/effect/FrameCacheGlShaderProgram.java index 781bbaa9d0..1e1fd5d55e 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/FrameCacheGlShaderProgram.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/FrameCacheGlShaderProgram.java @@ -205,6 +205,7 @@ import java.util.concurrent.Executor; while (allTextures.hasNext()) { TextureInfo textureInfo = allTextures.next(); GlUtil.deleteTexture(textureInfo.texId); + GlUtil.deleteFbo(textureInfo.fboId); } freeOutputTextures.clear(); inUseOutputTextures.clear(); diff --git a/libraries/effect/src/main/java/androidx/media3/effect/SingleFrameGlShaderProgram.java b/libraries/effect/src/main/java/androidx/media3/effect/SingleFrameGlShaderProgram.java index 46ec6506dd..f4b2e86d73 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/SingleFrameGlShaderProgram.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/SingleFrameGlShaderProgram.java @@ -156,6 +156,7 @@ public abstract class SingleFrameGlShaderProgram implements GlShaderProgram { || outputSize.getHeight() != outputTexture.height) { if (outputTexture != null) { GlUtil.deleteTexture(outputTexture.texId); + GlUtil.deleteFbo(outputTexture.fboId); } int outputTexId = GlUtil.createTexture(outputSize.getWidth(), outputSize.getHeight(), useHdr); int outputFboId = GlUtil.createFboForTexture(outputTexId); @@ -189,6 +190,7 @@ public abstract class SingleFrameGlShaderProgram implements GlShaderProgram { if (outputTexture != null) { try { GlUtil.deleteTexture(outputTexture.texId); + GlUtil.deleteFbo(outputTexture.fboId); } catch (GlUtil.GlException e) { throw new VideoFrameProcessingException(e); }