Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qqnxcameraframebuffer.cpp
Go to the documentation of this file.
1// Copyright (C) 2022 The Qt Company
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
6#include <limits>
7
8template <typename T>
9static constexpr int toInt(T value)
10{
11 if constexpr (sizeof(T) >= sizeof(int)) {
12 if (std::is_signed_v<T>) {
13 return static_cast<int>(std::clamp<T>(value,
14 std::numeric_limits<int>::min(), std::numeric_limits<int>::max()));
15 } else {
16 return static_cast<int>(std::min<T>(value, std::numeric_limits<int>::max()));
17 }
18 } else {
19 return static_cast<int>(value);
20 }
21}
22
23template <typename T>
24static constexpr QSize frameSize(const T &frame)
25{
26 return { toInt(frame.width), toInt(frame.height) };
27}
28
30{
31 switch (type) {
32 case CAMERA_FRAMETYPE_NV12:
34 case CAMERA_FRAMETYPE_RGB8888:
36 case CAMERA_FRAMETYPE_GRAY8:
38 case CAMERA_FRAMETYPE_CBYCRY:
40 case CAMERA_FRAMETYPE_YCBCR420P:
42 case CAMERA_FRAMETYPE_YCBYCR:
44 default:
45 break;
46 }
47
49}
50
51static constexpr size_t bufferDataSize(const camera_frame_nv12_t &frame)
52{
53 return frame.uv_offset + frame.uv_stride * frame.height / 2;
54}
55
56static constexpr size_t bufferDataSize(const camera_frame_rgb8888_t &frame)
57{
58 return frame.stride * frame.height;
59}
60
61static constexpr size_t bufferDataSize(const camera_frame_gray8_t &frame)
62{
63 return frame.stride * frame.height;
64}
65
66static constexpr size_t bufferDataSize(const camera_frame_cbycry_t &frame)
67{
68 return frame.bufsize;
69}
70
71static constexpr size_t bufferDataSize(const camera_frame_ycbcr420p_t &frame)
72{
73 return frame.cr_offset + frame.cr_stride * frame.height / 2;
74}
75
76static constexpr size_t bufferDataSize(const camera_frame_ycbycr_t &frame)
77{
78 return frame.stride * frame.height;
79}
80
81static constexpr size_t bufferDataSize(const camera_buffer_t *buffer)
82{
83 switch (buffer->frametype) {
84 case CAMERA_FRAMETYPE_NV12:
85 return bufferDataSize(buffer->framedesc.nv12);
86 case CAMERA_FRAMETYPE_RGB8888:
87 return bufferDataSize(buffer->framedesc.rgb8888);
88 case CAMERA_FRAMETYPE_GRAY8:
89 return bufferDataSize(buffer->framedesc.gray8);
90 case CAMERA_FRAMETYPE_CBYCRY:
91 return bufferDataSize(buffer->framedesc.cbycry);
92 case CAMERA_FRAMETYPE_YCBCR420P:
93 return bufferDataSize(buffer->framedesc.ycbcr420p);
94 case CAMERA_FRAMETYPE_YCBYCR:
95 return bufferDataSize(buffer->framedesc.ycbycr);
96 default:
97 break;
98 }
99
100 return 0;
101}
102
103static QAbstractVideoBuffer::MapData mapData(const camera_frame_nv12_t &frame,
104 unsigned char *baseAddress)
105{
106
107 return {
108 .nPlanes = 2,
109 .bytesPerLine = {
110 toInt(frame.stride),
111 toInt(frame.uv_stride)
112 },
113 .data = {
114 baseAddress,
115 baseAddress + frame.uv_offset
116 },
117 .size = {
118 toInt(frame.stride * frame.height),
119 toInt(frame.uv_stride * frame.height / 2)
120 }
121 };
122}
123
124static QAbstractVideoBuffer::MapData mapData(const camera_frame_rgb8888_t &frame,
125 unsigned char *baseAddress)
126{
127 return {
128 .nPlanes = 1,
129 .bytesPerLine = {
130 toInt(frame.stride)
131 },
132 .data = {
133 baseAddress
134 },
135 .size = {
136 toInt(frame.stride * frame.height),
137 }
138 };
139}
140
141static QAbstractVideoBuffer::MapData mapData(const camera_frame_gray8_t &frame,
142 unsigned char *baseAddress)
143{
144 return {
145 .nPlanes = 1,
146 .bytesPerLine = {
147 toInt(frame.stride)
148 },
149 .data = {
150 baseAddress
151 },
152 .size = {
153 toInt(frame.stride * frame.height)
154 }
155 };
156}
157
158static QAbstractVideoBuffer::MapData mapData(const camera_frame_cbycry_t &frame,
159 unsigned char *baseAddress)
160{
161 return {
162 .nPlanes = 1,
163 .bytesPerLine = {
164 toInt(frame.stride)
165 },
166 .data = {
167 baseAddress
168 },
169 .size = {
170 toInt(frame.bufsize),
171 }
172 };
173}
174
175static QAbstractVideoBuffer::MapData mapData(const camera_frame_ycbcr420p_t &frame,
176 unsigned char *baseAddress)
177{
178 return {
179 .nPlanes = 3,
180 .bytesPerLine = {
181 toInt(frame.y_stride),
182 frame.cb_stride,
183 frame.cr_stride,
184 },
185 .data = {
186 baseAddress,
187 baseAddress + frame.cb_offset,
188 baseAddress + frame.cr_offset,
189 },
190 .size = {
191 toInt(frame.y_stride * frame.height),
192 toInt(frame.cb_stride * frame.height / 2),
193 toInt(frame.cr_stride * frame.height / 2)
194 }
195 };
196}
197
198static QAbstractVideoBuffer::MapData mapData(const camera_frame_ycbycr_t &frame,
199 unsigned char *baseAddress)
200{
201 return {
202 .nPlanes = 1,
203 .bytesPerLine = {
204 toInt(frame.stride)
205 },
206 .data = {
207 baseAddress
208 },
209 .size = {
210 toInt(frame.stride * frame.height)
211 }
212 };
213}
214
215static QAbstractVideoBuffer::MapData mapData(const camera_buffer_t *buffer,
216 unsigned char *baseAddress)
217{
218 switch (buffer->frametype) {
219 case CAMERA_FRAMETYPE_NV12:
220 return mapData(buffer->framedesc.nv12, baseAddress);
221 case CAMERA_FRAMETYPE_RGB8888:
222 return mapData(buffer->framedesc.rgb8888, baseAddress);
223 case CAMERA_FRAMETYPE_GRAY8:
224 return mapData(buffer->framedesc.gray8, baseAddress);
225 case CAMERA_FRAMETYPE_CBYCRY:
226 return mapData(buffer->framedesc.cbycry, baseAddress);
227 case CAMERA_FRAMETYPE_YCBCR420P:
228 return mapData(buffer->framedesc.ycbcr420p, baseAddress);
229 case CAMERA_FRAMETYPE_YCBYCR:
230 return mapData(buffer->framedesc.ycbycr, baseAddress);
231 default:
232 break;
233 }
234
235 return {};
236}
237
238static constexpr QSize frameSize(const camera_buffer_t *buffer)
239{
240 switch (buffer->frametype) {
241 case CAMERA_FRAMETYPE_NV12:
242 return frameSize(buffer->framedesc.nv12);
243 case CAMERA_FRAMETYPE_RGB8888:
244 return frameSize(buffer->framedesc.rgb8888);
245 case CAMERA_FRAMETYPE_GRAY8:
246 return frameSize(buffer->framedesc.gray8);
247 case CAMERA_FRAMETYPE_CBYCRY:
248 return frameSize(buffer->framedesc.cbycry);
249 case CAMERA_FRAMETYPE_YCBCR420P:
250 return frameSize(buffer->framedesc.ycbcr420p);
251 case CAMERA_FRAMETYPE_YCBYCR:
252 return frameSize(buffer->framedesc.ycbycr);
253 default:
254 break;
255 }
256
257 return {};
258}
259
261
263 : QAbstractVideoBuffer(rhi ? QVideoFrame::RhiTextureHandle : QVideoFrame::NoHandle, rhi)
264 , m_rhi(rhi)
265 , m_pixelFormat(::frameTypeToPixelFormat(buffer->frametype))
266 , m_dataSize(::bufferDataSize(buffer))
267{
268 if (m_dataSize <= 0)
269 return;
270
271 m_data = std::make_unique<unsigned char[]>(m_dataSize);
272
273 memcpy(m_data.get(), buffer->framebuf, m_dataSize);
274
275 m_mapData = ::mapData(buffer, m_data.get());
276
277 m_frameSize = ::frameSize(buffer);
278}
279
284
289
293
295{
296 return m_pixelFormat;
297}
298
300{
301 return m_frameSize;
302}
303
The QAbstractVideoBuffer class is an abstraction for video data. \inmodule QtMultimedia.
QQnxCameraFrameBuffer(const camera_buffer_t *buffer, QRhi *rhi=nullptr)
QVideoFrameFormat::PixelFormat pixelFormat() const
MapData map(QVideoFrame::MapMode mode) override
Independently maps the planes of a video buffer to memory.
void unmap() override
Releases the memory mapped by the map() function.
QVideoFrame::MapMode mapMode() const override
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
Definition qrhi.h:1804
\inmodule QtCore
Definition qsize.h:25
PixelFormat
Enumerates video data types.
The QVideoFrame class represents a frame of video data.
Definition qvideoframe.h:27
MapMode
Enumerates how a video buffer's data is mapped to system memory.
Definition qvideoframe.h:37
QSize size
the size of the widget excluding any window frame
Definition qwidget.h:113
int width
the width of the widget excluding any window frame
Definition qwidget.h:114
int height
the height of the widget excluding any window frame
Definition qwidget.h:115
Combined button and popup list for selecting options.
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLenum GLuint buffer
GLenum type
static constexpr int toInt(T value)
static QAbstractVideoBuffer::MapData mapData(const camera_frame_nv12_t &frame, unsigned char *baseAddress)
static constexpr QSize frameSize(const T &frame)
static constexpr size_t bufferDataSize(const camera_frame_nv12_t &frame)
static constexpr QVideoFrameFormat::PixelFormat frameTypeToPixelFormat(camera_frametype_t type)
QFrame frame
[0]