From 46bd8ad83d961d9633478a1557ea39a2f53d2c33 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 12 Feb 2019 21:55:15 -0800 Subject: [PATCH] Add debug overlay for SDL renderer --- app/ModeSeven.ttf | Bin 0 -> 28360 bytes app/app.pro | 6 +- .../video/ffmpeg-renderers/sdlvid.cpp | 93 +++++++++++++++++- app/streaming/video/ffmpeg-renderers/sdlvid.h | 21 ++-- scripts/generate-installers.bat | 4 + 5 files changed, 113 insertions(+), 11 deletions(-) create mode 100644 app/ModeSeven.ttf diff --git a/app/ModeSeven.ttf b/app/ModeSeven.ttf new file mode 100644 index 0000000000000000000000000000000000000000..87c9280f92f929675fe70e233a1bd4e4698b1711 GIT binary patch literal 28360 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 literal 0 HcmV?d00001 diff --git a/app/app.pro b/app/app.pro index 0b5b0a09..cabe8424 100644 --- a/app/app.pro +++ b/app/app.pro @@ -91,7 +91,7 @@ unix:!macx { } } win32 { - LIBS += -llibssl -llibcrypto -lSDL2 -lavcodec -lavutil -lopus -ld3dx9 + LIBS += -llibssl -llibcrypto -lSDL2 -lSDL2_ttf -lavcodec -lavutil -lopus -ld3dx9 CONFIG += ffmpeg soundio } macx { @@ -307,7 +307,7 @@ unix:!macx: { appstream.files = deploy/linux/com.moonlight_stream.Moonlight.appdata.xml appstream.path = $$PREFIX/$$DATADIR/metainfo/ - appdata.files = SDL_GameControllerDB/gamecontrollerdb.txt + appdata.files = SDL_GameControllerDB/gamecontrollerdb.txt ModeSeven.ttf appdata.path = "$$PREFIX/$$DATADIR/Moonlight Game Streaming Project/Moonlight/" INSTALLS += target appdata desktop icons appstream @@ -328,7 +328,7 @@ macx { QMAKE_INFO_PLIST = $$OUT_PWD/Info.plist - APP_BUNDLE_RESOURCES.files = moonlight.icns SDL_GameControllerDB/gamecontrollerdb.txt + APP_BUNDLE_RESOURCES.files = moonlight.icns SDL_GameControllerDB/gamecontrollerdb.txt ModeSeven.ttf APP_BUNDLE_RESOURCES.path = Contents/Resources APP_BUNDLE_FRAMEWORKS.files = $$files(../libs/mac/Frameworks/*.framework, true) diff --git a/app/streaming/video/ffmpeg-renderers/sdlvid.cpp b/app/streaming/video/ffmpeg-renderers/sdlvid.cpp index 97fd26e6..83cb8d8b 100644 --- a/app/streaming/video/ffmpeg-renderers/sdlvid.cpp +++ b/app/streaming/video/ffmpeg-renderers/sdlvid.cpp @@ -1,16 +1,49 @@ #include "sdlvid.h" +#include "streaming/session.h" + #include SdlRenderer::SdlRenderer() : m_Renderer(nullptr), - m_Texture(nullptr) + m_Texture(nullptr), + m_DebugOverlayFont(nullptr), + m_DebugOverlaySurface(nullptr), + m_DebugOverlayTexture(nullptr) { + SDL_assert(TTF_WasInit() == 0); + if (TTF_Init() != 0) { + SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, + "TTF_Init() failed: %s", + 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() { + if (m_DebugOverlayFont != nullptr) { + TTF_CloseFont(m_DebugOverlayFont); + } + + TTF_Quit(); + SDL_assert(TTF_WasInit() == 0); + + if (m_DebugOverlayTexture != nullptr) { + SDL_DestroyTexture(m_DebugOverlayTexture); + } + + if (m_DebugOverlaySurface != nullptr) { + SDL_FreeSurface(m_DebugOverlaySurface); + } + if (m_Texture != nullptr) { SDL_DestroyTexture(m_Texture); } @@ -48,6 +81,35 @@ IFFmpegRenderer::FramePacingConstraint SdlRenderer::getFramePacingConstraint() return PACING_ANY; } +void SdlRenderer::notifyOverlayUpdated(Overlay::OverlayType type) +{ + if (type == Overlay::OverlayDebug) { + if (m_DebugOverlayFont == nullptr) { + // Can't proceed without a font + return; + } + + SDL_Surface* oldSurface = (SDL_Surface*)SDL_AtomicGetPtr((void**)&m_DebugOverlaySurface); + + // Free the old surface + if (oldSurface != nullptr && SDL_AtomicCASPtr((void**)&m_DebugOverlaySurface, oldSurface, nullptr)) { + SDL_FreeSurface(oldSurface); + } + + if (Session::get()->getOverlayManager().isOverlayEnabled(type)) { + // The _Wrapped variant is required for line breaks to work + SDL_Surface* surface = TTF_RenderText_Blended_Wrapped(m_DebugOverlayFont, + Session::get()->getOverlayManager().getOverlayText(type), + Session::get()->getOverlayManager().getOverlayColor(type), + 1000); + SDL_AtomicSetPtr((void**)&m_DebugOverlaySurface, surface); + } + } + else { + SDL_assert(false); + } +} + bool SdlRenderer::initialize(SDL_Window* window, int, int width, @@ -109,6 +171,35 @@ void SdlRenderer::renderFrameAtVsync(AVFrame* frame) frame->linesize[2]); SDL_RenderClear(m_Renderer); + + // Draw the video content itself SDL_RenderCopy(m_Renderer, m_Texture, nullptr, nullptr); + + // Draw the overlays + if (Session::get()->getOverlayManager().isOverlayEnabled(Overlay::OverlayDebug)) { + // If a new surface has been created for updated overlay data, convert it into a texture. + // NB: We have to do this conversion at render-time because we can only interact + // with the renderer on a single thread. + SDL_Surface* surface = (SDL_Surface*)SDL_AtomicGetPtr((void**)&m_DebugOverlaySurface); + if (surface != nullptr && SDL_AtomicCASPtr((void**)&m_DebugOverlaySurface, surface, nullptr)) { + if (m_DebugOverlayTexture != nullptr) { + SDL_DestroyTexture(m_DebugOverlayTexture); + } + + m_DebugOverlayRect.x = 0; + m_DebugOverlayRect.y = 0; + m_DebugOverlayRect.w = surface->w; + m_DebugOverlayRect.h = surface->h; + + m_DebugOverlayTexture = SDL_CreateTextureFromSurface(m_Renderer, surface); + SDL_FreeSurface(surface); + } + + // If we have a debug overlay texture, render it too + if (m_DebugOverlayTexture != nullptr) { + SDL_RenderCopy(m_Renderer, m_DebugOverlayTexture, nullptr, &m_DebugOverlayRect); + } + } + SDL_RenderPresent(m_Renderer); } diff --git a/app/streaming/video/ffmpeg-renderers/sdlvid.h b/app/streaming/video/ffmpeg-renderers/sdlvid.h index 40d58ac4..2275ef1a 100644 --- a/app/streaming/video/ffmpeg-renderers/sdlvid.h +++ b/app/streaming/video/ffmpeg-renderers/sdlvid.h @@ -2,24 +2,31 @@ #include "renderer.h" +#include + class SdlRenderer : public IFFmpegRenderer { public: SdlRenderer(); - virtual ~SdlRenderer(); + virtual ~SdlRenderer() override; virtual bool initialize(SDL_Window* window, int videoFormat, int width, int height, int maxFps, - bool enableVsync); - virtual bool prepareDecoderContext(AVCodecContext* context); - virtual void renderFrameAtVsync(AVFrame* frame); - virtual bool needsTestFrame(); - virtual int getDecoderCapabilities(); - virtual FramePacingConstraint getFramePacingConstraint(); + bool enableVsync) override; + virtual bool prepareDecoderContext(AVCodecContext* context) override; + virtual void renderFrameAtVsync(AVFrame* frame) override; + virtual bool needsTestFrame() override; + virtual int getDecoderCapabilities() override; + virtual FramePacingConstraint getFramePacingConstraint() override; + virtual void notifyOverlayUpdated(Overlay::OverlayType) override; private: SDL_Renderer* m_Renderer; SDL_Texture* m_Texture; + TTF_Font* m_DebugOverlayFont; + SDL_Surface* m_DebugOverlaySurface; + SDL_Texture* m_DebugOverlayTexture; + SDL_Rect m_DebugOverlayRect; }; diff --git a/scripts/generate-installers.bat b/scripts/generate-installers.bat index a14793f9..a6ef5205 100644 --- a/scripts/generate-installers.bat +++ b/scripts/generate-installers.bat @@ -123,6 +123,10 @@ echo Copying GC mapping list copy %SOURCE_ROOT%\app\SDL_GameControllerDB\gamecontrollerdb.txt %DEPLOY_FOLDER% if !ERRORLEVEL! NEQ 0 goto Error +echo Copying SDL overlay font +copy %SOURCE_ROOT%\app\ModeSeven.ttf %DEPLOY_FOLDER% +if !ERRORLEVEL! NEQ 0 goto Error + echo Deploying Qt dependencies windeployqt.exe --dir %DEPLOY_FOLDER% --%BUILD_CONFIG% --qmldir %SOURCE_ROOT%\app\gui --no-opengl-sw --no-compiler-runtime %BUILD_FOLDER%\app\%BUILD_CONFIG%\Moonlight.exe if !ERRORLEVEL! NEQ 0 goto Error