Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
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
4
#
include
"qqnxcameraframebuffer_p.h"
5
6
#
include
<
limits
>
7
8
template
<
typename
T>
9
static
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
23
template
<
typename
T>
24
static
constexpr
QSize
frameSize
(
const
T &frame)
25
{
26
return
{ toInt(frame.width), toInt(frame.height) };
27
}
28
29
static
constexpr
QVideoFrameFormat
::
PixelFormat
frameTypeToPixelFormat
(camera_frametype_t type)
30
{
31
switch
(type) {
32
case
CAMERA_FRAMETYPE_NV12:
33
return
QVideoFrameFormat::Format_NV12;
34
case
CAMERA_FRAMETYPE_RGB8888:
35
return
QVideoFrameFormat::Format_ARGB8888;
36
case
CAMERA_FRAMETYPE_GRAY8:
37
return
QVideoFrameFormat::Format_Y8;
38
case
CAMERA_FRAMETYPE_CBYCRY:
39
return
QVideoFrameFormat::Format_UYVY;
40
case
CAMERA_FRAMETYPE_YCBCR420P:
41
return
QVideoFrameFormat::Format_YUV420P;
42
case
CAMERA_FRAMETYPE_YCBYCR:
43
return
QVideoFrameFormat::Format_YUYV;
44
default
:
45
break
;
46
}
47
48
return
QVideoFrameFormat::Format_Invalid;
49
}
50
51
static
constexpr
size_t
bufferDataSize
(
const
camera_frame_nv12_t &frame)
52
{
53
return
frame.uv_offset + frame.uv_stride * frame.height / 2;
54
}
55
56
static
constexpr
size_t
bufferDataSize
(
const
camera_frame_rgb8888_t &frame)
57
{
58
return
frame.stride * frame.height;
59
}
60
61
static
constexpr
size_t
bufferDataSize
(
const
camera_frame_gray8_t &frame)
62
{
63
return
frame.stride * frame.height;
64
}
65
66
static
constexpr
size_t
bufferDataSize
(
const
camera_frame_cbycry_t &frame)
67
{
68
return
frame.bufsize;
69
}
70
71
static
constexpr
size_t
bufferDataSize
(
const
camera_frame_ycbcr420p_t &frame)
72
{
73
return
frame.cr_offset + frame.cr_stride * frame.height / 2;
74
}
75
76
static
constexpr
size_t
bufferDataSize
(
const
camera_frame_ycbycr_t &frame)
77
{
78
return
frame.stride * frame.height;
79
}
80
81
static
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
103
static
QAbstractVideoBuffer
::
MapData
mapData
(
const
camera_frame_nv12_t &frame,
104
unsigned
char
*baseAddress)
105
{
106
107
return
{
108
.planeCount = 2,
109
.bytesPerLine = {
110
toInt(frame.stride),
111
toInt(frame.uv_stride)
112
},
113
.data = {
114
baseAddress,
115
baseAddress + frame.uv_offset
116
},
117
.dataSize = {
118
toInt(frame.stride * frame.height),
119
toInt(frame.uv_stride * frame.height / 2)
120
}
121
};
122
}
123
124
static
QAbstractVideoBuffer
::
MapData
mapData
(
const
camera_frame_rgb8888_t &frame,
125
unsigned
char
*baseAddress)
126
{
127
return
{
128
.planeCount = 1,
129
.bytesPerLine = {
130
toInt(frame.stride)
131
},
132
.data = {
133
baseAddress
134
},
135
.dataSize = {
136
toInt(frame.stride * frame.height),
137
}
138
};
139
}
140
141
static
QAbstractVideoBuffer
::
MapData
mapData
(
const
camera_frame_gray8_t &frame,
142
unsigned
char
*baseAddress)
143
{
144
return
{
145
.planeCount = 1,
146
.bytesPerLine = {
147
toInt(frame.stride)
148
},
149
.data = {
150
baseAddress
151
},
152
.dataSize = {
153
toInt(frame.stride * frame.height)
154
}
155
};
156
}
157
158
static
QAbstractVideoBuffer
::
MapData
mapData
(
const
camera_frame_cbycry_t &frame,
159
unsigned
char
*baseAddress)
160
{
161
return
{
162
.planeCount = 1,
163
.bytesPerLine = {
164
toInt(frame.stride)
165
},
166
.data = {
167
baseAddress
168
},
169
.dataSize = {
170
toInt(frame.bufsize),
171
}
172
};
173
}
174
175
static
QAbstractVideoBuffer
::
MapData
mapData
(
const
camera_frame_ycbcr420p_t &frame,
176
unsigned
char
*baseAddress)
177
{
178
return
{
179
.planeCount = 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
.dataSize = {
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
198
static
QAbstractVideoBuffer
::
MapData
mapData
(
const
camera_frame_ycbycr_t &frame,
199
unsigned
char
*baseAddress)
200
{
201
return
{
202
.planeCount = 1,
203
.bytesPerLine = {
204
toInt(frame.stride)
205
},
206
.data = {
207
baseAddress
208
},
209
.dataSize = {
210
toInt(frame.stride * frame.height)
211
}
212
};
213
}
214
215
static
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
238
static
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
260
QT_BEGIN_NAMESPACE
261
262
QQnxCameraFrameBuffer::QQnxCameraFrameBuffer(
const
camera_buffer_t *buffer)
263
: m_pixelFormat(::frameTypeToPixelFormat(buffer->frametype)),
264
m_dataSize(::bufferDataSize(buffer))
265
{
266
if
(m_dataSize <= 0)
267
return
;
268
269
m_data = std::make_unique<
unsigned
char
[]>(m_dataSize);
270
271
memcpy(m_data.get(), buffer->framebuf, m_dataSize);
272
273
m_mapData = ::mapData(buffer, m_data.get());
274
275
m_frameSize = ::frameSize(buffer);
276
}
277
278
QAbstractVideoBuffer
::
MapData
QQnxCameraFrameBuffer
::
map
(
QVideoFrame
::
MapMode
)
279
{
280
return
m_mapData;
281
}
282
283
void
QQnxCameraFrameBuffer
::
unmap
()
284
{
285
}
286
287
QVideoFrameFormat
::
PixelFormat
QQnxCameraFrameBuffer
::
pixelFormat
()
const
288
{
289
return
m_pixelFormat;
290
}
291
292
QSize
QQnxCameraFrameBuffer
::
size
()
const
293
{
294
return
m_frameSize;
295
}
296
297
QT_END_NAMESPACE
QQnxCameraFrameBuffer
Definition
qqnxcameraframebuffer_p.h:30
QQnxCameraFrameBuffer::pixelFormat
QVideoFrameFormat::PixelFormat pixelFormat() const
Definition
qqnxcameraframebuffer.cpp:287
QQnxCameraFrameBuffer::map
MapData map(QVideoFrame::MapMode mode) override
Maps the planes of a video buffer to memory.
Definition
qqnxcameraframebuffer.cpp:278
QQnxCameraFrameBuffer::unmap
void unmap() override
Releases the memory mapped by the map() function.
Definition
qqnxcameraframebuffer.cpp:283
QQnxCameraFrameBuffer::size
QSize size() const
Definition
qqnxcameraframebuffer.cpp:292
std
[33]
Definition
src_corelib_tools_qhash.cpp:421
toInt
static constexpr int toInt(T value)
Definition
qqnxcameraframebuffer.cpp:9
mapData
static QAbstractVideoBuffer::MapData mapData(const camera_buffer_t *buffer, unsigned char *baseAddress)
Definition
qqnxcameraframebuffer.cpp:215
mapData
static QAbstractVideoBuffer::MapData mapData(const camera_frame_nv12_t &frame, unsigned char *baseAddress)
Definition
qqnxcameraframebuffer.cpp:103
frameSize
static constexpr QSize frameSize(const T &frame)
Definition
qqnxcameraframebuffer.cpp:24
bufferDataSize
static constexpr size_t bufferDataSize(const camera_frame_nv12_t &frame)
Definition
qqnxcameraframebuffer.cpp:51
frameTypeToPixelFormat
static constexpr QVideoFrameFormat::PixelFormat frameTypeToPixelFormat(camera_frametype_t type)
Definition
qqnxcameraframebuffer.cpp:29
bufferDataSize
static constexpr size_t bufferDataSize(const camera_buffer_t *buffer)
Definition
qqnxcameraframebuffer.cpp:81
frameSize
static constexpr QSize frameSize(const camera_buffer_t *buffer)
Definition
qqnxcameraframebuffer.cpp:238
qtmultimedia
src
plugins
multimedia
qnx
camera
qqnxcameraframebuffer.cpp
Generated on
for Qt by
1.18.0