diff --git a/sdk/android/api/org/webrtc/EncodedImage.java b/sdk/android/api/org/webrtc/EncodedImage.java index fabf36a60e..b50136c373 100644 --- a/sdk/android/api/org/webrtc/EncodedImage.java +++ b/sdk/android/api/org/webrtc/EncodedImage.java @@ -47,7 +47,6 @@ public class EncodedImage implements RefCounted { } private final RefCountDelegate refCountDelegate; - private final boolean supportsRetain; public final ByteBuffer buffer; public final int encodedWidth; public final int encodedHeight; @@ -69,22 +68,10 @@ public class EncodedImage implements RefCounted { refCountDelegate.release(); } - // A false return value means that the encoder expects that the buffer is no longer used after - // VideoEncoder.Callback.onEncodedFrame returns. @CalledByNative - boolean maybeRetain() { - if (supportsRetain) { - retain(); - return true; - } else { - return false; - } - } - - @CalledByNative - private EncodedImage(ByteBuffer buffer, boolean supportsRetain, - @Nullable Runnable releaseCallback, int encodedWidth, int encodedHeight, long captureTimeNs, - FrameType frameType, int rotation, boolean completeFrame, @Nullable Integer qp) { + private EncodedImage(ByteBuffer buffer, @Nullable Runnable releaseCallback, int encodedWidth, + int encodedHeight, long captureTimeNs, FrameType frameType, int rotation, + boolean completeFrame, @Nullable Integer qp) { this.buffer = buffer; this.encodedWidth = encodedWidth; this.encodedHeight = encodedHeight; @@ -94,7 +81,6 @@ public class EncodedImage implements RefCounted { this.rotation = rotation; this.completeFrame = completeFrame; this.qp = qp; - this.supportsRetain = supportsRetain; this.refCountDelegate = new RefCountDelegate(releaseCallback); } @@ -144,7 +130,6 @@ public class EncodedImage implements RefCounted { public static class Builder { private ByteBuffer buffer; - private boolean supportsRetain; private @Nullable Runnable releaseCallback; private int encodedWidth; private int encodedHeight; @@ -156,18 +141,9 @@ public class EncodedImage implements RefCounted { private Builder() {} - @Deprecated - public Builder setBuffer(ByteBuffer buffer) { - this.buffer = buffer; - this.releaseCallback = null; - this.supportsRetain = false; - return this; - } - public Builder setBuffer(ByteBuffer buffer, @Nullable Runnable releaseCallback) { this.buffer = buffer; this.releaseCallback = releaseCallback; - this.supportsRetain = true; return this; } @@ -213,8 +189,8 @@ public class EncodedImage implements RefCounted { } public EncodedImage createEncodedImage() { - return new EncodedImage(buffer, supportsRetain, releaseCallback, encodedWidth, encodedHeight, - captureTimeNs, frameType, rotation, completeFrame, qp); + return new EncodedImage(buffer, releaseCallback, encodedWidth, encodedHeight, captureTimeNs, + frameType, rotation, completeFrame, qp); } } } diff --git a/sdk/android/api/org/webrtc/RefCounted.java b/sdk/android/api/org/webrtc/RefCounted.java index f854f70b20..0c1c3bf1f9 100644 --- a/sdk/android/api/org/webrtc/RefCounted.java +++ b/sdk/android/api/org/webrtc/RefCounted.java @@ -18,7 +18,7 @@ package org.webrtc; */ public interface RefCounted { /** Increases ref count by one. */ - void retain(); + @CalledByNative void retain(); /** * Decreases ref count by one. When the ref count reaches zero, resources related to the object diff --git a/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoEncoderTest.java b/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoEncoderTest.java index 76a09baf56..1591cae0e6 100644 --- a/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoEncoderTest.java +++ b/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoEncoderTest.java @@ -95,7 +95,7 @@ public class HardwareVideoEncoderTest { bufferCopy.rewind(); frameQueue.offer(EncodedImage.builder() - .setBuffer(bufferCopy) + .setBuffer(bufferCopy, null) .setEncodedWidth(frame.encodedWidth) .setEncodedHeight(frame.encodedHeight) .setCaptureTimeNs(frame.captureTimeNs) diff --git a/sdk/android/src/jni/encoded_image.cc b/sdk/android/src/jni/encoded_image.cc index 5c97bdb19c..e13653ca34 100644 --- a/sdk/android/src/jni/encoded_image.cc +++ b/sdk/android/src/jni/encoded_image.cc @@ -29,7 +29,7 @@ class JavaEncodedImageBuffer : public EncodedImageBufferInterface { const JavaRef& j_encoded_image, const uint8_t* payload, size_t size) - : j_encoded_image_(ScopedJavaRefCounted::Adopt(env, j_encoded_image)), + : j_encoded_image_(ScopedJavaRefCounted::Retain(env, j_encoded_image)), data_(const_cast(payload)), size_(size) {} @@ -65,7 +65,7 @@ ScopedJavaLocalRef NativeToJavaEncodedImage( // TODO(bugs.webrtc.org/9378): Keep a reference to the C++ EncodedImage data, // and use the releaseCallback to manage lifetime. return Java_EncodedImage_Constructor( - jni, buffer, /*supportsRetain=*/true, + jni, buffer, /*releaseCallback=*/ScopedJavaGlobalRef(nullptr), static_cast(image._encodedWidth), static_cast(image._encodedHeight), @@ -90,13 +90,8 @@ EncodedImage JavaToNativeEncodedImage(JNIEnv* env, const size_t buffer_size = env->GetDirectBufferCapacity(j_buffer.obj()); EncodedImage frame; - if (Java_EncodedImage_maybeRetain(env, j_encoded_image)) { - frame.SetEncodedData(new rtc::RefCountedObject( - env, j_encoded_image, buffer, buffer_size)); - } else { - // Encoder doesn't support retain/release, so make a copy. - frame.SetEncodedData(EncodedImageBuffer::Create(buffer, buffer_size)); - } + frame.SetEncodedData(new rtc::RefCountedObject( + env, j_encoded_image, buffer, buffer_size)); frame._encodedWidth = Java_EncodedImage_getEncodedWidth(env, j_encoded_image); frame._encodedHeight = diff --git a/sdk/android/src/jni/scoped_java_ref_counted.cc b/sdk/android/src/jni/scoped_java_ref_counted.cc index aa6d817225..1df8c7ade5 100644 --- a/sdk/android/src/jni/scoped_java_ref_counted.cc +++ b/sdk/android/src/jni/scoped_java_ref_counted.cc @@ -15,12 +15,22 @@ namespace webrtc { namespace jni { +// static +ScopedJavaRefCounted ScopedJavaRefCounted::Retain( + JNIEnv* jni, + const JavaRef& j_object) { + Java_RefCounted_retain(jni, j_object); + CHECK_EXCEPTION(jni) + << "Unexpected java exception from java JavaRefCounted.retain()"; + return Adopt(jni, j_object); +} + ScopedJavaRefCounted::~ScopedJavaRefCounted() { if (!j_object_.is_null()) { JNIEnv* jni = AttachCurrentThreadIfNeeded(); Java_RefCounted_release(jni, j_object_); CHECK_EXCEPTION(jni) - << "Unexpected java exception from ScopedJavaRefCounted.release()"; + << "Unexpected java exception from java RefCounted.release()"; } } diff --git a/sdk/android/src/jni/scoped_java_ref_counted.h b/sdk/android/src/jni/scoped_java_ref_counted.h index a5f7ae0e62..4f8f1831b4 100644 --- a/sdk/android/src/jni/scoped_java_ref_counted.h +++ b/sdk/android/src/jni/scoped_java_ref_counted.h @@ -20,11 +20,14 @@ namespace jni { class ScopedJavaRefCounted { public: // Takes over the caller's reference. - static ScopedJavaRefCounted Adopt(JNIEnv* env, + static ScopedJavaRefCounted Adopt(JNIEnv* jni, const JavaRef& j_object) { - return ScopedJavaRefCounted(env, j_object); + return ScopedJavaRefCounted(jni, j_object); } + // Retains the java object for the live time of this object. + static ScopedJavaRefCounted Retain(JNIEnv* jni, + const JavaRef& j_object); ScopedJavaRefCounted(ScopedJavaRefCounted&& other) = default; // TODO(nisse): Implement move assignment and copy operations when needed. @@ -35,8 +38,8 @@ class ScopedJavaRefCounted { private: // Adopts reference. - ScopedJavaRefCounted(JNIEnv* env, const JavaRef& j_object) - : j_object_(env, j_object) {} + ScopedJavaRefCounted(JNIEnv* jni, const JavaRef& j_object) + : j_object_(jni, j_object) {} ScopedJavaGlobalRef j_object_; }; diff --git a/sdk/android/tests/src/org/webrtc/AndroidVideoDecoderTest.java b/sdk/android/tests/src/org/webrtc/AndroidVideoDecoderTest.java index b818a3e841..2af5a2029d 100644 --- a/sdk/android/tests/src/org/webrtc/AndroidVideoDecoderTest.java +++ b/sdk/android/tests/src/org/webrtc/AndroidVideoDecoderTest.java @@ -185,7 +185,7 @@ public class AndroidVideoDecoderTest { private EncodedImage createTestEncodedImage() { return EncodedImage.builder() - .setBuffer(ByteBuffer.wrap(ENCODED_TEST_DATA)) + .setBuffer(ByteBuffer.wrap(ENCODED_TEST_DATA), null) .setFrameType(FrameType.VideoFrameKey) .setCompleteFrame(true) .createEncodedImage();