Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qmultimedia_drm_support_p.h
Go to the documentation of this file.
1// Copyright (C) 2026 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QMULTIMEDIA_DRM_SUPPORT_P_H
5#define QMULTIMEDIA_DRM_SUPPORT_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtMultimedia/qvideoframeformat.h>
19#include <QtCore/qspan.h>
20
21#include <cstdint>
22
23QT_BEGIN_NAMESPACE
24
25namespace QtMultimediaPrivate {
26
27static constexpr uint64_t DmaBufFormatModifierInvalid = ((1ULL << 56) - 1);
28
29constexpr uint32_t fourcc_code(char a, char b, char c, char d)
30{
31 return ((uint32_t)(a) | ((uint32_t)(b) << 8) | ((uint32_t)(c) << 16) | ((uint32_t)(d) << 24));
32}
33
34// clang-format off
35enum class DRMFormat : std::uint32_t {
36 RGBA8888 = fourcc_code('R', 'A', '2', '4'), /* [31:0] R:G:B:A 8:8:8:8 little endian */
37 RGB888 = fourcc_code('R', 'G', '2', '4'), /* [23:0] R:G:B little endian */
38 RG88 = fourcc_code('R', 'G', '8', '8'), /* [15:0] R:G 8:8 little endian */
39 ARGB8888 = fourcc_code('A', 'R', '2', '4'), /* [31:0] A:R:G:B 8:8:8:8 little endian */
40 ABGR8888 = fourcc_code('A', 'B', '2', '4'), /* [31:0] A:B:G:R 8:8:8:8 little endian */
41 BGRA8888 = fourcc_code('B', 'A', '2', '4'), /* [31:0] B:G:R:A 8:8:8:8 little endian */
42 BGR888 = fourcc_code('B', 'G', '2', '4'), /* [23:0] B:G:R little endian */
43 GR88 = fourcc_code('G', 'R', '8', '8'), /* [15:0] G:R 8:8 little endian */
44 R8 = fourcc_code('R', '8', ' ', ' '), /* [7:0] R */
45 R16 = fourcc_code('R', '1', '6', ' '), /* [15:0] R little endian */
46 RGB565 = fourcc_code('R', 'G', '1', '6'), /* [15:0] R:G:B 5:6:5 little endian */
47 RG1616 = fourcc_code('R', 'G', '3', '2'), /* [31:0] R:G 16:16 little endian */
48 GR1616 = fourcc_code('G', 'R', '3', '2'), /* [31:0] G:R 16:16 little endian */
49 BGRA1010102 = fourcc_code('B', 'A', '3', '0'), /* [31:0] B:G:R:A 10:10:10:2 little endian */
50 YUYV = fourcc_code('Y', 'U', 'Y', 'V'), /* [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian */
51 UYVY = fourcc_code('U', 'Y', 'V', 'Y'), /* [31:0] Y1:Cr0:Y0:Cb0 8:8:8:8 little endian */
52 AYUV = fourcc_code('A', 'Y', 'U', 'V'), /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */
53 NV12 = fourcc_code('N', 'V', '1', '2'), /* 2x2 subsampled Cr:Cb plane */
54 NV21 = fourcc_code('N', 'V', '2', '1'), /* 2x2 subsampled Cb:Cr plane */
55 P010 = fourcc_code('P', '0', '1', '0'), /* 2x2 subsampled Cr:Cb plane, 10 bits per channel */
56 YUV411 = fourcc_code('Y', 'U', '1', '1'), /* 4x1 subsampled Cb (1) and Cr (2) planes */
57 YUV420 = fourcc_code('Y', 'U', '1', '2'), /* 2x2 subsampled Cb (1) and Cr (2) planes */
58 YVU420 = fourcc_code('Y', 'V', '1', '2'), /* 2x2 subsampled Cr (1) and Cb (2) planes */
59 YUV422 = fourcc_code('Y', 'U', '1', '6'), /* 2x1 subsampled Cb (1) and Cr (2) planes */
60 YUV444 = fourcc_code('Y', 'U', '2', '4'), /* non-subsampled Cb (1) and Cr (2) planes */
61};
62// clang-format on
63
64inline QSpan<const DRMFormat>
65dmaBufFourccFromPixelFormat(const QVideoFrameFormat::PixelFormat format)
66{
67#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
68 constexpr DRMFormat rgba_fourcc = DRMFormat::ABGR8888;
69 constexpr DRMFormat rg_fourcc = DRMFormat::GR88;
70 constexpr DRMFormat rg16_fourcc = DRMFormat::GR1616;
71#else
72 constexpr DRMFormat rgba_fourcc = DRMFormat::RGBA8888;
73 constexpr DRMFormat rg_fourcc = DRMFormat::RG88;
74 constexpr DRMFormat rg16_fourcc = DRMFormat::RG1616;
75#endif
76
77 switch (format) {
78 case QVideoFrameFormat::Format_Invalid:
79 case QVideoFrameFormat::Format_IMC1:
80 case QVideoFrameFormat::Format_IMC2:
81 case QVideoFrameFormat::Format_IMC3:
82 case QVideoFrameFormat::Format_IMC4:
83 case QVideoFrameFormat::Format_SamplerExternalOES:
84 case QVideoFrameFormat::Format_Jpeg:
85 case QVideoFrameFormat::Format_SamplerRect:
86 return {};
87
88 case QVideoFrameFormat::Format_ARGB8888:
89 case QVideoFrameFormat::Format_ARGB8888_Premultiplied:
90 case QVideoFrameFormat::Format_XRGB8888:
91 case QVideoFrameFormat::Format_BGRA8888:
92 case QVideoFrameFormat::Format_BGRA8888_Premultiplied:
93 case QVideoFrameFormat::Format_BGRX8888:
94 case QVideoFrameFormat::Format_ABGR8888:
95 case QVideoFrameFormat::Format_XBGR8888:
96 case QVideoFrameFormat::Format_RGBA8888:
97 case QVideoFrameFormat::Format_RGBX8888:
98 case QVideoFrameFormat::Format_AYUV:
99 case QVideoFrameFormat::Format_AYUV_Premultiplied:
100 case QVideoFrameFormat::Format_UYVY:
101 case QVideoFrameFormat::Format_YUYV: {
102 static constexpr DRMFormat format[] = { rgba_fourcc };
103 return format;
104 }
105
106 case QVideoFrameFormat::Format_Y8: {
107 static constexpr DRMFormat format[] = { DRMFormat::R8 };
108 return format;
109 }
110 case QVideoFrameFormat::Format_Y16: {
111 static constexpr DRMFormat format[] = { DRMFormat::R16 };
112 return format;
113 }
114
115 case QVideoFrameFormat::Format_YUV420P:
116 case QVideoFrameFormat::Format_YUV422P:
117 case QVideoFrameFormat::Format_YV12: {
118 static constexpr DRMFormat format[] = { DRMFormat::R8, DRMFormat::R8, DRMFormat::R8 };
119 return format;
120 }
121 case QVideoFrameFormat::Format_YUV420P10: {
122 static constexpr DRMFormat format[] = { DRMFormat::R16, DRMFormat::R16, DRMFormat::R16 };
123 return format;
124 }
125
126 case QVideoFrameFormat::Format_NV12:
127 case QVideoFrameFormat::Format_NV21: {
128 static constexpr DRMFormat format[] = { DRMFormat::R8, rg_fourcc };
129 return format;
130 }
131
132 case QVideoFrameFormat::Format_P010:
133 case QVideoFrameFormat::Format_P016: {
134 static constexpr DRMFormat format[] = { DRMFormat::R16, rg16_fourcc };
135 return format;
136 }
137 }
138 return {};
139}
140
141} // namespace QtMultimediaPrivate
142
143QT_END_NAMESPACE
144
145#endif
constexpr uint32_t fourcc_code(char a, char b, char c, char d)
static constexpr uint64_t DmaBufFormatModifierInvalid
QSpan< const DRMFormat > dmaBufFourccFromPixelFormat(const QVideoFrameFormat::PixelFormat format)