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..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,6 +1301,28 @@ public void releaseRendererTest() throws NoSuchFieldException, IllegalAccessEx verify(renderer).clearImage(); verify(renderer).release(); verify(renderer).setTag(null); + verify(renderer).setTag(1, 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