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 return !QMediaDevices::videoInputs().isEmpty();
47}
48
50{
51 if (!_videoOutput) {
52 return;
53 }
54
55 const QCameraFormat cameraFormat = _camera->cameraFormat();
56 if (cameraFormat.isNull()) {
57 return;
58 }
59
60 const QSize resolution = cameraFormat.resolution();
61 if (resolution.isValid()) {
62 const qreal aspectRatio = static_cast<qreal>(resolution.width()) / resolution.height();
63 const qreal width = _videoOutput->width();
64 if (width > 0.0) {
65 _videoOutput->setHeight(width / aspectRatio);
66 }
67 }
68}
69
70QCameraDevice UVCReceiver::findCameraDevice(const QString &cameraId)
71{
72 const QList<QCameraDevice> videoInputs = QMediaDevices::videoInputs();
73 for (const QCameraDevice &camera : videoInputs) {
74 if (camera.description() == cameraId) {
75 return camera;
76 }
77 }
78
79 return QCameraDevice();
80}
81
83{
84 const QCameraPermission cameraPermission;
85 if (qApp->checkPermission(cameraPermission) == Qt::PermissionStatus::Undetermined) {
86 qApp->requestPermission(cameraPermission, qgcApp(), [](const QPermission &permission) {
87 if (permission.status() != Qt::PermissionStatus::Granted) {
88 QGC::showAppMessage(QStringLiteral("Failed to get camera permission"));
89 }
90 });
91 }
92}
93
95{
96 const QString videoSource = SettingsManager::instance()->videoSettings()->videoSource()->rawValue().toString();
97 const QCameraDevice cameraDevice = findCameraDevice(videoSource);
98 if (cameraDevice.isNull()) {
99 return QString();
100 }
101
102 const QString videoSourceID = cameraDevice.description();
103 qCDebug(UVCReceiverLog) << "Found USB source:" << videoSourceID << "Name:" << videoSource;
104 return videoSourceID;
105}
106
107bool UVCReceiver::deviceExists(const QString &device)
108{
109 return !findCameraDevice(device).isNull();
110}
111
113{
114 QStringList deviceNameList;
115
116 const QList<QCameraDevice> videoInputs = QMediaDevices::videoInputs();
117 for (const QCameraDevice &cameraDevice : videoInputs) {
118 deviceNameList.append(cameraDevice.description());
119 }
120
121 return deviceNameList;
122}
#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()