diff options
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(); |