#include "AndroidInterface.h" #include #include #include #include #include "VideoCapturerInterfaceImpl.h" #include "sdk/android/native_api/base/init.h" #include "sdk/android/native_api/codecs/wrapper.h" #include "sdk/android/native_api/jni/class_loader.h" #include "sdk/android/native_api/jni/jvm.h" #include "sdk/android/native_api/jni/scoped_java_ref.h" #include "sdk/android/native_api/video/video_source.h" #include "api/video_codecs/builtin_video_encoder_factory.h" #include "api/video_codecs/builtin_video_decoder_factory.h" #include "api/video_track_source_proxy.h" namespace tgcalls { std::unique_ptr AndroidInterface::makeVideoEncoderFactory() { JNIEnv *env = webrtc::AttachCurrentThreadIfNeeded(); webrtc::ScopedJavaLocalRef factory_class = webrtc::GetClass(env, "org/webrtc/DefaultVideoEncoderFactory"); jmethodID factory_constructor = env->GetMethodID( factory_class.obj(), "", "(Lorg/webrtc/EglBase$Context;ZZ)V"); webrtc::ScopedJavaLocalRef factory_object( env, env->NewObject(factory_class.obj(), factory_constructor, nullptr /* shared_context */, false /* enable_intel_vp8_encoder */, true /* enable_h264_high_profile */)); return webrtc::JavaToNativeVideoEncoderFactory(env, factory_object.obj()); } std::unique_ptr AndroidInterface::makeVideoDecoderFactory() { JNIEnv *env = webrtc::AttachCurrentThreadIfNeeded(); webrtc::ScopedJavaLocalRef factory_class = webrtc::GetClass(env, "org/webrtc/DefaultVideoDecoderFactory"); jmethodID factory_constructor = env->GetMethodID( factory_class.obj(), "", "(Lorg/webrtc/EglBase$Context;)V"); webrtc::ScopedJavaLocalRef factory_object( env, env->NewObject(factory_class.obj(), factory_constructor, nullptr /* shared_context */)); return webrtc::JavaToNativeVideoDecoderFactory(env, factory_object.obj()); } rtc::scoped_refptr AndroidInterface::makeVideoSource(rtc::Thread *signalingThread, rtc::Thread *workerThread) { JNIEnv *env = webrtc::AttachCurrentThreadIfNeeded(); _source = webrtc::CreateJavaVideoSource(env, signalingThread, false, false); return webrtc::VideoTrackSourceProxy::Create(signalingThread, workerThread, _source); } bool AndroidInterface::supportsEncoding(const std::string &codecName) { if (softwareVideoEncoderFactory == nullptr) { JNIEnv *env = webrtc::AttachCurrentThreadIfNeeded(); webrtc::ScopedJavaLocalRef factory_class = webrtc::GetClass(env, "org/webrtc/HardwareVideoEncoderFactory"); jmethodID factory_constructor = env->GetMethodID( factory_class.obj(), "", "(Lorg/webrtc/EglBase$Context;ZZ)V"); webrtc::ScopedJavaLocalRef factory_object( env, env->NewObject(factory_class.obj(), factory_constructor, nullptr, false, true)); hardwareVideoEncoderFactory = webrtc::JavaToNativeVideoEncoderFactory(env, factory_object.obj()); } auto formats = hardwareVideoEncoderFactory->GetSupportedFormats(); for (auto format : formats) { if (format.name == codecName) { return true; } } return codecName == cricket::kVp8CodecName; } std::unique_ptr AndroidInterface::makeVideoCapturer(rtc::scoped_refptr source, bool useFrontCamera, std::function stateUpdated, std::shared_ptr platformContext) { return std::make_unique(_source, useFrontCamera, stateUpdated, platformContext); } std::unique_ptr CreatePlatformInterface() { return std::make_unique(); } } // namespace tgcalls extern "C" { int webrtcOnJNILoad(JavaVM *vm, JNIEnv *env) { webrtc::InitAndroid(vm); webrtc::JVM::Initialize(vm); rtc::InitializeSSL(); return JNI_TRUE; } }