Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qlibcamera_videodevices.cpp
Go to the documentation of this file.
1// Copyright (C) 2026 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
7
8#include <QtMultimedia/private/qcameradevice_p.h>
9#include <QtMultimedia/private/qplatformmediaintegration_p.h>
10
11#include <libcamera/camera.h>
12#include <libcamera/camera_manager.h>
13#include <libcamera/control_ids.h>
14#include <libcamera/controls.h>
15#include <libcamera/geometry.h>
16#include <libcamera/pixel_format.h>
17#include <libcamera/property_ids.h>
18#include <libcamera/stream.h>
19
21
22namespace QLibCamera {
23
24using namespace libcamera;
25
26std::unique_ptr<QLibCameraVideoDevices>
27QLibCameraVideoDevices::create(QPlatformMediaIntegration *integration)
28{
29 std::shared_ptr<QLibCameraInstance> instance = QLibCameraInstance::instance();
30 if (!instance)
31 return nullptr; // CameraManager::start() failed -- caller must fall back.
32
33 return std::unique_ptr<QLibCameraVideoDevices>(
34 new QLibCameraVideoDevices(integration, std::move(instance)));
35}
36
37QLibCameraVideoDevices::QLibCameraVideoDevices(QPlatformMediaIntegration *integration,
38 std::shared_ptr<QLibCameraInstance> instance)
39 : QPlatformVideoDevices(integration), m_instance(std::move(instance))
40{
41 connect(m_instance.get(), &QLibCameraInstance::cameraAdded, this,
42 &QLibCameraVideoDevices::onVideoInputsChanged);
43 connect(m_instance.get(), &QLibCameraInstance::cameraRemoved, this,
44 &QLibCameraVideoDevices::onVideoInputsChanged);
45}
46
48
49static QCameraDevice::Position positionFromLibcamera(const ControlList &properties)
50{
51 const std::optional<int32_t> location = properties.get(properties::Location);
52 if (!location)
53 return QCameraDevice::UnspecifiedPosition;
54
55 switch (*location) {
56 case properties::CameraLocationFront:
57 return QCameraDevice::FrontFace;
58 case properties::CameraLocationBack:
59 return QCameraDevice::BackFace;
60 default:
61 return QCameraDevice::UnspecifiedPosition;
62 }
63}
64
65static void appendFormatsForSize(QList<QCameraFormat> &formats,
66 QVideoFrameFormat::PixelFormat pixelFormat, const QSize &size,
67 float minFrameRate, float maxFrameRate)
68{
69 auto *f = new QCameraFormatPrivate{
70 QSharedData(), pixelFormat, size, minFrameRate, maxFrameRate,
71 };
72 formats << f->create();
73}
74
76{
77 using namespace QLibCameraFormatSupport;
78 QList<QCameraDevice> devices;
79
80 CameraManager *manager = m_instance->manager();
81 if (!manager)
82 return devices;
83
84 for (const std::shared_ptr<Camera> &camera : manager->cameras()) {
85 auto *info = new QCameraDevicePrivate;
86 info->id = QByteArray::fromStdString(camera->id());
87
88 const ControlList &properties = camera->properties();
89 if (const std::optional<std::string_view> model = properties.get(properties::Model))
90 info->description = QString::fromUtf8(model->data(), qsizetype(model->size()));
91 else
92 info->description = QString::fromStdString(camera->id());
93
94 info->isDefault = devices.isEmpty();
95 info->position = positionFromLibcamera(properties);
96 if (const std::optional<int32_t> rotation = properties.get(properties::Rotation))
97 info->orientation = *rotation;
98
99 const auto [minFrameRate, maxFrameRate] = frameRateRangeFromControls(camera->controls());
100
101 std::unique_ptr<CameraConfiguration> config =
102 camera->generateConfiguration({ StreamRole::VideoRecording });
103 if (config && !config->empty()) {
104 const StreamConfiguration &streamConfig = config->at(0);
105 for (const PixelFormat &pixelFormat : streamConfig.formats().pixelformats()) {
106 const std::optional<QVideoFrameFormat::PixelFormat> qtFormat =
107 pixelFormatFromLibcamera(pixelFormat);
108 if (!qtFormat)
109 continue; // e.g. Bayer raw formats -- correctly unsupported.
110
111 const std::vector sizes = sizesForPixelFormat(streamConfig.formats(), pixelFormat);
112 for (const QSize &size : sizes)
113 appendFormatsForSize(info->videoFormats, *qtFormat, size, minFrameRate,
114 maxFrameRate);
115 }
116 }
117
118 devices << info->create();
119 }
120
121 return devices;
122}
123
124} // namespace QLibCamera
125
126QT_END_NAMESPACE
127
128#include "moc_qlibcamera_videodevices_p.cpp"
QList< QCameraDevice > findVideoInputs() const override
static QCameraDevice::Position positionFromLibcamera(const ControlList &properties)
static void appendFormatsForSize(QList< QCameraFormat > &formats, QVideoFrameFormat::PixelFormat pixelFormat, const QSize &size, float minFrameRate, float maxFrameRate)
Combined button and popup list for selecting options.