diff --git a/app/streaming/video/ffmpeg-renderers/eglvid.cpp b/app/streaming/video/ffmpeg-renderers/eglvid.cpp index 9f98281e..085b1845 100644 --- a/app/streaming/video/ffmpeg-renderers/eglvid.cpp +++ b/app/streaming/video/ffmpeg-renderers/eglvid.cpp @@ -64,6 +64,8 @@ EGLRenderer::EGLRenderer(IFFmpegRenderer *backendRenderer) EGLRenderer::~EGLRenderer() { if (m_Context) { + // Reattach the GL context to the main thread for destruction + SDL_GL_MakeCurrent(m_Window, m_Context); if (m_ShaderProgram) glDeleteProgram(m_ShaderProgram); if (m_VAO) @@ -88,12 +90,6 @@ void EGLRenderer::notifyOverlayUpdated(Overlay::OverlayType) // TODO: FIXME } -bool EGLRenderer::isRenderThreadSupported() -{ - // TODO: can we use DMA-BUF in multithreaded context ? - return false; -} - bool EGLRenderer::isPixelFormatSupported(int, AVPixelFormat pixelFormat) { // Remember to keep this in sync with EGLRenderer::renderFrame()! @@ -307,6 +303,9 @@ bool EGLRenderer::initialize(PDECODER_PARAMETERS params) if (err != GL_NO_ERROR) EGL_LOG(Error, "OpenGL error: %d", err); + // Detach the context from this thread, so the render thread can attach it + SDL_GL_MakeCurrent(m_Window, nullptr); + return err == GL_NO_ERROR; } @@ -366,6 +365,9 @@ const float *EGLRenderer::getColorMatrix() { bool EGLRenderer::specialize() { SDL_assert(!m_VAO); + // Attach our GL context to the render thread + SDL_GL_MakeCurrent(m_Window, m_Context); + if (!compileShader()) return false; @@ -436,7 +438,8 @@ void EGLRenderer::renderFrame(AVFrame* frame) EGLImage imgs[EGL_MAX_PLANES]; if (frame == nullptr) { - // End of stream - nothing to do for us + // End of stream - unbind the GL context + SDL_GL_MakeCurrent(m_Window, nullptr); return; } diff --git a/app/streaming/video/ffmpeg-renderers/eglvid.h b/app/streaming/video/ffmpeg-renderers/eglvid.h index b217017a..b843abb4 100644 --- a/app/streaming/video/ffmpeg-renderers/eglvid.h +++ b/app/streaming/video/ffmpeg-renderers/eglvid.h @@ -10,7 +10,6 @@ public: virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary** options) override; virtual void renderFrame(AVFrame* frame) override; virtual void notifyOverlayUpdated(Overlay::OverlayType) override; - virtual bool isRenderThreadSupported() override; virtual bool isPixelFormatSupported(int videoFormat, enum AVPixelFormat pixelFormat) override; private: