DxgiCapturer.h 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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(bool drawCursor, int left, int top, int right, int bottom);
  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. private:
  32. void drawCursor(HDC hdc, int left, int top, int right, int bottom);
  33. };
  34. class DxgiCapturer : public IVideoCapturer {
  35. public:
  36. DxgiCapturer();
  37. ~DxgiCapturer() override;
  38. bool open(const CaptureTarget& target, int width, int height) override;
  39. void close() override;
  40. AVFrame* getFrame() override;
  41. void setDrawCursor(bool enable) override { m_drawCursor = enable; }
  42. private:
  43. DxgiCapturerPrivate* d;
  44. bool m_drawCursor = true;
  45. int m_left = 0, m_top = 0, m_width = 0, m_height = 0;
  46. int m_right = 0, m_bottom = 0;
  47. };
  48. } // namespace video
  49. } // namespace avrecorder
  50. #endif // DXGICAPTURER_H