From e20d56041ea73a543511385583c580f4c09b21f3 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 31 Dec 2023 15:21:18 -0600 Subject: [PATCH] Fix rare race condition in overlay update code --- app/streaming/video/ffmpeg-renderers/d3d11va.cpp | 5 +++-- app/streaming/video/ffmpeg-renderers/dxva2.cpp | 5 +++-- app/streaming/video/ffmpeg-renderers/vaapi.cpp | 5 +++-- app/streaming/video/ffmpeg-renderers/vdpau.cpp | 5 +++-- app/streaming/video/slvid.cpp | 5 +++-- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/app/streaming/video/ffmpeg-renderers/d3d11va.cpp b/app/streaming/video/ffmpeg-renderers/d3d11va.cpp index e9825edf..1ac76d01 100644 --- a/app/streaming/video/ffmpeg-renderers/d3d11va.cpp +++ b/app/streaming/video/ffmpeg-renderers/d3d11va.cpp @@ -715,7 +715,8 @@ void D3D11VARenderer::notifyOverlayUpdated(Overlay::OverlayType type) HRESULT hr; SDL_Surface* newSurface = Session::get()->getOverlayManager().getUpdatedOverlaySurface(type); - if (newSurface == nullptr && Session::get()->getOverlayManager().isOverlayEnabled(type)) { + bool overlayEnabled = Session::get()->getOverlayManager().isOverlayEnabled(type); + if (newSurface == nullptr && overlayEnabled) { // The overlay is enabled and there is no new surface. Leave the old texture alone. return; } @@ -736,7 +737,7 @@ void D3D11VARenderer::notifyOverlayUpdated(Overlay::OverlayType type) SAFE_COM_RELEASE(oldVertexBuffer); // If the overlay is disabled, we're done - if (!Session::get()->getOverlayManager().isOverlayEnabled(type)) { + if (!overlayEnabled) { SDL_FreeSurface(newSurface); return; } diff --git a/app/streaming/video/ffmpeg-renderers/dxva2.cpp b/app/streaming/video/ffmpeg-renderers/dxva2.cpp index 27116519..978f86cf 100644 --- a/app/streaming/video/ffmpeg-renderers/dxva2.cpp +++ b/app/streaming/video/ffmpeg-renderers/dxva2.cpp @@ -844,7 +844,8 @@ void DXVA2Renderer::notifyOverlayUpdated(Overlay::OverlayType type) HRESULT hr; SDL_Surface* newSurface = Session::get()->getOverlayManager().getUpdatedOverlaySurface(type); - if (newSurface == nullptr && Session::get()->getOverlayManager().isOverlayEnabled(type)) { + bool overlayEnabled = Session::get()->getOverlayManager().isOverlayEnabled(type); + if (newSurface == nullptr && overlayEnabled) { // The overlay is enabled and there is no new surface. Leave the old texture alone. return; } @@ -861,7 +862,7 @@ void DXVA2Renderer::notifyOverlayUpdated(Overlay::OverlayType type) SAFE_COM_RELEASE(oldVertexBuffer); // If the overlay is disabled, we're done - if (!Session::get()->getOverlayManager().isOverlayEnabled(type)) { + if (!overlayEnabled) { SDL_FreeSurface(newSurface); return; } diff --git a/app/streaming/video/ffmpeg-renderers/vaapi.cpp b/app/streaming/video/ffmpeg-renderers/vaapi.cpp index 8827aac0..ff76be39 100644 --- a/app/streaming/video/ffmpeg-renderers/vaapi.cpp +++ b/app/streaming/video/ffmpeg-renderers/vaapi.cpp @@ -566,7 +566,8 @@ void VAAPIRenderer::notifyOverlayUpdated(Overlay::OverlayType type) } SDL_Surface* newSurface = Session::get()->getOverlayManager().getUpdatedOverlaySurface(type); - if (newSurface == nullptr && Session::get()->getOverlayManager().isOverlayEnabled(type)) { + bool overlayEnabled = Session::get()->getOverlayManager().isOverlayEnabled(type); + if (newSurface == nullptr && overlayEnabled) { // There's no updated surface and the overlay is enabled, so just leave the old surface alone. return; } @@ -599,7 +600,7 @@ void VAAPIRenderer::notifyOverlayUpdated(Overlay::OverlayType type) } } - if (!Session::get()->getOverlayManager().isOverlayEnabled(type)) { + if (!overlayEnabled) { SDL_FreeSurface(newSurface); return; } diff --git a/app/streaming/video/ffmpeg-renderers/vdpau.cpp b/app/streaming/video/ffmpeg-renderers/vdpau.cpp index e6e1294d..68b43db9 100644 --- a/app/streaming/video/ffmpeg-renderers/vdpau.cpp +++ b/app/streaming/video/ffmpeg-renderers/vdpau.cpp @@ -333,7 +333,8 @@ void VDPAURenderer::notifyOverlayUpdated(Overlay::OverlayType type) VdpStatus status; SDL_Surface* newSurface = Session::get()->getOverlayManager().getUpdatedOverlaySurface(type); - if (newSurface == nullptr && Session::get()->getOverlayManager().isOverlayEnabled(type)) { + bool overlayEnabled = Session::get()->getOverlayManager().isOverlayEnabled(type); + if (newSurface == nullptr && overlayEnabled) { // There's no updated surface and the overlay is enabled, so just leave the old surface alone. return; } @@ -358,7 +359,7 @@ void VDPAURenderer::notifyOverlayUpdated(Overlay::OverlayType type) } } - if (!Session::get()->getOverlayManager().isOverlayEnabled(type)) { + if (!overlayEnabled) { SDL_FreeSurface(newSurface); return; } diff --git a/app/streaming/video/slvid.cpp b/app/streaming/video/slvid.cpp index 5008847e..30829e6f 100644 --- a/app/streaming/video/slvid.cpp +++ b/app/streaming/video/slvid.cpp @@ -181,7 +181,8 @@ void SLVideoDecoder::notifyOverlayUpdated(Overlay::OverlayType type) } SDL_Surface* newSurface = Session::get()->getOverlayManager().getUpdatedOverlaySurface(type); - if (newSurface == nullptr && Session::get()->getOverlayManager().isOverlayEnabled(type)) { + bool overlayEnabled = Session::get()->getOverlayManager().isOverlayEnabled(type); + if (newSurface == nullptr && overlayEnabled) { // There's no updated surface and the overlay is enabled, so just leave the old surface alone. return; } @@ -193,7 +194,7 @@ void SLVideoDecoder::notifyOverlayUpdated(Overlay::OverlayType type) m_Overlay = nullptr; } - if (!Session::get()->getOverlayManager().isOverlayEnabled(type)) { + if (!overlayEnabled) { SDL_FreeSurface(newSurface); return; }