DxgiCapturer.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #ifndef DXGICAPTURER_H
  2. #define DXGICAPTURER_H
  3. #include "IVideoCapturer.h"
  4. #include "d3d/buffer_filler.h"
  5. #include "d3d/convert.h"
  6. #include <d3d11.h>
  7. #include <dxgi1_2.h>
  8. namespace avrecorder {
  9. namespace video {
  10. class DxgiCapturerPrivate {
  11. public:
  12. DxgiCapturerPrivate() = default;
  13. ~DxgiCapturerPrivate() = default;
  14. bool Open(int left, int top, int width, int height);
  15. void Close();
  16. AVFrame* GetFrame();
  17. bool _bInit = false;
  18. bool _isCaptureSuccess = false;
  19. ID3D11Device* _hDevice = nullptr;
  20. ID3D11DeviceContext* _hContext = nullptr;
  21. IDXGIOutputDuplication* _hDeskDupl = nullptr;
  22. IDXGISurface1* _hStagingSurf = nullptr;
  23. ID3D11Texture2D* _gdiImage = nullptr;
  24. D3D11_TEXTURE2D_DESC _desc{};
  25. bool _isAttached = false;
  26. AVFrame* _xrgbFrame = nullptr;
  27. AVFrame* _nv12Frame = nullptr;
  28. BufferFiller _xrgbBuffers;
  29. BufferFiller _nv12Buffers;
  30. D3dConverter _rgbToNv12;
  31. };
  32. class DxgiCapturer : public IVideoCapturer {
  33. public:
  34. DxgiCapturer();
  35. ~DxgiCapturer() override;
  36. bool open(const CaptureTarget& target, int width, int height) override;
  37. void close() override;
  38. AVFrame* getFrame() override;
  39. void setDrawCursor(bool enable) override { m_drawCursor = enable; }
  40. private:
  41. DxgiCapturerPrivate* d;
  42. bool m_drawCursor = true;
  43. int m_left = 0, m_top = 0, m_width = 0, m_height = 0;
  44. };
  45. } // namespace video
  46. } // namespace avrecorder
  47. #endif // DXGICAPTURER_H