telegram/TMessagesProj/jni/voip/tgcalls/platform/uwp/UwpScreenCapturer.h

84 lines
2.5 KiB
C
Raw Normal View History

2025-11-22 14:04:28 +01:00
#ifndef TGCALLS_UWP_SCREEN_CAPTURER_H
#define TGCALLS_UWP_SCREEN_CAPTURER_H
#include "api/scoped_refptr.h"
#include "api/video/video_frame.h"
#include "api/video/video_source_interface.h"
#include "media/base/video_adapter.h"
#include "modules/video_capture/video_capture.h"
#include "VideoCaptureInterface.h"
#include <memory>
#include <vector>
#include <stddef.h>
#include <d3d11.h>
#include <windows.graphics.directx.direct3d11.interop.h>
#include <windows.graphics.capture.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Graphics.Capture.h>
#include <winrt/Windows.System.h>
using namespace winrt::Windows::Graphics;
using namespace winrt::Windows::Graphics::Capture;
using namespace winrt::Windows::System;
namespace tgcalls {
class UwpScreenCapturer {
public:
explicit UwpScreenCapturer(
std::shared_ptr<rtc::VideoSinkInterface<webrtc::VideoFrame>> sink, GraphicsCaptureItem item);
~UwpScreenCapturer();
void setState(VideoState state);
void setPreferredCaptureAspectRatio(float aspectRatio);
void setOnFatalError(std::function<void ()> error);
void setOnPause(std::function<void(bool)> pause);
std::pair<int, int> resolution() const;
private:
void create();
void destroy();
void onFatalError();
void OnFrame(std::vector<uint8_t> bytes, int width, int height);
bool item_closed_;
bool is_capture_started_;
SizeInt32 previous_size_;
Direct3D11CaptureFramePool frame_pool_ = nullptr;
GraphicsCaptureItem item_;
GraphicsCaptureSession session_ = nullptr;
winrt::com_ptr<ID3D11Device> d3d11_device_;
winrt::com_ptr<IInspectable> direct3d_device_;
winrt::com_ptr<ID3D11Texture2D> mapped_texture_ = nullptr;
winrt::slim_mutex lock_;
DispatcherQueue queue_= nullptr;
DispatcherQueueController queueController_= nullptr;
DispatcherQueueTimer repeatingTimer_= nullptr;
HRESULT CreateMappedTexture(winrt::com_ptr<ID3D11Texture2D> src_texture, UINT width = 0, UINT height = 0);
//void OnFrameArrived(Direct3D11CaptureFramePool const& sender, winrt::Windows::Foundation::IInspectable const& args);
void OnFrameArrived(DispatcherQueueTimer const& sender, winrt::Windows::Foundation::IInspectable const& args);
void OnClosed(GraphicsCaptureItem const& sender, winrt::Windows::Foundation::IInspectable const& args);
std::shared_ptr<rtc::VideoSinkInterface<webrtc::VideoFrame>> _sink;
VideoState _state = VideoState::Inactive;
std::pair<int, int> _dimensions;
std::function<void()> _onFatalError;
bool _fatalError = false;
std::function<void(bool)> _onPause;
bool _paused = false;
float _aspectRatio = 0.;
};
} // namespace tgcalls
#endif