mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-03-06 07:36:12 -05:00
decklink: Add HDR playback support
This commit is contained in:
@@ -89,3 +89,152 @@ HRESULT OBSVideoFrame::GetBytes(void **buffer)
|
||||
*buffer = this->data;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
#define CompareREFIID(iid1, iid2) (memcmp(&iid1, &iid2, sizeof(REFIID)) == 0)
|
||||
|
||||
HDRVideoFrame::HDRVideoFrame(IDeckLinkMutableVideoFrame *frame)
|
||||
: m_videoFrame(frame),
|
||||
m_refCount(1)
|
||||
{
|
||||
}
|
||||
|
||||
HRESULT HDRVideoFrame::QueryInterface(REFIID iid, LPVOID *ppv)
|
||||
{
|
||||
if (ppv == nullptr)
|
||||
return E_INVALIDARG;
|
||||
|
||||
CFUUIDBytes unknown = CFUUIDGetUUIDBytes(IUnknownUUID);
|
||||
if (CompareREFIID(iid, unknown))
|
||||
*ppv = static_cast<IDeckLinkVideoFrame *>(this);
|
||||
else if (CompareREFIID(iid, IID_IDeckLinkVideoFrame))
|
||||
*ppv = static_cast<IDeckLinkVideoFrame *>(this);
|
||||
else if (CompareREFIID(iid, IID_IDeckLinkVideoFrameMetadataExtensions))
|
||||
*ppv = static_cast<IDeckLinkVideoFrameMetadataExtensions *>(
|
||||
this);
|
||||
else {
|
||||
*ppv = nullptr;
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
AddRef();
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
ULONG HDRVideoFrame::AddRef(void)
|
||||
{
|
||||
return ++m_refCount;
|
||||
}
|
||||
|
||||
ULONG HDRVideoFrame::Release(void)
|
||||
{
|
||||
ULONG newRefValue = --m_refCount;
|
||||
|
||||
if (newRefValue == 0)
|
||||
delete this;
|
||||
|
||||
return newRefValue;
|
||||
}
|
||||
|
||||
HRESULT HDRVideoFrame::GetInt(BMDDeckLinkFrameMetadataID metadataID,
|
||||
int64_t *value)
|
||||
{
|
||||
HRESULT result = S_OK;
|
||||
|
||||
switch (metadataID) {
|
||||
case bmdDeckLinkFrameMetadataHDRElectroOpticalTransferFunc:
|
||||
*value = 2;
|
||||
break;
|
||||
|
||||
case bmdDeckLinkFrameMetadataColorspace:
|
||||
// Colorspace is fixed for this sample
|
||||
*value = bmdColorspaceRec2020;
|
||||
break;
|
||||
|
||||
default:
|
||||
result = E_INVALIDARG;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
HRESULT HDRVideoFrame::GetFloat(BMDDeckLinkFrameMetadataID metadataID,
|
||||
double *value)
|
||||
{
|
||||
HRESULT result = S_OK;
|
||||
|
||||
switch (metadataID) {
|
||||
case bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedX:
|
||||
*value = 0.708;
|
||||
break;
|
||||
|
||||
case bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedY:
|
||||
*value = 0.292;
|
||||
break;
|
||||
|
||||
case bmdDeckLinkFrameMetadataHDRDisplayPrimariesGreenX:
|
||||
*value = 0.17;
|
||||
break;
|
||||
|
||||
case bmdDeckLinkFrameMetadataHDRDisplayPrimariesGreenY:
|
||||
*value = 0.797;
|
||||
break;
|
||||
|
||||
case bmdDeckLinkFrameMetadataHDRDisplayPrimariesBlueX:
|
||||
*value = 0.131;
|
||||
break;
|
||||
|
||||
case bmdDeckLinkFrameMetadataHDRDisplayPrimariesBlueY:
|
||||
*value = 0.046;
|
||||
break;
|
||||
|
||||
case bmdDeckLinkFrameMetadataHDRWhitePointX:
|
||||
*value = 0.3127;
|
||||
break;
|
||||
|
||||
case bmdDeckLinkFrameMetadataHDRWhitePointY:
|
||||
*value = 0.329;
|
||||
break;
|
||||
|
||||
case bmdDeckLinkFrameMetadataHDRMaxDisplayMasteringLuminance:
|
||||
*value = obs_get_video_hdr_nominal_peak_level();
|
||||
break;
|
||||
|
||||
case bmdDeckLinkFrameMetadataHDRMinDisplayMasteringLuminance:
|
||||
*value = 0.00001;
|
||||
break;
|
||||
|
||||
case bmdDeckLinkFrameMetadataHDRMaximumContentLightLevel:
|
||||
*value = obs_get_video_hdr_nominal_peak_level();
|
||||
break;
|
||||
|
||||
case bmdDeckLinkFrameMetadataHDRMaximumFrameAverageLightLevel:
|
||||
*value = obs_get_video_hdr_nominal_peak_level();
|
||||
break;
|
||||
|
||||
default:
|
||||
result = E_INVALIDARG;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
HRESULT HDRVideoFrame::GetFlag(BMDDeckLinkFrameMetadataID, decklink_bool_t *)
|
||||
{
|
||||
// Not expecting GetFlag
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
HRESULT HDRVideoFrame::GetString(BMDDeckLinkFrameMetadataID,
|
||||
decklink_string_t *)
|
||||
{
|
||||
// Not expecting GetString
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
HRESULT HDRVideoFrame::GetBytes(BMDDeckLinkFrameMetadataID, void *,
|
||||
uint32_t *bufferSize)
|
||||
{
|
||||
*bufferSize = 0;
|
||||
// Not expecting GetBytes
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user