1 #ifndef TGCALLS_UWP_SCREEN_CAPTURER_H 2 #define TGCALLS_UWP_SCREEN_CAPTURER_H 3 4 #include "api/scoped_refptr.h" 5 #include "api/video/video_frame.h" 6 #include "api/video/video_source_interface.h" 7 #include "media/base/video_adapter.h" 8 #include "modules/video_capture/video_capture.h" 9 10 #include "VideoCaptureInterface.h" 11 12 #include <memory> 13 #include <vector> 14 #include <stddef.h> 15 16 #include <d3d11.h> 17 #include <windows.graphics.directx.direct3d11.interop.h> 18 #include <windows.graphics.capture.h> 19 20 #include <winrt/Windows.Foundation.h> 21 #include <winrt/Windows.Graphics.Capture.h> 22 #include <winrt/Windows.System.h> 23 24 using namespace winrt::Windows::Graphics; 25 using namespace winrt::Windows::Graphics::Capture; 26 using namespace winrt::Windows::System; 27 28 namespace tgcalls { 29 30 class UwpScreenCapturer { 31 public: 32 explicit UwpScreenCapturer( 33 std::shared_ptr<rtc::VideoSinkInterface<webrtc::VideoFrame>> sink, GraphicsCaptureItem item); 34 ~UwpScreenCapturer(); 35 36 void setState(VideoState state); 37 void setPreferredCaptureAspectRatio(float aspectRatio); 38 void setOnFatalError(std::function<void ()> error); 39 void setOnPause(std::function<void(bool)> pause); 40 41 std::pair<int, int> resolution() const; 42 43 private: 44 void create(); 45 void destroy(); 46 47 void onFatalError(); 48 49 void OnFrame(std::vector<uint8_t> bytes, int width, int height); 50 51 bool item_closed_; 52 bool is_capture_started_; 53 SizeInt32 previous_size_; 54 Direct3D11CaptureFramePool frame_pool_ = nullptr; 55 GraphicsCaptureItem item_; 56 GraphicsCaptureSession session_ = nullptr; 57 winrt::com_ptr<ID3D11Device> d3d11_device_; 58 winrt::com_ptr<IInspectable> direct3d_device_; 59 winrt::com_ptr<ID3D11Texture2D> mapped_texture_ = nullptr; 60 winrt::slim_mutex lock_; 61 DispatcherQueue queue_= nullptr; 62 DispatcherQueueController queueController_= nullptr; 63 DispatcherQueueTimer repeatingTimer_= nullptr; 64 HRESULT CreateMappedTexture(winrt::com_ptr<ID3D11Texture2D> src_texture, UINT width = 0, UINT height = 0); 65 66 //void OnFrameArrived(Direct3D11CaptureFramePool const& sender, winrt::Windows::Foundation::IInspectable const& args); 67 void OnFrameArrived(DispatcherQueueTimer const& sender, winrt::Windows::Foundation::IInspectable const& args); 68 void OnClosed(GraphicsCaptureItem const& sender, winrt::Windows::Foundation::IInspectable const& args); 69 70 std::shared_ptr<rtc::VideoSinkInterface<webrtc::VideoFrame>> _sink; 71 72 VideoState _state = VideoState::Inactive; 73 std::pair<int, int> _dimensions; 74 std::function<void()> _onFatalError; 75 bool _fatalError = false; 76 std::function<void(bool)> _onPause; 77 bool _paused = false; 78 float _aspectRatio = 0.; 79 }; 80 81 } // namespace tgcalls 82 83 #endif 84