mirror of
https://github.com/moonlight-stream/moonlight-qt.git
synced 2025-07-04 00:36:36 +00:00
Add colorspace support to VAAPI renderer
This commit is contained in:
parent
8b9b96f422
commit
801adb6af7
@ -219,6 +219,13 @@ VAAPIRenderer::isDirectRenderingSupported()
|
|||||||
return m_WindowSystem == SDL_SYSWM_X11;
|
return m_WindowSystem == SDL_SYSWM_X11;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int VAAPIRenderer::getDecoderColorspace()
|
||||||
|
{
|
||||||
|
// Gallium drivers don't support Rec 709 yet - https://gitlab.freedesktop.org/mesa/mesa/issues/1915
|
||||||
|
// Intel-vaapi-driver defaults to Rec 601 - https://github.com/intel/intel-vaapi-driver/blob/021bcb79d1bd873bbd9fbca55f40320344bab866/src/i965_output_dri.c#L186
|
||||||
|
return COLORSPACE_REC_601;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
VAAPIRenderer::renderFrame(AVFrame* frame)
|
VAAPIRenderer::renderFrame(AVFrame* frame)
|
||||||
{
|
{
|
||||||
@ -238,6 +245,27 @@ VAAPIRenderer::renderFrame(AVFrame* frame)
|
|||||||
|
|
||||||
if (m_WindowSystem == SDL_SYSWM_X11) {
|
if (m_WindowSystem == SDL_SYSWM_X11) {
|
||||||
#ifdef HAVE_LIBVA_X11
|
#ifdef HAVE_LIBVA_X11
|
||||||
|
unsigned int flags = 0;
|
||||||
|
|
||||||
|
// NB: Not all VAAPI drivers respect these flags. Many drivers
|
||||||
|
// just ignore them and do the color conversion as Rec 601.
|
||||||
|
switch (frame->colorspace) {
|
||||||
|
case AVCOL_SPC_BT709:
|
||||||
|
flags |= VA_SRC_BT709;
|
||||||
|
break;
|
||||||
|
case AVCOL_SPC_BT470BG:
|
||||||
|
case AVCOL_SPC_SMPTE170M:
|
||||||
|
flags |= VA_SRC_BT601;
|
||||||
|
break;
|
||||||
|
case AVCOL_SPC_SMPTE240M:
|
||||||
|
flags |= VA_SRC_SMPTE_240;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// Unknown colorspace
|
||||||
|
SDL_assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
vaPutSurface(vaDeviceContext->display,
|
vaPutSurface(vaDeviceContext->display,
|
||||||
surface,
|
surface,
|
||||||
m_XWindow,
|
m_XWindow,
|
||||||
@ -245,7 +273,7 @@ VAAPIRenderer::renderFrame(AVFrame* frame)
|
|||||||
m_VideoWidth, m_VideoHeight,
|
m_VideoWidth, m_VideoHeight,
|
||||||
dst.x, dst.y,
|
dst.x, dst.y,
|
||||||
dst.w, dst.h,
|
dst.w, dst.h,
|
||||||
NULL, 0, 0);
|
NULL, 0, flags);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if (m_WindowSystem == SDL_SYSWM_WAYLAND) {
|
else if (m_WindowSystem == SDL_SYSWM_WAYLAND) {
|
||||||
|
@ -38,6 +38,7 @@ public:
|
|||||||
virtual void renderFrame(AVFrame* frame) override;
|
virtual void renderFrame(AVFrame* frame) override;
|
||||||
virtual bool needsTestFrame() override;
|
virtual bool needsTestFrame() override;
|
||||||
virtual bool isDirectRenderingSupported() override;
|
virtual bool isDirectRenderingSupported() override;
|
||||||
|
virtual int getDecoderColorspace() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int m_WindowSystem;
|
int m_WindowSystem;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user