| Index: webrtc/examples/unityplugin/simple_peer_connection.cc
|
| diff --git a/webrtc/examples/unityplugin/simple_peer_connection.cc b/webrtc/examples/unityplugin/simple_peer_connection.cc
|
| index dd92f7be5a84eda8f4e78b4f21abb4ef727ed412..57ab885c297431e1e37309ce168f815c40738e80 100644
|
| --- a/webrtc/examples/unityplugin/simple_peer_connection.cc
|
| +++ b/webrtc/examples/unityplugin/simple_peer_connection.cc
|
| @@ -13,9 +13,16 @@
|
| #include <utility>
|
|
|
| #include "webrtc/api/test/fakeconstraints.h"
|
| +#include "webrtc/api/videosourceproxy.h"
|
| #include "webrtc/media/engine/webrtcvideocapturerfactory.h"
|
| #include "webrtc/modules/video_capture/video_capture_factory.h"
|
|
|
| +#if defined(WEBRTC_ANDROID)
|
| +#include "webrtc/examples/unityplugin/classreferenceholder.h"
|
| +#include "webrtc/sdk/android/src/jni/androidvideotracksource.h"
|
| +#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
| +#endif
|
| +
|
| // Names used for media stream labels.
|
| const char kAudioLabel[] = "audio_label";
|
| const char kVideoLabel[] = "video_label";
|
| @@ -27,6 +34,12 @@ static std::unique_ptr<rtc::Thread> g_worker_thread;
|
| static std::unique_ptr<rtc::Thread> g_signaling_thread;
|
| static rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface>
|
| g_peer_connection_factory;
|
| +#if defined(WEBRTC_ANDROID)
|
| +// Android case: the video track does not own the capturer, and it
|
| +// relies on the app to dispose the capturer when the peerconnection
|
| +// shuts down.
|
| +static jobject g_camera = nullptr;
|
| +#endif
|
|
|
| std::string GetEnvVarOrDefault(const char* env_var_name,
|
| const char* default_value) {
|
| @@ -149,6 +162,21 @@ bool SimplePeerConnection::CreatePeerConnection(const char** turn_urls,
|
| void SimplePeerConnection::DeletePeerConnection() {
|
| g_peer_count--;
|
|
|
| +#if defined(WEBRTC_ANDROID)
|
| + if (g_camera) {
|
| + JNIEnv* env = webrtc_jni::GetEnv();
|
| + jclass pc_factory_class =
|
| + unity_plugin::FindClass(env, "org/webrtc/UnityUtility");
|
| + jmethodID stop_camera_method = webrtc_jni::GetStaticMethodID(
|
| + env, pc_factory_class, "StopCamera", "(Lorg/webrtc/VideoCapturer;)V");
|
| +
|
| + env->CallStaticVoidMethod(pc_factory_class, stop_camera_method, g_camera);
|
| + CHECK_EXCEPTION(env);
|
| +
|
| + g_camera = nullptr;
|
| + }
|
| +#endif
|
| +
|
| CloseDataChannel();
|
| peer_connection_ = nullptr;
|
| active_streams_.clear();
|
| @@ -380,6 +408,41 @@ void SimplePeerConnection::AddStreams(bool audio_only) {
|
| stream->AddTrack(audio_track);
|
|
|
| if (!audio_only) {
|
| +#if defined(WEBRTC_ANDROID)
|
| + JNIEnv* env = webrtc_jni::GetEnv();
|
| + jclass pc_factory_class =
|
| + unity_plugin::FindClass(env, "org/webrtc/UnityUtility");
|
| + jmethodID load_texture_helper_method = webrtc_jni::GetStaticMethodID(
|
| + env, pc_factory_class, "LoadSurfaceTextureHelper",
|
| + "()Lorg/webrtc/SurfaceTextureHelper;");
|
| + jobject texture_helper = env->CallStaticObjectMethod(
|
| + pc_factory_class, load_texture_helper_method);
|
| + CHECK_EXCEPTION(env);
|
| + RTC_DCHECK(texture_helper != nullptr)
|
| + << "Cannot get the Surface Texture Helper.";
|
| +
|
| + rtc::scoped_refptr<webrtc::AndroidVideoTrackSource> source(
|
| + new rtc::RefCountedObject<webrtc::AndroidVideoTrackSource>(
|
| + g_signaling_thread.get(), env, texture_helper, false));
|
| + rtc::scoped_refptr<webrtc::VideoTrackSourceProxy> proxy_source =
|
| + webrtc::VideoTrackSourceProxy::Create(g_signaling_thread.get(),
|
| + g_worker_thread.get(), source);
|
| +
|
| + // link with VideoCapturer (Camera);
|
| + jmethodID link_camera_method = webrtc_jni::GetStaticMethodID(
|
| + env, pc_factory_class, "LinkCamera",
|
| + "(JLorg/webrtc/SurfaceTextureHelper;)Lorg/webrtc/VideoCapturer;");
|
| + jobject camera_tmp =
|
| + env->CallStaticObjectMethod(pc_factory_class, link_camera_method,
|
| + (jlong)proxy_source.get(), texture_helper);
|
| + CHECK_EXCEPTION(env);
|
| + g_camera = (jobject)env->NewGlobalRef(camera_tmp);
|
| +
|
| + rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track(
|
| + g_peer_connection_factory->CreateVideoTrack(kVideoLabel,
|
| + proxy_source.release()));
|
| + stream->AddTrack(video_track);
|
| +#else
|
| std::unique_ptr<cricket::VideoCapturer> capture = OpenVideoCaptureDevice();
|
| if (capture) {
|
| rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track(
|
| @@ -388,10 +451,11 @@ void SimplePeerConnection::AddStreams(bool audio_only) {
|
| std::move(capture), nullptr)));
|
|
|
| stream->AddTrack(video_track);
|
| - if (local_video_observer_ && !stream->GetVideoTracks().empty()) {
|
| - stream->GetVideoTracks()[0]->AddOrUpdateSink(
|
| - local_video_observer_.get(), rtc::VideoSinkWants());
|
| - }
|
| + }
|
| +#endif
|
| + if (local_video_observer_ && !stream->GetVideoTracks().empty()) {
|
| + stream->GetVideoTracks()[0]->AddOrUpdateSink(local_video_observer_.get(),
|
| + rtc::VideoSinkWants());
|
| }
|
| }
|
|
|
|
|