From 85660e2e1ec91c80fb3b44c136231de3d5778f81 Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Wed, 31 Aug 2022 16:48:03 +0200 Subject: [PATCH] RPi: update kodi colorspace and bpc patches Signed-off-by: Matthias Reichl --- ...06-gbm-colorspace-and-bits-per-pixel.patch | 352 ------------------ ...et-max-bpc-for-high-bit-depth-videos.patch | 46 +++ ...3-add-colourspace-connector-property.patch | 86 +++++ 3 files changed, 132 insertions(+), 352 deletions(-) delete mode 100644 projects/RPi/patches/kodi/kodi-002-PR20006-gbm-colorspace-and-bits-per-pixel.patch create mode 100644 projects/RPi/patches/kodi/kodi-002-set-max-bpc-for-high-bit-depth-videos.patch create mode 100644 projects/RPi/patches/kodi/kodi-003-add-colourspace-connector-property.patch 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 deleted file mode 100644 index d1cdb48a67..0000000000 --- a/projects/RPi/patches/kodi/kodi-002-PR20006-gbm-colorspace-and-bits-per-pixel.patch +++ /dev/null @@ -1,352 +0,0 @@ -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 new file mode 100644 index 0000000000..615c1f1047 --- /dev/null +++ b/projects/RPi/patches/kodi/kodi-002-set-max-bpc-for-high-bit-depth-videos.patch @@ -0,0 +1,46 @@ +From b9b55807dcacec91a6d991b9d113cf011aea83e1 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, 16 insertions(+) + +diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp +index b91a1705ac..726a5b79b7 100644 +--- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp ++++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp +@@ -34,6 +34,14 @@ void CVideoLayerBridgeDRMPRIME::Disable() + { + // disable video plane + auto plane = m_DRM->GetVideoPlane(); ++ 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); ++ + m_DRM->AddProperty(plane, "FB_ID", 0); + m_DRM->AddProperty(plane, "CRTC_ID", 0); + +@@ -175,6 +183,14 @@ void CVideoLayerBridgeDRMPRIME::Configure(CVideoBufferDRMPRIME* buffer) + std::tie(result, value) = plane->GetPropertyValue("COLOR_RANGE", GetColorRange(picture)); + if (result) + m_DRM->AddProperty(plane, "COLOR_RANGE", value); ++ ++ // set max bpc to allow the drm driver to choose a deep colour mode ++ int bpc = buffer->GetPicture().colorBits > 8 ? 12 : 8; ++ auto connector = m_DRM->GetConnector(); ++ result = m_DRM->AddProperty(connector, "max bpc", bpc); ++ CLog::Log(LOGDEBUG, "CVideoLayerBridgeDRMPRIME::{} - setting max bpc to {} ({})", __FUNCTION__, ++ bpc, result); ++ + } + + void CVideoLayerBridgeDRMPRIME::SetVideoPlane(CVideoBufferDRMPRIME* buffer, const CRect& destRect) +-- +2.34.1 + 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 new file mode 100644 index 0000000000..205b523c63 --- /dev/null +++ b/projects/RPi/patches/kodi/kodi-003-add-colourspace-connector-property.patch @@ -0,0 +1,86 @@ +From 0137bf1b41b3f1bb08fb7fb78e0ae5266c4925da 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 b1c23ffc3d..a5fb7ddf44 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 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 726a5b79b7..09701cdbaa 100644 +--- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp ++++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/VideoLayerBridgeDRMPRIME.cpp +@@ -42,6 +42,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); ++ } ++ + m_DRM->AddProperty(plane, "FB_ID", 0); + m_DRM->AddProperty(plane, "CRTC_ID", 0); + +@@ -191,6 +201,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); ++ } ++ + } + + void CVideoLayerBridgeDRMPRIME::SetVideoPlane(CVideoBufferDRMPRIME* buffer, const CRect& destRect) +-- +2.34.1 +