summaryrefslogtreecommitdiffstats
path: root/src/multimedia/platform
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-01-26 16:16:59 +0100
committerLars Knoll <lars.knoll@qt.io>2021-01-29 08:53:59 +0000
commit2fb1e26a780c4caf0ae6aef40fd6852275dc5765 (patch)
tree4b904eb3909352031c2e7093ff8a0deb75140797 /src/multimedia/platform
parentefde83895668224823218076051226023203a378 (diff)
Cleanup resolution and frameRate handling
The Camera determines the available resolutions and framerates. There's no point routing requests around that through the backend again, if we can get it from QCameraInfo in the first place. Change-Id: Ie00285811202bf93799155736de149c37561fd31 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/multimedia/platform')
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol.cpp17
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol_p.h6
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidvideoencodersettingscontrol.cpp16
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidvideoencodersettingscontrol_p.h2
-rw-r--r--src/multimedia/platform/darwin/camera/avfimageencodercontrol.mm38
-rw-r--r--src/multimedia/platform/darwin/camera/avfimageencodercontrol_p.h2
-rw-r--r--src/multimedia/platform/darwin/camera/avfvideoencodersettingscontrol.mm74
-rw-r--r--src/multimedia/platform/darwin/camera/avfvideoencodersettingscontrol_p.h6
-rw-r--r--src/multimedia/platform/darwin/qdarwindevicemanager.mm13
-rw-r--r--src/multimedia/platform/gstreamer/camerabin/camerabinvideoencoder.cpp28
-rw-r--r--src/multimedia/platform/gstreamer/camerabin/camerabinvideoencoder_p.h6
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamercameracontrol.cpp2
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h8
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode.cpp8
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode_p.h3
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamerv4l2input.cpp217
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamerv4l2input_p.h16
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoencode.cpp16
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoencode_p.h6
19 files changed, 23 insertions, 461 deletions
diff --git a/src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol.cpp b/src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol.cpp
index 1f30ea95f..9ef5eb90e 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol.cpp
+++ b/src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol.cpp
@@ -48,8 +48,6 @@ QAndroidImageEncoderControl::QAndroidImageEncoderControl(QAndroidCameraSession *
: QImageEncoderControl()
, m_session(session)
{
- connect(m_session, SIGNAL(opened()),
- this, SLOT(onCameraOpened()));
}
QStringList QAndroidImageEncoderControl::supportedImageCodecs() const
@@ -65,16 +63,6 @@ QString QAndroidImageEncoderControl::imageCodecDescription(const QString &codecN
return QString();
}
-QList<QSize> QAndroidImageEncoderControl::supportedResolutions(const QImageEncoderSettings &settings, bool *continuous) const
-{
- Q_UNUSED(settings);
-
- if (continuous)
- *continuous = false;
-
- return m_supportedResolutions;
-}
-
QImageEncoderSettings QAndroidImageEncoderControl::imageSettings() const
{
return m_session->imageSettings();
@@ -85,9 +73,4 @@ void QAndroidImageEncoderControl::setImageSettings(const QImageEncoderSettings &
m_session->setImageSettings(settings);
}
-void QAndroidImageEncoderControl::onCameraOpened()
-{
- m_supportedResolutions = m_session->camera()->getSupportedPictureSizes();
-}
-
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol_p.h b/src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol_p.h
index 9e65660ff..a162171f9 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol_p.h
+++ b/src/multimedia/platform/android/mediacapture/qandroidimageencodercontrol_p.h
@@ -65,17 +65,11 @@ public:
QStringList supportedImageCodecs() const override;
QString imageCodecDescription(const QString &codecName) const override;
- QList<QSize> supportedResolutions(const QImageEncoderSettings &settings, bool *continuous = 0) const override;
QImageEncoderSettings imageSettings() const override;
void setImageSettings(const QImageEncoderSettings &settings) override;
-private Q_SLOTS:
- void onCameraOpened();
-
private:
QAndroidCameraSession *m_session;
-
- QList<QSize> m_supportedResolutions;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/android/mediacapture/qandroidvideoencodersettingscontrol.cpp b/src/multimedia/platform/android/mediacapture/qandroidvideoencodersettingscontrol.cpp
index ef3559c0d..cda1d2dd3 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidvideoencodersettingscontrol.cpp
+++ b/src/multimedia/platform/android/mediacapture/qandroidvideoencodersettingscontrol.cpp
@@ -49,22 +49,6 @@ QAndroidVideoEncoderSettingsControl::QAndroidVideoEncoderSettingsControl(QAndroi
{
}
-QList<QSize> QAndroidVideoEncoderSettingsControl::supportedResolutions(const QVideoEncoderSettings &, bool *continuous) const
-{
- if (continuous)
- *continuous = false;
-
- return m_session->supportedResolutions();
-}
-
-QList<qreal> QAndroidVideoEncoderSettingsControl::supportedFrameRates(const QVideoEncoderSettings &, bool *continuous) const
-{
- if (continuous)
- *continuous = false;
-
- return m_session->supportedFrameRates();
-}
-
QStringList QAndroidVideoEncoderSettingsControl::supportedVideoCodecs() const
{
return QStringList() << QLatin1String("h263")
diff --git a/src/multimedia/platform/android/mediacapture/qandroidvideoencodersettingscontrol_p.h b/src/multimedia/platform/android/mediacapture/qandroidvideoencodersettingscontrol_p.h
index 1488790a8..d17825d87 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidvideoencodersettingscontrol_p.h
+++ b/src/multimedia/platform/android/mediacapture/qandroidvideoencodersettingscontrol_p.h
@@ -63,8 +63,6 @@ class QAndroidVideoEncoderSettingsControl : public QVideoEncoderSettingsControl
public:
explicit QAndroidVideoEncoderSettingsControl(QAndroidCaptureSession *session);
- QList<QSize> supportedResolutions(const QVideoEncoderSettings &settings, bool *continuous = 0) const override;
- QList<qreal> supportedFrameRates(const QVideoEncoderSettings &settings, bool *continuous = 0) const override;
QStringList supportedVideoCodecs() const override;
QString videoCodecDescription(const QString &codecName) const override;
QVideoEncoderSettings videoSettings() const override;
diff --git a/src/multimedia/platform/darwin/camera/avfimageencodercontrol.mm b/src/multimedia/platform/darwin/camera/avfimageencodercontrol.mm
index 113fdb62b..7b04e5f70 100644
--- a/src/multimedia/platform/darwin/camera/avfimageencodercontrol.mm
+++ b/src/multimedia/platform/darwin/camera/avfimageencodercontrol.mm
@@ -72,44 +72,6 @@ QString AVFImageEncoderControl::imageCodecDescription(const QString &codecName)
return QString();
}
-QList<QSize> AVFImageEncoderControl::supportedResolutions(const QImageEncoderSettings &settings,
- bool *continuous) const
-{
- Q_UNUSED(settings);
-
- QList<QSize> resolutions;
-
- if (!videoCaptureDeviceIsValid())
- return resolutions;
-
- AVCaptureDevice *captureDevice = m_service->session()->videoCaptureDevice();
- const QVector<AVCaptureDeviceFormat *> formats(qt_unique_device_formats(captureDevice,
- m_service->session()->defaultCodec()));
-
- for (int i = 0; i < formats.size(); ++i) {
- AVCaptureDeviceFormat *format = formats[i];
-
- const QSize res(qt_device_format_resolution(format));
- if (!res.isNull() && res.isValid())
- resolutions << res;
-#ifdef Q_OS_IOS
- // From Apple's docs (iOS):
- // By default, AVCaptureStillImageOutput emits images with the same dimensions as
- // its source AVCaptureDevice instance’s activeFormat.formatDescription. However,
- // if you set this property to YES, the receiver emits still images at the capture
- // device’s highResolutionStillImageDimensions value.
- const QSize hrRes(qt_device_format_high_resolution(format));
- if (!hrRes.isNull() && hrRes.isValid())
- resolutions << res;
-#endif
- }
-
- if (continuous)
- *continuous = false;
-
- return resolutions;
-}
-
QImageEncoderSettings AVFImageEncoderControl::requestedSettings() const
{
return m_settings;
diff --git a/src/multimedia/platform/darwin/camera/avfimageencodercontrol_p.h b/src/multimedia/platform/darwin/camera/avfimageencodercontrol_p.h
index 8c2742d35..963ec5e5e 100644
--- a/src/multimedia/platform/darwin/camera/avfimageencodercontrol_p.h
+++ b/src/multimedia/platform/darwin/camera/avfimageencodercontrol_p.h
@@ -74,8 +74,6 @@ public:
QStringList supportedImageCodecs() const override;
QString imageCodecDescription(const QString &codecName) const override;
- QList<QSize> supportedResolutions(const QImageEncoderSettings &settings,
- bool *continuous) const override;
QImageEncoderSettings imageSettings() const override;
void setImageSettings(const QImageEncoderSettings &settings) override;
diff --git a/src/multimedia/platform/darwin/camera/avfvideoencodersettingscontrol.mm b/src/multimedia/platform/darwin/camera/avfvideoencodersettingscontrol.mm
index 0800e2021..36da08d43 100644
--- a/src/multimedia/platform/darwin/camera/avfvideoencodersettingscontrol.mm
+++ b/src/multimedia/platform/darwin/camera/avfvideoencodersettingscontrol.mm
@@ -90,80 +90,6 @@ AVFVideoEncoderSettingsControl::AVFVideoEncoderSettingsControl(AVFCameraService
{
}
-QList<QSize> AVFVideoEncoderSettingsControl::supportedResolutions(const QVideoEncoderSettings &settings,
- bool *continuous) const
-{
- Q_UNUSED(settings);
-
- if (continuous)
- *continuous = true;
-
- // AVFoundation seems to support any resolution for recording, with the following limitations:
- // - The recording resolution can't be higher than the camera's active resolution
- // - On OS X, the recording resolution is automatically adjusted to have the same aspect ratio as
- // the camera's active resolution
- QList<QSize> resolutions;
- resolutions.append(QSize(32, 32));
-
- AVCaptureDevice *device = m_service->session()->videoCaptureDevice();
- if (device) {
- int maximumWidth = 0;
- const QVector<AVCaptureDeviceFormat *> formats(qt_unique_device_formats(device,
- m_service->session()->defaultCodec()));
- for (int i = 0; i < formats.size(); ++i) {
- const QSize res(qt_device_format_resolution(formats[i]));
- if (res.width() > maximumWidth)
- maximumWidth = res.width();
- }
-
- if (maximumWidth > 0)
- resolutions.append(QSize(maximumWidth, maximumWidth));
- }
-
- if (resolutions.count() == 1)
- resolutions.append(QSize(3840, 3840));
-
- return resolutions;
-}
-
-QList<qreal> AVFVideoEncoderSettingsControl::supportedFrameRates(const QVideoEncoderSettings &settings,
- bool *continuous) const
-{
- QList<qreal> uniqueFrameRates;
-
- AVCaptureDevice *device = m_service->session()->videoCaptureDevice();
- if (!device)
- return uniqueFrameRates;
-
- if (continuous)
- *continuous = false;
-
- QVector<AVFPSRange> allRates;
-
- if (!settings.resolution().isValid()) {
- const QVector<AVCaptureDeviceFormat *> formats(qt_unique_device_formats(device, 0));
- for (int i = 0; i < formats.size(); ++i) {
- AVCaptureDeviceFormat *format = formats.at(i);
- allRates += qt_device_format_framerates(format);
- }
- } else {
- AVCaptureDeviceFormat *format = qt_find_best_resolution_match(device,
- settings.resolution(),
- m_service->session()->defaultCodec());
- if (format)
- allRates = qt_device_format_framerates(format);
- }
-
- for (int j = 0; j < allRates.size(); ++j) {
- if (!real_list_contains(uniqueFrameRates, allRates[j].first))
- uniqueFrameRates.append(allRates[j].first);
- if (!real_list_contains(uniqueFrameRates, allRates[j].second))
- uniqueFrameRates.append(allRates[j].second);
- }
-
- return uniqueFrameRates;
-}
-
QStringList AVFVideoEncoderSettingsControl::supportedVideoCodecs() const
{
return *supportedCodecs;
diff --git a/src/multimedia/platform/darwin/camera/avfvideoencodersettingscontrol_p.h b/src/multimedia/platform/darwin/camera/avfvideoencodersettingscontrol_p.h
index 6d44d4a33..0b0338ad6 100644
--- a/src/multimedia/platform/darwin/camera/avfvideoencodersettingscontrol_p.h
+++ b/src/multimedia/platform/darwin/camera/avfvideoencodersettingscontrol_p.h
@@ -69,12 +69,6 @@ class AVFVideoEncoderSettingsControl : public QVideoEncoderSettingsControl
public:
explicit AVFVideoEncoderSettingsControl(AVFCameraService *service);
- QList<QSize> supportedResolutions(const QVideoEncoderSettings &requestedVideoSettings,
- bool *continuous = nullptr) const override;
-
- QList<qreal> supportedFrameRates(const QVideoEncoderSettings &requestedVideoSettings,
- bool *continuous = nullptr) const override;
-
QStringList supportedVideoCodecs() const override;
QString videoCodecDescription(const QString &codecName) const override;
diff --git a/src/multimedia/platform/darwin/qdarwindevicemanager.mm b/src/multimedia/platform/darwin/qdarwindevicemanager.mm
index 1a483dd72..ca3babb6c 100644
--- a/src/multimedia/platform/darwin/qdarwindevicemanager.mm
+++ b/src/multimedia/platform/darwin/qdarwindevicemanager.mm
@@ -277,10 +277,14 @@ void QDarwinDeviceManager::updateCameraDevices()
// qDebug() << " " << frameRateRange.minFrameRate << frameRateRange.maxFrameRate;
#ifdef Q_OS_IOS
- // ###
-// CMVideoDimensions photoDim = format.highResolutionStillImageDimensions;
-// QSize photoSize(photoDim.....)
- // Add to photoresolutions
+ // From Apple's docs (iOS):
+ // By default, AVCaptureStillImageOutput emits images with the same dimensions as
+ // its source AVCaptureDevice instance’s activeFormat.formatDescription. However,
+ // if you set this property to YES, the receiver emits still images at the capture
+ // device’s highResolutionStillImageDimensions value.
+ const QSize hrRes(qt_device_format_high_resolution(format));
+ if (!hrRes.isNull() && hrRes.isValid())
+ photoResolutions.insert(res);
#endif
auto *f = new QCameraFormatPrivate{
@@ -293,6 +297,7 @@ void QDarwinDeviceManager::updateCameraDevices()
videoFormats << f->create();
}
info->videoFormats = videoFormats;
+ info->photoResolutions = photoResolutions.values();
cameras.append(info->create());
}
diff --git a/src/multimedia/platform/gstreamer/camerabin/camerabinvideoencoder.cpp b/src/multimedia/platform/gstreamer/camerabin/camerabinvideoencoder.cpp
index 5bba2ddb5..8ecbc0eb0 100644
--- a/src/multimedia/platform/gstreamer/camerabin/camerabinvideoencoder.cpp
+++ b/src/multimedia/platform/gstreamer/camerabin/camerabinvideoencoder.cpp
@@ -60,34 +60,6 @@ CameraBinVideoEncoder::~CameraBinVideoEncoder()
{
}
-QList<QSize> CameraBinVideoEncoder::supportedResolutions(const QVideoEncoderSettings &settings, bool *continuous) const
-{
- if (continuous)
- *continuous = false;
-
- QPair<int,int> rate = rateAsRational(settings.frameRate());
-
- //select the closest supported rational rate to settings.frameRate()
-
- return m_session->supportedResolutions(rate, continuous, QCamera::CaptureVideo);
-}
-
-QList< qreal > CameraBinVideoEncoder::supportedFrameRates(const QVideoEncoderSettings &settings, bool *continuous) const
-{
- if (continuous)
- *continuous = false;
-
- QList< qreal > res;
-
- const auto rates = m_session->supportedFrameRates(settings.resolution(), continuous);
- for (const auto &rate : rates) {
- if (rate.second > 0)
- res << qreal(rate.first)/rate.second;
- }
-
- return res;
-}
-
QStringList CameraBinVideoEncoder::supportedVideoCodecs() const
{
#if QT_CONFIG(gstreamer_encodingprofiles)
diff --git a/src/multimedia/platform/gstreamer/camerabin/camerabinvideoencoder_p.h b/src/multimedia/platform/gstreamer/camerabin/camerabinvideoencoder_p.h
index 15ab1a08d..acb8e6db9 100644
--- a/src/multimedia/platform/gstreamer/camerabin/camerabinvideoencoder_p.h
+++ b/src/multimedia/platform/gstreamer/camerabin/camerabinvideoencoder_p.h
@@ -77,12 +77,6 @@ public:
CameraBinVideoEncoder(CameraBinSession *session);
virtual ~CameraBinVideoEncoder();
- QList<QSize> supportedResolutions(const QVideoEncoderSettings &settings = QVideoEncoderSettings(),
- bool *continuous = 0) const override;
-
- QList< qreal > supportedFrameRates(const QVideoEncoderSettings &settings = QVideoEncoderSettings(),
- bool *continuous = 0) const override;
-
QPair<int,int> rateAsRational(qreal) const;
QStringList supportedVideoCodecs() const override;
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameracontrol.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameracontrol.cpp
index bd0de8bc8..34d1b7331 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameracontrol.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameracontrol.cpp
@@ -132,7 +132,7 @@ void QGstreamerCameraControl::setState(QCamera::State state)
void QGstreamerCameraControl::setCamera(const QCameraInfo &camera)
{
- m_session->videoInput()->setDevice(camera.id());
+ m_session->videoInput()->setDevice(camera);
}
QCamera::State QGstreamerCameraControl::state() const
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h
index 04fc7c26e..0a0aa374c 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h
@@ -74,6 +74,7 @@ class QGstreamerImageEncode;
class QGstreamerRecorderControl;
class QGstreamerMediaContainerControl;
class QGstreamerVideoRendererInterface;
+class QCameraInfo;
class QGstreamerElementFactory
{
@@ -85,11 +86,8 @@ public:
class QGstreamerVideoInput : public QGstreamerElementFactory
{
public:
- virtual QList<qreal> supportedFrameRates(const QSize &frameSize = QSize()) const = 0;
- virtual QList<QSize> supportedResolutions(qreal frameRate = -1) const = 0;
-
- virtual QByteArray device() const = 0;
- virtual void setDevice(const QByteArray &device) = 0;
+ virtual QCameraInfo device() const = 0;
+ virtual void setDevice(const QCameraInfo &device) = 0;
};
class QGstreamerCaptureSession
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode.cpp
index f64fd235a..e5b2859d2 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode.cpp
@@ -53,14 +53,6 @@ QGstreamerImageEncode::~QGstreamerImageEncode()
{
}
-QList<QSize> QGstreamerImageEncode::supportedResolutions(const QImageEncoderSettings &, bool *continuous) const
-{
- if (continuous)
- *continuous = m_session->videoInput() != 0;
-
- return m_session->videoInput() ? m_session->videoInput()->supportedResolutions() : QList<QSize>();
-}
-
QStringList QGstreamerImageEncode::supportedImageCodecs() const
{
return QStringList() << "jpeg";
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode_p.h
index eef51eee0..89ace7d3c 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode_p.h
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimageencode_p.h
@@ -69,9 +69,6 @@ public:
QGstreamerImageEncode(QGstreamerCaptureSession *session);
virtual ~QGstreamerImageEncode();
- QList<QSize> supportedResolutions(const QImageEncoderSettings &settings = QImageEncoderSettings(),
- bool *continuous = 0) const override;
-
QStringList supportedImageCodecs() const override;
QString imageCodecDescription(const QString &codecName) const override;
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerv4l2input.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerv4l2input.cpp
index de7b4ff1d..1a0779ba5 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerv4l2input.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerv4l2input.cpp
@@ -47,13 +47,6 @@
#include <algorithm>
-QT_BEGIN_NAMESPACE
-static bool operator<(const QSize &s1, const QSize s2)
-{
- return s1.width()*s1.height() < s2.width()*s2.height();
-}
-QT_END_NAMESPACE
-
QGstreamerV4L2Input::QGstreamerV4L2Input()
{
}
@@ -65,214 +58,14 @@ QGstreamerV4L2Input::~QGstreamerV4L2Input()
GstElement *QGstreamerV4L2Input::buildElement()
{
GstElement *camera = gst_element_factory_make("v4l2src", "camera_source");
- if (camera && !m_device.isEmpty() )
- g_object_set(G_OBJECT(camera), "device", m_device.constData(), NULL);
+ if (camera && !m_cameraInfo.isNull())
+ g_object_set(G_OBJECT(camera), "device", m_cameraInfo.id().constData(), NULL);
return camera;
}
-void QGstreamerV4L2Input::setDevice(const QByteArray &newDevice)
-{
- if (m_device != newDevice) {
- m_device = newDevice;
- updateSupportedResolutions(newDevice);
- }
-}
-
-void QGstreamerV4L2Input::updateSupportedResolutions(const QByteArray &device)
-{
- m_frameRates.clear();
- m_resolutions.clear();
- m_ratesByResolution.clear();
-
- QSet<QSize> allResolutions;
- QSet<int> allFrameRates;
-
- QFile f(device);
-
- if (!f.open(QFile::ReadOnly))
- return;
-
- int fd = f.handle();
-
- //get the list of formats:
- QList<quint32> supportedFormats;
-
- {
- v4l2_fmtdesc fmt;
- memset(&fmt, 0, sizeof(v4l2_fmtdesc));
-
- fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- int sanity = 0;
-
- for (fmt.index = 0;; fmt.index++) {
- if (sanity++ > 8)
- break;
- if( ::ioctl(fd, VIDIOC_ENUM_FMT, &fmt) == -1) {
- if(errno == EINVAL)
- break;
- }
- supportedFormats.append(fmt.pixelformat);
- }
- }
-
- QList<QSize> commonSizes;
- commonSizes << QSize(128, 96)
- <<QSize(160,120)
- <<QSize(176, 144)
- <<QSize(320, 240)
- <<QSize(352, 288)
- <<QSize(640, 480)
- <<QSize(1024, 768)
- <<QSize(1280, 1024)
- <<QSize(1600, 1200)
- <<QSize(1920, 1200)
- <<QSize(2048, 1536)
- <<QSize(2560, 1600)
- <<QSize(2580, 1936);
-
- QList<int> commonRates;
- commonRates << 05*1000 << 75*1000 << 10*1000 << 15*1000 << 20*1000
- << 24*1000 << 25*1000 << 30*1000 << 50*1000 << 60*1000;
-
-
- //get the list of resolutions:
-
- for (quint32 format : qAsConst(supportedFormats)) {
- struct v4l2_frmsizeenum formatSize;
- memset(&formatSize, 0, sizeof(formatSize));
- formatSize.pixel_format = format;
-
- QList<QSize> sizeList;
-
- if (0) {
- char formatStr[5];
- memcpy(formatStr, &format, 4);
- formatStr[4] = 0;
- //qDebug() << "trying format" << formatStr;
- }
-
- for (int i=0;;i++) {
- formatSize.index = i;
- if (ioctl (fd, VIDIOC_ENUM_FRAMESIZES, &formatSize) < 0)
- break;
-
- if (formatSize.type == V4L2_FRMSIZE_TYPE_DISCRETE) {
- sizeList.append(QSize(formatSize.discrete.width, formatSize.discrete.height));
- } else {
-
- for (const QSize& candidate : qAsConst(commonSizes)) {
- if (candidate.width() <= (int)formatSize.stepwise.max_width &&
- candidate.height() >= (int)formatSize.stepwise.min_width &&
- candidate.width() % formatSize.stepwise.step_width == 0 &&
- candidate.height() <= (int)formatSize.stepwise.max_height &&
- candidate.height() >= (int)formatSize.stepwise.min_height &&
- candidate.height() % formatSize.stepwise.step_height == 0) {
- sizeList.append(candidate);
- }
- }
-
- if (!sizeList.contains(QSize(formatSize.stepwise.min_width, formatSize.stepwise.min_height)))
- sizeList.prepend(QSize(formatSize.stepwise.min_width, formatSize.stepwise.min_height));
-
- if (!sizeList.contains(QSize(formatSize.stepwise.max_width, formatSize.stepwise.max_height)))
- sizeList.append(QSize(formatSize.stepwise.max_width, formatSize.stepwise.max_height));
-
- break; //stepwise values are returned only for index 0
- }
-
- }
-
- //and frameRates for each resolution.
-
- for (const QSize &s : qAsConst(sizeList)) {
- allResolutions.insert(s);
-
- struct v4l2_frmivalenum formatInterval;
- memset(&formatInterval, 0, sizeof(formatInterval));
- formatInterval.pixel_format = format;
- formatInterval.width = s.width();
- formatInterval.height = s.height();
-
- QList<int> frameRates; //in 1/1000 of fps
-
- for (int i=0; ; i++) {
- formatInterval.index = i;
-
- if (ioctl(fd, VIDIOC_ENUM_FRAMEINTERVALS, &formatInterval) < 0)
- break;
-
- if (formatInterval.type == V4L2_FRMIVAL_TYPE_DISCRETE) {
- //converts seconds to fps*1000
- if (formatInterval.discrete.numerator)
- frameRates.append(qRound(formatInterval.discrete.denominator*1000.0 / formatInterval.discrete.numerator));
- } else {
- if (formatInterval.stepwise.min.numerator == 0 ||
- formatInterval.stepwise.max.numerator == 0) {
- qWarning() << "received invalid frame interval";
- break;
- }
-
-
- int minRate = qRound(formatInterval.stepwise.min.denominator*1000.0 /
- formatInterval.stepwise.min.numerator);
-
- int maxRate = qRound(formatInterval.stepwise.max.denominator*1000.0 /
- formatInterval.stepwise.max.numerator);
-
-
- for (int candidate : qAsConst(commonRates)) {
- if (candidate >= minRate && candidate <= maxRate)
- frameRates.append(candidate);
- }
-
- if (!frameRates.contains(minRate))
- frameRates.prepend(minRate);
-
- if (!frameRates.contains(maxRate))
- frameRates.append(maxRate);
-
- break; //stepwise values are returned only for index 0
- }
- }
- allFrameRates.unite(QSet<int>{frameRates.constBegin(), frameRates.constEnd()});
- m_ratesByResolution[s].unite(QSet<int>{frameRates.constBegin(), frameRates.constEnd()});
- }
- }
-
- f.close();
-
- for (int rate : qAsConst(allFrameRates)) {
- m_frameRates.append(rate/1000.0);
- }
-
- std::sort(m_frameRates.begin(), m_frameRates.end());
-
- m_resolutions = QList<QSize>{allResolutions.constBegin(), allResolutions.constEnd()};
- std::sort(m_resolutions.begin(), m_resolutions.end());
-
- //qDebug() << "frame rates:" << m_frameRates;
- //qDebug() << "resolutions:" << m_resolutions;
-}
-
-
-QList<qreal> QGstreamerV4L2Input::supportedFrameRates(const QSize &frameSize) const
-{
- if (frameSize.isEmpty())
- return m_frameRates;
- else {
- QList<qreal> res;
- const auto rates = m_ratesByResolution[frameSize];
- res.reserve(rates.size());
- for (int rate : rates) {
- res.append(rate/1000.0);
- }
- return res;
- }
-}
-
-QList<QSize> QGstreamerV4L2Input::supportedResolutions(qreal frameRate) const
+void QGstreamerV4L2Input::setDevice(const QCameraInfo &newDevice)
{
- Q_UNUSED(frameRate);
- return m_resolutions;
+ if (m_cameraInfo != newDevice)
+ m_cameraInfo = newDevice;
}
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerv4l2input_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerv4l2input_p.h
index 90c17dd63..aafe4e71d 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerv4l2input_p.h
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerv4l2input_p.h
@@ -56,6 +56,8 @@
#include <QtCore/qbytearray.h>
#include <QtCore/qlist.h>
#include <QtCore/qsize.h>
+#include <qcamerainfo.h>
+
#include "qgstreamercapturesession_p.h"
QT_BEGIN_NAMESPACE
@@ -68,21 +70,13 @@ public:
GstElement *buildElement() override;
- QList<qreal> supportedFrameRates(const QSize &frameSize = QSize()) const override;
- QList<QSize> supportedResolutions(qreal frameRate = -1) const override;
-
- QByteArray device() const override { return m_device; }
- void setDevice(const QByteArray &device) override;
+ QCameraInfo device() const override { return m_cameraInfo; }
+ void setDevice(const QCameraInfo &device) override;
private:
- void updateSupportedResolutions(const QByteArray &device);
-
- QList<qreal> m_frameRates;
- QList<QSize> m_resolutions;
+ QCameraInfo m_cameraInfo;
QHash<QSize, QSet<int> > m_ratesByResolution;
-
- QByteArray m_device;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoencode.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoencode.cpp
index ae46f2422..f032c4c37 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoencode.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoencode.cpp
@@ -55,22 +55,6 @@ QGstreamerVideoEncode::~QGstreamerVideoEncode()
{
}
-QList<QSize> QGstreamerVideoEncode::supportedResolutions(const QVideoEncoderSettings &, bool *continuous) const
-{
- if (continuous)
- *continuous = m_session->videoInput() != 0;
-
- return m_session->videoInput() ? m_session->videoInput()->supportedResolutions() : QList<QSize>();
-}
-
-QList< qreal > QGstreamerVideoEncode::supportedFrameRates(const QVideoEncoderSettings &, bool *continuous) const
-{
- if (continuous)
- *continuous = false;
-
- return m_session->videoInput() ? m_session->videoInput()->supportedFrameRates() : QList<qreal>();
-}
-
QStringList QGstreamerVideoEncode::supportedVideoCodecs() const
{
return m_codecs.supportedCodecs();
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoencode_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoencode_p.h
index 5cc38e25d..8731b4971 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoencode_p.h
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoencode_p.h
@@ -72,12 +72,6 @@ public:
QGstreamerVideoEncode(QGstreamerCaptureSession *session);
virtual ~QGstreamerVideoEncode();
- QList<QSize> supportedResolutions(const QVideoEncoderSettings &settings = QVideoEncoderSettings(),
- bool *continuous = 0) const override;
-
- QList< qreal > supportedFrameRates(const QVideoEncoderSettings &settings = QVideoEncoderSettings(),
- bool *continuous = 0) const override;
-
QPair<int,int> rateAsRational() const;
QStringList supportedVideoCodecs() const override;