Skip to content

Commit

Permalink
CVideoLayerBridgeDRMPRIME add colourspace connector property
Browse files Browse the repository at this point in the history
  • Loading branch information
lrusak committed Nov 16, 2020
1 parent 73d8a98 commit e47cf6a
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 1 deletion.
24 changes: 24 additions & 0 deletions xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp
Expand Up @@ -19,6 +19,30 @@ extern "C"
namespace DRMPRIME
{

int GetColorimetry(const VideoPicture& picture)
{
switch (picture.color_space)
{
case AVCOL_SPC_BT2020_CL:
case AVCOL_SPC_BT2020_NCL:
return DRM_MODE_COLORIMETRY_BT2020_RGB;
case AVCOL_SPC_SMPTE170M:
case AVCOL_SPC_BT470BG:
case AVCOL_SPC_FCC:
return DRM_MODE_COLORIMETRY_XVYCC_601;
case AVCOL_SPC_BT709:
return DRM_MODE_COLORIMETRY_XVYCC_709;
case AVCOL_SPC_RESERVED:
case AVCOL_SPC_UNSPECIFIED:
default:
if (picture.iWidth > 1024 || picture.iHeight >= 600)
return DRM_MODE_COLORIMETRY_XVYCC_709;
else
return DRM_MODE_COLORIMETRY_XVYCC_601;
}
}


int GetColorEncoding(const VideoPicture& picture)
{
switch (picture.color_space)
Expand Down
12 changes: 12 additions & 0 deletions xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h
Expand Up @@ -21,6 +21,17 @@ extern "C"
namespace DRMPRIME
{

// colorimetry definitions are copied from linux include/drm/drm_connector.h (not part of uapi yet)
/* CEA 861 Extended Colorimetry Options */
constexpr int DRM_MODE_COLORIMETRY_XVYCC_601{3};
constexpr int DRM_MODE_COLORIMETRY_XVYCC_709{4};
constexpr int DRM_MODE_COLORIMETRY_SYCC_601{5};
constexpr int DRM_MODE_COLORIMETRY_OPYCC_601{6};
constexpr int DRM_MODE_COLORIMETRY_OPRGB{7};
constexpr int DRM_MODE_COLORIMETRY_BT2020_CYCC{8};
constexpr int DRM_MODE_COLORIMETRY_BT2020_RGB{9};
constexpr int DRM_MODE_COLORIMETRY_BT2020_YCC{10};

// Color enums is copied from linux include/drm/drm_color_mgmt.h (strangely not part of uapi)
enum drm_color_encoding
{
Expand All @@ -47,6 +58,7 @@ enum hdmi_eotf
HDMI_EOTF_BT_2100_HLG,
};

int GetColorimetry(const VideoPicture& picture);
int GetColorEncoding(const VideoPicture& picture);
int GetColorRange(const VideoPicture& picture);
uint8_t GetEOTF(const VideoPicture& picture);
Expand Down
Expand Up @@ -35,8 +35,15 @@ void CVideoLayerBridgeDRMPRIME::Disable()
m_DRM->AddProperty(plane, "FB_ID", 0);
m_DRM->AddProperty(plane, "CRTC_ID", 0);

// disable HDR metadata
auto connector = m_DRM->GetConnector();

if (connector->SupportsProperty("Colorspace"))
{
CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - Colorspace={}", __FUNCTION__, 0);
m_DRM->AddProperty(connector, "Colorspace", 0);
}

// disable HDR metadata
if (connector->SupportsProperty("HDR_OUTPUT_METADATA"))
{
m_DRM->AddProperty(connector, "HDR_OUTPUT_METADATA", 0);
Expand Down Expand Up @@ -181,6 +188,15 @@ void CVideoLayerBridgeDRMPRIME::Configure(CVideoBufferDRMPRIME* buffer)
m_DRM->AddProperty(plane, "COLOR_RANGE", GetColorRange(picture));

auto connector = m_DRM->GetConnector();

if (connector->SupportsPropertyAndValue("Colorspace", GetColorimetry(picture)))
{
CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - Colorspace={}", __FUNCTION__,
GetColorimetry(picture));
m_DRM->AddProperty(connector, "Colorspace", GetColorimetry(picture));
m_DRM->SetActive(true);
}

if (connector->SupportsProperty("HDR_OUTPUT_METADATA"))
{
m_hdr_metadata.metadata_type = HDMI_STATIC_METADATA_TYPE1;
Expand Down

0 comments on commit e47cf6a

Please sign in to comment.