Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(346)

Unified Diff: webrtc/sdk/android/src/jni/peerconnection_jni.cc

Issue 2854123003: Build WebRTC with data channel only. (Closed)
Patch Set: Replace the rtc_ prefix with webrtc_ to avoid naming conflict. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 8c20337179ce3f051987015458a89336f5ddee44..68c466a65cde6b6ae1195660f9e6a7858298f9f9 100644
--- a/webrtc/sdk/android/src/jni/peerconnection_jni.cc
+++ b/webrtc/sdk/android/src/jni/peerconnection_jni.cc
@@ -61,26 +61,24 @@
#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"
#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/androidnetworkmonitor_jni.h"
-#include "webrtc/sdk/android/src/jni/androidvideotracksource.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/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/ownedfactoryandthreads.h"
#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;
@@ -113,13 +111,17 @@ using webrtc::SetSessionDescriptionObserver;
using webrtc::StatsObserver;
using webrtc::StatsReport;
using webrtc::StatsReports;
-using webrtc::VideoTrackSourceInterface;
using webrtc::VideoTrackInterface;
-using webrtc::VideoTrackVector;
-using webrtc::kVideoCodecVP8;
namespace webrtc_jni {
+WebRtcVideoEncoderFactory* CreateVideoEncoderFactory();
+
+WebRtcVideoDecoderFactory* CreateVideoDecoderFactory();
+
+jobject GetJavaSurfaceTextureHelper(
+ rtc::scoped_refptr<SurfaceTextureHelper> surface_texture_helper);
+
// Field trials initialization string
static char *field_trials_init_string = NULL;
@@ -847,105 +849,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 +991,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();
}
@@ -1208,93 +1102,6 @@ JOW(void, AudioTrack_nativeSetVolume)
source->SetVolume(volume);
}
-// Helper struct for working around the fact that CreatePeerConnectionFactory()
-// comes in two flavors: either entirely automagical (constructing its own
-// threads and deleting them on teardown, but no external codec factory support)
-// or entirely manual (requires caller to delete threads after factory
-// teardown). This struct takes ownership of its ctor's arguments to present a
-// single thing for Java to hold and eventually free.
-class OwnedFactoryAndThreads {
- public:
- OwnedFactoryAndThreads(std::unique_ptr<Thread> network_thread,
- std::unique_ptr<Thread> worker_thread,
- std::unique_ptr<Thread> signaling_thread,
- WebRtcVideoEncoderFactory* encoder_factory,
- WebRtcVideoDecoderFactory* decoder_factory,
- rtc::NetworkMonitorFactory* network_monitor_factory,
- PeerConnectionFactoryInterface* factory)
- : network_thread_(std::move(network_thread)),
- worker_thread_(std::move(worker_thread)),
- signaling_thread_(std::move(signaling_thread)),
- encoder_factory_(encoder_factory),
- decoder_factory_(decoder_factory),
- network_monitor_factory_(network_monitor_factory),
- factory_(factory) {}
-
- ~OwnedFactoryAndThreads() {
- CHECK_RELEASE(factory_);
- if (network_monitor_factory_ != nullptr) {
- rtc::NetworkMonitorFactory::ReleaseFactory(network_monitor_factory_);
- }
- }
-
- PeerConnectionFactoryInterface* factory() { return factory_; }
- Thread* signaling_thread() { return signaling_thread_.get(); }
- Thread* worker_thread() { return worker_thread_.get(); }
- WebRtcVideoEncoderFactory* encoder_factory() { return encoder_factory_; }
- WebRtcVideoDecoderFactory* decoder_factory() { return decoder_factory_; }
- rtc::NetworkMonitorFactory* network_monitor_factory() {
- return network_monitor_factory_;
- }
- void clear_network_monitor_factory() { network_monitor_factory_ = nullptr; }
- void InvokeJavaCallbacksOnFactoryThreads();
-
- private:
- void JavaCallbackOnFactoryThreads();
-
- const std::unique_ptr<Thread> network_thread_;
- const std::unique_ptr<Thread> worker_thread_;
- const std::unique_ptr<Thread> signaling_thread_;
- WebRtcVideoEncoderFactory* encoder_factory_;
- WebRtcVideoDecoderFactory* decoder_factory_;
- rtc::NetworkMonitorFactory* network_monitor_factory_;
- PeerConnectionFactoryInterface* factory_; // Const after ctor except dtor.
-};
-
-void OwnedFactoryAndThreads::JavaCallbackOnFactoryThreads() {
- JNIEnv* jni = AttachCurrentThreadIfNeeded();
- ScopedLocalRefFrame local_ref_frame(jni);
- jclass j_factory_class = FindClass(jni, "org/webrtc/PeerConnectionFactory");
- jmethodID m = nullptr;
- if (network_thread_->IsCurrent()) {
- LOG(LS_INFO) << "Network thread JavaCallback";
- m = GetStaticMethodID(jni, j_factory_class, "onNetworkThreadReady", "()V");
- }
- if (worker_thread_->IsCurrent()) {
- LOG(LS_INFO) << "Worker thread JavaCallback";
- m = GetStaticMethodID(jni, j_factory_class, "onWorkerThreadReady", "()V");
- }
- if (signaling_thread_->IsCurrent()) {
- LOG(LS_INFO) << "Signaling thread JavaCallback";
- m = GetStaticMethodID(
- jni, j_factory_class, "onSignalingThreadReady", "()V");
- }
- if (m != nullptr) {
- jni->CallStaticVoidMethod(j_factory_class, m);
- CHECK_EXCEPTION(jni) << "error during JavaCallback::CallStaticVoidMethod";
- }
-}
-
-void OwnedFactoryAndThreads::InvokeJavaCallbacksOnFactoryThreads() {
- LOG(LS_INFO) << "InvokeJavaCallbacksOnFactoryThreads.";
- network_thread_->Invoke<void>(RTC_FROM_HERE,
- [this] { JavaCallbackOnFactoryThreads(); });
- worker_thread_->Invoke<void>(RTC_FROM_HERE,
- [this] { JavaCallbackOnFactoryThreads(); });
- signaling_thread_->Invoke<void>(RTC_FROM_HERE,
- [this] { JavaCallbackOnFactoryThreads(); });
-}
-
PeerConnectionFactoryInterface::Options ParseOptionsFromJava(JNIEnv* jni,
jobject options) {
jclass options_class = jni->GetObjectClass(options);
@@ -1357,8 +1164,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.
@@ -1396,10 +1203,6 @@ JOW(void, PeerConnectionFactory_nativeFreeFactory)(JNIEnv*, jclass, jlong j_p) {
webrtc::Trace::ReturnTrace();
}
-static PeerConnectionFactoryInterface* factoryFromJava(jlong j_p) {
- return reinterpret_cast<OwnedFactoryAndThreads*>(j_p)->factory();
-}
-
JOW(void, PeerConnectionFactory_nativeThreadsCallbacks)(
JNIEnv*, jclass, jlong j_p) {
OwnedFactoryAndThreads *factory =
@@ -1416,22 +1219,6 @@ JOW(jlong, PeerConnectionFactory_nativeCreateLocalMediaStream)(
return (jlong)stream.release();
}
-JOW(jlong, PeerConnectionFactory_nativeCreateVideoSource)
-(JNIEnv* jni, jclass, jlong native_factory, jobject j_egl_context,
- jboolean is_screencast) {
- 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::VideoTrackSourceProxy> proxy_source =
- webrtc::VideoTrackSourceProxy::Create(factory->signaling_thread(),
- factory->worker_thread(), source);
-
- return (jlong)proxy_source.release();
-}
-
JOW(void, PeerConnectionFactory_nativeInitializeVideoCapturer)
(JNIEnv* jni,
jclass,
@@ -1442,6 +1229,9 @@ JOW(void, PeerConnectionFactory_nativeInitializeVideoCapturer)
LOG(LS_INFO) << "PeerConnectionFactory_nativeInitializeVideoCapturer";
rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
factoryFromJava(native_factory));
+ if (!native_source) {
+ return;
+ }
auto proxy_source =
reinterpret_cast<webrtc::VideoTrackSourceProxy*>(native_source);
auto source = reinterpret_cast<webrtc::AndroidVideoTrackSource*>(
@@ -1453,24 +1243,11 @@ 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,
+ GetJavaSurfaceTextureHelper(surface_texture_helper),
j_application_context, j_frame_observer);
CHECK_EXCEPTION(jni) << "error during VideoCapturer.initialize()";
}
-JOW(jlong, PeerConnectionFactory_nativeCreateVideoTrack)(
- JNIEnv* jni, jclass, jlong native_factory, jstring id,
- jlong native_source) {
- rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
- factoryFromJava(native_factory));
- rtc::scoped_refptr<VideoTrackInterface> track(factory->CreateVideoTrack(
- JavaToStdString(jni, id),
- reinterpret_cast<VideoTrackSourceInterface*>(native_source)));
- return (jlong)track.release();
-}
-
JOW(jlong, PeerConnectionFactory_nativeCreateAudioSource)(
JNIEnv* jni, jclass, jlong native_factory, jobject j_constraints) {
std::unique_ptr<ConstraintsWrapper> constraints(
@@ -1529,33 +1306,6 @@ JOW(void, PeerConnectionFactory_nativeSetOptions)(
}
}
-JOW(void, PeerConnectionFactory_nativeSetVideoHwAccelerationOptions)(
- JNIEnv* jni, jclass, jlong native_factory, jobject local_egl_context,
- jobject remote_egl_context) {
- OwnedFactoryAndThreads* owned_factory =
- reinterpret_cast<OwnedFactoryAndThreads*>(native_factory);
-
- jclass j_eglbase14_context_class =
- FindClass(jni, "org/webrtc/EglBase14$Context");
-
- MediaCodecVideoEncoderFactory* encoder_factory =
- static_cast<MediaCodecVideoEncoderFactory*>
- (owned_factory->encoder_factory());
- 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);
- }
-
- MediaCodecVideoDecoderFactory* decoder_factory =
- static_cast<MediaCodecVideoDecoderFactory*>
- (owned_factory->decoder_factory());
- if (decoder_factory) {
- LOG(LS_INFO) << "Set EGL context for HW decoding.";
- decoder_factory->SetEGLContext(jni, remote_egl_context);
- }
-}
-
static PeerConnectionInterface::IceTransportsType
JavaIceTransportsTypeToNativeType(JNIEnv* jni, jobject j_ice_transports_type) {
std::string enum_name = GetJavaEnumName(
@@ -2187,39 +1937,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) {

Powered by Google App Engine
This is Rietveld 408576698