Make VideoFrame.Buffer implementations lock-free.
Replaces lock-based implementation with AtomicInteger.
Bug: webrtc:7749
Change-Id: I226093b0af2090c080dfd4f87ed8f33a3f9efbd8
Reviewed-on: https://webrtc-review.googlesource.com/64162
Commit-Queue: Sami Kalliomäki <sakal@webrtc.org>
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22798}
diff --git a/sdk/android/api/org/webrtc/JavaI420Buffer.java b/sdk/android/api/org/webrtc/JavaI420Buffer.java
index 3498faf..19dd3e9 100644
--- a/sdk/android/api/org/webrtc/JavaI420Buffer.java
+++ b/sdk/android/api/org/webrtc/JavaI420Buffer.java
@@ -11,6 +11,7 @@
package org.webrtc;
import java.nio.ByteBuffer;
+import javax.annotation.Nullable;
import org.webrtc.VideoFrame.I420Buffer;
/** Implementation of VideoFrame.I420Buffer backed by Java direct byte buffers. */
@@ -23,13 +24,10 @@
private final int strideY;
private final int strideU;
private final int strideV;
- private final Runnable releaseCallback;
- private final Object refCountLock = new Object();
-
- private int refCount;
+ private final RefCountDelegate refCountDelegate;
private JavaI420Buffer(int width, int height, ByteBuffer dataY, int strideY, ByteBuffer dataU,
- int strideU, ByteBuffer dataV, int strideV, Runnable releaseCallback) {
+ int strideU, ByteBuffer dataV, int strideV, @Nullable Runnable releaseCallback) {
this.width = width;
this.height = height;
this.dataY = dataY;
@@ -38,9 +36,7 @@
this.strideY = strideY;
this.strideU = strideU;
this.strideV = strideV;
- this.releaseCallback = releaseCallback;
-
- this.refCount = 1;
+ this.refCountDelegate = new RefCountDelegate(releaseCallback);
}
/** Wraps existing ByteBuffers into JavaI420Buffer object without copying the contents. */
@@ -155,18 +151,12 @@
@Override
public void retain() {
- synchronized (refCountLock) {
- ++refCount;
- }
+ refCountDelegate.retain();
}
@Override
public void release() {
- synchronized (refCountLock) {
- if (--refCount == 0 && releaseCallback != null) {
- releaseCallback.run();
- }
- }
+ refCountDelegate.release();
}
@Override