1 #ifndef TGCALLS_VIDEO_CAPTURE_INTERFACE_IMPL_H 2 #define TGCALLS_VIDEO_CAPTURE_INTERFACE_IMPL_H 3 4 #include "VideoCaptureInterface.h" 5 #include <memory> 6 #include "ThreadLocalObject.h" 7 #include "api/media_stream_interface.h" 8 #include "platform/PlatformInterface.h" 9 10 namespace tgcalls { 11 12 class VideoCapturerInterface; 13 class Threads; 14 15 class VideoCaptureInterfaceObject { 16 public: 17 VideoCaptureInterfaceObject(std::string deviceId, bool isScreenCapture, std::shared_ptr<PlatformContext> platformContext, Threads &threads); 18 ~VideoCaptureInterfaceObject(); 19 20 void switchToDevice(std::string deviceId, bool isScreenCapture); 21 void withNativeImplementation(std::function<void(void *)> completion); 22 void setState(VideoState state); 23 void setPreferredAspectRatio(float aspectRatio); 24 void setOutput(std::shared_ptr<rtc::VideoSinkInterface<webrtc::VideoFrame>> sink); 25 void setStateUpdated(std::function<void(VideoState)> stateUpdated); 26 void setRotationUpdated(std::function<void(int)> rotationUpdated); 27 void setOnFatalError(std::function<void()> error); 28 void setOnPause(std::function<void(bool)> pause); 29 void setOnIsActiveUpdated(std::function<void(bool)> onIsActiveUpdated); 30 webrtc::VideoTrackSourceInterface *source(); 31 int getRotation(); 32 bool isScreenCapture(); 33 34 private: 35 void updateAspectRateAdaptation(); 36 37 rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> _videoSource; 38 std::weak_ptr<rtc::VideoSinkInterface<webrtc::VideoFrame>> _currentUncroppedSink; 39 std::shared_ptr<PlatformContext> _platformContext; 40 std::pair<int, int> _videoCapturerResolution; 41 std::unique_ptr<VideoCapturerInterface> _videoCapturer; 42 std::function<void(VideoState)> _stateUpdated; 43 std::function<void()> _onFatalError; 44 std::function<void(bool)> _onPause; 45 std::function<void(bool)> _onIsActiveUpdated; 46 std::function<void(int)> _rotationUpdated; 47 VideoState _state = VideoState::Active; 48 float _preferredAspectRatio = 0.0f; 49 bool _shouldBeAdaptedToReceiverAspectRate = true; 50 bool _isScreenCapture = false; 51 }; 52 53 class VideoCaptureInterfaceImpl : public VideoCaptureInterface { 54 public: 55 VideoCaptureInterfaceImpl(std::string deviceId, bool isScreenCapture, std::shared_ptr<PlatformContext> platformContext, std::shared_ptr<Threads> threads); 56 virtual ~VideoCaptureInterfaceImpl(); 57 58 void switchToDevice(std::string deviceId, bool isScreenCapture) override; 59 void withNativeImplementation(std::function<void(void *)> completion) override; 60 void setState(VideoState state) override; 61 void setPreferredAspectRatio(float aspectRatio) override; 62 void setOutput(std::shared_ptr<rtc::VideoSinkInterface<webrtc::VideoFrame>> sink) override; 63 void setOnFatalError(std::function<void()> error) override; 64 void setOnPause(std::function<void(bool)> pause) override; 65 void setOnIsActiveUpdated(std::function<void(bool)> onIsActiveUpdated) override; 66 67 ThreadLocalObject<VideoCaptureInterfaceObject> *object(); 68 69 private: 70 ThreadLocalObject<VideoCaptureInterfaceObject> _impl; 71 72 }; 73 74 } // namespace tgcalls 75 76 #endif 77