Pass the correct renderer to EGLImageFactory

We should be using the EGL renderer's colorspace and color range
rather than the backend renderer's for fallbacks. The former is
what actually gets passed to the host PC during stream init.
This commit is contained in:
Cameron Gutman
2026-08-06 00:29:53 -05:00
parent c1623ff44e
commit 7cf8b46c79
8 changed files with 28 additions and 18 deletions
@@ -24,8 +24,8 @@
#define DRM_FORMAT_GR88 fourcc_code('G', 'R', '8', '8')
#endif
EglImageFactory::EglImageFactory(IFFmpegRenderer* renderer) :
m_Renderer(renderer),
EglImageFactory::EglImageFactory() :
m_Renderer(nullptr),
m_EGLExtDmaBuf(false),
m_eglCreateImage(nullptr),
m_eglDestroyImage(nullptr),
@@ -36,9 +36,16 @@ EglImageFactory::EglImageFactory(IFFmpegRenderer* renderer) :
{
}
bool EglImageFactory::initializeEGL(EGLDisplay,
bool EglImageFactory::initializeEGL(IFFmpegRenderer* eglRenderer,
EGLDisplay,
const EGLExtensions &ext)
{
// The EGL renderer is guaranteed to be alive for any calls to this factory,
// since it's the one that calls exportEGLImages() on the backend renderer.
SDL_assert(eglRenderer->getRendererType() == IFFmpegRenderer::RendererType::EGL);
SDL_assert(!m_Renderer);
m_Renderer = eglRenderer;
if (!ext.isSupported("EGL_EXT_image_dma_buf_import")) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"DRM-EGL: DMABUF unsupported");
@@ -75,6 +82,8 @@ void EglImageFactory::resetCache()
ssize_t EglImageFactory::exportDRMImages(AVFrame* frame, EGLDisplay dpy, EGLImage images[EGL_MAX_PLANES])
{
SDL_assert(m_Renderer);
SDL_assert(frame->format == AV_PIX_FMT_DRM_PRIME);
AVDRMFrameDescriptor* drmFrame = (AVDRMFrameDescriptor*)frame->data[0];
@@ -264,6 +273,8 @@ ssize_t EglImageFactory::exportDRMImages(AVFrame* frame, EGLDisplay dpy, EGLImag
ssize_t EglImageFactory::exportVAImages(AVFrame *frame, uint32_t exportFlags, EGLDisplay dpy, EGLImage images[EGL_MAX_PLANES])
{
SDL_assert(m_Renderer);
SDL_assert(frame->format == AV_PIX_FMT_VAAPI);
auto hwFrameCtx = (AVHWFramesContext*)frame->hw_frames_ctx->data;
AVVAAPIDeviceContext* vaDeviceContext = (AVVAAPIDeviceContext*)hwFrameCtx->device_ctx->hwctx;