3#if GST_CHECK_VERSION(1, 24, 0)
4#include <gst/video/video-info-dma.h>
7#if defined(QGC_HAS_GST_DMABUF_GPU_PATH) && GST_CHECK_VERSION(1, 24, 0)
13#include <QtCore/QByteArray>
15#include <QtGui/QOpenGLContext>
18#include <EGL/eglext.h>
33#if GST_CHECK_VERSION(1, 24, 0)
34 if (gst_video_is_dma_drm_caps(caps)) {
35 GstVideoInfoDmaDrm drmInfo;
36 gst_video_info_dma_drm_init(&drmInfo);
37 return gst_video_info_dma_drm_from_caps(&drmInfo, caps) && gst_video_info_dma_drm_to_video_info(&drmInfo, info);
40 return gst_video_info_from_caps(info, caps);
43#if defined(QGC_HAS_GST_DMABUF_GPU_PATH) && GST_CHECK_VERSION(1, 24, 0)
47constexpr const char* kModifiersExt =
"EGL_EXT_image_dma_buf_import_modifiers";
51QSet<QByteArray> parseFormatTokens(
const char* gstFormatList)
53 QSet<QByteArray> tokens;
56 for (QByteArray tok : QByteArray(gstFormatList).split(
',')) {
57 tok.replace(
'{',
"").replace(
'}',
"");
68bool isImportableModifier(EGLuint64KHR mod)
noexcept
77 const QSet<QByteArray> allowed = parseFormatTokens(gstFormatList);
78 if (allowed.isEmpty())
83 EGLDisplay dpy = GstEglHelpers::resolveEglDisplay(QOpenGLContext::globalShareContext());
84 if (dpy == EGL_NO_DISPLAY)
85 dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
86 if (dpy != EGL_NO_DISPLAY)
87 eglInitialize(dpy,
nullptr,
nullptr);
88 if (dpy == EGL_NO_DISPLAY || !GstEglHelpers::displaySupportsExtension(dpy, kModifiersExt)) {
89 qCDebug(GstDmaDrmCapsLog) <<
"DMA_DRM modifier query unavailable (no EGL display or "
90 "EGL_EXT_image_dma_buf_import_modifiers); offering no DMA_DRM caps";
94 const auto queryFormats =
95 reinterpret_cast<PFNEGLQUERYDMABUFFORMATSEXTPROC
>(eglGetProcAddress(
"eglQueryDmaBufFormatsEXT"));
96 const auto queryModifiers =
97 reinterpret_cast<PFNEGLQUERYDMABUFMODIFIERSEXTPROC
>(eglGetProcAddress(
"eglQueryDmaBufModifiersEXT"));
98 if (!queryFormats || !queryModifiers)
101 EGLint numFormats = 0;
102 if (queryFormats(dpy, 0,
nullptr, &numFormats) != EGL_TRUE || numFormats <= 0)
103 return std::string();
104 std::vector<EGLint> formats(
static_cast<std::size_t
>(numFormats));
105 if (queryFormats(dpy, numFormats, formats.data(), &numFormats) != EGL_TRUE || numFormats <= 0)
106 return std::string();
107 formats.resize(
static_cast<std::size_t
>(numFormats));
111 int modifierCount = 0;
112 int excludedCount = 0;
113 for (
const EGLint fourcc : formats) {
114 const char* gstName = gstFormatNameForImportableFourcc(
static_cast<uint32_t
>(fourcc));
115 if (!gstName || !allowed.contains(QByteArray(gstName)))
119 if (queryModifiers(dpy, fourcc, 0,
nullptr,
nullptr, &numMods) != EGL_TRUE || numMods <= 0)
121 std::vector<EGLuint64KHR> mods(
static_cast<std::size_t
>(numMods));
122 if (queryModifiers(dpy, fourcc, numMods, mods.data(),
nullptr, &numMods) != EGL_TRUE || numMods <= 0)
124 mods.resize(
static_cast<std::size_t
>(numMods));
126 bool counted =
false;
127 for (
const EGLuint64KHR mod : mods) {
128 if (!isImportableModifier(mod)) {
134 gchar* drmStr = gst_video_dma_drm_fourcc_to_string(
static_cast<guint32
>(fourcc), mod);
137 if (!entries.empty())
149 return std::string();
151 qCInfo(GstDmaDrmCapsLog) <<
"EGL-derived DMA_DRM caps:" << formatCount <<
"formats," << modifierCount
152 <<
"modifiers offered," << excludedCount <<
"non-importable modifiers excluded";
153 return std::string(
"video/x-raw(memory:DMABuf), format=DMA_DRM, drm-format={ ") + entries +
" }; ";
159 for (
const QByteArray& tok : parseFormatTokens(gstFormatList)) {
160 const GstVideoFormat fmt = gst_video_format_from_string(tok.constData());
161 if (fmt == GST_VIDEO_FORMAT_UNKNOWN)
163 const guint32 fourcc = gst_video_dma_drm_fourcc_from_format(fmt);
166 gchar* drmStr = gst_video_dma_drm_fourcc_to_string(fourcc, 0);
169 if (!entries.empty())
175 return std::string();
176 return std::string(
"video/x-raw(memory:DMABuf), format=DMA_DRM, drm-format={ ") + entries +
" }; ";
179#ifdef QGC_GST_BUILD_TESTING
180bool dmaDrmModifierAdvertisedForTest(guint64 modifier)
noexcept
182 return isImportableModifier(
static_cast<EGLuint64KHR
>(modifier));
190 return std::string();
195 return std::string();
198#ifdef QGC_GST_BUILD_TESTING
199bool dmaDrmModifierAdvertisedForTest(guint64)
noexcept
#define QGC_LOGGING_CATEGORY(name, categoryStr)
std::string buildLinearDmaDrmCaps(const char *)
bool dmaDrmAwareVideoInfo(GstCaps *caps, GstVideoInfo *info)
std::string buildSupportedDmaDrmCaps(const char *)