OBSVideoFrame.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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(BMDTimecodeFormat format, IDeckLinkTimecode *timecode) override;
  18. HRESULT STDMETHODCALLTYPE SetTimecodeFromComponents(BMDTimecodeFormat format, uint8_t hours, uint8_t minutes,
  19. uint8_t seconds, uint8_t frames,
  20. BMDTimecodeFlags flags) override;
  21. HRESULT
  22. STDMETHODCALLTYPE
  23. SetAncillaryData(IDeckLinkVideoFrameAncillary *ancillary) override;
  24. HRESULT STDMETHODCALLTYPE SetTimecodeUserBits(BMDTimecodeFormat format, BMDTimecodeUserBits userBits) override;
  25. long STDMETHODCALLTYPE GetWidth() override;
  26. long STDMETHODCALLTYPE GetHeight() override;
  27. long STDMETHODCALLTYPE GetRowBytes() override;
  28. BMDPixelFormat STDMETHODCALLTYPE GetPixelFormat() override;
  29. BMDFrameFlags STDMETHODCALLTYPE GetFlags() override;
  30. HRESULT STDMETHODCALLTYPE GetBytes(void **buffer) override;
  31. //Dummy implementations of remaining virtual methods
  32. virtual HRESULT STDMETHODCALLTYPE GetTimecode(/* in */ BMDTimecodeFormat format,
  33. /* out */ IDeckLinkTimecode **timecode) override
  34. {
  35. UNUSED_PARAMETER(format);
  36. UNUSED_PARAMETER(timecode);
  37. return E_NOINTERFACE;
  38. };
  39. virtual HRESULT STDMETHODCALLTYPE GetAncillaryData(
  40. /* out */ IDeckLinkVideoFrameAncillary **ancillary) override
  41. {
  42. UNUSED_PARAMETER(ancillary);
  43. return E_NOINTERFACE;
  44. };
  45. // IUnknown interface (dummy implementation)
  46. virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, LPVOID *ppv) override
  47. {
  48. UNUSED_PARAMETER(iid);
  49. UNUSED_PARAMETER(ppv);
  50. return E_NOINTERFACE;
  51. }
  52. virtual ULONG STDMETHODCALLTYPE AddRef() override { return 1; }
  53. virtual ULONG STDMETHODCALLTYPE Release() override { return 1; }
  54. };
  55. class HDRVideoFrame : public IDeckLinkVideoFrame, public IDeckLinkVideoFrameMetadataExtensions {
  56. public:
  57. HDRVideoFrame(IDeckLinkMutableVideoFrame *frame);
  58. virtual ~HDRVideoFrame() {}
  59. // IUnknown interface
  60. virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, LPVOID *ppv);
  61. virtual ULONG STDMETHODCALLTYPE AddRef(void);
  62. virtual ULONG STDMETHODCALLTYPE Release(void);
  63. // IDeckLinkVideoFrame interface
  64. virtual long STDMETHODCALLTYPE GetWidth(void) { return m_videoFrame->GetWidth(); }
  65. virtual long STDMETHODCALLTYPE GetHeight(void) { return m_videoFrame->GetHeight(); }
  66. virtual long STDMETHODCALLTYPE GetRowBytes(void) { return m_videoFrame->GetRowBytes(); }
  67. virtual BMDPixelFormat STDMETHODCALLTYPE GetPixelFormat(void) { return m_videoFrame->GetPixelFormat(); }
  68. virtual BMDFrameFlags STDMETHODCALLTYPE GetFlags(void)
  69. {
  70. return m_videoFrame->GetFlags() | bmdFrameContainsHDRMetadata;
  71. }
  72. virtual HRESULT STDMETHODCALLTYPE GetBytes(void **buffer) { return m_videoFrame->GetBytes(buffer); }
  73. virtual HRESULT STDMETHODCALLTYPE GetTimecode(BMDTimecodeFormat format, IDeckLinkTimecode **timecode)
  74. {
  75. return m_videoFrame->GetTimecode(format, timecode);
  76. }
  77. virtual HRESULT STDMETHODCALLTYPE GetAncillaryData(IDeckLinkVideoFrameAncillary **ancillary)
  78. {
  79. return m_videoFrame->GetAncillaryData(ancillary);
  80. }
  81. // IDeckLinkVideoFrameMetadataExtensions interface
  82. virtual HRESULT STDMETHODCALLTYPE GetInt(BMDDeckLinkFrameMetadataID metadataID, int64_t *value);
  83. virtual HRESULT STDMETHODCALLTYPE GetFloat(BMDDeckLinkFrameMetadataID metadataID, double *value);
  84. virtual HRESULT STDMETHODCALLTYPE GetFlag(BMDDeckLinkFrameMetadataID metadataID, decklink_bool_t *value);
  85. virtual HRESULT STDMETHODCALLTYPE GetString(BMDDeckLinkFrameMetadataID metadataID, decklink_string_t *value);
  86. virtual HRESULT STDMETHODCALLTYPE GetBytes(BMDDeckLinkFrameMetadataID metadataID, void *buffer,
  87. uint32_t *bufferSize);
  88. private:
  89. ComPtr<IDeckLinkMutableVideoFrame> m_videoFrame;
  90. std::atomic<ULONG> m_refCount;
  91. };