From abf2a14ee69a2cb12e81a970cd9bda6f34df06c5 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 13 Jan 2022 01:16:09 -0600 Subject: [PATCH] Handle colorspace changes in SDL renderer --- app/streaming/video/ffmpeg-renderers/sdlvid.cpp | 13 +++++++++++++ app/streaming/video/ffmpeg-renderers/sdlvid.h | 1 + 2 files changed, 14 insertions(+) diff --git a/app/streaming/video/ffmpeg-renderers/sdlvid.cpp b/app/streaming/video/ffmpeg-renderers/sdlvid.cpp index 8a921681..17236891 100644 --- a/app/streaming/video/ffmpeg-renderers/sdlvid.cpp +++ b/app/streaming/video/ffmpeg-renderers/sdlvid.cpp @@ -10,6 +10,7 @@ SdlRenderer::SdlRenderer() m_Renderer(nullptr), m_Texture(nullptr), m_SwPixelFormat(AV_PIX_FMT_NONE), + m_ColorSpace(AVCOL_SPC_UNSPECIFIED), m_MapFrame(false) { SDL_zero(m_OverlayTextures); @@ -372,6 +373,18 @@ ReadbackRetry: } } + // Because the specific YUV color conversion shader is established at + // texture creation for most SDL render backends, we need to recreate + // the texture when the colorspace changes. + if (frame->colorspace != m_ColorSpace && frame->colorspace != AVCOL_SPC_UNSPECIFIED) { + if (m_Texture != nullptr) { + SDL_DestroyTexture(m_Texture); + m_Texture = nullptr; + } + + m_ColorSpace = frame->colorspace; + } + if (m_Texture == nullptr) { Uint32 sdlFormat; diff --git a/app/streaming/video/ffmpeg-renderers/sdlvid.h b/app/streaming/video/ffmpeg-renderers/sdlvid.h index 3ba54334..3223793a 100644 --- a/app/streaming/video/ffmpeg-renderers/sdlvid.h +++ b/app/streaming/video/ffmpeg-renderers/sdlvid.h @@ -26,6 +26,7 @@ private: SDL_Renderer* m_Renderer; SDL_Texture* m_Texture; enum AVPixelFormat m_SwPixelFormat; + enum AVColorSpace m_ColorSpace; bool m_MapFrame; SDL_Texture* m_OverlayTextures[Overlay::OverlayMax]; SDL_Rect m_OverlayRects[Overlay::OverlayMax];