From 28ec6bdce85edbd63d0483fd34ed3c0c31eadca6 Mon Sep 17 00:00:00 2001 From: sakal Date: Wed, 9 Nov 2016 01:47:12 -0800 Subject: [PATCH] Make releaseEglSurface in EglRenderer asynchronous. BUG=webrtc:6470 Review-Url: https://codereview.webrtc.org/2483143002 Cr-Commit-Position: refs/heads/master@{#14993} --- .../api/android/java/src/org/webrtc/EglRenderer.java | 10 ++++------ .../java/src/org/webrtc/SurfaceViewRenderer.java | 10 +++++++++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/webrtc/api/android/java/src/org/webrtc/EglRenderer.java b/webrtc/api/android/java/src/org/webrtc/EglRenderer.java index 9fb035b34b..65961bb560 100644 --- a/webrtc/api/android/java/src/org/webrtc/EglRenderer.java +++ b/webrtc/api/android/java/src/org/webrtc/EglRenderer.java @@ -435,8 +435,7 @@ public class EglRenderer implements VideoRenderer.Callbacks { /** * Release EGL surface. This function will block until the EGL surface is released. */ - public void releaseEglSurface() { - final CountDownLatch completionLatch = new CountDownLatch(1); + public void releaseEglSurface(final Runnable completionCallback) { // Ensure that the render thread is no longer touching the Surface before returning from this // function. eglSurfaceCreationRunnable.setSurface(null /* surface */); @@ -450,14 +449,13 @@ public class EglRenderer implements VideoRenderer.Callbacks { eglBase.detachCurrent(); eglBase.releaseSurface(); } - completionLatch.countDown(); + completionCallback.run(); } }); - } else { - completionLatch.countDown(); + return; } } - ThreadUtils.awaitUninterruptibly(completionLatch); + completionCallback.run(); } /** diff --git a/webrtc/api/android/java/src/org/webrtc/SurfaceViewRenderer.java b/webrtc/api/android/java/src/org/webrtc/SurfaceViewRenderer.java index 428198d9ec..9fee0d0039 100644 --- a/webrtc/api/android/java/src/org/webrtc/SurfaceViewRenderer.java +++ b/webrtc/api/android/java/src/org/webrtc/SurfaceViewRenderer.java @@ -16,6 +16,7 @@ import android.graphics.Point; import android.util.AttributeSet; import android.view.SurfaceHolder; import android.view.SurfaceView; +import java.util.concurrent.CountDownLatch; /** * Implements org.webrtc.VideoRenderer.Callbacks by displaying the video stream on a SurfaceView. @@ -159,7 +160,14 @@ public class SurfaceViewRenderer @Override public void surfaceDestroyed(SurfaceHolder holder) { ThreadUtils.checkIsOnMainThread(); - eglRenderer.releaseEglSurface(); + final CountDownLatch completionLatch = new CountDownLatch(1); + eglRenderer.releaseEglSurface(new Runnable() { + @Override + public void run() { + completionLatch.countDown(); + } + }); + ThreadUtils.awaitUninterruptibly(completionLatch); } @Override