From e63a0c6e3ad15e6ff6d3e1a1bdd30c9e27a71506 Mon Sep 17 00:00:00 2001 From: USAMAWIZARD Date: Tue, 31 Mar 2026 12:35:59 +0530 Subject: [PATCH 1/2] clear renderer on released --- .../core/WebRTCClient.java | 9 +++++--- .../src/main/java/org/webrtc/EglRenderer.java | 5 +++++ .../WebRTCClientTest.java | 22 +++++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/core/WebRTCClient.java b/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/core/WebRTCClient.java index 8e6c929f..9037e847 100644 --- a/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/core/WebRTCClient.java +++ b/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/core/WebRTCClient.java @@ -1217,13 +1217,16 @@ public void releaseRenderer(SurfaceViewRenderer renderer, VideoTrack track, Vide VideoTrack videoTrack = (track != null) ? track : (VideoTrack) renderer.getTag(); VideoSink videoSink = (sink != null) ? sink : (VideoSink) renderer.getTag(renderer.getId()); - if (videoTrack != null && videoSink != null) + + if (videoTrack != null && videoSink != null) { videoTrack.removeSink(videoSink); - renderer.clearAnimation(); - mainHandler.postAtFrontOfQueue(renderer::clearImage); + } + renderer.clearAnimation(); + renderer.clearImage(); renderer.release(); renderer.setTag(null); + renderer.setTag(renderer.getId(), null); }); } diff --git a/webrtc-android-framework/src/main/java/org/webrtc/EglRenderer.java b/webrtc-android-framework/src/main/java/org/webrtc/EglRenderer.java index 5ab0868e..26f19d9c 100644 --- a/webrtc-android-framework/src/main/java/org/webrtc/EglRenderer.java +++ b/webrtc-android-framework/src/main/java/org/webrtc/EglRenderer.java @@ -289,6 +289,11 @@ public void release() { renderThreadHandler.removeCallbacks(logStatisticsRunnable); // Release EGL and GL resources on render thread. renderThreadHandler.postAtFrontOfQueue(() -> { + // Clear surface before EGL teardown so the last video frame is not left visible. + if (eglBase != null && eglBase.hasSurface()) { + eglBase.makeCurrent(); + clearSurfaceOnRenderThread(0 /* red */, 0 /* green */, 0 /* blue */, 0 /* alpha */); + } // Detach current shader program. synchronized (EglBase.lock) { GLES20.glUseProgram(/* program= */ 0); diff --git a/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java b/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java index b59bc10b..9e576f7f 100644 --- a/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java +++ b/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java @@ -1301,6 +1301,28 @@ public void releaseRendererTest() throws NoSuchFieldException, IllegalAccessEx verify(renderer).clearImage(); verify(renderer).release(); verify(renderer).setTag(null); + verify(renderer).setTag(renderer.getId(), null); + } + + @Test + public void releaseRenderer_withoutTrackAndSink_stillClearsAndReleases() + throws NoSuchFieldException, IllegalAccessException { + SurfaceViewRenderer renderer = mock(SurfaceViewRenderer.class); + when(renderer.getId()).thenReturn(2); + when(renderer.getTag()).thenReturn(null); + when(renderer.getTag(2)).thenReturn(null); + + Field field = WebRTCClient.class.getDeclaredField("mainHandler"); + field.setAccessible(true); + field.set(webRTCClient, getMockHandler()); + + webRTCClient.releaseRenderer(renderer); + + verify(renderer).clearAnimation(); + verify(renderer).clearImage(); + verify(renderer).release(); + verify(renderer).setTag(null); + verify(renderer).setTag(2, null); } @Test From 91855a43dc8a25697c3495083890a605655c6b44 Mon Sep 17 00:00:00 2001 From: USAMAWIZARD Date: Tue, 31 Mar 2026 12:55:58 +0530 Subject: [PATCH 2/2] clear renderer on released --- .../io/antmedia/webrtcandroidframework/WebRTCClientTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java b/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java index 9e576f7f..c4fef127 100644 --- a/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java +++ b/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java @@ -1301,7 +1301,7 @@ public void releaseRendererTest() throws NoSuchFieldException, IllegalAccessEx verify(renderer).clearImage(); verify(renderer).release(); verify(renderer).setTag(null); - verify(renderer).setTag(renderer.getId(), null); + verify(renderer).setTag(1, null); } @Test