diff options
author | Rafael Roquetto <rafael.roquetto@qt.io> | 2022-06-09 13:58:12 +1000 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-06-09 09:14:36 +0000 |
commit | 8c498c1728295e88cdce62a2fe236e11632ed7aa (patch) | |
tree | 5ef8ca656738a5df319bb1a9ab3f381223d66e29 /src/plugins/multimedia/qnx/qqnxvideodevices.cpp | |
parent | f32c1764ad89c2cc6d6c6fe31f7e2d2e7d2dfe32 (diff) |
Refactor QNX camera support
Introduce a brand new QQnxCamera class that models around the QNX camera
API, and represents an underlying camera unit. As a result, QQnxCamera
is a self-contained and orthogonal class that no longer inherits from
QPlatformCamera.
A new class called QQnxPlatformCamera has been introduced to provide the
QPlatformCamera implementation for QNX.
While QQnxCamera remains close to the underlying QNX camera API
(including the types being used), QQnxPlatformCamera sits one level up
and makes use of a QQnxCamera object to expose it to the Qt-compliant
API/types.
QQnxCamera also enabled doing without the code duplication in
QQnxVideoDevices, vastly simplified that class.
Change-Id: I5e09a24d52f4890616c66373dd4529c404b107b2
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
(cherry picked from commit e881a1afc08f1b168e743d63a2acc3025f3cb88c)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src/plugins/multimedia/qnx/qqnxvideodevices.cpp')
-rw-r--r-- | src/plugins/multimedia/qnx/qqnxvideodevices.cpp | 122 |
1 files changed, 54 insertions, 68 deletions
diff --git a/src/plugins/multimedia/qnx/qqnxvideodevices.cpp b/src/plugins/multimedia/qnx/qqnxvideodevices.cpp index 5414990f9..a0bd53833 100644 --- a/src/plugins/multimedia/qnx/qqnxvideodevices.cpp +++ b/src/plugins/multimedia/qnx/qqnxvideodevices.cpp @@ -38,14 +38,15 @@ ****************************************************************************/ #include "qqnxvideodevices_p.h" +#include "qqnxcamera_p.h" #include "private/qcameradevice_p.h" #include "qcameradevice.h" -#include <camera/camera_api.h> - #include <qdir.h> #include <qdebug.h> +#include <optional> + QT_BEGIN_NAMESPACE static QVideoFrameFormat::PixelFormat fromCameraFrametype(camera_frametype_t type) @@ -71,77 +72,51 @@ static QVideoFrameFormat::PixelFormat fromCameraFrametype(camera_frametype_t typ } } -static QList<QCameraDevice> enumerateCameras() +static std::optional<QCameraDevice> createCameraDevice(camera_unit_t unit, bool isDefault) { + const QQnxCamera camera(unit); - camera_unit_t cameraUnits[64]; - - unsigned int knownCameras = 0; - const camera_error_t result = camera_get_supported_cameras(64, &knownCameras, cameraUnits); - if (result != CAMERA_EOK) { - qWarning() << "Unable to retrieve supported camera types:" << result; + if (!camera.isValid()) { + qWarning() << "Invalid camera unit:" << unit; return {}; } - QList<QCameraDevice> cameras; - for (unsigned int i = 0; i < knownCameras; ++i) { - QCameraDevicePrivate *p = new QCameraDevicePrivate; - p->id = QByteArray::number(cameraUnits[i]); - - char name[CAMERA_LOCATION_NAMELEN]; - camera_get_location_property(cameraUnits[i], CAMERA_LOCATION_NAME, &name, CAMERA_LOCATION_END); - p->description = QString::fromUtf8(name); - - if (i == 0) - p->isDefault = true; - - camera_handle_t handle; - if (camera_open(cameraUnits[i], CAMERA_MODE_PREAD, &handle) == CAMERA_EOK) { - // query camera properties - - uint32_t nResolutions = 0; - camera_get_supported_vf_resolutions(handle, 0, &nResolutions, nullptr); - QVarLengthArray<camera_res_t> resolutions(nResolutions); - camera_get_supported_vf_resolutions(handle, nResolutions, &nResolutions, resolutions.data()); - - uint32_t nFrameTypes; - camera_get_supported_vf_frame_types(handle, 0, &nFrameTypes, nullptr); - QVarLengthArray<camera_frametype_t> frameTypes(nFrameTypes); - camera_get_supported_vf_frame_types(handle, nFrameTypes, &nFrameTypes, frameTypes.data()); - - for (auto res : resolutions) { - QSize resolution(res.width, res.height); - p->photoResolutions.append(resolution); - - for (auto frameType : frameTypes) { - auto pixelFormat = fromCameraFrametype(frameType); - if (pixelFormat == QVideoFrameFormat::Format_Invalid) - continue; - - uint32_t nFrameRates; - camera_get_specified_vf_framerates(handle, frameType, res, 0, &nFrameRates, nullptr, nullptr); - QVarLengthArray<double> frameRates(nFrameRates); - bool continuous = false; - camera_get_specified_vf_framerates(handle, frameType, res, nFrameRates, &nFrameRates, frameRates.data(), &continuous); - - QCameraFormatPrivate *f = new QCameraFormatPrivate; - f->resolution = resolution; - f->pixelFormat = pixelFormat; - f->minFrameRate = 1.e10; - for (auto fr : frameRates) { - if (fr < f->minFrameRate) - f->minFrameRate = fr; - if (fr > f->maxFrameRate) - f->maxFrameRate = fr; - } - p->videoFormats.append(f->create()); - } + 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; } } - - cameras.append(p->create()); } - return cameras; + + return p->create(); } QQnxVideoDevices::QQnxVideoDevices(QPlatformMediaIntegration *integration) @@ -151,10 +126,21 @@ QQnxVideoDevices::QQnxVideoDevices(QPlatformMediaIntegration *integration) QList<QCameraDevice> QQnxVideoDevices::videoDevices() const { - if (!camerasChecked) { - camerasChecked = true; - cameras = enumerateCameras(); + 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; } |