| 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 cd78a2758418bf817e99cfbbe07aef3a2751d457..3be618570d14e8732fab6590fd32b29a948b1211 100644
|
| --- a/webrtc/sdk/android/src/jni/native_handle_impl.cc
|
| +++ b/webrtc/sdk/android/src/jni/native_handle_impl.cc
|
| @@ -21,6 +21,7 @@
|
| #include "webrtc/rtc_base/timeutils.h"
|
| #include "webrtc/sdk/android/src/jni/classreferenceholder.h"
|
| #include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
| +#include "webrtc/sdk/android/src/jni/wrapped_native_i420_buffer.h"
|
| #include "webrtc/system_wrappers/include/aligned_malloc.h"
|
|
|
| namespace webrtc_jni {
|
| @@ -474,20 +475,37 @@ JavaVideoFrameFactory::JavaVideoFrameFactory(JNIEnv* jni)
|
| "(Lorg/webrtc/VideoFrame$Buffer;IJ)V");
|
| }
|
|
|
| +static bool IsJavaVideoBuffer(
|
| + rtc::scoped_refptr<webrtc::VideoFrameBuffer> buffer) {
|
| + if (buffer->type() != webrtc::VideoFrameBuffer::Type::kNative) {
|
| + return false;
|
| + }
|
| + AndroidVideoFrameBuffer* android_buffer =
|
| + static_cast<AndroidVideoFrameBuffer*>(buffer.get());
|
| + return android_buffer->android_type() ==
|
| + AndroidVideoFrameBuffer::AndroidType::kJavaBuffer;
|
| +}
|
| +
|
| jobject JavaVideoFrameFactory::ToJavaFrame(
|
| JNIEnv* jni,
|
| const webrtc::VideoFrame& frame) const {
|
| - RTC_DCHECK(frame.video_frame_buffer()->type() ==
|
| - webrtc::VideoFrameBuffer::Type::kNative);
|
| - AndroidVideoFrameBuffer* android_buffer =
|
| - static_cast<AndroidVideoFrameBuffer*>(frame.video_frame_buffer().get());
|
| - RTC_DCHECK(android_buffer->android_type() ==
|
| - AndroidVideoFrameBuffer::AndroidType::kJavaBuffer);
|
| - AndroidVideoBuffer* android_video_buffer =
|
| - static_cast<AndroidVideoBuffer*>(android_buffer);
|
| - jobject buffer = android_video_buffer->video_frame_buffer();
|
| + rtc::scoped_refptr<webrtc::VideoFrameBuffer> buffer =
|
| + frame.video_frame_buffer();
|
| + jobject j_buffer;
|
| + if (IsJavaVideoBuffer(buffer)) {
|
| + RTC_DCHECK(buffer->type() == webrtc::VideoFrameBuffer::Type::kNative);
|
| + AndroidVideoFrameBuffer* android_buffer =
|
| + static_cast<AndroidVideoFrameBuffer*>(buffer.get());
|
| + RTC_DCHECK(android_buffer->android_type() ==
|
| + AndroidVideoFrameBuffer::AndroidType::kJavaBuffer);
|
| + AndroidVideoBuffer* android_video_buffer =
|
| + static_cast<AndroidVideoBuffer*>(android_buffer);
|
| + j_buffer = android_video_buffer->video_frame_buffer();
|
| + } else {
|
| + j_buffer = WrapI420Buffer(jni, buffer->ToI420());
|
| + }
|
| return jni->NewObject(
|
| - *j_video_frame_class_, j_video_frame_constructor_id_, buffer,
|
| + *j_video_frame_class_, j_video_frame_constructor_id_, j_buffer,
|
| static_cast<jint>(frame.rotation()),
|
| static_cast<jlong>(frame.timestamp_us() * rtc::kNumNanosecsPerMicrosec));
|
| }
|
|
|