QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
UVCReceiver.cc
Go to the documentation of this file.
1#include "UVCReceiver.h"
2#include "AppMessages.h"
3#include "QGCApplication.h"
5#include "SettingsManager.h"
6#include "VideoSettings.h"
7
8#include <QtCore/QCoreApplication>
9#include <QtCore/QPermissions>
10#include <QtMultimedia/QCamera>
11#include <QtMultimedia/QCameraDevice>
12#include <QtMultimedia/QImageCapture>
13#include <QtMultimedia/QMediaCaptureSession>
14#include <QtMultimedia/QMediaDevices>
15#include <QtMultimediaQuick/private/qquickvideooutput_p.h>
16#include <QtQuick/QQuickItem>
17
18QGC_LOGGING_CATEGORY(UVCReceiverLog, "Video.UVCReceiver")
19
20UVCReceiver::UVCReceiver(QObject *parent)
21 : QtMultimediaReceiver(parent)
22 , _camera(new QCamera(this))
23 , _imageCapture(new QImageCapture(this))
24 , _mediaDevices(new QMediaDevices(this))
25{
26 // qCDebug(UVCReceiverLog) << this;
27
28 _captureSession->setCamera(_camera);
29 _captureSession->setImageCapture(_imageCapture);
30 _captureSession->setVideoSink(_videoSink);
31
32 (void) connect(_captureSession, &QMediaCaptureSession::cameraChanged, this, [this] {
33 adjustAspectRatio();
34 });
35
36 checkPermission();
37}
38
40{
41 // qCDebug(UVCReceiverLog) << this;
42}
43
45{
46#ifdef QGC_DISABLE_UVC
47 return false;
48#else
49 return !QMediaDevices::videoInputs().isEmpty();
50#endif
51}
52
54{
55 if (!_videoOutput) {
56 return;
57 }
58
59 const QCameraFormat cameraFormat = _camera->cameraFormat();
60 if (cameraFormat.isNull()) {
61 return;
62 }
63
64 const QSize resolution = cameraFormat.resolution();
65 if (resolution.isValid()) {
66 const qreal aspectRatio = static_cast<qreal>(resolution.width()) / resolution.height();
67 const qreal width = _videoOutput->width();
68 if (width > 0.0) {
69 _videoOutput->setHeight(width / aspectRatio);
70 }
71 }
72}
73
74QCameraDevice UVCReceiver::findCameraDevice(const QString &cameraId)
75{
76 const QList<QCameraDevice> videoInputs = QMediaDevices::videoInputs();
77 for (const QCameraDevice &camera : videoInputs) {
78 if (camera.description() == cameraId) {
79 return camera;
80 }
81 }
82
83 return QCameraDevice();
84}
85
87{
88 const QCameraPermission cameraPermission;
89 if (qApp->checkPermission(cameraPermission) == Qt::PermissionStatus::Undetermined) {
90 qApp->requestPermission(cameraPermission, qgcApp(), [](const QPermission &permission) {
91 if (permission.status() != Qt::PermissionStatus::Granted) {
92 QGC::showAppMessage(QStringLiteral("Failed to get camera permission"));
93 }
94 });
95 }
96}
97
99{
100 const QString videoSource = SettingsManager::instance()->videoSettings()->videoSource()->rawValue().toString();
101 const QCameraDevice cameraDevice = findCameraDevice(videoSource);
102 if (cameraDevice.isNull()) {
103 return QString();
104 }
105
106 const QString videoSourceID = cameraDevice.description();
107 qCDebug(UVCReceiverLog) << "Found USB source:" << videoSourceID << "Name:" << videoSource;
108 return videoSourceID;
109}
110
111bool UVCReceiver::deviceExists(const QString &device)
112{
113 return !findCameraDevice(device).isNull();
114}
115
117{
118 QStringList deviceNameList;
119
120 const QList<QCameraDevice> videoInputs = QMediaDevices::videoInputs();
121 for (const QCameraDevice &cameraDevice : videoInputs) {
122 deviceNameList.append(cameraDevice.description());
123 }
124
125 return deviceNameList;
126}
#define qgcApp()
#define qApp
#define QGC_LOGGING_CATEGORY(name, categoryStr)
QQuickVideoOutput * _videoOutput
static SettingsManager * instance()
VideoSettings * videoSettings() const
static QCameraDevice findCameraDevice(const QString &cameraId)
static bool enabled()
static bool deviceExists(const QString &device)
static QString getSourceId()
Q_INVOKABLE void adjustAspectRatio()
static QStringList getDeviceNameList()
static void checkPermission()