#include "tgcalls/platform/tdesktop/VideoCapturerInterfaceImpl.h" #include "tgcalls/platform/tdesktop/VideoCapturerTrackSource.h" #include "tgcalls/platform/tdesktop/VideoCameraCapturer.h" #ifndef TGCALLS_UWP_DESKTOP #include "tgcalls/desktop_capturer/DesktopCaptureSourceHelper.h" #endif // TGCALLS_DISABLE_DESKTOP_CAPTURE #include "pc/video_track_source_proxy.h" namespace tgcalls { namespace { std::shared_ptr> GetSink( const rtc::scoped_refptr< webrtc::VideoTrackSourceInterface> &nativeSource) { const auto proxy = static_cast( nativeSource.get()); const auto internal = static_cast( proxy->internal()); return internal->sink(); } } // namespace VideoCapturerInterfaceImpl::VideoCapturerInterfaceImpl( rtc::scoped_refptr source, std::string deviceId, std::function stateUpdated, std::shared_ptr platformContext, std::pair &outResolution) : _source(source) , _sink(GetSink(source)) , _stateUpdated(stateUpdated) { #ifdef TGCALLS_UWP_DESKTOP if (deviceId == "GraphicsCaptureItem") { auto uwpContext = std::static_pointer_cast(platformContext); _screenCapturer = std::make_unique(_sink, uwpContext->item); _screenCapturer->setState(VideoState::Active); outResolution = _screenCapturer->resolution(); } else #else if (const auto source = DesktopCaptureSourceForKey(deviceId)) { const auto data = DesktopCaptureSourceData{ /*.aspectSize = */{ 1280, 720 }, /*.fps = */24., /*.captureMouse = */true, }; _desktopCapturer = std::make_unique( source, data); _desktopCapturer->setOutput(_sink); _desktopCapturer->start(); outResolution = { 1280, 960 }; } else if (!ShouldBeDesktopCapture(deviceId)) #endif // TGCALLS_UWP_DESKTOP { _cameraCapturer = std::make_unique(_sink); _cameraCapturer->setDeviceId(deviceId); _cameraCapturer->setState(VideoState::Active); outResolution = _cameraCapturer->resolution(); } } VideoCapturerInterfaceImpl::~VideoCapturerInterfaceImpl() { } void VideoCapturerInterfaceImpl::setState(VideoState state) { #ifdef TGCALLS_UWP_DESKTOP if (_screenCapturer) { _screenCapturer->setState(state); } else #else if (_desktopCapturer) { if (state == VideoState::Active) { _desktopCapturer->start(); } else { _desktopCapturer->stop(); } } else #endif // TGCALLS_UWP_DESKTOP if (_cameraCapturer) { _cameraCapturer->setState(state); } if (_stateUpdated) { _stateUpdated(state); } } void VideoCapturerInterfaceImpl::setPreferredCaptureAspectRatio( float aspectRatio) { if (_cameraCapturer) { _cameraCapturer->setPreferredCaptureAspectRatio(aspectRatio); } } void VideoCapturerInterfaceImpl::setUncroppedOutput( std::shared_ptr> sink) { if (_uncroppedSink != nullptr) { _source->RemoveSink(_uncroppedSink.get()); } _uncroppedSink = sink; if (_uncroppedSink != nullptr) { _source->AddOrUpdateSink( _uncroppedSink.get(), rtc::VideoSinkWants()); } } void VideoCapturerInterfaceImpl::setOnFatalError(std::function error) { #ifdef TGCALLS_UWP_DESKTOP if (_screenCapturer) { _screenCapturer->setOnFatalError(std::move(error)); } else if (!_screenCapturer && !_cameraCapturer && error) { error(); } #else // TGCALLS_UWP_DESKTOP if (_desktopCapturer) { _desktopCapturer->setOnFatalError(std::move(error)); } else if (!_desktopCapturer && !_cameraCapturer && error) { error(); } #endif // TGCALLS_UWP_DESKTOP if (_cameraCapturer) { _cameraCapturer->setOnFatalError(std::move(error)); } } void VideoCapturerInterfaceImpl::setOnPause(std::function pause) { #ifdef TGCALLS_UWP_DESKTOP if (_screenCapturer) { _screenCapturer->setOnPause(std::move(pause)); } #else // TGCALLS_UWP_DESKTOP if (_desktopCapturer) { _desktopCapturer->setOnPause(std::move(pause)); } #endif // TGCALLS_UWP_DESKTOP } } // namespace tgcalls