Revision control

++ // Copyright (C) 2021 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
++
++ #include "qqnxvideodevices_p.h"
++ #include "qqnxcamera_p.h"
++ #include "private/qcameradevice_p.h"
++ #include "qcameradevice.h"
++
++ #include <qdir.h>
++ #include <qdebug.h>
++
++ #include <optional>
++
++ QT_BEGIN_NAMESPACE
++
++ static QVideoFrameFormat::PixelFormat fromCameraFrametype(camera_frametype_t type)
++ {
++ switch (type) {
++ default:
++ case CAMERA_FRAMETYPE_UNSPECIFIED:
++ return QVideoFrameFormat::Format_Invalid;
++ case CAMERA_FRAMETYPE_NV12:
++ return QVideoFrameFormat::Format_NV12;
++ case CAMERA_FRAMETYPE_RGB8888:
++ return QVideoFrameFormat::Format_ARGB8888;
++ #if _NTO_VERSION < 800
++ case CAMERA_FRAMETYPE_JPEG:
++ return QVideoFrameFormat::Format_Jpeg;
++ #endif
++ case CAMERA_FRAMETYPE_GRAY8:
++ return QVideoFrameFormat::Format_Y8;
++ case CAMERA_FRAMETYPE_CBYCRY:
++ return QVideoFrameFormat::Format_UYVY;
++ case CAMERA_FRAMETYPE_YCBCR420P:
++ return QVideoFrameFormat::Format_YUV420P;
++ case CAMERA_FRAMETYPE_YCBYCR:
++ return QVideoFrameFormat::Format_YUYV;
++ }
++ }
++
++ static std::optional<QCameraDevice> createCameraDevice(camera_unit_t unit, bool isDefault)
++ {
++ const QQnxCamera camera(unit);
++
++ if (!camera.isValid()) {
++ qWarning() << "Invalid camera unit:" << unit;
++ return {};
++ }
++
++ auto *p = new QCameraDevicePrivate;
++
++ p->id = QByteArray::number(camera.unit());
++ p->description = camera.name();
++ p->isDefault = isDefault;
++
++ const QList<camera_frametype_t> frameTypes = camera.supportedVfFrameTypes();
++
++ for (camera_res_t res : camera.supportedVfResolutions()) {
++ const QSize resolution(res.width, res.height);
++
++ p->photoResolutions.append(resolution);
++
++ for (camera_frametype_t frameType : camera.supportedVfFrameTypes()) {
++ const QVideoFrameFormat::PixelFormat pixelFormat = fromCameraFrametype(frameType);
++
++ if (pixelFormat == QVideoFrameFormat::Format_Invalid)
++ continue;
++
++ auto *f = new QCameraFormatPrivate;
++ p->videoFormats.append(f->create());
++
++ f->resolution = resolution;
++ f->pixelFormat = pixelFormat;
++ f->minFrameRate = 1.e10;
++
++ for (double fr : camera.specifiedVfFrameRates(frameType, res)) {
++ if (fr < f->minFrameRate)
++ f->minFrameRate = fr;
++ if (fr > f->maxFrameRate)
++ f->maxFrameRate = fr;
++ }
++ }
++ }
++
++ return p->create();
++ }
++
++ QQnxVideoDevices::QQnxVideoDevices(QPlatformMediaIntegration *integration)
++ : QPlatformVideoDevices(integration)
++ {
++ }
++
++ QList<QCameraDevice> QQnxVideoDevices::findVideoInputs() const
++ {
++ QList<QCameraDevice> cameras;
++
++ bool isDefault = true;
++
++ for (const camera_unit_t cameraUnit : QQnxCamera::supportedUnits()) {
++ const std::optional<QCameraDevice> cameraDevice = createCameraDevice(cameraUnit, isDefault);
++
++ if (!cameraDevice)
++ continue;
++
++ cameras.append(*cameraDevice);
++
++ isDefault = false;
++ }
++
++ return cameras;
++ }
++
++ QT_END_NAMESPACE