@@ -169,8 +169,10 @@ struct InstanceHolder {
169169 std::unique_ptr<Instance> nativeInstance;
170170 std::unique_ptr<GroupInstanceCustomImpl> groupNativeInstance;
171171 std::shared_ptr<tgcalls::VideoCaptureInterface> _videoCapture;
172+ std::shared_ptr<tgcalls::VideoCaptureInterface> _screenVideoCapture;
172173 std::shared_ptr<PlatformContext> _platformContext;
173174 std::map<std::string, SetVideoSink> remoteGroupSinks;
175+ bool useScreencast = false ;
174176};
175177
176178jlong getInstanceHolderId (JNIEnv *env, jobject obj) {
@@ -846,9 +848,9 @@ JNIEXPORT jlong JNICALL Java_org_telegram_messenger_voip_NativeInstance_createVi
846848 initWebRTC (env);
847849 std::unique_ptr<VideoCaptureInterface> capture;
848850 if (type == 0 || type == 1 ) {
849- capture = tgcalls::VideoCaptureInterface::Create (StaticThreads::getThreads (), type == 1 ? " front" : " back" , std::make_shared<AndroidContext>(env, nullptr , false ));
851+ capture = tgcalls::VideoCaptureInterface::Create (StaticThreads::getThreads (), type == 1 ? " front" : " back" , false , std::make_shared<AndroidContext>(env, nullptr , false ));
850852 } else {
851- capture = tgcalls::VideoCaptureInterface::Create (StaticThreads::getThreads (), " screen" , std::make_shared<AndroidContext>(env, nullptr , true ));
853+ capture = tgcalls::VideoCaptureInterface::Create (StaticThreads::getThreads (), " screen" , true , std::make_shared<AndroidContext>(env, nullptr , true ));
852854 }
853855 capture->setOutput (webrtc::JavaToNativeVideoSink (env, localSink));
854856 capture->setState (VideoState::Active);
@@ -866,6 +868,15 @@ JNIEXPORT void JNICALL Java_org_telegram_messenger_voip_NativeInstance_activateV
866868 capturer->setState (VideoState::Active);
867869}
868870
871+ JNIEXPORT void JNICALL Java_org_telegram_messenger_voip_NativeInstance_clearVideoCapturer (JNIEnv *env, jobject obj) {
872+ InstanceHolder *instance = getInstanceHolder (env, obj);
873+ if (instance->nativeInstance ) {
874+ instance->nativeInstance ->setVideoCapture (nullptr );
875+ } else if (instance->groupNativeInstance ) {
876+ instance->groupNativeInstance ->setVideoSource (nullptr );
877+ }
878+ }
879+
869880JNIEXPORT void JNICALL Java_org_telegram_messenger_voip_NativeInstance_destroyVideoCapturer (JNIEnv *env, jclass clazz, jlong videoCapturer) {
870881 auto capturer = reinterpret_cast <VideoCaptureInterface *>(videoCapturer);
871882 delete capturer;
@@ -899,24 +910,35 @@ JNIEXPORT jboolean JNICALL Java_org_telegram_messenger_voip_NativeInstance_hasVi
899910
900911JNIEXPORT void Java_org_telegram_messenger_voip_NativeInstance_setVideoState (JNIEnv *env, jobject obj, jint state) {
901912 InstanceHolder *instance = getInstanceHolder (env, obj);
902- if (instance->_videoCapture == nullptr ) {
913+ std::shared_ptr<tgcalls::VideoCaptureInterface> capturer = instance->useScreencast ? instance->_screenVideoCapture : instance->_videoCapture ;
914+ if (capturer == nullptr ) {
903915 return ;
904916 }
905- instance-> _videoCapture ->setState (static_cast <VideoState>(state));
917+ capturer ->setState (static_cast <VideoState>(state));
906918}
907919
908- JNIEXPORT void JNICALL Java_org_telegram_messenger_voip_NativeInstance_setupOutgoingVideo (JNIEnv *env, jobject obj, jobject localSink, jboolean front ) {
920+ JNIEXPORT void JNICALL Java_org_telegram_messenger_voip_NativeInstance_setupOutgoingVideo (JNIEnv *env, jobject obj, jobject localSink, jint type ) {
909921 InstanceHolder *instance = getInstanceHolder (env, obj);
910- if (instance->_videoCapture ) {
911- return ;
922+ std::shared_ptr<tgcalls::VideoCaptureInterface> capturer;
923+ if (type == 0 || type == 1 ) {
924+ if (instance->_videoCapture == nullptr ) {
925+ instance->_videoCapture = tgcalls::VideoCaptureInterface::Create (StaticThreads::getThreads (), type == 1 ? " front" : " back" , false , instance->_platformContext );
926+ }
927+ capturer = instance->_videoCapture ;
928+ instance->useScreencast = false ;
929+ } else {
930+ if (instance->_screenVideoCapture == nullptr ) {
931+ instance->_screenVideoCapture = tgcalls::VideoCaptureInterface::Create (StaticThreads::getThreads (), " screen" , true , instance->_platformContext );
932+ }
933+ capturer = instance->_screenVideoCapture ;
934+ instance->useScreencast = true ;
912935 }
913- instance->_videoCapture = tgcalls::VideoCaptureInterface::Create (StaticThreads::getThreads (), front ? " front" : " back" , instance->_platformContext );
914- instance->_videoCapture ->setOutput (webrtc::JavaToNativeVideoSink (env, localSink));
915- instance->_videoCapture ->setState (VideoState::Active);
936+ capturer->setOutput (webrtc::JavaToNativeVideoSink (env, localSink));
937+ capturer->setState (VideoState::Active);
916938 if (instance->nativeInstance ) {
917- instance->nativeInstance ->setVideoCapture (instance-> _videoCapture );
939+ instance->nativeInstance ->setVideoCapture (capturer );
918940 } else if (instance->groupNativeInstance ) {
919- instance->groupNativeInstance ->setVideoCapture (instance-> _videoCapture );
941+ instance->groupNativeInstance ->setVideoCapture (capturer );
920942 }
921943}
922944
@@ -931,6 +953,7 @@ JNIEXPORT void JNICALL Java_org_telegram_messenger_voip_NativeInstance_setupOutg
931953 instance->_videoCapture ->setState (VideoState::Active);
932954 if (instance->nativeInstance ) {
933955 instance->nativeInstance ->setVideoCapture (instance->_videoCapture );
956+ instance->useScreencast = false ;
934957 } else if (instance->groupNativeInstance ) {
935958 instance->groupNativeInstance ->setVideoCapture (instance->_videoCapture );
936959 }
0 commit comments