| Index: webrtc/api/java/android/org/webrtc/SurfaceTextureHelper.java
|
| diff --git a/webrtc/api/java/android/org/webrtc/SurfaceTextureHelper.java b/webrtc/api/java/android/org/webrtc/SurfaceTextureHelper.java
|
| index 3f5617d42004f7dd7a4af45214cc726f03a9ac3d..2955f7412d10f8be22a324536f777eb0e13a69b2 100644
|
| --- a/webrtc/api/java/android/org/webrtc/SurfaceTextureHelper.java
|
| +++ b/webrtc/api/java/android/org/webrtc/SurfaceTextureHelper.java
|
| @@ -293,6 +293,19 @@ class SurfaceTextureHelper {
|
| private boolean hasPendingTexture = false;
|
| private volatile boolean isTextureInUse = false;
|
| private boolean isQuitting = false;
|
| + // |pendingListener| is set in setListener() and the runnable is posted to the handler thread.
|
| + // setListener() is not allowed to be called again before stopListening(), so this is thread safe.
|
| + private OnTextureFrameAvailableListener pendingListener;
|
| + final Runnable setListenerRunnable = new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + Logging.d(TAG, "Setting listener to " + pendingListener);
|
| + listener = pendingListener;
|
| + pendingListener = null;
|
| + // May alredy have a pending frame - try delivering it.
|
| + tryDeliverTextureFrame();
|
| + }
|
| + };
|
|
|
| private SurfaceTextureHelper(EglBase.Context sharedContext, Handler handler) {
|
| if (handler.getLooper().getThread() != Thread.currentThread()) {
|
| @@ -332,17 +345,11 @@ class SurfaceTextureHelper {
|
| * call stopListening() first.
|
| */
|
| public void startListening(final OnTextureFrameAvailableListener listener) {
|
| - if (this.listener != null) {
|
| + if (this.listener != null || this.pendingListener != null) {
|
| throw new IllegalStateException("SurfaceTextureHelper listener has already been set.");
|
| }
|
| - handler.post(new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - SurfaceTextureHelper.this.listener = listener;
|
| - // May alredy have a pending frame - try delivering it.
|
| - tryDeliverTextureFrame();
|
| - }
|
| - });
|
| + this.pendingListener = listener;
|
| + handler.post(setListenerRunnable);
|
| }
|
|
|
| /**
|
| @@ -354,7 +361,10 @@ class SurfaceTextureHelper {
|
| if (handler.getLooper().getThread() != Thread.currentThread()) {
|
| throw new IllegalStateException("Wrong thread.");
|
| }
|
| + Logging.d(TAG, "stopListening()");
|
| + handler.removeCallbacks(setListenerRunnable);
|
| this.listener = null;
|
| + this.pendingListener = null;
|
| }
|
|
|
| /**
|
| @@ -401,6 +411,7 @@ class SurfaceTextureHelper {
|
| * guaranteed to not receive any more onTextureFrameAvailable() after this function returns.
|
| */
|
| public void dispose() {
|
| + Logging.d(TAG, "dispose()");
|
| if (handler.getLooper().getThread() == Thread.currentThread()) {
|
| isQuitting = true;
|
| if (!isTextureInUse) {
|
|
|