diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.cpp index 90a31da2593f8..e1c252b70ba50 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.cpp @@ -293,6 +293,7 @@ void CLinuxRendererGL::AddVideoPicture(const VideoPicture &picture, int index) buf.loaded = false; buf.m_srcPrimaries = picture.color_primaries; buf.m_srcColSpace = picture.color_space; + buf.m_srcColTransfer = picture.color_transfer; buf.m_srcFullRange = picture.color_range == 1; buf.m_srcBits = picture.colorBits; @@ -2776,7 +2777,7 @@ void CLinuxRendererGL::DeleteCLUT() void CLinuxRendererGL::CheckVideoParameters(int index) { const CPictureBuffer& buf = m_buffers[index]; - ETONEMAPMETHOD method = m_videoSettings.m_ToneMapMethod; + const ETONEMAPMETHOD& toneMapMethod = m_videoSettings.m_ToneMapMethod; if (buf.m_srcPrimaries != m_srcPrimaries) { @@ -2785,20 +2786,20 @@ void CLinuxRendererGL::CheckVideoParameters(int index) } bool toneMap = false; - if (method != VS_TONEMAPMETHOD_OFF) + const bool streamIsHDRPQ = + (buf.m_srcColTransfer == AVCOL_TRC_SMPTE2084 && buf.m_srcPrimaries == AVCOL_PRI_BT2020); + + if (streamIsHDRPQ && toneMapMethod != VS_TONEMAPMETHOD_OFF) { - if (buf.hasLightMetadata || (buf.hasDisplayMetadata && buf.displayMetadata.has_luminance)) - { - toneMap = true; - } + toneMap = true; } - if (toneMap != m_toneMap || (m_toneMapMethod != method)) + if (toneMap != m_toneMap || toneMapMethod != m_toneMapMethod) { m_reloadShaders = true; + m_toneMap = toneMap; + m_toneMapMethod = toneMapMethod; } - m_toneMap = toneMap; - m_toneMapMethod = method; } CRenderCapture* CLinuxRendererGL::GetRenderCapture() diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.h index c88447aa61778..ee83a61ff7f89 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.h @@ -193,6 +193,8 @@ class CLinuxRendererGL : public CBaseRenderer AVColorPrimaries m_srcPrimaries; AVColorSpace m_srcColSpace; + AVColorTransferCharacteristic m_srcColTransfer; + int m_srcBits = 8; int m_srcTextureBits = 8; bool m_srcFullRange; diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp index d3e21614e83a3..654dccaed3a70 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp @@ -171,6 +171,7 @@ void CLinuxRendererGLES::AddVideoPicture(const VideoPicture &picture, int index) buf.loaded = false; buf.m_srcPrimaries = picture.color_primaries; buf.m_srcColSpace = picture.color_space; + buf.m_srcColTransfer = picture.color_transfer; buf.m_srcFullRange = picture.color_range == 1; buf.m_srcBits = picture.colorBits; @@ -920,30 +921,7 @@ void CLinuxRendererGLES::RenderSinglePass(int index, int field) CPictureBuffer &buf = m_buffers[index]; CYuvPlane (&planes)[YuvImage::MAX_PLANES] = m_buffers[index].fields[field]; - if (buf.m_srcPrimaries != m_srcPrimaries) - { - m_srcPrimaries = buf.m_srcPrimaries; - m_reloadShaders = true; - } - - bool toneMap = false; - ETONEMAPMETHOD toneMapMethod = m_videoSettings.m_ToneMapMethod; - - if (!m_passthroughHDR && toneMapMethod != VS_TONEMAPMETHOD_OFF) - { - if (buf.hasLightMetadata || (buf.hasDisplayMetadata && buf.displayMetadata.has_luminance)) - { - toneMap = true; - } - } - - if (toneMap != m_toneMap || toneMapMethod != m_toneMapMethod) - { - m_reloadShaders = true; - } - - m_toneMap = toneMap; - m_toneMapMethod = toneMapMethod; + CheckVideoParameters(index); if (m_reloadShaders) { @@ -1052,30 +1030,7 @@ void CLinuxRendererGLES::RenderToFBO(int index, int field) CPictureBuffer &buf = m_buffers[index]; CYuvPlane (&planes)[YuvImage::MAX_PLANES] = m_buffers[index].fields[field]; - if (buf.m_srcPrimaries != m_srcPrimaries) - { - m_srcPrimaries = buf.m_srcPrimaries; - m_reloadShaders = true; - } - - bool toneMap = false; - ETONEMAPMETHOD toneMapMethod = m_videoSettings.m_ToneMapMethod; - - if (toneMapMethod != VS_TONEMAPMETHOD_OFF) - { - if (buf.hasLightMetadata || (buf.hasDisplayMetadata && buf.displayMetadata.has_luminance)) - { - toneMap = true; - } - } - - if (toneMap != m_toneMap || m_toneMapMethod != toneMapMethod) - { - m_reloadShaders = true; - } - - m_toneMap = toneMap; - m_toneMapMethod = toneMapMethod; + CheckVideoParameters(index); if (m_reloadShaders) { @@ -1850,3 +1805,31 @@ CRenderCapture* CLinuxRendererGLES::GetRenderCapture() { return new CRenderCaptureGLES; } + +void CLinuxRendererGLES::CheckVideoParameters(int index) +{ + const CPictureBuffer& buf = m_buffers[index]; + const ETONEMAPMETHOD& toneMapMethod = m_videoSettings.m_ToneMapMethod; + + if (buf.m_srcPrimaries != m_srcPrimaries) + { + m_srcPrimaries = buf.m_srcPrimaries; + m_reloadShaders = true; + } + + bool toneMap = false; + const bool streamIsHDRPQ = + (buf.m_srcColTransfer == AVCOL_TRC_SMPTE2084 && buf.m_srcPrimaries == AVCOL_PRI_BT2020); + + if (streamIsHDRPQ && !m_passthroughHDR && toneMapMethod != VS_TONEMAPMETHOD_OFF) + { + toneMap = true; + } + + if (toneMap != m_toneMap || toneMapMethod != m_toneMapMethod) + { + m_reloadShaders = true; + m_toneMap = toneMap; + m_toneMapMethod = toneMapMethod; + } +} diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h index 5fb5118fbd4ba..973428db1daad 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h @@ -100,6 +100,7 @@ class CLinuxRendererGLES : public CBaseRenderer virtual void ReleaseShaders(); void SetTextureFilter(GLenum method); void UpdateVideoFilter(); + void CheckVideoParameters(int index); AVColorPrimaries GetSrcPrimaries(AVColorPrimaries srcPrimaries, unsigned int width, unsigned int height); // textures @@ -176,6 +177,8 @@ class CLinuxRendererGLES : public CBaseRenderer AVColorPrimaries m_srcPrimaries; AVColorSpace m_srcColSpace; + AVColorTransferCharacteristic m_srcColTransfer; + int m_srcBits{8}; int m_srcTextureBits{8}; bool m_srcFullRange;