From 351aaa6759b797eee24adbe3a374306b8802b54d Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 18 Feb 2025 18:58:04 -0600 Subject: [PATCH] Add an enum type for each renderer --- app/streaming/video/ffmpeg-renderers/cuda.cpp | 3 +- .../video/ffmpeg-renderers/d3d11va.cpp | 3 +- app/streaming/video/ffmpeg-renderers/drm.cpp | 3 +- .../video/ffmpeg-renderers/dxva2.cpp | 1 + .../video/ffmpeg-renderers/egl_extensions.cpp | 3 -- .../video/ffmpeg-renderers/eglimagefactory.h | 3 -- .../video/ffmpeg-renderers/eglvid.cpp | 2 +- .../video/ffmpeg-renderers/genhwaccel.cpp | 3 +- app/streaming/video/ffmpeg-renderers/mmal.cpp | 3 +- app/streaming/video/ffmpeg-renderers/plvk.cpp | 6 +-- app/streaming/video/ffmpeg-renderers/plvk.h | 1 - .../video/ffmpeg-renderers/renderer.h | 41 +++++++++++++++---- .../video/ffmpeg-renderers/sdlvid.cpp | 3 +- .../video/ffmpeg-renderers/vaapi.cpp | 3 +- .../video/ffmpeg-renderers/vdpau.cpp | 3 +- .../ffmpeg-renderers/vt_avsamplelayer.mm | 3 +- .../video/ffmpeg-renderers/vt_metal.mm | 3 +- 17 files changed, 56 insertions(+), 31 deletions(-) diff --git a/app/streaming/video/ffmpeg-renderers/cuda.cpp b/app/streaming/video/ffmpeg-renderers/cuda.cpp index 22a6c092..58c8df09 100644 --- a/app/streaming/video/ffmpeg-renderers/cuda.cpp +++ b/app/streaming/video/ffmpeg-renderers/cuda.cpp @@ -3,7 +3,8 @@ #include CUDARenderer::CUDARenderer() - : m_HwContext(nullptr) + : IFFmpegRenderer(RendererType::CUDA), + m_HwContext(nullptr) { } diff --git a/app/streaming/video/ffmpeg-renderers/d3d11va.cpp b/app/streaming/video/ffmpeg-renderers/d3d11va.cpp index 201eb7ac..9bfffa18 100644 --- a/app/streaming/video/ffmpeg-renderers/d3d11va.cpp +++ b/app/streaming/video/ffmpeg-renderers/d3d11va.cpp @@ -87,7 +87,8 @@ static const std::array k_Vi }; D3D11VARenderer::D3D11VARenderer(int decoderSelectionPass) - : m_DecoderSelectionPass(decoderSelectionPass), + : IFFmpegRenderer(RendererType::D3D11VA), + m_DecoderSelectionPass(decoderSelectionPass), m_DevicesWithFL11Support(0), m_DevicesWithCodecSupport(0), m_LastColorSpace(-1), diff --git a/app/streaming/video/ffmpeg-renderers/drm.cpp b/app/streaming/video/ffmpeg-renderers/drm.cpp index ba3e7ac9..4cae7e31 100644 --- a/app/streaming/video/ffmpeg-renderers/drm.cpp +++ b/app/streaming/video/ffmpeg-renderers/drm.cpp @@ -135,7 +135,8 @@ static const std::map k_AvToDrmFormatMap }; DrmRenderer::DrmRenderer(AVHWDeviceType hwDeviceType, IFFmpegRenderer *backendRenderer) - : m_BackendRenderer(backendRenderer), + : IFFmpegRenderer(RendererType::DRM), + m_BackendRenderer(backendRenderer), m_DrmPrimeBackend(backendRenderer && backendRenderer->canExportDrmPrime()), m_HwDeviceType(hwDeviceType), m_HwContext(nullptr), diff --git a/app/streaming/video/ffmpeg-renderers/dxva2.cpp b/app/streaming/video/ffmpeg-renderers/dxva2.cpp index a3e538b0..b3d49806 100644 --- a/app/streaming/video/ffmpeg-renderers/dxva2.cpp +++ b/app/streaming/video/ffmpeg-renderers/dxva2.cpp @@ -36,6 +36,7 @@ typedef struct _VERTEX } VERTEX, *PVERTEX; DXVA2Renderer::DXVA2Renderer(int decoderSelectionPass) : + IFFmpegRenderer(RendererType::DXVA2), m_DecoderSelectionPass(decoderSelectionPass), m_SurfacesUsed(0), m_Pool(nullptr), diff --git a/app/streaming/video/ffmpeg-renderers/egl_extensions.cpp b/app/streaming/video/ffmpeg-renderers/egl_extensions.cpp index f60684f8..c8302d02 100644 --- a/app/streaming/video/ffmpeg-renderers/egl_extensions.cpp +++ b/app/streaming/video/ffmpeg-renderers/egl_extensions.cpp @@ -1,8 +1,5 @@ -// vim: noai:ts=4:sw=4:softtabstop=4:expandtab #include "renderer.h" -#include - static QStringList egl_get_extensions(EGLDisplay dpy) { const auto EGLExtensionsStr = eglQueryString(dpy, EGL_EXTENSIONS); if (!EGLExtensionsStr) { diff --git a/app/streaming/video/ffmpeg-renderers/eglimagefactory.h b/app/streaming/video/ffmpeg-renderers/eglimagefactory.h index 3cd90e4a..e185e9de 100644 --- a/app/streaming/video/ffmpeg-renderers/eglimagefactory.h +++ b/app/streaming/video/ffmpeg-renderers/eglimagefactory.h @@ -2,9 +2,6 @@ #include "renderer.h" -#define SDL_USE_BUILTIN_OPENGL_DEFINITIONS 1 -#include - #ifdef HAVE_LIBVA #include #endif diff --git a/app/streaming/video/ffmpeg-renderers/eglvid.cpp b/app/streaming/video/ffmpeg-renderers/eglvid.cpp index 57a84942..6aa0781b 100644 --- a/app/streaming/video/ffmpeg-renderers/eglvid.cpp +++ b/app/streaming/video/ffmpeg-renderers/eglvid.cpp @@ -10,7 +10,6 @@ #include #include -#include #include // These are extensions, so some platform headers may not provide them @@ -61,6 +60,7 @@ int EGLRenderer::s_LastFailedVideoFormat = 0; EGLRenderer::EGLRenderer(IFFmpegRenderer *backendRenderer) : + IFFmpegRenderer(RendererType::EGL), m_EGLImagePixelFormat(AV_PIX_FMT_NONE), m_EGLDisplay(EGL_NO_DISPLAY), m_Textures{0}, diff --git a/app/streaming/video/ffmpeg-renderers/genhwaccel.cpp b/app/streaming/video/ffmpeg-renderers/genhwaccel.cpp index b7234ff4..92cae471 100644 --- a/app/streaming/video/ffmpeg-renderers/genhwaccel.cpp +++ b/app/streaming/video/ffmpeg-renderers/genhwaccel.cpp @@ -1,7 +1,8 @@ #include "genhwaccel.h" GenericHwAccelRenderer::GenericHwAccelRenderer(AVHWDeviceType hwDeviceType) - : m_HwDeviceType(hwDeviceType), + : IFFmpegRenderer(RendererType::Unknown), + m_HwDeviceType(hwDeviceType), m_HwContext(nullptr) { diff --git a/app/streaming/video/ffmpeg-renderers/mmal.cpp b/app/streaming/video/ffmpeg-renderers/mmal.cpp index 228d8f47..54aa64ee 100644 --- a/app/streaming/video/ffmpeg-renderers/mmal.cpp +++ b/app/streaming/video/ffmpeg-renderers/mmal.cpp @@ -16,7 +16,8 @@ #include MmalRenderer::MmalRenderer() - : m_Renderer(nullptr), + : IFFmpegRenderer(RendererType::MMAL), + m_Renderer(nullptr), m_InputPort(nullptr), m_BackgroundRenderer(nullptr), m_Window(nullptr), diff --git a/app/streaming/video/ffmpeg-renderers/plvk.cpp b/app/streaming/video/ffmpeg-renderers/plvk.cpp index 4546be7c..be7abb4a 100644 --- a/app/streaming/video/ffmpeg-renderers/plvk.cpp +++ b/app/streaming/video/ffmpeg-renderers/plvk.cpp @@ -99,6 +99,7 @@ void PlVkRenderer::overlayUploadComplete(void* opaque) } PlVkRenderer::PlVkRenderer(bool hwaccel, IFFmpegRenderer *backendRenderer) : + IFFmpegRenderer(RendererType::Vulkan), m_Backend(backendRenderer), m_HwAccelBackend(hwaccel) { @@ -1088,8 +1089,3 @@ AVPixelFormat PlVkRenderer::getPreferredPixelFormat(int videoFormat) return AV_PIX_FMT_VULKAN; } } - -IFFmpegRenderer::RendererType PlVkRenderer::getRendererType() -{ - return IFFmpegRenderer::RendererType::Vulkan; -} diff --git a/app/streaming/video/ffmpeg-renderers/plvk.h b/app/streaming/video/ffmpeg-renderers/plvk.h index d5214c20..36f71d41 100644 --- a/app/streaming/video/ffmpeg-renderers/plvk.h +++ b/app/streaming/video/ffmpeg-renderers/plvk.h @@ -29,7 +29,6 @@ public: virtual bool needsTestFrame() override; virtual bool isPixelFormatSupported(int videoFormat, enum AVPixelFormat pixelFormat) override; virtual AVPixelFormat getPreferredPixelFormat(int videoFormat) override; - virtual RendererType getRendererType() override; private: static void lockQueue(AVHWDeviceContext *dev_ctx, uint32_t queue_family, uint32_t index); diff --git a/app/streaming/video/ffmpeg-renderers/renderer.h b/app/streaming/video/ffmpeg-renderers/renderer.h index 7e15e732..4a06758e 100644 --- a/app/streaming/video/ffmpeg-renderers/renderer.h +++ b/app/streaming/video/ffmpeg-renderers/renderer.h @@ -124,6 +124,24 @@ private: class IFFmpegRenderer : public Overlay::IOverlayRenderer { public: + enum class RendererType { + Unknown, + Vulkan, + CUDA, + D3D11VA, + DRM, + DXVA2, + EGL, + MMAL, + SDL, + VAAPI, + VDPAU, + VTSampleLayer, + VTMetal, + }; + + IFFmpegRenderer(RendererType type) : m_Type(type) {} + virtual bool initialize(PDECODER_PARAMETERS params) = 0; virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary** options) = 0; virtual void renderFrame(AVFrame* frame) = 0; @@ -140,10 +158,16 @@ public: // where trying additional hwaccels may be undesirable since it could lead // to incorrectly skipping working hwaccels. NoHardwareSupport, + + // Only return this reason code if the software or driver does not support + // the specified decoding/rendering API. If the FFmpeg decoder code sees + // this value, it will assume trying the same renderer again for any other + // codec will be useless and skip it. + NoSoftwareSupport, }; virtual InitFailureReason getInitFailureReason() { - return InitFailureReason::Unknown; + return m_InitFailureReason; } // Called for threaded renderers to allow them to wait prior to us latching @@ -264,13 +288,8 @@ public: // preparations might include clearing the window. } - // Allow renderers to expose their type - enum class RendererType { - Unknown, - Vulkan - }; - virtual RendererType getRendererType() { - return RendererType::Unknown; + RendererType getRendererType() { + return m_Type; } // IOverlayRenderer @@ -315,4 +334,10 @@ public: virtual void unmapDrmPrimeFrame(AVDRMFrameDescriptor*) {} #endif + +protected: + InitFailureReason m_InitFailureReason; + +private: + RendererType m_Type; }; diff --git a/app/streaming/video/ffmpeg-renderers/sdlvid.cpp b/app/streaming/video/ffmpeg-renderers/sdlvid.cpp index 1467ce52..d011bef6 100644 --- a/app/streaming/video/ffmpeg-renderers/sdlvid.cpp +++ b/app/streaming/video/ffmpeg-renderers/sdlvid.cpp @@ -13,7 +13,8 @@ extern "C" { } SdlRenderer::SdlRenderer() - : m_VideoFormat(0), + : IFFmpegRenderer(RendererType::SDL), + m_VideoFormat(0), m_Renderer(nullptr), m_Texture(nullptr), m_ColorSpace(-1), diff --git a/app/streaming/video/ffmpeg-renderers/vaapi.cpp b/app/streaming/video/ffmpeg-renderers/vaapi.cpp index d8f66074..20b1cd34 100644 --- a/app/streaming/video/ffmpeg-renderers/vaapi.cpp +++ b/app/streaming/video/ffmpeg-renderers/vaapi.cpp @@ -19,7 +19,8 @@ #include VAAPIRenderer::VAAPIRenderer(int decoderSelectionPass) - : m_DecoderSelectionPass(decoderSelectionPass), + : IFFmpegRenderer(RendererType::VAAPI), + m_DecoderSelectionPass(decoderSelectionPass), m_HwContext(nullptr), m_BlacklistedForDirectRendering(false), m_RequiresExplicitPixelFormat(false), diff --git a/app/streaming/video/ffmpeg-renderers/vdpau.cpp b/app/streaming/video/ffmpeg-renderers/vdpau.cpp index 99244dcf..cdb7e51b 100644 --- a/app/streaming/video/ffmpeg-renderers/vdpau.cpp +++ b/app/streaming/video/ffmpeg-renderers/vdpau.cpp @@ -25,7 +25,8 @@ const VdpRGBAFormat VDPAURenderer::k_OutputFormats10Bit[] = { }; VDPAURenderer::VDPAURenderer(int decoderSelectionPass) - : m_DecoderSelectionPass(decoderSelectionPass), + : IFFmpegRenderer(RendererType::VDPAU), + m_DecoderSelectionPass(decoderSelectionPass), m_HwContext(nullptr), m_PresentationQueueTarget(0), m_PresentationQueue(0), diff --git a/app/streaming/video/ffmpeg-renderers/vt_avsamplelayer.mm b/app/streaming/video/ffmpeg-renderers/vt_avsamplelayer.mm index 24584527..40a6f7a0 100644 --- a/app/streaming/video/ffmpeg-renderers/vt_avsamplelayer.mm +++ b/app/streaming/video/ffmpeg-renderers/vt_avsamplelayer.mm @@ -35,7 +35,8 @@ class VTRenderer : public VTBaseRenderer { public: VTRenderer() - : m_HwContext(nullptr), + : IFFmpegRenderer(RendererType::VTSampleLayer), + m_HwContext(nullptr), m_DisplayLayer(nullptr), m_FormatDesc(nullptr), m_ContentLightLevelInfo(nullptr), diff --git a/app/streaming/video/ffmpeg-renderers/vt_metal.mm b/app/streaming/video/ffmpeg-renderers/vt_metal.mm index 61f15a7f..27c36ba2 100644 --- a/app/streaming/video/ffmpeg-renderers/vt_metal.mm +++ b/app/streaming/video/ffmpeg-renderers/vt_metal.mm @@ -113,7 +113,8 @@ class VTMetalRenderer : public VTBaseRenderer { public: VTMetalRenderer(bool hwAccel) - : m_HwAccel(hwAccel), + : IFFmpegRenderer(RendererType::VTMetal), + m_HwAccel(hwAccel), m_Window(nullptr), m_HwContext(nullptr), m_MetalLayer(nullptr),