From f9fd8badec5557ad43f9eee6893c65bfc8ea40af Mon Sep 17 00:00:00 2001 From: dancho Date: Wed, 6 Nov 2024 03:12:49 -0800 Subject: [PATCH] Prevent repeated release of the same EGLContext All instances of PlaybackVideoGraphWrapper use the same VIDEO_FRAME_PROCESSOR_FACTORY_SUPPLIER which uses the same DefaultGlObjectsProvider. Each call to DefaultGlObjectsProvider.release() releases all previously created EGLContexts. Lazily create a new DefaultGlObjectsProvider for each DefaultVideoFrameProcessor (not one per factory). PiperOrigin-RevId: 693658458 --- .../media3/effect/DefaultVideoFrameProcessor.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoFrameProcessor.java b/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoFrameProcessor.java index 9b88154a77..aca51b488d 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoFrameProcessor.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoFrameProcessor.java @@ -327,7 +327,7 @@ public final class DefaultVideoFrameProcessor implements VideoFrameProcessor { return new DefaultVideoFrameProcessor.Factory( sdrWorkingColorSpace, /* repeatLastRegisteredFrame= */ !requireRegisteringAllInputFrames, - glObjectsProvider == null ? new DefaultGlObjectsProvider() : glObjectsProvider, + glObjectsProvider, executorService, textureOutputListener, textureOutputCapacity, @@ -338,7 +338,7 @@ public final class DefaultVideoFrameProcessor implements VideoFrameProcessor { private final @WorkingColorSpace int sdrWorkingColorSpace; private final boolean repeatLastRegisteredFrame; - private final GlObjectsProvider glObjectsProvider; + @Nullable private final GlObjectsProvider glObjectsProvider; @Nullable private final ExecutorService executorService; @Nullable private final GlTextureProducer.Listener textureOutputListener; private final int textureOutputCapacity; @@ -348,7 +348,7 @@ public final class DefaultVideoFrameProcessor implements VideoFrameProcessor { private Factory( @WorkingColorSpace int sdrWorkingColorSpace, boolean repeatLastRegisteredFrame, - GlObjectsProvider glObjectsProvider, + @Nullable GlObjectsProvider glObjectsProvider, @Nullable ExecutorService executorService, @Nullable GlTextureProducer.Listener textureOutputListener, int textureOutputCapacity, @@ -411,6 +411,9 @@ public final class DefaultVideoFrameProcessor implements VideoFrameProcessor { new VideoFrameProcessingTaskExecutor( instanceExecutorService, shouldShutdownExecutorService, listener::onError); + GlObjectsProvider glObjectsProvider = + this.glObjectsProvider == null ? new DefaultGlObjectsProvider() : this.glObjectsProvider; + Future defaultVideoFrameProcessorFuture = instanceExecutorService.submit( () ->