| Index: webrtc/api/android/java/src/org/webrtc/EglRenderer.java
|
| diff --git a/webrtc/api/android/java/src/org/webrtc/EglRenderer.java b/webrtc/api/android/java/src/org/webrtc/EglRenderer.java
|
| index b6dd649a5204bfddbd9323918f81dc2dc8bfd25a..abfbf7607d29083e9c0628dfffacc514bfb08057 100644
|
| --- a/webrtc/api/android/java/src/org/webrtc/EglRenderer.java
|
| +++ b/webrtc/api/android/java/src/org/webrtc/EglRenderer.java
|
| @@ -76,7 +76,6 @@ public class EglRenderer implements VideoRenderer.Callbacks {
|
| private final Object handlerLock = new Object();
|
| private Handler renderThreadHandler;
|
|
|
| - private final Object frameListenerLock = new Object();
|
| private final ArrayList<ScaleAndFrameListener> frameListeners = new ArrayList<>();
|
|
|
| // Variables for fps reduction.
|
| @@ -366,27 +365,37 @@ public class EglRenderer implements VideoRenderer.Callbacks {
|
| * @param scale The scale of the Bitmap passed to the callback, or 0 if no Bitmap is
|
| * required.
|
| */
|
| - public void addFrameListener(FrameListener listener, float scale) {
|
| - synchronized (frameListenerLock) {
|
| - frameListeners.add(new ScaleAndFrameListener(scale, listener));
|
| - }
|
| + public void addFrameListener(final FrameListener listener, final float scale) {
|
| + postToRenderThread(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + frameListeners.add(new ScaleAndFrameListener(scale, listener));
|
| + }
|
| + });
|
| }
|
|
|
| /**
|
| * Remove any pending callback that was added with addFrameListener. If the callback is not in
|
| - * the queue, nothing happens.
|
| + * the queue, nothing happens. It is ensured that callback won't be called after this method
|
| + * returns.
|
| *
|
| * @param runnable The callback to remove.
|
| */
|
| - public void removeFrameListener(FrameListener listener) {
|
| - synchronized (frameListenerLock) {
|
| - final Iterator<ScaleAndFrameListener> iter = frameListeners.iterator();
|
| - while (iter.hasNext()) {
|
| - if (iter.next().listener == listener) {
|
| - iter.remove();
|
| + public void removeFrameListener(final FrameListener listener) {
|
| + final CountDownLatch latch = new CountDownLatch(1);
|
| + postToRenderThread(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + latch.countDown();
|
| + final Iterator<ScaleAndFrameListener> iter = frameListeners.iterator();
|
| + while (iter.hasNext()) {
|
| + if (iter.next().listener == listener) {
|
| + iter.remove();
|
| + }
|
| }
|
| }
|
| - }
|
| + });
|
| + ThreadUtils.awaitUninterruptibly(latch);
|
| }
|
|
|
| // VideoRenderer.Callbacks interface.
|
| @@ -606,12 +615,10 @@ public class EglRenderer implements VideoRenderer.Callbacks {
|
| // Make temporary copy of callback list to avoid ConcurrentModificationException, in case
|
| // callbacks call addFramelistener or removeFrameListener.
|
| final ArrayList<ScaleAndFrameListener> tmpList;
|
| - synchronized (frameListenerLock) {
|
| - if (frameListeners.isEmpty())
|
| - return;
|
| - tmpList = new ArrayList<>(frameListeners);
|
| - frameListeners.clear();
|
| - }
|
| + if (frameListeners.isEmpty())
|
| + return;
|
| + tmpList = new ArrayList<>(frameListeners);
|
| + frameListeners.clear();
|
|
|
| final float[] bitmapMatrix = RendererCommon.multiplyMatrices(
|
| RendererCommon.multiplyMatrices(texMatrix,
|
|
|