OBSVideoFrame.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #pragma once
  2. #include "platform.hpp"
  3. #include "obs.hpp"
  4. #include <atomic>
  5. class OBSVideoFrame : public IDeckLinkMutableVideoFrame {
  6. private:
  7. BMDFrameFlags flags = bmdFrameFlagDefault;
  8. BMDPixelFormat pixelFormat = bmdFormat8BitYUV;
  9. long width;
  10. long height;
  11. long rowBytes;
  12. unsigned char *data;
  13. public:
  14. OBSVideoFrame(long width, long height, BMDPixelFormat pixelFormat);
  15. ~OBSVideoFrame();
  16. HRESULT STDMETHODCALLTYPE SetFlags(BMDFrameFlags newFlags) override;
  17. HRESULT STDMETHODCALLTYPE SetTimecode(
  18. BMDTimecodeFormat format, IDeckLinkTimecode *timecode) override;
  19. HRESULT STDMETHODCALLTYPE SetTimecodeFromComponents(
  20. BMDTimecodeFormat format, uint8_t hours, uint8_t minutes,
  21. uint8_t seconds, uint8_t frames,
  22. BMDTimecodeFlags flags) override;
  23. HRESULT
  24. STDMETHODCALLTYPE
  25. SetAncillaryData(IDeckLinkVideoFrameAncillary *ancillary) override;
  26. HRESULT STDMETHODCALLTYPE
  27. SetTimecodeUserBits(BMDTimecodeFormat format,
  28. BMDTimecodeUserBits userBits) override;
  29. long STDMETHODCALLTYPE GetWidth() override;
  30. long STDMETHODCALLTYPE GetHeight() override;
  31. long STDMETHODCALLTYPE GetRowBytes() override;
  32. BMDPixelFormat STDMETHODCALLTYPE GetPixelFormat() override;
  33. BMDFrameFlags STDMETHODCALLTYPE GetFlags() override;
  34. HRESULT STDMETHODCALLTYPE GetBytes(void **buffer) override;
  35. //Dummy implementations of remaining virtual methods
  36. virtual HRESULT STDMETHODCALLTYPE
  37. GetTimecode(/* in */ BMDTimecodeFormat format,
  38. /* out */ IDeckLinkTimecode **timecode) override
  39. {
  40. UNUSED_PARAMETER(format);
  41. UNUSED_PARAMETER(timecode);
  42. return E_NOINTERFACE;
  43. };
  44. virtual HRESULT STDMETHODCALLTYPE GetAncillaryData(
  45. /* out */ IDeckLinkVideoFrameAncillary **ancillary) override
  46. {
  47. UNUSED_PARAMETER(ancillary);
  48. return E_NOINTERFACE;
  49. };
  50. // IUnknown interface (dummy implementation)
  51. virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid,
  52. LPVOID *ppv) override
  53. {
  54. UNUSED_PARAMETER(iid);
  55. UNUSED_PARAMETER(ppv);
  56. return E_NOINTERFACE;
  57. }
  58. virtual ULONG STDMETHODCALLTYPE AddRef() override { return 1; }
  59. virtual ULONG STDMETHODCALLTYPE Release() override { return 1; }
  60. };
  61. class HDRVideoFrame : public IDeckLinkVideoFrame,
  62. public IDeckLinkVideoFrameMetadataExtensions {
  63. public:
  64. HDRVideoFrame(IDeckLinkMutableVideoFrame *frame);
  65. virtual ~HDRVideoFrame() {}
  66. // IUnknown interface
  67. virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid,
  68. LPVOID *ppv);
  69. virtual ULONG STDMETHODCALLTYPE AddRef(void);
  70. virtual ULONG STDMETHODCALLTYPE Release(void);
  71. // IDeckLinkVideoFrame interface
  72. virtual long STDMETHODCALLTYPE GetWidth(void)
  73. {
  74. return m_videoFrame->GetWidth();
  75. }
  76. virtual long STDMETHODCALLTYPE GetHeight(void)
  77. {
  78. return m_videoFrame->GetHeight();
  79. }
  80. virtual long STDMETHODCALLTYPE GetRowBytes(void)
  81. {
  82. return m_videoFrame->GetRowBytes();
  83. }
  84. virtual BMDPixelFormat STDMETHODCALLTYPE GetPixelFormat(void)
  85. {
  86. return m_videoFrame->GetPixelFormat();
  87. }
  88. virtual BMDFrameFlags STDMETHODCALLTYPE GetFlags(void)
  89. {
  90. return m_videoFrame->GetFlags() | bmdFrameContainsHDRMetadata;
  91. }
  92. virtual HRESULT STDMETHODCALLTYPE GetBytes(void **buffer)
  93. {
  94. return m_videoFrame->GetBytes(buffer);
  95. }
  96. virtual HRESULT STDMETHODCALLTYPE
  97. GetTimecode(BMDTimecodeFormat format, IDeckLinkTimecode **timecode)
  98. {
  99. return m_videoFrame->GetTimecode(format, timecode);
  100. }
  101. virtual HRESULT STDMETHODCALLTYPE
  102. GetAncillaryData(IDeckLinkVideoFrameAncillary **ancillary)
  103. {
  104. return m_videoFrame->GetAncillaryData(ancillary);
  105. }
  106. // IDeckLinkVideoFrameMetadataExtensions interface
  107. virtual HRESULT STDMETHODCALLTYPE
  108. GetInt(BMDDeckLinkFrameMetadataID metadataID, int64_t *value);
  109. virtual HRESULT STDMETHODCALLTYPE
  110. GetFloat(BMDDeckLinkFrameMetadataID metadataID, double *value);
  111. virtual HRESULT STDMETHODCALLTYPE
  112. GetFlag(BMDDeckLinkFrameMetadataID metadataID, decklink_bool_t *value);
  113. virtual HRESULT STDMETHODCALLTYPE
  114. GetString(BMDDeckLinkFrameMetadataID metadataID,
  115. decklink_string_t *value);
  116. virtual HRESULT STDMETHODCALLTYPE
  117. GetBytes(BMDDeckLinkFrameMetadataID metadataID, void *buffer,
  118. uint32_t *bufferSize);
  119. private:
  120. ComPtr<IDeckLinkMutableVideoFrame> m_videoFrame;
  121. std::atomic<ULONG> m_refCount;
  122. };