QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
GstDmaFourcc.cc
Go to the documentation of this file.
1#include "GstDmaFourcc.h"
2
3#if defined(QGC_HAS_GST_DMABUF_GPU_PATH)
4
5#include <drm_fourcc.h>
6
7namespace GstHw {
8
9int drmFourccForPlane(const GstVideoInfo& info, int plane)
10{
11 const GstVideoFormat fmt = GST_VIDEO_INFO_FORMAT(&info);
12#if G_BYTE_ORDER == G_LITTLE_ENDIAN
13 constexpr int argbFourcc = DRM_FORMAT_ARGB8888;
14 constexpr int rgbaFourcc = DRM_FORMAT_ABGR8888;
15 constexpr int rgbFourcc = DRM_FORMAT_BGR888;
16 constexpr int rgFourcc = DRM_FORMAT_GR88;
17#else
18 constexpr int argbFourcc = DRM_FORMAT_BGRA8888;
19 constexpr int rgbaFourcc = DRM_FORMAT_RGBA8888;
20 constexpr int rgbFourcc = DRM_FORMAT_RGB888;
21 constexpr int rgFourcc = DRM_FORMAT_RG88;
22#endif
23
24 switch (fmt) {
25 case GST_VIDEO_FORMAT_RGB16:
26 case GST_VIDEO_FORMAT_BGR16:
27 return DRM_FORMAT_RGB565;
28 case GST_VIDEO_FORMAT_RGB:
29 case GST_VIDEO_FORMAT_BGR:
30 return rgbFourcc;
31 // BGRx/BGRA map to argb_fourcc (LE: ARGB8888 vs ABGR8888), mirrors Qt's fourccFromVideoInfo().
32 case GST_VIDEO_FORMAT_BGRA:
33 case GST_VIDEO_FORMAT_BGRx:
34 return argbFourcc;
35 case GST_VIDEO_FORMAT_RGBA:
36 case GST_VIDEO_FORMAT_RGBx:
37 case GST_VIDEO_FORMAT_ARGB:
38 case GST_VIDEO_FORMAT_xRGB:
39 case GST_VIDEO_FORMAT_ABGR:
40 case GST_VIDEO_FORMAT_xBGR:
41 case GST_VIDEO_FORMAT_AYUV:
42 return rgbaFourcc;
43#if defined(DRM_FORMAT_BGRA1010102)
44 case GST_VIDEO_FORMAT_BGR10A2_LE:
45 return DRM_FORMAT_BGRA1010102;
46#endif
47 case GST_VIDEO_FORMAT_GRAY8:
48 return DRM_FORMAT_R8;
49 case GST_VIDEO_FORMAT_YUY2:
50 case GST_VIDEO_FORMAT_UYVY:
51 case GST_VIDEO_FORMAT_GRAY16_LE:
52 case GST_VIDEO_FORMAT_GRAY16_BE:
53 return rgFourcc;
54 case GST_VIDEO_FORMAT_NV12:
55 case GST_VIDEO_FORMAT_NV21:
56 return plane == 0 ? DRM_FORMAT_R8 : rgFourcc;
57 case GST_VIDEO_FORMAT_I420:
58 case GST_VIDEO_FORMAT_YV12:
59 case GST_VIDEO_FORMAT_Y42B:
60 case GST_VIDEO_FORMAT_Y444:
61 return DRM_FORMAT_R8;
62 case GST_VIDEO_FORMAT_P010_10LE:
63 case GST_VIDEO_FORMAT_P010_10BE:
64 return plane == 0 ? DRM_FORMAT_R16 : DRM_FORMAT_RG1616;
65 default:
66 return -1;
67 }
68}
69
70int drmFourccForSingleFd(const GstVideoInfo& info)
71{
72 switch (GST_VIDEO_INFO_FORMAT(&info)) {
73 case GST_VIDEO_FORMAT_NV12:
74 return DRM_FORMAT_NV12;
75 case GST_VIDEO_FORMAT_NV21:
76 return DRM_FORMAT_NV21;
77 case GST_VIDEO_FORMAT_P010_10LE:
78 return DRM_FORMAT_P010;
79 case GST_VIDEO_FORMAT_I420:
80 return DRM_FORMAT_YUV420;
81 case GST_VIDEO_FORMAT_YV12:
82 return DRM_FORMAT_YVU420;
83 // packed single-memory formats: planeCount==1, memCount==1
84 case GST_VIDEO_FORMAT_YUY2:
85 return DRM_FORMAT_YUYV;
86 case GST_VIDEO_FORMAT_UYVY:
87 return DRM_FORMAT_UYVY;
88#ifdef DRM_FORMAT_YVYU
89 case GST_VIDEO_FORMAT_YVYU:
90 return DRM_FORMAT_YVYU;
91#endif
92#ifdef DRM_FORMAT_VYUY
93 case GST_VIDEO_FORMAT_VYUY:
94 return DRM_FORMAT_VYUY;
95#endif
96 // AYUV excluded: EGL importers don't support DRM_FORMAT_AYUV; per-plane RGBA path handles it.
97#ifdef DRM_FORMAT_Y210
98 case GST_VIDEO_FORMAT_Y210:
99 return DRM_FORMAT_Y210;
100#endif
101#ifdef DRM_FORMAT_Y410
102 case GST_VIDEO_FORMAT_Y410:
103 return DRM_FORMAT_Y410;
104#endif
105 default:
106 return -1;
107 }
108}
109
110const char* gstFormatNameForImportableFourcc(uint32_t fourcc) noexcept
111{
112#if G_BYTE_ORDER == G_LITTLE_ENDIAN
113 constexpr uint32_t bgraFourcc = DRM_FORMAT_ARGB8888;
114 constexpr uint32_t rgbaFourcc = DRM_FORMAT_ABGR8888;
115#else
116 constexpr uint32_t bgraFourcc = DRM_FORMAT_BGRA8888;
117 constexpr uint32_t rgbaFourcc = DRM_FORMAT_RGBA8888;
118#endif
119 // Restricted to single-image formats the EGLImage/Vulkan import path consumes; mirrors the env-LINEAR offer set.
120 if (fourcc == static_cast<uint32_t>(DRM_FORMAT_NV12)) return "NV12";
121 if (fourcc == static_cast<uint32_t>(DRM_FORMAT_NV21)) return "NV21";
122 if (fourcc == static_cast<uint32_t>(DRM_FORMAT_YUV420)) return "I420";
123 if (fourcc == static_cast<uint32_t>(DRM_FORMAT_YVU420)) return "YV12";
124 if (fourcc == static_cast<uint32_t>(DRM_FORMAT_P010)) return "P010_10LE";
125 if (fourcc == bgraFourcc) return "BGRA";
126 if (fourcc == rgbaFourcc) return "RGBA";
127 return nullptr;
128}
129
130} // namespace GstHw
131
132#endif // QGC_HAS_GST_DMABUF_GPU_PATH