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_instance.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
6
7#include <QtCore/qglobalstatic.h>
8#include <QtCore/qmetaobject.h>
9#include <QtCore/qmutex.h>
10#include <QtCore/private/qsystemerror_p.h>
11
12#include <libcamera/base/signal.h>
13#include <libcamera/camera.h>
14#include <libcamera/camera_manager.h>
15
16#include <mutex>
17
19
20Q_LOGGING_CATEGORY(lcLibCamera, "qt.multimedia.libcamera")
21
22namespace QLibCamera {
23
24using namespace libcamera;
25
26namespace {
27
28struct InstanceHolder
29{
30 QMutex mutex;
31 std::weak_ptr<QLibCameraInstance> instance;
32};
33
34Q_GLOBAL_STATIC(InstanceHolder, s_libCameraInstance)
35
36} // namespace
37
38QLibCameraInstance::QLibCameraInstance() : m_manager(std::make_unique<CameraManager>())
39{
40 const int startResult = m_manager->start();
41 m_started = startResult == 0;
42 if (!m_started) {
43 qCWarning(lcLibCamera) << "libcamera::CameraManager::start() failed:"
44 << QSystemError::stdString(-startResult);
45 return;
46 }
47
48 m_manager->cameraAdded.connect(this, [this](std::shared_ptr<Camera> camera) {
49 // called on libcamera thread
50 const QString id = QString::fromStdString(camera->id());
51 QMetaObject::invokeMethod(this, [this, id] {
52 Q_EMIT cameraAdded(id);
53 }, Qt::QueuedConnection);
54 });
55 m_manager->cameraRemoved.connect(this, [this](std::shared_ptr<Camera> camera) {
56 // called on libcamera thread
57 const QString id = QString::fromStdString(camera->id());
58 QMetaObject::invokeMethod(this, [this, id] {
59 Q_EMIT cameraRemoved(id);
60 }, Qt::QueuedConnection);
61 });
62
63 qCDebug(lcLibCamera) << "libcamera" << CameraManager::version().c_str() << "started,"
64 << int(m_manager->cameras().size()) << "camera(s) found";
65}
66
67QLibCameraInstance::~QLibCameraInstance()
68{
69 if (m_started)
70 m_manager->stop();
71}
72
73std::shared_ptr<QLibCameraInstance> QLibCameraInstance::instance()
74{
75 std::lock_guard guard{ s_libCameraInstance->mutex };
76 std::shared_ptr<QLibCameraInstance> ret = s_libCameraInstance->instance.lock();
77 if (!ret) {
78 ret = std::shared_ptr<QLibCameraInstance>(new QLibCameraInstance);
79 if (!ret->m_started)
80 return nullptr; // CameraManager::start() failed
81
82 s_libCameraInstance->instance = ret;
83 }
84 return ret;
85}
86
87std::shared_ptr<Camera> QLibCameraInstance::get(const QString &id) const
88{
89 return m_manager->get(id.toStdString());
90}
91
92} // namespace QLibCamera
93
94QT_END_NAMESPACE
95
96#include "moc_qlibcamera_instance_p.cpp"
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")