Explicitly request limited range for renderers that require it

This commit is contained in:
Cameron Gutman
2026-08-05 23:25:30 -05:00
parent 2bea406f67
commit a903c5cef2
9 changed files with 35 additions and 0 deletions
@@ -784,6 +784,14 @@ int DXVA2Renderer::getDecoderColorspace()
}
}
int DXVA2Renderer::getDecoderColorRange()
{
// StretchRect() assumes limited range on Intel and Qualcomm GPUs.
// VideoProcessBlt() should handle either fine, but let's not take
// chances on potentially broken DXVA2 GPU drivers for little gain.
return COLOR_RANGE_LIMITED;
}
int DXVA2Renderer::getDecoderCapabilities()
{
return CAPABILITY_REFERENCE_FRAME_INVALIDATION_HEVC |
@@ -18,6 +18,7 @@ public:
virtual void renderFrame(AVFrame* frame) override;
virtual void notifyOverlayUpdated(Overlay::OverlayType type) override;
virtual int getDecoderColorspace() override;
virtual int getDecoderColorRange() override;
virtual int getDecoderCapabilities() override;
private:
@@ -242,6 +242,12 @@ int MmalRenderer::getDecoderColorspace()
return COLORSPACE_REC_709;
}
int MmalRenderer::getDecoderColorRange()
{
// MMAL_COLOR_SPACE_ITUR_BT709 assumes limited range content
return COLOR_RANGE_LIMITED;
}
void MmalRenderer::InputPortCallback(MMAL_PORT_T*, MMAL_BUFFER_HEADER_T* buffer)
{
mmal_buffer_header_release(buffer);
@@ -18,6 +18,7 @@ public:
virtual enum AVPixelFormat getPreferredPixelFormat(int videoFormat) override;
virtual int getRendererAttributes() override;
virtual int getDecoderColorspace() override;
virtual int getDecoderColorRange() override;
private:
static void InputPortCallback(MMAL_PORT_T* port, MMAL_BUFFER_HEADER_T* buffer);
@@ -648,6 +648,12 @@ int VAAPIRenderer::getDecoderColorspace()
return COLORSPACE_REC_601;
}
int VAAPIRenderer::getDecoderColorRange()
{
// vaPutSurface() assumes limited range
return COLOR_RANGE_LIMITED;
}
int VAAPIRenderer::getDecoderCapabilities()
{
int caps = 0;
@@ -64,6 +64,7 @@ public:
virtual void renderFrame(AVFrame* frame) override;
virtual bool isDirectRenderingSupported() override;
virtual int getDecoderColorspace() override;
virtual int getDecoderColorRange() override;
virtual int getDecoderCapabilities() override;
virtual void notifyOverlayUpdated(Overlay::OverlayType) override;
virtual bool notifyWindowChanged(PWINDOW_STATE_CHANGE_INFO) override;
@@ -470,6 +470,12 @@ int VDPAURenderer::getDecoderColorspace()
return COLORSPACE_REC_601;
}
int VDPAURenderer::getDecoderColorRange()
{
// The default VdpVideoMixer CSC matrix assumes limited range
return COLOR_RANGE_LIMITED;
}
int VDPAURenderer::getDecoderCapabilities()
{
return CAPABILITY_REFERENCE_FRAME_INVALIDATION_HEVC |
@@ -19,6 +19,7 @@ public:
virtual void waitToRender() override;
virtual void renderFrame(AVFrame* frame) override;
virtual int getDecoderColorspace() override;
virtual int getDecoderColorRange() override;
virtual int getDecoderCapabilities() override;
private:
@@ -457,6 +457,11 @@ public:
return COLORSPACE_REC_601;
}
int getDecoderColorRange() override
{
return COLOR_RANGE_LIMITED;
}
int getDecoderCapabilities() override
{
return CAPABILITY_REFERENCE_FRAME_INVALIDATION_HEVC |