Index: webrtc/sdk/android/src/jni/native_handle_impl.cc |
diff --git a/webrtc/sdk/android/src/jni/native_handle_impl.cc b/webrtc/sdk/android/src/jni/native_handle_impl.cc |
index eebfba403575bcd8fe8f104fb5b24698dfdcb690..cd78a2758418bf817e99cfbbe07aef3a2751d457 100644 |
--- a/webrtc/sdk/android/src/jni/native_handle_impl.cc |
+++ b/webrtc/sdk/android/src/jni/native_handle_impl.cc |
@@ -322,18 +322,39 @@ rtc::scoped_refptr<webrtc::I420BufferInterface> AndroidTextureBuffer::ToI420() { |
return copy; |
} |
+rtc::scoped_refptr<AndroidVideoBuffer> AndroidVideoBuffer::WrapReference( |
+ JNIEnv* jni, |
+ jmethodID j_release_id, |
+ int width, |
+ int height, |
+ jobject j_video_frame_buffer) { |
+ return new rtc::RefCountedObject<AndroidVideoBuffer>( |
+ jni, j_release_id, width, height, j_video_frame_buffer); |
+} |
+ |
AndroidVideoBuffer::AndroidVideoBuffer(JNIEnv* jni, |
jmethodID j_retain_id, |
jmethodID j_release_id, |
int width, |
int height, |
jobject j_video_frame_buffer) |
+ : AndroidVideoBuffer(jni, |
+ j_release_id, |
+ width, |
+ height, |
+ j_video_frame_buffer) { |
+ jni->CallVoidMethod(j_video_frame_buffer, j_retain_id); |
+} |
+ |
+AndroidVideoBuffer::AndroidVideoBuffer(JNIEnv* jni, |
+ jmethodID j_release_id, |
+ int width, |
+ int height, |
+ jobject j_video_frame_buffer) |
: j_release_id_(j_release_id), |
width_(width), |
height_(height), |
- j_video_frame_buffer_(jni, j_video_frame_buffer) { |
- jni->CallVoidMethod(j_video_frame_buffer, j_retain_id); |
-} |
+ j_video_frame_buffer_(jni, j_video_frame_buffer) {} |
AndroidVideoBuffer::~AndroidVideoBuffer() { |
JNIEnv* jni = AttachCurrentThreadIfNeeded(); |
@@ -422,15 +443,24 @@ webrtc::VideoFrame AndroidVideoBufferFactory::CreateFrame( |
uint32_t timestamp_ns = |
jni->CallLongMethod(j_video_frame, j_get_timestamp_ns_id_); |
rtc::scoped_refptr<AndroidVideoBuffer> buffer = |
- CreateBuffer(j_video_frame_buffer); |
+ CreateBuffer(jni, j_video_frame_buffer); |
return webrtc::VideoFrame(buffer, timestamp_rtp, |
timestamp_ns / rtc::kNumNanosecsPerMillisec, |
static_cast<webrtc::VideoRotation>(rotation)); |
} |
+rtc::scoped_refptr<AndroidVideoBuffer> AndroidVideoBufferFactory::WrapBuffer( |
+ JNIEnv* jni, |
+ jobject j_video_frame_buffer) const { |
+ int width = jni->CallIntMethod(j_video_frame_buffer, j_get_width_id_); |
+ int height = jni->CallIntMethod(j_video_frame_buffer, j_get_height_id_); |
+ return AndroidVideoBuffer::WrapReference(jni, j_release_id_, width, height, |
+ j_video_frame_buffer); |
+} |
+ |
rtc::scoped_refptr<AndroidVideoBuffer> AndroidVideoBufferFactory::CreateBuffer( |
+ JNIEnv* jni, |
jobject j_video_frame_buffer) const { |
- JNIEnv* jni = AttachCurrentThreadIfNeeded(); |
int width = jni->CallIntMethod(j_video_frame_buffer, j_get_width_id_); |
int height = jni->CallIntMethod(j_video_frame_buffer, j_get_height_id_); |
return new rtc::RefCountedObject<AndroidVideoBuffer>( |