diff --git a/projects/RPi/patches/kodi/kodi-002-PR20006-gbm-colorspace-and-bits-per-pixel.patch b/projects/RPi/patches/kodi/kodi-002-PR20006-gbm-colorspace-and-bits-per-pixel.patch new file mode 100644 index 0000000000..d1cdb48a67 --- /dev/null +++ b/projects/RPi/patches/kodi/kodi-002-PR20006-gbm-colorspace-and-bits-per-pixel.patch @@ -0,0 +1,352 @@ +From 6f5646c5059e1bd23ba5dd22c9c5a404b73e5635 Mon Sep 17 00:00:00 2001 +From: Dom Cobley +Date: Tue, 12 Apr 2022 12:20:53 +0100 +Subject: [PATCH 1/5] DRMObject: Rename GetPropertyValue to + GetPropertyEnumValue + +The naming of this function is problematic for adding a function that gets a property's value +--- + .../VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp | 5 +++-- + xbmc/windowing/gbm/drm/DRMAtomic.cpp | 2 +- + xbmc/windowing/gbm/drm/DRMObject.cpp | 4 ++-- + xbmc/windowing/gbm/drm/DRMObject.h | 4 ++-- + 4 files changed, 8 insertions(+), 7 deletions(-) + +diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp +index a82da2225b7e..57d60f7437ae 100644 +--- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp ++++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp +@@ -165,11 +165,12 @@ void CVideoLayerBridgeDRMPRIME::Configure(CVideoBufferDRMPRIME* buffer) + + bool result; + uint64_t value; +- std::tie(result, value) = plane->GetPropertyValue("COLOR_ENCODING", GetColorEncoding(picture)); ++ std::tie(result, value) = ++ plane->GetPropertyEnumValue("COLOR_ENCODING", GetColorEncoding(picture)); + if (result) + m_DRM->AddProperty(plane, "COLOR_ENCODING", value); + +- std::tie(result, value) = plane->GetPropertyValue("COLOR_RANGE", GetColorRange(picture)); ++ std::tie(result, value) = plane->GetPropertyEnumValue("COLOR_RANGE", GetColorRange(picture)); + if (result) + m_DRM->AddProperty(plane, "COLOR_RANGE", value); + +diff --git a/xbmc/windowing/gbm/drm/DRMAtomic.cpp b/xbmc/windowing/gbm/drm/DRMAtomic.cpp +index 5d61a699d422..80abb02cd6ee 100644 +--- a/xbmc/windowing/gbm/drm/DRMAtomic.cpp ++++ b/xbmc/windowing/gbm/drm/DRMAtomic.cpp +@@ -48,7 +48,7 @@ bool CDRMAtomic::SetScalingFilter(CDRMObject* object, const char* name, const ch + { + bool result; + uint64_t value; +- std::tie(result, value) = m_gui_plane->GetPropertyValue(name, type); ++ std::tie(result, value) = m_gui_plane->GetPropertyEnumValue(name, type); + if (!result) + return false; + +diff --git a/xbmc/windowing/gbm/drm/DRMObject.cpp b/xbmc/windowing/gbm/drm/DRMObject.cpp +index 599bb61cd023..b61f41ed98f5 100644 +--- a/xbmc/windowing/gbm/drm/DRMObject.cpp ++++ b/xbmc/windowing/gbm/drm/DRMObject.cpp +@@ -81,8 +81,8 @@ bool CDRMObject::GetProperties(uint32_t id, uint32_t type) + } + + //! @todo: improve with c++17 +-std::tuple CDRMObject::GetPropertyValue(const std::string& name, +- const std::string& valueName) const ++std::tuple CDRMObject::GetPropertyEnumValue(const std::string& name, ++ const std::string& valueName) const + { + auto property = std::find_if(m_propsInfo.begin(), m_propsInfo.end(), + [&name](const auto& prop) { return prop->name == name; }); +diff --git a/xbmc/windowing/gbm/drm/DRMObject.h b/xbmc/windowing/gbm/drm/DRMObject.h +index e2ae32652cae..65e6dddf424d 100644 +--- a/xbmc/windowing/gbm/drm/DRMObject.h ++++ b/xbmc/windowing/gbm/drm/DRMObject.h +@@ -34,8 +34,8 @@ class CDRMObject + + uint32_t GetId() const { return m_id; } + uint32_t GetPropertyId(const std::string& name) const; +- std::tuple GetPropertyValue(const std::string& name, +- const std::string& valueName) const; ++ std::tuple GetPropertyEnumValue(const std::string& name, ++ const std::string& valueName) const; + + bool SetProperty(const std::string& name, uint64_t value); + bool SupportsProperty(const std::string& name); + +From 20c4c0a93df8ce29ecbf668e04b5baa09f198621 Mon Sep 17 00:00:00 2001 +From: Dom Cobley +Date: Tue, 12 Apr 2022 20:13:07 +0100 +Subject: [PATCH 2/5] DRMObject: Add method to get current property value + +--- + xbmc/windowing/gbm/drm/DRMObject.cpp | 16 ++++++++++++++++ + xbmc/windowing/gbm/drm/DRMObject.h | 2 ++ + 2 files changed, 18 insertions(+) + +diff --git a/xbmc/windowing/gbm/drm/DRMObject.cpp b/xbmc/windowing/gbm/drm/DRMObject.cpp +index b61f41ed98f5..4c188c8298be 100644 +--- a/xbmc/windowing/gbm/drm/DRMObject.cpp ++++ b/xbmc/windowing/gbm/drm/DRMObject.cpp +@@ -74,8 +74,11 @@ bool CDRMObject::GetProperties(uint32_t id, uint32_t type) + m_type = type; + + for (uint32_t i = 0; i < m_props->count_props; i++) ++ { + m_propsInfo.emplace_back(std::unique_ptr( + drmModeGetProperty(m_fd, m_props->props[i]))); ++ m_propsValues.emplace_back(m_props->prop_values[i]); ++ } + + return true; + } +@@ -106,6 +109,19 @@ std::tuple CDRMObject::GetPropertyEnumValue(const std::string& n + return std::make_tuple(false, 0); + } + ++bool CDRMObject::GetPropertyValue(const std::string& name, uint64_t& val) const ++{ ++ auto property = std::find_if(m_propsInfo.begin(), m_propsInfo.end(), ++ [&name](auto& prop) { return prop->name == name; }); ++ ++ if (property == m_propsInfo.end()) ++ return false; ++ ++ val = m_propsValues[property - m_propsInfo.begin()]; ++ ++ return true; ++} ++ + bool CDRMObject::SetProperty(const std::string& name, uint64_t value) + { + auto property = std::find_if(m_propsInfo.begin(), m_propsInfo.end(), +diff --git a/xbmc/windowing/gbm/drm/DRMObject.h b/xbmc/windowing/gbm/drm/DRMObject.h +index 65e6dddf424d..cba849c4070d 100644 +--- a/xbmc/windowing/gbm/drm/DRMObject.h ++++ b/xbmc/windowing/gbm/drm/DRMObject.h +@@ -36,6 +36,7 @@ class CDRMObject + uint32_t GetPropertyId(const std::string& name) const; + std::tuple GetPropertyEnumValue(const std::string& name, + const std::string& valueName) const; ++ bool GetPropertyValue(const std::string& name, uint64_t& val) const; + + bool SetProperty(const std::string& name, uint64_t value); + bool SupportsProperty(const std::string& name); +@@ -58,6 +59,7 @@ class CDRMObject + }; + + std::vector> m_propsInfo; ++ std::vector m_propsValues; + + int m_fd{-1}; + + +From 10577c714984106ae00fdfb459d02faed8cbcbdd Mon Sep 17 00:00:00 2001 +From: Dom Cobley +Date: Mon, 11 Apr 2022 19:40:41 +0100 +Subject: [PATCH 3/5] DRMObject: Add GetPropertyRange accessor + +--- + xbmc/windowing/gbm/drm/DRMObject.cpp | 19 +++++++++++++++++++ + xbmc/windowing/gbm/drm/DRMObject.h | 1 + + 2 files changed, 20 insertions(+) + +diff --git a/xbmc/windowing/gbm/drm/DRMObject.cpp b/xbmc/windowing/gbm/drm/DRMObject.cpp +index 4c188c8298be..d08c57950024 100644 +--- a/xbmc/windowing/gbm/drm/DRMObject.cpp ++++ b/xbmc/windowing/gbm/drm/DRMObject.cpp +@@ -122,6 +122,25 @@ bool CDRMObject::GetPropertyValue(const std::string& name, uint64_t& val) const + return true; + } + ++bool CDRMObject::GetPropertyRange(const std::string& name, uint64_t& min, uint64_t& max) const ++{ ++ auto property = std::find_if(m_propsInfo.begin(), m_propsInfo.end(), ++ [&name](auto& prop) { return prop->name == name; }); ++ ++ if (property == m_propsInfo.end()) ++ return false; ++ ++ auto prop = property->get(); ++ ++ if (!static_cast(drm_property_type_is(prop, DRM_MODE_PROP_RANGE))) ++ return false; ++ ++ min = prop->values[0]; ++ max = prop->values[1]; ++ ++ return true; ++} ++ + bool CDRMObject::SetProperty(const std::string& name, uint64_t value) + { + auto property = std::find_if(m_propsInfo.begin(), m_propsInfo.end(), +diff --git a/xbmc/windowing/gbm/drm/DRMObject.h b/xbmc/windowing/gbm/drm/DRMObject.h +index cba849c4070d..875ab5afa437 100644 +--- a/xbmc/windowing/gbm/drm/DRMObject.h ++++ b/xbmc/windowing/gbm/drm/DRMObject.h +@@ -37,6 +37,7 @@ class CDRMObject + std::tuple GetPropertyEnumValue(const std::string& name, + const std::string& valueName) const; + bool GetPropertyValue(const std::string& name, uint64_t& val) const; ++ bool GetPropertyRange(const std::string& name, uint64_t& min, uint64_t& max) const; + + bool SetProperty(const std::string& name, uint64_t value); + bool SupportsProperty(const std::string& name); + +From b4677efb3809af8fe1fd9335bebfa791bba30966 Mon Sep 17 00:00:00 2001 +From: Lukas Rusak +Date: Mon, 29 Apr 2019 18:48:45 -0700 +Subject: [PATCH 4/5] CVideoLayerBridgeDRMPRIME: add colourspace connector + property + +--- + .../Buffers/VideoBufferDRMPRIME.cpp | 12 ++++++++++ + .../VideoPlayer/Buffers/VideoBufferDRMPRIME.h | 1 + + .../HwDecRender/VideoLayerBridgeDRMPRIME.cpp | 23 ++++++++++++++++++- + 3 files changed, 35 insertions(+), 1 deletion(-) + +diff --git a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp +index b1c23ffc3dc5..a5fb7ddf44d7 100644 +--- a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp ++++ b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp +@@ -20,6 +20,18 @@ extern "C" + namespace DRMPRIME + { + ++std::string GetColorimetry(const VideoPicture& picture) ++{ ++ switch (picture.color_space) ++ { ++ case AVCOL_SPC_BT2020_CL: ++ case AVCOL_SPC_BT2020_NCL: ++ return "BT2020_RGB"; ++ } ++ ++ return "Default"; ++} ++ + std::string GetColorEncoding(const VideoPicture& picture) + { + switch (picture.color_space) +diff --git a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h +index e77f75b58bff..4de9732308ca 100644 +--- a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h ++++ b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h +@@ -34,6 +34,7 @@ enum hdmi_eotf + HDMI_EOTF_BT_2100_HLG, + }; + ++std::string GetColorimetry(const VideoPicture& picture); + std::string GetColorEncoding(const VideoPicture& picture); + std::string GetColorRange(const VideoPicture& picture); + uint8_t GetEOTF(const VideoPicture& picture); +diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp +index 57d60f7437ae..56000cc774f3 100644 +--- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp ++++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp +@@ -35,8 +35,20 @@ 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(); ++ ++ bool result; ++ uint64_t value; ++ std::tie(result, value) = connector->GetPropertyEnumValue("Colorspace", "Default"); ++ if (result) ++ { ++ CLog::Log(LOGDEBUG, ++ "CVideoLayerBridgeDRMPRIME::{} - setting connector colorspace to Default ({})", ++ __FUNCTION__, result); ++ m_DRM->AddProperty(connector, "Colorspace", value); ++ } ++ ++ // disable HDR metadata + if (connector->SupportsProperty("HDR_OUTPUT_METADATA")) + { + m_DRM->AddProperty(connector, "HDR_OUTPUT_METADATA", 0); +@@ -175,6 +187,15 @@ void CVideoLayerBridgeDRMPRIME::Configure(CVideoBufferDRMPRIME* buffer) + m_DRM->AddProperty(plane, "COLOR_RANGE", value); + + auto connector = m_DRM->GetConnector(); ++ ++ std::tie(result, value) = connector->GetPropertyEnumValue("Colorspace", GetColorimetry(picture)); ++ if (result) ++ { ++ result = m_DRM->AddProperty(connector, "Colorspace", value); ++ CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting connector colorspace to {} ({})", ++ __FUNCTION__, GetColorimetry(picture), result); ++ } ++ + if (connector->SupportsProperty("HDR_OUTPUT_METADATA")) + { + m_hdr_metadata.metadata_type = HDMI_STATIC_METADATA_TYPE1; + +From 773e4c3debca042df9313de5c97b4b227a16a8d2 Mon Sep 17 00:00:00 2001 +From: Dom Cobley +Date: Fri, 3 Dec 2021 16:00:50 +0000 +Subject: [PATCH 5/5] CVideoLayerBridgeDRMPRIME: Set max bpc for high bit depth + videos + +--- + .../HwDecRender/VideoLayerBridgeDRMPRIME.cpp | 26 +++++++++++++++++++ + .../HwDecRender/VideoLayerBridgeDRMPRIME.h | 1 + + 2 files changed, 27 insertions(+) + +diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp +index 56000cc774f3..a43848e07989 100644 +--- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp ++++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp +@@ -38,6 +38,16 @@ void CVideoLayerBridgeDRMPRIME::Disable() + auto connector = m_DRM->GetConnector(); + + bool result; ++ ++ // reset max bpc back to default ++ if (m_previous_bpc) ++ { ++ result = m_DRM->AddProperty(connector, "max bpc", m_previous_bpc); ++ CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting max bpc to {} ({})", __FUNCTION__, ++ m_previous_bpc, result); ++ m_previous_bpc = 0; ++ } ++ + uint64_t value; + std::tie(result, value) = connector->GetPropertyEnumValue("Colorspace", "Default"); + if (result) +@@ -188,6 +198,22 @@ void CVideoLayerBridgeDRMPRIME::Configure(CVideoBufferDRMPRIME* buffer) + + auto connector = m_DRM->GetConnector(); + ++ // set max bpc to allow the drm driver to choose a deep colour mode ++ if (picture.colorBits > 8 && connector->SupportsProperty("max bpc")) ++ { ++ uint64_t bpc = 12; ++ uint64_t min, max; ++ ++ if (connector->GetPropertyRange("max bpc", min, max) && bpc >= min && bpc <= max && ++ connector->GetPropertyValue("max bpc", m_previous_bpc)) ++ { ++ ++ result = m_DRM->AddProperty(connector, "max bpc", bpc); ++ CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting max bpc to {} ({})", ++ __FUNCTION__, bpc, result); ++ } ++ } ++ + std::tie(result, value) = connector->GetPropertyEnumValue("Colorspace", GetColorimetry(picture)); + if (result) + { +diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.h b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.h +index 3a46a91a13e0..0cdb8d760d25 100644 +--- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.h ++++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.h +@@ -81,4 +81,5 @@ class CVideoLayerBridgeDRMPRIME : public KODI::WINDOWING::GBM::CVideoLayerBridge + + uint32_t m_hdr_blob_id = 0; + struct hdr_output_metadata m_hdr_metadata = {}; ++ uint64_t m_previous_bpc = 0; + }; diff --git a/projects/RPi/patches/kodi/kodi-002-set-max-bpc-for-high-bit-depth-videos.patch b/projects/RPi/patches/kodi/kodi-002-set-max-bpc-for-high-bit-depth-videos.patch deleted file mode 100644 index 13c4575f55..0000000000 --- a/projects/RPi/patches/kodi/kodi-002-set-max-bpc-for-high-bit-depth-videos.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 19a82e838a91fcaa122f3993a08e3036ca7786cc Mon Sep 17 00:00:00 2001 -From: Dom Cobley -Date: Fri, 3 Dec 2021 16:00:50 +0000 -Subject: [PATCH] gbm: Set max bpc for high bit depth videos - ---- - .../HwDecRender/VideoLayerBridgeDRMPRIME.cpp | 16 +++++++++++++++- - 1 file changed, 15 insertions(+), 1 deletion(-) - -diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp -index a82da2225b..def417d366 100644 ---- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp -+++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp -@@ -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(); -+ -+ // reset max bpc back to default of 8 -+ int bpc = 8; -+ bool result = m_DRM->AddProperty(connector, "max bpc", bpc); -+ CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting max bpc to {} ({})", __FUNCTION__, -+ bpc, result); -+ -+ // disable HDR metadata - if (connector->SupportsProperty("HDR_OUTPUT_METADATA")) - { - m_DRM->AddProperty(connector, "HDR_OUTPUT_METADATA", 0); -@@ -174,6 +181,13 @@ void CVideoLayerBridgeDRMPRIME::Configure(CVideoBufferDRMPRIME* buffer) - m_DRM->AddProperty(plane, "COLOR_RANGE", value); - - auto connector = m_DRM->GetConnector(); -+ -+ // set max bpc to allow the drm driver to choose a deep colour mode -+ int bpc = picture.colorBits > 8 ? 12 : 8; -+ result = m_DRM->AddProperty(connector, "max bpc", bpc); -+ CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting max bpc to {} ({})", __FUNCTION__, -+ bpc, result); -+ - if (connector->SupportsProperty("HDR_OUTPUT_METADATA")) - { - m_hdr_metadata.metadata_type = HDMI_STATIC_METADATA_TYPE1; --- -2.30.2 - diff --git a/projects/RPi/patches/kodi/kodi-003-add-colourspace-connector-property.patch b/projects/RPi/patches/kodi/kodi-003-add-colourspace-connector-property.patch deleted file mode 100644 index d680899bb5..0000000000 --- a/projects/RPi/patches/kodi/kodi-003-add-colourspace-connector-property.patch +++ /dev/null @@ -1,86 +0,0 @@ -From 066f00577ab6fe258b5a59eb99e0839de1509988 Mon Sep 17 00:00:00 2001 -From: Lukas Rusak -Date: Mon, 29 Apr 2019 18:48:45 -0700 -Subject: [PATCH] CVideoLayerBridgeDRMPRIME add colourspace connector property - ---- - .../Buffers/VideoBufferDRMPRIME.cpp | 12 ++++++++++++ - .../VideoPlayer/Buffers/VideoBufferDRMPRIME.h | 1 + - .../HwDecRender/VideoLayerBridgeDRMPRIME.cpp | 19 +++++++++++++++++++ - 3 files changed, 32 insertions(+) - -diff --git a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp -index b85097d37b..037f66db72 100644 ---- a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp -+++ b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.cpp -@@ -19,6 +19,18 @@ extern "C" - namespace DRMPRIME - { - -+std::string GetColorimetry(const VideoPicture& picture) -+{ -+ switch (picture.color_space) -+ { -+ case AVCOL_SPC_BT2020_CL: -+ case AVCOL_SPC_BT2020_NCL: -+ return "BT2020_RGB"; -+ } -+ -+ return "Default"; -+} -+ - std::string GetColorEncoding(const VideoPicture& picture) - { - switch (picture.color_space) -diff --git a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h -index e77f75b58b..4de9732308 100644 ---- a/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h -+++ b/xbmc/cores/VideoPlayer/Buffers/VideoBufferDRMPRIME.h -@@ -34,6 +34,7 @@ enum hdmi_eotf - HDMI_EOTF_BT_2100_HLG, - }; - -+std::string GetColorimetry(const VideoPicture& picture); - std::string GetColorEncoding(const VideoPicture& picture); - std::string GetColorRange(const VideoPicture& picture); - uint8_t GetEOTF(const VideoPicture& picture); -diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp -index def417d366..fadc6a7df5 100644 ---- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp -+++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp -@@ -43,6 +43,16 @@ void CVideoLayerBridgeDRMPRIME::Disable() - CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting max bpc to {} ({})", __FUNCTION__, - bpc, result); - -+ uint64_t value; -+ std::tie(result, value) = connector->GetPropertyValue("Colorspace", "Default"); -+ if (result) -+ { -+ CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting connector colorspace to Default", -+ __FUNCTION__); -+ m_DRM->AddProperty(connector, "Colorspace", value); -+ m_DRM->SetActive(true); -+ } -+ - // disable HDR metadata - if (connector->SupportsProperty("HDR_OUTPUT_METADATA")) - { -@@ -188,6 +198,15 @@ void CVideoLayerBridgeDRMPRIME::Configure(CVideoBufferDRMPRIME* buffer) - CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting max bpc to {} ({})", __FUNCTION__, - bpc, result); - -+ std::tie(result, value) = connector->GetPropertyValue("Colorspace", GetColorimetry(picture)); -+ if (result) -+ { -+ CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting connector colorspace to {}", -+ __FUNCTION__, GetColorimetry(picture)); -+ m_DRM->AddProperty(connector, "Colorspace", value); -+ m_DRM->SetActive(true); -+ } -+ - if (connector->SupportsProperty("HDR_OUTPUT_METADATA")) - { - m_hdr_metadata.metadata_type = HDMI_STATIC_METADATA_TYPE1; --- -2.30.2 -