Skip to content

Commit 7cf8b46

Browse files
committed
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.
1 parent c1623ff commit 7cf8b46

8 files changed

Lines changed: 28 additions & 18 deletions

File tree

app/streaming/video/ffmpeg-renderers/drm.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,6 @@ DrmRenderer::DrmRenderer(AVHWDeviceType hwDeviceType, IFFmpegRenderer *backendRe
163163
m_OutputRect{},
164164
m_SwFrameMapper(this),
165165
m_CurrentSwFrameIdx(0)
166-
#ifdef HAVE_EGL
167-
, m_EglImageFactory(this)
168-
#endif
169166
{
170167
SDL_zero(m_SwFrame);
171168
}
@@ -2100,9 +2097,10 @@ AVPixelFormat DrmRenderer::getEGLImagePixelFormat() {
21002097
return AV_PIX_FMT_DRM_PRIME;
21012098
}
21022099

2103-
bool DrmRenderer::initializeEGL(EGLDisplay display,
2100+
bool DrmRenderer::initializeEGL(IFFmpegRenderer* eglRenderer,
2101+
EGLDisplay display,
21042102
const EGLExtensions &ext) {
2105-
return m_EglImageFactory.initializeEGL(display, ext);
2103+
return m_EglImageFactory.initializeEGL(eglRenderer, display, ext);
21062104
}
21072105

21082106
ssize_t DrmRenderer::exportEGLImages(AVFrame *frame, EGLDisplay dpy,

app/streaming/video/ffmpeg-renderers/drm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -776,7 +776,7 @@ class DrmRenderer : public IFFmpegRenderer {
776776
#ifdef HAVE_EGL
777777
virtual bool canExportEGL() override;
778778
virtual AVPixelFormat getEGLImagePixelFormat() override;
779-
virtual bool initializeEGL(EGLDisplay dpy, const EGLExtensions &ext) override;
779+
virtual bool initializeEGL(IFFmpegRenderer* eglRenderer, EGLDisplay dpy, const EGLExtensions &ext) override;
780780
virtual ssize_t exportEGLImages(AVFrame *frame, EGLDisplay dpy, EGLImage images[EGL_MAX_PLANES]) override;
781781
#endif
782782

app/streaming/video/ffmpeg-renderers/eglimagefactory.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
#define DRM_FORMAT_GR88 fourcc_code('G', 'R', '8', '8')
2525
#endif
2626

27-
EglImageFactory::EglImageFactory(IFFmpegRenderer* renderer) :
28-
m_Renderer(renderer),
27+
EglImageFactory::EglImageFactory() :
28+
m_Renderer(nullptr),
2929
m_EGLExtDmaBuf(false),
3030
m_eglCreateImage(nullptr),
3131
m_eglDestroyImage(nullptr),
@@ -36,9 +36,16 @@ EglImageFactory::EglImageFactory(IFFmpegRenderer* renderer) :
3636
{
3737
}
3838

39-
bool EglImageFactory::initializeEGL(EGLDisplay,
39+
bool EglImageFactory::initializeEGL(IFFmpegRenderer* eglRenderer,
40+
EGLDisplay,
4041
const EGLExtensions &ext)
4142
{
43+
// The EGL renderer is guaranteed to be alive for any calls to this factory,
44+
// since it's the one that calls exportEGLImages() on the backend renderer.
45+
SDL_assert(eglRenderer->getRendererType() == IFFmpegRenderer::RendererType::EGL);
46+
SDL_assert(!m_Renderer);
47+
m_Renderer = eglRenderer;
48+
4249
if (!ext.isSupported("EGL_EXT_image_dma_buf_import")) {
4350
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
4451
"DRM-EGL: DMABUF unsupported");
@@ -75,6 +82,8 @@ void EglImageFactory::resetCache()
7582

7683
ssize_t EglImageFactory::exportDRMImages(AVFrame* frame, EGLDisplay dpy, EGLImage images[EGL_MAX_PLANES])
7784
{
85+
SDL_assert(m_Renderer);
86+
7887
SDL_assert(frame->format == AV_PIX_FMT_DRM_PRIME);
7988
AVDRMFrameDescriptor* drmFrame = (AVDRMFrameDescriptor*)frame->data[0];
8089

@@ -264,6 +273,8 @@ ssize_t EglImageFactory::exportDRMImages(AVFrame* frame, EGLDisplay dpy, EGLImag
264273

265274
ssize_t EglImageFactory::exportVAImages(AVFrame *frame, uint32_t exportFlags, EGLDisplay dpy, EGLImage images[EGL_MAX_PLANES])
266275
{
276+
SDL_assert(m_Renderer);
277+
267278
SDL_assert(frame->format == AV_PIX_FMT_VAAPI);
268279
auto hwFrameCtx = (AVHWFramesContext*)frame->hw_frames_ctx->data;
269280
AVVAAPIDeviceContext* vaDeviceContext = (AVVAAPIDeviceContext*)hwFrameCtx->device_ctx->hwctx;

app/streaming/video/ffmpeg-renderers/eglimagefactory.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ class EglImageFactory
4141
};
4242

4343
public:
44-
EglImageFactory(IFFmpegRenderer* renderer);
45-
bool initializeEGL(EGLDisplay, const EGLExtensions &ext);
44+
EglImageFactory();
45+
bool initializeEGL(IFFmpegRenderer* eglRenderer, EGLDisplay, const EGLExtensions &ext);
4646
void resetCache();
4747

4848
#ifdef HAVE_DRM

app/streaming/video/ffmpeg-renderers/eglvid.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,7 @@ bool EGLRenderer::initialize(PDECODER_PARAMETERS params)
523523
return false;
524524
}
525525

526-
if (!m_Backend->initializeEGL(m_EGLDisplay, eglExtensions))
526+
if (!m_Backend->initializeEGL(this, m_EGLDisplay, eglExtensions))
527527
return false;
528528

529529
if (!(m_glEGLImageTargetTexture2DOES = (typeof(m_glEGLImageTargetTexture2DOES))eglGetProcAddress("glEGLImageTargetTexture2DOES"))) {

app/streaming/video/ffmpeg-renderers/renderer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,8 @@ class IFFmpegRenderer : public Overlay::IOverlayRenderer {
508508
return AV_PIX_FMT_NONE;
509509
}
510510

511-
virtual bool initializeEGL(EGLDisplay,
511+
virtual bool initializeEGL(IFFmpegRenderer*,
512+
EGLDisplay,
512513
const EGLExtensions &) {
513514
return false;
514515
}

app/streaming/video/ffmpeg-renderers/vaapi.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ VAAPIRenderer::VAAPIRenderer(int decoderSelectionPass)
2626
m_RequiresExplicitPixelFormat(false),
2727
m_OverlayMutex(nullptr)
2828
#ifdef HAVE_EGL
29-
, m_EglExportType(EglExportType::Unknown),
30-
m_EglImageFactory(this)
29+
, m_EglExportType(EglExportType::Unknown)
3130
#endif
3231
{
3332
#ifdef HAVE_LIBVA_X11
@@ -1082,11 +1081,12 @@ AVPixelFormat VAAPIRenderer::getEGLImagePixelFormat() {
10821081
}
10831082

10841083
bool
1085-
VAAPIRenderer::initializeEGL(EGLDisplay dpy,
1084+
VAAPIRenderer::initializeEGL(IFFmpegRenderer* eglRenderer,
1085+
EGLDisplay dpy,
10861086
const EGLExtensions &ext) {
10871087
VADRMPRIMESurfaceDescriptor descriptor;
10881088

1089-
if (!m_EglImageFactory.initializeEGL(dpy, ext)) {
1089+
if (!m_EglImageFactory.initializeEGL(eglRenderer, dpy, ext)) {
10901090
return false;
10911091
}
10921092

app/streaming/video/ffmpeg-renderers/vaapi.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class VAAPIRenderer : public IFFmpegRenderer
7272
#ifdef HAVE_EGL
7373
virtual bool canExportEGL() override;
7474
virtual AVPixelFormat getEGLImagePixelFormat() override;
75-
virtual bool initializeEGL(EGLDisplay dpy, const EGLExtensions &ext) override;
75+
virtual bool initializeEGL(IFFmpegRenderer* eglRenderer, EGLDisplay dpy, const EGLExtensions &ext) override;
7676
virtual ssize_t exportEGLImages(AVFrame *frame, EGLDisplay dpy, EGLImage images[EGL_MAX_PLANES]) override;
7777
#endif
7878

0 commit comments

Comments
 (0)