diff --git a/app/resources.qrc b/app/resources.qrc index bfd5e5a8..1a553a05 100644 --- a/app/resources.qrc +++ b/app/resources.qrc @@ -27,8 +27,8 @@ SDL_GameControllerDB/gamecontrollerdb.txt ModeSeven.ttf - shaders/egl.frag - shaders/egl.vert + shaders/egl_nv12.frag + shaders/egl_nv12.vert shaders/egl_overlay.frag shaders/egl_overlay.vert diff --git a/app/shaders/egl.frag b/app/shaders/egl_nv12.frag similarity index 100% rename from app/shaders/egl.frag rename to app/shaders/egl_nv12.frag diff --git a/app/shaders/egl.vert b/app/shaders/egl_nv12.vert similarity index 100% rename from app/shaders/egl.vert rename to app/shaders/egl_nv12.vert diff --git a/app/streaming/video/ffmpeg-renderers/eglvid.cpp b/app/streaming/video/ffmpeg-renderers/eglvid.cpp index 34df1cba..bb6efc1b 100644 --- a/app/streaming/video/ffmpeg-renderers/eglvid.cpp +++ b/app/streaming/video/ffmpeg-renderers/eglvid.cpp @@ -373,18 +373,25 @@ bool EGLRenderer::compileShaders() { SDL_assert(m_EGLImagePixelFormat != AV_PIX_FMT_NONE); // XXX: TODO: other formats - SDL_assert(m_EGLImagePixelFormat == AV_PIX_FMT_NV12); + if (m_EGLImagePixelFormat == AV_PIX_FMT_NV12) { + m_ShaderProgram = compileShader("egl_nv12.vert", "egl_nv12.frag"); + if (!m_ShaderProgram) { + return false; + } - m_ShaderProgram = compileShader("egl.vert", "egl.frag"); - if (!m_ShaderProgram) { + m_ShaderProgramParams[PARAM_YUVMAT] = glGetUniformLocation(m_ShaderProgram, "yuvmat"); + m_ShaderProgramParams[PARAM_OFFSET] = glGetUniformLocation(m_ShaderProgram, "offset"); + m_ShaderProgramParams[PARAM_PLANE1] = glGetUniformLocation(m_ShaderProgram, "plane1"); + m_ShaderProgramParams[PARAM_PLANE2] = glGetUniformLocation(m_ShaderProgram, "plane2"); + } + else { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "Unsupported EGL pixel format: %d", + m_EGLImagePixelFormat); + SDL_assert(false); return false; } - m_ShaderProgramParams[PARAM_YUVMAT] = glGetUniformLocation(m_ShaderProgram, "yuvmat"); - m_ShaderProgramParams[PARAM_OFFSET] = glGetUniformLocation(m_ShaderProgram, "offset"); - m_ShaderProgramParams[PARAM_PLANE1] = glGetUniformLocation(m_ShaderProgram, "plane1"); - m_ShaderProgramParams[PARAM_PLANE2] = glGetUniformLocation(m_ShaderProgram, "plane2"); - m_OverlayShaderProgram = compileShader("egl_overlay.vert", "egl_overlay.frag"); if (!m_OverlayShaderProgram) { return false; @@ -778,10 +785,13 @@ void EGLRenderer::renderFrame(AVFrame* frame) glUseProgram(m_ShaderProgram); m_glBindVertexArrayOES(m_VAO); - glUniformMatrix3fv(m_ShaderProgramParams[PARAM_YUVMAT], 1, GL_FALSE, getColorMatrix()); - glUniform3fv(m_ShaderProgramParams[PARAM_OFFSET], 1, getColorOffsets()); - glUniform1i(m_ShaderProgramParams[PARAM_PLANE1], 0); - glUniform1i(m_ShaderProgramParams[PARAM_PLANE2], 1); + // Bind parameters for the NV12 shaders + if (m_EGLImagePixelFormat == AV_PIX_FMT_NV12) { + glUniformMatrix3fv(m_ShaderProgramParams[PARAM_YUVMAT], 1, GL_FALSE, getColorMatrix()); + glUniform3fv(m_ShaderProgramParams[PARAM_OFFSET], 1, getColorOffsets()); + glUniform1i(m_ShaderProgramParams[PARAM_PLANE1], 0); + glUniform1i(m_ShaderProgramParams[PARAM_PLANE2], 1); + } glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);