4#undef QT_NO_CONTEXTLESS_CONNECT
14#include <private/qmediastoragelocation_p.h>
15#include <private/qvideoframe_p.h>
17#include <camera/camera_api.h>
18#include <camera/camera_3a.h>
28 camera_focusmode_t
qnx;
40template <
typename Mapping,
typename From,
typename To,
size_t N>
42 From Mapping::* from, To Mapping::* to, From
value, To defaultValue)
45 const auto fromValue =
m.*from;
46 const auto toValue =
m.*to;
48 if (
value == fromValue)
85 return m_qnxCamera && m_qnxCamera->isActive();
104 m_qnxCamera->start();
116 m_videoSink =
nullptr;
123 if (m_cameraDevice ==
camera)
126 const auto cameraUnit =
static_cast<camera_unit_t
>(
camera.id().toUInt());
128 m_qnxCamera = std::make_unique<QQnxCamera>(cameraUnit);
131 [
this](camera_focusmode_t
mode) { Q_EMIT focusModeChanged(qtFocusMode(mode)); });
139 updateCameraFeatures();
147 qWarning(
"QQnxPlatformCamera: invalid resolution requested");
151 return m_qnxCamera->setCameraFormat(resolution.
width(),
157 if (m_session == session)
184 m_qnxCamera->setCustomFocusPoint(point);
192 const int maxDistance = m_qnxCamera->maxFocusStep();
197 const int qnxDistance = maxDistance * std::min(
distance, 1.0f);
199 m_qnxCamera->setManualFocusStep(qnxDistance);
207 const uint32_t minZoom = m_qnxCamera->minimumZoomLevel();
208 const uint32_t maxZoom = m_qnxCamera->maximumZoomLevel();
210 if (maxZoom <= minZoom)
220 factor =
qBound(min, factor, max) - min;
222 const uint32_t zoom = minZoom
223 +
static_cast<uint32_t
>(
qRound(factor*(maxZoom - minZoom)/(max - min)));
225 if (m_qnxCamera->setZoomFactor(zoom))
234 m_qnxCamera->setEvOffset(ev);
242 return m_qnxCamera->manualIsoSensitivity();
250 const uint32_t isoValue = std::max(0,
value);
252 m_qnxCamera->setManualIsoSensitivity(isoValue);
260 m_qnxCamera->setManualExposureTime(seconds);
268 return static_cast<float>(m_qnxCamera->manualExposureTime());
273 if (m_maxColorTemperature != 0)
285 m_qnxCamera->setWhiteBalanceMode(CAMERA_WHITEBALANCEMODE_AUTO);
287 m_qnxCamera->setWhiteBalanceMode(CAMERA_WHITEBALANCEMODE_MANUAL);
297 const auto normalizedTemp = std::clamp<uint32_t>(std::max(0, temperature),
298 m_minColorTemperature, m_maxColorTemperature);
300 if (m_qnxCamera->hasContinuousWhiteBalanceValues()) {
301 m_qnxCamera->setManualWhiteBalance(normalizedTemp);
303 uint32_t delta = std::numeric_limits<uint32_t>::max();
304 uint32_t closestTemp = 0;
306 for (uint32_t
value : m_qnxCamera->supportedWhiteBalanceValues()) {
307 const auto &[min, max] = std::minmax(
value, normalizedTemp);
308 const uint32_t currentDelta = max - min;
310 if (currentDelta < delta) {
312 delta = currentDelta;
316 m_qnxCamera->setManualWhiteBalance(closestTemp);
323 qWarning(
"QQnxPlatformCamera: cannot start video recording - no no camera assigned");
327 if (!isVideoEncodingSupported()) {
328 qWarning(
"QQnxPlatformCamera: cannot start video recording - not supported");
332 if (!m_qnxCamera->isActive()) {
333 qWarning(
"QQnxPlatformCamera: cannot start video recording - camera not started");
343 static void *libScreen =
nullptr;
346 libScreen = dlopen(
"/usr/lib/libscreen.so.1", RTLD_GLOBAL);
351 return m_qnxCamera->startVideoRecording(
location);
356 m_videoFrameRequests.emplace_back(std::move(
cb));
359bool QQnxPlatformCamera::isVideoEncodingSupported()
const
361 return m_qnxCamera && m_qnxCamera->hasFeature(CAMERA_FEATURE_VIDEO);
374void QQnxPlatformCamera::updateCameraFeatures()
379 QCamera::Features features = {};
381 if (m_qnxCamera->hasFeature(CAMERA_FEATURE_REGIONFOCUS))
389 const QList<uint32_t> wbValues = m_qnxCamera->supportedWhiteBalanceValues();
391 if (wbValues.isEmpty()) {
392 m_minColorTemperature = m_maxColorTemperature = 0;
394 const auto &[minTemp, maxTemp] = std::minmax_element(wbValues.begin(), wbValues.end());
396 m_minColorTemperature = *minTemp;
397 m_maxColorTemperature = *maxTemp;
401void QQnxPlatformCamera::onFrameAvailable()
406 std::unique_ptr<QQnxCameraFrameBuffer> currentFrameBuffer = m_qnxCamera->takeCurrentFrame();
408 if (!currentFrameBuffer)
417 if (!m_videoFrameRequests.empty()) {
419 m_videoFrameRequests.pop_front();
426#include "moc_qqnxplatformcamera_p.cpp"
The QCameraDevice class provides general information about camera devices.
The QCamera class provides interface for system camera devices.
WhiteBalanceMode
\value WhiteBalanceAuto Auto white balance mode.
FocusMode
\value FocusModeAuto Continuous auto focus mode.
QString preferredSuffix
the preferred suffix for the MIME type
QObject * parent() const
Returns a pointer to the parent object.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
\inmodule QtCore\reentrant
void focusModeChanged(camera_focusmode_t mode)
void customFocusPointChanged(const QPointF &point)
constexpr int height() const noexcept
Returns the height.
constexpr int width() const noexcept
Returns the width.
constexpr bool isEmpty() const noexcept
Returns true if either of the width and height is less than or equal to 0; otherwise returns false.
\macro QT_RESTRICTED_CAST_FROM_ASCII
QString toLocalFile() const
Returns the path of this URL formatted as a local file path.
static QVideoFrame createFrame(std::unique_ptr< Buffer > buffer, QVideoFrameFormat format)
The QVideoFrame class represents a frame of video data.
Combined button and popup list for selecting options.
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
int qRound(qfloat16 d) noexcept
constexpr const T & qBound(const T &min, const T &val, const T &max)
GLsizei GLsizei GLfloat distance
GLint GLsizei GLsizei GLenum format
GLenum GLenum GLenum GLenum mapping
SSL_CTX int(* cb)(SSL *ssl, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
QSettings settings("MySoft", "Star Runner")
[0]
QUrl url("example.com")
[constructor-url-reference]