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