From b4548c1af2785fe54979577f04ce9512b65ec6df Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 12 May 2020 18:41:36 -0700 Subject: [PATCH] Flush all window events after SDL_CreateRenderer() --- app/streaming/session.cpp | 6 ++++++ app/streaming/video/ffmpeg-renderers/sdlvid.cpp | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/app/streaming/session.cpp b/app/streaming/session.cpp index 237b8098..82770cb7 100644 --- a/app/streaming/session.cpp +++ b/app/streaming/session.cpp @@ -1251,6 +1251,12 @@ void Session::exec(int displayOriginX, int displayOriginY) SDL_SetWindowPosition(m_Window, x, y); } + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, + "Recreating renderer for window event: %d (%d %d)", + event.window.event, + event.window.data1, + event.window.data2); + // Fall through case SDL_RENDER_DEVICE_RESET: case SDL_RENDER_TARGETS_RESET: diff --git a/app/streaming/video/ffmpeg-renderers/sdlvid.cpp b/app/streaming/video/ffmpeg-renderers/sdlvid.cpp index 5bb0efc9..43e40f5a 100644 --- a/app/streaming/video/ffmpeg-renderers/sdlvid.cpp +++ b/app/streaming/video/ffmpeg-renderers/sdlvid.cpp @@ -177,6 +177,14 @@ bool SdlRenderer::initialize(PDECODER_PARAMETERS params) return false; } + // SDL_CreateRenderer() can end up having to recreate our window (SDL_RecreateWindow()) + // to ensure it's compatible with the renderer's OpenGL context. If that happens, we + // can get spurious SDL_WINDOWEVENT events that will cause us to (again) recreate our + // renderer. This can lead to an infinite to renderer recreation, so discard all + // SDL_WINDOWEVENT events after SDL_CreateRenderer(). + SDL_PumpEvents(); + SDL_FlushEvent(SDL_WINDOWEVENT); + // Calculate the video region size, scaling to fill the output size while // preserving the aspect ratio of the video stream. SDL_Rect src, dst;