Index: webrtc/sdk/android/src/jni/peerconnection_jni.cc |
diff --git a/webrtc/sdk/android/src/jni/peerconnection_jni.cc b/webrtc/sdk/android/src/jni/peerconnection_jni.cc |
index 708e65db46d400fdd9dc32cd8fc2b9bb0659576c..285b4fdea4d9d9d5daf5a8a5c6c98c5953b40577 100644 |
--- a/webrtc/sdk/android/src/jni/peerconnection_jni.cc |
+++ b/webrtc/sdk/android/src/jni/peerconnection_jni.cc |
@@ -61,26 +61,28 @@ |
#include "webrtc/base/ssladapter.h" |
#include "webrtc/base/stringutils.h" |
#include "webrtc/media/base/videocapturer.h" |
-#include "webrtc/media/engine/webrtcvideodecoderfactory.h" |
-#include "webrtc/media/engine/webrtcvideoencoderfactory.h" |
+// Adding 'nogncheck' to disable the gn include headers check. |
+// We don't want to always depend on audio and video related targets. |
+#include "webrtc/media/engine/webrtcvideodecoderfactory.h" // nogncheck |
+#include "webrtc/media/engine/webrtcvideoencoderfactory.h" // nogncheck |
#include "webrtc/modules/utility/include/jvm_android.h" |
-#include "webrtc/system_wrappers/include/field_trial.h" |
#include "webrtc/pc/webrtcsdp.h" |
-#include "webrtc/sdk/android/src/jni/androidmediadecoder_jni.h" |
-#include "webrtc/sdk/android/src/jni/androidmediaencoder_jni.h" |
+#include "webrtc/sdk/android/src/jni/androidmediadecoder_jni.h" // nogncheck |
+#include "webrtc/sdk/android/src/jni/androidmediaencoder_jni.h" // nogncheck |
#include "webrtc/sdk/android/src/jni/androidnetworkmonitor_jni.h" |
-#include "webrtc/sdk/android/src/jni/androidvideotracksource.h" |
+#include "webrtc/sdk/android/src/jni/androidvideotracksource.h" // nogncheck |
#include "webrtc/sdk/android/src/jni/classreferenceholder.h" |
#include "webrtc/sdk/android/src/jni/jni_helpers.h" |
-#include "webrtc/sdk/android/src/jni/native_handle_impl.h" |
+#include "webrtc/sdk/android/src/jni/native_handle_impl.h" // nogncheck |
#include "webrtc/sdk/android/src/jni/rtcstatscollectorcallbackwrapper.h" |
+#include "webrtc/system_wrappers/include/field_trial.h" |
// Adding 'nogncheck' to disable the gn include headers check. |
// We don't want to depend on 'system_wrappers:field_trial_default' because |
// clients should be able to provide their own implementation. |
#include "webrtc/system_wrappers/include/field_trial_default.h" // nogncheck |
#include "webrtc/system_wrappers/include/logcat_trace_context.h" |
#include "webrtc/system_wrappers/include/trace.h" |
-#include "webrtc/voice_engine/include/voe_base.h" |
+#include "webrtc/voice_engine/include/voe_base.h" // nogncheck |
using cricket::WebRtcVideoDecoderFactory; |
using cricket::WebRtcVideoEncoderFactory; |
@@ -120,6 +122,27 @@ using webrtc::kVideoCodecVP8; |
namespace webrtc_jni { |
+WebRtcVideoEncoderFactory* CreateVideoEncoderFactory(); |
+ |
+WebRtcVideoDecoderFactory* CreateVideoDecoderFactory(); |
+ |
+rtc::scoped_refptr<webrtc::AndroidVideoTrackSource> |
+CreateAndroidVideoTrackSource(rtc::Thread* signaling_thread, |
+ JNIEnv* jni, |
+ jobject j_egl_context, |
+ bool is_screencast = false); |
+ |
+jobject GetSurfaceTextureHelper( |
+ rtc::scoped_refptr<SurfaceTextureHelper> surface_texture_helper); |
+ |
+void EncoderFactorySetEGLContext(MediaCodecVideoEncoderFactory* encoder_factory, |
+ JNIEnv* jni, |
+ jobject local_egl_context); |
+ |
+void DecoderFactorySetEGLContext(MediaCodecVideoDecoderFactory* decoder_factory, |
+ JNIEnv* jni, |
+ jobject remote_egl_context); |
+ |
// Field trials initialization string |
static char *field_trials_init_string = NULL; |
@@ -847,105 +870,6 @@ class StatsObserverWrapper : public StatsObserver { |
const jmethodID j_value_ctor_; |
}; |
-// Wrapper dispatching rtc::VideoSinkInterface to a Java VideoRenderer |
-// instance. |
-class JavaVideoRendererWrapper |
- : public rtc::VideoSinkInterface<webrtc::VideoFrame> { |
- public: |
- JavaVideoRendererWrapper(JNIEnv* jni, jobject j_callbacks) |
- : j_callbacks_(jni, j_callbacks), |
- j_render_frame_id_(GetMethodID( |
- jni, GetObjectClass(jni, j_callbacks), "renderFrame", |
- "(Lorg/webrtc/VideoRenderer$I420Frame;)V")), |
- j_frame_class_(jni, |
- FindClass(jni, "org/webrtc/VideoRenderer$I420Frame")), |
- j_i420_frame_ctor_id_(GetMethodID( |
- jni, *j_frame_class_, "<init>", "(III[I[Ljava/nio/ByteBuffer;J)V")), |
- j_texture_frame_ctor_id_(GetMethodID( |
- jni, *j_frame_class_, "<init>", |
- "(IIII[FJ)V")), |
- j_byte_buffer_class_(jni, FindClass(jni, "java/nio/ByteBuffer")) { |
- CHECK_EXCEPTION(jni); |
- } |
- |
- virtual ~JavaVideoRendererWrapper() {} |
- |
- void OnFrame(const webrtc::VideoFrame& video_frame) override { |
- ScopedLocalRefFrame local_ref_frame(jni()); |
- jobject j_frame = |
- (video_frame.video_frame_buffer()->native_handle() != nullptr) |
- ? CricketToJavaTextureFrame(&video_frame) |
- : CricketToJavaI420Frame(&video_frame); |
- // |j_callbacks_| is responsible for releasing |j_frame| with |
- // VideoRenderer.renderFrameDone(). |
- jni()->CallVoidMethod(*j_callbacks_, j_render_frame_id_, j_frame); |
- CHECK_EXCEPTION(jni()); |
- } |
- |
- private: |
- // Make a shallow copy of |frame| to be used with Java. The callee has |
- // ownership of the frame, and the frame should be released with |
- // VideoRenderer.releaseNativeFrame(). |
- static jlong javaShallowCopy(const webrtc::VideoFrame* frame) { |
- return jlongFromPointer(new webrtc::VideoFrame(*frame)); |
- } |
- |
- // Return a VideoRenderer.I420Frame referring to the data in |frame|. |
- jobject CricketToJavaI420Frame(const webrtc::VideoFrame* frame) { |
- jintArray strides = jni()->NewIntArray(3); |
- jint* strides_array = jni()->GetIntArrayElements(strides, NULL); |
- strides_array[0] = frame->video_frame_buffer()->StrideY(); |
- strides_array[1] = frame->video_frame_buffer()->StrideU(); |
- strides_array[2] = frame->video_frame_buffer()->StrideV(); |
- jni()->ReleaseIntArrayElements(strides, strides_array, 0); |
- jobjectArray planes = jni()->NewObjectArray(3, *j_byte_buffer_class_, NULL); |
- jobject y_buffer = jni()->NewDirectByteBuffer( |
- const_cast<uint8_t*>(frame->video_frame_buffer()->DataY()), |
- frame->video_frame_buffer()->StrideY() * |
- frame->video_frame_buffer()->height()); |
- size_t chroma_height = (frame->height() + 1) / 2; |
- jobject u_buffer = jni()->NewDirectByteBuffer( |
- const_cast<uint8_t*>(frame->video_frame_buffer()->DataU()), |
- frame->video_frame_buffer()->StrideU() * chroma_height); |
- jobject v_buffer = jni()->NewDirectByteBuffer( |
- const_cast<uint8_t*>(frame->video_frame_buffer()->DataV()), |
- frame->video_frame_buffer()->StrideV() * chroma_height); |
- |
- jni()->SetObjectArrayElement(planes, 0, y_buffer); |
- jni()->SetObjectArrayElement(planes, 1, u_buffer); |
- jni()->SetObjectArrayElement(planes, 2, v_buffer); |
- return jni()->NewObject( |
- *j_frame_class_, j_i420_frame_ctor_id_, |
- frame->width(), frame->height(), |
- static_cast<int>(frame->rotation()), |
- strides, planes, javaShallowCopy(frame)); |
- } |
- |
- // Return a VideoRenderer.I420Frame referring texture object in |frame|. |
- jobject CricketToJavaTextureFrame(const webrtc::VideoFrame* frame) { |
- NativeHandleImpl* handle = reinterpret_cast<NativeHandleImpl*>( |
- frame->video_frame_buffer()->native_handle()); |
- jfloatArray sampling_matrix = handle->sampling_matrix.ToJava(jni()); |
- |
- return jni()->NewObject( |
- *j_frame_class_, j_texture_frame_ctor_id_, |
- frame->width(), frame->height(), |
- static_cast<int>(frame->rotation()), |
- handle->oes_texture_id, sampling_matrix, javaShallowCopy(frame)); |
- } |
- |
- JNIEnv* jni() { |
- return AttachCurrentThreadIfNeeded(); |
- } |
- |
- ScopedGlobalRef<jobject> j_callbacks_; |
- jmethodID j_render_frame_id_; |
- ScopedGlobalRef<jclass> j_frame_class_; |
- jmethodID j_i420_frame_ctor_id_; |
- jmethodID j_texture_frame_ctor_id_; |
- ScopedGlobalRef<jclass> j_byte_buffer_class_; |
-}; |
- |
// Adapter between the C++ RtpReceiverObserverInterface and the Java |
// RtpReceiver.Observer interface. Wraps an instance of the Java interface and |
// dispatches C++ callbacks to Java. |
@@ -1088,15 +1012,6 @@ JOW(void, MediaSource_free)(JNIEnv*, jclass, jlong j_p) { |
reinterpret_cast<rtc::RefCountInterface*>(j_p)->Release(); |
} |
-JOW(void, VideoRenderer_freeWrappedVideoRenderer)(JNIEnv*, jclass, jlong j_p) { |
- delete reinterpret_cast<JavaVideoRendererWrapper*>(j_p); |
-} |
- |
-JOW(void, VideoRenderer_releaseNativeFrame)( |
- JNIEnv* jni, jclass, jlong j_frame_ptr) { |
- delete reinterpret_cast<const webrtc::VideoFrame*>(j_frame_ptr); |
-} |
- |
JOW(void, MediaStreamTrack_free)(JNIEnv*, jclass, jlong j_p) { |
reinterpret_cast<MediaStreamTrackInterface*>(j_p)->Release(); |
} |
@@ -1357,8 +1272,8 @@ JOW(jlong, PeerConnectionFactory_nativeCreatePeerConnectionFactory)( |
} |
if (video_hw_acceleration_enabled) { |
- encoder_factory = new MediaCodecVideoEncoderFactory(); |
- decoder_factory = new MediaCodecVideoDecoderFactory(); |
+ encoder_factory = CreateVideoEncoderFactory(); |
+ decoder_factory = CreateVideoDecoderFactory(); |
} |
// Do not create network_monitor_factory only if the options are |
// provided and disable_network_monitor therein is set to true. |
@@ -1422,9 +1337,12 @@ JOW(jlong, PeerConnectionFactory_nativeCreateVideoSource) |
OwnedFactoryAndThreads* factory = |
reinterpret_cast<OwnedFactoryAndThreads*>(native_factory); |
- rtc::scoped_refptr<webrtc::AndroidVideoTrackSource> source( |
- new rtc::RefCountedObject<webrtc::AndroidVideoTrackSource>( |
- factory->signaling_thread(), jni, j_egl_context, is_screencast)); |
+ rtc::scoped_refptr<webrtc::AndroidVideoTrackSource> source = |
+ CreateAndroidVideoTrackSource(factory->signaling_thread(), jni, |
+ j_egl_context, is_screencast); |
+ if (!source) { |
+ return (jlong)0; |
+ } |
rtc::scoped_refptr<webrtc::VideoTrackSourceProxy> proxy_source = |
webrtc::VideoTrackSourceProxy::Create(factory->signaling_thread(), |
factory->worker_thread(), source); |
@@ -1446,6 +1364,11 @@ JOW(void, PeerConnectionFactory_nativeInitializeVideoCapturer) |
reinterpret_cast<webrtc::VideoTrackSourceProxy*>(native_source); |
auto source = reinterpret_cast<webrtc::AndroidVideoTrackSource*>( |
proxy_source->internal()); |
+ if (!source) { |
+ LOG(LS_WARNING) << "The AndroidVideoTrackSource is unset."; |
+ return; |
+ } |
+ |
rtc::scoped_refptr<SurfaceTextureHelper> surface_texture_helper = |
source->surface_texture_helper(); |
jni->CallVoidMethod( |
@@ -1453,10 +1376,8 @@ JOW(void, PeerConnectionFactory_nativeInitializeVideoCapturer) |
GetMethodID(jni, FindClass(jni, "org/webrtc/VideoCapturer"), "initialize", |
"(Lorg/webrtc/SurfaceTextureHelper;Landroid/content/" |
"Context;Lorg/webrtc/VideoCapturer$CapturerObserver;)V"), |
- surface_texture_helper |
- ? surface_texture_helper->GetJavaSurfaceTextureHelper() |
- : nullptr, |
- j_application_context, j_frame_observer); |
+ GetSurfaceTextureHelper(surface_texture_helper), j_application_context, |
+ j_frame_observer); |
CHECK_EXCEPTION(jni) << "error during VideoCapturer.initialize()"; |
} |
@@ -1544,7 +1465,7 @@ JOW(void, PeerConnectionFactory_nativeSetVideoHwAccelerationOptions)( |
if (encoder_factory && |
jni->IsInstanceOf(local_egl_context, j_eglbase14_context_class)) { |
LOG(LS_INFO) << "Set EGL context for HW encoding."; |
- encoder_factory->SetEGLContext(jni, local_egl_context); |
+ EncoderFactorySetEGLContext(encoder_factory, jni, local_egl_context); |
} |
MediaCodecVideoDecoderFactory* decoder_factory = |
@@ -1552,7 +1473,7 @@ JOW(void, PeerConnectionFactory_nativeSetVideoHwAccelerationOptions)( |
(owned_factory->decoder_factory()); |
if (decoder_factory) { |
LOG(LS_INFO) << "Set EGL context for HW decoding."; |
- decoder_factory->SetEGLContext(jni, remote_egl_context); |
+ DecoderFactorySetEGLContext(decoder_factory, jni, remote_egl_context); |
} |
} |
@@ -2187,39 +2108,6 @@ JOW(jobject, MediaSource_nativeState)(JNIEnv* jni, jclass, jlong j_p) { |
return JavaEnumFromIndex(jni, "MediaSource$State", p->state()); |
} |
-JOW(jlong, VideoRenderer_nativeWrapVideoRenderer)( |
- JNIEnv* jni, jclass, jobject j_callbacks) { |
- std::unique_ptr<JavaVideoRendererWrapper> renderer( |
- new JavaVideoRendererWrapper(jni, j_callbacks)); |
- return (jlong)renderer.release(); |
-} |
- |
-JOW(void, VideoRenderer_nativeCopyPlane)( |
- JNIEnv *jni, jclass, jobject j_src_buffer, jint width, jint height, |
- jint src_stride, jobject j_dst_buffer, jint dst_stride) { |
- size_t src_size = jni->GetDirectBufferCapacity(j_src_buffer); |
- size_t dst_size = jni->GetDirectBufferCapacity(j_dst_buffer); |
- RTC_CHECK(src_stride >= width) << "Wrong source stride " << src_stride; |
- RTC_CHECK(dst_stride >= width) << "Wrong destination stride " << dst_stride; |
- RTC_CHECK(src_size >= src_stride * height) |
- << "Insufficient source buffer capacity " << src_size; |
- RTC_CHECK(dst_size >= dst_stride * height) |
- << "Insufficient destination buffer capacity " << dst_size; |
- uint8_t *src = |
- reinterpret_cast<uint8_t*>(jni->GetDirectBufferAddress(j_src_buffer)); |
- uint8_t *dst = |
- reinterpret_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_buffer)); |
- if (src_stride == dst_stride) { |
- memcpy(dst, src, src_stride * height); |
- } else { |
- for (int i = 0; i < height; i++) { |
- memcpy(dst, src, width); |
- src += src_stride; |
- dst += dst_stride; |
- } |
- } |
-} |
- |
JOW(void, FileVideoCapturer_nativeI420ToNV21)( |
JNIEnv *jni, jclass, jbyteArray j_src_buffer, jint width, jint height, |
jbyteArray j_dst_buffer) { |