diff --git a/webrtc/sdk/android/api/org/webrtc/EglRenderer.java b/webrtc/sdk/android/api/org/webrtc/EglRenderer.java index 31faedcc4a..083b1ca076 100644 --- a/webrtc/sdk/android/api/org/webrtc/EglRenderer.java +++ b/webrtc/sdk/android/api/org/webrtc/EglRenderer.java @@ -639,7 +639,7 @@ public class EglRenderer implements VideoRenderer.Callbacks, VideoSink { } notifyCallbacks(frame, isYuvBuffer, yuvTextures, shouldRenderFrame); - frame.release(); + buffer.release(); } private void notifyCallbacks( diff --git a/webrtc/sdk/android/src/java/org/webrtc/I420BufferImpl.java b/webrtc/sdk/android/src/java/org/webrtc/I420BufferImpl.java index f2677f2fcd..2f545e9d64 100644 --- a/webrtc/sdk/android/src/java/org/webrtc/I420BufferImpl.java +++ b/webrtc/sdk/android/src/java/org/webrtc/I420BufferImpl.java @@ -24,6 +24,7 @@ class I420BufferImpl implements VideoFrame.I420Buffer { private final int strideU; private final int strideV; private final Runnable releaseCallback; + private final Object refCountLock = new Object(); private int refCount; @@ -116,13 +117,17 @@ class I420BufferImpl implements VideoFrame.I420Buffer { @Override public void retain() { - ++refCount; + synchronized (refCountLock) { + ++refCount; + } } @Override public void release() { - if (--refCount == 0 && releaseCallback != null) { - releaseCallback.run(); + synchronized (refCountLock) { + if (--refCount == 0 && releaseCallback != null) { + releaseCallback.run(); + } } } diff --git a/webrtc/sdk/android/src/java/org/webrtc/NV12Buffer.java b/webrtc/sdk/android/src/java/org/webrtc/NV12Buffer.java index 7575929cba..af9ac253f1 100644 --- a/webrtc/sdk/android/src/java/org/webrtc/NV12Buffer.java +++ b/webrtc/sdk/android/src/java/org/webrtc/NV12Buffer.java @@ -19,6 +19,7 @@ public class NV12Buffer implements VideoFrame.Buffer { private final int sliceHeight; private final ByteBuffer buffer; private final Runnable releaseCallback; + private final Object refCountLock = new Object(); private int refCount; @@ -51,13 +52,17 @@ public class NV12Buffer implements VideoFrame.Buffer { @Override public void retain() { - refCount++; + synchronized (refCountLock) { + ++refCount; + } } @Override public void release() { - if (--refCount == 0) { - releaseCallback.run(); + synchronized (refCountLock) { + if (--refCount == 0 && releaseCallback != null) { + releaseCallback.run(); + } } } @@ -75,4 +80,4 @@ public class NV12Buffer implements VideoFrame.Buffer { int scaleWidth, int scaleHeight, ByteBuffer src, int srcWidth, int srcHeight, int srcStride, int srcSliceHeight, ByteBuffer dstY, int dstStrideY, ByteBuffer dstU, int dstStrideU, ByteBuffer dstV, int dstStrideV); -} \ No newline at end of file +} diff --git a/webrtc/sdk/android/src/java/org/webrtc/TextureBufferImpl.java b/webrtc/sdk/android/src/java/org/webrtc/TextureBufferImpl.java index ebcb22ff9c..c2b2010ef2 100644 --- a/webrtc/sdk/android/src/java/org/webrtc/TextureBufferImpl.java +++ b/webrtc/sdk/android/src/java/org/webrtc/TextureBufferImpl.java @@ -25,6 +25,7 @@ class TextureBufferImpl implements VideoFrame.TextureBuffer { private final Matrix transformMatrix; private final SurfaceTextureHelper surfaceTextureHelper; private final Runnable releaseCallback; + private final Object refCountLock = new Object(); private int refCount; public TextureBufferImpl(int width, int height, Type type, int id, Matrix transformMatrix, @@ -102,13 +103,17 @@ class TextureBufferImpl implements VideoFrame.TextureBuffer { @Override public void retain() { - ++refCount; + synchronized (refCountLock) { + ++refCount; + } } @Override public void release() { - if (--refCount == 0) { - releaseCallback.run(); + synchronized (refCountLock) { + if (--refCount == 0 && releaseCallback != null) { + releaseCallback.run(); + } } }