summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/multimediawidgets/camera/imagesettings.cpp3
-rw-r--r--src/imports/multimedia/qdeclarativecameracapture.cpp9
-rw-r--r--src/multimedia/camera/qcameraimagecapture.cpp20
-rw-r--r--src/multimedia/camera/qcameraimagecapture.h3
-rw-r--r--src/multimedia/controls/qimageencodercontrol.h3
-rw-r--r--src/multimedia/controls/qvideoencodersettingscontrol.h6
-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
-rw-r--r--src/multimedia/recording/qmediarecorder.cpp45
-rw-r--r--tests/auto/unit/mockbackend/mockimageencodercontrol.h24
-rw-r--r--tests/auto/unit/mockbackend/mockvideoencodercontrol.h18
-rw-r--r--tests/auto/unit/multimedia/qcameraimagecapture/tst_qcameraimagecapture.cpp15
-rw-r--r--tests/auto/unit/multimedia/qvideoencodersettingscontrol/tst_qvideoencodersettingscontrol.cpp17
30 files changed, 69 insertions, 578 deletions
diff --git a/examples/multimediawidgets/camera/imagesettings.cpp b/examples/multimediawidgets/camera/imagesettings.cpp
index 1c8895e02..239442a0f 100644
--- a/examples/multimediawidgets/camera/imagesettings.cpp
+++ b/examples/multimediawidgets/camera/imagesettings.cpp
@@ -54,6 +54,7 @@
#include <QComboBox>
#include <QDebug>
#include <QCameraImageCapture>
+#include <QCamera>
#include <QMediaService>
@@ -75,7 +76,7 @@ ImageSettings::ImageSettings(QCameraImageCapture *imageCapture, QWidget *parent)
ui->imageQualitySlider->setRange(0, int(QMultimedia::VeryHighQuality));
ui->imageResolutionBox->addItem(tr("Default Resolution"));
- const QList<QSize> supportedResolutions = imagecapture->supportedResolutions();
+ const QList<QSize> supportedResolutions = imagecapture->camera()->cameraInfo().photoResolutions();
for (const QSize &resolution : supportedResolutions) {
ui->imageResolutionBox->addItem(QString("%1x%2").arg(resolution.width()).arg(resolution.height()),
QVariant(resolution));
diff --git a/src/imports/multimedia/qdeclarativecameracapture.cpp b/src/imports/multimedia/qdeclarativecameracapture.cpp
index df47abd9e..cf3a63d1b 100644
--- a/src/imports/multimedia/qdeclarativecameracapture.cpp
+++ b/src/imports/multimedia/qdeclarativecameracapture.cpp
@@ -315,8 +315,13 @@ QString QDeclarativeCameraCapture::errorString() const
QVariantList QDeclarativeCameraCapture::supportedResolutions()
{
QVariantList supportedResolutions;
- for (const QSize &res : m_capture->supportedResolutions())
- supportedResolutions.append(QVariant(res));
+
+ if (m_camera) {
+ auto resolutions = m_camera->cameraInfo().photoResolutions();
+ for (const auto &r : resolutions)
+ supportedResolutions.append(r);
+ }
+
return supportedResolutions;
}
diff --git a/src/multimedia/camera/qcameraimagecapture.cpp b/src/multimedia/camera/qcameraimagecapture.cpp
index a6da93445..52ce1e9f2 100644
--- a/src/multimedia/camera/qcameraimagecapture.cpp
+++ b/src/multimedia/camera/qcameraimagecapture.cpp
@@ -259,26 +259,6 @@ QString QCameraImageCapture::imageCodecDescription(const QString &codec) const
}
/*!
- Returns a list of resolutions images can be encoded at.
-
- If non null image \a settings parameter is passed,
- the returned list is reduced to resolution supported with partial settings like image codec or quality applied.
-
- If the encoder supports arbitrary resolutions within the supported range,
- *\a continuous is set to true, otherwise *\a continuous is set to false.
-
- \sa QImageEncoderSettings::resolution()
-*/
-QList<QSize> QCameraImageCapture::supportedResolutions(const QImageEncoderSettings &settings, bool *continuous) const
-{
- if (continuous)
- *continuous = false;
-
- return d_func()->encoderControl ?
- d_func()->encoderControl->supportedResolutions(settings, continuous) : QList<QSize>();
-}
-
-/*!
Returns the image encoder settings being used.
\sa setEncodingSettings()
diff --git a/src/multimedia/camera/qcameraimagecapture.h b/src/multimedia/camera/qcameraimagecapture.h
index 9b35a0a84..e76f9533b 100644
--- a/src/multimedia/camera/qcameraimagecapture.h
+++ b/src/multimedia/camera/qcameraimagecapture.h
@@ -103,9 +103,6 @@ public:
QStringList supportedImageCodecs() const;
QString imageCodecDescription(const QString &codecName) const;
- QList<QSize> supportedResolutions(const QImageEncoderSettings &settings = QImageEncoderSettings(),
- bool *continuous = nullptr) const;
-
QImageEncoderSettings encodingSettings() const;
void setEncodingSettings(const QImageEncoderSettings& settings);
diff --git a/src/multimedia/controls/qimageencodercontrol.h b/src/multimedia/controls/qimageencodercontrol.h
index 99342bcbe..330186bb7 100644
--- a/src/multimedia/controls/qimageencodercontrol.h
+++ b/src/multimedia/controls/qimageencodercontrol.h
@@ -61,9 +61,6 @@ public:
virtual QStringList supportedImageCodecs() const = 0;
virtual QString imageCodecDescription(const QString &codec) const = 0;
- virtual QList<QSize> supportedResolutions(const QImageEncoderSettings &settings,
- bool *continuous = nullptr) const = 0;
-
virtual QImageEncoderSettings imageSettings() const = 0;
virtual void setImageSettings(const QImageEncoderSettings &settings) = 0;
diff --git a/src/multimedia/controls/qvideoencodersettingscontrol.h b/src/multimedia/controls/qvideoencodersettingscontrol.h
index 37b6da856..3edca2d56 100644
--- a/src/multimedia/controls/qvideoencodersettingscontrol.h
+++ b/src/multimedia/controls/qvideoencodersettingscontrol.h
@@ -61,12 +61,6 @@ class Q_MULTIMEDIA_EXPORT QVideoEncoderSettingsControl : public QObject
Q_OBJECT
public:
- virtual QList<QSize> supportedResolutions(const QVideoEncoderSettings &settings,
- bool *continuous = nullptr) const = 0;
-
- virtual QList<qreal> supportedFrameRates(const QVideoEncoderSettings &settings,
- bool *continuous = nullptr) const = 0;
-
virtual QStringList supportedVideoCodecs() const = 0;
virtual QString videoCodecDescription(const QString &codec) const = 0;
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;
diff --git a/src/multimedia/recording/qmediarecorder.cpp b/src/multimedia/recording/qmediarecorder.cpp
index 05ea09b5e..e9e5b4660 100644
--- a/src/multimedia/recording/qmediarecorder.cpp
+++ b/src/multimedia/recording/qmediarecorder.cpp
@@ -644,13 +644,21 @@ QList<int> QMediaRecorder::supportedAudioSampleRates(const QAudioEncoderSettings
\sa QVideoEncoderSettings::resolution()
*/
-QList<QSize> QMediaRecorder::supportedResolutions(const QVideoEncoderSettings &settings, bool *continuous) const
+QList<QSize> QMediaRecorder::supportedResolutions(const QVideoEncoderSettings &, bool *continuous) const
{
if (continuous)
- *continuous = false;
-
- return d_func()->videoControl ?
- d_func()->videoControl->supportedResolutions(settings, continuous) : QList<QSize>();
+ *continuous = true;
+
+ QCamera *camera = qobject_cast<QCamera *>(mediaSource());
+ if (!camera)
+ return {};
+
+ QCameraInfo info = camera->cameraInfo();
+ const auto formats = info.videoFormats();
+ QList<QSize> resolutions;
+ for (const auto &f : formats)
+ resolutions.append(f.resolution());
+ return resolutions;
}
/*!
@@ -668,10 +676,31 @@ QList<QSize> QMediaRecorder::supportedResolutions(const QVideoEncoderSettings &s
QList<qreal> QMediaRecorder::supportedFrameRates(const QVideoEncoderSettings &settings, bool *continuous) const
{
if (continuous)
- *continuous = false;
+ *continuous = true;
+
+ QSize resolution = settings.resolution();
+
+ QCamera *camera = qobject_cast<QCamera *>(mediaSource());
+ if (!camera)
+ return {};
+
+ QCameraInfo info = camera->cameraInfo();
+ const auto formats = info.videoFormats();
+ qreal min = 0.;
+ qreal max = 1.e6;
+ for (const auto &f : formats) {
+ QSize formatResolution = f.resolution();
+ if (formatResolution.width() >= resolution.width() || formatResolution.height() >= resolution.height()) {
+ // we can downsample, framerates are usable
+ min = qMin(min, f.minFrameRate());
+ max = qMax(max, f.maxFrameRate());
+ }
+ }
- return d_func()->videoControl ?
- d_func()->videoControl->supportedFrameRates(settings, continuous) : QList<qreal>();
+ if (min == 0.)
+ return {};
+
+ return QList<qreal>() << min << max;
}
/*!
diff --git a/tests/auto/unit/mockbackend/mockimageencodercontrol.h b/tests/auto/unit/mockbackend/mockimageencodercontrol.h
index f03e15959..d67a33f57 100644
--- a/tests/auto/unit/mockbackend/mockimageencodercontrol.h
+++ b/tests/auto/unit/mockbackend/mockimageencodercontrol.h
@@ -40,30 +40,6 @@ public:
m_settings = QImageEncoderSettings();
}
- QList<QSize> supportedResolutions(const QImageEncoderSettings & settings = QImageEncoderSettings(),
- bool *continuous = 0) const
- {
- if (continuous)
- *continuous = true;
-
- QList<QSize> resolutions;
- if (settings.resolution().isValid()) {
- if (settings.resolution() == QSize(160,160) ||
- settings.resolution() == QSize(320,240))
- resolutions << settings.resolution();
-
- if (settings.quality() == QMultimedia::HighQuality && settings.resolution() == QSize(640,480))
- resolutions << settings.resolution();
- } else {
- resolutions << QSize(160, 120);
- resolutions << QSize(320, 240);
- if (settings.quality() == QMultimedia::HighQuality)
- resolutions << QSize(640, 480);
- }
-
- return resolutions;
- }
-
QStringList supportedImageCodecs() const
{
QStringList codecs;
diff --git a/tests/auto/unit/mockbackend/mockvideoencodercontrol.h b/tests/auto/unit/mockbackend/mockvideoencodercontrol.h
index a1ee8ff9f..f98eed3df 100644
--- a/tests/auto/unit/mockbackend/mockvideoencodercontrol.h
+++ b/tests/auto/unit/mockbackend/mockvideoencodercontrol.h
@@ -47,24 +47,6 @@ public:
QVideoEncoderSettings videoSettings() const { return m_videoSettings; }
void setVideoSettings(const QVideoEncoderSettings &settings) { m_videoSettings = settings; };
- QList<QSize> supportedResolutions(const QVideoEncoderSettings & = QVideoEncoderSettings(),
- bool *continuous = 0) const
- {
- if (continuous)
- *continuous = true;
-
- return m_sizes;
- }
-
- QList<qreal> supportedFrameRates(const QVideoEncoderSettings & = QVideoEncoderSettings(),
- bool *continuous = 0) const
- {
- if (continuous)
- *continuous = false;
-
- return m_framerates;
- }
-
QStringList supportedVideoCodecs() const { return m_videoCodecs; }
QString videoCodecDescription(const QString &codecName) const { return codecName; }
diff --git a/tests/auto/unit/multimedia/qcameraimagecapture/tst_qcameraimagecapture.cpp b/tests/auto/unit/multimedia/qcameraimagecapture/tst_qcameraimagecapture.cpp
index 6a7281274..499392b6b 100644
--- a/tests/auto/unit/multimedia/qcameraimagecapture/tst_qcameraimagecapture.cpp
+++ b/tests/auto/unit/multimedia/qcameraimagecapture/tst_qcameraimagecapture.cpp
@@ -103,7 +103,6 @@ private slots:
void imageExposed();
void imageSaved();
void readyForCaptureChanged();
- void supportedResolutions();
void imageCodecDescription();
void supportedImageCodecs();
void cameraImageCaptureControl();
@@ -250,20 +249,6 @@ void tst_QCameraImageCapture::supportedImageCodecs()
QVERIFY(!imageCapture.supportedImageCodecs().isEmpty());
}
-//MaemoAPI-1836:test supportedResolutions
-void tst_QCameraImageCapture::supportedResolutions()
-{
- QCamera camera;
- QCameraImageCapture imageCapture(&camera);
- QVERIFY(imageCapture.isAvailable() == true);
- QVERIFY(imageCapture.supportedResolutions().count() == 2);
- QImageEncoderSettings settings1;
- settings1.setCodec("PNG");;
- settings1.setResolution(320, 240);
- int result = imageCapture.supportedResolutions(settings1).count();
- QVERIFY(result == 1);
-}
-
//MaemoAPI-1837:test imageCodecDescription
void tst_QCameraImageCapture::imageCodecDescription()
{
diff --git a/tests/auto/unit/multimedia/qvideoencodersettingscontrol/tst_qvideoencodersettingscontrol.cpp b/tests/auto/unit/multimedia/qvideoencodersettingscontrol/tst_qvideoencodersettingscontrol.cpp
index 03fd1d990..cae624135 100644
--- a/tests/auto/unit/multimedia/qvideoencodersettingscontrol/tst_qvideoencodersettingscontrol.cpp
+++ b/tests/auto/unit/multimedia/qvideoencodersettingscontrol/tst_qvideoencodersettingscontrol.cpp
@@ -45,23 +45,6 @@ public:
}
- QList<QSize> supportedResolutions(const QVideoEncoderSettings &settings,bool *continuous = nullptr) const override
- {
- Q_UNUSED(settings);
- Q_UNUSED(continuous);
-
- return (QList<QSize>());
- }
-
- QList<qreal> supportedFrameRates(const QVideoEncoderSettings &settings, bool *continuous = nullptr) const override
- {
- Q_UNUSED(settings);
- Q_UNUSED(continuous);
-
- return (QList<qreal>());
-
- }
-
[[nodiscard]] QStringList supportedVideoCodecs() const override
{
return QStringList();