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
qqnxplatformcamera.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 Research In Motion
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#undef QT_NO_CONTEXTLESS_CONNECT // Remove after porting connect() calls
5
9#include "qqnxvideosink_p.h"
10
11#include <qcameradevice.h>
12#include <qmediadevices.h>
13
14#include <private/qmediastoragelocation_p.h>
15
16#include <camera/camera_api.h>
17#include <camera/camera_3a.h>
18
19#include <algorithm>
20#include <array>
21
22#include <dlfcn.h>
23
25{
27 camera_focusmode_t qnx;
28};
29
30constexpr std::array<FocusModeMapping, 6> focusModes {{
31 { QCamera::FocusModeAuto, CAMERA_FOCUSMODE_CONTINUOUS_AUTO },
32 { QCamera::FocusModeAutoFar, CAMERA_FOCUSMODE_CONTINUOUS_AUTO },
33 { QCamera::FocusModeInfinity, CAMERA_FOCUSMODE_CONTINUOUS_AUTO },
34 { QCamera::FocusModeAutoNear, CAMERA_FOCUSMODE_CONTINUOUS_MACRO },
35 { QCamera::FocusModeHyperfocal, CAMERA_FOCUSMODE_EDOF },
36 { QCamera::FocusModeManual, CAMERA_FOCUSMODE_MANUAL },
37}};
38
39template <typename Mapping, typename From, typename To, size_t N>
40static constexpr To convert(const std::array<Mapping, N> &mapping,
41 From Mapping::* from, To Mapping::* to, From value, To defaultValue)
42{
43 for (const Mapping &m : mapping) {
44 const auto fromValue = m.*from;
45 const auto toValue = m.*to;
46
47 if (value == fromValue)
48 return toValue;
49 }
50
51 return defaultValue;
52}
53
54static constexpr camera_focusmode_t qnxFocusMode(QCamera::FocusMode mode)
55{
57 &FocusModeMapping::qnx, mode, CAMERA_FOCUSMODE_CONTINUOUS_AUTO);
58}
59
65
67
76
81
83{
84 return m_qnxCamera && m_qnxCamera->isActive();
85}
86
88{
89 if (active)
90 start();
91 else
92 stop();
93}
94
96{
97 if (!m_qnxCamera || isActive())
98 return;
99
100 if (m_session)
101 m_videoSink = m_session->videoSink();
102
103 m_qnxCamera->start();
104
105 Q_EMIT activeChanged(true);
106}
107
109{
110 if (!m_qnxCamera)
111 return;
112
113 m_qnxCamera->stop();
114
115 m_videoSink = nullptr;
116
117 Q_EMIT activeChanged(false);
118}
119
121{
122 if (m_cameraDevice == camera)
123 return;
124
125 const auto cameraUnit = static_cast<camera_unit_t>(camera.id().toUInt());
126
127 m_qnxCamera = std::make_unique<QQnxCamera>(cameraUnit);
128
129 connect(m_qnxCamera.get(), &QQnxCamera::focusModeChanged,
130 [this](camera_focusmode_t mode) { Q_EMIT focusModeChanged(qtFocusMode(mode)); });
133 connect(m_qnxCamera.get(), &QQnxCamera::frameAvailable,
134 this, &QQnxPlatformCamera::onFrameAvailable, Qt::QueuedConnection);
135
136 m_cameraDevice = camera;
137
138 updateCameraFeatures();
139}
140
142{
143 const QSize resolution = format.resolution();
144
145 if (resolution.isEmpty()) {
146 qWarning("QQnxPlatformCamera: invalid resolution requested");
147 return false;
148 }
149
150 return m_qnxCamera->setCameraFormat(resolution.width(),
151 resolution.height(), format.maxFrameRate());
152}
153
155{
156 if (m_session == session)
157 return;
158
159 m_session = static_cast<QQnxMediaCaptureSession *>(session);
160}
161
163{
164 if (!m_qnxCamera)
165 return false;
166
167 return m_qnxCamera->supportedFocusModes().contains(::qnxFocusMode(mode));
168}
169
171{
172 if (!m_qnxCamera)
173 return;
174
175 m_qnxCamera->setFocusMode(::qnxFocusMode(mode));
176}
177
179{
180 if (!m_qnxCamera)
181 return;
182
183 m_qnxCamera->setCustomFocusPoint(point);
184}
185
187{
188 if (!m_qnxCamera)
189 return;
190
191 const int maxDistance = m_qnxCamera->maxFocusStep();
192
193 if (maxDistance < 0)
194 return;
195
196 const int qnxDistance = maxDistance * std::min(distance, 1.0f);
197
198 m_qnxCamera->setManualFocusStep(qnxDistance);
199}
200
201void QQnxPlatformCamera::zoomTo(float factor, float)
202{
203 if (!m_qnxCamera)
204 return;
205
206 const uint32_t minZoom = m_qnxCamera->minimumZoomLevel();
207 const uint32_t maxZoom = m_qnxCamera->maximumZoomLevel();
208
209 if (maxZoom <= minZoom)
210 return;
211
212 // QNX has an integer based API. Interpolate between the levels according to the factor we get
213 const float max = maxZoomFactor();
214 const float min = minZoomFactor();
215
216 if (max <= min)
217 return;
218
219 factor = qBound(min, factor, max) - min;
220
221 const uint32_t zoom = minZoom
222 + static_cast<uint32_t>(qRound(factor*(maxZoom - minZoom)/(max - min)));
223
224 if (m_qnxCamera->setZoomFactor(zoom))
225 zoomFactorChanged(factor);
226}
227
229{
230 if (!m_qnxCamera)
231 return;
232
233 m_qnxCamera->setEvOffset(ev);
234}
235
237{
238 if (!m_qnxCamera)
239 return 0;
240
241 return m_qnxCamera->manualIsoSensitivity();
242}
243
245{
246 if (!m_qnxCamera)
247 return;
248
249 const uint32_t isoValue = std::max(0, value);
250
251 m_qnxCamera->setManualIsoSensitivity(isoValue);
252}
253
255{
256 if (!m_qnxCamera)
257 return;
258
259 m_qnxCamera->setManualExposureTime(seconds);
260}
261
263{
264 if (!m_qnxCamera)
265 return 0.0;
266
267 return static_cast<float>(m_qnxCamera->manualExposureTime());
268}
269
271{
272 if (m_maxColorTemperature != 0)
273 return true;
274
276}
277
279{
280 if (!m_qnxCamera)
281 return;
282
284 m_qnxCamera->setWhiteBalanceMode(CAMERA_WHITEBALANCEMODE_AUTO);
285 } else {
286 m_qnxCamera->setWhiteBalanceMode(CAMERA_WHITEBALANCEMODE_MANUAL);
288 }
289}
290
292{
293 if (!m_qnxCamera)
294 return;
295
296 const auto normalizedTemp = std::clamp<uint32_t>(std::max(0, temperature),
297 m_minColorTemperature, m_maxColorTemperature);
298
299 if (m_qnxCamera->hasContinuousWhiteBalanceValues()) {
300 m_qnxCamera->setManualWhiteBalance(normalizedTemp);
301 } else {
302 uint32_t delta = std::numeric_limits<uint32_t>::max();
303 uint32_t closestTemp = 0;
304
305 for (uint32_t value : m_qnxCamera->supportedWhiteBalanceValues()) {
306 const auto &[min, max] = std::minmax(value, normalizedTemp);
307 const uint32_t currentDelta = max - min;
308
309 if (currentDelta < delta) {
310 closestTemp = value;
311 delta = currentDelta;
312 }
313 }
314
315 m_qnxCamera->setManualWhiteBalance(closestTemp);
316 }
317}
318
320{
321 if (!m_qnxCamera) {
322 qWarning("QQnxPlatformCamera: cannot start video recording - no no camera assigned");
323 return false;
324 }
325
326 if (!isVideoEncodingSupported()) {
327 qWarning("QQnxPlatformCamera: cannot start video recording - not supported");
328 return false;
329 }
330
331 if (!m_qnxCamera->isActive()) {
332 qWarning("QQnxPlatformCamera: cannot start video recording - camera not started");
333 return false;
334 }
335
336 const QString container = m_encoderSettings.mimeType().preferredSuffix();
339
340#if 0
341 {
342 static void *libScreen = nullptr;
343
344 if (!libScreen)
345 libScreen = dlopen("/usr/lib/libscreen.so.1", RTLD_GLOBAL);
346 }
347#endif
348
349 qDebug() << "Recording to" << location;
350 return m_qnxCamera->startVideoRecording(location);
351}
352
354{
355 m_videoFrameRequests.emplace_back(std::move(cb));
356}
357
358bool QQnxPlatformCamera::isVideoEncodingSupported() const
359{
360 return m_qnxCamera && m_qnxCamera->hasFeature(CAMERA_FEATURE_VIDEO);
361}
362
364{
365 m_outputUrl = url;
366}
367
372
373void QQnxPlatformCamera::updateCameraFeatures()
374{
375 if (!m_qnxCamera)
376 return;
377
378 QCamera::Features features = {};
379
380 if (m_qnxCamera->hasFeature(CAMERA_FEATURE_REGIONFOCUS))
382
383 supportedFeaturesChanged(features);
384
385 minimumZoomFactorChanged(m_qnxCamera->minimumZoomLevel());
386 maximumZoomFactorChanged(m_qnxCamera->maximumZoomLevel());
387
388 const QList<uint32_t> wbValues = m_qnxCamera->supportedWhiteBalanceValues();
389
390 if (wbValues.isEmpty()) {
391 m_minColorTemperature = m_maxColorTemperature = 0;
392 } else {
393 const auto &[minTemp, maxTemp] = std::minmax_element(wbValues.begin(), wbValues.end());
394
395 m_minColorTemperature = *minTemp;
396 m_maxColorTemperature = *maxTemp;
397 }
398}
399
400void QQnxPlatformCamera::onFrameAvailable()
401{
402 if (!m_videoSink)
403 return;
404
405 std::unique_ptr<QQnxCameraFrameBuffer> currentFrame = m_qnxCamera->takeCurrentFrame();
406
407 if (!currentFrame)
408 return;
409
410 const QVideoFrame actualFrame(currentFrame.get(),
411 QVideoFrameFormat(currentFrame->size(), currentFrame->pixelFormat()));
412
413 currentFrame.release(); // QVideoFrame has taken ownership of the internal
414 // buffer
415
416 m_videoSink->setVideoFrame(actualFrame);
417
418 if (!m_videoFrameRequests.empty()) {
419 VideoFrameCallback cb = std::move(m_videoFrameRequests.front());
420 m_videoFrameRequests.pop_front();
421 cb(actualFrame);
422 }
423}
424
426
427#include "moc_qqnxplatformcamera_p.cpp"
The QCameraDevice class provides general information about camera devices.
The QCameraFormat class describes a video format supported by a camera device. \inmodule QtMultimedia...
The QCamera class provides interface for system camera devices.
Definition qcamera.h:28
WhiteBalanceMode
\value WhiteBalanceAuto Auto white balance mode.
Definition qcamera.h:112
@ WhiteBalanceAuto
Definition qcamera.h:113
FocusMode
\value FocusModeAuto Continuous auto focus mode.
Definition qcamera.h:67
@ FocusModeAutoNear
Definition qcamera.h:69
@ FocusModeInfinity
Definition qcamera.h:72
@ FocusModeAutoFar
Definition qcamera.h:70
@ FocusModeAuto
Definition qcamera.h:68
@ FocusModeManual
Definition qcamera.h:73
@ FocusModeHyperfocal
Definition qcamera.h:71
QCameraDevice defaultVideoInput
\qmlproperty cameraDevice QtMultimedia::MediaDevices::defaultVideoInput Returns the default camera on...
QString preferredSuffix
the preferred suffix for the MIME type
Definition qmimetype.h:38
QObject * parent() const
Returns a pointer to the parent object.
Definition qobject.h:346
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
float minZoomFactor() const
static int colorTemperatureForWhiteBalance(QCamera::WhiteBalanceMode mode)
float maxZoomFactor() const
void maximumZoomFactorChanged(float)
void customFocusPointChanged(const QPointF &point)
void zoomFactorChanged(float zoom)
void supportedFeaturesChanged(QCamera::Features)
void minimumZoomFactorChanged(float factor)
virtual void setVideoFrame(const QVideoFrame &frame)
void activeChanged(bool)
\inmodule QtCore\reentrant
Definition qpoint.h:217
void focusModeChanged(camera_focusmode_t mode)
void frameAvailable()
void customFocusPointChanged(const QPointF &point)
QQnxVideoSink * videoSink() const
QQnxPlatformCamera(QCamera *parent)
void setManualExposureTime(float seconds) override
void setMediaEncoderSettings(const QMediaEncoderSettings &settings)
void setExposureCompensation(float ev) override
void requestVideoFrame(VideoFrameCallback cb)
std::function< void(const QVideoFrame &)> VideoFrameCallback
void setCamera(const QCameraDevice &camera) override
void setCaptureSession(QPlatformMediaCaptureSession *session) override
void setOutputUrl(const QUrl &url)
void setManualIsoSensitivity(int value) override
bool isWhiteBalanceModeSupported(QCamera::WhiteBalanceMode mode) const override
void setCustomFocusPoint(const QPointF &point) override
int isoSensitivity() const override
void setColorTemperature(int temperature) override
void setWhiteBalanceMode(QCamera::WhiteBalanceMode mode) override
float exposureTime() const override
bool isFocusModeSupported(QCamera::FocusMode mode) const override
void setFocusDistance(float distance) override
void zoomTo(float newZoomFactor, float rate=-1.) override
bool isActive() const override
void setFocusMode(QCamera::FocusMode mode) override
bool setCameraFormat(const QCameraFormat &format) override
void setActive(bool active) override
\inmodule QtCore
Definition qsize.h:25
constexpr int height() const noexcept
Returns the height.
Definition qsize.h:133
constexpr int width() const noexcept
Returns the width.
Definition qsize.h:130
constexpr bool isEmpty() const noexcept
Returns true if either of the width and height is less than or equal to 0; otherwise returns false.
Definition qsize.h:124
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
\inmodule QtCore
Definition qurl.h:94
QString toLocalFile() const
Returns the path of this URL formatted as a local file path.
Definition qurl.cpp:3425
The QVideoFrameFormat class specifies the stream format of a video presentation surface.
The QVideoFrame class represents a frame of video data.
Definition qvideoframe.h:27
QCamera * camera
Definition camera.cpp:19
Q_MULTIMEDIA_EXPORT QString generateFileName(const QString &requestedName, QStandardPaths::StandardLocation type, const QString &extension)
Combined button and popup list for selecting options.
@ QueuedConnection
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
int qRound(qfloat16 d) noexcept
Definition qfloat16.h:327
#define qDebug
[1]
Definition qlogging.h:164
#define qWarning
Definition qlogging.h:166
constexpr const T & qBound(const T &min, const T &val, const T &max)
Definition qminmax.h:44
GLint location
GLenum mode
const GLfloat * m
GLsizei GLsizei GLfloat distance
GLint GLsizei GLsizei GLenum format
GLenum GLenum GLenum GLenum mapping
static constexpr To convert(const std::array< Mapping, N > &mapping, From Mapping::*from, To Mapping::*to, From value, To defaultValue)
static constexpr camera_focusmode_t qnxFocusMode(QCamera::FocusMode mode)
constexpr std::array< FocusModeMapping, 6 > focusModes
static constexpr QCamera::FocusMode qtFocusMode(camera_focusmode_t mode)
SSL_CTX int(* cb)(SSL *ssl, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
#define Q_EMIT
QSettings settings("MySoft", "Star Runner")
[0]
QUrl url("example.com")
[constructor-url-reference]
QCamera::FocusMode qt
camera_focusmode_t qnx