diff --git a/app/streaming/video/ffmpeg-renderers/dxva2.cpp b/app/streaming/video/ffmpeg-renderers/dxva2.cpp index 815a76c7..cdfa2bb8 100644 --- a/app/streaming/video/ffmpeg-renderers/dxva2.cpp +++ b/app/streaming/video/ffmpeg-renderers/dxva2.cpp @@ -27,7 +27,7 @@ DXVA2Renderer::DXVA2Renderer() : m_ProcService(nullptr), m_Processor(nullptr), m_FrameIndex(0), - m_OverlayFont(nullptr), + m_DebugOverlayFont(nullptr), m_BlockingPresent(false) { RtlZeroMemory(m_DecSurfaces, sizeof(m_DecSurfaces)); @@ -47,7 +47,7 @@ DXVA2Renderer::~DXVA2Renderer() SAFE_COM_RELEASE(m_RenderTarget); SAFE_COM_RELEASE(m_ProcService); SAFE_COM_RELEASE(m_Processor); - SAFE_COM_RELEASE(m_OverlayFont); + SAFE_COM_RELEASE(m_DebugOverlayFont); for (int i = 0; i < ARRAYSIZE(m_DecSurfaces); i++) { SAFE_COM_RELEASE(m_DecSurfaces[i]); @@ -324,32 +324,6 @@ bool DXVA2Renderer::initializeRenderer() return true; } -bool DXVA2Renderer::initializeOverlay() -{ - HRESULT hr; - - hr = D3DXCreateFontA(m_Device, - 20, - 0, - FW_HEAVY, - 1, - false, - ANSI_CHARSET, - OUT_DEFAULT_PRECIS, - DEFAULT_QUALITY, - DEFAULT_PITCH | FF_DONTCARE, - "", - &m_OverlayFont); - if (FAILED(hr)) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, - "D3DXCreateFontA() failed: %x", - hr); - return false; - } - - return true; -} - bool DXVA2Renderer::isDXVideoProcessorAPIBlacklisted() { IDirect3D9* d3d9; @@ -706,9 +680,6 @@ bool DXVA2Renderer::initialize(SDL_Window* window, int videoFormat, int width, i return false; } - // It's okay if this fails - initializeOverlay(); - // For some reason, using Direct3D9Ex breaks this with multi-monitor setups. // When focus is lost, the window is minimized then immediately restored without // input focus. This glitches out the renderer and a bunch of other stuff. @@ -736,6 +707,33 @@ IFFmpegRenderer::FramePacingConstraint DXVA2Renderer::getFramePacingConstraint() return PACING_ANY; } +void DXVA2Renderer::notifyOverlayUpdated(Overlay::OverlayType) +{ + HRESULT hr; + + // Initialize the overlay font if it's not already created + if (m_DebugOverlayFont == nullptr) { + hr = D3DXCreateFontA(m_Device, + Session::get()->getOverlayManager().getOverlayFontSize(Overlay::OverlayDebug), + 0, + FW_HEAVY, + 1, + false, + ANSI_CHARSET, + OUT_DEFAULT_PRECIS, + DEFAULT_QUALITY, + DEFAULT_PITCH | FF_DONTCARE, + "", + &m_DebugOverlayFont); + if (FAILED(hr)) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "D3DXCreateFontA() failed: %x", + hr); + m_DebugOverlayFont = nullptr; + } + } +} + void DXVA2Renderer::renderFrameAtVsync(AVFrame *frame) { IDirect3DSurface9* surface = reinterpret_cast(frame->data[3]); @@ -919,15 +917,15 @@ void DXVA2Renderer::renderFrameAtVsync(AVFrame *frame) } } - if (m_OverlayFont != nullptr) { + if (m_DebugOverlayFont != nullptr) { if (Session::get()->getOverlayManager().isOverlayEnabled(Overlay::OverlayDebug)) { SDL_Color color = Session::get()->getOverlayManager().getOverlayColor(Overlay::OverlayDebug); - m_OverlayFont->DrawTextA(nullptr, - Session::get()->getOverlayManager().getOverlayText(Overlay::OverlayDebug), - -1, - &sample.DstRect, - DT_LEFT | DT_NOCLIP, - D3DCOLOR_ARGB(color.a, color.r, color.g, color.b)); + m_DebugOverlayFont->DrawTextA(nullptr, + Session::get()->getOverlayManager().getOverlayText(Overlay::OverlayDebug), + -1, + &sample.DstRect, + DT_LEFT | DT_NOCLIP, + D3DCOLOR_ARGB(color.a, color.r, color.g, color.b)); } } diff --git a/app/streaming/video/ffmpeg-renderers/dxva2.h b/app/streaming/video/ffmpeg-renderers/dxva2.h index 49afcad5..5556a8ca 100644 --- a/app/streaming/video/ffmpeg-renderers/dxva2.h +++ b/app/streaming/video/ffmpeg-renderers/dxva2.h @@ -27,12 +27,12 @@ public: virtual bool needsTestFrame(); virtual int getDecoderCapabilities(); virtual FramePacingConstraint getFramePacingConstraint(); + virtual void notifyOverlayUpdated(Overlay::OverlayType) override; private: bool initializeDecoder(); bool initializeRenderer(); bool initializeDevice(SDL_Window* window, bool enableVsync); - bool initializeOverlay(); bool isDecoderBlacklisted(); bool isDXVideoProcessorAPIBlacklisted(); @@ -70,6 +70,6 @@ private: DXVA2_ValueRange m_SaturationRange; DXVA2_VideoDesc m_Desc; REFERENCE_TIME m_FrameIndex; - LPD3DXFONT m_OverlayFont; + LPD3DXFONT m_DebugOverlayFont; bool m_BlockingPresent; }; diff --git a/app/streaming/video/ffmpeg-renderers/sdlvid.cpp b/app/streaming/video/ffmpeg-renderers/sdlvid.cpp index 83cb8d8b..b48c5062 100644 --- a/app/streaming/video/ffmpeg-renderers/sdlvid.cpp +++ b/app/streaming/video/ffmpeg-renderers/sdlvid.cpp @@ -18,13 +18,6 @@ SdlRenderer::SdlRenderer() TTF_GetError()); return; } - - m_DebugOverlayFont = TTF_OpenFont("ModeSeven.ttf", 20); - if (m_DebugOverlayFont == nullptr) { - SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, - "TTF_OpenFont() failed: %s", - TTF_GetError()); - } } SdlRenderer::~SdlRenderer() @@ -85,8 +78,16 @@ void SdlRenderer::notifyOverlayUpdated(Overlay::OverlayType type) { if (type == Overlay::OverlayDebug) { if (m_DebugOverlayFont == nullptr) { - // Can't proceed without a font - return; + m_DebugOverlayFont = TTF_OpenFont("ModeSeven.ttf", + Session::get()->getOverlayManager().getOverlayFontSize(Overlay::OverlayDebug)); + if (m_DebugOverlayFont == nullptr) { + SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, + "TTF_OpenFont() failed: %s", + TTF_GetError()); + + // Can't proceed without a font + return; + } } SDL_Surface* oldSurface = (SDL_Surface*)SDL_AtomicGetPtr((void**)&m_DebugOverlaySurface); diff --git a/app/streaming/video/overlaymanager.cpp b/app/streaming/video/overlaymanager.cpp index f4a78dc2..00615432 100644 --- a/app/streaming/video/overlaymanager.cpp +++ b/app/streaming/video/overlaymanager.cpp @@ -8,17 +8,24 @@ OverlayManager::OverlayManager() : memset(m_Overlays, 0, sizeof(m_Overlays)); m_Overlays[OverlayType::OverlayDebug].color = {0xFF, 0xFF, 0xFF, 0xFF}; + m_Overlays[OverlayType::OverlayDebug].fontSize = 20; } bool OverlayManager::isOverlayEnabled(OverlayType type) { return m_Overlays[type].enabled; } + char* OverlayManager::getOverlayText(OverlayType type) { return m_Overlays[type].text; } +int OverlayManager::getOverlayFontSize(OverlayType type) +{ + return m_Overlays[type].fontSize; +} + void OverlayManager::setOverlayTextUpdated(OverlayType type) { // Only update the overlay state if it's enabled. If it's not enabled, diff --git a/app/streaming/video/overlaymanager.h b/app/streaming/video/overlaymanager.h index e8c15ad7..808491be 100644 --- a/app/streaming/video/overlaymanager.h +++ b/app/streaming/video/overlaymanager.h @@ -31,11 +31,13 @@ public: void setOverlayTextUpdated(OverlayType type); void setOverlayState(OverlayType type, bool enabled); SDL_Color getOverlayColor(OverlayType type); + int getOverlayFontSize(OverlayType type); void setOverlayRenderer(IOverlayRenderer* renderer); struct { bool enabled; + int fontSize; SDL_Color color; char text[512]; } m_Overlays[OverlayMax];