Add full range handling to SdlRenderer

This commit is contained in:
Cameron Gutman
2026-08-05 23:44:11 -05:00
parent a903c5cef2
commit 4570fba87d
2 changed files with 22 additions and 0 deletions
@@ -352,9 +352,11 @@ ReadbackRetry:
av_dict_set_int(&options, "srcw", frame->width, 0);
av_dict_set_int(&options, "srch", frame->height, 0);
av_dict_set_int(&options, "src_format", frame->format, 0);
av_dict_set_int(&options, "src_range", isFrameFullRange(frame) ? 1 : 0, 0);
av_dict_set_int(&options, "dstw", m_RgbFrame->width, 0);
av_dict_set_int(&options, "dsth", m_RgbFrame->height, 0);
av_dict_set_int(&options, "dst_format", m_RgbFrame->format, 0);
av_dict_set_int(&options, "dst_range", 1, 0);
av_dict_set_int(&options, "threads", std::min(SDL_GetCPUCount(), 4), 0); // Up to 4 threads
err = av_opt_set_dict(m_SwsContext, &options);
@@ -638,3 +640,21 @@ bool SdlRenderer::notifyWindowChanged(PWINDOW_STATE_CHANGE_INFO info)
// We can transparently handle size and display changes
return !(info->stateChangeFlags & ~(WINDOW_STATE_CHANGE_SIZE | WINDOW_STATE_CHANGE_DISPLAY));
}
int SdlRenderer::getDecoderColorspace()
{
// SDL2 only supports both full and limited range for BT.601. Additionally, libswscale
// assumes content is in the BT.601 color space when performing YUV to RGB conversion.
return COLORSPACE_REC_601;
}
int SdlRenderer::getDecoderColorRange()
{
// Prefer full range only on FFmpeg 5.0 or later, since we don't implement
// color range handling in the legacy FFmpeg 4.x codepath.
#if LIBSWSCALE_VERSION_INT >= AV_VERSION_INT(6, 1, 100)
return COLOR_RANGE_FULL;
#else
return COLOR_RANGE_LIMITED;
#endif
}
@@ -23,6 +23,8 @@ public:
virtual bool isPixelFormatSupported(int videoFormat, enum AVPixelFormat pixelFormat) override;
virtual bool testRenderFrame(AVFrame* frame) override;
virtual bool notifyWindowChanged(PWINDOW_STATE_CHANGE_INFO) override;
virtual int getDecoderColorspace() override;
virtual int getDecoderColorRange() override;
private:
void renderOverlay(Overlay::OverlayType type);