diff options
Diffstat (limited to 'src/plugins')
150 files changed, 2785 insertions, 882 deletions
diff --git a/src/plugins/alsa/qalsaaudiooutput.cpp b/src/plugins/alsa/qalsaaudiooutput.cpp index cd97ae85b..ddbe04de9 100644 --- a/src/plugins/alsa/qalsaaudiooutput.cpp +++ b/src/plugins/alsa/qalsaaudiooutput.cpp @@ -316,9 +316,6 @@ bool QAlsaAudioOutput::open() return false; } - if (!QAlsaAudioDeviceInfo::availableDevices(QAudio::AudioOutput).contains(m_device)) - return false; - QString dev; #if SND_LIB_VERSION < 0x1000e // 1.0.14 if (m_device != "default") diff --git a/src/plugins/alsa/qalsaplugin.h b/src/plugins/alsa/qalsaplugin.h index b3c530f88..cebede13b 100644 --- a/src/plugins/alsa/qalsaplugin.h +++ b/src/plugins/alsa/qalsaplugin.h @@ -56,11 +56,11 @@ public: QAlsaPlugin(QObject *parent = 0); ~QAlsaPlugin() {} - QByteArray defaultDevice(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QList<QByteArray> availableDevices(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QAbstractAudioInput *createInput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioOutput *createOutput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) Q_DECL_OVERRIDE; + QByteArray defaultDevice(QAudio::Mode mode) const override; + QList<QByteArray> availableDevices(QAudio::Mode mode) const override; + QAbstractAudioInput *createInput(const QByteArray &device) override; + QAbstractAudioOutput *createOutput(const QByteArray &device) override; + QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) override; }; QT_END_NAMESPACE diff --git a/src/plugins/android/jar/bundledjar.pro b/src/plugins/android/jar/bundledjar.pro deleted file mode 100644 index cc76164a7..000000000 --- a/src/plugins/android/jar/bundledjar.pro +++ /dev/null @@ -1,3 +0,0 @@ -TARGET = QtMultimedia-bundled -CONFIG += bundled_jar_file -include(jar.pri) diff --git a/src/plugins/android/jar/distributedjar.pro b/src/plugins/android/jar/distributedjar.pro deleted file mode 100644 index 34724c197..000000000 --- a/src/plugins/android/jar/distributedjar.pro +++ /dev/null @@ -1,2 +0,0 @@ -TARGET = QtMultimedia -include(jar.pri) diff --git a/src/plugins/android/jar/jar.pri b/src/plugins/android/jar/jar.pri deleted file mode 100644 index 5408fb109..000000000 --- a/src/plugins/android/jar/jar.pri +++ /dev/null @@ -1,19 +0,0 @@ -load(qt_build_paths) -CONFIG += java -DESTDIR = $$MODULE_BASE_OUTDIR/jar - -JAVACLASSPATH += $$PWD/src - -JAVASOURCES += $$PWD/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java \ - $$PWD/src/org/qtproject/qt5/android/multimedia/QtCameraListener.java \ - $$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureListener.java \ - $$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureHolder.java \ - $$PWD/src/org/qtproject/qt5/android/multimedia/QtMultimediaUtils.java \ - $$PWD/src/org/qtproject/qt5/android/multimedia/QtMediaRecorderListener.java \ - $$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceHolderCallback.java - -# install -target.path = $$[QT_INSTALL_PREFIX]/jar -INSTALLS += target - -OTHER_FILES += $$JAVASOURCES diff --git a/src/plugins/android/jar/jar.pro b/src/plugins/android/jar/jar.pro index 6a4fcd389..96e492f63 100644 --- a/src/plugins/android/jar/jar.pro +++ b/src/plugins/android/jar/jar.pro @@ -1,3 +1,21 @@ -TEMPLATE=subdirs -SUBDIRS += distributedjar.pro bundledjar.pro +TARGET = QtMultimedia +load(qt_build_paths) +CONFIG += java +DESTDIR = $$MODULE_BASE_OUTDIR/jar + +JAVACLASSPATH += $$PWD/src + +JAVASOURCES += $$PWD/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java \ + $$PWD/src/org/qtproject/qt5/android/multimedia/QtCameraListener.java \ + $$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureListener.java \ + $$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureHolder.java \ + $$PWD/src/org/qtproject/qt5/android/multimedia/QtMultimediaUtils.java \ + $$PWD/src/org/qtproject/qt5/android/multimedia/QtMediaRecorderListener.java \ + $$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceHolderCallback.java + +# install +target.path = $$[QT_INSTALL_PREFIX]/jar +INSTALLS += target + +OTHER_FILES += $$JAVASOURCES diff --git a/src/plugins/android/src/common/qandroidvideooutput.h b/src/plugins/android/src/common/qandroidvideooutput.h index 936e4c40b..62a936881 100644 --- a/src/plugins/android/src/common/qandroidvideooutput.h +++ b/src/plugins/android/src/common/qandroidvideooutput.h @@ -93,19 +93,19 @@ class QAndroidTextureVideoOutput : public QAndroidVideoOutput Q_OBJECT public: explicit QAndroidTextureVideoOutput(QObject *parent = 0); - ~QAndroidTextureVideoOutput() Q_DECL_OVERRIDE; + ~QAndroidTextureVideoOutput() override; QAbstractVideoSurface *surface() const; void setSurface(QAbstractVideoSurface *surface); - AndroidSurfaceTexture *surfaceTexture() Q_DECL_OVERRIDE; + AndroidSurfaceTexture *surfaceTexture() override; - bool isReady() Q_DECL_OVERRIDE; - void setVideoSize(const QSize &) Q_DECL_OVERRIDE; - void stop() Q_DECL_OVERRIDE; - void reset() Q_DECL_OVERRIDE; + bool isReady() override; + void setVideoSize(const QSize &) override; + void stop() override; + void reset() override; - void customEvent(QEvent *) Q_DECL_OVERRIDE; + void customEvent(QEvent *) override; private Q_SLOTS: void onFrameAvailable(); diff --git a/src/plugins/android/src/mediacapture/qandroidaudioencodersettingscontrol.h b/src/plugins/android/src/mediacapture/qandroidaudioencodersettingscontrol.h index b94964be0..e68bf6ef7 100644 --- a/src/plugins/android/src/mediacapture/qandroidaudioencodersettingscontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidaudioencodersettingscontrol.h @@ -52,11 +52,11 @@ class QAndroidAudioEncoderSettingsControl : public QAudioEncoderSettingsControl public: explicit QAndroidAudioEncoderSettingsControl(QAndroidCaptureSession *session); - QStringList supportedAudioCodecs() const Q_DECL_OVERRIDE; - QString codecDescription(const QString &codecName) const Q_DECL_OVERRIDE; - QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QAudioEncoderSettings audioSettings() const Q_DECL_OVERRIDE; - void setAudioSettings(const QAudioEncoderSettings &settings) Q_DECL_OVERRIDE; + QStringList supportedAudioCodecs() const override; + QString codecDescription(const QString &codecName) const override; + QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = 0) const override; + QAudioEncoderSettings audioSettings() const override; + void setAudioSettings(const QAudioEncoderSettings &settings) override; private: QAndroidCaptureSession *m_session; diff --git a/src/plugins/android/src/mediacapture/qandroidcameracapturebufferformatcontrol.h b/src/plugins/android/src/mediacapture/qandroidcameracapturebufferformatcontrol.h index 3572b126d..b27727543 100644 --- a/src/plugins/android/src/mediacapture/qandroidcameracapturebufferformatcontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcameracapturebufferformatcontrol.h @@ -50,9 +50,9 @@ class QAndroidCameraCaptureBufferFormatControl : public QCameraCaptureBufferForm public: QAndroidCameraCaptureBufferFormatControl(); - QList<QVideoFrame::PixelFormat> supportedBufferFormats() const Q_DECL_OVERRIDE; - QVideoFrame::PixelFormat bufferFormat() const Q_DECL_OVERRIDE; - void setBufferFormat(QVideoFrame::PixelFormat format) Q_DECL_OVERRIDE; + QList<QVideoFrame::PixelFormat> supportedBufferFormats() const override; + QVideoFrame::PixelFormat bufferFormat() const override; + void setBufferFormat(QVideoFrame::PixelFormat format) override; }; QT_END_NAMESPACE diff --git a/src/plugins/android/src/mediacapture/qandroidcameracapturedestinationcontrol.h b/src/plugins/android/src/mediacapture/qandroidcameracapturedestinationcontrol.h index 656aa2ced..1edfdab12 100644 --- a/src/plugins/android/src/mediacapture/qandroidcameracapturedestinationcontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcameracapturedestinationcontrol.h @@ -52,9 +52,9 @@ class QAndroidCameraCaptureDestinationControl : public QCameraCaptureDestination public: explicit QAndroidCameraCaptureDestinationControl(QAndroidCameraSession *session); - bool isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const Q_DECL_OVERRIDE; - QCameraImageCapture::CaptureDestinations captureDestination() const Q_DECL_OVERRIDE; - void setCaptureDestination(QCameraImageCapture::CaptureDestinations destination) Q_DECL_OVERRIDE; + bool isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const override; + QCameraImageCapture::CaptureDestinations captureDestination() const override; + void setCaptureDestination(QCameraImageCapture::CaptureDestinations destination) override; private: QAndroidCameraSession *m_session; diff --git a/src/plugins/android/src/mediacapture/qandroidcameraexposurecontrol.h b/src/plugins/android/src/mediacapture/qandroidcameraexposurecontrol.h index e6b7fda8b..e87e6cd3a 100644 --- a/src/plugins/android/src/mediacapture/qandroidcameraexposurecontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcameraexposurecontrol.h @@ -52,12 +52,12 @@ class QAndroidCameraExposureControl : public QCameraExposureControl public: explicit QAndroidCameraExposureControl(QAndroidCameraSession *session); - bool isParameterSupported(ExposureParameter parameter) const Q_DECL_OVERRIDE; - QVariantList supportedParameterRange(ExposureParameter parameter, bool *continuous) const Q_DECL_OVERRIDE; + bool isParameterSupported(ExposureParameter parameter) const override; + QVariantList supportedParameterRange(ExposureParameter parameter, bool *continuous) const override; - QVariant requestedValue(ExposureParameter parameter) const Q_DECL_OVERRIDE; - QVariant actualValue(ExposureParameter parameter) const Q_DECL_OVERRIDE; - bool setValue(ExposureParameter parameter, const QVariant& value) Q_DECL_OVERRIDE; + QVariant requestedValue(ExposureParameter parameter) const override; + QVariant actualValue(ExposureParameter parameter) const override; + bool setValue(ExposureParameter parameter, const QVariant& value) override; private Q_SLOTS: void onCameraOpened(); diff --git a/src/plugins/android/src/mediacapture/qandroidcameraflashcontrol.h b/src/plugins/android/src/mediacapture/qandroidcameraflashcontrol.h index 7a0015eaf..071c45c72 100644 --- a/src/plugins/android/src/mediacapture/qandroidcameraflashcontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcameraflashcontrol.h @@ -52,10 +52,10 @@ class QAndroidCameraFlashControl : public QCameraFlashControl public: explicit QAndroidCameraFlashControl(QAndroidCameraSession *session); - QCameraExposure::FlashModes flashMode() const Q_DECL_OVERRIDE; - void setFlashMode(QCameraExposure::FlashModes mode) Q_DECL_OVERRIDE; - bool isFlashModeSupported(QCameraExposure::FlashModes mode) const Q_DECL_OVERRIDE; - bool isFlashReady() const Q_DECL_OVERRIDE; + QCameraExposure::FlashModes flashMode() const override; + void setFlashMode(QCameraExposure::FlashModes mode) override; + bool isFlashModeSupported(QCameraExposure::FlashModes mode) const override; + bool isFlashReady() const override; private Q_SLOTS: void onCameraOpened(); diff --git a/src/plugins/android/src/mediacapture/qandroidcamerafocuscontrol.h b/src/plugins/android/src/mediacapture/qandroidcamerafocuscontrol.h index a3ba089da..9c606cf7d 100644 --- a/src/plugins/android/src/mediacapture/qandroidcamerafocuscontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcamerafocuscontrol.h @@ -52,15 +52,15 @@ class QAndroidCameraFocusControl : public QCameraFocusControl public: explicit QAndroidCameraFocusControl(QAndroidCameraSession *session); - QCameraFocus::FocusModes focusMode() const Q_DECL_OVERRIDE; - void setFocusMode(QCameraFocus::FocusModes mode) Q_DECL_OVERRIDE; - bool isFocusModeSupported(QCameraFocus::FocusModes mode) const Q_DECL_OVERRIDE; - QCameraFocus::FocusPointMode focusPointMode() const Q_DECL_OVERRIDE; - void setFocusPointMode(QCameraFocus::FocusPointMode mode) Q_DECL_OVERRIDE; - bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const Q_DECL_OVERRIDE; - QPointF customFocusPoint() const Q_DECL_OVERRIDE; - void setCustomFocusPoint(const QPointF &point) Q_DECL_OVERRIDE; - QCameraFocusZoneList focusZones() const Q_DECL_OVERRIDE; + QCameraFocus::FocusModes focusMode() const override; + void setFocusMode(QCameraFocus::FocusModes mode) override; + bool isFocusModeSupported(QCameraFocus::FocusModes mode) const override; + QCameraFocus::FocusPointMode focusPointMode() const override; + void setFocusPointMode(QCameraFocus::FocusPointMode mode) override; + bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const override; + QPointF customFocusPoint() const override; + void setCustomFocusPoint(const QPointF &point) override; + QCameraFocusZoneList focusZones() const override; private Q_SLOTS: void onCameraOpened(); diff --git a/src/plugins/android/src/mediacapture/qandroidcameraimagecapturecontrol.h b/src/plugins/android/src/mediacapture/qandroidcameraimagecapturecontrol.h index 720eed748..cfe748c39 100644 --- a/src/plugins/android/src/mediacapture/qandroidcameraimagecapturecontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcameraimagecapturecontrol.h @@ -52,13 +52,13 @@ class QAndroidCameraImageCaptureControl : public QCameraImageCaptureControl public: explicit QAndroidCameraImageCaptureControl(QAndroidCameraSession *session); - bool isReadyForCapture() const Q_DECL_OVERRIDE; + bool isReadyForCapture() const override; - QCameraImageCapture::DriveMode driveMode() const Q_DECL_OVERRIDE; - void setDriveMode(QCameraImageCapture::DriveMode mode) Q_DECL_OVERRIDE; + QCameraImageCapture::DriveMode driveMode() const override; + void setDriveMode(QCameraImageCapture::DriveMode mode) override; - int capture(const QString &fileName) Q_DECL_OVERRIDE; - void cancelCapture() Q_DECL_OVERRIDE; + int capture(const QString &fileName) override; + void cancelCapture() override; private: QAndroidCameraSession *m_session; diff --git a/src/plugins/android/src/mediacapture/qandroidcameraimageprocessingcontrol.h b/src/plugins/android/src/mediacapture/qandroidcameraimageprocessingcontrol.h index 8a750864a..9845c80dc 100644 --- a/src/plugins/android/src/mediacapture/qandroidcameraimageprocessingcontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcameraimageprocessingcontrol.h @@ -52,10 +52,10 @@ class QAndroidCameraImageProcessingControl : public QCameraImageProcessingContro public: explicit QAndroidCameraImageProcessingControl(QAndroidCameraSession *session); - bool isParameterSupported(ProcessingParameter) const Q_DECL_OVERRIDE; - bool isParameterValueSupported(ProcessingParameter parameter, const QVariant &value) const Q_DECL_OVERRIDE; - QVariant parameter(ProcessingParameter parameter) const Q_DECL_OVERRIDE; - void setParameter(ProcessingParameter parameter, const QVariant &value) Q_DECL_OVERRIDE; + bool isParameterSupported(ProcessingParameter) const override; + bool isParameterValueSupported(ProcessingParameter parameter, const QVariant &value) const override; + QVariant parameter(ProcessingParameter parameter) const override; + void setParameter(ProcessingParameter parameter, const QVariant &value) override; private Q_SLOTS: void onCameraOpened(); diff --git a/src/plugins/android/src/mediacapture/qandroidcameralockscontrol.h b/src/plugins/android/src/mediacapture/qandroidcameralockscontrol.h index e0a224b6e..149da0f32 100644 --- a/src/plugins/android/src/mediacapture/qandroidcameralockscontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcameralockscontrol.h @@ -53,10 +53,10 @@ class QAndroidCameraLocksControl : public QCameraLocksControl public: explicit QAndroidCameraLocksControl(QAndroidCameraSession *session); - QCamera::LockTypes supportedLocks() const Q_DECL_OVERRIDE; - QCamera::LockStatus lockStatus(QCamera::LockType lock) const Q_DECL_OVERRIDE; - void searchAndLock(QCamera::LockTypes locks) Q_DECL_OVERRIDE; - void unlock(QCamera::LockTypes locks) Q_DECL_OVERRIDE; + QCamera::LockTypes supportedLocks() const override; + QCamera::LockStatus lockStatus(QCamera::LockType lock) const override; + void searchAndLock(QCamera::LockTypes locks) override; + void unlock(QCamera::LockTypes locks) override; private Q_SLOTS: void onCameraOpened(); diff --git a/src/plugins/android/src/mediacapture/qandroidcameravideorenderercontrol.cpp b/src/plugins/android/src/mediacapture/qandroidcameravideorenderercontrol.cpp index 64b9e7e32..2243df732 100644 --- a/src/plugins/android/src/mediacapture/qandroidcameravideorenderercontrol.cpp +++ b/src/plugins/android/src/mediacapture/qandroidcameravideorenderercontrol.cpp @@ -56,13 +56,13 @@ class QAndroidCameraDataVideoOutput : public QAndroidVideoOutput Q_OBJECT public: explicit QAndroidCameraDataVideoOutput(QAndroidCameraVideoRendererControl *control); - ~QAndroidCameraDataVideoOutput() Q_DECL_OVERRIDE; + ~QAndroidCameraDataVideoOutput() override; - AndroidSurfaceHolder *surfaceHolder() Q_DECL_OVERRIDE; + AndroidSurfaceHolder *surfaceHolder() override; - bool isReady() Q_DECL_OVERRIDE; + bool isReady() override; - void stop() Q_DECL_OVERRIDE; + void stop() override; private Q_SLOTS: void onSurfaceCreated(); @@ -108,7 +108,7 @@ QAndroidCameraDataVideoOutput::QAndroidCameraDataVideoOutput(QAndroidCameraVideo QAndroidCameraDataVideoOutput::~QAndroidCameraDataVideoOutput() { - m_control->cameraSession()->setPreviewCallback(Q_NULLPTR); + m_control->cameraSession()->setPreviewCallback(nullptr); delete m_surfaceView; } @@ -146,7 +146,7 @@ void QAndroidCameraDataVideoOutput::configureFormat() } if (m_pixelFormat == QVideoFrame::Format_Invalid) { - m_control->cameraSession()->setPreviewCallback(Q_NULLPTR); + m_control->cameraSession()->setPreviewCallback(nullptr); qWarning("The video surface is not compatible with any format supported by the camera"); } else { m_control->cameraSession()->setPreviewCallback(this); diff --git a/src/plugins/android/src/mediacapture/qandroidcameravideorenderercontrol.h b/src/plugins/android/src/mediacapture/qandroidcameravideorenderercontrol.h index a5c3c0d34..538226239 100644 --- a/src/plugins/android/src/mediacapture/qandroidcameravideorenderercontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcameravideorenderercontrol.h @@ -53,10 +53,10 @@ class QAndroidCameraVideoRendererControl : public QVideoRendererControl Q_OBJECT public: QAndroidCameraVideoRendererControl(QAndroidCameraSession *session, QObject *parent = 0); - ~QAndroidCameraVideoRendererControl() Q_DECL_OVERRIDE; + ~QAndroidCameraVideoRendererControl() override; - QAbstractVideoSurface *surface() const Q_DECL_OVERRIDE; - void setSurface(QAbstractVideoSurface *surface) Q_DECL_OVERRIDE; + QAbstractVideoSurface *surface() const override; + void setSurface(QAbstractVideoSurface *surface) override; QAndroidCameraSession *cameraSession() const { return m_cameraSession; } diff --git a/src/plugins/android/src/mediacapture/qandroidcamerazoomcontrol.h b/src/plugins/android/src/mediacapture/qandroidcamerazoomcontrol.h index 770ad659a..96fc4f77b 100644 --- a/src/plugins/android/src/mediacapture/qandroidcamerazoomcontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcamerazoomcontrol.h @@ -53,13 +53,13 @@ class QAndroidCameraZoomControl : public QCameraZoomControl public: explicit QAndroidCameraZoomControl(QAndroidCameraSession *session); - qreal maximumOpticalZoom() const Q_DECL_OVERRIDE; - qreal maximumDigitalZoom() const Q_DECL_OVERRIDE; - qreal requestedOpticalZoom() const Q_DECL_OVERRIDE; - qreal requestedDigitalZoom() const Q_DECL_OVERRIDE; - qreal currentOpticalZoom() const Q_DECL_OVERRIDE; - qreal currentDigitalZoom() const Q_DECL_OVERRIDE; - void zoomTo(qreal optical, qreal digital) Q_DECL_OVERRIDE; + qreal maximumOpticalZoom() const override; + qreal maximumDigitalZoom() const override; + qreal requestedOpticalZoom() const override; + qreal requestedDigitalZoom() const override; + qreal currentOpticalZoom() const override; + qreal currentDigitalZoom() const override; + void zoomTo(qreal optical, qreal digital) override; private Q_SLOTS: void onCameraOpened(); diff --git a/src/plugins/android/src/mediacapture/qandroidimageencodercontrol.h b/src/plugins/android/src/mediacapture/qandroidimageencodercontrol.h index 36e10024e..52f602e78 100644 --- a/src/plugins/android/src/mediacapture/qandroidimageencodercontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidimageencodercontrol.h @@ -52,11 +52,11 @@ class QAndroidImageEncoderControl : public QImageEncoderControl public: explicit QAndroidImageEncoderControl(QAndroidCameraSession *session); - QStringList supportedImageCodecs() const Q_DECL_OVERRIDE; - QString imageCodecDescription(const QString &codecName) const Q_DECL_OVERRIDE; - QList<QSize> supportedResolutions(const QImageEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QImageEncoderSettings imageSettings() const Q_DECL_OVERRIDE; - void setImageSettings(const QImageEncoderSettings &settings) Q_DECL_OVERRIDE; + 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(); diff --git a/src/plugins/android/src/mediacapture/qandroidmediacontainercontrol.h b/src/plugins/android/src/mediacapture/qandroidmediacontainercontrol.h index 35c715072..1d90fb6cd 100644 --- a/src/plugins/android/src/mediacapture/qandroidmediacontainercontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidmediacontainercontrol.h @@ -52,10 +52,10 @@ class QAndroidMediaContainerControl : public QMediaContainerControl public: QAndroidMediaContainerControl(QAndroidCaptureSession *session); - QStringList supportedContainers() const Q_DECL_OVERRIDE; - QString containerFormat() const Q_DECL_OVERRIDE; - void setContainerFormat(const QString &format) Q_DECL_OVERRIDE; - QString containerDescription(const QString &formatMimeType) const Q_DECL_OVERRIDE; + QStringList supportedContainers() const override; + QString containerFormat() const override; + void setContainerFormat(const QString &format) override; + QString containerDescription(const QString &formatMimeType) const override; private: QAndroidCaptureSession *m_session; diff --git a/src/plugins/android/src/mediacapture/qandroidmediarecordercontrol.h b/src/plugins/android/src/mediacapture/qandroidmediarecordercontrol.h index 187a0f944..6da59a50d 100644 --- a/src/plugins/android/src/mediacapture/qandroidmediarecordercontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidmediarecordercontrol.h @@ -52,19 +52,19 @@ class QAndroidMediaRecorderControl : public QMediaRecorderControl public: explicit QAndroidMediaRecorderControl(QAndroidCaptureSession *session); - QUrl outputLocation() const Q_DECL_OVERRIDE; - bool setOutputLocation(const QUrl &location) Q_DECL_OVERRIDE; - QMediaRecorder::State state() const Q_DECL_OVERRIDE; - QMediaRecorder::Status status() const Q_DECL_OVERRIDE; - qint64 duration() const Q_DECL_OVERRIDE; - bool isMuted() const Q_DECL_OVERRIDE; - qreal volume() const Q_DECL_OVERRIDE; - void applySettings() Q_DECL_OVERRIDE; + QUrl outputLocation() const override; + bool setOutputLocation(const QUrl &location) override; + QMediaRecorder::State state() const override; + QMediaRecorder::Status status() const override; + qint64 duration() const override; + bool isMuted() const override; + qreal volume() const override; + void applySettings() override; public Q_SLOTS: - void setState(QMediaRecorder::State state) Q_DECL_OVERRIDE; - void setMuted(bool muted) Q_DECL_OVERRIDE; - void setVolume(qreal volume) Q_DECL_OVERRIDE; + void setState(QMediaRecorder::State state) override; + void setMuted(bool muted) override; + void setVolume(qreal volume) override; private: QAndroidCaptureSession *m_session; diff --git a/src/plugins/android/src/mediacapture/qandroidvideoencodersettingscontrol.h b/src/plugins/android/src/mediacapture/qandroidvideoencodersettingscontrol.h index 91f84500e..146b44ac4 100644 --- a/src/plugins/android/src/mediacapture/qandroidvideoencodersettingscontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidvideoencodersettingscontrol.h @@ -52,12 +52,12 @@ class QAndroidVideoEncoderSettingsControl : public QVideoEncoderSettingsControl public: explicit QAndroidVideoEncoderSettingsControl(QAndroidCaptureSession *session); - QList<QSize> supportedResolutions(const QVideoEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QList<qreal> supportedFrameRates(const QVideoEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QStringList supportedVideoCodecs() const Q_DECL_OVERRIDE; - QString videoCodecDescription(const QString &codecName) const Q_DECL_OVERRIDE; - QVideoEncoderSettings videoSettings() const Q_DECL_OVERRIDE; - void setVideoSettings(const QVideoEncoderSettings &settings) Q_DECL_OVERRIDE; + 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; + void setVideoSettings(const QVideoEncoderSettings &settings) override; private: QAndroidCaptureSession *m_session; diff --git a/src/plugins/android/src/mediacapture/qandroidviewfindersettingscontrol.h b/src/plugins/android/src/mediacapture/qandroidviewfindersettingscontrol.h index 79ebf3fc2..c7863a144 100644 --- a/src/plugins/android/src/mediacapture/qandroidviewfindersettingscontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidviewfindersettingscontrol.h @@ -58,9 +58,9 @@ class QAndroidViewfinderSettingsControl2 : public QCameraViewfinderSettingsContr public: explicit QAndroidViewfinderSettingsControl2(QAndroidCameraSession *session); - QList<QCameraViewfinderSettings> supportedViewfinderSettings() const Q_DECL_OVERRIDE; - QCameraViewfinderSettings viewfinderSettings() const Q_DECL_OVERRIDE; - void setViewfinderSettings(const QCameraViewfinderSettings &settings) Q_DECL_OVERRIDE; + QList<QCameraViewfinderSettings> supportedViewfinderSettings() const override; + QCameraViewfinderSettings viewfinderSettings() const override; + void setViewfinderSettings(const QCameraViewfinderSettings &settings) override; private: QAndroidCameraSession *m_cameraSession; diff --git a/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.h b/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.h index d6ec63af8..04f728a59 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.h +++ b/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.h @@ -54,24 +54,24 @@ class QAndroidMediaPlayerControl : public QMediaPlayerControl Q_OBJECT public: explicit QAndroidMediaPlayerControl(QObject *parent = 0); - ~QAndroidMediaPlayerControl() Q_DECL_OVERRIDE; + ~QAndroidMediaPlayerControl() override; - QMediaPlayer::State state() const Q_DECL_OVERRIDE; - QMediaPlayer::MediaStatus mediaStatus() const Q_DECL_OVERRIDE; - qint64 duration() const Q_DECL_OVERRIDE; - qint64 position() const Q_DECL_OVERRIDE; - int volume() const Q_DECL_OVERRIDE; - bool isMuted() const Q_DECL_OVERRIDE; - int bufferStatus() const Q_DECL_OVERRIDE; - bool isAudioAvailable() const Q_DECL_OVERRIDE; - bool isVideoAvailable() const Q_DECL_OVERRIDE; - bool isSeekable() const Q_DECL_OVERRIDE; - QMediaTimeRange availablePlaybackRanges() const Q_DECL_OVERRIDE; - qreal playbackRate() const Q_DECL_OVERRIDE; - void setPlaybackRate(qreal rate) Q_DECL_OVERRIDE; - QMediaContent media() const Q_DECL_OVERRIDE; - const QIODevice *mediaStream() const Q_DECL_OVERRIDE; - void setMedia(const QMediaContent &mediaContent, QIODevice *stream) Q_DECL_OVERRIDE; + QMediaPlayer::State state() const override; + QMediaPlayer::MediaStatus mediaStatus() const override; + qint64 duration() const override; + qint64 position() const override; + int volume() const override; + bool isMuted() const override; + int bufferStatus() const override; + bool isAudioAvailable() const override; + bool isVideoAvailable() const override; + bool isSeekable() const override; + QMediaTimeRange availablePlaybackRanges() const override; + qreal playbackRate() const override; + void setPlaybackRate(qreal rate) override; + QMediaContent media() const override; + const QIODevice *mediaStream() const override; + void setMedia(const QMediaContent &mediaContent, QIODevice *stream) override; void setVideoOutput(QAndroidVideoOutput *videoOutput); @@ -79,12 +79,12 @@ Q_SIGNALS: void metaDataUpdated(); public Q_SLOTS: - void setPosition(qint64 position) Q_DECL_OVERRIDE; - void play() Q_DECL_OVERRIDE; - void pause() Q_DECL_OVERRIDE; - void stop() Q_DECL_OVERRIDE; - void setVolume(int volume) Q_DECL_OVERRIDE; - void setMuted(bool muted) Q_DECL_OVERRIDE; + void setPosition(qint64 position) override; + void play() override; + void pause() override; + void stop() override; + void setVolume(int volume) override; + void setMuted(bool muted) override; private Q_SLOTS: void onVideoOutputReady(bool ready); diff --git a/src/plugins/android/src/mediaplayer/qandroidmediaplayervideorenderercontrol.h b/src/plugins/android/src/mediaplayer/qandroidmediaplayervideorenderercontrol.h index 2f01d986f..ef213cc57 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmediaplayervideorenderercontrol.h +++ b/src/plugins/android/src/mediaplayer/qandroidmediaplayervideorenderercontrol.h @@ -52,10 +52,10 @@ class QAndroidMediaPlayerVideoRendererControl : public QVideoRendererControl Q_OBJECT public: QAndroidMediaPlayerVideoRendererControl(QAndroidMediaPlayerControl *mediaPlayer, QObject *parent = 0); - ~QAndroidMediaPlayerVideoRendererControl() Q_DECL_OVERRIDE; + ~QAndroidMediaPlayerVideoRendererControl() override; - QAbstractVideoSurface *surface() const Q_DECL_OVERRIDE; - void setSurface(QAbstractVideoSurface *surface) Q_DECL_OVERRIDE; + QAbstractVideoSurface *surface() const override; + void setSurface(QAbstractVideoSurface *surface) override; private: QAndroidMediaPlayerControl *m_mediaPlayerControl; diff --git a/src/plugins/android/src/mediaplayer/qandroidmediaservice.h b/src/plugins/android/src/mediaplayer/qandroidmediaservice.h index f81078d0f..f78d05ddd 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmediaservice.h +++ b/src/plugins/android/src/mediaplayer/qandroidmediaservice.h @@ -53,10 +53,10 @@ class QAndroidMediaService : public QMediaService Q_OBJECT public: explicit QAndroidMediaService(QObject *parent = 0); - ~QAndroidMediaService() Q_DECL_OVERRIDE; + ~QAndroidMediaService() override; - QMediaControl* requestControl(const char *name) Q_DECL_OVERRIDE; - void releaseControl(QMediaControl *control) Q_DECL_OVERRIDE; + QMediaControl* requestControl(const char *name) override; + void releaseControl(QMediaControl *control) override; private: QAndroidMediaPlayerControl *mMediaControl; diff --git a/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.h b/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.h index 4354eb54e..f2b1b47f1 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.h +++ b/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.h @@ -53,12 +53,12 @@ class QAndroidMetaDataReaderControl : public QMetaDataReaderControl Q_OBJECT public: explicit QAndroidMetaDataReaderControl(QObject *parent = 0); - ~QAndroidMetaDataReaderControl() Q_DECL_OVERRIDE; + ~QAndroidMetaDataReaderControl() override; - bool isMetaDataAvailable() const Q_DECL_OVERRIDE; + bool isMetaDataAvailable() const override; - QVariant metaData(const QString &key) const Q_DECL_OVERRIDE; - QStringList availableMetaData() const Q_DECL_OVERRIDE; + QVariant metaData(const QString &key) const override; + QStringList availableMetaData() const override; public Q_SLOTS: void onMediaChanged(const QMediaContent &media); diff --git a/src/plugins/android/src/qandroidmediaserviceplugin.h b/src/plugins/android/src/qandroidmediaserviceplugin.h index 2ac6f2f14..3ae1a36b6 100644 --- a/src/plugins/android/src/qandroidmediaserviceplugin.h +++ b/src/plugins/android/src/qandroidmediaserviceplugin.h @@ -63,17 +63,17 @@ public: QAndroidMediaServicePlugin(); ~QAndroidMediaServicePlugin(); - QMediaService* create(QString const& key) Q_DECL_OVERRIDE; - void release(QMediaService *service) Q_DECL_OVERRIDE; + QMediaService* create(QString const& key) override; + void release(QMediaService *service) override; - QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const Q_DECL_OVERRIDE; + QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const override; - QByteArray defaultDevice(const QByteArray &service) const Q_DECL_OVERRIDE; - QList<QByteArray> devices(const QByteArray &service) const Q_DECL_OVERRIDE; - QString deviceDescription(const QByteArray &service, const QByteArray &device) Q_DECL_OVERRIDE; + QByteArray defaultDevice(const QByteArray &service) const override; + QList<QByteArray> devices(const QByteArray &service) const override; + QString deviceDescription(const QByteArray &service, const QByteArray &device) override; - QCamera::Position cameraPosition(const QByteArray &device) const Q_DECL_OVERRIDE; - int cameraOrientation(const QByteArray &device) const Q_DECL_OVERRIDE; + QCamera::Position cameraPosition(const QByteArray &device) const override; + int cameraOrientation(const QByteArray &device) const override; }; QT_END_NAMESPACE diff --git a/src/plugins/avfoundation/camera/avfaudioencodersettingscontrol.h b/src/plugins/avfoundation/camera/avfaudioencodersettingscontrol.h index 3d81d6294..4ba987e53 100644 --- a/src/plugins/avfoundation/camera/avfaudioencodersettingscontrol.h +++ b/src/plugins/avfoundation/camera/avfaudioencodersettingscontrol.h @@ -54,11 +54,11 @@ class AVFAudioEncoderSettingsControl : public QAudioEncoderSettingsControl public: explicit AVFAudioEncoderSettingsControl(AVFCameraService *service); - QStringList supportedAudioCodecs() const Q_DECL_OVERRIDE; - QString codecDescription(const QString &codecName) const Q_DECL_OVERRIDE; - QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QAudioEncoderSettings audioSettings() const Q_DECL_OVERRIDE; - void setAudioSettings(const QAudioEncoderSettings &settings) Q_DECL_OVERRIDE; + QStringList supportedAudioCodecs() const override; + QString codecDescription(const QString &codecName) const override; + QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = 0) const override; + QAudioEncoderSettings audioSettings() const override; + void setAudioSettings(const QAudioEncoderSettings &settings) override; NSDictionary *applySettings(); void unapplySettings(); diff --git a/src/plugins/avfoundation/camera/avfcameraexposurecontrol.h b/src/plugins/avfoundation/camera/avfcameraexposurecontrol.h index 30f90208c..0e2846889 100644 --- a/src/plugins/avfoundation/camera/avfcameraexposurecontrol.h +++ b/src/plugins/avfoundation/camera/avfcameraexposurecontrol.h @@ -57,13 +57,13 @@ class AVFCameraExposureControl : public QCameraExposureControl public: AVFCameraExposureControl(AVFCameraService *service); - bool isParameterSupported(ExposureParameter parameter) const Q_DECL_OVERRIDE; + bool isParameterSupported(ExposureParameter parameter) const override; QVariantList supportedParameterRange(ExposureParameter parameter, - bool *continuous) const Q_DECL_OVERRIDE; + bool *continuous) const override; - QVariant requestedValue(ExposureParameter parameter) const Q_DECL_OVERRIDE; - QVariant actualValue(ExposureParameter parameter) const Q_DECL_OVERRIDE; - bool setValue(ExposureParameter parameter, const QVariant &value) Q_DECL_OVERRIDE; + QVariant requestedValue(ExposureParameter parameter) const override; + QVariant actualValue(ExposureParameter parameter) const override; + bool setValue(ExposureParameter parameter, const QVariant &value) override; private Q_SLOTS: void cameraStateChanged(); diff --git a/src/plugins/avfoundation/camera/avfcameraexposurecontrol.mm b/src/plugins/avfoundation/camera/avfcameraexposurecontrol.mm index 591854204..7540ab86c 100644 --- a/src/plugins/avfoundation/camera/avfcameraexposurecontrol.mm +++ b/src/plugins/avfoundation/camera/avfcameraexposurecontrol.mm @@ -56,10 +56,9 @@ QT_BEGIN_NAMESPACE namespace { -// All these methods to work with exposure/ISO/SS in custom mode -// are quite new (iOS 8 or later and no OS X support). +// All these methods to work with exposure/ISO/SS in custom mode do not support macOS. -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#ifdef Q_OS_IOS // Misc. helpers to check values/ranges: @@ -213,13 +212,13 @@ void qt_set_duration_iso(QPointer<AVFCameraService> service, QPointer<AVFCameraE completionHandler:completionHandler]; } -#endif // QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#endif // defined(Q_OS_IOS) } // Unnamed namespace. AVFCameraExposureControl::AVFCameraExposureControl(AVFCameraService *service) : m_service(service), - m_session(Q_NULLPTR) + m_session(nullptr) { Q_ASSERT(service); m_session = m_service->session(); @@ -230,7 +229,7 @@ AVFCameraExposureControl::AVFCameraExposureControl(AVFCameraService *service) bool AVFCameraExposureControl::isParameterSupported(ExposureParameter parameter) const { -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#ifdef Q_OS_IOS AVCaptureDevice *captureDevice = m_session->videoCaptureDevice(); if (!captureDevice) return false; @@ -250,7 +249,7 @@ QVariantList AVFCameraExposureControl::supportedParameterRange(ExposureParameter bool *continuous) const { QVariantList parameterRange; -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#ifdef Q_OS_IOS AVCaptureDevice *captureDevice = m_session->videoCaptureDevice(); if (!captureDevice || !isParameterSupported(parameter)) { @@ -333,7 +332,7 @@ QVariant AVFCameraExposureControl::requestedValue(ExposureParameter parameter) c QVariant AVFCameraExposureControl::actualValue(ExposureParameter parameter) const { -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#ifdef Q_OS_IOS AVCaptureDevice *captureDevice = m_session->videoCaptureDevice(); if (!captureDevice || !isParameterSupported(parameter)) { // Actually, at the moment !captiredevice => !isParameterSupported. @@ -386,7 +385,7 @@ bool AVFCameraExposureControl::setValue(ExposureParameter parameter, const QVari bool AVFCameraExposureControl::setExposureMode(const QVariant &value) { -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#ifdef Q_OS_IOS if (!value.canConvert<QCameraExposure::ExposureMode>()) { qDebugCamera() << Q_FUNC_INFO << "invalid exposure mode value," << "QCameraExposure::ExposureMode expected"; @@ -433,7 +432,7 @@ bool AVFCameraExposureControl::setExposureMode(const QVariant &value) bool AVFCameraExposureControl::setExposureCompensation(const QVariant &value) { -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#ifdef Q_OS_IOS if (!value.canConvert<qreal>()) { qDebugCamera() << Q_FUNC_INFO << "invalid exposure compensation" <<"value, floating point number expected"; @@ -474,7 +473,7 @@ bool AVFCameraExposureControl::setExposureCompensation(const QVariant &value) bool AVFCameraExposureControl::setShutterSpeed(const QVariant &value) { -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#ifdef Q_OS_IOS if (value.isNull()) return setExposureMode(QVariant::fromValue(QCameraExposure::ExposureAuto)); @@ -521,7 +520,7 @@ bool AVFCameraExposureControl::setShutterSpeed(const QVariant &value) bool AVFCameraExposureControl::setISO(const QVariant &value) { -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#ifdef Q_OS_IOS if (value.isNull()) return setExposureMode(QVariant::fromValue(QCameraExposure::ExposureAuto)); @@ -565,7 +564,7 @@ bool AVFCameraExposureControl::setISO(const QVariant &value) void AVFCameraExposureControl::cameraStateChanged() { -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#ifdef Q_OS_IOS if (m_session->state() != QCamera::ActiveState) return; diff --git a/src/plugins/avfoundation/camera/avfcameraflashcontrol.h b/src/plugins/avfoundation/camera/avfcameraflashcontrol.h index f8a11a821..58403e829 100644 --- a/src/plugins/avfoundation/camera/avfcameraflashcontrol.h +++ b/src/plugins/avfoundation/camera/avfcameraflashcontrol.h @@ -56,10 +56,10 @@ class AVFCameraFlashControl : public QCameraFlashControl public: AVFCameraFlashControl(AVFCameraService *service); - QCameraExposure::FlashModes flashMode() const Q_DECL_OVERRIDE; - void setFlashMode(QCameraExposure::FlashModes mode) Q_DECL_OVERRIDE; - bool isFlashModeSupported(QCameraExposure::FlashModes mode) const Q_DECL_OVERRIDE; - bool isFlashReady() const Q_DECL_OVERRIDE; + QCameraExposure::FlashModes flashMode() const override; + void setFlashMode(QCameraExposure::FlashModes mode) override; + bool isFlashModeSupported(QCameraExposure::FlashModes mode) const override; + bool isFlashReady() const override; private Q_SLOTS: void cameraStateChanged(QCamera::State newState); diff --git a/src/plugins/avfoundation/camera/avfcamerafocuscontrol.h b/src/plugins/avfoundation/camera/avfcamerafocuscontrol.h index 9d8b7a5ab..26135e534 100644 --- a/src/plugins/avfoundation/camera/avfcamerafocuscontrol.h +++ b/src/plugins/avfoundation/camera/avfcamerafocuscontrol.h @@ -58,17 +58,17 @@ class AVFCameraFocusControl : public QCameraFocusControl public: explicit AVFCameraFocusControl(AVFCameraService *service); - QCameraFocus::FocusModes focusMode() const Q_DECL_OVERRIDE; - void setFocusMode(QCameraFocus::FocusModes mode) Q_DECL_OVERRIDE; - bool isFocusModeSupported(QCameraFocus::FocusModes mode) const Q_DECL_OVERRIDE; + QCameraFocus::FocusModes focusMode() const override; + void setFocusMode(QCameraFocus::FocusModes mode) override; + bool isFocusModeSupported(QCameraFocus::FocusModes mode) const override; - QCameraFocus::FocusPointMode focusPointMode() const Q_DECL_OVERRIDE; - void setFocusPointMode(QCameraFocus::FocusPointMode mode) Q_DECL_OVERRIDE; - bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const Q_DECL_OVERRIDE; - QPointF customFocusPoint() const Q_DECL_OVERRIDE; - void setCustomFocusPoint(const QPointF &point) Q_DECL_OVERRIDE; + QCameraFocus::FocusPointMode focusPointMode() const override; + void setFocusPointMode(QCameraFocus::FocusPointMode mode) override; + bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const override; + QPointF customFocusPoint() const override; + void setCustomFocusPoint(const QPointF &point) override; - QCameraFocusZoneList focusZones() const Q_DECL_OVERRIDE; + QCameraFocusZoneList focusZones() const override; private Q_SLOTS: void cameraStateChanged(); diff --git a/src/plugins/avfoundation/camera/avfcameraservice.mm b/src/plugins/avfoundation/camera/avfcameraservice.mm index 7fd04250e..71ea31e5b 100644 --- a/src/plugins/avfoundation/camera/avfcameraservice.mm +++ b/src/plugins/avfoundation/camera/avfcameraservice.mm @@ -37,7 +37,6 @@ ** ****************************************************************************/ -#include <QtCore/qoperatingsystemversion.h> #include <QtCore/qvariant.h> #include <QtCore/qdebug.h> @@ -95,9 +94,8 @@ AVFCameraService::AVFCameraService(QObject *parent): m_imageCaptureControl = new AVFImageCaptureControl(this); m_cameraFocusControl = new AVFCameraFocusControl(this); m_cameraExposureControl = 0; -#if defined(Q_OS_IOS) && QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) - if (QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::IOS, 8)) - m_cameraExposureControl = new AVFCameraExposureControl(this); +#ifdef Q_OS_IOS + m_cameraExposureControl = new AVFCameraExposureControl(this); #endif m_cameraZoomControl = 0; diff --git a/src/plugins/avfoundation/camera/avfcamerautility.mm b/src/plugins/avfoundation/camera/avfcamerautility.mm index b864162a3..8a2254c2e 100644 --- a/src/plugins/avfoundation/camera/avfcamerautility.mm +++ b/src/plugins/avfoundation/camera/avfcamerautility.mm @@ -40,7 +40,6 @@ #include "avfcamerautility.h" #include "avfcameradebug.h" -#include <QtCore/qoperatingsystemversion.h> #include <QtCore/qvector.h> #include <QtCore/qpair.h> #include <private/qmultimediautils_p.h> @@ -180,12 +179,10 @@ QSize qt_device_format_high_resolution(AVCaptureDeviceFormat *format) { Q_ASSERT(format); QSize res; -#if defined(Q_OS_IOS) && QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) - if (QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::IOS, 8)) { - const CMVideoDimensions hrDim(format.highResolutionStillImageDimensions); - res.setWidth(hrDim.width); - res.setHeight(hrDim.height); - } +#if defined(Q_OS_IOS) + const CMVideoDimensions hrDim(format.highResolutionStillImageDimensions); + res.setWidth(hrDim.width); + res.setHeight(hrDim.height); #endif return res; } diff --git a/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.h b/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.h index bed755339..588aa7b74 100644 --- a/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.h +++ b/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.h @@ -67,9 +67,9 @@ class AVFCameraViewfinderSettingsControl2 : public QCameraViewfinderSettingsCont public: AVFCameraViewfinderSettingsControl2(AVFCameraService *service); - QList<QCameraViewfinderSettings> supportedViewfinderSettings() const Q_DECL_OVERRIDE; - QCameraViewfinderSettings viewfinderSettings() const Q_DECL_OVERRIDE; - void setViewfinderSettings(const QCameraViewfinderSettings &settings) Q_DECL_OVERRIDE; + QList<QCameraViewfinderSettings> supportedViewfinderSettings() const override; + QCameraViewfinderSettings viewfinderSettings() const override; + void setViewfinderSettings(const QCameraViewfinderSettings &settings) override; // "Converters": static QVideoFrame::PixelFormat QtPixelFormatFromCVFormat(unsigned avPixelFormat); @@ -97,9 +97,9 @@ class AVFCameraViewfinderSettingsControl : public QCameraViewfinderSettingsContr public: AVFCameraViewfinderSettingsControl(AVFCameraService *service); - bool isViewfinderParameterSupported(ViewfinderParameter parameter) const Q_DECL_OVERRIDE; - QVariant viewfinderParameter(ViewfinderParameter parameter) const Q_DECL_OVERRIDE; - void setViewfinderParameter(ViewfinderParameter parameter, const QVariant &value) Q_DECL_OVERRIDE; + bool isViewfinderParameterSupported(ViewfinderParameter parameter) const override; + QVariant viewfinderParameter(ViewfinderParameter parameter) const override; + void setViewfinderParameter(ViewfinderParameter parameter, const QVariant &value) override; private: void setResolution(const QVariant &resolution); diff --git a/src/plugins/avfoundation/camera/avfcamerazoomcontrol.h b/src/plugins/avfoundation/camera/avfcamerazoomcontrol.h index 6a460ad59..2307dfc28 100644 --- a/src/plugins/avfoundation/camera/avfcamerazoomcontrol.h +++ b/src/plugins/avfoundation/camera/avfcamerazoomcontrol.h @@ -57,15 +57,15 @@ class AVFCameraZoomControl : public QCameraZoomControl public: AVFCameraZoomControl(AVFCameraService *service); - qreal maximumOpticalZoom() const Q_DECL_OVERRIDE; - qreal maximumDigitalZoom() const Q_DECL_OVERRIDE; + qreal maximumOpticalZoom() const override; + qreal maximumDigitalZoom() const override; - qreal requestedOpticalZoom() const Q_DECL_OVERRIDE; - qreal requestedDigitalZoom() const Q_DECL_OVERRIDE; - qreal currentOpticalZoom() const Q_DECL_OVERRIDE; - qreal currentDigitalZoom() const Q_DECL_OVERRIDE; + qreal requestedOpticalZoom() const override; + qreal requestedDigitalZoom() const override; + qreal currentOpticalZoom() const override; + qreal currentDigitalZoom() const override; - void zoomTo(qreal optical, qreal digital) Q_DECL_OVERRIDE; + void zoomTo(qreal optical, qreal digital) override; private Q_SLOTS: void cameraStateChanged(); diff --git a/src/plugins/avfoundation/camera/avfimageencodercontrol.h b/src/plugins/avfoundation/camera/avfimageencodercontrol.h index 22a6b2722..7e2e34294 100644 --- a/src/plugins/avfoundation/camera/avfimageencodercontrol.h +++ b/src/plugins/avfoundation/camera/avfimageencodercontrol.h @@ -61,12 +61,12 @@ class AVFImageEncoderControl : public QImageEncoderControl public: AVFImageEncoderControl(AVFCameraService *service); - QStringList supportedImageCodecs() const Q_DECL_OVERRIDE; - QString imageCodecDescription(const QString &codecName) const Q_DECL_OVERRIDE; + QStringList supportedImageCodecs() const override; + QString imageCodecDescription(const QString &codecName) const override; QList<QSize> supportedResolutions(const QImageEncoderSettings &settings, - bool *continuous) const Q_DECL_OVERRIDE; - QImageEncoderSettings imageSettings() const Q_DECL_OVERRIDE; - void setImageSettings(const QImageEncoderSettings &settings) Q_DECL_OVERRIDE; + bool *continuous) const override; + QImageEncoderSettings imageSettings() const override; + void setImageSettings(const QImageEncoderSettings &settings) override; QImageEncoderSettings requestedSettings() const; diff --git a/src/plugins/avfoundation/camera/avfimageencodercontrol.mm b/src/plugins/avfoundation/camera/avfimageencodercontrol.mm index 8384ce6ae..e858d93c4 100644 --- a/src/plugins/avfoundation/camera/avfimageencodercontrol.mm +++ b/src/plugins/avfoundation/camera/avfimageencodercontrol.mm @@ -48,7 +48,6 @@ #include <QtMultimedia/qmediaencodersettings.h> -#include <QtCore/qoperatingsystemversion.h> #include <QtCore/qdebug.h> #include <AVFoundation/AVFoundation.h> @@ -94,17 +93,15 @@ QList<QSize> AVFImageEncoderControl::supportedResolutions(const QImageEncoderSet const QSize res(qt_device_format_resolution(format)); if (!res.isNull() && res.isValid()) resolutions << res; -#if defined(Q_OS_IOS) && QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) - if (QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::IOS, 8)) { - // 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; - } +#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 } @@ -133,17 +130,15 @@ QImageEncoderSettings AVFImageEncoderControl::imageSettings() const } QSize res(qt_device_format_resolution(captureDevice.activeFormat)); -#if defined(Q_OS_IOS) && QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) - if (QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::IOS, 8)) { - if (!m_service->imageCaptureControl() || !m_service->imageCaptureControl()->stillImageOutput()) { - qDebugCamera() << Q_FUNC_INFO << "no still image output"; - return settings; - } - - AVCaptureStillImageOutput *stillImageOutput = m_service->imageCaptureControl()->stillImageOutput(); - if (stillImageOutput.highResolutionStillImageOutputEnabled) - res = qt_device_format_high_resolution(captureDevice.activeFormat); +#ifdef Q_OS_IOS + if (!m_service->imageCaptureControl() || !m_service->imageCaptureControl()->stillImageOutput()) { + qDebugCamera() << Q_FUNC_INFO << "no still image output"; + return settings; } + + AVCaptureStillImageOutput *stillImageOutput = m_service->imageCaptureControl()->stillImageOutput(); + if (stillImageOutput.highResolutionStillImageOutputEnabled) + res = qt_device_format_high_resolution(captureDevice.activeFormat); #endif if (res.isNull() || !res.isValid()) { qDebugCamera() << Q_FUNC_INFO << "failed to exctract the image resolution"; @@ -217,14 +212,12 @@ bool AVFImageEncoderControl::applySettings() activeFormatChanged = qt_set_active_format(captureDevice, match, true); -#if defined(Q_OS_IOS) && QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) - if (QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::IOS, 8)) { - AVCaptureStillImageOutput *imageOutput = m_service->imageCaptureControl()->stillImageOutput(); - if (res == qt_device_format_high_resolution(captureDevice.activeFormat)) - imageOutput.highResolutionStillImageOutputEnabled = YES; - else - imageOutput.highResolutionStillImageOutputEnabled = NO; - } +#ifdef Q_OS_IOS + AVCaptureStillImageOutput *imageOutput = m_service->imageCaptureControl()->stillImageOutput(); + if (res == qt_device_format_high_resolution(captureDevice.activeFormat)) + imageOutput.highResolutionStillImageOutputEnabled = YES; + else + imageOutput.highResolutionStillImageOutputEnabled = NO; #endif return activeFormatChanged; diff --git a/src/plugins/avfoundation/camera/avfmediacontainercontrol.h b/src/plugins/avfoundation/camera/avfmediacontainercontrol.h index 45d69f18b..e43e70baf 100644 --- a/src/plugins/avfoundation/camera/avfmediacontainercontrol.h +++ b/src/plugins/avfoundation/camera/avfmediacontainercontrol.h @@ -53,10 +53,10 @@ class AVFMediaContainerControl : public QMediaContainerControl public: explicit AVFMediaContainerControl(AVFCameraService *service); - QStringList supportedContainers() const Q_DECL_OVERRIDE; - QString containerFormat() const Q_DECL_OVERRIDE; - void setContainerFormat(const QString &format) Q_DECL_OVERRIDE; - QString containerDescription(const QString &formatMimeType) const Q_DECL_OVERRIDE; + QStringList supportedContainers() const override; + QString containerFormat() const override; + void setContainerFormat(const QString &format) override; + QString containerDescription(const QString &formatMimeType) const override; NSString *fileType() const; diff --git a/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.h b/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.h index a0967efa3..8e049a595 100644 --- a/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.h +++ b/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.h @@ -65,24 +65,24 @@ public: AVFMediaRecorderControlIOS(AVFCameraService *service, QObject *parent = 0); ~AVFMediaRecorderControlIOS(); - QUrl outputLocation() const Q_DECL_OVERRIDE; - bool setOutputLocation(const QUrl &location) Q_DECL_OVERRIDE; + QUrl outputLocation() const override; + bool setOutputLocation(const QUrl &location) override; - QMediaRecorder::State state() const Q_DECL_OVERRIDE; - QMediaRecorder::Status status() const Q_DECL_OVERRIDE; + QMediaRecorder::State state() const override; + QMediaRecorder::Status status() const override; - qint64 duration() const Q_DECL_OVERRIDE; + qint64 duration() const override; - bool isMuted() const Q_DECL_OVERRIDE; - qreal volume() const Q_DECL_OVERRIDE; + bool isMuted() const override; + qreal volume() const override; - void applySettings() Q_DECL_OVERRIDE; + void applySettings() override; void unapplySettings(); public Q_SLOTS: - void setState(QMediaRecorder::State state) Q_DECL_OVERRIDE; - void setMuted(bool muted) Q_DECL_OVERRIDE; - void setVolume(qreal volume) Q_DECL_OVERRIDE; + void setState(QMediaRecorder::State state) override; + void setMuted(bool muted) override; + void setVolume(qreal volume) override; private: diff --git a/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.mm b/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.mm index d657dc17d..0b31bd0bc 100644 --- a/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.mm +++ b/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.mm @@ -49,6 +49,7 @@ #include "avfmediacontainercontrol.h" #include "avfcamerautility.h" +#include <QtCore/qmath.h> #include <QtCore/qdebug.h> QT_USE_NAMESPACE @@ -273,14 +274,11 @@ void AVFMediaRecorderControlIOS::setState(QMediaRecorder::State state) else rotation = (screenOrientation + (360 - cameraInfo.orientation)) % 360; - // convert to radians - rotation *= M_PI / 180.f; - if ([m_writer setupWithFileURL:nsFileURL cameraService:m_service audioSettings:m_audioSettings videoSettings:m_videoSettings - transform:CGAffineTransformMakeRotation(rotation)]) { + transform:CGAffineTransformMakeRotation(qDegreesToRadians(rotation))]) { m_state = QMediaRecorder::RecordingState; m_lastStatus = QMediaRecorder::StartingStatus; diff --git a/src/plugins/avfoundation/camera/avfvideoencodersettingscontrol.h b/src/plugins/avfoundation/camera/avfvideoencodersettingscontrol.h index 4d90377d5..9bdf5a788 100644 --- a/src/plugins/avfoundation/camera/avfvideoencodersettingscontrol.h +++ b/src/plugins/avfoundation/camera/avfvideoencodersettingscontrol.h @@ -59,16 +59,16 @@ public: explicit AVFVideoEncoderSettingsControl(AVFCameraService *service); QList<QSize> supportedResolutions(const QVideoEncoderSettings &requestedVideoSettings, - bool *continuous = 0) const Q_DECL_OVERRIDE; + bool *continuous = 0) const override; QList<qreal> supportedFrameRates(const QVideoEncoderSettings &requestedVideoSettings, - bool *continuous = 0) const Q_DECL_OVERRIDE; + bool *continuous = 0) const override; - QStringList supportedVideoCodecs() const Q_DECL_OVERRIDE; - QString videoCodecDescription(const QString &codecName) const Q_DECL_OVERRIDE; + QStringList supportedVideoCodecs() const override; + QString videoCodecDescription(const QString &codecName) const override; - QVideoEncoderSettings videoSettings() const Q_DECL_OVERRIDE; - void setVideoSettings(const QVideoEncoderSettings &requestedVideoSettings) Q_DECL_OVERRIDE; + QVideoEncoderSettings videoSettings() const override; + void setVideoSettings(const QVideoEncoderSettings &requestedVideoSettings) override; NSDictionary *applySettings(AVCaptureConnection *connection); void unapplySettings(AVCaptureConnection *connection); diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.mm index 5f7bae1c8..bf7ebb4a0 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.mm +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.mm @@ -60,6 +60,7 @@ void AVFMediaPlayerControl::setSession(AVFMediaPlayerSession *session) connect(m_session, SIGNAL(positionChanged(qint64)), this, SIGNAL(positionChanged(qint64))); connect(m_session, SIGNAL(durationChanged(qint64)), this, SIGNAL(durationChanged(qint64))); + connect(m_session, SIGNAL(bufferStatusChanged(int)), this, SIGNAL(bufferStatusChanged(int))); connect(m_session, SIGNAL(stateChanged(QMediaPlayer::State)), this, SIGNAL(stateChanged(QMediaPlayer::State))); connect(m_session, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h index 9a55b7b74..e20f4a1ec 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h @@ -106,12 +106,15 @@ public Q_SLOTS: void processLoadStateChange(); void processLoadStateFailure(); + void processBufferStateChange(int bufferStatus); + void processDurationChange(qint64 duration); Q_SIGNALS: void positionChanged(qint64 position); void durationChanged(qint64 duration); void stateChanged(QMediaPlayer::State newState); + void bufferStatusChanged(int bufferStatus); void mediaStatusChanged(QMediaPlayer::MediaStatus status); void volumeChanged(int volume); void mutedChanged(bool muted); @@ -179,6 +182,7 @@ private: qint64 m_requestedPosition; qint64 m_duration; + int m_bufferStatus; bool m_videoAvailable; bool m_audioAvailable; bool m_seekable; diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm index b6fe01053..06fb71ef8 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm @@ -52,7 +52,8 @@ static NSString* const AVF_TRACKS_KEY = @"tracks"; static NSString* const AVF_PLAYABLE_KEY = @"playable"; //AVPlayerItem keys -static NSString* const AVF_STATUS_KEY = @"status"; +static NSString* const AVF_STATUS_KEY = @"status"; +static NSString* const AVF_BUFFER_LIKELY_KEEP_UP_KEY = @"playbackLikelyToKeepUp"; //AVPlayer keys static NSString* const AVF_RATE_KEY = @"rate"; @@ -61,6 +62,7 @@ static NSString* const AVF_CURRENT_ITEM_DURATION_KEY = @"currentItem.duration static void *AVFMediaPlayerSessionObserverRateObservationContext = &AVFMediaPlayerSessionObserverRateObservationContext; static void *AVFMediaPlayerSessionObserverStatusObservationContext = &AVFMediaPlayerSessionObserverStatusObservationContext; +static void *AVFMediaPlayerSessionObserverBufferLikelyToKeepUpContext = &AVFMediaPlayerSessionObserverBufferLikelyToKeepUpContext; static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMediaPlayerSessionObserverCurrentItemObservationContext; static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext = &AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext; @@ -72,6 +74,7 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext AVPlayerItem *m_playerItem; AVPlayerLayer *m_playerLayer; NSURL *m_URL; + BOOL m_bufferIsLikelyToKeepUp; } @property (readonly, getter=player) AVPlayer* m_player; @@ -102,6 +105,7 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext return nil; self->m_session = session; + self->m_bufferIsLikelyToKeepUp = FALSE; return self; } @@ -141,6 +145,7 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext { if (m_playerItem) { [m_playerItem removeObserver:self forKeyPath:AVF_STATUS_KEY]; + [m_playerItem removeObserver:self forKeyPath:AVF_BUFFER_LIKELY_KEEP_UP_KEY]; [[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification @@ -219,6 +224,11 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:AVFMediaPlayerSessionObserverStatusObservationContext]; + [m_playerItem addObserver:self + forKeyPath:AVF_BUFFER_LIKELY_KEEP_UP_KEY + options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew + context:AVFMediaPlayerSessionObserverBufferLikelyToKeepUpContext]; + //When the player item has played to its end time we'll toggle //the movie controller Pause button to be the Play button [[NSNotificationCenter defaultCenter] addObserver:self @@ -338,6 +348,15 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext break; } } + else if (context == AVFMediaPlayerSessionObserverBufferLikelyToKeepUpContext) + { + const bool isPlaybackLikelyToKeepUp = [m_playerItem isPlaybackLikelyToKeepUp]; + if (isPlaybackLikelyToKeepUp != m_bufferIsLikelyToKeepUp) { + m_bufferIsLikelyToKeepUp = isPlaybackLikelyToKeepUp; + QMetaObject::invokeMethod(m_session, "processBufferStateChange", Qt::AutoConnection, + Q_ARG(int, isPlaybackLikelyToKeepUp ? 100 : 0)); + } + } //AVPlayer "rate" property value observer. else if (context == AVFMediaPlayerSessionObserverRateObservationContext) { @@ -402,6 +421,7 @@ AVFMediaPlayerSession::AVFMediaPlayerSession(AVFMediaPlayerService *service, QOb , m_rate(1.0) , m_requestedPosition(-1) , m_duration(0) + , m_bufferStatus(0) , m_videoAvailable(false) , m_audioAvailable(false) , m_seekable(false) @@ -536,11 +556,10 @@ qint64 AVFMediaPlayerSession::duration() const int AVFMediaPlayerSession::bufferStatus() const { - //BUG: bufferStatus may be relevant? #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif - return 100; + return m_bufferStatus; } int AVFMediaPlayerSession::volume() const @@ -898,6 +917,15 @@ void AVFMediaPlayerSession::processLoadStateFailure() Q_EMIT stateChanged((m_state = QMediaPlayer::StoppedState)); } +void AVFMediaPlayerSession::processBufferStateChange(int bufferStatus) +{ + if (bufferStatus == m_bufferStatus) + return; + + m_bufferStatus = bufferStatus; + Q_EMIT bufferStatusChanged(bufferStatus); +} + void AVFMediaPlayerSession::processDurationChange(qint64 duration) { if (duration == m_duration) diff --git a/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm b/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm index 4952551dc..5727cb0f4 100644 --- a/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm +++ b/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm @@ -41,6 +41,14 @@ #include <AVFoundation/AVFoundation.h> +#if QT_HAS_INCLUDE(<AppKit/AppKit.h>) +#include <AppKit/AppKit.h> +#endif + +#if QT_HAS_INCLUDE(<UIKit/UIKit.h>) +#include <UIKit/UIKit.h> +#endif + QT_USE_NAMESPACE AVFVideoWindowControl::AVFVideoWindowControl(QObject *parent) diff --git a/src/plugins/common/evr/evrcustompresenter.cpp b/src/plugins/common/evr/evrcustompresenter.cpp index 38e8c3a8f..b07dbe719 100644 --- a/src/plugins/common/evr/evrcustompresenter.cpp +++ b/src/plugins/common/evr/evrcustompresenter.cpp @@ -560,7 +560,6 @@ EVRCustomPresenter::EVRCustomPresenter(QAbstractVideoSurface *surface) , m_mediaType(0) , m_surface(0) , m_canRenderToSurface(false) - , m_sampleToPresent(0) { // Initial source rectangle = (0,0,1,1) m_sourceRect.top = 0; @@ -1351,13 +1350,6 @@ HRESULT EVRCustomPresenter::createOptimalVideoType(IMFMediaType *proposedType, I // Modify the new type. - // Set the pixel aspect ratio (PAR) to 1:1 (see assumption #1, above) - // The ratio is packed in a single UINT64. A helper function is normally available for - // that (MFSetAttributeRatio) but it's not correctly defined in MinGW 4.9.1. - hr = mtOptimal->SetUINT64(MF_MT_PIXEL_ASPECT_RATIO, (((UINT64) 1) << 32) | ((UINT64) 1)); - if (FAILED(hr)) - goto done; - hr = proposedType->GetUINT64(MF_MT_FRAME_SIZE, &size); width = int(HI32(size)); height = int(LO32(size)); diff --git a/src/plugins/common/evr/evrcustompresenter.h b/src/plugins/common/evr/evrcustompresenter.h index 5c240ea95..199dee774 100644 --- a/src/plugins/common/evr/evrcustompresenter.h +++ b/src/plugins/common/evr/evrcustompresenter.h @@ -367,8 +367,6 @@ private: QAbstractVideoSurface *m_surface; bool m_canRenderToSurface; - - IMFSample *m_sampleToPresent; }; bool qt_evr_setCustomPresenter(IUnknown *evr, EVRCustomPresenter *presenter); diff --git a/src/plugins/common/evr/evrd3dpresentengine.cpp b/src/plugins/common/evr/evrd3dpresentengine.cpp index 754faef2d..54403faba 100644 --- a/src/plugins/common/evr/evrd3dpresentengine.cpp +++ b/src/plugins/common/evr/evrd3dpresentengine.cpp @@ -50,7 +50,7 @@ #include <QOffscreenSurface> #ifdef MAYBE_ANGLE -# include <qtgui/qguiapplication.h> +# include <qguiapplication.h> # include <qpa/qplatformnativeinterface.h> # include <qopenglfunctions.h> # include <EGL/eglext.h> @@ -581,6 +581,10 @@ done: : qt_evr_pixelFormatFromD3DFormat(d3dFormat), m_useTextureRendering ? QAbstractVideoBuffer::GLTextureHandle : QAbstractVideoBuffer::NoHandle); + UINT32 horizontal = 1, vertical = 1; + hr = MFGetAttributeRatio(format, MF_MT_PIXEL_ASPECT_RATIO, &horizontal, &vertical); + if (SUCCEEDED(hr)) + m_surfaceFormat.setPixelAspectRatio(horizontal, vertical); } else { releaseResources(); } diff --git a/src/plugins/coreaudio/coreaudioplugin.h b/src/plugins/coreaudio/coreaudioplugin.h index da18d8cfe..5407bdeb9 100644 --- a/src/plugins/coreaudio/coreaudioplugin.h +++ b/src/plugins/coreaudio/coreaudioplugin.h @@ -54,11 +54,11 @@ public: explicit CoreAudioPlugin(QObject *parent = 0); ~CoreAudioPlugin() {} - QByteArray defaultDevice(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QList<QByteArray> availableDevices(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QAbstractAudioInput *createInput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioOutput *createOutput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) Q_DECL_OVERRIDE; + QByteArray defaultDevice(QAudio::Mode mode) const override; + QList<QByteArray> availableDevices(QAudio::Mode mode) const override; + QAbstractAudioInput *createInput(const QByteArray &device) override; + QAbstractAudioOutput *createOutput(const QByteArray &device) override; + QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) override; }; QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/camera.pri b/src/plugins/directshow/camera/camera.pri index d8ee59aa9..0e1c1e895 100644 --- a/src/plugins/directshow/camera/camera.pri +++ b/src/plugins/directshow/camera/camera.pri @@ -11,7 +11,11 @@ HEADERS += \ $$PWD/dscamerasession.h \ $$PWD/directshowcameraglobal.h \ $$PWD/dscameraviewfindersettingscontrol.h \ - $$PWD/dscameraimageprocessingcontrol.h + $$PWD/dscameraimageprocessingcontrol.h \ + $$PWD/directshowcameraexposurecontrol.h \ + $$PWD/directshowcameracapturedestinationcontrol.h \ + $$PWD/directshowcameracapturebufferformatcontrol.h \ + $$PWD/directshowcamerazoomcontrol.h SOURCES += \ $$PWD/dscameraservice.cpp \ @@ -21,7 +25,11 @@ SOURCES += \ $$PWD/dsimagecapturecontrol.cpp \ $$PWD/dscamerasession.cpp \ $$PWD/dscameraviewfindersettingscontrol.cpp \ - $$PWD/dscameraimageprocessingcontrol.cpp + $$PWD/dscameraimageprocessingcontrol.cpp \ + $$PWD/directshowcameraexposurecontrol.cpp \ + $$PWD/directshowcameracapturedestinationcontrol.cpp \ + $$PWD/directshowcameracapturebufferformatcontrol.cpp \ + $$PWD/directshowcamerazoomcontrol.cpp *-msvc*:INCLUDEPATH += $$(DXSDK_DIR)/include QMAKE_USE += directshow diff --git a/src/plugins/directshow/camera/directshowcameracapturebufferformatcontrol.cpp b/src/plugins/directshow/camera/directshowcameracapturebufferformatcontrol.cpp new file mode 100644 index 000000000..cc0a0ad17 --- /dev/null +++ b/src/plugins/directshow/camera/directshowcameracapturebufferformatcontrol.cpp @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "directshowcameracapturebufferformatcontrol.h" + +#include "dscamerasession.h" + +QT_BEGIN_NAMESPACE + +DirectShowCameraCaptureBufferFormatControl::DirectShowCameraCaptureBufferFormatControl() +{ +} + +QList<QVideoFrame::PixelFormat> DirectShowCameraCaptureBufferFormatControl::supportedBufferFormats() const +{ + return QList<QVideoFrame::PixelFormat>() << QVideoFrame::Format_RGB32; +} + +QVideoFrame::PixelFormat DirectShowCameraCaptureBufferFormatControl::bufferFormat() const +{ + return QVideoFrame::Format_RGB32; +} + +void DirectShowCameraCaptureBufferFormatControl::setBufferFormat(QVideoFrame::PixelFormat format) +{ + Q_UNUSED(format); +} + +QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/directshowcameracapturebufferformatcontrol.h b/src/plugins/directshow/camera/directshowcameracapturebufferformatcontrol.h new file mode 100644 index 000000000..cacd3652b --- /dev/null +++ b/src/plugins/directshow/camera/directshowcameracapturebufferformatcontrol.h @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef DIRECTSHOWCAMERACAPTUREBUFFERFORMATCONTROL_H +#define DIRECTSHOWCAMERACAPTUREBUFFERFORMATCONTROL_H + +#include <QtMultimedia/qcameracapturebufferformatcontrol.h> + +QT_BEGIN_NAMESPACE + +class DirectShowCameraCaptureBufferFormatControl : public QCameraCaptureBufferFormatControl +{ + Q_OBJECT +public: + DirectShowCameraCaptureBufferFormatControl(); + + QList<QVideoFrame::PixelFormat> supportedBufferFormats() const override; + QVideoFrame::PixelFormat bufferFormat() const override; + void setBufferFormat(QVideoFrame::PixelFormat format) override; +}; + +QT_END_NAMESPACE + +#endif // DIRECTSHOWCAMERACAPTUREBUFFERFORMATCONTROL_H diff --git a/src/plugins/directshow/camera/directshowcameracapturedestinationcontrol.cpp b/src/plugins/directshow/camera/directshowcameracapturedestinationcontrol.cpp new file mode 100644 index 000000000..bfb10fc03 --- /dev/null +++ b/src/plugins/directshow/camera/directshowcameracapturedestinationcontrol.cpp @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "directshowcameracapturedestinationcontrol.h" + +#include "dscamerasession.h" + +QT_BEGIN_NAMESPACE + +DirectShowCameraCaptureDestinationControl::DirectShowCameraCaptureDestinationControl(DSCameraSession *session) + : m_session(session) +{ + connect(m_session, &DSCameraSession::captureDestinationChanged, + this, &DirectShowCameraCaptureDestinationControl::captureDestinationChanged); +} + +bool DirectShowCameraCaptureDestinationControl::isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const +{ + return m_session->isCaptureDestinationSupported(destination); +} + +QCameraImageCapture::CaptureDestinations DirectShowCameraCaptureDestinationControl::captureDestination() const +{ + return m_session->captureDestination(); +} + +void DirectShowCameraCaptureDestinationControl::setCaptureDestination(QCameraImageCapture::CaptureDestinations destination) +{ + m_session->setCaptureDestination(destination); +} + +QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/directshowcameracapturedestinationcontrol.h b/src/plugins/directshow/camera/directshowcameracapturedestinationcontrol.h new file mode 100644 index 000000000..224df9dbc --- /dev/null +++ b/src/plugins/directshow/camera/directshowcameracapturedestinationcontrol.h @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef DIRECTSHOWCAMERACAPTUREDESTINATIONCONTROL_H +#define DIRECTSHOWCAMERACAPTUREDESTINATIONCONTROL_H + +#include <QtMultimedia/qcameracapturedestinationcontrol.h> + +QT_BEGIN_NAMESPACE + +class DSCameraSession; + +class DirectShowCameraCaptureDestinationControl : public QCameraCaptureDestinationControl +{ + Q_OBJECT +public: + DirectShowCameraCaptureDestinationControl(DSCameraSession *session); + + bool isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const override; + QCameraImageCapture::CaptureDestinations captureDestination() const override; + void setCaptureDestination(QCameraImageCapture::CaptureDestinations destination) override; + +private: + DSCameraSession *m_session; + +}; + +QT_END_NAMESPACE + +#endif // DIRECTSHOWCAMERACAPTUREDESTINATIONCONTROL_H diff --git a/src/plugins/directshow/camera/directshowcameraexposurecontrol.cpp b/src/plugins/directshow/camera/directshowcameraexposurecontrol.cpp new file mode 100644 index 000000000..7ece366ea --- /dev/null +++ b/src/plugins/directshow/camera/directshowcameraexposurecontrol.cpp @@ -0,0 +1,411 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "directshowcameraexposurecontrol.h" +#include "dscamerasession.h" +#include "directshowglobal.h" +#include "directshowutils.h" + +#include <functional> +#include <cmath> + +QT_BEGIN_NAMESPACE + +static qreal convertToSec(long v) { return (v < 0) ? (1 / std::pow(2., qreal(v))) : std::pow(2., qreal(v)); } +static Q_DECL_CONSTEXPR qreal convertToFvalue(long v) { return qreal(v) / 10.; } + +DirectShowCameraExposureControl::DirectShowCameraExposureControl(DSCameraSession *session) + : m_session(session) + , m_shutterSpeedValues({ 0, 0, 0, 0, 0 }) + , m_apertureValues({ 0, 0, 0, 0, 0 }) + , m_requestedShutterSpeed(qreal(0.0)) + , m_currentShutterSpeed(qreal(-1.0)) + , m_requestedAperture(qreal(0.0)) + , m_currentAperture(qreal(-1.0)) + , m_requestedExposureMode(QCameraExposure::ExposureAuto) + , m_currentExposureMode(QCameraExposure::ExposureAuto) +{ + Q_ASSERT(m_session); + connect(m_session, &DSCameraSession::statusChanged, + this, &DirectShowCameraExposureControl::onStatusChanged); +} + +bool DirectShowCameraExposureControl::isParameterSupported(QCameraExposureControl::ExposureParameter parameter) const +{ + if (parameter == ShutterSpeed) + return (m_shutterSpeedValues.caps & CameraControl_Flags_Manual); + if (parameter == Aperture) + return (m_apertureValues.caps & CameraControl_Flags_Manual); + if (parameter == ExposureMode) + return true; + + return false; +} + +QVariantList DirectShowCameraExposureControl::supportedParameterRange(QCameraExposureControl::ExposureParameter parameter, + bool *continuous) const +{ + if (continuous) + *continuous = false; + + if (parameter == ShutterSpeed) + return m_supportedShutterSpeeds; + + if (parameter == Aperture) + return m_supportedApertureValues; + + if (parameter == ExposureMode) + return m_supportedExposureModes; + + return QVariantList(); +} + +QVariant DirectShowCameraExposureControl::requestedValue(QCameraExposureControl::ExposureParameter parameter) const +{ + if (parameter == ShutterSpeed) + return QVariant::fromValue(m_requestedShutterSpeed); + + if (parameter == Aperture) + return QVariant::fromValue(m_requestedAperture); + + if (parameter == ExposureMode) + return QVariant::fromValue(m_requestedExposureMode); + + return QVariant(); +} + +QVariant DirectShowCameraExposureControl::actualValue(QCameraExposureControl::ExposureParameter parameter) const +{ + if (parameter == ExposureMode) + return QVariant::fromValue(m_currentExposureMode); + + if (parameter == ShutterSpeed) { + return qFuzzyCompare(m_currentShutterSpeed, qreal(-1.0)) + ? QVariant() + : QVariant::fromValue(m_currentShutterSpeed); + } + + if (parameter == Aperture) { + return qFuzzyCompare(m_currentAperture, qreal(-1.0)) + ? QVariant() + : QVariant::fromValue(m_currentAperture); + } + + return QVariant(); +} + +bool DirectShowCameraExposureControl::setValue(QCameraExposureControl::ExposureParameter parameter, + const QVariant &value) +{ + IAMCameraControl *cameraControl = nullptr; + const DirectShowUtils::ScopedSafeRelease<IAMCameraControl> rControl { &cameraControl }; + if (!m_session->getCameraControlInterface(&cameraControl)) + return false; + + // Reset exposure mode if the value is invalid. + if (!value.isValid()) { + m_requestedExposureMode = QCameraExposure::ExposureAuto; + return setExposureMode(cameraControl, m_requestedExposureMode); + } + + if (parameter == ShutterSpeed || parameter == Aperture) { + bool ok = false; + const qreal newValue = value.toReal(&ok); + if (!ok) + return false; + + // Change the exposure mode first + setExposureMode(cameraControl, QCameraExposure::ExposureManual); + + if (parameter == ShutterSpeed) { + m_requestedShutterSpeed = newValue; + return setShutterSpeed(cameraControl, m_requestedShutterSpeed); + } else { + m_requestedAperture = newValue; + return setAperture(cameraControl, m_requestedAperture); + } + } + + if (parameter == ExposureMode) { + m_requestedExposureMode = value.value<QCameraExposure::ExposureMode>(); + return setExposureMode(cameraControl, m_requestedExposureMode); + } + + return false; +} + +void DirectShowCameraExposureControl::onStatusChanged(QCamera::Status status) +{ + const bool shouldUpdate = (qFuzzyCompare(m_currentAperture, qreal(-1.0)) && qFuzzyCompare(m_currentShutterSpeed, qreal(-1.0))); + + if (status == QCamera::LoadedStatus && shouldUpdate) + updateExposureSettings(); + + if (status == QCamera::UnloadedStatus) { + m_supportedApertureValues.clear(); + m_supportedExposureModes.clear(); + m_supportedShutterSpeeds.clear(); + m_currentAperture = qreal(-1.0); + m_currentShutterSpeed = qreal(-1.0); + m_currentExposureMode = QCameraExposure::ExposureAuto; + } +} + +void DirectShowCameraExposureControl::updateExposureSettings() +{ + IAMCameraControl *cameraControl = nullptr; + const DirectShowUtils::ScopedSafeRelease<IAMCameraControl> rControl { &cameraControl }; + if (!m_session->getCameraControlInterface(&cameraControl)) + return; + + const auto updateValues = [cameraControl](long property, + ExposureValues ¤tValues, + QVariantList ¶meterRange, + const std::function<qreal(long)> &converter, + bool *changed) -> bool { + ExposureValues values { 0, 0, 0, 0, 0 }; + if (FAILED(cameraControl->GetRange(property, + &values.minValue, + &values.maxValue, + &values.stepping, + &values.defaultValue, + &values.caps))) { + return false; + } + + const bool minValueChanged = values.minValue != currentValues.minValue; + const bool maxValueChanged = values.maxValue != currentValues.maxValue; + const bool steppingChanged = values.stepping != currentValues.stepping; + + if (minValueChanged || maxValueChanged || steppingChanged) { + parameterRange.clear(); + long nextValue = values.minValue; + while (nextValue != values.maxValue && values.stepping != 0) { + parameterRange << converter(nextValue); + nextValue += values.stepping; + } + + if (changed) + *changed = true; + } + + currentValues = values; + return true; + }; + + const auto getCurrentValue = [cameraControl](long property, const std::function<qreal(long)> &converter, qreal *value) -> bool { + long currentValue; + long currentFlags; + if (FAILED(cameraControl->Get(property, ¤tValue, ¤tFlags))) + return false; + + *value = converter(currentValue); + return true; + }; + + // Shutter speed + bool changed = false; + if (!updateValues(CameraControl_Exposure, m_shutterSpeedValues, m_supportedShutterSpeeds, convertToSec, &changed)) + qCDebug(qtDirectShowPlugin, "Unable to update the shutter speed values"); + + if (changed) + Q_EMIT parameterRangeChanged(int(ShutterSpeed)); + + if ((m_shutterSpeedValues.caps & CameraControl_Flags_Manual)) { + if (getCurrentValue(CameraControl_Exposure, convertToSec, &m_currentShutterSpeed)) { + if (m_currentExposureMode == QCameraExposure::ExposureManual) + setShutterSpeed(cameraControl, m_requestedShutterSpeed); + } else { + m_currentShutterSpeed = qreal(-1.0); + qCDebug(qtDirectShowPlugin, "Unable to get the current shutter speed!"); + } + } + + // Aperture + changed = false; + if (!updateValues(CameraControl_Iris, m_apertureValues, m_supportedApertureValues, convertToFvalue, &changed)) + qCDebug(qtDirectShowPlugin, "Unable to update the aperture values"); + + if (changed) + Q_EMIT parameterRangeChanged(int(Aperture)); + + if (getCurrentValue(CameraControl_Iris, convertToFvalue, &m_currentAperture)) { + if (m_currentExposureMode == QCameraExposure::ExposureManual) + setAperture(cameraControl, m_requestedAperture); + } else { + m_currentAperture = qreal(-1.0); + qCDebug(qtDirectShowPlugin, "Unable to get the current aperture value!"); + } + + // Update exposure modes + const bool hasAutoExposure = (m_apertureValues.caps & CameraControl_Flags_Auto) + || (m_shutterSpeedValues.caps & CameraControl_Flags_Auto); + const bool hasManualExposure = (m_apertureValues.caps & CameraControl_Flags_Manual) + || (m_shutterSpeedValues.caps & CameraControl_Flags_Manual); + + QVariantList exposureModes; + if (hasAutoExposure && !m_supportedExposureModes.contains(QVariant::fromValue(QCameraExposure::ExposureAuto))) + exposureModes << QVariant::fromValue(QCameraExposure::ExposureAuto); + + if (hasManualExposure && !m_supportedExposureModes.contains(QVariant::fromValue(QCameraExposure::ExposureManual))) + exposureModes << QVariant::fromValue(QCameraExposure::ExposureManual); + + if (!exposureModes.isEmpty() || !m_supportedExposureModes.isEmpty()) { + m_supportedExposureModes = exposureModes; + Q_EMIT parameterRangeChanged(int(ExposureMode)); + } +} + +bool DirectShowCameraExposureControl::setShutterSpeed(IAMCameraControl *cameraControl, qreal shutterSpeed) +{ + if (m_currentExposureMode != QCameraExposure::ExposureManual) { + qCDebug(qtDirectShowPlugin, "Trying to set shutter speed value while in auto exposure mode!"); + return false; + } + + if (qFuzzyCompare(m_currentShutterSpeed, shutterSpeed)) + return true; + + if ((m_shutterSpeedValues.caps & CameraControl_Flags_Manual) == 0) + return false; + + if (!m_supportedShutterSpeeds.contains(QVariant::fromValue(shutterSpeed))) + return false; + + if (qFuzzyIsNull(shutterSpeed) || (shutterSpeed < qreal(0.0))) + return false; + + const long newValue = long(log2(shutterSpeed)); + if (FAILED(cameraControl->Set(CameraControl_Exposure, newValue, CameraControl_Flags_Manual))) { + qCDebug(qtDirectShowPlugin, "Unable to set shutter speed value to: %d", int(shutterSpeed)); + return false; + } + + m_currentShutterSpeed = shutterSpeed; + Q_EMIT actualValueChanged(int(ShutterSpeed)); + return true; +} + +bool DirectShowCameraExposureControl::setAperture(IAMCameraControl *cameraControl, qreal aperture) +{ + if (m_currentExposureMode != QCameraExposure::ExposureManual) { + qCDebug(qtDirectShowPlugin, "Trying to set aperture value while in auto exposure mode!"); + return false; + } + + if (qFuzzyCompare(m_currentAperture, aperture)) + return true; + + if ((m_apertureValues.caps & CameraControl_Flags_Manual) == 0) + return false; + + if (!m_supportedApertureValues.contains(QVariant::fromValue(aperture))) + return false; + + if (aperture < qreal(0.0)) + return false; + + const long newValue = long(10 * aperture); + if (FAILED(cameraControl->Set(CameraControl_Iris, newValue, CameraControl_Flags_Manual))) { + qCDebug(qtDirectShowPlugin, "Unable to set aperture value to: %d", int(aperture)); + return false; + } + + m_currentAperture = aperture; + Q_EMIT actualValueChanged(int(Aperture)); + + return true; +} + +bool DirectShowCameraExposureControl::setExposureMode(IAMCameraControl *cameraControl, QCameraExposure::ExposureMode mode) +{ + if (m_currentExposureMode == mode) + return true; + + bool exposureModeChanged = true; + + // Set auto exposure mode + if (mode == QCameraExposure::ExposureAuto) { + if ((m_apertureValues.caps & CameraControl_Flags_Auto) + && FAILED(cameraControl->Set(CameraControl_Iris, 0, CameraControl_Flags_Auto))) { + qCDebug(qtDirectShowPlugin, "Setting auto exposure mode failed!"); + exposureModeChanged = false; + } + + if ((m_shutterSpeedValues.caps & CameraControl_Flags_Auto) + && FAILED(cameraControl->Set(CameraControl_Exposure, 0, CameraControl_Flags_Auto))) { + qCDebug(qtDirectShowPlugin, "Setting auto exposure mode failed"); + exposureModeChanged = false; + } + + if (exposureModeChanged) { + m_currentExposureMode = mode; + Q_EMIT actualValueChanged(int(ExposureMode)); + } + + return exposureModeChanged; + } + + // Change the current exposure mode to manual first. + m_currentExposureMode = QCameraExposure::ExposureManual; + + const qreal newShutterSpeed = qFuzzyCompare(m_requestedShutterSpeed, -1.0) + ? convertToSec(m_shutterSpeedValues.defaultValue) + : m_requestedShutterSpeed; + if ((m_shutterSpeedValues.caps & CameraControl_Flags_Manual)) + setShutterSpeed(cameraControl, newShutterSpeed); + + const qreal newAperture = qFuzzyCompare(m_requestedAperture, -1.0) + ? convertToFvalue(m_apertureValues.defaultValue) + : m_requestedAperture; + if ((m_apertureValues.caps & CameraControl_Flags_Manual)) + setAperture(cameraControl, newAperture); + + + // Check if any of the values changed. + exposureModeChanged = (qFuzzyCompare(m_currentShutterSpeed, newShutterSpeed) + || qFuzzyCompare(m_currentAperture, newAperture)); + + if (exposureModeChanged) + Q_EMIT actualValueChanged(int(ExposureMode)); + + return exposureModeChanged; +} + +QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/directshowcameraexposurecontrol.h b/src/plugins/directshow/camera/directshowcameraexposurecontrol.h new file mode 100644 index 000000000..db3fc5984 --- /dev/null +++ b/src/plugins/directshow/camera/directshowcameraexposurecontrol.h @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef DIRECTSHOWCAMERAEXPOSURECONTROL_H +#define DIRECTSHOWCAMERAEXPOSURECONTROL_H + +#include <QtMultimedia/qcameraexposurecontrol.h> + +struct IAMCameraControl; + +QT_BEGIN_NAMESPACE + +class DSCameraSession; + +class DirectShowCameraExposureControl : public QCameraExposureControl +{ + Q_OBJECT +public: + DirectShowCameraExposureControl(DSCameraSession *session); + + bool isParameterSupported(ExposureParameter parameter) const override; + QVariantList supportedParameterRange(ExposureParameter parameter, bool *continuous) const override; + QVariant requestedValue(ExposureParameter parameter) const override; + QVariant actualValue(ExposureParameter parameter) const override; + bool setValue(ExposureParameter parameter, const QVariant &value) override; + +private Q_SLOTS: + void onStatusChanged(QCamera::Status status); + +private: + DSCameraSession *m_session; + + struct ExposureValues + { + long caps; + long minValue; + long maxValue; + long stepping; + long defaultValue; + } m_shutterSpeedValues, m_apertureValues; + + qreal m_requestedShutterSpeed; + qreal m_currentShutterSpeed; + + qreal m_requestedAperture; + qreal m_currentAperture; + + QVariantList m_supportedShutterSpeeds; + QVariantList m_supportedApertureValues; + QVariantList m_supportedExposureModes; + + QCameraExposure::ExposureMode m_requestedExposureMode; + QCameraExposure::ExposureMode m_currentExposureMode; + + void updateExposureSettings(); + + bool setShutterSpeed(IAMCameraControl *cameraControl, qreal shutterSpeed); + bool setAperture(IAMCameraControl *cameraControl, qreal aperture); + bool setExposureMode(IAMCameraControl *cameraControl, QCameraExposure::ExposureMode mode); +}; + +QT_END_NAMESPACE + +#endif // DIRECTSHOWCAMERAEXPOSURECONTROL_H diff --git a/src/plugins/directshow/camera/directshowcamerazoomcontrol.cpp b/src/plugins/directshow/camera/directshowcamerazoomcontrol.cpp new file mode 100644 index 000000000..209cb5d96 --- /dev/null +++ b/src/plugins/directshow/camera/directshowcamerazoomcontrol.cpp @@ -0,0 +1,209 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "directshowcamerazoomcontrol.h" +#include "dscamerasession.h" +#include "directshowutils.h" + +QT_BEGIN_NAMESPACE + +inline static qreal defaultZoomValue() { return qreal(1.0); } + +DirectShowCameraZoomControl::DirectShowCameraZoomControl(DSCameraSession *session) + : m_session(session) + , m_opticalZoom({0, 0, 0, 0, 0}) + , m_currentOpticalZoom(qreal(0.0)) + , m_requestedOpticalZoom(qreal(0.0)) + , m_maxOpticalZoom(qreal(1.0)) +{ + Q_ASSERT(m_session); + connect(m_session, &DSCameraSession::statusChanged, + this, &DirectShowCameraZoomControl::onStatusChanged); +} + +qreal DirectShowCameraZoomControl::maximumOpticalZoom() const +{ + return m_maxOpticalZoom; +} + +qreal DirectShowCameraZoomControl::maximumDigitalZoom() const +{ + return defaultZoomValue(); +} + +qreal DirectShowCameraZoomControl::requestedOpticalZoom() const +{ + return qMax(defaultZoomValue(), m_requestedOpticalZoom); +} + +qreal DirectShowCameraZoomControl::requestedDigitalZoom() const +{ + return defaultZoomValue(); +} + +qreal DirectShowCameraZoomControl::currentOpticalZoom() const +{ + return qMax(defaultZoomValue(), m_currentOpticalZoom); +} + +qreal DirectShowCameraZoomControl::currentDigitalZoom() const +{ + return defaultZoomValue(); +} + +void DirectShowCameraZoomControl::zoomTo(qreal optical, qreal digital) +{ + Q_UNUSED(digital); + if (!(m_opticalZoom.caps & CameraControl_Flags_Manual)) + return; + + if (qFuzzyCompare(optical, m_requestedOpticalZoom)) + return; + + m_requestedOpticalZoom = optical; + Q_EMIT requestedOpticalZoomChanged(m_requestedOpticalZoom); + + if (qFuzzyCompare(m_requestedOpticalZoom, m_currentOpticalZoom)) + return; + + if (m_session->status() != QCamera::LoadedStatus && m_session->status() != QCamera::ActiveStatus) + return; // We'll wait until the camera is loaded, see: statusChanged connection + + opticalZoomToPrivate(optical); +} + +void DirectShowCameraZoomControl::onStatusChanged(QCamera::Status status) +{ + if (status == QCamera::LoadedStatus) { + updateZoomValues(); + } else if (status == QCamera::UnloadedStatus) { + SecureZeroMemory(&m_opticalZoom, sizeof(ZoomValues)); + m_currentOpticalZoom = qreal(0.0); + m_requestedOpticalZoom = qreal(0.0); + } + +} + +void DirectShowCameraZoomControl::updateZoomValues() +{ + IAMCameraControl *cameraControl = nullptr; + const DirectShowUtils::ScopedSafeRelease<IAMCameraControl> rControl { &cameraControl }; + if (!m_session->getCameraControlInterface(&cameraControl)) + return; + + ZoomValues values { 0, 0, 0, 0, 0 }; + // Zoom levels in DS are in the range [10, 600] + // The default zoom is device specific. + HRESULT hr = cameraControl->GetRange(CameraControl_Zoom, + &values.minZoom, + &values.maxZoom, + &values.stepping, + &values.defaultZoom, + &values.caps); + + if (FAILED(hr)) { + qCDebug(qtDirectShowPlugin, "Getting the camera's zoom properties failed"); + SecureZeroMemory(&m_opticalZoom, sizeof(ZoomValues)); + return; + } + + if (!(values.caps & CameraControl_Flags_Manual)) { + qCDebug(qtDirectShowPlugin, "Camera does not support manual zoom"); + SecureZeroMemory(&m_opticalZoom, sizeof(ZoomValues)); + return; + } + + if (values.maxZoom != m_opticalZoom.maxZoom) { + const qreal newMaxZoomScale = (values.minZoom == 0) ? defaultZoomValue() + : (qreal(values.maxZoom) / qreal(values.minZoom)); + if (!qFuzzyCompare(newMaxZoomScale, m_maxOpticalZoom)) { + m_maxOpticalZoom = newMaxZoomScale; + Q_EMIT maximumOpticalZoomChanged(m_maxOpticalZoom); + } + } + + m_opticalZoom = values; + + long currentZoom = 0; + long flags = 0; + if (FAILED(cameraControl->Get(CameraControl_Zoom, ¤tZoom, &flags))) { + qCDebug(qtDirectShowPlugin, "Getting the camera's current zoom value failed!"); + return; + } + + qreal currentOpticalZoom = (m_opticalZoom.minZoom == 0) ? defaultZoomValue() + : (qreal(currentZoom) / qreal(m_opticalZoom.minZoom)); + currentOpticalZoom = qMax(defaultZoomValue(), currentOpticalZoom); + if (!qFuzzyCompare(m_currentOpticalZoom, currentOpticalZoom)) { + m_currentOpticalZoom = currentOpticalZoom; + Q_EMIT currentOpticalZoomChanged(m_currentOpticalZoom); + } + + // Check if there is a pending zoom value. + if (!qFuzzyCompare(m_currentOpticalZoom, m_requestedOpticalZoom)) + opticalZoomToPrivate(m_requestedOpticalZoom); +} + +bool DirectShowCameraZoomControl::opticalZoomToPrivate(qreal scaleFactor) +{ + IAMCameraControl *cameraControl = nullptr; + const DirectShowUtils::ScopedSafeRelease<IAMCameraControl> rControl { &cameraControl }; + if (!m_session->getCameraControlInterface(&cameraControl)) + return false; + + // Convert to DS zoom value + const int newDSOpticalZoom = qRound(m_opticalZoom.minZoom * scaleFactor); + long newDSOpticalZoomAdjusted = newDSOpticalZoom - (newDSOpticalZoom % m_opticalZoom.stepping); + newDSOpticalZoomAdjusted = qBound(m_opticalZoom.minZoom, newDSOpticalZoomAdjusted, m_opticalZoom.maxZoom); + + if (FAILED(cameraControl->Set(CameraControl_Zoom, newDSOpticalZoomAdjusted, CameraControl_Flags_Manual))) { + qCDebug(qtDirectShowPlugin, "Setting the camera's zoom value failed"); + return false; + } + + const qreal newScaleFactor = (m_opticalZoom.minZoom == 0) ? defaultZoomValue() + : (qreal(newDSOpticalZoomAdjusted) / qreal(m_opticalZoom.minZoom)); + // convert back to Qt scale value + m_currentOpticalZoom = qMax(defaultZoomValue(), newScaleFactor); + Q_EMIT currentOpticalZoomChanged(m_currentOpticalZoom); + + return true; +} + +QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/directshowcamerazoomcontrol.h b/src/plugins/directshow/camera/directshowcamerazoomcontrol.h new file mode 100644 index 000000000..f6fb05b0e --- /dev/null +++ b/src/plugins/directshow/camera/directshowcamerazoomcontrol.h @@ -0,0 +1,88 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef DIRECTSHOWCAMERAZOOMCONTROL_H +#define DIRECTSHOWCAMERAZOOMCONTROL_H + +#include <QtMultimedia/qcamerazoomcontrol.h> +#include <QtMultimedia/qcamera.h> + +QT_BEGIN_NAMESPACE + +class DSCameraSession; + +class DirectShowCameraZoomControl : public QCameraZoomControl +{ + Q_OBJECT +public: + DirectShowCameraZoomControl(DSCameraSession *session); + + qreal maximumOpticalZoom() const override; + qreal maximumDigitalZoom() const override; + qreal requestedOpticalZoom() const override; + qreal requestedDigitalZoom() const override; + qreal currentOpticalZoom() const override; + qreal currentDigitalZoom() const override; + void zoomTo(qreal optical, qreal digital) override; + +private Q_SLOTS: + void onStatusChanged(QCamera::Status status); + +private: + DSCameraSession *m_session; + struct ZoomValues + { + long maxZoom; + long minZoom; + long stepping; + long defaultZoom; + long caps; + } m_opticalZoom; + + qreal m_currentOpticalZoom; + qreal m_requestedOpticalZoom; + qreal m_maxOpticalZoom; + + void updateZoomValues(); + bool opticalZoomToPrivate(qreal value); +}; + +QT_END_NAMESPACE + +#endif // DIRECTSHOWCAMERAZOOMCONTROL_H diff --git a/src/plugins/directshow/camera/dscameraservice.cpp b/src/plugins/directshow/camera/dscameraservice.cpp index 836f1aaa5..a806cabe3 100644 --- a/src/plugins/directshow/camera/dscameraservice.cpp +++ b/src/plugins/directshow/camera/dscameraservice.cpp @@ -48,19 +48,29 @@ #include "dsimagecapturecontrol.h" #include "dscameraviewfindersettingscontrol.h" #include "dscameraimageprocessingcontrol.h" +#include "directshowcameraexposurecontrol.h" +#include "directshowcameracapturedestinationcontrol.h" +#include "directshowcameracapturebufferformatcontrol.h" +#include "directshowvideoprobecontrol.h" +#include "directshowcamerazoomcontrol.h" QT_BEGIN_NAMESPACE DSCameraService::DSCameraService(QObject *parent): QMediaService(parent) + , m_session(new DSCameraSession(this)) + , m_control(new DSCameraControl(m_session)) + , m_videoDevice(new DSVideoDeviceControl(m_session)) , m_videoRenderer(0) + , m_imageCapture(new DSImageCaptureControl(m_session)) + , m_viewfinderSettings(new DSCameraViewfinderSettingsControl(m_session)) + , m_imageProcessingControl(new DSCameraImageProcessingControl(m_session)) + , m_exposureControl(new DirectShowCameraExposureControl(m_session)) + , m_captureDestinationControl(new DirectShowCameraCaptureDestinationControl(m_session)) + , m_captureBufferFormatControl(new DirectShowCameraCaptureBufferFormatControl) + , m_videoProbeControl(nullptr) + , m_zoomControl(new DirectShowCameraZoomControl(m_session)) { - m_session = new DSCameraSession(this); - m_control = new DSCameraControl(m_session); - m_videoDevice = new DSVideoDeviceControl(m_session); - m_imageCapture = new DSImageCaptureControl(m_session); - m_viewfinderSettings = new DSCameraViewfinderSettingsControl(m_session); - m_imageProcessingControl = new DSCameraImageProcessingControl(m_session); } DSCameraService::~DSCameraService() @@ -72,6 +82,11 @@ DSCameraService::~DSCameraService() delete m_videoRenderer; delete m_imageCapture; delete m_session; + delete m_exposureControl; + delete m_captureDestinationControl; + delete m_captureBufferFormatControl; + delete m_videoProbeControl; + delete m_zoomControl; } QMediaControl* DSCameraService::requestControl(const char *name) @@ -98,6 +113,27 @@ QMediaControl* DSCameraService::requestControl(const char *name) if (qstrcmp(name, QCameraImageProcessingControl_iid) == 0) return m_imageProcessingControl; + if (qstrcmp(name, QCameraExposureControl_iid) == 0) + return m_exposureControl; + + if (qstrcmp(name, QCameraCaptureDestinationControl_iid) == 0) + return m_captureDestinationControl; + + if (qstrcmp(name, QCameraCaptureBufferFormatControl_iid) == 0) + return m_captureBufferFormatControl; + + if (qstrcmp(name, QMediaVideoProbeControl_iid) == 0) { + if (!m_videoProbeControl) + m_videoProbeControl = new DirectShowVideoProbeControl; + + m_videoProbeControl->ref(); + m_session->addVideoProbe(m_videoProbeControl); + return m_videoProbeControl; + } + + if (qstrcmp(name, QCameraZoomControl_iid) == 0) + return m_zoomControl; + return 0; } @@ -108,6 +144,14 @@ void DSCameraService::releaseControl(QMediaControl *control) m_videoRenderer = 0; return; } + + if (control == m_videoProbeControl) { + m_session->removeVideoProbe(m_videoProbeControl); + if (!m_videoProbeControl->deref()) { + delete m_videoProbeControl; + m_videoProbeControl = nullptr; + } + } } QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/dscameraservice.h b/src/plugins/directshow/camera/dscameraservice.h index 8976e41cf..f444eeb51 100644 --- a/src/plugins/directshow/camera/dscameraservice.h +++ b/src/plugins/directshow/camera/dscameraservice.h @@ -52,6 +52,11 @@ class DSVideoDeviceControl; class DSImageCaptureControl; class DSCameraViewfinderSettingsControl; class DSCameraImageProcessingControl; +class DirectShowCameraExposureControl; +class DirectShowCameraCaptureDestinationControl; +class DirectShowCameraCaptureBufferFormatControl; +class DirectShowVideoProbeControl; +class DirectShowCameraZoomControl; class DSCameraService : public QMediaService { @@ -65,13 +70,18 @@ public: virtual void releaseControl(QMediaControl *control); private: - DSCameraControl *m_control; DSCameraSession *m_session; + DSCameraControl *m_control; DSVideoDeviceControl *m_videoDevice; QMediaControl *m_videoRenderer; DSImageCaptureControl *m_imageCapture; DSCameraViewfinderSettingsControl *m_viewfinderSettings; DSCameraImageProcessingControl *m_imageProcessingControl; + DirectShowCameraExposureControl *m_exposureControl; + DirectShowCameraCaptureDestinationControl *m_captureDestinationControl; + DirectShowCameraCaptureBufferFormatControl *m_captureBufferFormatControl; + DirectShowVideoProbeControl *m_videoProbeControl; + DirectShowCameraZoomControl *m_zoomControl; }; QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/dscamerasession.cpp b/src/plugins/directshow/camera/dscamerasession.cpp index dc0dfc8b3..9b642872a 100644 --- a/src/plugins/directshow/camera/dscamerasession.cpp +++ b/src/plugins/directshow/camera/dscamerasession.cpp @@ -51,24 +51,27 @@ #include "directshowcameraglobal.h" #include "directshowmediatype.h" #include "directshowutils.h" +#include "directshowvideoprobecontrol.h" QT_BEGIN_NAMESPACE DSCameraSession::DSCameraSession(QObject *parent) : QObject(parent) - , m_graphBuilder(Q_NULLPTR) - , m_filterGraph(Q_NULLPTR) + , m_graphBuilder(nullptr) + , m_filterGraph(nullptr) , m_sourceDeviceName(QLatin1String("default")) - , m_sourceFilter(Q_NULLPTR) + , m_sourceFilter(nullptr) , m_needsHorizontalMirroring(false) - , m_previewSampleGrabber(Q_NULLPTR) - , m_nullRendererFilter(Q_NULLPTR) + , m_previewSampleGrabber(nullptr) + , m_nullRendererFilter(nullptr) , m_previewStarted(false) - , m_surface(Q_NULLPTR) + , m_surface(nullptr) , m_previewPixelFormat(QVideoFrame::Format_Invalid) , m_readyForCapture(false) , m_imageIdCounter(0) , m_currentImageId(-1) + , m_captureDestinations(QCameraImageCapture::CaptureToFile) + , m_videoProbeControl(nullptr) , m_status(QCamera::UnloadedStatus) { connect(this, SIGNAL(statusChanged(QCamera::Status)), @@ -354,6 +357,39 @@ bool DSCameraSession::getCameraControlInterface(IAMCameraControl **cameraControl return true; } +bool DSCameraSession::isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const +{ + return destination & (QCameraImageCapture::CaptureToFile | QCameraImageCapture::CaptureToBuffer); +} + +QCameraImageCapture::CaptureDestinations DSCameraSession::captureDestination() const +{ + return m_captureDestinations; +} + +void DSCameraSession::setCaptureDestination(QCameraImageCapture::CaptureDestinations destinations) +{ + if (m_captureDestinations == destinations) + return; + + m_captureDestinations = destinations; + Q_EMIT captureDestinationChanged(m_captureDestinations); +} + +void DSCameraSession::addVideoProbe(DirectShowVideoProbeControl *probe) +{ + const QMutexLocker locker(&m_probeMutex); + m_videoProbeControl = probe; +} + +void DSCameraSession::removeVideoProbe(DirectShowVideoProbeControl *probe) +{ + Q_UNUSED(probe); + Q_ASSERT(m_videoProbeControl == probe); + const QMutexLocker locker(&m_probeMutex); + m_videoProbeControl = nullptr; +} + bool DSCameraSession::load() { unload(); @@ -547,6 +583,12 @@ void DSCameraSession::onFrameAvailable(double time, const QByteArray &data) m_presentMutex.unlock(); + { + const QMutexLocker locker(&m_probeMutex); + if (m_currentFrame.isValid() && m_videoProbeControl) + Q_EMIT m_videoProbeControl->videoFrameProbed(m_currentFrame); + } + // Image capture QMutexLocker locker(&m_captureMutex); if (m_currentImageId != -1 && !m_capturedFrame.isValid()) { @@ -586,8 +628,8 @@ void DSCameraSession::presentFrame() m_capturedFrame.unmap(); - QtConcurrent::run(this, &DSCameraSession::saveCapturedImage, - m_currentImageId, captureImage, m_imageCaptureFileName); + QtConcurrent::run(this, &DSCameraSession::processCapturedImage, + m_currentImageId, m_captureDestinations, captureImage, m_imageCaptureFileName); m_imageCaptureFileName.clear(); m_currentImageId = -1; @@ -603,14 +645,22 @@ void DSCameraSession::presentFrame() updateReadyForCapture(); } -void DSCameraSession::saveCapturedImage(int id, const QImage &image, const QString &path) +void DSCameraSession::processCapturedImage(int id, + QCameraImageCapture::CaptureDestinations captureDestinations, + const QImage &image, + const QString &path) { - if (image.save(path, "JPG")) { - emit imageSaved(id, path); - } else { - emit captureError(id, QCameraImageCapture::ResourceError, - tr("Could not save image to file.")); + if (captureDestinations & QCameraImageCapture::CaptureToFile) { + if (image.save(path, "JPG")) { + Q_EMIT imageSaved(id, path); + } else { + Q_EMIT captureError(id, QCameraImageCapture::ResourceError, + tr("Could not save image to file.")); + } } + + if (captureDestinations & QCameraImageCapture::CaptureToBuffer) + Q_EMIT imageAvailable(id, QVideoFrame(image)); } bool DSCameraSession::createFilterGraph() diff --git a/src/plugins/directshow/camera/dscamerasession.h b/src/plugins/directshow/camera/dscamerasession.h index 90407f49e..e28015534 100644 --- a/src/plugins/directshow/camera/dscamerasession.h +++ b/src/plugins/directshow/camera/dscamerasession.h @@ -50,6 +50,7 @@ #include <QtMultimedia/qabstractvideosurface.h> #include <QtMultimedia/qvideosurfaceformat.h> #include <QtMultimedia/qcameraimageprocessingcontrol.h> +#include <QtMultimedia/qcameraimagecapture.h> #include <private/qmediastoragelocation_p.h> #include <tchar.h> @@ -76,6 +77,7 @@ struct ICaptureGraphBuilder2; QT_BEGIN_NAMESPACE class DirectShowSampleGrabber; +class DirectShowVideoProbeControl; class DSCameraSession : public QObject { @@ -120,13 +122,22 @@ public: bool getCameraControlInterface(IAMCameraControl **cameraControl) const; + bool isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const; + QCameraImageCapture::CaptureDestinations captureDestination() const; + void setCaptureDestination(QCameraImageCapture::CaptureDestinations destinations); + + void addVideoProbe(DirectShowVideoProbeControl *probe); + void removeVideoProbe(DirectShowVideoProbeControl *probe); + Q_SIGNALS: void statusChanged(QCamera::Status); void imageExposed(int id); void imageCaptured(int id, const QImage &preview); void imageSaved(int id, const QString &fileName); + void imageAvailable(int id, const QVideoFrame &buffer); void readyForCaptureChanged(bool); void captureError(int id, int error, const QString &errorString); + void captureDestinationChanged(QCameraImageCapture::CaptureDestinations); private Q_SLOTS: void presentFrame(); @@ -157,7 +168,7 @@ private: void setStatus(QCamera::Status status); void onFrameAvailable(double time, const QByteArray &data); - void saveCapturedImage(int id, const QImage &image, const QString &path); + void processCapturedImage(int id, QCameraImageCapture::CaptureDestinations captureDestinations, const QImage &image, const QString &path); bool createFilterGraph(); bool connectGraph(); @@ -208,6 +219,11 @@ private: int m_imageIdCounter; int m_currentImageId; QVideoFrame m_capturedFrame; + QCameraImageCapture::CaptureDestinations m_captureDestinations; + + // Video probe + QMutex m_probeMutex; + DirectShowVideoProbeControl *m_videoProbeControl; // Internal state QCamera::Status m_status; diff --git a/src/plugins/directshow/camera/dsimagecapturecontrol.cpp b/src/plugins/directshow/camera/dsimagecapturecontrol.cpp index 9d4a7ea1d..c92ce98e1 100644 --- a/src/plugins/directshow/camera/dsimagecapturecontrol.cpp +++ b/src/plugins/directshow/camera/dsimagecapturecontrol.cpp @@ -57,6 +57,8 @@ DSImageCaptureControl::DSImageCaptureControl(DSCameraSession *session) this, SIGNAL(readyForCaptureChanged(bool))); connect(m_session, SIGNAL(captureError(int,int,QString)), this, SIGNAL(error(int,int,QString))); + connect(m_session, &DSCameraSession::imageAvailable, + this, &DSImageCaptureControl::imageAvailable); } DSImageCaptureControl::~DSImageCaptureControl() diff --git a/src/plugins/directshow/directshow.pro b/src/plugins/directshow/directshow.pro index 2857f87d9..54d617166 100644 --- a/src/plugins/directshow/directshow.pro +++ b/src/plugins/directshow/directshow.pro @@ -8,7 +8,13 @@ win32:!qtHaveModule(opengl)|qtConfig(dynamicgl) { HEADERS += dsserviceplugin.h SOURCES += dsserviceplugin.cpp -mingw: DEFINES += NO_DSHOW_STRSAFE +# Remove WINVER/_WIN32_WINNT definitions added to qt_build_config.prf +# by qtbase/d57a7c41712f8627a462d893329dc3f0dbb52d32 since the multimedia +# headers of MinGW 5.3/7.1 are too broken to compile with 0x0601. +mingw { + DEFINES -= WINVER=0x0601 _WIN32_WINNT=0x0601 + DEFINES += NO_DSHOW_STRSAFE +} include(common/common.pri) qtConfig(directshow-player): include(player/player.pri) diff --git a/src/plugins/directshow/dsserviceplugin.cpp b/src/plugins/directshow/dsserviceplugin.cpp index 51be7e500..cb4f0cdf9 100644 --- a/src/plugins/directshow/dsserviceplugin.cpp +++ b/src/plugins/directshow/dsserviceplugin.cpp @@ -123,7 +123,9 @@ QMediaServiceProviderHint::Features DSServicePlugin::supportedFeatures( QByteArray DSServicePlugin::defaultDevice(const QByteArray &service) const { if (service == Q_MEDIASERVICE_CAMERA) { + addRefCount(); const QList<DSVideoDeviceInfo> &devs = DSVideoDeviceControl::availableDevices(); + releaseRefCount(); if (!devs.isEmpty()) return devs.first().first; } @@ -135,7 +137,9 @@ QList<QByteArray> DSServicePlugin::devices(const QByteArray &service) const QList<QByteArray> result; if (service == Q_MEDIASERVICE_CAMERA) { + addRefCount(); const QList<DSVideoDeviceInfo> &devs = DSVideoDeviceControl::availableDevices(); + releaseRefCount(); for (const DSVideoDeviceInfo &info : devs) result.append(info.first); } @@ -146,7 +150,9 @@ QList<QByteArray> DSServicePlugin::devices(const QByteArray &service) const QString DSServicePlugin::deviceDescription(const QByteArray &service, const QByteArray &device) { if (service == Q_MEDIASERVICE_CAMERA) { + addRefCount(); const QList<DSVideoDeviceInfo> &devs = DSVideoDeviceControl::availableDevices(); + releaseRefCount(); for (const DSVideoDeviceInfo &info : devs) { if (info.first == device) return info.second; diff --git a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp index 40f77e899..ee7f5ec9e 100644 --- a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp +++ b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp @@ -63,7 +63,7 @@ DirectShowVideoRendererControl::~DirectShowVideoRendererControl() { #if QT_CONFIG(evr) if (m_evrPresenter) { - m_evrPresenter->setSurface(Q_NULLPTR); + m_evrPresenter->setSurface(nullptr); m_evrPresenter->Release(); } #endif @@ -83,7 +83,7 @@ void DirectShowVideoRendererControl::setSurface(QAbstractVideoSurface *surface) #if QT_CONFIG(evr) if (m_evrPresenter) { - m_evrPresenter->setSurface(Q_NULLPTR); + m_evrPresenter->setSurface(nullptr); m_evrPresenter->Release(); m_evrPresenter = 0; } diff --git a/src/plugins/gstreamer/camerabin/camerabinimageprocessing.cpp b/src/plugins/gstreamer/camerabin/camerabinimageprocessing.cpp index f819c9f24..9d281e10c 100644 --- a/src/plugins/gstreamer/camerabin/camerabinimageprocessing.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinimageprocessing.cpp @@ -58,7 +58,7 @@ CameraBinImageProcessing::CameraBinImageProcessing(CameraBinSession *session) , m_session(session) , m_whiteBalanceMode(QCameraImageProcessing::WhiteBalanceAuto) #if QT_CONFIG(linux_v4l) - , m_v4lImageControl(Q_NULLPTR) + , m_v4lImageControl(nullptr) #endif { #if QT_CONFIG(gstreamer_photography) diff --git a/src/plugins/gstreamer/camerabin/camerabinserviceplugin.cpp b/src/plugins/gstreamer/camerabin/camerabinserviceplugin.cpp index 2d3c7c2ea..4f45a0a2f 100644 --- a/src/plugins/gstreamer/camerabin/camerabinserviceplugin.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinserviceplugin.cpp @@ -74,7 +74,7 @@ QMediaService* CameraBinServicePlugin::create(const QString &key) "GStreamer %u.%u." "\nPlease install the 'bad' GStreamer plugin package.", major, minor); - return Q_NULLPTR; + return nullptr; } return new CameraBinService(sourceFactory()); diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp index f06d95ea3..823cfe408 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp @@ -466,6 +466,9 @@ GstElement *CameraBinSession::buildCameraSource() #if CAMERABIN_DEBUG qDebug() << Q_FUNC_INFO; #endif + if (m_inputDevice.isEmpty()) + return nullptr; + if (!m_inputDeviceHasChanged) return m_cameraSrc; @@ -482,7 +485,7 @@ GstElement *CameraBinSession::buildCameraSource() if (!m_cameraSrc) m_cameraSrc = camSrc; - if (m_cameraSrc && !m_inputDevice.isEmpty()) { + if (m_cameraSrc) { #if CAMERABIN_DEBUG qDebug() << "set camera device" << m_inputDevice; #endif @@ -729,21 +732,18 @@ void CameraBinSession::setState(QCamera::State newState) if (newState == m_pendingState) return; - emit pendingStateChanged(newState); + m_pendingState = newState; + emit pendingStateChanged(m_pendingState); #if CAMERABIN_DEBUG qDebug() << Q_FUNC_INFO << newState; #endif setStateHelper(newState); - m_pendingState = newState; } void CameraBinSession::setStateHelper(QCamera::State state) { - if (state == m_pendingState) - return; - switch (state) { case QCamera::UnloadedState: unload(); diff --git a/src/plugins/gstreamer/common.pri b/src/plugins/gstreamer/common.pri index cbe87be4f..d0c5c7bdd 100644 --- a/src/plugins/gstreamer/common.pri +++ b/src/plugins/gstreamer/common.pri @@ -1,12 +1,10 @@ -QT += core-private multimedia-private network +QT += core-private multimedia-private multimediagsttools-private network qtHaveModule(widgets) { QT += widgets multimediawidgets-private DEFINES += HAVE_WIDGETS } -LIBS += -lqgsttools_p - QMAKE_USE += gstreamer qtConfig(resourcepolicy): \ diff --git a/src/plugins/opensles/qopenslesaudiooutput.cpp b/src/plugins/opensles/qopenslesaudiooutput.cpp index 70d77a380..0b1f444bd 100644 --- a/src/plugins/opensles/qopenslesaudiooutput.cpp +++ b/src/plugins/opensles/qopenslesaudiooutput.cpp @@ -69,13 +69,13 @@ QOpenSLESAudioOutput::QOpenSLESAudioOutput(const QByteArray &device) : m_deviceName(device), m_state(QAudio::StoppedState), m_error(QAudio::NoError), - m_outputMixObject(Q_NULLPTR), - m_playerObject(Q_NULLPTR), - m_playItf(Q_NULLPTR), - m_volumeItf(Q_NULLPTR), - m_bufferQueueItf(Q_NULLPTR), - m_audioSource(Q_NULLPTR), - m_buffers(Q_NULLPTR), + m_outputMixObject(nullptr), + m_playerObject(nullptr), + m_playItf(nullptr), + m_volumeItf(nullptr), + m_bufferQueueItf(nullptr), + m_audioSource(nullptr), + m_buffers(nullptr), m_volume(1.0), m_pullMode(false), m_nextBuffer(0), @@ -157,7 +157,7 @@ QIODevice *QOpenSLESAudioOutput::start() stop(); if (!preparePlayer()) - return Q_NULLPTR; + return nullptr; m_pullMode = false; m_processedBytes = 0; @@ -458,8 +458,8 @@ bool QOpenSLESAudioOutput::preparePlayer() if (SL_RESULT_SUCCESS != (*engine)->CreateOutputMix(engine, &m_outputMixObject, 0, - Q_NULLPTR, - Q_NULLPTR)) { + nullptr, + nullptr)) { qWarning() << "Unable to create output mix"; setError(QAudio::FatalError); return false; @@ -472,7 +472,7 @@ bool QOpenSLESAudioOutput::preparePlayer() } SLDataLocator_OutputMix outputMixLocator = { SL_DATALOCATOR_OUTPUTMIX, m_outputMixObject }; - SLDataSink audioSink = { &outputMixLocator, Q_NULLPTR }; + SLDataSink audioSink = { &outputMixLocator, nullptr }; #ifndef ANDROID const int iids = 2; @@ -598,28 +598,28 @@ void QOpenSLESAudioOutput::destroyPlayer() if (m_playerObject) { (*m_playerObject)->Destroy(m_playerObject); - m_playerObject = Q_NULLPTR; + m_playerObject = nullptr; } if (m_outputMixObject) { (*m_outputMixObject)->Destroy(m_outputMixObject); - m_outputMixObject = Q_NULLPTR; + m_outputMixObject = nullptr; } if (!m_pullMode && m_audioSource) { m_audioSource->close(); delete m_audioSource; - m_audioSource = Q_NULLPTR; + m_audioSource = nullptr; } delete [] m_buffers; - m_buffers = Q_NULLPTR; + m_buffers = nullptr; m_processedBytes = 0; m_nextBuffer = 0; m_availableBuffers.storeRelease(BUFFER_COUNT); - m_playItf = Q_NULLPTR; - m_volumeItf = Q_NULLPTR; - m_bufferQueueItf = Q_NULLPTR; + m_playItf = nullptr; + m_volumeItf = nullptr; + m_bufferQueueItf = nullptr; m_startRequiresInit = true; } @@ -630,7 +630,7 @@ void QOpenSLESAudioOutput::stopPlayer() if (m_audioSource && !m_pullMode) { m_audioSource->close(); delete m_audioSource; - m_audioSource = Q_NULLPTR; + m_audioSource = nullptr; } // We need to change the state manually... diff --git a/src/plugins/opensles/qopenslesaudiooutput.h b/src/plugins/opensles/qopenslesaudiooutput.h index 4c724dca6..b480f00e6 100644 --- a/src/plugins/opensles/qopenslesaudiooutput.h +++ b/src/plugins/opensles/qopenslesaudiooutput.h @@ -57,30 +57,30 @@ public: QOpenSLESAudioOutput(const QByteArray &device); ~QOpenSLESAudioOutput(); - void start(QIODevice *device) Q_DECL_OVERRIDE; - QIODevice *start() Q_DECL_OVERRIDE; - void stop() Q_DECL_OVERRIDE; - void reset() Q_DECL_OVERRIDE; - void suspend() Q_DECL_OVERRIDE; - void resume() Q_DECL_OVERRIDE; - int bytesFree() const Q_DECL_OVERRIDE; - int periodSize() const Q_DECL_OVERRIDE; - void setBufferSize(int value) Q_DECL_OVERRIDE; - int bufferSize() const Q_DECL_OVERRIDE; - void setNotifyInterval(int milliSeconds) Q_DECL_OVERRIDE; - int notifyInterval() const Q_DECL_OVERRIDE; - qint64 processedUSecs() const Q_DECL_OVERRIDE; - qint64 elapsedUSecs() const Q_DECL_OVERRIDE; - QAudio::Error error() const Q_DECL_OVERRIDE; - QAudio::State state() const Q_DECL_OVERRIDE; - void setFormat(const QAudioFormat &format) Q_DECL_OVERRIDE; - QAudioFormat format() const Q_DECL_OVERRIDE; - - void setVolume(qreal volume) Q_DECL_OVERRIDE; - qreal volume() const Q_DECL_OVERRIDE; - - void setCategory(const QString &category) Q_DECL_OVERRIDE; - QString category() const Q_DECL_OVERRIDE; + void start(QIODevice *device) override; + QIODevice *start() override; + void stop() override; + void reset() override; + void suspend() override; + void resume() override; + int bytesFree() const override; + int periodSize() const override; + void setBufferSize(int value) override; + int bufferSize() const override; + void setNotifyInterval(int milliSeconds) override; + int notifyInterval() const override; + qint64 processedUSecs() const override; + qint64 elapsedUSecs() const override; + QAudio::Error error() const override; + QAudio::State state() const override; + void setFormat(const QAudioFormat &format) override; + QAudioFormat format() const override; + + void setVolume(qreal volume) override; + qreal volume() const override; + + void setCategory(const QString &category) override; + QString category() const override; private: friend class SLIODevicePrivate; @@ -138,11 +138,11 @@ class SLIODevicePrivate : public QIODevice public: inline SLIODevicePrivate(QOpenSLESAudioOutput *audio) : m_audioDevice(audio) {} - inline ~SLIODevicePrivate() Q_DECL_OVERRIDE {} + inline ~SLIODevicePrivate() override {} protected: - inline qint64 readData(char *, qint64) Q_DECL_OVERRIDE { return 0; } - inline qint64 writeData(const char *data, qint64 len) Q_DECL_OVERRIDE; + inline qint64 readData(char *, qint64) override { return 0; } + inline qint64 writeData(const char *data, qint64 len) override; private: QOpenSLESAudioOutput *m_audioDevice; diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro index 98a1bf242..71b9ec6e1 100644 --- a/src/plugins/plugins.pro +++ b/src/plugins/plugins.pro @@ -40,7 +40,8 @@ win32:!winrt { winrt { - SUBDIRS += winrt + SUBDIRS += winrt \ + audiocapture } unix:!mac:!android { diff --git a/src/plugins/pulseaudio/qaudioinput_pulse.cpp b/src/plugins/pulseaudio/qaudioinput_pulse.cpp index 050731071..2b5325132 100644 --- a/src/plugins/pulseaudio/qaudioinput_pulse.cpp +++ b/src/plugins/pulseaudio/qaudioinput_pulse.cpp @@ -226,7 +226,7 @@ QIODevice *QPulseAudioInput::start() close(); if (!open()) - return Q_NULLPTR; + return nullptr; m_pullMode = false; m_audioSource = new PulseInputPrivate(this); diff --git a/src/plugins/pulseaudio/qaudiooutput_pulse.cpp b/src/plugins/pulseaudio/qaudiooutput_pulse.cpp index 0c7dc270a..3c20908dc 100644 --- a/src/plugins/pulseaudio/qaudiooutput_pulse.cpp +++ b/src/plugins/pulseaudio/qaudiooutput_pulse.cpp @@ -256,7 +256,7 @@ QIODevice *QPulseAudioOutput::start() m_pullMode = false; if (!open()) - return Q_NULLPTR; + return nullptr; m_audioSource = new PulseOutputPrivate(this); m_audioSource->open(QIODevice::WriteOnly|QIODevice::Unbuffered); diff --git a/src/plugins/pulseaudio/qpulsehelpers.cpp b/src/plugins/pulseaudio/qpulsehelpers.cpp index 17579bdd9..0604c97f5 100644 --- a/src/plugins/pulseaudio/qpulsehelpers.cpp +++ b/src/plugins/pulseaudio/qpulsehelpers.cpp @@ -49,30 +49,23 @@ pa_sample_spec audioFormatToSampleSpec(const QAudioFormat &format) spec.rate = format.sampleRate(); spec.channels = format.channelCount(); - - if (format.sampleSize() == 8) { - spec.format = PA_SAMPLE_U8; - } else if (format.sampleSize() == 16) { - switch (format.byteOrder()) { - case QAudioFormat::BigEndian: spec.format = PA_SAMPLE_S16BE; break; - case QAudioFormat::LittleEndian: spec.format = PA_SAMPLE_S16LE; break; - } - } else if (format.sampleSize() == 24) { - switch (format.byteOrder()) { - case QAudioFormat::BigEndian: spec.format = PA_SAMPLE_S24BE; break; - case QAudioFormat::LittleEndian: spec.format = PA_SAMPLE_S24LE; break; - } - } else if (format.sampleSize() == 32) { - switch (format.byteOrder()) { - case QAudioFormat::BigEndian: - format.sampleType() == QAudioFormat::Float ? spec.format = PA_SAMPLE_FLOAT32BE : spec.format = PA_SAMPLE_S32BE; - break; - case QAudioFormat::LittleEndian: - format.sampleType() == QAudioFormat::Float ? spec.format = PA_SAMPLE_FLOAT32LE : spec.format = PA_SAMPLE_S32LE; - break; + spec.format = PA_SAMPLE_INVALID; + const bool isBigEndian = (format.byteOrder() == QAudioFormat::BigEndian); + + if (format.sampleType() == QAudioFormat::UnSignedInt) { + if (format.sampleSize() == 8) + spec.format = PA_SAMPLE_U8; + } else if (format.sampleType() == QAudioFormat::SignedInt) { + if (format.sampleSize() == 16) { + spec.format = isBigEndian ? PA_SAMPLE_S16BE : PA_SAMPLE_S16LE; + } else if (format.sampleSize() == 24) { + spec.format = isBigEndian ? PA_SAMPLE_S24BE : PA_SAMPLE_S24LE; + } else if (format.sampleSize() == 32) { + spec.format = isBigEndian ? PA_SAMPLE_S32BE : PA_SAMPLE_S32LE; } - } else { - spec.format = PA_SAMPLE_INVALID; + } else if (format.sampleType() == QAudioFormat::Float) { + if (format.sampleSize() == 32) + spec.format = isBigEndian ? PA_SAMPLE_FLOAT32BE : PA_SAMPLE_FLOAT32LE; } return spec; diff --git a/src/plugins/qnx-audio/audio/qnxaudiodeviceinfo.h b/src/plugins/qnx-audio/audio/qnxaudiodeviceinfo.h index 432c22163..cb620be3b 100644 --- a/src/plugins/qnx-audio/audio/qnxaudiodeviceinfo.h +++ b/src/plugins/qnx-audio/audio/qnxaudiodeviceinfo.h @@ -52,15 +52,15 @@ public: QnxAudioDeviceInfo(const QString &deviceName, QAudio::Mode mode); ~QnxAudioDeviceInfo(); - QAudioFormat preferredFormat() const Q_DECL_OVERRIDE; - bool isFormatSupported(const QAudioFormat &format) const Q_DECL_OVERRIDE; - QString deviceName() const Q_DECL_OVERRIDE; - QStringList supportedCodecs() Q_DECL_OVERRIDE; - QList<int> supportedSampleRates() Q_DECL_OVERRIDE; - QList<int> supportedChannelCounts() Q_DECL_OVERRIDE; - QList<int> supportedSampleSizes() Q_DECL_OVERRIDE; - QList<QAudioFormat::Endian> supportedByteOrders() Q_DECL_OVERRIDE; - QList<QAudioFormat::SampleType> supportedSampleTypes() Q_DECL_OVERRIDE; + QAudioFormat preferredFormat() const override; + bool isFormatSupported(const QAudioFormat &format) const override; + QString deviceName() const override; + QStringList supportedCodecs() override; + QList<int> supportedSampleRates() override; + QList<int> supportedChannelCounts() override; + QList<int> supportedSampleSizes() override; + QList<QAudioFormat::Endian> supportedByteOrders() override; + QList<QAudioFormat::SampleType> supportedSampleTypes() override; private: const QString m_name; diff --git a/src/plugins/qnx-audio/audio/qnxaudioinput.h b/src/plugins/qnx-audio/audio/qnxaudioinput.h index 4c6bb2676..c677b6c96 100644 --- a/src/plugins/qnx-audio/audio/qnxaudioinput.h +++ b/src/plugins/qnx-audio/audio/qnxaudioinput.h @@ -59,26 +59,26 @@ public: QnxAudioInput(); ~QnxAudioInput(); - void start(QIODevice*) Q_DECL_OVERRIDE; - QIODevice* start() Q_DECL_OVERRIDE; - void stop() Q_DECL_OVERRIDE; - void reset() Q_DECL_OVERRIDE; - void suspend() Q_DECL_OVERRIDE; - void resume() Q_DECL_OVERRIDE; - int bytesReady() const Q_DECL_OVERRIDE; - int periodSize() const Q_DECL_OVERRIDE; - void setBufferSize(int ) Q_DECL_OVERRIDE; - int bufferSize() const Q_DECL_OVERRIDE; - void setNotifyInterval(int ) Q_DECL_OVERRIDE; - int notifyInterval() const Q_DECL_OVERRIDE; - qint64 processedUSecs() const Q_DECL_OVERRIDE; - qint64 elapsedUSecs() const Q_DECL_OVERRIDE; - QAudio::Error error() const Q_DECL_OVERRIDE; - QAudio::State state() const Q_DECL_OVERRIDE; - void setFormat(const QAudioFormat&) Q_DECL_OVERRIDE; - QAudioFormat format() const Q_DECL_OVERRIDE; - void setVolume(qreal) Q_DECL_OVERRIDE; - qreal volume() const Q_DECL_OVERRIDE; + void start(QIODevice*) override; + QIODevice* start() override; + void stop() override; + void reset() override; + void suspend() override; + void resume() override; + int bytesReady() const override; + int periodSize() const override; + void setBufferSize(int ) override; + int bufferSize() const override; + void setNotifyInterval(int ) override; + int notifyInterval() const override; + qint64 processedUSecs() const override; + qint64 elapsedUSecs() const override; + QAudio::Error error() const override; + QAudio::State state() const override; + void setFormat(const QAudioFormat&) override; + QAudioFormat format() const override; + void setVolume(qreal) override; + qreal volume() const override; private slots: void userFeed(); @@ -124,8 +124,8 @@ class InputPrivate : public QIODevice public: InputPrivate(QnxAudioInput *audio); - qint64 readData(char *data, qint64 len) Q_DECL_OVERRIDE; - qint64 writeData(const char *data, qint64 len) Q_DECL_OVERRIDE; + qint64 readData(char *data, qint64 len) override; + qint64 writeData(const char *data, qint64 len) override; void trigger(); diff --git a/src/plugins/qnx-audio/audio/qnxaudiooutput.cpp b/src/plugins/qnx-audio/audio/qnxaudiooutput.cpp index d08d01e6d..c4c09f543 100644 --- a/src/plugins/qnx-audio/audio/qnxaudiooutput.cpp +++ b/src/plugins/qnx-audio/audio/qnxaudiooutput.cpp @@ -43,19 +43,24 @@ #include <private/qaudiohelpers_p.h> +#pragma GCC diagnostic ignored "-Wvla" + QT_BEGIN_NAMESPACE QnxAudioOutput::QnxAudioOutput() - : m_source(0), - m_pushSource(false), - m_notifyInterval(1000), - m_error(QAudio::NoError), - m_state(QAudio::StoppedState), - m_volume(1.0), - m_periodSize(0), - m_pcmHandle(0), - m_bytesWritten(0), - m_intervalOffset(0) + : m_source(0) + , m_pushSource(false) + , m_notifyInterval(1000) + , m_error(QAudio::NoError) + , m_state(QAudio::StoppedState) + , m_volume(1.0) + , m_periodSize(0) + , m_pcmHandle(0) + , m_bytesWritten(0) + , m_intervalOffset(0) +#if _NTO_VERSION >= 700 + , m_pcmNotifier(0) +#endif { m_timer.setSingleShot(false); m_timer.setInterval(20); @@ -124,20 +129,16 @@ void QnxAudioOutput::reset() void QnxAudioOutput::suspend() { - m_timer.stop(); snd_pcm_playback_pause(m_pcmHandle); - setState(QAudio::SuspendedState); + if (state() != QAudio::InterruptedState) + suspendInternal(QAudio::SuspendedState); } void QnxAudioOutput::resume() { snd_pcm_playback_resume(m_pcmHandle); - if (m_pushSource) - setState(QAudio::IdleState); - else { - setState(QAudio::ActiveState); - m_timer.start(); - } + if (state() != QAudio::InterruptedState) + resumeInternal(); } int QnxAudioOutput::bytesFree() const @@ -146,6 +147,7 @@ int QnxAudioOutput::bytesFree() const return 0; snd_pcm_channel_status_t status; + memset(&status, 0, sizeof(status)); status.channel = SND_PCM_CHANNEL_PLAYBACK; const int errorCode = snd_pcm_plugin_status(m_pcmHandle, &status); @@ -214,9 +216,21 @@ qreal QnxAudioOutput::volume() const return m_volume; } +void QnxAudioOutput::setCategory(const QString &category) +{ + m_category = category; +} + +QString QnxAudioOutput::category() const +{ + return m_category; +} + void QnxAudioOutput::pullData() { - if (m_state == QAudio::StoppedState || m_state == QAudio::SuspendedState) + if (m_state == QAudio::StoppedState + || m_state == QAudio::SuspendedState + || m_state == QAudio::InterruptedState) return; const int bytesAvailable = bytesFree(); @@ -290,6 +304,8 @@ bool QnxAudioOutput::open() return false; } + addPcmEventFilter(); + // Necessary so that bytesFree() which uses the "free" member of the status struct works snd_pcm_plugin_set_disable(m_pcmHandle, PLUGIN_MMAP); @@ -303,6 +319,7 @@ bool QnxAudioOutput::open() } snd_pcm_channel_params_t params = QnxAudioUtils::formatToChannelParams(m_format, QAudio::AudioOutput, info.max_fragment_size); + setTypeName(¶ms); if ((errorCode = snd_pcm_plugin_params(m_pcmHandle, ¶ms)) < 0) { qWarning("QnxAudioOutput: open error, couldn't set channel params (0x%x)", -errorCode); @@ -331,6 +348,8 @@ bool QnxAudioOutput::open() m_intervalOffset = 0; m_bytesWritten = 0; + createPcmNotifiers(); + return true; } @@ -338,6 +357,8 @@ void QnxAudioOutput::close() { m_timer.stop(); + destroyPcmNotifiers(); + if (m_pcmHandle) { snd_pcm_plugin_flush(m_pcmHandle, SND_PCM_CHANNEL_PLAYBACK); snd_pcm_close(m_pcmHandle); @@ -400,6 +421,109 @@ qint64 QnxAudioOutput::write(const char *data, qint64 len) } } +void QnxAudioOutput::suspendInternal(QAudio::State suspendState) +{ + m_timer.stop(); + setState(suspendState); +} + +void QnxAudioOutput::resumeInternal() +{ + if (m_pushSource) { + setState(QAudio::IdleState); + } else { + setState(QAudio::ActiveState); + m_timer.start(); + } +} + +#if _NTO_VERSION >= 700 + +QAudio::State suspendState(const snd_pcm_event_t &event) +{ + Q_ASSERT(event.type == SND_PCM_EVENT_AUDIOMGMT_STATUS); + Q_ASSERT(event.data.audiomgmt_status.new_status == SND_PCM_STATUS_SUSPENDED); + return event.data.audiomgmt_status.flags & SND_PCM_STATUS_EVENT_HARD_SUSPEND + ? QAudio::InterruptedState : QAudio::SuspendedState; +} + +void QnxAudioOutput::addPcmEventFilter() +{ + /* Enable PCM events */ + snd_pcm_filter_t filter; + memset(&filter, 0, sizeof(filter)); + filter.enable = (1<<SND_PCM_EVENT_AUDIOMGMT_STATUS) | + (1<<SND_PCM_EVENT_AUDIOMGMT_MUTE) | + (1<<SND_PCM_EVENT_OUTPUTCLASS); + snd_pcm_set_filter(m_pcmHandle, SND_PCM_CHANNEL_PLAYBACK, &filter); +} + +void QnxAudioOutput::createPcmNotifiers() +{ + // QSocketNotifier::Read for poll based event dispatcher. Exception for + // select based event dispatcher. + m_pcmNotifier = new QSocketNotifier(snd_pcm_file_descriptor(m_pcmHandle, + SND_PCM_CHANNEL_PLAYBACK), + QSocketNotifier::Read, this); + connect(m_pcmNotifier, &QSocketNotifier::activated, + this, &QnxAudioOutput::pcmNotifierActivated); +} + +void QnxAudioOutput::destroyPcmNotifiers() +{ + if (m_pcmNotifier) { + delete m_pcmNotifier; + m_pcmNotifier = 0; + } +} + +void QnxAudioOutput::setTypeName(snd_pcm_channel_params_t *params) +{ + if (m_category.isEmpty()) + return; + + QByteArray latin1Category = m_category.toLatin1(); + + if (QString::fromLatin1(latin1Category) != m_category) { + qWarning("QnxAudioOutput: audio category name isn't a Latin1 string."); + return; + } + + if (latin1Category.size() >= static_cast<int>(sizeof(params->audio_type_name))) { + qWarning("QnxAudioOutput: audio category name too long."); + return; + } + + strcpy(params->audio_type_name, latin1Category.constData()); +} + +void QnxAudioOutput::pcmNotifierActivated(int socket) +{ + Q_UNUSED(socket); + + snd_pcm_event_t pcm_event; + memset(&pcm_event, 0, sizeof(pcm_event)); + while (snd_pcm_channel_read_event(m_pcmHandle, SND_PCM_CHANNEL_PLAYBACK, &pcm_event) == 0) { + if (pcm_event.type == SND_PCM_EVENT_AUDIOMGMT_STATUS) { + if (pcm_event.data.audiomgmt_status.new_status == SND_PCM_STATUS_SUSPENDED) + suspendInternal(suspendState(pcm_event)); + else if (pcm_event.data.audiomgmt_status.new_status == SND_PCM_STATUS_RUNNING) + resumeInternal(); + else if (pcm_event.data.audiomgmt_status.new_status == SND_PCM_STATUS_PAUSED) + suspendInternal(QAudio::SuspendedState); + } + } +} + +#else + +void QnxAudioOutput::addPcmEventFilter() {} +void QnxAudioOutput::createPcmNotifiers() {} +void QnxAudioOutput::destroyPcmNotifiers() {} +void QnxAudioOutput::setTypeName(snd_pcm_channel_params_t *) {} + +#endif + QnxPushIODevice::QnxPushIODevice(QnxAudioOutput *output) : QIODevice(output), m_output(output) diff --git a/src/plugins/qnx-audio/audio/qnxaudiooutput.h b/src/plugins/qnx-audio/audio/qnxaudiooutput.h index 5ee69b542..7a0979f77 100644 --- a/src/plugins/qnx-audio/audio/qnxaudiooutput.h +++ b/src/plugins/qnx-audio/audio/qnxaudiooutput.h @@ -45,8 +45,10 @@ #include <QTime> #include <QTimer> #include <QIODevice> +#include <QSocketNotifier> #include <sys/asoundlib.h> +#include <sys/neutrino.h> QT_BEGIN_NAMESPACE @@ -60,26 +62,28 @@ public: QnxAudioOutput(); ~QnxAudioOutput(); - void start(QIODevice *source) Q_DECL_OVERRIDE; - QIODevice *start() Q_DECL_OVERRIDE; - void stop() Q_DECL_OVERRIDE; - void reset() Q_DECL_OVERRIDE; - void suspend() Q_DECL_OVERRIDE; - void resume() Q_DECL_OVERRIDE; - int bytesFree() const Q_DECL_OVERRIDE; - int periodSize() const Q_DECL_OVERRIDE; - void setBufferSize(int) Q_DECL_OVERRIDE {} - int bufferSize() const Q_DECL_OVERRIDE { return 0; } - void setNotifyInterval(int ms) Q_DECL_OVERRIDE; - int notifyInterval() const Q_DECL_OVERRIDE; - qint64 processedUSecs() const Q_DECL_OVERRIDE; - qint64 elapsedUSecs() const Q_DECL_OVERRIDE; - QAudio::Error error() const Q_DECL_OVERRIDE; - QAudio::State state() const Q_DECL_OVERRIDE; - void setFormat(const QAudioFormat &format) Q_DECL_OVERRIDE; - QAudioFormat format() const Q_DECL_OVERRIDE; - void setVolume(qreal volume) Q_DECL_OVERRIDE; - qreal volume() const Q_DECL_OVERRIDE; + void start(QIODevice *source) override; + QIODevice *start() override; + void stop() override; + void reset() override; + void suspend() override; + void resume() override; + int bytesFree() const override; + int periodSize() const override; + void setBufferSize(int) override {} + int bufferSize() const override { return 0; } + void setNotifyInterval(int ms) override; + int notifyInterval() const override; + qint64 processedUSecs() const override; + qint64 elapsedUSecs() const override; + QAudio::Error error() const override; + QAudio::State state() const override; + void setFormat(const QAudioFormat &format) override; + QAudioFormat format() const override; + void setVolume(qreal volume) override; + qreal volume() const override; + void setCategory(const QString &category) override; + QString category() const override; private slots: void pullData(); @@ -90,6 +94,14 @@ private: void setError(QAudio::Error error); void setState(QAudio::State state); + void addPcmEventFilter(); + void createPcmNotifiers(); + void destroyPcmNotifiers(); + void setTypeName(snd_pcm_channel_params_t *params); + + void suspendInternal(QAudio::State suspendState); + void resumeInternal(); + friend class QnxPushIODevice; qint64 write(const char *data, qint64 len); @@ -102,6 +114,7 @@ private: QAudio::State m_state; QAudioFormat m_format; qreal m_volume; + QString m_category; int m_periodSize; snd_pcm_t *m_pcmHandle; @@ -109,6 +122,13 @@ private: QTime m_startTimeStamp; QTime m_intervalTimeStamp; qint64 m_intervalOffset; + +#if _NTO_VERSION >= 700 + QSocketNotifier *m_pcmNotifier; + +private slots: + void pcmNotifierActivated(int socket); +#endif }; class QnxPushIODevice : public QIODevice diff --git a/src/plugins/qnx-audio/audio/qnxaudioplugin.h b/src/plugins/qnx-audio/audio/qnxaudioplugin.h index 1d8b8a74b..d41f4020a 100644 --- a/src/plugins/qnx-audio/audio/qnxaudioplugin.h +++ b/src/plugins/qnx-audio/audio/qnxaudioplugin.h @@ -55,11 +55,11 @@ public: explicit QnxAudioPlugin(QObject *parent = 0); ~QnxAudioPlugin() {} - QByteArray defaultDevice(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QList<QByteArray> availableDevices(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QAbstractAudioInput *createInput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioOutput *createOutput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) Q_DECL_OVERRIDE; + QByteArray defaultDevice(QAudio::Mode mode) const override; + QList<QByteArray> availableDevices(QAudio::Mode mode) const override; + QAbstractAudioInput *createInput(const QByteArray &device) override; + QAbstractAudioOutput *createOutput(const QByteArray &device) override; + QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) override; }; QT_END_NAMESPACE diff --git a/src/plugins/qnx/camera/bbcameraaudioencodersettingscontrol.h b/src/plugins/qnx/camera/bbcameraaudioencodersettingscontrol.h index 44ee80026..38c01f86c 100644 --- a/src/plugins/qnx/camera/bbcameraaudioencodersettingscontrol.h +++ b/src/plugins/qnx/camera/bbcameraaudioencodersettingscontrol.h @@ -51,11 +51,11 @@ class BbCameraAudioEncoderSettingsControl : public QAudioEncoderSettingsControl public: explicit BbCameraAudioEncoderSettingsControl(BbCameraSession *session, QObject *parent = 0); - QStringList supportedAudioCodecs() const Q_DECL_OVERRIDE; - QString codecDescription(const QString &codecName) const Q_DECL_OVERRIDE; - QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QAudioEncoderSettings audioSettings() const Q_DECL_OVERRIDE; - void setAudioSettings(const QAudioEncoderSettings &settings) Q_DECL_OVERRIDE; + QStringList supportedAudioCodecs() const override; + QString codecDescription(const QString &codecName) const override; + QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = 0) const override; + QAudioEncoderSettings audioSettings() const override; + void setAudioSettings(const QAudioEncoderSettings &settings) override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbcameracapturebufferformatcontrol.h b/src/plugins/qnx/camera/bbcameracapturebufferformatcontrol.h index 2be6f0c3b..4aac740c8 100644 --- a/src/plugins/qnx/camera/bbcameracapturebufferformatcontrol.h +++ b/src/plugins/qnx/camera/bbcameracapturebufferformatcontrol.h @@ -49,9 +49,9 @@ class BbCameraCaptureBufferFormatControl : public QCameraCaptureBufferFormatCont public: explicit BbCameraCaptureBufferFormatControl(QObject *parent = 0); - QList<QVideoFrame::PixelFormat> supportedBufferFormats() const Q_DECL_OVERRIDE; - QVideoFrame::PixelFormat bufferFormat() const Q_DECL_OVERRIDE; - void setBufferFormat(QVideoFrame::PixelFormat format) Q_DECL_OVERRIDE; + QList<QVideoFrame::PixelFormat> supportedBufferFormats() const override; + QVideoFrame::PixelFormat bufferFormat() const override; + void setBufferFormat(QVideoFrame::PixelFormat format) override; }; QT_END_NAMESPACE diff --git a/src/plugins/qnx/camera/bbcameracapturedestinationcontrol.h b/src/plugins/qnx/camera/bbcameracapturedestinationcontrol.h index ab6f54b3d..9586ec56a 100644 --- a/src/plugins/qnx/camera/bbcameracapturedestinationcontrol.h +++ b/src/plugins/qnx/camera/bbcameracapturedestinationcontrol.h @@ -51,9 +51,9 @@ class BbCameraCaptureDestinationControl : public QCameraCaptureDestinationContro public: explicit BbCameraCaptureDestinationControl(BbCameraSession *session, QObject *parent = 0); - bool isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const Q_DECL_OVERRIDE; - QCameraImageCapture::CaptureDestinations captureDestination() const Q_DECL_OVERRIDE; - void setCaptureDestination(QCameraImageCapture::CaptureDestinations destination) Q_DECL_OVERRIDE; + bool isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const override; + QCameraImageCapture::CaptureDestinations captureDestination() const override; + void setCaptureDestination(QCameraImageCapture::CaptureDestinations destination) override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbcameracontrol.h b/src/plugins/qnx/camera/bbcameracontrol.h index a22c8d6fa..0c97bd83c 100644 --- a/src/plugins/qnx/camera/bbcameracontrol.h +++ b/src/plugins/qnx/camera/bbcameracontrol.h @@ -51,16 +51,16 @@ class BbCameraControl : public QCameraControl public: explicit BbCameraControl(BbCameraSession *session, QObject *parent = 0); - QCamera::State state() const Q_DECL_OVERRIDE; - void setState(QCamera::State state) Q_DECL_OVERRIDE; + QCamera::State state() const override; + void setState(QCamera::State state) override; - QCamera::Status status() const Q_DECL_OVERRIDE; + QCamera::Status status() const override; - QCamera::CaptureModes captureMode() const Q_DECL_OVERRIDE; - void setCaptureMode(QCamera::CaptureModes) Q_DECL_OVERRIDE; - bool isCaptureModeSupported(QCamera::CaptureModes mode) const Q_DECL_OVERRIDE; + QCamera::CaptureModes captureMode() const override; + void setCaptureMode(QCamera::CaptureModes) override; + bool isCaptureModeSupported(QCamera::CaptureModes mode) const override; - bool canChangeProperty(PropertyChangeType changeType, QCamera::Status status) const Q_DECL_OVERRIDE; + bool canChangeProperty(PropertyChangeType changeType, QCamera::Status status) const override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbcameraexposurecontrol.h b/src/plugins/qnx/camera/bbcameraexposurecontrol.h index 4f5a71518..2d0da29bd 100644 --- a/src/plugins/qnx/camera/bbcameraexposurecontrol.h +++ b/src/plugins/qnx/camera/bbcameraexposurecontrol.h @@ -51,12 +51,12 @@ class BbCameraExposureControl : public QCameraExposureControl public: explicit BbCameraExposureControl(BbCameraSession *session, QObject *parent = 0); - virtual bool isParameterSupported(ExposureParameter parameter) const Q_DECL_OVERRIDE; - virtual QVariantList supportedParameterRange(ExposureParameter parameter, bool *continuous) const Q_DECL_OVERRIDE; + bool isParameterSupported(ExposureParameter parameter) const override; + QVariantList supportedParameterRange(ExposureParameter parameter, bool *continuous) const override; - virtual QVariant requestedValue(ExposureParameter parameter) const Q_DECL_OVERRIDE; - virtual QVariant actualValue(ExposureParameter parameter) const Q_DECL_OVERRIDE; - virtual bool setValue(ExposureParameter parameter, const QVariant& value) Q_DECL_OVERRIDE; + QVariant requestedValue(ExposureParameter parameter) const override; + QVariant actualValue(ExposureParameter parameter) const override; + bool setValue(ExposureParameter parameter, const QVariant& value) override; private Q_SLOTS: void statusChanged(QCamera::Status status); diff --git a/src/plugins/qnx/camera/bbcameraflashcontrol.h b/src/plugins/qnx/camera/bbcameraflashcontrol.h index e4b5f0a7f..8ce9c1f41 100644 --- a/src/plugins/qnx/camera/bbcameraflashcontrol.h +++ b/src/plugins/qnx/camera/bbcameraflashcontrol.h @@ -51,10 +51,10 @@ class BbCameraFlashControl : public QCameraFlashControl public: explicit BbCameraFlashControl(BbCameraSession *session, QObject *parent = 0); - QCameraExposure::FlashModes flashMode() const Q_DECL_OVERRIDE; - void setFlashMode(QCameraExposure::FlashModes mode) Q_DECL_OVERRIDE; - bool isFlashModeSupported(QCameraExposure::FlashModes mode) const Q_DECL_OVERRIDE; - bool isFlashReady() const Q_DECL_OVERRIDE; + QCameraExposure::FlashModes flashMode() const override; + void setFlashMode(QCameraExposure::FlashModes mode) override; + bool isFlashModeSupported(QCameraExposure::FlashModes mode) const override; + bool isFlashReady() const override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbcamerafocuscontrol.h b/src/plugins/qnx/camera/bbcamerafocuscontrol.h index 2501aafdd..bf11ea03e 100644 --- a/src/plugins/qnx/camera/bbcamerafocuscontrol.h +++ b/src/plugins/qnx/camera/bbcamerafocuscontrol.h @@ -51,15 +51,15 @@ class BbCameraFocusControl : public QCameraFocusControl public: explicit BbCameraFocusControl(BbCameraSession *session, QObject *parent = 0); - QCameraFocus::FocusModes focusMode() const Q_DECL_OVERRIDE; - void setFocusMode(QCameraFocus::FocusModes mode) Q_DECL_OVERRIDE; - bool isFocusModeSupported(QCameraFocus::FocusModes mode) const Q_DECL_OVERRIDE; - QCameraFocus::FocusPointMode focusPointMode() const Q_DECL_OVERRIDE; - void setFocusPointMode(QCameraFocus::FocusPointMode mode) Q_DECL_OVERRIDE; - bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const Q_DECL_OVERRIDE; - QPointF customFocusPoint() const Q_DECL_OVERRIDE; - void setCustomFocusPoint(const QPointF &point) Q_DECL_OVERRIDE; - QCameraFocusZoneList focusZones() const Q_DECL_OVERRIDE; + QCameraFocus::FocusModes focusMode() const override; + void setFocusMode(QCameraFocus::FocusModes mode) override; + bool isFocusModeSupported(QCameraFocus::FocusModes mode) const override; + QCameraFocus::FocusPointMode focusPointMode() const override; + void setFocusPointMode(QCameraFocus::FocusPointMode mode) override; + bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const override; + QPointF customFocusPoint() const override; + void setCustomFocusPoint(const QPointF &point) override; + QCameraFocusZoneList focusZones() const override; private: void updateCustomFocusRegion(); diff --git a/src/plugins/qnx/camera/bbcameraimagecapturecontrol.h b/src/plugins/qnx/camera/bbcameraimagecapturecontrol.h index 4d239ef59..b8013ba1f 100644 --- a/src/plugins/qnx/camera/bbcameraimagecapturecontrol.h +++ b/src/plugins/qnx/camera/bbcameraimagecapturecontrol.h @@ -51,13 +51,13 @@ class BbCameraImageCaptureControl : public QCameraImageCaptureControl public: explicit BbCameraImageCaptureControl(BbCameraSession *session, QObject *parent = 0); - bool isReadyForCapture() const Q_DECL_OVERRIDE; + bool isReadyForCapture() const override; - QCameraImageCapture::DriveMode driveMode() const Q_DECL_OVERRIDE; - void setDriveMode(QCameraImageCapture::DriveMode mode) Q_DECL_OVERRIDE; + QCameraImageCapture::DriveMode driveMode() const override; + void setDriveMode(QCameraImageCapture::DriveMode mode) override; - int capture(const QString &fileName) Q_DECL_OVERRIDE; - void cancelCapture() Q_DECL_OVERRIDE; + int capture(const QString &fileName) override; + void cancelCapture() override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbcameraimageprocessingcontrol.h b/src/plugins/qnx/camera/bbcameraimageprocessingcontrol.h index 2060b4d99..0eefdd2a1 100644 --- a/src/plugins/qnx/camera/bbcameraimageprocessingcontrol.h +++ b/src/plugins/qnx/camera/bbcameraimageprocessingcontrol.h @@ -51,10 +51,10 @@ class BbCameraImageProcessingControl : public QCameraImageProcessingControl public: explicit BbCameraImageProcessingControl(BbCameraSession *session, QObject *parent = 0); - bool isParameterSupported(ProcessingParameter) const Q_DECL_OVERRIDE; - bool isParameterValueSupported(ProcessingParameter parameter, const QVariant &value) const Q_DECL_OVERRIDE; - QVariant parameter(ProcessingParameter parameter) const Q_DECL_OVERRIDE; - void setParameter(ProcessingParameter parameter, const QVariant &value) Q_DECL_OVERRIDE; + bool isParameterSupported(ProcessingParameter) const override; + bool isParameterValueSupported(ProcessingParameter parameter, const QVariant &value) const override; + QVariant parameter(ProcessingParameter parameter) const override; + void setParameter(ProcessingParameter parameter, const QVariant &value) override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbcameralockscontrol.h b/src/plugins/qnx/camera/bbcameralockscontrol.h index f6a7e1864..be3d1bd02 100644 --- a/src/plugins/qnx/camera/bbcameralockscontrol.h +++ b/src/plugins/qnx/camera/bbcameralockscontrol.h @@ -59,10 +59,10 @@ public: explicit BbCameraLocksControl(BbCameraSession *session, QObject *parent = 0); - QCamera::LockTypes supportedLocks() const Q_DECL_OVERRIDE; - QCamera::LockStatus lockStatus(QCamera::LockType lock) const Q_DECL_OVERRIDE; - void searchAndLock(QCamera::LockTypes locks) Q_DECL_OVERRIDE; - void unlock(QCamera::LockTypes locks) Q_DECL_OVERRIDE; + QCamera::LockTypes supportedLocks() const override; + QCamera::LockStatus lockStatus(QCamera::LockType lock) const override; + void searchAndLock(QCamera::LockTypes locks) override; + void unlock(QCamera::LockTypes locks) override; private Q_SLOTS: void cameraOpened(); diff --git a/src/plugins/qnx/camera/bbcameramediarecordercontrol.h b/src/plugins/qnx/camera/bbcameramediarecordercontrol.h index 0ba82969f..af46479a5 100644 --- a/src/plugins/qnx/camera/bbcameramediarecordercontrol.h +++ b/src/plugins/qnx/camera/bbcameramediarecordercontrol.h @@ -51,19 +51,19 @@ class BbCameraMediaRecorderControl : public QMediaRecorderControl public: explicit BbCameraMediaRecorderControl(BbCameraSession *session, QObject *parent = 0); - QUrl outputLocation() const Q_DECL_OVERRIDE; - bool setOutputLocation(const QUrl &location) Q_DECL_OVERRIDE; - QMediaRecorder::State state() const Q_DECL_OVERRIDE; - QMediaRecorder::Status status() const Q_DECL_OVERRIDE; - qint64 duration() const Q_DECL_OVERRIDE; - bool isMuted() const Q_DECL_OVERRIDE; - qreal volume() const Q_DECL_OVERRIDE; - void applySettings() Q_DECL_OVERRIDE; + QUrl outputLocation() const override; + bool setOutputLocation(const QUrl &location) override; + QMediaRecorder::State state() const override; + QMediaRecorder::Status status() const override; + qint64 duration() const override; + bool isMuted() const override; + qreal volume() const override; + void applySettings() override; public Q_SLOTS: - void setState(QMediaRecorder::State state) Q_DECL_OVERRIDE; - void setMuted(bool muted) Q_DECL_OVERRIDE; - void setVolume(qreal volume) Q_DECL_OVERRIDE; + void setState(QMediaRecorder::State state) override; + void setMuted(bool muted) override; + void setVolume(qreal volume) override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbcameraorientationhandler.h b/src/plugins/qnx/camera/bbcameraorientationhandler.h index e730acdc7..006a259cc 100644 --- a/src/plugins/qnx/camera/bbcameraorientationhandler.h +++ b/src/plugins/qnx/camera/bbcameraorientationhandler.h @@ -51,7 +51,7 @@ public: explicit BbCameraOrientationHandler(QObject *parent = 0); ~BbCameraOrientationHandler(); - bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) Q_DECL_OVERRIDE; + bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override; int orientation() const; diff --git a/src/plugins/qnx/camera/bbcameravideoencodersettingscontrol.h b/src/plugins/qnx/camera/bbcameravideoencodersettingscontrol.h index 1e0ed8708..f67196be1 100644 --- a/src/plugins/qnx/camera/bbcameravideoencodersettingscontrol.h +++ b/src/plugins/qnx/camera/bbcameravideoencodersettingscontrol.h @@ -51,12 +51,12 @@ class BbCameraVideoEncoderSettingsControl : public QVideoEncoderSettingsControl public: explicit BbCameraVideoEncoderSettingsControl(BbCameraSession *session, QObject *parent = 0); - QList<QSize> supportedResolutions(const QVideoEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QList<qreal> supportedFrameRates(const QVideoEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QStringList supportedVideoCodecs() const Q_DECL_OVERRIDE; - QString videoCodecDescription(const QString &codecName) const Q_DECL_OVERRIDE; - QVideoEncoderSettings videoSettings() const Q_DECL_OVERRIDE; - void setVideoSettings(const QVideoEncoderSettings &settings) Q_DECL_OVERRIDE; + 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; + void setVideoSettings(const QVideoEncoderSettings &settings) override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbcameraviewfindersettingscontrol.h b/src/plugins/qnx/camera/bbcameraviewfindersettingscontrol.h index b9c4af8a3..7a8e57a13 100644 --- a/src/plugins/qnx/camera/bbcameraviewfindersettingscontrol.h +++ b/src/plugins/qnx/camera/bbcameraviewfindersettingscontrol.h @@ -51,9 +51,9 @@ class BbCameraViewfinderSettingsControl : public QCameraViewfinderSettingsContro public: explicit BbCameraViewfinderSettingsControl(BbCameraSession *session, QObject *parent = 0); - bool isViewfinderParameterSupported(ViewfinderParameter parameter) const Q_DECL_OVERRIDE; - QVariant viewfinderParameter(ViewfinderParameter parameter) const Q_DECL_OVERRIDE; - void setViewfinderParameter(ViewfinderParameter parameter, const QVariant &value) Q_DECL_OVERRIDE; + bool isViewfinderParameterSupported(ViewfinderParameter parameter) const override; + QVariant viewfinderParameter(ViewfinderParameter parameter) const override; + void setViewfinderParameter(ViewfinderParameter parameter, const QVariant &value) override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbcamerazoomcontrol.h b/src/plugins/qnx/camera/bbcamerazoomcontrol.h index fc5813db4..7b5e06f8d 100644 --- a/src/plugins/qnx/camera/bbcamerazoomcontrol.h +++ b/src/plugins/qnx/camera/bbcamerazoomcontrol.h @@ -52,13 +52,13 @@ class BbCameraZoomControl : public QCameraZoomControl public: explicit BbCameraZoomControl(BbCameraSession *session, QObject *parent = 0); - qreal maximumOpticalZoom() const Q_DECL_OVERRIDE; - qreal maximumDigitalZoom() const Q_DECL_OVERRIDE; - qreal requestedOpticalZoom() const Q_DECL_OVERRIDE; - qreal requestedDigitalZoom() const Q_DECL_OVERRIDE; - qreal currentOpticalZoom() const Q_DECL_OVERRIDE; - qreal currentDigitalZoom() const Q_DECL_OVERRIDE; - void zoomTo(qreal optical, qreal digital) Q_DECL_OVERRIDE; + qreal maximumOpticalZoom() const override; + qreal maximumDigitalZoom() const override; + qreal requestedOpticalZoom() const override; + qreal requestedDigitalZoom() const override; + qreal currentOpticalZoom() const override; + qreal currentDigitalZoom() const override; + void zoomTo(qreal optical, qreal digital) override; private Q_SLOTS: void statusChanged(QCamera::Status status); diff --git a/src/plugins/qnx/camera/bbimageencodercontrol.h b/src/plugins/qnx/camera/bbimageencodercontrol.h index adb506f1f..bb246def6 100644 --- a/src/plugins/qnx/camera/bbimageencodercontrol.h +++ b/src/plugins/qnx/camera/bbimageencodercontrol.h @@ -51,11 +51,11 @@ class BbImageEncoderControl : public QImageEncoderControl public: explicit BbImageEncoderControl(BbCameraSession *session, QObject *parent = 0); - QStringList supportedImageCodecs() const Q_DECL_OVERRIDE; - QString imageCodecDescription(const QString &codecName) const Q_DECL_OVERRIDE; - QList<QSize> supportedResolutions(const QImageEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QImageEncoderSettings imageSettings() const Q_DECL_OVERRIDE; - void setImageSettings(const QImageEncoderSettings &settings) Q_DECL_OVERRIDE; + 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: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbvideodeviceselectorcontrol.h b/src/plugins/qnx/camera/bbvideodeviceselectorcontrol.h index 051fd713a..08d6cbb14 100644 --- a/src/plugins/qnx/camera/bbvideodeviceselectorcontrol.h +++ b/src/plugins/qnx/camera/bbvideodeviceselectorcontrol.h @@ -52,16 +52,16 @@ class BbVideoDeviceSelectorControl : public QVideoDeviceSelectorControl public: explicit BbVideoDeviceSelectorControl(BbCameraSession *session, QObject *parent = 0); - int deviceCount() const Q_DECL_OVERRIDE; - QString deviceName(int index) const Q_DECL_OVERRIDE; - QString deviceDescription(int index) const Q_DECL_OVERRIDE; - int defaultDevice() const Q_DECL_OVERRIDE; - int selectedDevice() const Q_DECL_OVERRIDE; + int deviceCount() const override; + QString deviceName(int index) const override; + QString deviceDescription(int index) const override; + int defaultDevice() const override; + int selectedDevice() const override; static void enumerateDevices(QList<QByteArray> *devices, QStringList *descriptions); public Q_SLOTS: - void setSelectedDevice(int index) Q_DECL_OVERRIDE; + void setSelectedDevice(int index) override; private: BbCameraSession* m_session; diff --git a/src/plugins/qnx/camera/bbvideorenderercontrol.h b/src/plugins/qnx/camera/bbvideorenderercontrol.h index 44bd5ca1b..441ff369d 100644 --- a/src/plugins/qnx/camera/bbvideorenderercontrol.h +++ b/src/plugins/qnx/camera/bbvideorenderercontrol.h @@ -51,8 +51,8 @@ class BbVideoRendererControl : public QVideoRendererControl public: explicit BbVideoRendererControl(BbCameraSession *session, QObject *parent = 0); - QAbstractVideoSurface *surface() const Q_DECL_OVERRIDE; - void setSurface(QAbstractVideoSurface *surface) Q_DECL_OVERRIDE; + QAbstractVideoSurface *surface() const override; + void setSurface(QAbstractVideoSurface *surface) override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/common/windowgrabber.h b/src/plugins/qnx/common/windowgrabber.h index 4278f2e3a..4b2217f74 100644 --- a/src/plugins/qnx/common/windowgrabber.h +++ b/src/plugins/qnx/common/windowgrabber.h @@ -100,7 +100,7 @@ public: void pause(); void resume(); - bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) Q_DECL_OVERRIDE; + bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override; bool handleScreenEvent(screen_event_t event); diff --git a/src/plugins/qnx/mediaplayer/mediaplayer.pri b/src/plugins/qnx/mediaplayer/mediaplayer.pri index 4c4363a91..f39b542cc 100644 --- a/src/plugins/qnx/mediaplayer/mediaplayer.pri +++ b/src/plugins/qnx/mediaplayer/mediaplayer.pri @@ -1,6 +1,7 @@ INCLUDEPATH += $$PWD HEADERS += \ + $$PWD/mmrendereraudiorolecontrol.h \ $$PWD/mmrenderermediaplayercontrol.h \ $$PWD/mmrenderermediaplayerservice.h \ $$PWD/mmrenderermetadata.h \ @@ -9,8 +10,10 @@ HEADERS += \ $$PWD/mmrendererutil.h \ $$PWD/mmrenderervideowindowcontrol.h \ $$PWD/mmreventmediaplayercontrol.h \ - $$PWD/mmreventthread.h + $$PWD/mmreventthread.h \ + $$PWD/mmrenderercustomaudiorolecontrol.h SOURCES += \ + $$PWD/mmrendereraudiorolecontrol.cpp \ $$PWD/mmrenderermediaplayercontrol.cpp \ $$PWD/mmrenderermediaplayerservice.cpp \ $$PWD/mmrenderermetadata.cpp \ @@ -19,6 +22,7 @@ SOURCES += \ $$PWD/mmrendererutil.cpp \ $$PWD/mmrenderervideowindowcontrol.cpp \ $$PWD/mmreventmediaplayercontrol.cpp \ - $$PWD/mmreventthread.cpp + $$PWD/mmreventthread.cpp \ + $$PWD/mmrenderercustomaudiorolecontrol.cpp QMAKE_USE += mmrenderer diff --git a/src/plugins/qnx/mediaplayer/mmrendereraudiorolecontrol.cpp b/src/plugins/qnx/mediaplayer/mmrendereraudiorolecontrol.cpp new file mode 100644 index 000000000..e470ed4c5 --- /dev/null +++ b/src/plugins/qnx/mediaplayer/mmrendereraudiorolecontrol.cpp @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2017 QNX Software Systems. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "mmrendereraudiorolecontrol.h" +#include "mmrendererutil.h" + +QT_BEGIN_NAMESPACE + +MmRendererAudioRoleControl::MmRendererAudioRoleControl(QObject *parent) + : QAudioRoleControl(parent) + , m_role(QAudio::UnknownRole) +{ +} + +QAudio::Role MmRendererAudioRoleControl::audioRole() const +{ + return m_role; +} + +void MmRendererAudioRoleControl::setAudioRole(QAudio::Role role) +{ + if (m_role != role) { + m_role = role; + emit audioRoleChanged(m_role); + } +} + +QList<QAudio::Role> MmRendererAudioRoleControl::supportedAudioRoles() const +{ + return qnxSupportedAudioRoles(); +} + +QT_END_NAMESPACE diff --git a/src/plugins/qnx/mediaplayer/mmrendereraudiorolecontrol.h b/src/plugins/qnx/mediaplayer/mmrendereraudiorolecontrol.h new file mode 100644 index 000000000..d0d2165eb --- /dev/null +++ b/src/plugins/qnx/mediaplayer/mmrendereraudiorolecontrol.h @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2017 QNX Software Systems. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef MMRENDERERAUDIOROLECONTROL_H +#define MMRENDERERAUDIOROLECONTROL_H + +#include <qaudiorolecontrol.h> + +QT_BEGIN_NAMESPACE + +class MmRendererAudioRoleControl : public QAudioRoleControl +{ + Q_OBJECT +public: + explicit MmRendererAudioRoleControl(QObject *parent = 0); + + QAudio::Role audioRole() const override; + void setAudioRole(QAudio::Role role) override; + + QList<QAudio::Role> supportedAudioRoles() const override; + +private: + QAudio::Role m_role; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/plugins/qnx/mediaplayer/mmrenderercustomaudiorolecontrol.cpp b/src/plugins/qnx/mediaplayer/mmrenderercustomaudiorolecontrol.cpp new file mode 100644 index 000000000..c8971d41c --- /dev/null +++ b/src/plugins/qnx/mediaplayer/mmrenderercustomaudiorolecontrol.cpp @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2017 QNX Software Systems. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "mmrenderercustomaudiorolecontrol.h" +#include "mmrendererutil.h" + +QT_BEGIN_NAMESPACE + +MmRendererCustomAudioRoleControl::MmRendererCustomAudioRoleControl(QObject *parent) + : QCustomAudioRoleControl(parent) +{ +} + +QString MmRendererCustomAudioRoleControl::customAudioRole() const +{ + return m_role; +} + +void MmRendererCustomAudioRoleControl::setCustomAudioRole(const QString &role) +{ + if (m_role != role) { + m_role = role; + emit customAudioRoleChanged(m_role); + } +} + +QStringList MmRendererCustomAudioRoleControl::supportedCustomAudioRoles() const +{ + return QStringList(); +} + +QT_END_NAMESPACE diff --git a/src/plugins/qnx/mediaplayer/mmrenderercustomaudiorolecontrol.h b/src/plugins/qnx/mediaplayer/mmrenderercustomaudiorolecontrol.h new file mode 100644 index 000000000..ff16f9355 --- /dev/null +++ b/src/plugins/qnx/mediaplayer/mmrenderercustomaudiorolecontrol.h @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2017 QNX Software Systems. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef MMRENDERERCUSTOMAUDIOROLECONTROL_H +#define MMRENDERERCUSTOMAUDIOROLECONTROL_H + +#include <qcustomaudiorolecontrol.h> + +QT_BEGIN_NAMESPACE + +class MmRendererCustomAudioRoleControl : public QCustomAudioRoleControl +{ + Q_OBJECT +public: + explicit MmRendererCustomAudioRoleControl(QObject *parent = 0); + + QString customAudioRole() const Q_DECL_OVERRIDE; + void setCustomAudioRole(const QString &role) Q_DECL_OVERRIDE; + + QStringList supportedCustomAudioRoles() const Q_DECL_OVERRIDE; + +private: + QString m_role; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp b/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp index d8b0a3934..c66ac937d 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp +++ b/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp @@ -36,6 +36,8 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ +#include "mmrendereraudiorolecontrol.h" +#include "mmrenderercustomaudiorolecontrol.h" #include "mmrenderermediaplayercontrol.h" #include "mmrenderermetadatareadercontrol.h" #include "mmrendererplayervideorenderercontrol.h" @@ -70,7 +72,6 @@ MmRendererMediaPlayerControl::MmRendererMediaPlayerControl(QObject *parent) m_mediaStatus(QMediaPlayer::NoMedia), m_playAfterMediaLoaded(false), m_inputAttached(false), - m_stopEventsToIgnore(0), m_bufferLevel(0) { m_loadingTimer.setSingleShot(true); @@ -109,35 +110,51 @@ void MmRendererMediaPlayerControl::openConnection() startMonitoring(); } -void MmRendererMediaPlayerControl::handleMmStatusUpdate(qint64 newPosition) -{ - // Prevent spurious position change events from overriding our own position, for example - // when setting the position to 0 in stop(). - // Also, don't change the position while we're loading the media, as then play() would - // set a wrong initial position. - if (m_state != QMediaPlayer::PlayingState || - m_mediaStatus == QMediaPlayer::LoadingMedia || - m_mediaStatus == QMediaPlayer::NoMedia || - m_mediaStatus == QMediaPlayer::InvalidMedia) - return; - - setMmPosition(newPosition); -} - void MmRendererMediaPlayerControl::handleMmStopped() { // Only react to stop events that happen when the end of the stream is reached and // playback is stopped because of this. - // Ignore other stop event sources, souch as calling mmr_stop() ourselves and - // mmr_input_attach(). - if (m_stopEventsToIgnore > 0) { - --m_stopEventsToIgnore; - } else { + // Ignore other stop event sources, such as calling mmr_stop() ourselves. + if (m_state != QMediaPlayer::StoppedState) { setMediaStatus(QMediaPlayer::EndOfMedia); stopInternal(IgnoreMmRenderer); } } +void MmRendererMediaPlayerControl::handleMmSuspend(const QString &reason) +{ + if (m_state == QMediaPlayer::StoppedState) + return; + + Q_UNUSED(reason); + setMediaStatus(QMediaPlayer::StalledMedia); +} + +void MmRendererMediaPlayerControl::handleMmSuspendRemoval(const QString &bufferStatus) +{ + if (m_state == QMediaPlayer::StoppedState) + return; + + if (bufferStatus == QLatin1String("buffering")) + setMediaStatus(QMediaPlayer::BufferingMedia); + else + setMediaStatus(QMediaPlayer::BufferedMedia); +} + +void MmRendererMediaPlayerControl::handleMmPause() +{ + if (m_state == QMediaPlayer::PlayingState) { + setState(QMediaPlayer::PausedState); + } +} + +void MmRendererMediaPlayerControl::handleMmPlay() +{ + if (m_state == QMediaPlayer::PausedState) { + setState(QMediaPlayer::PlayingState); + } +} + void MmRendererMediaPlayerControl::closeConnection() { stopMonitoring(); @@ -184,6 +201,8 @@ void MmRendererMediaPlayerControl::attach() return; } + resetMonitoring(); + if (m_videoRendererControl) m_videoRendererControl->attachDisplay(m_context); @@ -197,6 +216,20 @@ void MmRendererMediaPlayerControl::attach() return; } + if (m_audioId != -1 && m_audioRoleControl) { + QAudio::Role audioRole = m_audioRoleControl->audioRole(); + QString audioType = (audioRole == QAudio::CustomRole && m_customAudioRoleControl) + ? m_customAudioRoleControl->customAudioRole() + : qnxAudioType(audioRole); + QByteArray latin1AudioType = audioType.toLatin1(); + if (!audioType.isEmpty() && latin1AudioType == audioType) { + strm_dict_t *dict = strm_dict_new(); + dict = strm_dict_set(dict, "audio_type", latin1AudioType.constData()); + if (mmr_output_parameters(m_context, m_audioId, dict) != 0) + emitMmError("mmr_output_parameters: Setting audio_type failed"); + } + } + const QByteArray resourcePath = resourcePathForUrl(m_media.canonicalUrl()); if (resourcePath.isEmpty()) { detach(); @@ -210,11 +243,6 @@ void MmRendererMediaPlayerControl::attach() return; } - // For whatever reason, the mmrenderer sends out a MMR_STOPPED event when calling - // mmr_input_attach() above. Ignore it, as otherwise we'll trigger stopping right after we - // started. - m_stopEventsToIgnore++; - m_inputAttached = true; setMediaStatus(QMediaPlayer::LoadedMedia); @@ -346,12 +374,12 @@ void MmRendererMediaPlayerControl::setState(QMediaPlayer::State state) void MmRendererMediaPlayerControl::stopInternal(StopCommand stopCommand) { + resetMonitoring(); setPosition(0); if (m_state != QMediaPlayer::StoppedState) { if (stopCommand == StopMmRenderer) { - ++m_stopEventsToIgnore; mmr_stop(m_context); } @@ -509,6 +537,7 @@ void MmRendererMediaPlayerControl::play() if (m_mediaStatus == QMediaPlayer::EndOfMedia) m_position = 0; + resetMonitoring(); setPositionInternal(m_position); setVolumeInternal(m_muted ? 0 : m_volume); setPlaybackRateInternal(m_rate); @@ -519,7 +548,6 @@ void MmRendererMediaPlayerControl::play() return; } - m_stopEventsToIgnore = 0; // once playing, stop events must be proccessed setState( QMediaPlayer::PlayingState); } @@ -556,6 +584,16 @@ void MmRendererMediaPlayerControl::setMetaDataReaderControl(MmRendererMetaDataRe m_metaDataReaderControl = metaDataReaderControl; } +void MmRendererMediaPlayerControl::setAudioRoleControl(MmRendererAudioRoleControl *audioRoleControl) +{ + m_audioRoleControl = audioRoleControl; +} + +void MmRendererMediaPlayerControl::setCustomAudioRoleControl(MmRendererCustomAudioRoleControl *customAudioRoleControl) +{ + m_customAudioRoleControl = customAudioRoleControl; +} + void MmRendererMediaPlayerControl::setMmPosition(qint64 newPosition) { if (newPosition != 0 && newPosition != m_position) { @@ -573,18 +611,11 @@ void MmRendererMediaPlayerControl::setMmBufferStatus(const QString &bufferStatus // ignore "idle" buffer status } -void MmRendererMediaPlayerControl::setMmBufferLevel(const QString &bufferLevel) +void MmRendererMediaPlayerControl::setMmBufferLevel(int level, int capacity) { - // buffer level has format level/capacity, e.g. "91319/124402" - const int slashPos = bufferLevel.indexOf('/'); - if (slashPos != -1) { - const int fill = bufferLevel.leftRef(slashPos).toInt(); - const int capacity = bufferLevel.midRef(slashPos + 1).toInt(); - if (capacity != 0) { - m_bufferLevel = fill / static_cast<float>(capacity) * 100.0f; - emit bufferStatusChanged(m_bufferLevel); - } - } + m_bufferLevel = capacity == 0 ? 0 : level / static_cast<float>(capacity) * 100.0f; + m_bufferLevel = qBound(0, m_bufferLevel, 100); + emit bufferStatusChanged(m_bufferLevel); } void MmRendererMediaPlayerControl::updateMetaData(const strm_dict *dict) diff --git a/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.h b/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.h index 2edbd50e0..3426ef2f2 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.h +++ b/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.h @@ -52,6 +52,8 @@ typedef struct strm_dict strm_dict_t; QT_BEGIN_NAMESPACE +class MmRendererAudioRoleControl; +class MmRendererCustomAudioRoleControl; class MmRendererMetaDataReaderControl; class MmRendererPlayerVideoRendererControl; class MmRendererVideoWindowControl; @@ -62,40 +64,40 @@ class MmRendererMediaPlayerControl : public QMediaPlayerControl, public QAbstrac public: explicit MmRendererMediaPlayerControl(QObject *parent = 0); - QMediaPlayer::State state() const Q_DECL_OVERRIDE; + QMediaPlayer::State state() const override; - QMediaPlayer::MediaStatus mediaStatus() const Q_DECL_OVERRIDE; + QMediaPlayer::MediaStatus mediaStatus() const override; - qint64 duration() const Q_DECL_OVERRIDE; + qint64 duration() const override; - qint64 position() const Q_DECL_OVERRIDE; - void setPosition(qint64 position) Q_DECL_OVERRIDE; + qint64 position() const override; + void setPosition(qint64 position) override; - int volume() const Q_DECL_OVERRIDE; - void setVolume(int volume) Q_DECL_OVERRIDE; + int volume() const override; + void setVolume(int volume) override; - bool isMuted() const Q_DECL_OVERRIDE; - void setMuted(bool muted) Q_DECL_OVERRIDE; + bool isMuted() const override; + void setMuted(bool muted) override; - int bufferStatus() const Q_DECL_OVERRIDE; + int bufferStatus() const override; - bool isAudioAvailable() const Q_DECL_OVERRIDE; - bool isVideoAvailable() const Q_DECL_OVERRIDE; + bool isAudioAvailable() const override; + bool isVideoAvailable() const override; - bool isSeekable() const Q_DECL_OVERRIDE; + bool isSeekable() const override; - QMediaTimeRange availablePlaybackRanges() const Q_DECL_OVERRIDE; + QMediaTimeRange availablePlaybackRanges() const override; - qreal playbackRate() const Q_DECL_OVERRIDE; - void setPlaybackRate(qreal rate) Q_DECL_OVERRIDE; + qreal playbackRate() const override; + void setPlaybackRate(qreal rate) override; - QMediaContent media() const Q_DECL_OVERRIDE; - const QIODevice *mediaStream() const Q_DECL_OVERRIDE; - void setMedia(const QMediaContent &media, QIODevice *stream) Q_DECL_OVERRIDE; + QMediaContent media() const override; + const QIODevice *mediaStream() const override; + void setMedia(const QMediaContent &media, QIODevice *stream) override; - void play() Q_DECL_OVERRIDE; - void pause() Q_DECL_OVERRIDE; - void stop() Q_DECL_OVERRIDE; + void play() override; + void pause() override; + void stop() override; MmRendererPlayerVideoRendererControl *videoRendererControl() const; void setVideoRendererControl(MmRendererPlayerVideoRendererControl *videoControl); @@ -103,19 +105,25 @@ public: MmRendererVideoWindowControl *videoWindowControl() const; void setVideoWindowControl(MmRendererVideoWindowControl *videoControl); void setMetaDataReaderControl(MmRendererMetaDataReaderControl *metaDataReaderControl); + void setAudioRoleControl(MmRendererAudioRoleControl *audioRoleControl); + void setCustomAudioRoleControl(MmRendererCustomAudioRoleControl *customAudioRoleControl); protected: virtual void startMonitoring() = 0; virtual void stopMonitoring() = 0; + virtual void resetMonitoring() = 0; void openConnection(); void emitMmError(const QString &msg); void emitPError(const QString &msg); void setMmPosition(qint64 newPosition); void setMmBufferStatus(const QString &bufferStatus); - void setMmBufferLevel(const QString &bufferLevel); + void setMmBufferLevel(int level, int capacity); void handleMmStopped(); - void handleMmStatusUpdate(qint64 position); + void handleMmSuspend(const QString &reason); + void handleMmSuspendRemoval(const QString &bufferStatus); + void handleMmPause(); + void handleMmPlay(); void updateMetaData(const strm_dict_t *dict); // must be called from subclass dtors (calls virtual function stopMonitoring()) @@ -156,12 +164,13 @@ private: QPointer<MmRendererPlayerVideoRendererControl> m_videoRendererControl; QPointer<MmRendererVideoWindowControl> m_videoWindowControl; QPointer<MmRendererMetaDataReaderControl> m_metaDataReaderControl; + QPointer<MmRendererAudioRoleControl> m_audioRoleControl; + QPointer<MmRendererCustomAudioRoleControl> m_customAudioRoleControl; MmRendererMetaData m_metaData; qint64 m_position; QMediaPlayer::MediaStatus m_mediaStatus; bool m_playAfterMediaLoaded; bool m_inputAttached; - int m_stopEventsToIgnore; int m_bufferLevel; QTimer m_loadingTimer; }; diff --git a/src/plugins/qnx/mediaplayer/mmrenderermediaplayerservice.cpp b/src/plugins/qnx/mediaplayer/mmrenderermediaplayerservice.cpp index 1258d199c..190cb8b80 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermediaplayerservice.cpp +++ b/src/plugins/qnx/mediaplayer/mmrenderermediaplayerservice.cpp @@ -38,6 +38,8 @@ ****************************************************************************/ #include "mmrenderermediaplayerservice.h" +#include "mmrendereraudiorolecontrol.h" +#include "mmrenderercustomaudiorolecontrol.h" #include "mmrenderermediaplayercontrol.h" #include "mmrenderermetadatareadercontrol.h" #include "mmrendererplayervideorenderercontrol.h" @@ -66,6 +68,8 @@ MmRendererMediaPlayerService::~MmRendererMediaPlayerService() delete m_videoWindowControl; delete m_mediaPlayerControl; delete m_metaDataReaderControl; + delete m_audioRoleControl; + delete m_customAudioRoleControl; } QMediaControl *MmRendererMediaPlayerService::requestControl(const char *name) @@ -76,15 +80,25 @@ QMediaControl *MmRendererMediaPlayerService::requestControl(const char *name) updateControls(); } return m_mediaPlayerControl; - } - else if (qstrcmp(name, QMetaDataReaderControl_iid) == 0) { + } else if (qstrcmp(name, QMetaDataReaderControl_iid) == 0) { if (!m_metaDataReaderControl) { m_metaDataReaderControl = new MmRendererMetaDataReaderControl(); updateControls(); } return m_metaDataReaderControl; - } - else if (qstrcmp(name, QVideoRendererControl_iid) == 0) { + } else if (qstrcmp(name, QAudioRoleControl_iid) == 0) { + if (!m_audioRoleControl) { + m_audioRoleControl = new MmRendererAudioRoleControl(); + updateControls(); + } + return m_audioRoleControl; + } else if (qstrcmp(name, QCustomAudioRoleControl_iid) == 0) { + if (!m_customAudioRoleControl) { + m_customAudioRoleControl = new MmRendererCustomAudioRoleControl(); + updateControls(); + } + return m_customAudioRoleControl; + } else if (qstrcmp(name, QVideoRendererControl_iid) == 0) { if (!m_appHasDrmPermissionChecked) { m_appHasDrmPermission = checkForDrmPermission(); m_appHasDrmPermissionChecked = true; @@ -102,8 +116,7 @@ QMediaControl *MmRendererMediaPlayerService::requestControl(const char *name) updateControls(); } return m_videoRendererControl; - } - else if (qstrcmp(name, QVideoWindowControl_iid) == 0) { + } else if (qstrcmp(name, QVideoWindowControl_iid) == 0) { if (!m_videoWindowControl) { m_videoWindowControl = new MmRendererVideoWindowControl(); updateControls(); @@ -123,6 +136,10 @@ void MmRendererMediaPlayerService::releaseControl(QMediaControl *control) m_mediaPlayerControl = 0; if (control == m_metaDataReaderControl) m_metaDataReaderControl = 0; + if (control == m_audioRoleControl) + m_audioRoleControl = 0; + if (control == m_customAudioRoleControl) + m_customAudioRoleControl = 0; delete control; } @@ -136,6 +153,12 @@ void MmRendererMediaPlayerService::updateControls() if (m_metaDataReaderControl && m_mediaPlayerControl) m_mediaPlayerControl->setMetaDataReaderControl(m_metaDataReaderControl); + + if (m_audioRoleControl && m_mediaPlayerControl) + m_mediaPlayerControl->setAudioRoleControl(m_audioRoleControl); + + if (m_customAudioRoleControl && m_mediaPlayerControl) + m_mediaPlayerControl->setCustomAudioRoleControl(m_customAudioRoleControl); } QT_END_NAMESPACE diff --git a/src/plugins/qnx/mediaplayer/mmrenderermediaplayerservice.h b/src/plugins/qnx/mediaplayer/mmrenderermediaplayerservice.h index de85293cb..ab3054af5 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermediaplayerservice.h +++ b/src/plugins/qnx/mediaplayer/mmrenderermediaplayerservice.h @@ -44,6 +44,8 @@ QT_BEGIN_NAMESPACE +class MmRendererAudioRoleControl; +class MmRendererCustomAudioRoleControl; class MmRendererMediaPlayerControl; class MmRendererMetaDataReaderControl; class MmRendererPlayerVideoRendererControl; @@ -56,8 +58,8 @@ public: explicit MmRendererMediaPlayerService(QObject *parent = 0); ~MmRendererMediaPlayerService(); - QMediaControl *requestControl(const char *name) Q_DECL_OVERRIDE; - void releaseControl(QMediaControl *control) Q_DECL_OVERRIDE; + QMediaControl *requestControl(const char *name) override; + void releaseControl(QMediaControl *control) override; private: void updateControls(); @@ -66,6 +68,8 @@ private: QPointer<MmRendererVideoWindowControl> m_videoWindowControl; QPointer<MmRendererMediaPlayerControl> m_mediaPlayerControl; QPointer<MmRendererMetaDataReaderControl> m_metaDataReaderControl; + QPointer<MmRendererAudioRoleControl> m_audioRoleControl; + QPointer<MmRendererCustomAudioRoleControl> m_customAudioRoleControl; bool m_appHasDrmPermission : 1; bool m_appHasDrmPermissionChecked : 1; diff --git a/src/plugins/qnx/mediaplayer/mmrenderermetadatareadercontrol.h b/src/plugins/qnx/mediaplayer/mmrenderermetadatareadercontrol.h index 9c000224e..878420460 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermetadatareadercontrol.h +++ b/src/plugins/qnx/mediaplayer/mmrenderermetadatareadercontrol.h @@ -50,10 +50,10 @@ class MmRendererMetaDataReaderControl : public QMetaDataReaderControl public: explicit MmRendererMetaDataReaderControl(QObject *parent = 0); - bool isMetaDataAvailable() const Q_DECL_OVERRIDE; + bool isMetaDataAvailable() const override; - QVariant metaData(const QString &key) const Q_DECL_OVERRIDE; - QStringList availableMetaData() const Q_DECL_OVERRIDE; + QVariant metaData(const QString &key) const override; + QStringList availableMetaData() const override; void setMetaData(const MmRendererMetaData &data); diff --git a/src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.h b/src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.h index 878aa4bb0..c547ef534 100644 --- a/src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.h +++ b/src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.h @@ -56,8 +56,8 @@ public: explicit MmRendererPlayerVideoRendererControl(QObject *parent = 0); ~MmRendererPlayerVideoRendererControl(); - QAbstractVideoSurface *surface() const Q_DECL_OVERRIDE; - void setSurface(QAbstractVideoSurface *surface) Q_DECL_OVERRIDE; + QAbstractVideoSurface *surface() const override; + void setSurface(QAbstractVideoSurface *surface) override; // Called by media control void attachDisplay(mmr_context_t *context); @@ -65,7 +65,7 @@ public: void pause(); void resume(); - void customEvent(QEvent *) Q_DECL_OVERRIDE; + void customEvent(QEvent *) override; private Q_SLOTS: void updateScene(const QSize &size); diff --git a/src/plugins/qnx/mediaplayer/mmrendererutil.cpp b/src/plugins/qnx/mediaplayer/mmrendererutil.cpp index 239d9d52e..d8af4a746 100644 --- a/src/plugins/qnx/mediaplayer/mmrendererutil.cpp +++ b/src/plugins/qnx/mediaplayer/mmrendererutil.cpp @@ -41,6 +41,11 @@ #include <QDebug> #include <QDir> #include <QFile> +#include <QJsonDocument> +#include <QJsonObject> +#include <QJsonValue> +#include <QMutex> +#include <QMutex> #include <QString> #include <QXmlStreamReader> @@ -85,6 +90,97 @@ static const MmError mmErrors[] = { }; static const unsigned int numMmErrors = sizeof(mmErrors) / sizeof(MmError); +static QBasicMutex roleMapMutex; +static bool roleMapInitialized = false; +static QString roleMap[QAudio::CustomRole + 1]; + +template <typename T, size_t N> +constexpr size_t countof(T (&)[N]) +{ + return N; +} + +constexpr bool inBounds(QAudio::Role r) +{ + return r >= 0 && r < countof(roleMap); +} + +QString keyValueMapsLocation() +{ + QByteArray qtKeyValueMaps = qgetenv("QT_KEY_VALUE_MAPS"); + if (qtKeyValueMaps.isNull()) + return QStringLiteral("/etc/qt/keyvaluemaps"); + else + return qtKeyValueMaps; +} + +QJsonObject loadMapObject(const QString &keyValueMapPath) +{ + QFile mapFile(keyValueMapsLocation() + keyValueMapPath); + if (mapFile.open(QIODevice::ReadOnly)) { + QByteArray mapFileContents = mapFile.readAll(); + QJsonDocument mapDocument = QJsonDocument::fromJson(mapFileContents); + if (mapDocument.isObject()) { + QJsonObject mapObject = mapDocument.object(); + return mapObject; + } + } + return QJsonObject(); +} + +static void loadRoleMap() +{ + QMutexLocker locker(&roleMapMutex); + + if (!roleMapInitialized) { + QJsonObject mapObject = loadMapObject("/QAudio/Role.json"); + if (!mapObject.isEmpty()) { + // Wrapping the loads in a switch like this ensures that anyone adding + // a new enumerator will be notified that this code must be updated. A + // compile error will occur because the enumerator is missing from the + // switch. A compile error will also occur if the enumerator used to + // size the mapping table isn't updated when a new enumerator is added. + // One or more enumerators will be outside the bounds of the array when + // the wrong enumerator is used to size the array. + // + // The code loads a mapping for each enumerator because role is set + // to UnknownRole and all the cases drop through to the next case. +#pragma GCC diagnostic push +#pragma GCC diagnostic error "-Wswitch" +#define loadRoleMapping(r) \ + case QAudio::r: \ + static_assert(inBounds(QAudio::r), #r " out-of-bounds." \ + " Do you need to change the enumerator used to size the mapping table" \ + " because you added new QAudio::Role enumerators?"); \ + roleMap[QAudio::r] = mapObject.value(QLatin1String(#r)).toString(); + + QAudio::Role role = QAudio::UnknownRole; + switch (role) { + loadRoleMapping(UnknownRole); + loadRoleMapping(MusicRole); + loadRoleMapping(VideoRole); + loadRoleMapping(VoiceCommunicationRole); + loadRoleMapping(AlarmRole); + loadRoleMapping(NotificationRole); + loadRoleMapping(RingtoneRole); + loadRoleMapping(AccessibilityRole); + loadRoleMapping(SonificationRole); + loadRoleMapping(GameRole); + loadRoleMapping(CustomRole); + } +#undef loadRoleMapping +#pragma GCC diagnostic pop + + if (!roleMap[QAudio::CustomRole].isEmpty()) { + qWarning("CustomRole mapping ignored"); + roleMap[QAudio::CustomRole].clear(); + } + } + + roleMapInitialized = true; + } +} + QString mmErrorMessage(const QString &msg, mmr_context_t *context, int *errorCode) { const mmr_error_info_t * const mmError = mmr_error_info(context); @@ -124,4 +220,27 @@ bool checkForDrmPermission() return false; } +QString qnxAudioType(QAudio::Role role) +{ + loadRoleMap(); + + if (role >= 0 && role < countof(roleMap)) + return roleMap[role]; + else + return QString(); +} + +QList<QAudio::Role> qnxSupportedAudioRoles() +{ + loadRoleMap(); + + QList<QAudio::Role> result; + for (size_t i = 0; i < countof(roleMap); ++i) { + if (!roleMap[i].isEmpty() || (i == QAudio::UnknownRole)) + result.append(static_cast<QAudio::Role>(i)); + } + + return result; +} + QT_END_NAMESPACE diff --git a/src/plugins/qnx/mediaplayer/mmrendererutil.h b/src/plugins/qnx/mediaplayer/mmrendererutil.h index 8017b2690..ac6f73a7d 100644 --- a/src/plugins/qnx/mediaplayer/mmrendererutil.h +++ b/src/plugins/qnx/mediaplayer/mmrendererutil.h @@ -40,6 +40,7 @@ #define MMRENDERERUTIL_H #include <QtCore/qglobal.h> +#include <QtMultimedia/qaudio.h> typedef struct mmr_context mmr_context_t; @@ -51,6 +52,9 @@ QString mmErrorMessage(const QString &msg, mmr_context_t *context, int * errorCo bool checkForDrmPermission(); +QString qnxAudioType(QAudio::Role role); +QList<QAudio::Role> qnxSupportedAudioRoles(); + QT_END_NAMESPACE #endif diff --git a/src/plugins/qnx/mediaplayer/mmrenderervideowindowcontrol.h b/src/plugins/qnx/mediaplayer/mmrenderervideowindowcontrol.h index 5bfd192bb..8327e259d 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderervideowindowcontrol.h +++ b/src/plugins/qnx/mediaplayer/mmrenderervideowindowcontrol.h @@ -54,33 +54,33 @@ public: explicit MmRendererVideoWindowControl(QObject *parent = 0); ~MmRendererVideoWindowControl(); - WId winId() const Q_DECL_OVERRIDE; - void setWinId(WId id) Q_DECL_OVERRIDE; + WId winId() const override; + void setWinId(WId id) override; - QRect displayRect() const Q_DECL_OVERRIDE; - void setDisplayRect(const QRect &rect) Q_DECL_OVERRIDE; + QRect displayRect() const override; + void setDisplayRect(const QRect &rect) override; - bool isFullScreen() const Q_DECL_OVERRIDE; - void setFullScreen(bool fullScreen) Q_DECL_OVERRIDE; + bool isFullScreen() const override; + void setFullScreen(bool fullScreen) override; - void repaint() Q_DECL_OVERRIDE; + void repaint() override; - QSize nativeSize() const Q_DECL_OVERRIDE; + QSize nativeSize() const override; - Qt::AspectRatioMode aspectRatioMode() const Q_DECL_OVERRIDE; - void setAspectRatioMode(Qt::AspectRatioMode mode) Q_DECL_OVERRIDE; + Qt::AspectRatioMode aspectRatioMode() const override; + void setAspectRatioMode(Qt::AspectRatioMode mode) override; - int brightness() const Q_DECL_OVERRIDE; - void setBrightness(int brightness) Q_DECL_OVERRIDE; + int brightness() const override; + void setBrightness(int brightness) override; - int contrast() const Q_DECL_OVERRIDE; - void setContrast(int contrast) Q_DECL_OVERRIDE; + int contrast() const override; + void setContrast(int contrast) override; - int hue() const Q_DECL_OVERRIDE; - void setHue(int hue) Q_DECL_OVERRIDE; + int hue() const override; + void setHue(int hue) override; - int saturation() const Q_DECL_OVERRIDE; - void setSaturation(int saturation) Q_DECL_OVERRIDE; + int saturation() const override; + void setSaturation(int saturation) override; // // Called by media control diff --git a/src/plugins/qnx/mediaplayer/mmreventmediaplayercontrol.cpp b/src/plugins/qnx/mediaplayer/mmreventmediaplayercontrol.cpp index a0bac1261..c050c03c5 100644 --- a/src/plugins/qnx/mediaplayer/mmreventmediaplayercontrol.cpp +++ b/src/plugins/qnx/mediaplayer/mmreventmediaplayercontrol.cpp @@ -42,13 +42,39 @@ #include "mmrenderervideowindowcontrol.h" #include <mm/renderer.h> +#include <tuple> QT_BEGIN_NAMESPACE +static std::tuple<int, int, bool> parseBufferLevel(const QByteArray &value) +{ + const int slashPos = value.indexOf('/'); + if (slashPos <= 0) + return std::make_tuple(0, 0, false); + + bool ok = false; + const int level = value.left(slashPos).toInt(&ok); + if (!ok || level < 0) + return std::make_tuple(0, 0, false); + + const int capacity = value.mid(slashPos + 1).toInt(&ok); + if (!ok || capacity < 0) + return std::make_tuple(0, 0, false); + + return std::make_tuple(level, capacity, true); +} + MmrEventMediaPlayerControl::MmrEventMediaPlayerControl(QObject *parent) : MmRendererMediaPlayerControl(parent) , m_eventThread(nullptr) + , m_bufferStatus("") + , m_bufferLevel(0) + , m_bufferCapacity(0) + , m_position(0) + , m_suspended(false) + , m_suspendedReason("unknown") , m_state(MMR_STATE_IDLE) + , m_speed(0) { openConnection(); } @@ -75,6 +101,18 @@ void MmrEventMediaPlayerControl::stopMonitoring() m_eventThread = nullptr; } +void MmrEventMediaPlayerControl::resetMonitoring() +{ + m_bufferStatus = ""; + m_bufferLevel = 0; + m_bufferCapacity = 0; + m_position = 0; + m_suspended = false; + m_suspendedReason = "unknown"; + m_state = MMR_STATE_IDLE; + m_speed = 0; +} + bool MmrEventMediaPlayerControl::nativeEventFilter(const QByteArray &eventType, void *message, long *result) @@ -102,32 +140,68 @@ void MmrEventMediaPlayerControl::readEvents() if (event->data) { const strm_string_t *value; value = strm_dict_find_rstr(event->data, "bufferstatus"); - if (value) - setMmBufferStatus(QString::fromLatin1(strm_string_get(value))); + if (value) { + m_bufferStatus = QByteArray(strm_string_get(value)); + if (!m_suspended) + setMmBufferStatus(m_bufferStatus); + } value = strm_dict_find_rstr(event->data, "bufferlevel"); - if (value) - setMmBufferLevel(QString::fromLatin1(strm_string_get(value))); + if (value) { + const char *cstrValue = strm_string_get(value); + int level; + int capacity; + bool ok; + std::tie(level, capacity, ok) = parseBufferLevel(QByteArray(cstrValue)); + if (!ok) { + qCritical("Could not parse buffer capacity from '%s'", cstrValue); + } else { + m_bufferLevel = level; + m_bufferCapacity = capacity; + setMmBufferLevel(level, capacity); + } + } + + value = strm_dict_find_rstr(event->data, "suspended"); + if (value) { + if (!m_suspended) { + m_suspended = true; + m_suspendedReason = strm_string_get(value); + handleMmSuspend(m_suspendedReason); + } + } else if (m_suspended) { + m_suspended = false; + handleMmSuspendRemoval(m_bufferStatus); + } } if (event->pos_str) { const QByteArray valueBa = QByteArray(event->pos_str); bool ok; - const qint64 position = valueBa.toLongLong(&ok); + m_position = valueBa.toLongLong(&ok); if (!ok) { qCritical("Could not parse position from '%s'", valueBa.constData()); } else { - setMmPosition(position); + setMmPosition(m_position); } } break; } + case MMR_EVENT_STATE: { + if (event->state == MMR_STATE_PLAYING && m_speed != event->speed) { + m_speed = event->speed; + if (m_speed == 0) + handleMmPause(); + else + handleMmPlay(); + } + break; + } case MMR_EVENT_METADATA: { updateMetaData(event->data); break; } case MMR_EVENT_ERROR: - case MMR_EVENT_STATE: case MMR_EVENT_NONE: case MMR_EVENT_OVERFLOW: case MMR_EVENT_WARNING: diff --git a/src/plugins/qnx/mediaplayer/mmreventmediaplayercontrol.h b/src/plugins/qnx/mediaplayer/mmreventmediaplayercontrol.h index e0aa952a7..0e4defc5c 100644 --- a/src/plugins/qnx/mediaplayer/mmreventmediaplayercontrol.h +++ b/src/plugins/qnx/mediaplayer/mmreventmediaplayercontrol.h @@ -47,7 +47,7 @@ QT_BEGIN_NAMESPACE class MmrEventThread; -class MmrEventMediaPlayerControl Q_DECL_FINAL : public MmRendererMediaPlayerControl +class MmrEventMediaPlayerControl final : public MmRendererMediaPlayerControl { Q_OBJECT public: @@ -56,6 +56,7 @@ public: void startMonitoring() override; void stopMonitoring() override; + void resetMonitoring() override; bool nativeEventFilter(const QByteArray &eventType, void *message, @@ -66,7 +67,18 @@ private Q_SLOTS: private: MmrEventThread *m_eventThread; + + // status properties. + QByteArray m_bufferStatus; + int m_bufferLevel; + int m_bufferCapacity; + qint64 m_position; + bool m_suspended; + QByteArray m_suspendedReason; + + // state properties. mmr_state_t m_state; + int m_speed; }; QT_END_NAMESPACE diff --git a/src/plugins/qnx/neutrinoserviceplugin.h b/src/plugins/qnx/neutrinoserviceplugin.h index 6e4b6861e..62ed7f0bd 100644 --- a/src/plugins/qnx/neutrinoserviceplugin.h +++ b/src/plugins/qnx/neutrinoserviceplugin.h @@ -53,9 +53,9 @@ class NeutrinoServicePlugin public: NeutrinoServicePlugin(); - QMediaService *create(const QString &key) Q_DECL_OVERRIDE; - void release(QMediaService *service) Q_DECL_OVERRIDE; - QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const Q_DECL_OVERRIDE; + QMediaService *create(const QString &key) override; + void release(QMediaService *service) override; + QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const override; }; QT_END_NAMESPACE diff --git a/src/plugins/wasapi/qwasapiaudiodeviceinfo.cpp b/src/plugins/wasapi/qwasapiaudiodeviceinfo.cpp index e1a46841d..53345dec8 100644 --- a/src/plugins/wasapi/qwasapiaudiodeviceinfo.cpp +++ b/src/plugins/wasapi/qwasapiaudiodeviceinfo.cpp @@ -47,7 +47,7 @@ QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(lcMmDeviceInfo, "qt.multimedia.deviceinfo") QWasapiAudioDeviceInfo::QWasapiAudioDeviceInfo(QByteArray dev, QAudio::Mode mode) - : m_deviceName(dev) + : m_deviceName(QString::fromLocal8Bit(dev)) { qCDebug(lcMmDeviceInfo) << __FUNCTION__ << dev << mode; m_interface = QWasapiUtils::createOrGetInterface(dev, mode); diff --git a/src/plugins/wasapi/qwasapiaudiodeviceinfo.h b/src/plugins/wasapi/qwasapiaudiodeviceinfo.h index 97966c171..878d0273a 100644 --- a/src/plugins/wasapi/qwasapiaudiodeviceinfo.h +++ b/src/plugins/wasapi/qwasapiaudiodeviceinfo.h @@ -61,15 +61,15 @@ public: explicit QWasapiAudioDeviceInfo(QByteArray dev,QAudio::Mode mode); ~QWasapiAudioDeviceInfo(); - QAudioFormat preferredFormat() const Q_DECL_OVERRIDE; - bool isFormatSupported(const QAudioFormat& format) const Q_DECL_OVERRIDE; - QString deviceName() const Q_DECL_OVERRIDE; - QStringList supportedCodecs() Q_DECL_OVERRIDE; - QList<int> supportedSampleRates() Q_DECL_OVERRIDE; - QList<int> supportedChannelCounts() Q_DECL_OVERRIDE; - QList<int> supportedSampleSizes() Q_DECL_OVERRIDE; - QList<QAudioFormat::Endian> supportedByteOrders() Q_DECL_OVERRIDE; - QList<QAudioFormat::SampleType> supportedSampleTypes() Q_DECL_OVERRIDE; + QAudioFormat preferredFormat() const override; + bool isFormatSupported(const QAudioFormat& format) const override; + QString deviceName() const override; + QStringList supportedCodecs() override; + QList<int> supportedSampleRates() override; + QList<int> supportedChannelCounts() override; + QList<int> supportedSampleSizes() override; + QList<QAudioFormat::Endian> supportedByteOrders() override; + QList<QAudioFormat::SampleType> supportedSampleTypes() override; private: Microsoft::WRL::ComPtr<AudioInterface> m_interface; diff --git a/src/plugins/wasapi/qwasapiaudioinput.h b/src/plugins/wasapi/qwasapiaudioinput.h index 34ede06b7..babfb5b10 100644 --- a/src/plugins/wasapi/qwasapiaudioinput.h +++ b/src/plugins/wasapi/qwasapiaudioinput.h @@ -66,26 +66,26 @@ public: explicit QWasapiAudioInput(const QByteArray &device); ~QWasapiAudioInput(); - void start(QIODevice* device) Q_DECL_OVERRIDE; - QIODevice* start() Q_DECL_OVERRIDE; - void stop() Q_DECL_OVERRIDE; - void reset() Q_DECL_OVERRIDE; - void suspend() Q_DECL_OVERRIDE; - void resume() Q_DECL_OVERRIDE; - int bytesReady() const Q_DECL_OVERRIDE; - int periodSize() const Q_DECL_OVERRIDE; - void setBufferSize(int value) Q_DECL_OVERRIDE; - int bufferSize() const Q_DECL_OVERRIDE; - void setNotifyInterval(int milliSeconds) Q_DECL_OVERRIDE; - int notifyInterval() const Q_DECL_OVERRIDE; - qint64 processedUSecs() const Q_DECL_OVERRIDE; - qint64 elapsedUSecs() const Q_DECL_OVERRIDE; - QAudio::Error error() const Q_DECL_OVERRIDE; - QAudio::State state() const Q_DECL_OVERRIDE; - void setFormat(const QAudioFormat& fmt) Q_DECL_OVERRIDE; - QAudioFormat format() const Q_DECL_OVERRIDE; - void setVolume(qreal) Q_DECL_OVERRIDE; - qreal volume() const Q_DECL_OVERRIDE; + void start(QIODevice* device) override; + QIODevice* start() override; + void stop() override; + void reset() override; + void suspend() override; + void resume() override; + int bytesReady() const override; + int periodSize() const override; + void setBufferSize(int value) override; + int bufferSize() const override; + void setNotifyInterval(int milliSeconds) override; + int notifyInterval() const override; + qint64 processedUSecs() const override; + qint64 elapsedUSecs() const override; + QAudio::Error error() const override; + QAudio::State state() const override; + void setFormat(const QAudioFormat& fmt) override; + QAudioFormat format() const override; + void setVolume(qreal) override; + qreal volume() const override; void process(); public slots: diff --git a/src/plugins/wasapi/qwasapiaudiooutput.h b/src/plugins/wasapi/qwasapiaudiooutput.h index 02974071b..49219c5cc 100644 --- a/src/plugins/wasapi/qwasapiaudiooutput.h +++ b/src/plugins/wasapi/qwasapiaudiooutput.h @@ -67,26 +67,26 @@ public: explicit QWasapiAudioOutput(const QByteArray &device); ~QWasapiAudioOutput(); - void start(QIODevice* device) Q_DECL_OVERRIDE; - QIODevice* start() Q_DECL_OVERRIDE; - void stop() Q_DECL_OVERRIDE; - void reset() Q_DECL_OVERRIDE; - void suspend() Q_DECL_OVERRIDE; - void resume() Q_DECL_OVERRIDE; - int bytesFree() const Q_DECL_OVERRIDE; - int periodSize() const Q_DECL_OVERRIDE; - void setBufferSize(int value) Q_DECL_OVERRIDE; - int bufferSize() const Q_DECL_OVERRIDE; - void setNotifyInterval(int milliSeconds) Q_DECL_OVERRIDE; - int notifyInterval() const Q_DECL_OVERRIDE; - qint64 processedUSecs() const Q_DECL_OVERRIDE; - qint64 elapsedUSecs() const Q_DECL_OVERRIDE; - QAudio::Error error() const Q_DECL_OVERRIDE; - QAudio::State state() const Q_DECL_OVERRIDE; - void setFormat(const QAudioFormat& fmt) Q_DECL_OVERRIDE; - QAudioFormat format() const Q_DECL_OVERRIDE; - void setVolume(qreal) Q_DECL_OVERRIDE; - qreal volume() const Q_DECL_OVERRIDE; + void start(QIODevice* device) override; + QIODevice* start() override; + void stop() override; + void reset() override; + void suspend() override; + void resume() override; + int bytesFree() const override; + int periodSize() const override; + void setBufferSize(int value) override; + int bufferSize() const override; + void setNotifyInterval(int milliSeconds) override; + int notifyInterval() const override; + qint64 processedUSecs() const override; + qint64 elapsedUSecs() const override; + QAudio::Error error() const override; + QAudio::State state() const override; + void setFormat(const QAudioFormat& fmt) override; + QAudioFormat format() const override; + void setVolume(qreal) override; + qreal volume() const override; void process(); public slots: diff --git a/src/plugins/wasapi/qwasapiplugin.h b/src/plugins/wasapi/qwasapiplugin.h index e69e7895f..7b20676f6 100644 --- a/src/plugins/wasapi/qwasapiplugin.h +++ b/src/plugins/wasapi/qwasapiplugin.h @@ -60,11 +60,11 @@ public: explicit QWasapiPlugin(QObject *parent = 0); ~QWasapiPlugin() {} - QByteArray defaultDevice(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QList<QByteArray> availableDevices(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QAbstractAudioInput *createInput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioOutput *createOutput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) Q_DECL_OVERRIDE; + QByteArray defaultDevice(QAudio::Mode mode) const override; + QList<QByteArray> availableDevices(QAudio::Mode mode) const override; + QAbstractAudioInput *createInput(const QByteArray &device) override; + QAbstractAudioOutput *createOutput(const QByteArray &device) override; + QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) override; private: QList<QByteArray> m_deviceNames; diff --git a/src/plugins/windowsaudio/qwindowsaudiooutput.h b/src/plugins/windowsaudio/qwindowsaudiooutput.h index 19b4b92af..f25475b02 100644 --- a/src/plugins/windowsaudio/qwindowsaudiooutput.h +++ b/src/plugins/windowsaudio/qwindowsaudiooutput.h @@ -116,7 +116,6 @@ private slots: private: QByteArray m_device; - bool resuming; int bytesAvailable; QTime timeStamp; qint64 elapsedTimeOffset; @@ -139,8 +138,6 @@ private: WAVEFORMATEXTENSIBLE wfx; HWAVEOUT hWaveOut; - MMRESULT result; - WAVEHDR header; WAVEHDR* waveBlocks; volatile bool finished; volatile int waveFreeBlockCount; diff --git a/src/plugins/windowsaudio/qwindowsaudioplugin.h b/src/plugins/windowsaudio/qwindowsaudioplugin.h index 7b500a39c..a155ae082 100644 --- a/src/plugins/windowsaudio/qwindowsaudioplugin.h +++ b/src/plugins/windowsaudio/qwindowsaudioplugin.h @@ -56,11 +56,11 @@ public: QWindowsAudioPlugin(QObject *parent = 0); ~QWindowsAudioPlugin() {} - QByteArray defaultDevice(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QList<QByteArray> availableDevices(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QAbstractAudioInput *createInput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioOutput *createOutput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) Q_DECL_OVERRIDE; + QByteArray defaultDevice(QAudio::Mode mode) const override; + QList<QByteArray> availableDevices(QAudio::Mode mode) const override; + QAbstractAudioInput *createInput(const QByteArray &device) override; + QAbstractAudioOutput *createOutput(const QByteArray &device) override; + QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) override; }; QT_END_NAMESPACE diff --git a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp index 79545f6ee..3544031a7 100644 --- a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp +++ b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp @@ -150,12 +150,12 @@ public: create(); } - MapMode mapMode() const Q_DECL_OVERRIDE + MapMode mapMode() const override { return NotMapped; } - uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) Q_DECL_OVERRIDE + uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) override { Q_UNUSED(mode); Q_UNUSED(numBytes); @@ -163,11 +163,11 @@ public: return 0; } - void unmap() Q_DECL_OVERRIDE + void unmap() override { } - QVariant handle() const Q_DECL_OVERRIDE + QVariant handle() const override { return QVariant::fromValue(textureId()); } diff --git a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.h b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.h index 53dcb6b94..e190c8c4a 100644 --- a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.h +++ b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.h @@ -63,8 +63,8 @@ public: MediaFoundation }; - QAbstractVideoSurface *surface() const Q_DECL_OVERRIDE; - void setSurface(QAbstractVideoSurface *surface) Q_DECL_OVERRIDE; + QAbstractVideoSurface *surface() const override; + void setSurface(QAbstractVideoSurface *surface) override; QSize size() const; void setSize(const QSize &size); diff --git a/src/plugins/winrt/qwinrtcameracontrol.cpp b/src/plugins/winrt/qwinrtcameracontrol.cpp index 527dd6e8f..4c515bc3d 100644 --- a/src/plugins/winrt/qwinrtcameracontrol.cpp +++ b/src/plugins/winrt/qwinrtcameracontrol.cpp @@ -245,12 +245,12 @@ public: { if (m_pendingSamples.load() < 3) { m_pendingSamples.ref(); - return QueueEvent(MEStreamSinkRequestSample, GUID_NULL, S_OK, Q_NULLPTR); + return QueueEvent(MEStreamSinkRequestSample, GUID_NULL, S_OK, nullptr); } return S_OK; } - HRESULT __stdcall GetEvent(DWORD flags, IMFMediaEvent **event) Q_DECL_OVERRIDE + HRESULT __stdcall GetEvent(DWORD flags, IMFMediaEvent **event) override { QMutexLocker locker(&m_mutex); // Create an extra reference to avoid deadlock @@ -260,43 +260,43 @@ public: return eventQueue->GetEvent(flags, event); } - HRESULT __stdcall BeginGetEvent(IMFAsyncCallback *callback, IUnknown *state) Q_DECL_OVERRIDE + HRESULT __stdcall BeginGetEvent(IMFAsyncCallback *callback, IUnknown *state) override { QMutexLocker locker(&m_mutex); HRESULT hr = m_eventQueue->BeginGetEvent(callback, state); return hr; } - HRESULT __stdcall EndGetEvent(IMFAsyncResult *result, IMFMediaEvent **event) Q_DECL_OVERRIDE + HRESULT __stdcall EndGetEvent(IMFAsyncResult *result, IMFMediaEvent **event) override { QMutexLocker locker(&m_mutex); return m_eventQueue->EndGetEvent(result, event); } - HRESULT __stdcall QueueEvent(MediaEventType eventType, const GUID &extendedType, HRESULT status, const PROPVARIANT *value) Q_DECL_OVERRIDE + HRESULT __stdcall QueueEvent(MediaEventType eventType, const GUID &extendedType, HRESULT status, const PROPVARIANT *value) override { QMutexLocker locker(&m_mutex); return m_eventQueue->QueueEventParamVar(eventType, extendedType, status, value); } - HRESULT __stdcall GetMediaSink(IMFMediaSink **mediaSink) Q_DECL_OVERRIDE + HRESULT __stdcall GetMediaSink(IMFMediaSink **mediaSink) override { *mediaSink = m_sink; return S_OK; } - HRESULT __stdcall GetIdentifier(DWORD *identifier) Q_DECL_OVERRIDE + HRESULT __stdcall GetIdentifier(DWORD *identifier) override { *identifier = 0; return S_OK; } - HRESULT __stdcall GetMediaTypeHandler(IMFMediaTypeHandler **handler) Q_DECL_OVERRIDE + HRESULT __stdcall GetMediaTypeHandler(IMFMediaTypeHandler **handler) override { return QueryInterface(IID_PPV_ARGS(handler)); } - HRESULT __stdcall ProcessSample(IMFSample *sample) Q_DECL_OVERRIDE + HRESULT __stdcall ProcessSample(IMFSample *sample) override { ComPtr<IMFMediaBuffer> buffer; HRESULT hr = sample->GetBufferByIndex(0, &buffer); @@ -311,7 +311,7 @@ public: return hr; } - HRESULT __stdcall PlaceMarker(MFSTREAMSINK_MARKER_TYPE type, const PROPVARIANT *value, const PROPVARIANT *context) Q_DECL_OVERRIDE + HRESULT __stdcall PlaceMarker(MFSTREAMSINK_MARKER_TYPE type, const PROPVARIANT *value, const PROPVARIANT *context) override { Q_UNUSED(type); Q_UNUSED(value); @@ -319,14 +319,14 @@ public: return S_OK; } - HRESULT __stdcall Flush() Q_DECL_OVERRIDE + HRESULT __stdcall Flush() override { m_videoRenderer->discardBuffers(); m_pendingSamples.store(0); return S_OK; } - HRESULT __stdcall IsMediaTypeSupported(IMFMediaType *type, IMFMediaType **) Q_DECL_OVERRIDE + HRESULT __stdcall IsMediaTypeSupported(IMFMediaType *type, IMFMediaType **) override { HRESULT hr; GUID majorType; @@ -337,34 +337,34 @@ public: return S_OK; } - HRESULT __stdcall GetMediaTypeCount(DWORD *typeCount) Q_DECL_OVERRIDE + HRESULT __stdcall GetMediaTypeCount(DWORD *typeCount) override { *typeCount = 1; return S_OK; } - HRESULT __stdcall GetMediaTypeByIndex(DWORD index, IMFMediaType **type) Q_DECL_OVERRIDE + HRESULT __stdcall GetMediaTypeByIndex(DWORD index, IMFMediaType **type) override { if (index == 0) return m_type.CopyTo(type); return E_BOUNDS; } - HRESULT __stdcall SetCurrentMediaType(IMFMediaType *type) Q_DECL_OVERRIDE + HRESULT __stdcall SetCurrentMediaType(IMFMediaType *type) override { - if (FAILED(IsMediaTypeSupported(type, Q_NULLPTR))) + if (FAILED(IsMediaTypeSupported(type, nullptr))) return MF_E_INVALIDREQUEST; m_type = type; return S_OK; } - HRESULT __stdcall GetCurrentMediaType(IMFMediaType **type) Q_DECL_OVERRIDE + HRESULT __stdcall GetCurrentMediaType(IMFMediaType **type) override { return m_type.CopyTo(type); } - HRESULT __stdcall GetMajorType(GUID *majorType) Q_DECL_OVERRIDE + HRESULT __stdcall GetMajorType(GUID *majorType) override { return m_type->GetMajorType(majorType); } @@ -405,19 +405,19 @@ public: return m_stream->RequestSample(); } - HRESULT __stdcall SetProperties(Collections::IPropertySet *configuration) Q_DECL_OVERRIDE + HRESULT __stdcall SetProperties(Collections::IPropertySet *configuration) override { Q_UNUSED(configuration); return E_NOTIMPL; } - HRESULT __stdcall GetCharacteristics(DWORD *characteristics) Q_DECL_OVERRIDE + HRESULT __stdcall GetCharacteristics(DWORD *characteristics) override { *characteristics = MEDIASINK_FIXED_STREAMS | MEDIASINK_RATELESS; return S_OK; } - HRESULT __stdcall AddStreamSink(DWORD streamSinkIdentifier, IMFMediaType *mediaType, IMFStreamSink **streamSink) Q_DECL_OVERRIDE + HRESULT __stdcall AddStreamSink(DWORD streamSinkIdentifier, IMFMediaType *mediaType, IMFStreamSink **streamSink) override { Q_UNUSED(streamSinkIdentifier); Q_UNUSED(mediaType); @@ -425,33 +425,33 @@ public: return E_NOTIMPL; } - HRESULT __stdcall RemoveStreamSink(DWORD streamSinkIdentifier) Q_DECL_OVERRIDE + HRESULT __stdcall RemoveStreamSink(DWORD streamSinkIdentifier) override { Q_UNUSED(streamSinkIdentifier); return E_NOTIMPL; } - HRESULT __stdcall GetStreamSinkCount(DWORD *streamSinkCount) Q_DECL_OVERRIDE + HRESULT __stdcall GetStreamSinkCount(DWORD *streamSinkCount) override { *streamSinkCount = 1; return S_OK; } - HRESULT __stdcall GetStreamSinkByIndex(DWORD index, IMFStreamSink **streamSink) Q_DECL_OVERRIDE + HRESULT __stdcall GetStreamSinkByIndex(DWORD index, IMFStreamSink **streamSink) override { if (index == 0) return m_stream.CopyTo(streamSink); return MF_E_INVALIDINDEX; } - HRESULT __stdcall GetStreamSinkById(DWORD streamSinkIdentifier, IMFStreamSink **streamSink) Q_DECL_OVERRIDE + HRESULT __stdcall GetStreamSinkById(DWORD streamSinkIdentifier, IMFStreamSink **streamSink) override { // ID and index are always 0 HRESULT hr = GetStreamSinkByIndex(streamSinkIdentifier, streamSink); return hr == MF_E_INVALIDINDEX ? MF_E_INVALIDSTREAMNUMBER : hr; } - HRESULT __stdcall SetPresentationClock(IMFPresentationClock *presentationClock) Q_DECL_OVERRIDE + HRESULT __stdcall SetPresentationClock(IMFPresentationClock *presentationClock) override { HRESULT hr = S_OK; m_presentationClock = presentationClock; @@ -460,19 +460,19 @@ public: return hr; } - HRESULT __stdcall GetPresentationClock(IMFPresentationClock **presentationClock) Q_DECL_OVERRIDE + HRESULT __stdcall GetPresentationClock(IMFPresentationClock **presentationClock) override { return m_presentationClock.CopyTo(presentationClock); } - HRESULT __stdcall Shutdown() Q_DECL_OVERRIDE + HRESULT __stdcall Shutdown() override { m_stream->Flush(); scheduleSetActive(false); return m_presentationClock ? m_presentationClock->Stop() : S_OK; } - HRESULT __stdcall OnClockStart(MFTIME systemTime, LONGLONG clockStartOffset) Q_DECL_OVERRIDE + HRESULT __stdcall OnClockStart(MFTIME systemTime, LONGLONG clockStartOffset) override { Q_UNUSED(systemTime); Q_UNUSED(clockStartOffset); @@ -482,34 +482,34 @@ public: return S_OK; } - HRESULT __stdcall OnClockStop(MFTIME systemTime) Q_DECL_OVERRIDE + HRESULT __stdcall OnClockStop(MFTIME systemTime) override { Q_UNUSED(systemTime); scheduleSetActive(false); - return m_stream->QueueEvent(MEStreamSinkStopped, GUID_NULL, S_OK, Q_NULLPTR); + return m_stream->QueueEvent(MEStreamSinkStopped, GUID_NULL, S_OK, nullptr); } - HRESULT __stdcall OnClockPause(MFTIME systemTime) Q_DECL_OVERRIDE + HRESULT __stdcall OnClockPause(MFTIME systemTime) override { Q_UNUSED(systemTime); scheduleSetActive(false); - return m_stream->QueueEvent(MEStreamSinkPaused, GUID_NULL, S_OK, Q_NULLPTR); + return m_stream->QueueEvent(MEStreamSinkPaused, GUID_NULL, S_OK, nullptr); } - HRESULT __stdcall OnClockRestart(MFTIME systemTime) Q_DECL_OVERRIDE + HRESULT __stdcall OnClockRestart(MFTIME systemTime) override { Q_UNUSED(systemTime); scheduleSetActive(true); - return m_stream->QueueEvent(MEStreamSinkStarted, GUID_NULL, S_OK, Q_NULLPTR); + return m_stream->QueueEvent(MEStreamSinkStarted, GUID_NULL, S_OK, nullptr); } - HRESULT __stdcall OnClockSetRate(MFTIME systemTime, float rate) Q_DECL_OVERRIDE + HRESULT __stdcall OnClockSetRate(MFTIME systemTime, float rate) override { Q_UNUSED(systemTime); Q_UNUSED(rate); diff --git a/src/plugins/winrt/qwinrtcameracontrol.h b/src/plugins/winrt/qwinrtcameracontrol.h index 7ef67e957..c46921a9c 100644 --- a/src/plugins/winrt/qwinrtcameracontrol.h +++ b/src/plugins/winrt/qwinrtcameracontrol.h @@ -81,16 +81,16 @@ public: explicit QWinRTCameraControl(QObject *parent = 0); ~QWinRTCameraControl(); - QCamera::State state() const Q_DECL_OVERRIDE; - void setState(QCamera::State state) Q_DECL_OVERRIDE; + QCamera::State state() const override; + void setState(QCamera::State state) override; - QCamera::Status status() const Q_DECL_OVERRIDE; + QCamera::Status status() const override; - QCamera::CaptureModes captureMode() const Q_DECL_OVERRIDE; - void setCaptureMode(QCamera::CaptureModes mode) Q_DECL_OVERRIDE; - bool isCaptureModeSupported(QCamera::CaptureModes mode) const Q_DECL_OVERRIDE; + QCamera::CaptureModes captureMode() const override; + void setCaptureMode(QCamera::CaptureModes mode) override; + bool isCaptureModeSupported(QCamera::CaptureModes mode) const override; - bool canChangeProperty(PropertyChangeType changeType, QCamera::Status status) const Q_DECL_OVERRIDE; + bool canChangeProperty(PropertyChangeType changeType, QCamera::Status status) const override; QVideoRendererControl *videoRenderer() const; QVideoDeviceSelectorControl *videoDeviceSelector() const; diff --git a/src/plugins/winrt/qwinrtcameraflashcontrol.h b/src/plugins/winrt/qwinrtcameraflashcontrol.h index 335329037..b9be69230 100644 --- a/src/plugins/winrt/qwinrtcameraflashcontrol.h +++ b/src/plugins/winrt/qwinrtcameraflashcontrol.h @@ -62,11 +62,11 @@ public: void initialize(Microsoft::WRL::ComPtr<ABI::Windows::Media::Devices::IAdvancedVideoCaptureDeviceController2> &controller); - QCameraExposure::FlashModes flashMode() const Q_DECL_OVERRIDE; - void setFlashMode(QCameraExposure::FlashModes mode) Q_DECL_OVERRIDE; - bool isFlashModeSupported(QCameraExposure::FlashModes mode) const Q_DECL_OVERRIDE; + QCameraExposure::FlashModes flashMode() const override; + void setFlashMode(QCameraExposure::FlashModes mode) override; + bool isFlashModeSupported(QCameraExposure::FlashModes mode) const override; - bool isFlashReady() const Q_DECL_OVERRIDE; + bool isFlashReady() const override; private: QScopedPointer<QWinRTCameraFlashControlPrivate> d_ptr; diff --git a/src/plugins/winrt/qwinrtcamerafocuscontrol.h b/src/plugins/winrt/qwinrtcamerafocuscontrol.h index 0a8c0afcf..fcfb84edc 100644 --- a/src/plugins/winrt/qwinrtcamerafocuscontrol.h +++ b/src/plugins/winrt/qwinrtcamerafocuscontrol.h @@ -51,15 +51,15 @@ class QWinRTCameraFocusControl : public QCameraFocusControl public: explicit QWinRTCameraFocusControl(QWinRTCameraControl *parent); - QCameraFocus::FocusModes focusMode() const Q_DECL_OVERRIDE; - void setFocusMode(QCameraFocus::FocusModes mode) Q_DECL_OVERRIDE; - bool isFocusModeSupported(QCameraFocus::FocusModes mode) const Q_DECL_OVERRIDE; - QCameraFocus::FocusPointMode focusPointMode() const Q_DECL_OVERRIDE; - void setFocusPointMode(QCameraFocus::FocusPointMode mode) Q_DECL_OVERRIDE; - bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const Q_DECL_OVERRIDE; - QPointF customFocusPoint() const Q_DECL_OVERRIDE; - void setCustomFocusPoint(const QPointF &point) Q_DECL_OVERRIDE; - QCameraFocusZoneList focusZones() const Q_DECL_OVERRIDE; + QCameraFocus::FocusModes focusMode() const override; + void setFocusMode(QCameraFocus::FocusModes mode) override; + bool isFocusModeSupported(QCameraFocus::FocusModes mode) const override; + QCameraFocus::FocusPointMode focusPointMode() const override; + void setFocusPointMode(QCameraFocus::FocusPointMode mode) override; + bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const override; + QPointF customFocusPoint() const override; + void setCustomFocusPoint(const QPointF &point) override; + QCameraFocusZoneList focusZones() const override; void setSupportedFocusMode(QCameraFocus::FocusModes flag); void setSupportedFocusPointMode(const QSet<QCameraFocus::FocusPointMode> &supportedFocusPointModes); diff --git a/src/plugins/winrt/qwinrtcameraimagecapturecontrol.h b/src/plugins/winrt/qwinrtcameraimagecapturecontrol.h index 3820bfaf1..ce1404e1c 100644 --- a/src/plugins/winrt/qwinrtcameraimagecapturecontrol.h +++ b/src/plugins/winrt/qwinrtcameraimagecapturecontrol.h @@ -64,13 +64,13 @@ class QWinRTCameraImageCaptureControl : public QCameraImageCaptureControl public: explicit QWinRTCameraImageCaptureControl(QWinRTCameraControl *parent); - bool isReadyForCapture() const Q_DECL_OVERRIDE; + bool isReadyForCapture() const override; - QCameraImageCapture::DriveMode driveMode() const Q_DECL_OVERRIDE; - void setDriveMode(QCameraImageCapture::DriveMode mode) Q_DECL_OVERRIDE; + QCameraImageCapture::DriveMode driveMode() const override; + void setDriveMode(QCameraImageCapture::DriveMode mode) override; - int capture(const QString &fileName) Q_DECL_OVERRIDE; - void cancelCapture() Q_DECL_OVERRIDE; + int capture(const QString &fileName) override; + void cancelCapture() override; private slots: void onCameraStateChanged(QCamera::State state); diff --git a/src/plugins/winrt/qwinrtcamerainfocontrol.h b/src/plugins/winrt/qwinrtcamerainfocontrol.h index b97025dcb..031ed2720 100644 --- a/src/plugins/winrt/qwinrtcamerainfocontrol.h +++ b/src/plugins/winrt/qwinrtcamerainfocontrol.h @@ -50,8 +50,8 @@ class QWinRTCameraInfoControl : public QCameraInfoControl public: explicit QWinRTCameraInfoControl(QObject *parent = 0); - QCamera::Position cameraPosition(const QString &deviceName) const Q_DECL_OVERRIDE; - int cameraOrientation(const QString &deviceName) const Q_DECL_OVERRIDE; + QCamera::Position cameraPosition(const QString &deviceName) const override; + int cameraOrientation(const QString &deviceName) const override; }; QT_END_NAMESPACE diff --git a/src/plugins/winrt/qwinrtcameralockscontrol.h b/src/plugins/winrt/qwinrtcameralockscontrol.h index 873c355b0..61015fdaa 100644 --- a/src/plugins/winrt/qwinrtcameralockscontrol.h +++ b/src/plugins/winrt/qwinrtcameralockscontrol.h @@ -51,10 +51,10 @@ class QWinRTCameraLocksControl : public QCameraLocksControl public: explicit QWinRTCameraLocksControl(QObject *parent); - QCamera::LockTypes supportedLocks() const Q_DECL_OVERRIDE; - QCamera::LockStatus lockStatus(QCamera::LockType lock) const Q_DECL_OVERRIDE; - void searchAndLock(QCamera::LockTypes locks) Q_DECL_OVERRIDE; - void unlock(QCamera::LockTypes locks) Q_DECL_OVERRIDE; + QCamera::LockTypes supportedLocks() const override; + QCamera::LockStatus lockStatus(QCamera::LockType lock) const override; + void searchAndLock(QCamera::LockTypes locks) override; + void unlock(QCamera::LockTypes locks) override; void initialize(); private: diff --git a/src/plugins/winrt/qwinrtcameraservice.h b/src/plugins/winrt/qwinrtcameraservice.h index beae2a140..6fa4d5fce 100644 --- a/src/plugins/winrt/qwinrtcameraservice.h +++ b/src/plugins/winrt/qwinrtcameraservice.h @@ -51,8 +51,8 @@ class QWinRTCameraService : public QMediaService public: explicit QWinRTCameraService(QObject *parent = 0); - QMediaControl *requestControl(const char *name) Q_DECL_OVERRIDE; - void releaseControl(QMediaControl *control) Q_DECL_OVERRIDE; + QMediaControl *requestControl(const char *name) override; + void releaseControl(QMediaControl *control) override; private: QScopedPointer<QWinRTCameraServicePrivate> d_ptr; diff --git a/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp b/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp index 5f7810060..0a5ae46fa 100644 --- a/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp +++ b/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp @@ -89,12 +89,12 @@ public: unmap(); } - MapMode mapMode() const Q_DECL_OVERRIDE + MapMode mapMode() const override { return currentMode; } - uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) Q_DECL_OVERRIDE + uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) override { if (currentMode != NotMapped || mode == NotMapped || control && control->state() != QCamera::ActiveState) return nullptr; @@ -113,7 +113,7 @@ public: return bytes; } - void unmap() Q_DECL_OVERRIDE + void unmap() override { if (currentMode == NotMapped) return; diff --git a/src/plugins/winrt/qwinrtcameravideorenderercontrol.h b/src/plugins/winrt/qwinrtcameravideorenderercontrol.h index ec6e0e0e4..eeda83d52 100644 --- a/src/plugins/winrt/qwinrtcameravideorenderercontrol.h +++ b/src/plugins/winrt/qwinrtcameravideorenderercontrol.h @@ -58,8 +58,8 @@ public: explicit QWinRTCameraVideoRendererControl(const QSize &size, QObject *parent); ~QWinRTCameraVideoRendererControl(); - bool render(ID3D11Texture2D *texture) Q_DECL_OVERRIDE; - bool dequeueFrame(QVideoFrame *frame) Q_DECL_OVERRIDE; + bool render(ID3D11Texture2D *texture) override; + bool dequeueFrame(QVideoFrame *frame) override; void queueBuffer(IMF2DBuffer *buffer); void discardBuffers(); void incrementProbe(); diff --git a/src/plugins/winrt/qwinrtimageencodercontrol.h b/src/plugins/winrt/qwinrtimageencodercontrol.h index 7b0781798..dbeac2384 100644 --- a/src/plugins/winrt/qwinrtimageencodercontrol.h +++ b/src/plugins/winrt/qwinrtimageencodercontrol.h @@ -51,11 +51,11 @@ class QWinRTImageEncoderControl : public QImageEncoderControl public: explicit QWinRTImageEncoderControl(QObject *parent = 0); - QStringList supportedImageCodecs() const Q_DECL_OVERRIDE; - QString imageCodecDescription(const QString &codecName) const Q_DECL_OVERRIDE; - QList<QSize> supportedResolutions(const QImageEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QImageEncoderSettings imageSettings() const Q_DECL_OVERRIDE; - void setImageSettings(const QImageEncoderSettings &settings) Q_DECL_OVERRIDE; + 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; void setSupportedResolutionsList(const QList<QSize> resolution); void applySettings(); diff --git a/src/plugins/winrt/qwinrtmediaplayercontrol.cpp b/src/plugins/winrt/qwinrtmediaplayercontrol.cpp index 9fd48fd76..de6b3418e 100644 --- a/src/plugins/winrt/qwinrtmediaplayercontrol.cpp +++ b/src/plugins/winrt/qwinrtmediaplayercontrol.cpp @@ -541,7 +541,7 @@ QWinRTMediaPlayerControl::QWinRTMediaPlayerControl(IMFMediaEngineClassFactory *f d->seekable = false; d->hasAudio = false; d->hasVideo = false; - d->videoRenderer = Q_NULLPTR; + d->videoRenderer = nullptr; d->notifier = Make<MediaEngineNotify>(this, d); HRESULT hr; @@ -796,7 +796,7 @@ void QWinRTMediaPlayerControl::setMedia(const QMediaContent &media, QIODevice *s } // Let Windows handle all other URLs - hr = d->engine->SetSource(Q_NULLPTR); // Resets the byte stream + hr = d->engine->SetSource(nullptr); // Resets the byte stream Q_ASSERT_SUCCEEDED(hr); hr = d->engine->Load(); if (FAILED(hr)) diff --git a/src/plugins/winrt/qwinrtmediaplayercontrol.h b/src/plugins/winrt/qwinrtmediaplayercontrol.h index 3d4154093..1e854f5bb 100644 --- a/src/plugins/winrt/qwinrtmediaplayercontrol.h +++ b/src/plugins/winrt/qwinrtmediaplayercontrol.h @@ -56,39 +56,39 @@ public: QWinRTMediaPlayerControl(IMFMediaEngineClassFactory *factory, QObject *parent = 0); ~QWinRTMediaPlayerControl(); - QMediaPlayer::State state() const Q_DECL_OVERRIDE; - QMediaPlayer::MediaStatus mediaStatus() const Q_DECL_OVERRIDE; + QMediaPlayer::State state() const override; + QMediaPlayer::MediaStatus mediaStatus() const override; - qint64 duration() const Q_DECL_OVERRIDE; + qint64 duration() const override; - qint64 position() const Q_DECL_OVERRIDE; - void setPosition(qint64 position) Q_DECL_OVERRIDE; + qint64 position() const override; + void setPosition(qint64 position) override; - int volume() const Q_DECL_OVERRIDE; - void setVolume(int volume) Q_DECL_OVERRIDE; + int volume() const override; + void setVolume(int volume) override; - bool isMuted() const Q_DECL_OVERRIDE; - void setMuted(bool muted) Q_DECL_OVERRIDE; + bool isMuted() const override; + void setMuted(bool muted) override; - int bufferStatus() const Q_DECL_OVERRIDE; + int bufferStatus() const override; - bool isAudioAvailable() const Q_DECL_OVERRIDE; - bool isVideoAvailable() const Q_DECL_OVERRIDE; + bool isAudioAvailable() const override; + bool isVideoAvailable() const override; - bool isSeekable() const Q_DECL_OVERRIDE; + bool isSeekable() const override; - QMediaTimeRange availablePlaybackRanges() const Q_DECL_OVERRIDE; + QMediaTimeRange availablePlaybackRanges() const override; - qreal playbackRate() const Q_DECL_OVERRIDE; - void setPlaybackRate(qreal rate) Q_DECL_OVERRIDE; + qreal playbackRate() const override; + void setPlaybackRate(qreal rate) override; - QMediaContent media() const Q_DECL_OVERRIDE; - const QIODevice *mediaStream() const Q_DECL_OVERRIDE; - void setMedia(const QMediaContent &media, QIODevice *stream) Q_DECL_OVERRIDE; + QMediaContent media() const override; + const QIODevice *mediaStream() const override; + void setMedia(const QMediaContent &media, QIODevice *stream) override; - void play() Q_DECL_OVERRIDE; - void pause() Q_DECL_OVERRIDE; - void stop() Q_DECL_OVERRIDE; + void play() override; + void pause() override; + void stop() override; QVideoRendererControl *videoRendererControl(); diff --git a/src/plugins/winrt/qwinrtmediaplayerservice.cpp b/src/plugins/winrt/qwinrtmediaplayerservice.cpp index 58149fd33..3253ed188 100644 --- a/src/plugins/winrt/qwinrtmediaplayerservice.cpp +++ b/src/plugins/winrt/qwinrtmediaplayerservice.cpp @@ -65,7 +65,7 @@ QWinRTMediaPlayerService::QWinRTMediaPlayerService(QObject *parent) { Q_D(QWinRTMediaPlayerService); - d->player = Q_NULLPTR; + d->player = nullptr; HRESULT hr = MFStartup(MF_VERSION); Q_ASSERT(SUCCEEDED(hr)); @@ -94,11 +94,11 @@ QMediaControl *QWinRTMediaPlayerService::requestControl(const char *name) } if (qstrcmp(name, QVideoRendererControl_iid) == 0) { if (!d->player) - return Q_NULLPTR; + return nullptr; return d->player->videoRendererControl(); } - return Q_NULLPTR; + return nullptr; } void QWinRTMediaPlayerService::releaseControl(QMediaControl *control) diff --git a/src/plugins/winrt/qwinrtplayerrenderercontrol.h b/src/plugins/winrt/qwinrtplayerrenderercontrol.h index fb67d0c8c..70f3c4af2 100644 --- a/src/plugins/winrt/qwinrtplayerrenderercontrol.h +++ b/src/plugins/winrt/qwinrtplayerrenderercontrol.h @@ -58,7 +58,7 @@ public: bool ensureReady(); - bool render(ID3D11Texture2D *texture) Q_DECL_OVERRIDE; + bool render(ID3D11Texture2D *texture) override; private: QScopedPointer<QWinRTPlayerRendererControlPrivate> d_ptr; diff --git a/src/plugins/winrt/qwinrtserviceplugin.cpp b/src/plugins/winrt/qwinrtserviceplugin.cpp index d08a39a5e..286789e4c 100644 --- a/src/plugins/winrt/qwinrtserviceplugin.cpp +++ b/src/plugins/winrt/qwinrtserviceplugin.cpp @@ -55,7 +55,7 @@ QMediaService *QWinRTServicePlugin::create(QString const &key) if (key == QLatin1String(Q_MEDIASERVICE_CAMERA)) return new QWinRTCameraService(this); - return Q_NULLPTR; + return nullptr; } void QWinRTServicePlugin::release(QMediaService *service) diff --git a/src/plugins/winrt/qwinrtserviceplugin.h b/src/plugins/winrt/qwinrtserviceplugin.h index d6600aa54..30a76022d 100644 --- a/src/plugins/winrt/qwinrtserviceplugin.h +++ b/src/plugins/winrt/qwinrtserviceplugin.h @@ -62,13 +62,13 @@ public: QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const; - QCamera::Position cameraPosition(const QByteArray &device) const Q_DECL_OVERRIDE; - int cameraOrientation(const QByteArray &device) const Q_DECL_OVERRIDE; + QCamera::Position cameraPosition(const QByteArray &device) const override; + int cameraOrientation(const QByteArray &device) const override; - QList<QByteArray> devices(const QByteArray &service) const Q_DECL_OVERRIDE; - QString deviceDescription(const QByteArray &service, const QByteArray &device) Q_DECL_OVERRIDE; + QList<QByteArray> devices(const QByteArray &service) const override; + QString deviceDescription(const QByteArray &service, const QByteArray &device) override; - QByteArray defaultDevice(const QByteArray &service) const Q_DECL_OVERRIDE; + QByteArray defaultDevice(const QByteArray &service) const override; }; QT_END_NAMESPACE diff --git a/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.cpp b/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.cpp index abe10f9a4..41d4693cb 100644 --- a/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.cpp +++ b/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.cpp @@ -124,7 +124,7 @@ struct QWinRTVideoDeviceSelectorControlGlobal IDeviceInformation *device; hr = deviceList->GetAt(i, &device); Q_ASSERT_SUCCEEDED(hr); - onDeviceAdded(Q_NULLPTR, device); + onDeviceAdded(nullptr, device); } // If there is no default device provided by the API, choose the first one diff --git a/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.h b/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.h index 36f00656c..3beb9782a 100644 --- a/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.h +++ b/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.h @@ -65,13 +65,13 @@ public: explicit QWinRTVideoDeviceSelectorControl(QObject *parent = 0); ~QWinRTVideoDeviceSelectorControl(); - int deviceCount() const Q_DECL_OVERRIDE; + int deviceCount() const override; - QString deviceName(int index) const Q_DECL_OVERRIDE; - QString deviceDescription(int index) const Q_DECL_OVERRIDE; + QString deviceName(int index) const override; + QString deviceDescription(int index) const override; - int defaultDevice() const Q_DECL_OVERRIDE; - int selectedDevice() const Q_DECL_OVERRIDE; + int defaultDevice() const override; + int selectedDevice() const override; static QCamera::Position cameraPosition(const QString &deviceName); static int cameraOrientation(const QString &deviceName); @@ -80,7 +80,7 @@ public: static QByteArray defaultDeviceName(); public slots: - void setSelectedDevice(int index) Q_DECL_OVERRIDE; + void setSelectedDevice(int index) override; private: QScopedPointer<QWinRTVideoDeviceSelectorControlPrivate> d_ptr; diff --git a/src/plugins/wmf/mfstream.cpp b/src/plugins/wmf/mfstream.cpp index fd95bf20b..a98b5a704 100644 --- a/src/plugins/wmf/mfstream.cpp +++ b/src/plugins/wmf/mfstream.cpp @@ -231,6 +231,8 @@ STDMETHODIMP MFStream::Seek( qint64 pos = qint64(llSeekOffset); switch (SeekOrigin) { + case msoBegin: + break; case msoCurrent: pos += m_stream->pos(); break; diff --git a/src/plugins/wmf/player/mfmetadatacontrol.cpp b/src/plugins/wmf/player/mfmetadatacontrol.cpp index 01be95e84..ac57ccfb5 100644 --- a/src/plugins/wmf/player/mfmetadatacontrol.cpp +++ b/src/plugins/wmf/player/mfmetadatacontrol.cpp @@ -193,6 +193,11 @@ QVariant MFMetaDataControl::metaData(const QString &key) const if (m_content && SUCCEEDED(m_content->GetValue(PKEY_Video_FrameWidth, &var))) res.setWidth(convertValue(var).toUInt()); value = res; + } else if (key == QMediaMetaData::Orientation) { + uint orientation = 0; + if (m_content && SUCCEEDED(m_content->GetValue(PKEY_Video_Orientation, &var))) + orientation = convertValue(var).toUInt(); + value = orientation; } else if (key == QMediaMetaData::PixelAspectRatio) { QSize aspectRatio; aspectRatio.setWidth(value.toUInt()); @@ -352,6 +357,8 @@ void MFMetaDataControl::updateSource(IMFPresentationDescriptor* sourcePD, IMFMed m_availableMetaDatas.push_back(QMediaMetaData::ThumbnailImage); } else if (key == PKEY_Video_FrameHeight) { m_availableMetaDatas.push_back(QMediaMetaData::Resolution); + } else if (key == PKEY_Video_Orientation) { + m_availableMetaDatas.push_back(QMediaMetaData::Orientation); } else if (key == PKEY_Video_HorizontalAspectRatio) { m_availableMetaDatas.push_back(QMediaMetaData::PixelAspectRatio); } else if (key == PKEY_Video_FrameRate) { |