diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-06-18 08:32:27 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-06-18 08:32:27 +0200 |
commit | 8201f06fc00ad60033032f3bf428a615d504c9a8 (patch) | |
tree | 936ba250134a7053e31d7a1193fc1d595e400b2c | |
parent | 8b1aac91f0c4a310059ec401ac09171b4c1db4ab (diff) | |
parent | 46bc0ea5550903a27923d84c730de39a78e7689a (diff) |
Merge remote-tracking branch 'origin/dev' into 6.2
Change-Id: I9935d2bbed480bed7056f6c8257362b27f7c13ec
135 files changed, 1139 insertions, 1693 deletions
diff --git a/examples/multimedia/audiodecoder/audiodecoder.cpp b/examples/multimedia/audiodecoder/audiodecoder.cpp index 891499ea2..f3492a52a 100644 --- a/examples/multimedia/audiodecoder/audiodecoder.cpp +++ b/examples/multimedia/audiodecoder/audiodecoder.cpp @@ -59,24 +59,12 @@ AudioDecoder::AudioDecoder(bool isPlayback, bool isDelete, const QString &target m_isPlayback = isPlayback; m_isDelete = isDelete; - // Make sure the data we receive is in correct PCM format. - // Our wav file writer only supports SignedInt sample type. - QAudioFormat format; - format.setChannelCount(2); - format.setSampleFormat(QAudioFormat::Int16); - format.setSampleRate(48000); - m_decoder.setAudioFormat(format); - - QIODevice* target = new QFile(targetFileName, this); - if (target->open(QIODevice::WriteOnly)) - m_waveDecoder = new QWaveDecoder(target, format); - connect(&m_decoder, &QAudioDecoder::bufferReady, this, &AudioDecoder::bufferReady); connect(&m_decoder, QOverload<QAudioDecoder::Error>::of(&QAudioDecoder::error), this, QOverload<QAudioDecoder::Error>::of(&AudioDecoder::error)); - connect(&m_decoder, &QAudioDecoder::stateChanged, - this, &AudioDecoder::stateChanged); + connect(&m_decoder, &QAudioDecoder::isDecodingChanged, + this, &AudioDecoder::isDecodingChanged); connect(&m_decoder, &QAudioDecoder::finished, this, &AudioDecoder::finished); connect(&m_decoder, &QAudioDecoder::positionChanged, @@ -129,6 +117,16 @@ void AudioDecoder::bufferReady() if (!buffer.isValid()) return; + if (!m_waveDecoder) { + QIODevice* target = new QFile(m_targetFilename, this); + if (!target->open(QIODevice::WriteOnly)) { + qWarning() << "target file is not writable"; + m_decoder.stop(); + return; + } + m_waveDecoder = new QWaveDecoder(target, buffer.format()); + } + if (!m_waveDecoder || (!m_waveDecoder->isOpen() && !m_waveDecoder->open(QIODevice::WriteOnly))) { m_decoder.stop(); @@ -160,16 +158,12 @@ void AudioDecoder::error(QAudioDecoder::Error error) emit done(); } -void AudioDecoder::stateChanged(QAudioDecoder::State newState) +void AudioDecoder::isDecodingChanged(bool isDecoding) { - switch (newState) { - case QAudioDecoder::DecodingState: + if (isDecoding) m_cout << "Decoding...\n"; - break; - case QAudioDecoder::StoppedState: + else m_cout << "Decoding stopped\n"; - break; - } } void AudioDecoder::finished() diff --git a/examples/multimedia/audiodecoder/audiodecoder.h b/examples/multimedia/audiodecoder/audiodecoder.h index cd27a9bf3..d75eecb8d 100644 --- a/examples/multimedia/audiodecoder/audiodecoder.h +++ b/examples/multimedia/audiodecoder/audiodecoder.h @@ -78,7 +78,7 @@ signals: public slots: void bufferReady(); void error(QAudioDecoder::Error error); - void stateChanged(QAudioDecoder::State newState); + void isDecodingChanged(bool isDecoding); void finished(); void playbackStatusChanged(); diff --git a/examples/multimedia/audiorecorder/audiorecorder.cpp b/examples/multimedia/audiorecorder/audiorecorder.cpp index 63efc4ba8..f8437ba4d 100644 --- a/examples/multimedia/audiorecorder/audiorecorder.cpp +++ b/examples/multimedia/audiorecorder/audiorecorder.cpp @@ -63,7 +63,7 @@ #include <qaudiodevice.h> #include <qaudiobuffer.h> #include <qaudioinput.h> -#include <qcameraimagecapture.h> +#include <qimagecapture.h> static QList<qreal> getBufferLevels(const QAudioBuffer &buffer); @@ -114,8 +114,8 @@ AudioRecorder::AudioRecorder() ui->channelsBox->addItem(QStringLiteral("4"), QVariant(4)); //quality - ui->qualitySlider->setRange(0, int(QCameraImageCapture::VeryHighQuality)); - ui->qualitySlider->setValue(int(QCameraImageCapture::NormalQuality)); + ui->qualitySlider->setRange(0, int(QImageCapture::VeryHighQuality)); + ui->qualitySlider->setValue(int(QImageCapture::NormalQuality)); //bitrates: ui->bitrateBox->addItem(tr("Default"), QVariant(0)); diff --git a/examples/multimediawidgets/camera/camera.cpp b/examples/multimediawidgets/camera/camera.cpp index 043afeb29..89667ab43 100644 --- a/examples/multimediawidgets/camera/camera.cpp +++ b/examples/multimediawidgets/camera/camera.cpp @@ -105,7 +105,7 @@ void Camera::setCamera(const QCameraDevice &cameraDevice) m_captureSession.setEncoder(m_mediaEncoder.data()); connect(m_mediaEncoder.data(), &QMediaRecorder::recorderStateChanged, this, &Camera::updateRecorderState); - m_imageCapture = new QCameraImageCapture; + m_imageCapture = new QImageCapture; m_captureSession.setImageCapture(m_imageCapture); connect(m_mediaEncoder.data(), &QMediaRecorder::durationChanged, this, &Camera::updateRecordTime); @@ -118,10 +118,10 @@ void Camera::setCamera(const QCameraDevice &cameraDevice) updateCameraActive(m_camera->isActive()); updateRecorderState(m_mediaEncoder->recorderState()); - connect(m_imageCapture, &QCameraImageCapture::readyForCaptureChanged, this, &Camera::readyForCapture); - connect(m_imageCapture, &QCameraImageCapture::imageCaptured, this, &Camera::processCapturedImage); - connect(m_imageCapture, &QCameraImageCapture::imageSaved, this, &Camera::imageSaved); - connect(m_imageCapture, &QCameraImageCapture::errorOccurred, this, &Camera::displayCaptureError); + connect(m_imageCapture, &QImageCapture::readyForCaptureChanged, this, &Camera::readyForCapture); + connect(m_imageCapture, &QImageCapture::imageCaptured, this, &Camera::processCapturedImage); + connect(m_imageCapture, &QImageCapture::imageSaved, this, &Camera::imageSaved); + connect(m_imageCapture, &QImageCapture::errorOccurred, this, &Camera::displayCaptureError); readyForCapture(m_imageCapture->isReadyForCapture()); updateCaptureMode(); @@ -233,7 +233,7 @@ void Camera::takeImage() m_imageCapture->captureToFile(); } -void Camera::displayCaptureError(int id, const QCameraImageCapture::Error error, const QString &errorString) +void Camera::displayCaptureError(int id, const QImageCapture::Error error, const QString &errorString) { Q_UNUSED(id); Q_UNUSED(error); diff --git a/examples/multimediawidgets/camera/camera.h b/examples/multimediawidgets/camera/camera.h index c165aa201..d5920a0f3 100644 --- a/examples/multimediawidgets/camera/camera.h +++ b/examples/multimediawidgets/camera/camera.h @@ -52,7 +52,7 @@ #define CAMERA_H #include <QCamera> -#include <QCameraImageCapture> +#include <QImageCapture> #include <QMediaRecorder> #include <QScopedPointer> #include <QMediaMetaData> @@ -91,7 +91,7 @@ private slots: void setMuted(bool); void takeImage(); - void displayCaptureError(int, QCameraImageCapture::Error, const QString &errorString); + void displayCaptureError(int, QImageCapture::Error, const QString &errorString); void configureCaptureSettings(); void configureVideoSettings(); @@ -135,7 +135,7 @@ private: QMediaCaptureSession m_captureSession; QScopedPointer<QCamera> m_camera; QScopedPointer<QAudioInput> m_audioInput; - QCameraImageCapture *m_imageCapture; + QImageCapture *m_imageCapture; QScopedPointer<QMediaRecorder> m_mediaEncoder; bool m_isCapturingImage = false; diff --git a/examples/multimediawidgets/camera/doc/src/camera.qdoc b/examples/multimediawidgets/camera/doc/src/camera.qdoc index 68e19aac3..476eef085 100644 --- a/examples/multimediawidgets/camera/doc/src/camera.qdoc +++ b/examples/multimediawidgets/camera/doc/src/camera.qdoc @@ -48,7 +48,7 @@ the image or video clip is to be saved. It will also store the image and video settings. The Camera class contains an instance of \l {QCamera}, the API class interface to -the hardware. It also has an instance of \l {QCameraImageCapture} to take still images +the hardware. It also has an instance of \l {QImageCapture} to take still images and an instance of \l {QMediaRecorder} to record video. It also contains the user interface object. @@ -59,7 +59,7 @@ the \e{setCamera()} function is called, passing in a \l {QByteArray}. \e{setCamera()} sets up various connections between the user interface and the functionality of the Camera class using signals and slots. It also instantiates and initializes the \l {QCamera}, -\l {QCameraImageCapture} and \l {QMediaRecorder} objects mentioned above. The still +\l {QImageCapture} and \l {QMediaRecorder} objects mentioned above. The still and video recording visual tabs are enabled and finally the \l {QCamera::start()}{start()} function of the \l{QCamera} object is called. diff --git a/examples/multimediawidgets/camera/imagesettings.cpp b/examples/multimediawidgets/camera/imagesettings.cpp index fa619638d..a14e519e7 100644 --- a/examples/multimediawidgets/camera/imagesettings.cpp +++ b/examples/multimediawidgets/camera/imagesettings.cpp @@ -53,11 +53,11 @@ #include <QComboBox> #include <QDebug> -#include <QCameraImageCapture> +#include <QImageCapture> #include <QCamera> #include <QMediaCaptureSession> -ImageSettings::ImageSettings(QCameraImageCapture *imageCapture, QWidget *parent) : +ImageSettings::ImageSettings(QImageCapture *imageCapture, QWidget *parent) : QDialog(parent), ui(new Ui::ImageSettingsUi), imagecapture(imageCapture) @@ -66,13 +66,13 @@ ImageSettings::ImageSettings(QCameraImageCapture *imageCapture, QWidget *parent) //image codecs ui->imageCodecBox->addItem(tr("Default image format"), QVariant(QString())); - const auto supportedImageFormats = QCameraImageCapture::supportedFormats(); + const auto supportedImageFormats = QImageCapture::supportedFormats(); for (const auto &f : supportedImageFormats) { - QString description = QCameraImageCapture::fileFormatDescription(f); - ui->imageCodecBox->addItem(QCameraImageCapture::fileFormatName(f) + ": " + description, QVariant::fromValue(f)); + QString description = QImageCapture::fileFormatDescription(f); + ui->imageCodecBox->addItem(QImageCapture::fileFormatName(f) + ": " + description, QVariant::fromValue(f)); } - ui->imageQualitySlider->setRange(0, int(QCameraImageCapture::VeryHighQuality)); + ui->imageQualitySlider->setRange(0, int(QImageCapture::VeryHighQuality)); ui->imageResolutionBox->addItem(tr("Default Resolution")); const QList<QSize> supportedResolutions = imagecapture->captureSession()->camera()->cameraDevice().photoResolutions(); @@ -105,8 +105,8 @@ void ImageSettings::changeEvent(QEvent *e) void ImageSettings::applyImageSettings() const { - imagecapture->setFileFormat(boxValue(ui->imageCodecBox).value<QCameraImageCapture::FileFormat>()); - imagecapture->setQuality(QCameraImageCapture::Quality(ui->imageQualitySlider->value())); + imagecapture->setFileFormat(boxValue(ui->imageCodecBox).value<QImageCapture::FileFormat>()); + imagecapture->setQuality(QImageCapture::Quality(ui->imageQualitySlider->value())); imagecapture->setResolution(boxValue(ui->imageResolutionBox).toSize()); } diff --git a/examples/multimediawidgets/camera/imagesettings.h b/examples/multimediawidgets/camera/imagesettings.h index c155c5531..6564bd91c 100644 --- a/examples/multimediawidgets/camera/imagesettings.h +++ b/examples/multimediawidgets/camera/imagesettings.h @@ -55,7 +55,7 @@ QT_BEGIN_NAMESPACE class QComboBox; -class QCameraImageCapture; +class QImageCapture; namespace Ui { class ImageSettingsUi; } QT_END_NAMESPACE @@ -64,7 +64,7 @@ class ImageSettings : public QDialog Q_OBJECT public: - explicit ImageSettings(QCameraImageCapture *imageCapture, QWidget *parent = nullptr); + explicit ImageSettings(QImageCapture *imageCapture, QWidget *parent = nullptr); ~ImageSettings(); void applyImageSettings() const; @@ -80,7 +80,7 @@ private: void selectComboBoxItem(QComboBox *box, const QVariant &value); Ui::ImageSettingsUi *ui; - QCameraImageCapture *imagecapture; + QImageCapture *imagecapture; }; #endif // IMAGESETTINGS_H diff --git a/src/android/jar/CMakeLists.txt b/src/android/jar/CMakeLists.txt index b417d38f1..ed51a1e20 100644 --- a/src/android/jar/CMakeLists.txt +++ b/src/android/jar/CMakeLists.txt @@ -11,13 +11,13 @@ set(java_sources src/org/qtproject/qt/android/multimedia/QtSurfaceTextureListener.java ) -qt_internal_add_jar(QtAndroidMultimedia +qt_internal_add_jar(Qt${QtMultimedia_VERSION_MAJOR}AndroidMultimedia INCLUDE_JARS ${QT_ANDROID_JAR} SOURCES ${java_sources} OUTPUT_DIR "${QT_BUILD_DIR}/jar" ) -install_jar(QtAndroidMultimedia +install_jar(Qt${QtMultimedia_VERSION_MAJOR}AndroidMultimedia DESTINATION jar COMPONENT Devel ) diff --git a/src/multimedia/.prev_CMakeLists.txt b/src/multimedia/.prev_CMakeLists.txt index 5d0cab807..4d5240d9f 100644 --- a/src/multimedia/.prev_CMakeLists.txt +++ b/src/multimedia/.prev_CMakeLists.txt @@ -121,7 +121,7 @@ qt_internal_add_simd_part(Multimedia SIMD avx2 if(ANDROID) set_property(TARGET Multimedia APPEND PROPERTY QT_ANDROID_BUNDLED_JAR_DEPENDENCIES - jar/QtAndroidMultimedia.jar:org.qtproject.qt.android.multimedia.QtMultimediaUtils + jar/Qt${QtMultimedia_VERSION_MAJOR}AndroidMultimedia.jar:org.qtproject.qt.android.multimedia.QtMultimediaUtils ) set_property(TARGET Multimedia APPEND PROPERTY QT_ANDROID_LIB_DEPENDENCIES lib/libQt6MultimediaQuick.so:Qt6Quick diff --git a/src/multimedia/CMakeLists.txt b/src/multimedia/CMakeLists.txt index f60e13be7..4fbccc672 100644 --- a/src/multimedia/CMakeLists.txt +++ b/src/multimedia/CMakeLists.txt @@ -30,12 +30,12 @@ qt_internal_add_module(Multimedia audio/qwavedecoder.cpp audio/qwavedecoder.h camera/qcamera.cpp camera/qcamera.h camera/qcamera_p.h camera/qcameradevice.cpp camera/qcameradevice.h camera/qcameradevice_p.h - camera/qcameraimagecapture.cpp camera/qcameraimagecapture.h + camera/qimagecapture.cpp camera/qimagecapture.h platform/qplatformaudiodecoder.cpp platform/qplatformaudiodecoder_p.h platform/qplatformaudioinput_p.h platform/qplatformaudiooutput_p.h platform/qplatformcamera.cpp platform/qplatformcamera_p.h - platform/qplatformcameraimagecapture.cpp platform/qplatformcameraimagecapture_p.h + platform/qplatformimagecapture.cpp platform/qplatformimagecapture_p.h platform/qplatformmediacapture.cpp platform/qplatformmediacapture_p.h platform/qplatformmediadevices.cpp platform/qplatformmediadevices_p.h platform/qplatformmediaencoder.cpp platform/qplatformmediaencoder_p.h @@ -108,8 +108,8 @@ qt_internal_add_simd_part(Multimedia SIMD avx2 if(ANDROID) set_property(TARGET Multimedia APPEND PROPERTY QT_ANDROID_BUNDLED_JAR_DEPENDENCIES - jar/QtAndroidMultimedia.jar:org.qtproject.qt.android.multimedia.QtMultimediaUtils - jar/QtAndroidMultimedia.jar:org.qtproject.qt.android.multimedia.QtAudioDeviceManager + jar/Qt${QtMultimedia_VERSION_MAJOR}AndroidMultimedia.jar:org.qtproject.qt.android.multimedia.QtMultimediaUtils + jar/Qt${QtMultimedia_VERSION_MAJOR}AndroidMultimedia.jar:org.qtproject.qt.android.multimedia.QtAudioDeviceManager ) set_property(TARGET Multimedia APPEND PROPERTY QT_ANDROID_LIB_DEPENDENCIES lib/libQt6MultimediaQuick.so:Qt6Quick @@ -135,6 +135,7 @@ qt_internal_extend_target(Multimedia CONDITION QT_FEATURE_wmf platform/windows/audio/qwindowsaudiosource.cpp platform/windows/audio/qwindowsaudiosource_p.h platform/windows/audio/qwindowsaudiosink.cpp platform/windows/audio/qwindowsaudiosink_p.h platform/windows/audio/qwindowsaudioutils.cpp platform/windows/audio/qwindowsaudioutils_p.h + platform/windows/common/mfmetadata.cpp platform/windows/common/mfmetadata_p.h platform/windows/common/qwindowsmultimediautils.cpp platform/windows/common/qwindowsmultimediautils_p.h platform/windows/common/qwindowsiupointer_p.h platform/windows/decoder/mfaudiodecodercontrol.cpp platform/windows/decoder/mfaudiodecodercontrol_p.h @@ -147,16 +148,15 @@ qt_internal_extend_target(Multimedia CONDITION QT_FEATURE_wmf platform/windows/mfstream.cpp platform/windows/mfstream_p.h platform/windows/player/mfactivate.cpp platform/windows/player/mfactivate_p.h platform/windows/player/mfevrvideowindowcontrol.cpp platform/windows/player/mfevrvideowindowcontrol_p.h - platform/windows/player/mfmetadata.cpp platform/windows/player/mfmetadata_p.h platform/windows/player/mfplayercontrol.cpp platform/windows/player/mfplayercontrol_p.h platform/windows/player/mfplayersession.cpp platform/windows/player/mfplayersession_p.h platform/windows/player/mftvideo.cpp platform/windows/player/mftvideo_p.h platform/windows/player/mfvideorenderercontrol.cpp platform/windows/player/mfvideorenderercontrol_p.h platform/windows/player/samplegrabber.cpp platform/windows/player/samplegrabber_p.h platform/windows/mediacapture/qwindowscamera.cpp - platform/windows/mediacapture/qwindowscameraimagecapture.cpp - platform/windows/mediacapture/qwindowscameraimagecapture_p.h platform/windows/mediacapture/qwindowscamera_p.h + platform/windows/mediacapture/qwindowsimagecapture.cpp + platform/windows/mediacapture/qwindowsimagecapture_p.h platform/windows/mediacapture/qwindowsmediacapture.cpp platform/windows/mediacapture/qwindowsmediacapture_p.h platform/windows/mediacapture/qwindowsmediadevicereader.cpp @@ -228,8 +228,8 @@ qt_internal_extend_target(Multimedia CONDITION QT_FEATURE_gstreamer platform/gstreamer/qgstreamerformatinfo.cpp platform/gstreamer/qgstreamerformatinfo_p.h platform/gstreamer/qgstreamerintegration.cpp platform/gstreamer/qgstreamerintegration_p.h platform/gstreamer/mediacapture/qgstreamercamera.cpp platform/gstreamer/mediacapture/qgstreamercamera_p.h + platform/gstreamer/mediacapture/qgstreamerimagecapture.cpp platform/gstreamer/mediacapture/qgstreamerimagecapture_p.h platform/gstreamer/mediacapture/qgstreamermediacapture.cpp platform/gstreamer/mediacapture/qgstreamermediacapture_p.h - platform/gstreamer/mediacapture/qgstreamercameraimagecapture.cpp platform/gstreamer/mediacapture/qgstreamercameraimagecapture_p.h platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h DEFINES GLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_26 @@ -307,7 +307,7 @@ qt_internal_extend_target(Multimedia CONDITION ANDROID platform/android/common/qandroidmultimediautils.cpp platform/android/common/qandroidmultimediautils_p.h platform/android/common/qandroidvideooutput.cpp platform/android/common/qandroidvideooutput_p.h platform/android/mediacapture/qandroidcameracontrol.cpp platform/android/mediacapture/qandroidcameracontrol_p.h - platform/android/mediacapture/qandroidcameraimagecapturecontrol.cpp platform/android/mediacapture/qandroidcameraimagecapturecontrol_p.h + platform/android/mediacapture/qandroidimagecapture.cpp platform/android/mediacapture/qandroidimagecapture_p.h platform/android/mediacapture/qandroidcamerasession.cpp platform/android/mediacapture/qandroidcamerasession_p.h platform/android/mediacapture/qandroidcameravideorenderercontrol.cpp platform/android/mediacapture/qandroidcameravideorenderercontrol_p.h platform/android/mediacapture/qandroidcaptureservice.cpp platform/android/mediacapture/qandroidcaptureservice_p.h @@ -403,7 +403,7 @@ qt_internal_extend_target(Multimedia CONDITION APPLE AND NOT TVOS AND NOT WATCHO platform/darwin/camera/avfcameraservice.mm platform/darwin/camera/avfcameraservice_p.h platform/darwin/camera/avfcamerasession.mm platform/darwin/camera/avfcamerasession_p.h platform/darwin/camera/avfcamerautility.mm platform/darwin/camera/avfcamerautility_p.h - platform/darwin/camera/avfcameraimagecapture.mm platform/darwin/camera/avfcameraimagecapture_p.h + platform/darwin/camera/avfimagecapture.mm platform/darwin/camera/avfimagecapture_p.h platform/darwin/camera/avfstoragelocation.mm platform/darwin/camera/avfstoragelocation_p.h ) diff --git a/src/multimedia/audio/qaudiodecoder.cpp b/src/multimedia/audio/qaudiodecoder.cpp index 9c2c3bc36..8b8db59ba 100644 --- a/src/multimedia/audio/qaudiodecoder.cpp +++ b/src/multimedia/audio/qaudiodecoder.cpp @@ -89,17 +89,17 @@ QAudioDecoder::~QAudioDecoder() = default; /*! Returns true is audio decoding is supported on this platform. */ -bool QAudioDecoder::isAvailable() const +bool QAudioDecoder::isSupported() const { return decoder != nullptr; } /*! - Returns the current state of the audio decoder. + Returns true if the decoder is currently running and decoding audio data. */ -QAudioDecoder::State QAudioDecoder::state() const +bool QAudioDecoder::isDecoding() const { - return decoder ? decoder->state() : QAudioDecoder::StoppedState; + return decoder && decoder->isDecoding(); } /*! @@ -151,8 +151,10 @@ void QAudioDecoder::start() */ void QAudioDecoder::stop() { - if (decoder != nullptr) - decoder->stop(); + if (!decoder) + return; + + decoder->stop(); } /*! @@ -207,47 +209,9 @@ QIODevice *QAudioDecoder::sourceDevice() const */ void QAudioDecoder::setSourceDevice(QIODevice *device) { - if (decoder != nullptr) - decoder->setSourceDevice(device); -} - -/*! - Returns the current audio format of the decoded stream. - - Any buffers returned should have this format. - - \sa setAudioFormat(), formatChanged() -*/ -QAudioFormat QAudioDecoder::audioFormat() const -{ - if (decoder) - return decoder->audioFormat(); - return QAudioFormat(); -} - -/*! - Set the desired audio format for decoded samples to \a format. - - This property can only be set while the decoder is stopped. - Setting this property at other times will be ignored. - - If the decoder does not support this format, \l error() will - be set to \c FormatError. - - If you do not specify a format, the format of the decoded - audio itself will be used. Otherwise, some format conversion - will be applied. - - If you wish to reset the decoded format to that of the original - audio file, you can specify an invalid \a format. -*/ -void QAudioDecoder::setAudioFormat(const QAudioFormat &format) -{ - if (state() != QAudioDecoder::StoppedState) + if (!decoder) return; - - if (decoder != nullptr) - decoder->setAudioFormat(format); + decoder->setSourceDevice(device); } /*! diff --git a/src/multimedia/audio/qaudiodecoder.h b/src/multimedia/audio/qaudiodecoder.h index 9dd257cc9..465bb3974 100644 --- a/src/multimedia/audio/qaudiodecoder.h +++ b/src/multimedia/audio/qaudiodecoder.h @@ -52,18 +52,11 @@ class Q_MULTIMEDIA_EXPORT QAudioDecoder : public QObject { Q_OBJECT Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged) - Q_PROPERTY(State state READ state NOTIFY stateChanged) + Q_PROPERTY(bool isDecoding READ isDecoding NOTIFY isDecodingChanged) Q_PROPERTY(QString error READ errorString) Q_PROPERTY(bool bufferAvailable READ bufferAvailable NOTIFY bufferAvailableChanged) public: - enum State - { - StoppedState, - DecodingState - }; - Q_ENUM(State) - enum Error { NoError, @@ -77,8 +70,8 @@ public: explicit QAudioDecoder(QObject *parent = nullptr); ~QAudioDecoder(); - bool isAvailable() const; - State state() const; + bool isSupported() const; + bool isDecoding() const; QUrl source() const; void setSource(const QUrl &fileName); @@ -86,9 +79,6 @@ public: QIODevice* sourceDevice() const; void setSourceDevice(QIODevice *device); - QAudioFormat audioFormat() const; - void setAudioFormat(const QAudioFormat &format); - Error error() const; QString errorString() const; @@ -106,9 +96,7 @@ Q_SIGNALS: void bufferAvailableChanged(bool); void bufferReady(); void finished(); - - void stateChanged(QAudioDecoder::State newState); - void formatChanged(const QAudioFormat &format); + void isDecodingChanged(bool); void error(QAudioDecoder::Error error); @@ -124,7 +112,6 @@ private: QT_END_NAMESPACE -Q_MEDIA_ENUM_DEBUG(QAudioDecoder, State) Q_MEDIA_ENUM_DEBUG(QAudioDecoder, Error) #endif // QAUDIODECODER_H diff --git a/src/multimedia/audio/qaudioformat.cpp b/src/multimedia/audio/qaudioformat.cpp index 2de431dc9..c29c82914 100644 --- a/src/multimedia/audio/qaudioformat.cpp +++ b/src/multimedia/audio/qaudioformat.cpp @@ -170,18 +170,18 @@ QT_BEGIN_NAMESPACE */ /*! - Returns the number of bytes required for this audio format for \a duration microseconds. + Returns the number of bytes required for this audio format for \a microseconds. Returns 0 if this format is not valid. - Note that some rounding may occur if \a duration is not an exact fraction of the + Note that some rounding may occur if \a microseconds is not an exact fraction of the sampleRate(). \sa durationForBytes() */ -qint32 QAudioFormat::bytesForDuration(qint64 duration) const +qint32 QAudioFormat::bytesForDuration(qint64 microseconds) const { - return bytesPerFrame() * framesForDuration(duration); + return bytesPerFrame() * framesForDuration(microseconds); } /*! @@ -239,17 +239,17 @@ qint32 QAudioFormat::framesForBytes(qint32 byteCount) const } /*! - Returns the number of frames required to represent \a duration microseconds in this format. + Returns the number of frames required to represent \a microseconds in this format. - Note that some rounding may occur if \a duration is not an exact fraction of the + Note that some rounding may occur if \a microseconds is not an exact fraction of the \l sampleRate(). */ -qint32 QAudioFormat::framesForDuration(qint64 duration) const +qint32 QAudioFormat::framesForDuration(qint64 microseconds) const { if (!isValid()) return 0; - return qint32((duration * sampleRate()) / 1000000LL); + return qint32((microseconds * sampleRate()) / 1000000LL); } /*! diff --git a/src/multimedia/audio/qaudioformat.h b/src/multimedia/audio/qaudioformat.h index ca0e9a6f6..c5580e7f2 100644 --- a/src/multimedia/audio/qaudioformat.h +++ b/src/multimedia/audio/qaudioformat.h @@ -77,13 +77,13 @@ public: constexpr SampleFormat sampleFormat() const noexcept { return m_sampleFormat; } // Helper functions - Q_MULTIMEDIA_EXPORT qint32 bytesForDuration(qint64 duration) const; + Q_MULTIMEDIA_EXPORT qint32 bytesForDuration(qint64 microseconds) const; Q_MULTIMEDIA_EXPORT qint64 durationForBytes(qint32 byteCount) const; Q_MULTIMEDIA_EXPORT qint32 bytesForFrames(qint32 frameCount) const; Q_MULTIMEDIA_EXPORT qint32 framesForBytes(qint32 byteCount) const; - Q_MULTIMEDIA_EXPORT qint32 framesForDuration(qint64 duration) const; + Q_MULTIMEDIA_EXPORT qint32 framesForDuration(qint64 microseconds) const; Q_MULTIMEDIA_EXPORT qint64 durationForFrames(qint32 frameCount) const; constexpr int bytesPerFrame() const { return bytesPerSample()*channelCount(); } diff --git a/src/multimedia/camera/qcamera.cpp b/src/multimedia/camera/qcamera.cpp index 4a7ef70d6..5fca81320 100644 --- a/src/multimedia/camera/qcamera.cpp +++ b/src/multimedia/camera/qcamera.cpp @@ -42,7 +42,7 @@ #include <qcameradevice.h> #include <private/qplatformcamera_p.h> -#include <private/qplatformcameraimagecapture_p.h> +#include <private/qplatformimagecapture_p.h> #include <private/qplatformmediaintegration_p.h> #include <private/qplatformmediacapture_p.h> #include <qmediadevices.h> @@ -270,18 +270,6 @@ QCamera::Features QCamera::supportedFeatures() const */ /*! - Returns the current status of the camers. -*/ -QCamera::Status QCamera::status() const -{ - if(d_func()->control) - return (QCamera::Status)d_func()->control->status(); - - return QCamera::UnavailableStatus; -} - - -/*! Returns the capture session this camera is connected to, or a nullptr if the camera is not connected to a capture session. diff --git a/src/multimedia/camera/qcamera.h b/src/multimedia/camera/qcamera.h index 2dccb1080..51e9d4e25 100644 --- a/src/multimedia/camera/qcamera.h +++ b/src/multimedia/camera/qcamera.h @@ -64,7 +64,6 @@ class Q_MULTIMEDIA_EXPORT QCamera : public QObject { Q_OBJECT Q_PROPERTY(bool active READ isActive WRITE setActive NOTIFY activeChanged) - Q_PROPERTY(QCamera::Status status READ status NOTIFY statusChanged) Q_PROPERTY(QCameraDevice cameraDevice READ cameraDevice WRITE setCameraDevice NOTIFY cameraDeviceChanged) Q_PROPERTY(Error error READ error NOTIFY errorChanged) Q_PROPERTY(QString errorString READ errorString NOTIFY errorChanged) @@ -90,15 +89,6 @@ class Q_MULTIMEDIA_EXPORT QCamera : public QObject Q_PROPERTY(Features supportedFeatures READ supportedFeatures NOTIFY supportedFeaturesChanged) public: - enum Status { - UnavailableStatus, - InactiveStatus, - StartingStatus, - StoppingStatus, - ActiveStatus - }; - Q_ENUM(Status) - enum Error { NoError, @@ -182,8 +172,6 @@ public: bool isAvailable() const; bool isActive() const; - Status status() const; - QMediaCaptureSession *captureSession() const; QCameraDevice cameraDevice() const; @@ -267,7 +255,6 @@ public Q_SLOTS: Q_SIGNALS: void activeChanged(bool); - void statusChanged(QCamera::Status status); void errorChanged(); void errorOccurred(QCamera::Error error, const QString &errorString); void cameraDeviceChanged(); @@ -311,7 +298,6 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(QCamera::Features) QT_END_NAMESPACE -Q_MEDIA_ENUM_DEBUG(QCamera, Status) Q_MEDIA_ENUM_DEBUG(QCamera, Error) #endif // QCAMERA_H diff --git a/src/multimedia/camera/qcameraimagecapture.cpp b/src/multimedia/camera/qimagecapture.cpp index 107688600..7b1a34920 100644 --- a/src/multimedia/camera/qcameraimagecapture.cpp +++ b/src/multimedia/camera/qimagecapture.cpp @@ -36,8 +36,8 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ -#include <qcameraimagecapture.h> -#include <private/qplatformcameraimagecapture_p.h> +#include <qimagecapture.h> +#include <private/qplatformimagecapture_p.h> #include <qmediametadata.h> #include <private/qplatformmediacapture_p.h> #include <private/qplatformmediaintegration_p.h> @@ -55,15 +55,15 @@ QT_BEGIN_NAMESPACE /*! - \class QCameraImageCapture + \class QImageCapture \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_camera - \brief The QCameraImageCapture class is used for the recording of media content. + \brief The QImageCapture class is used for the recording of media content. - The QCameraImageCapture class is a high level images recording class. + The QImageCapture class is a high level images recording class. It's not intended to be used alone but for accessing the media recording functions of other media objects, like QCamera. @@ -74,31 +74,31 @@ QT_BEGIN_NAMESPACE \sa QCamera */ -class QCameraImageCapturePrivate +class QImageCapturePrivate { - Q_DECLARE_PUBLIC(QCameraImageCapture) + Q_DECLARE_PUBLIC(QImageCapture) public: QCamera *camera = nullptr; QMediaCaptureSession *captureSession = nullptr; - QPlatformCameraImageCapture *control = nullptr; + QPlatformImageCapture *control = nullptr; - QCameraImageCapture::Error error = QCameraImageCapture::NoError; + QImageCapture::Error error = QImageCapture::NoError; QString errorString; QMediaMetaData metaData; void _q_error(int id, int error, const QString &errorString); - void unsetError() { error = QCameraImageCapture::NoError; errorString.clear(); } + void unsetError() { error = QImageCapture::NoError; errorString.clear(); } - QCameraImageCapture *q_ptr; + QImageCapture *q_ptr; }; -void QCameraImageCapturePrivate::_q_error(int id, int error, const QString &errorString) +void QImageCapturePrivate::_q_error(int id, int error, const QString &errorString) { - Q_Q(QCameraImageCapture); + Q_Q(QImageCapture); - this->error = QCameraImageCapture::Error(error); + this->error = QImageCapture::Error(error); this->errorString = errorString; emit q->errorChanged(); @@ -111,17 +111,17 @@ void QCameraImageCapturePrivate::_q_error(int id, int error, const QString &erro Connect both an image capture object and a QCamera to a capture session to capture images. */ -QCameraImageCapture::QCameraImageCapture(QObject *parent) - : QObject(parent), d_ptr(new QCameraImageCapturePrivate) +QImageCapture::QImageCapture(QObject *parent) + : QObject(parent), d_ptr(new QImageCapturePrivate) { - Q_D(QCameraImageCapture); + Q_D(QImageCapture); d->q_ptr = this; d->control = QPlatformMediaIntegration::instance()->createImageCapture(this); } -void QCameraImageCapture::setCaptureSession(QMediaCaptureSession *session) +void QImageCapture::setCaptureSession(QMediaCaptureSession *session) { - Q_D(QCameraImageCapture); + Q_D(QImageCapture); d->captureSession = session; QPlatformMediaCaptureSession *platformSession = session ? session->platformSession() : nullptr; @@ -152,7 +152,7 @@ void QCameraImageCapture::setCaptureSession(QMediaCaptureSession *session) Destroys images capture object. */ -QCameraImageCapture::~QCameraImageCapture() +QImageCapture::~QImageCapture() { if (d_ptr->captureSession) { d_ptr->captureSession->platformSession()->setImageCapture(nullptr); @@ -164,7 +164,7 @@ QCameraImageCapture::~QCameraImageCapture() /*! Returns true if the images capture service ready to use. */ -bool QCameraImageCapture::isAvailable() const +bool QImageCapture::isAvailable() const { return d_func()->control != nullptr && d_func()->captureSession->camera(); } @@ -176,7 +176,7 @@ bool QCameraImageCapture::isAvailable() const Use QMediaCaptureSession::setImageCapture() to connect the image capture to a session. */ -QMediaCaptureSession *QCameraImageCapture::captureSession() const +QMediaCaptureSession *QImageCapture::captureSession() const { return d_ptr->captureSession; } @@ -187,7 +187,7 @@ QMediaCaptureSession *QCameraImageCapture::captureSession() const \sa errorString() */ -QCameraImageCapture::Error QCameraImageCapture::error() const +QImageCapture::Error QImageCapture::error() const { return d_func()->error; } @@ -198,7 +198,7 @@ QCameraImageCapture::Error QCameraImageCapture::error() const \sa error() */ -QString QCameraImageCapture::errorString() const +QString QImageCapture::errorString() const { return d_func()->errorString; } @@ -207,18 +207,18 @@ QString QCameraImageCapture::errorString() const Returns the meta data that will get embedded into the image. A couple of additional fields such as a time stamp or location might get added by the camera backend. */ -QMediaMetaData QCameraImageCapture::metaData() const +QMediaMetaData QImageCapture::metaData() const { - Q_D(const QCameraImageCapture); + Q_D(const QImageCapture); return d->metaData; } /*! Defines a set of meta data that will get embedded into the captured image. */ -void QCameraImageCapture::setMetaData(const QMediaMetaData &metaData) +void QImageCapture::setMetaData(const QMediaMetaData &metaData) { - Q_D(QCameraImageCapture); + Q_D(QImageCapture); d->metaData = metaData; d->control->setMetaData(d->metaData); emit metaDataChanged(); @@ -227,9 +227,9 @@ void QCameraImageCapture::setMetaData(const QMediaMetaData &metaData) /*! Adds additional meta data to be embedded into the captured image. */ -void QCameraImageCapture::addMetaData(const QMediaMetaData &metaData) +void QImageCapture::addMetaData(const QMediaMetaData &metaData) { - Q_D(QCameraImageCapture); + Q_D(QImageCapture); auto data = d->metaData; for (auto k : metaData.keys()) data.insert(k, metaData.value(k)); @@ -237,16 +237,16 @@ void QCameraImageCapture::addMetaData(const QMediaMetaData &metaData) } /*! - \property QCameraImageCapture::readyForCapture + \property QImageCapture::readyForCapture \brief whether the service is ready to capture a an image immediately. Calling capture() while \e readyForCapture is \c false is not permitted and results in an error. */ -bool QCameraImageCapture::isReadyForCapture() const +bool QImageCapture::isReadyForCapture() const { - Q_D(const QCameraImageCapture); + Q_D(const QImageCapture); if (!d->control || !d->captureSession || !d->control->isReadyForCapture()) return false; auto *camera = d->captureSession->camera(); @@ -256,7 +256,7 @@ bool QCameraImageCapture::isReadyForCapture() const } /*! - \fn QCameraImageCapture::readyForCaptureChanged(bool ready) + \fn QImageCapture::readyForCaptureChanged(bool ready) Signals that a camera's \a ready for capture state has changed. */ @@ -265,9 +265,9 @@ bool QCameraImageCapture::isReadyForCapture() const /*! Capture the image and save it to \a file. This operation is asynchronous in majority of cases, - followed by signals QCameraImageCapture::imageExposed(), - QCameraImageCapture::imageCaptured(), QCameraImageCapture::imageSaved() - or QCameraImageCapture::error(). + followed by signals QImageCapture::imageExposed(), + QImageCapture::imageCaptured(), QImageCapture::imageSaved() + or QImageCapture::error(). If an empty \a file is passed, the camera backend choses the default location and naming scheme for photos on the system, @@ -278,14 +278,14 @@ bool QCameraImageCapture::isReadyForCapture() const image processing parameters, so changes to camera parameters after capture() is called do not affect previous capture requests. - QCameraImageCapture::capture returns the capture Id parameter, used with + QImageCapture::capture returns the capture Id parameter, used with imageExposed(), imageCaptured() and imageSaved() signals. \sa isReadyForCapture() */ -int QCameraImageCapture::captureToFile(const QString &file) +int QImageCapture::captureToFile(const QString &file) { - Q_D(QCameraImageCapture); + Q_D(QImageCapture); d->unsetError(); @@ -305,18 +305,18 @@ int QCameraImageCapture::captureToFile(const QString &file) /*! Capture the image and make it available as a QImage. This operation is asynchronous in majority of cases, - followed by signals QCameraImageCapture::imageExposed(), - QCameraImageCapture::imageCaptured() - or QCameraImageCapture::error(). + followed by signals QImageCapture::imageExposed(), + QImageCapture::imageCaptured() + or QImageCapture::error(). - QCameraImageCapture::capture returns the capture Id parameter, used with + QImageCapture::capture returns the capture Id parameter, used with imageExposed(), imageCaptured() and imageSaved() signals. \sa isReadyForCapture() */ -int QCameraImageCapture::capture() +int QImageCapture::capture() { - Q_D(QCameraImageCapture); + Q_D(QImageCapture); d->unsetError(); @@ -332,7 +332,7 @@ int QCameraImageCapture::capture() } /*! - \enum QCameraImageCapture::Error + \enum QImageCapture::Error \value NoError No Errors. \value NotReadyError The service is not ready for capture yet. @@ -343,33 +343,33 @@ int QCameraImageCapture::capture() */ /*! - \fn QCameraImageCapture::error(int id, QCameraImageCapture::Error error, const QString &errorString) + \fn QImageCapture::error(int id, QImageCapture::Error error, const QString &errorString) Signals that the capture request \a id has failed with an \a error and \a errorString description. */ /*! - \fn QCameraImageCapture::bufferFormatChanged(QVideoFrameFormat::PixelFormat format) + \fn QImageCapture::bufferFormatChanged(QVideoFrameFormat::PixelFormat format) Signal emitted when the buffer \a format for the buffer image capture has changed. */ /*! - \fn QCameraImageCapture::imageExposed(int id) + \fn QImageCapture::imageExposed(int id) Signal emitted when the frame with request \a id was exposed. */ /*! - \fn QCameraImageCapture::imageCaptured(int id, const QImage &preview); + \fn QImageCapture::imageCaptured(int id, const QImage &preview); Signal emitted when the frame with request \a id was captured, but not processed and saved yet. Frame \a preview can be displayed to user. */ /*! - \fn QCameraImageCapture::imageMetadataAvailable(int id, const QString &key, const QVariant &value) + \fn QImageCapture::imageMetadataAvailable(int id, const QString &key, const QVariant &value) Signals that a metadata for an image with request \a id is available. Also includes the \a key and \a value of the metadata. @@ -378,16 +378,16 @@ int QCameraImageCapture::capture() */ /*! - \fn QCameraImageCapture::imageAvailable(int id, const QVideoFrame &frame) + \fn QImageCapture::imageAvailable(int id, const QVideoFrame &frame) - Signal emitted when QCameraImageCapture::CaptureToBuffer is set and + Signal emitted when QImageCapture::CaptureToBuffer is set and the \a frame with request \a id is available. */ /*! - \fn QCameraImageCapture::imageSaved(int id, const QString &fileName) + \fn QImageCapture::imageSaved(int id, const QString &fileName) - Signal emitted when QCameraImageCapture::CaptureToFile is set and + Signal emitted when QImageCapture::CaptureToFile is set and the frame with request \a id was saved to \a fileName. */ @@ -395,9 +395,9 @@ int QCameraImageCapture::capture() Returns the image format. */ -QCameraImageCapture::FileFormat QCameraImageCapture::fileFormat() const +QImageCapture::FileFormat QImageCapture::fileFormat() const { - Q_D(const QCameraImageCapture); + Q_D(const QImageCapture); if (!d->control) return UnspecifiedFormat; return d->control->imageSettings().format(); @@ -406,9 +406,9 @@ QCameraImageCapture::FileFormat QCameraImageCapture::fileFormat() const /*! Sets the image \a format. */ -void QCameraImageCapture::setFileFormat(QCameraImageCapture::FileFormat format) +void QImageCapture::setFileFormat(QImageCapture::FileFormat format) { - Q_D(QCameraImageCapture); + Q_D(QImageCapture); if (!d->control) return; auto fmt = d->control->imageSettings(); @@ -419,12 +419,12 @@ void QCameraImageCapture::setFileFormat(QCameraImageCapture::FileFormat format) emit fileFormatChanged(); } -QList<QCameraImageCapture::FileFormat> QCameraImageCapture::supportedFormats() +QList<QImageCapture::FileFormat> QImageCapture::supportedFormats() { return QPlatformMediaIntegration::instance()->formatInfo()->imageFormats; } -QString QCameraImageCapture::fileFormatName(QCameraImageCapture::FileFormat f) +QString QImageCapture::fileFormatName(QImageCapture::FileFormat f) { const char *name = nullptr; switch (f) { @@ -447,7 +447,7 @@ QString QCameraImageCapture::fileFormatName(QCameraImageCapture::FileFormat f) return QString::fromUtf8(name); } -QString QCameraImageCapture::fileFormatDescription(QCameraImageCapture::FileFormat f) +QString QImageCapture::fileFormatDescription(QImageCapture::FileFormat f) { const char *name = nullptr; switch (f) { @@ -474,9 +474,9 @@ QString QCameraImageCapture::fileFormatDescription(QCameraImageCapture::FileForm Returns the resolution of the encoded image. */ -QSize QCameraImageCapture::resolution() const +QSize QImageCapture::resolution() const { - Q_D(const QCameraImageCapture); + Q_D(const QImageCapture); if (!d->control) return QSize(); return d->control->imageSettings().resolution(); @@ -488,9 +488,9 @@ QSize QCameraImageCapture::resolution() const An empty QSize indicates the encoder should make an optimal choice based on what is available from the image source and the limitations of the codec. */ -void QCameraImageCapture::setResolution(const QSize &resolution) +void QImageCapture::setResolution(const QSize &resolution) { - Q_D(QCameraImageCapture); + Q_D(QImageCapture); if (!d->control) return; auto fmt = d->control->imageSettings(); @@ -506,13 +506,13 @@ void QCameraImageCapture::setResolution(const QSize &resolution) \overload */ -void QCameraImageCapture::setResolution(int width, int height) +void QImageCapture::setResolution(int width, int height) { setResolution(QSize(width, height)); } /*! - \enum QCameraImageCapture::EncodingQuality + \enum QImageCapture::EncodingQuality Enumerates quality encoding levels. @@ -526,9 +526,9 @@ void QCameraImageCapture::setResolution(int width, int height) /*! Returns the image encoding quality. */ -QCameraImageCapture::Quality QCameraImageCapture::quality() const +QImageCapture::Quality QImageCapture::quality() const { - Q_D(const QCameraImageCapture); + Q_D(const QImageCapture); if (!d->control) return NormalQuality; return d->control->imageSettings().quality(); @@ -537,9 +537,9 @@ QCameraImageCapture::Quality QCameraImageCapture::quality() const /*! Sets the image encoding \a quality. */ -void QCameraImageCapture::setQuality(Quality quality) +void QImageCapture::setQuality(Quality quality) { - Q_D(QCameraImageCapture); + Q_D(QImageCapture); if (!d->control) return; auto fmt = d->control->imageSettings(); @@ -552,4 +552,4 @@ void QCameraImageCapture::setQuality(Quality quality) QT_END_NAMESPACE -#include "moc_qcameraimagecapture.cpp" +#include "moc_qimagecapture.cpp" diff --git a/src/multimedia/camera/qcameraimagecapture.h b/src/multimedia/camera/qimagecapture.h index 20b2bd6d1..ec52fd818 100644 --- a/src/multimedia/camera/qcameraimagecapture.h +++ b/src/multimedia/camera/qimagecapture.h @@ -57,8 +57,8 @@ class QImageEncoderSettings; class QCamera; class QMediaCaptureSession; -class QCameraImageCapturePrivate; -class Q_MULTIMEDIA_EXPORT QCameraImageCapture : public QObject +class QImageCapturePrivate; +class Q_MULTIMEDIA_EXPORT QImageCapture : public QObject { Q_OBJECT Q_PROPERTY(bool readyForCapture READ isReadyForCapture NOTIFY readyForCaptureChanged) @@ -99,8 +99,8 @@ public: }; Q_ENUM(FileFormat) - explicit QCameraImageCapture(QObject *parent = nullptr); - ~QCameraImageCapture(); + explicit QImageCapture(QObject *parent = nullptr); + ~QImageCapture(); bool isAvailable() const; @@ -135,7 +135,7 @@ public Q_SLOTS: Q_SIGNALS: void errorChanged(); - void errorOccurred(int id, QCameraImageCapture::Error error, const QString &errorString); + void errorOccurred(int id, QImageCapture::Error error, const QString &errorString); void readyForCaptureChanged(bool ready); void metaDataChanged(); @@ -152,19 +152,19 @@ Q_SIGNALS: private: // This is here to flag an incompatibilities with Qt 5 - QCameraImageCapture(QCamera *) = delete; + QImageCapture(QCamera *) = delete; friend class QMediaCaptureSession; void setCaptureSession(QMediaCaptureSession *session); - QCameraImageCapturePrivate *d_ptr; - Q_DISABLE_COPY(QCameraImageCapture) - Q_DECLARE_PRIVATE(QCameraImageCapture) + QImageCapturePrivate *d_ptr; + Q_DISABLE_COPY(QImageCapture) + Q_DECLARE_PRIVATE(QImageCapture) Q_PRIVATE_SLOT(d_func(), void _q_error(int, int, const QString &)) }; QT_END_NAMESPACE -Q_MEDIA_ENUM_DEBUG(QCameraImageCapture, Error) +Q_MEDIA_ENUM_DEBUG(QImageCapture, Error) #endif diff --git a/src/multimedia/doc/snippets/multimedia-snippets/camera.cpp b/src/multimedia/doc/snippets/multimedia-snippets/camera.cpp index 0407be1aa..fa2ca6d25 100644 --- a/src/multimedia/doc/snippets/multimedia-snippets/camera.cpp +++ b/src/multimedia/doc/snippets/multimedia-snippets/camera.cpp @@ -44,7 +44,7 @@ #include "qmediarecorder.h" #include "qmediadevices.h" #include "qmediacapturesession.h" -#include "qcameraimagecapture.h" +#include "qimagecapture.h" #include "qvideosink.h" #include <QtMultimediaWidgets/qvideowidget.h> #include <QtGui/qscreen.h> @@ -54,7 +54,7 @@ /* Globals so that everything is consistent. */ QCamera *camera = 0; QMediaRecorder *recorder = 0; -QCameraImageCapture *imageCapture = 0; +QImageCapture *imageCapture = 0; //! [Camera overview check] bool checkCameraAvailability() @@ -135,7 +135,7 @@ void overview_still() QMediaCaptureSession captureSession; camera = new QCamera; captureSession.setCamera(camera); - imageCapture = new QCameraImageCapture(camera); + imageCapture = new QImageCapture(camera); captureSession.setImageCapture(imageCapture); camera->start(); // Viewfinder frames start flowing @@ -216,7 +216,7 @@ void camera_blah() preview->show(); captureSession.setVideoOutput(preview); - imageCapture = new QCameraImageCapture(camera); + imageCapture = new QImageCapture(camera); captureSession.setImageCapture(imageCapture); camera->start(); diff --git a/src/multimedia/doc/snippets/multimedia-snippets/media.cpp b/src/multimedia/doc/snippets/multimedia-snippets/media.cpp index fd76e679e..1e905484e 100644 --- a/src/multimedia/doc/snippets/multimedia-snippets/media.cpp +++ b/src/multimedia/doc/snippets/multimedia-snippets/media.cpp @@ -47,7 +47,7 @@ #include "qplatformmediaplayer_p.h" #include "qmediaplayer.h" #include "qvideowidget.h" -#include "qcameraimagecapture.h" +#include "qimagecapture.h" #include "qcamera.h" #include "qcameraviewfinder.h" #include "qaudiorecorder.h" @@ -73,7 +73,7 @@ private: QMediaRecorder *recorder; QCamera *camera; QCameraViewfinder *viewfinder; - QCameraImageCapture *imageCapture; + QImageCapture *imageCapture; QString fileName; QMediaContent image1; @@ -100,7 +100,7 @@ void MediaExample::recorderSettings() void MediaExample::imageSettings() { //! [Image encoder settings] - imageCapture->setFileFormat(QCameraImageCapture::JPEG); + imageCapture->setFileFormat(QImageCapture::JPEG); imageCapture->setResolution(1600, 1200); //! [Image encoder settings] } diff --git a/src/multimedia/doc/src/cameraoverview.qdoc b/src/multimedia/doc/src/cameraoverview.qdoc index 001ca1832..09c7f3632 100644 --- a/src/multimedia/doc/src/cameraoverview.qdoc +++ b/src/multimedia/doc/src/cameraoverview.qdoc @@ -196,7 +196,7 @@ account the camera sensor orientation and the current display orientation. \section2 Still Images After setting up a viewfinder and finding something photogenic, -to capture an image we need to initialize a new QCameraImageCapture +to capture an image we need to initialize a new QImageCapture object. All that is then needed is to start the camera and capture the image. \snippet multimedia-snippets/camera.cpp Camera overview capture @@ -276,7 +276,7 @@ Various operations such as image capture and auto focusing occur asynchrously. These operations can often be canceled by the start of a new operation as long as this is supported by the camera. For image capture, the operation can be canceled by calling -\l {QCameraImageCapture::cancelCapture()}{cancelCapture()}. For AutoFocus, +\l {QImageCapture::cancelCapture()}{cancelCapture()}. For AutoFocus, autoexposure or white balance cancellation can be done by calling \e {QCamera::unlock(QCamera::LockFocus)}. diff --git a/src/multimedia/doc/src/multimedia.qdoc b/src/multimedia/doc/src/multimedia.qdoc index c554d5898..d5f0322c3 100644 --- a/src/multimedia/doc/src/multimedia.qdoc +++ b/src/multimedia/doc/src/multimedia.qdoc @@ -132,7 +132,7 @@ For some quick recipes, look at the overviews above and consult this table: \li \l {Camera Example}{camera}, \l {QML Camera Example}{declarative-camera} \li \l Camera - \li QCamera, QCameraImageCapture + \li QCamera, QImageCapture \row \li Capturing movies \li \l {Camera Example}{camera}, diff --git a/src/multimedia/doc/src/qtmultimedia-index.qdoc b/src/multimedia/doc/src/qtmultimedia-index.qdoc index 5e2f4d98f..598a67456 100644 --- a/src/multimedia/doc/src/qtmultimedia-index.qdoc +++ b/src/multimedia/doc/src/qtmultimedia-index.qdoc @@ -117,7 +117,7 @@ \li QCamera \li Access camera viewfinder. \row - \li QCameraImageCapture + \li QImageCapture \li Capture still images with a camera. \row \li QMediaRecorder diff --git a/src/multimedia/platform/android/mediacapture/qandroidcameracontrol.cpp b/src/multimedia/platform/android/mediacapture/qandroidcameracontrol.cpp index 3e3f58b51..e606896a9 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcameracontrol.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidcameracontrol.cpp @@ -73,11 +73,6 @@ bool QAndroidCameraControl::isActive() const return m_cameraSession->isActive(); } -QCamera::Status QAndroidCameraControl::status() const -{ - return m_cameraSession->status(); -} - void QAndroidCameraControl::setCamera(const QCameraDevice &camera) { int id = 0; diff --git a/src/multimedia/platform/android/mediacapture/qandroidcameracontrol_p.h b/src/multimedia/platform/android/mediacapture/qandroidcameracontrol_p.h index 56901a637..9076b7152 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcameracontrol_p.h +++ b/src/multimedia/platform/android/mediacapture/qandroidcameracontrol_p.h @@ -70,8 +70,6 @@ public: bool isActive() const override; void setActive(bool active) override; - QCamera::Status status() const override; - void setCamera(const QCameraDevice &camera) override; void setCaptureSession(QPlatformMediaCaptureSession *session) override; diff --git a/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp b/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp index a5cb1a467..e15a04cc6 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp @@ -65,7 +65,6 @@ QAndroidCameraSession::QAndroidCameraSession(QObject *parent) , m_nativeOrientation(0) , m_videoOutput(0) , m_savedState(-1) - , m_status(QCamera::InactiveStatus) , m_previewStarted(false) , m_lastImageCaptureId(0) , m_readyForCapture(false) @@ -108,7 +107,6 @@ void QAndroidCameraSession::setActive(bool active) return; m_active = active; - emit activeChanged(m_active); // If the application is inactive, the camera shouldn't be started. Save the desired state // instead and it will be set when the application becomes active. @@ -116,6 +114,8 @@ void QAndroidCameraSession::setActive(bool active) setActiveHelper(active); else m_savedState = active; + + emit activeChanged(m_active); } void QAndroidCameraSession::setActiveHelper(bool active) @@ -125,10 +125,7 @@ void QAndroidCameraSession::setActiveHelper(bool active) close(); } else { if (!m_camera && !open()) { - m_active = false; emit error(QCamera::CameraError, QStringLiteral("Failed to open camera")); - m_status = QCamera::InactiveStatus; - emit statusChanged(m_status); return; } startPreview(); @@ -161,9 +158,6 @@ bool QAndroidCameraSession::open() { close(); - m_status = QCamera::StartingStatus; - emit statusChanged(m_status); - m_camera = AndroidCamera::open(m_selectedCamera); if (m_camera) { @@ -188,7 +182,7 @@ bool QAndroidCameraSession::open() m_camera->notifyNewFrames(m_previewCallback); emit opened(); - emit statusChanged(m_status); + setActive(true); } return m_camera != 0; @@ -201,9 +195,6 @@ void QAndroidCameraSession::close() stopPreview(); - m_status = QCamera::StoppingStatus; - emit statusChanged(m_status); - m_readyForCapture = false; m_currentImageCaptureId = -1; m_currentImageCaptureFileName.clear(); @@ -213,8 +204,7 @@ void QAndroidCameraSession::close() delete m_camera; m_camera = 0; - m_status = QCamera::InactiveStatus; - emit statusChanged(m_status); + setActive(false); } void QAndroidCameraSession::setVideoOutput(QAndroidVideoOutput *output) @@ -370,9 +360,6 @@ bool QAndroidCameraSession::startPreview() || (m_videoOutput->surfaceHolder() && !m_camera->setPreviewDisplay(m_videoOutput->surfaceHolder()))) return false; - m_status = QCamera::StartingStatus; - emit statusChanged(m_status); - applyImageSettings(); applyResolution(m_actualImageSettings.resolution()); @@ -394,9 +381,6 @@ void QAndroidCameraSession::stopPreview() if (!m_camera || !m_previewStarted) return; - m_status = QCamera::StoppingStatus; - emit statusChanged(m_status); - AndroidMultimediaUtils::enableOrientationListener(false); m_camera->stopPreview(); @@ -463,7 +447,7 @@ void QAndroidCameraSession::applyImageSettings() return; // only supported format right now. - m_actualImageSettings.setFormat(QCameraImageCapture::JPEG); + m_actualImageSettings.setFormat(QImageCapture::JPEG); const QSize requestedResolution = m_requestedImageSettings.resolution(); const QList<QSize> supportedResolutions = m_camera->getSupportedPictureSizes(); @@ -485,19 +469,19 @@ void QAndroidCameraSession::applyImageSettings() int jpegQuality = 100; switch (m_requestedImageSettings.quality()) { - case QCameraImageCapture::VeryLowQuality: + case QImageCapture::VeryLowQuality: jpegQuality = 20; break; - case QCameraImageCapture::LowQuality: + case QImageCapture::LowQuality: jpegQuality = 40; break; - case QCameraImageCapture::NormalQuality: + case QImageCapture::NormalQuality: jpegQuality = 60; break; - case QCameraImageCapture::HighQuality: + case QImageCapture::HighQuality: jpegQuality = 80; break; - case QCameraImageCapture::VeryHighQuality: + case QImageCapture::VeryHighQuality: jpegQuality = 100; break; } @@ -506,7 +490,7 @@ void QAndroidCameraSession::applyImageSettings() bool QAndroidCameraSession::isReadyForCapture() const { - return m_status == QCamera::ActiveStatus && m_readyForCapture; + return isActive() && m_readyForCapture; } void QAndroidCameraSession::setReadyForCapture(bool ready) @@ -523,7 +507,7 @@ int QAndroidCameraSession::capture(const QString &fileName) ++m_lastImageCaptureId; if (!isReadyForCapture()) { - emit imageCaptureError(m_lastImageCaptureId, QCameraImageCapture::NotReadyError, + emit imageCaptureError(m_lastImageCaptureId, QImageCapture::NotReadyError, tr("Camera not ready")); return m_lastImageCaptureId; } @@ -546,7 +530,7 @@ int QAndroidCameraSession::capture(const QString &fileName) void QAndroidCameraSession::onCameraTakePictureFailed() { - emit imageCaptureError(m_currentImageCaptureId, QCameraImageCapture::ResourceError, + emit imageCaptureError(m_currentImageCaptureId, QImageCapture::ResourceError, tr("Failed to capture image")); // Preview needs to be restarted and the preview call back must be setup again @@ -616,17 +600,12 @@ void QAndroidCameraSession::onCameraPictureCaptured(const QByteArray &data) void QAndroidCameraSession::onCameraPreviewStarted() { - if (m_status == QCamera::StartingStatus) { - m_status = QCamera::ActiveStatus; - emit statusChanged(m_status); - } - setReadyForCapture(true); } void QAndroidCameraSession::onCameraPreviewFailedToStart() { - if (m_status == QCamera::StartingStatus) { + if (isActive()) { Q_EMIT error(QCamera::CameraError, tr("Camera preview failed to start.")); AndroidMultimediaUtils::enableOrientationListener(false); @@ -638,20 +617,14 @@ void QAndroidCameraSession::onCameraPreviewFailedToStart() } m_previewStarted = false; - m_status = QCamera::InactiveStatus; - emit statusChanged(m_status); - + setActive(false); setReadyForCapture(false); } } void QAndroidCameraSession::onCameraPreviewStopped() { - if (m_status == QCamera::StoppingStatus) { - m_status = QCamera::InactiveStatus; - emit statusChanged(m_status); - } - + setActive(false); setReadyForCapture(false); } @@ -681,11 +654,11 @@ void QAndroidCameraSession::processCapturedImage(int id, emit imageSaved(id, actualFileName); } else { - emit imageCaptureError(id, QCameraImageCapture::OutOfSpaceError, file.errorString()); + emit imageCaptureError(id, QImageCapture::OutOfSpaceError, file.errorString()); } } else { const QString errorMessage = tr("Could not open destination file: %1").arg(actualFileName); - emit imageCaptureError(id, QCameraImageCapture::ResourceError, errorMessage); + emit imageCaptureError(id, QImageCapture::ResourceError, errorMessage); } } else { QVideoFrame frame(new QMemoryVideoBuffer(data, -1), QVideoFrameFormat(resolution, QVideoFrameFormat::Format_Jpeg)); @@ -738,8 +711,7 @@ void QAndroidCameraSession::onApplicationStateChanged(Qt::ApplicationState state if (!m_keepActive && m_active) { m_savedState = m_active; close(); - m_active = false; - emit activeChanged(m_active); + setActive(false); } break; case Qt::ApplicationActive: diff --git a/src/multimedia/platform/android/mediacapture/qandroidcamerasession_p.h b/src/multimedia/platform/android/mediacapture/qandroidcamerasession_p.h index 5513e5399..195a90bfb 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcamerasession_p.h +++ b/src/multimedia/platform/android/mediacapture/qandroidcamerasession_p.h @@ -53,11 +53,11 @@ // #include <qcamera.h> -#include <QCameraImageCapture> +#include <QImageCapture> #include <QSet> #include <QMutex> #include <private/qmediastoragelocation_p.h> -#include <private/qplatformcameraimagecapture_p.h> +#include <private/qplatformimagecapture_p.h> #include "androidcamera_p.h" QT_BEGIN_NAMESPACE @@ -81,8 +81,6 @@ public: bool isActive() const { return m_active; } void setActive(bool active); - QCamera::Status status() const { return m_status; } - void applyResolution(const QSize &captureSize = QSize(), bool restartPreview = true); QAndroidVideoOutput *videoOutput() const { return m_videoOutput; } @@ -113,7 +111,6 @@ public: void setVideoSink(QVideoSink *surface); Q_SIGNALS: - void statusChanged(QCamera::Status status); void activeChanged(bool); void error(int error, const QString &errorString); void opened(); @@ -170,7 +167,6 @@ private: bool m_active = false; int m_savedState = -1; - QCamera::Status m_status; bool m_previewStarted; QAndroidCameraVideoRendererControl *m_renderer = nullptr; diff --git a/src/multimedia/platform/android/mediacapture/qandroidcameravideorenderercontrol.cpp b/src/multimedia/platform/android/mediacapture/qandroidcameravideorenderercontrol.cpp index 96b10b084..9a4b2440a 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcameravideorenderercontrol.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidcameravideorenderercontrol.cpp @@ -148,12 +148,12 @@ void QAndroidCameraDataVideoOutput::configureFormat() } else { m_control->cameraSession()->setPreviewCallback(this); - if (m_control->cameraSession()->status() > QCamera::InactiveStatus) + if (m_control->cameraSession()->isActive()) m_control->cameraSession()->camera()->stopPreview(); m_control->cameraSession()->setPreviewFormat(qt_androidImageFormatFromPixelFormat(m_pixelFormat)); - if (m_control->cameraSession()->status() > QCamera::InactiveStatus) + if (m_control->cameraSession()->isActive()) m_control->cameraSession()->camera()->startPreview(); } } diff --git a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp index 97b436ee3..99ebcc3b7 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp @@ -45,7 +45,7 @@ #include "qandroidcameracontrol_p.h" #include "qandroidcamerasession_p.h" #include "qandroidcameravideorenderercontrol_p.h" -#include "qandroidcameraimagecapturecontrol_p.h" +#include "qandroidimagecapture_p.h" #include "qmediadevices.h" #include "qaudiodevice.h" @@ -94,14 +94,14 @@ void QAndroidCaptureService::setCamera(QPlatformCamera *camera) emit cameraChanged(); } -QPlatformCameraImageCapture *QAndroidCaptureService::imageCapture() +QPlatformImageCapture *QAndroidCaptureService::imageCapture() { return m_imageCaptureControl; } -void QAndroidCaptureService::setImageCapture(QPlatformCameraImageCapture *imageCapture) +void QAndroidCaptureService::setImageCapture(QPlatformImageCapture *imageCapture) { - QAndroidCameraImageCaptureControl *control = static_cast<QAndroidCameraImageCaptureControl *>(imageCapture); + QAndroidImageCapture *control = static_cast<QAndroidImageCapture *>(imageCapture); if (m_imageCaptureControl == control) return; diff --git a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h index 6e8dc5460..0f87965e1 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h +++ b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h @@ -61,7 +61,7 @@ class QAndroidMediaEncoder; class QAndroidCaptureSession; class QAndroidCameraControl; class QAndroidCameraSession; -class QAndroidCameraImageCaptureControl; +class QAndroidImageCapture; class QAndroidCaptureService : public QPlatformMediaCaptureSession { @@ -74,8 +74,8 @@ public: QPlatformCamera *camera() override; void setCamera(QPlatformCamera *camera) override; - QPlatformCameraImageCapture *imageCapture() override; - void setImageCapture(QPlatformCameraImageCapture *imageCapture) override; + QPlatformImageCapture *imageCapture() override; + void setImageCapture(QPlatformImageCapture *imageCapture) override; QPlatformMediaEncoder *mediaEncoder() override; void setMediaEncoder(QPlatformMediaEncoder *encoder) override; @@ -94,7 +94,7 @@ private: QAndroidCaptureSession *m_captureSession = nullptr; QAndroidCameraControl *m_cameraControl = nullptr; QAndroidCameraSession *m_cameraSession = nullptr; - QAndroidCameraImageCaptureControl *m_imageCaptureControl; + QAndroidImageCapture *m_imageCaptureControl; }; QT_END_NAMESPACE diff --git a/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp b/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp index 021159b32..25b17bdcc 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp @@ -75,20 +75,10 @@ QAndroidCaptureSession::QAndroidCaptureSession(QAndroidCameraSession *cameraSess if (cameraSession) { connect(cameraSession, SIGNAL(opened()), this, SLOT(onCameraOpened())); - connect(cameraSession, &QAndroidCameraSession::statusChanged, this, - [this](QCamera::Status status) { - if (status == QCamera::UnavailableStatus) { - setState(QMediaRecorder::StoppedState); - setStatus(QMediaRecorder::UnavailableStatus); - return; - } - - // Stop recording when stopping the camera. - if (status == QCamera::StoppingStatus) { - setState(QMediaRecorder::StoppedState); - setStatus(QMediaRecorder::StoppedStatus); - return; - } + connect(cameraSession, &QAndroidCameraSession::activeChanged, this, + [this](bool isActive) { + if (!isActive) + stop(); }); connect(cameraSession, &QAndroidCameraSession::readyForCaptureChanged, this, [this](bool ready) { @@ -134,56 +124,12 @@ void QAndroidCaptureSession::setAudioInput(QPlatformAudioInput *input) m_audioSource = AndroidMediaRecorder::DefaultAudioSource; } -QUrl QAndroidCaptureSession::outputLocation() const -{ - return m_actualOutputLocation; -} - -bool QAndroidCaptureSession::setOutputLocation(const QUrl &location) -{ - if (m_requestedOutputLocation == location) - return false; - - m_actualOutputLocation = QUrl(); - m_requestedOutputLocation = location; - - if (m_requestedOutputLocation.isEmpty()) - return true; - - if (m_requestedOutputLocation.isValid() - && (m_requestedOutputLocation.isLocalFile() || m_requestedOutputLocation.isRelative())) { - return true; - } - - m_requestedOutputLocation = QUrl(); - return false; -} - QMediaRecorder::RecorderState QAndroidCaptureSession::state() const { return m_state; } -void QAndroidCaptureSession::setState(QMediaRecorder::RecorderState state) -{ - if (m_state == state) - return; - - switch (state) { - case QMediaRecorder::StoppedState: - stop(); - break; - case QMediaRecorder::RecordingState: - start(); - break; - case QMediaRecorder::PausedState: - // Not supported by Android API - qWarning("QMediaRecorder::PausedState is not supported on Android"); - break; - } -} - -void QAndroidCaptureSession::start() +void QAndroidCaptureSession::start(const QUrl &outputLocation) { if (m_state == QMediaRecorder::RecordingState || m_status != QMediaRecorder::StoppedStatus) return; @@ -193,6 +139,7 @@ void QAndroidCaptureSession::start() if (m_mediaRecorder) { m_mediaRecorder->release(); delete m_mediaRecorder; + m_mediaRecorder = nullptr; } const bool granted = m_cameraSession @@ -242,8 +189,8 @@ void QAndroidCaptureSession::start() // Set output file QString filePath = m_mediaStorageLocation.generateFileName( - m_requestedOutputLocation.isLocalFile() ? m_requestedOutputLocation.toLocalFile() - : m_requestedOutputLocation.toString(), + outputLocation.isLocalFile() ? outputLocation.toLocalFile() + : outputLocation.toString(), m_cameraSession ? QMediaStorageLocation::Movies : QMediaStorageLocation::Sounds, m_cameraSession ? QLatin1String("VID_") @@ -313,7 +260,7 @@ void QAndroidCaptureSession::stop(bool error) delete m_mediaRecorder; m_mediaRecorder = 0; - if (m_cameraSession && m_cameraSession->status() == QCamera::ActiveStatus) { + if (m_cameraSession && m_cameraSession->isActive()) { // Viewport needs to be restarted after recording restartViewfinder(); } @@ -328,8 +275,7 @@ void QAndroidCaptureSession::stop(bool error) if (mediaPath.startsWith(standardLoc)) AndroidMultimediaUtils::registerMediaFile(mediaPath); - m_actualOutputLocation = m_usedOutputLocation; - emit actualLocationChanged(m_actualOutputLocation); + emit actualLocationChanged(m_usedOutputLocation); } m_state = QMediaRecorder::StoppedState; @@ -545,11 +491,11 @@ void QAndroidCaptureSession::onInfo(int what, int extra) Q_UNUSED(extra); if (what == 800) { // MEDIA_RECORDER_INFO_MAX_DURATION_REACHED - setState(QMediaRecorder::StoppedState); + stop(); emit error(QMediaRecorder::OutOfSpaceError, QLatin1String("Maximum duration reached.")); } else if (what == 801) { // MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED - setState(QMediaRecorder::StoppedState); + stop(); emit error(QMediaRecorder::OutOfSpaceError, QLatin1String("Maximum file size reached.")); } } diff --git a/src/multimedia/platform/android/mediacapture/qandroidcapturesession_p.h b/src/multimedia/platform/android/mediacapture/qandroidcapturesession_p.h index 43f26969b..87abdf807 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcapturesession_p.h +++ b/src/multimedia/platform/android/mediacapture/qandroidcapturesession_p.h @@ -77,14 +77,12 @@ public: void setAudioInput(QPlatformAudioInput *input); - QUrl outputLocation() const; - bool setOutputLocation(const QUrl &location); - QMediaRecorder::RecorderState state() const; - void setState(QMediaRecorder::RecorderState state); - QMediaRecorder::Status status() const; + void start(const QUrl &outputLocation); + void stop(bool error = false); + qint64 duration() const; void setEncoderSettings(const QMediaEncoderSettings &settings); @@ -160,8 +158,6 @@ private: CaptureProfile getProfile(int id); - void start(); - void stop(bool error = false); void setStatus(QMediaRecorder::Status status); @@ -183,9 +179,7 @@ private: QMediaRecorder::RecorderState m_state; QMediaRecorder::Status m_status; - QUrl m_requestedOutputLocation; QUrl m_usedOutputLocation; - QUrl m_actualOutputLocation; CaptureProfile m_defaultSettings; diff --git a/src/multimedia/platform/android/mediacapture/qandroidcameraimagecapturecontrol.cpp b/src/multimedia/platform/android/mediacapture/qandroidimagecapture.cpp index c75d2b28b..a782ec9e0 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcameraimagecapturecontrol.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidimagecapture.cpp @@ -37,50 +37,50 @@ ** ****************************************************************************/ -#include "qandroidcameraimagecapturecontrol_p.h" +#include "qandroidimagecapture_p.h" #include "qandroidcamerasession_p.h" #include "qandroidcaptureservice_p.h" QT_BEGIN_NAMESPACE -QAndroidCameraImageCaptureControl::QAndroidCameraImageCaptureControl(QCameraImageCapture *parent) - : QPlatformCameraImageCapture(parent) +QAndroidImageCapture::QAndroidImageCapture(QImageCapture *parent) + : QPlatformImageCapture(parent) { } -bool QAndroidCameraImageCaptureControl::isReadyForCapture() const +bool QAndroidImageCapture::isReadyForCapture() const { return m_session->isReadyForCapture(); } -int QAndroidCameraImageCaptureControl::capture(const QString &fileName) +int QAndroidImageCapture::capture(const QString &fileName) { return m_session->capture(fileName); } -int QAndroidCameraImageCaptureControl::captureToBuffer() +int QAndroidImageCapture::captureToBuffer() { // ### implement me! const QLatin1String errorMessage("Capturing to buffer not supported."); QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(int, -1), - Q_ARG(int, QCameraImageCapture::NotSupportedFeatureError), + Q_ARG(int, QImageCapture::NotSupportedFeatureError), Q_ARG(QString, errorMessage)); return -1; } -QImageEncoderSettings QAndroidCameraImageCaptureControl::imageSettings() const +QImageEncoderSettings QAndroidImageCapture::imageSettings() const { return m_session->imageSettings(); } -void QAndroidCameraImageCaptureControl::setImageSettings(const QImageEncoderSettings &settings) +void QAndroidImageCapture::setImageSettings(const QImageEncoderSettings &settings) { m_session->setImageSettings(settings); } -void QAndroidCameraImageCaptureControl::setCaptureSession(QPlatformMediaCaptureSession *session) +void QAndroidImageCapture::setCaptureSession(QPlatformMediaCaptureSession *session) { QAndroidCaptureService *captureSession = static_cast<QAndroidCaptureService *>(session); if (m_service == captureSession) diff --git a/src/multimedia/platform/android/mediacapture/qandroidcameraimagecapturecontrol_p.h b/src/multimedia/platform/android/mediacapture/qandroidimagecapture_p.h index 9db1a66e1..c5697b601 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcameraimagecapturecontrol_p.h +++ b/src/multimedia/platform/android/mediacapture/qandroidimagecapture_p.h @@ -51,18 +51,18 @@ // We mean it. // -#include <private/qplatformcameraimagecapture_p.h> +#include <private/qplatformimagecapture_p.h> QT_BEGIN_NAMESPACE class QAndroidCameraSession; class QAndroidCaptureService; -class QAndroidCameraImageCaptureControl : public QPlatformCameraImageCapture +class QAndroidImageCapture : public QPlatformImageCapture { Q_OBJECT public: - explicit QAndroidCameraImageCaptureControl(QCameraImageCapture *parent = nullptr); + explicit QAndroidImageCapture(QImageCapture *parent = nullptr); bool isReadyForCapture() const override; diff --git a/src/multimedia/platform/android/mediacapture/qandroidmediaencoder.cpp b/src/multimedia/platform/android/mediacapture/qandroidmediaencoder.cpp index 5b51d9281..50bb0f604 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidmediaencoder.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidmediaencoder.cpp @@ -49,14 +49,10 @@ QAndroidMediaEncoder::QAndroidMediaEncoder(QMediaRecorder *parent) { } -QUrl QAndroidMediaEncoder::outputLocation() const +bool QAndroidMediaEncoder::isLocationWritable(const QUrl &location) const { - return m_session->outputLocation(); -} - -bool QAndroidMediaEncoder::setOutputLocation(const QUrl &location) -{ - return m_session->setOutputLocation(location); + return location.isValid() + && (location.isLocalFile() || location.isRelative()); } QMediaRecorder::RecorderState QAndroidMediaEncoder::state() const @@ -81,7 +77,21 @@ void QAndroidMediaEncoder::applySettings() void QAndroidMediaEncoder::setState(QMediaRecorder::RecorderState state) { - m_session->setState(state); + if (!m_session) + return; + + switch (state) { + case QMediaRecorder::StoppedState: + m_session->stop(); + break; + case QMediaRecorder::RecordingState: + m_session->start(outputLocation()); + break; + case QMediaRecorder::PausedState: + // Not supported by Android API + qWarning("QMediaEncoder::PausedState is not supported on Android"); + break; + } } void QAndroidMediaEncoder::setEncoderSettings(const QMediaEncoderSettings &settings) diff --git a/src/multimedia/platform/android/mediacapture/qandroidmediaencoder_p.h b/src/multimedia/platform/android/mediacapture/qandroidmediaencoder_p.h index 237f1a5b4..6a1f41715 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidmediaencoder_p.h +++ b/src/multimedia/platform/android/mediacapture/qandroidmediaencoder_p.h @@ -64,8 +64,7 @@ class QAndroidMediaEncoder : public QPlatformMediaEncoder public: explicit QAndroidMediaEncoder(QMediaRecorder *parent); - QUrl outputLocation() const override; - bool setOutputLocation(const QUrl &location) override; + bool isLocationWritable(const QUrl &location) const override; QMediaRecorder::RecorderState state() const override; QMediaRecorder::Status status() const override; qint64 duration() const override; diff --git a/src/multimedia/platform/android/qandroidformatsinfo.cpp b/src/multimedia/platform/android/qandroidformatsinfo.cpp index 4d31cc15d..0e421b658 100644 --- a/src/multimedia/platform/android/qandroidformatsinfo.cpp +++ b/src/multimedia/platform/android/qandroidformatsinfo.cpp @@ -53,7 +53,7 @@ QAndroidFormatInfo::QAndroidFormatInfo() }; encoders = decoders; - imageFormats << QCameraImageCapture::JPEG; + imageFormats << QImageCapture::JPEG; } QAndroidFormatInfo::~QAndroidFormatInfo() diff --git a/src/multimedia/platform/android/qandroidintegration.cpp b/src/multimedia/platform/android/qandroidintegration.cpp index 1a8a10a43..95b8bd39e 100644 --- a/src/multimedia/platform/android/qandroidintegration.cpp +++ b/src/multimedia/platform/android/qandroidintegration.cpp @@ -47,7 +47,7 @@ #include "private/androidsurfaceview_p.h" #include "private/androidcamera_p.h" #include "private/qandroidcameracontrol_p.h" -#include "private/qandroidcameraimagecapturecontrol_p.h" +#include "private/qandroidimagecapture_p.h" #include "private/qandroidmediaencoder_p.h" #include "private/androidmediarecorder_p.h" #include "private/qandroidformatsinfo_p.h" @@ -104,9 +104,9 @@ QPlatformMediaEncoder *QAndroidIntegration::createEncoder(QMediaRecorder *encode return new QAndroidMediaEncoder(encoder); } -QPlatformCameraImageCapture *QAndroidIntegration::createImageCapture(QCameraImageCapture *imageCapture) +QPlatformImageCapture *QAndroidIntegration::createImageCapture(QImageCapture *imageCapture) { - return new QAndroidCameraImageCaptureControl(imageCapture); + return new QAndroidImageCapture(imageCapture); } QPlatformAudioOutput *QAndroidIntegration::createAudioOutput(QAudioOutput *q) diff --git a/src/multimedia/platform/android/qandroidintegration_p.h b/src/multimedia/platform/android/qandroidintegration_p.h index 6df40672c..a242dc19a 100644 --- a/src/multimedia/platform/android/qandroidintegration_p.h +++ b/src/multimedia/platform/android/qandroidintegration_p.h @@ -70,7 +70,7 @@ public: QPlatformMediaPlayer *createPlayer(QMediaPlayer *player) override; QPlatformCamera *createCamera(QCamera *camera) override; QPlatformMediaEncoder *createEncoder(QMediaRecorder *encoder) override; - QPlatformCameraImageCapture *createImageCapture(QCameraImageCapture *imageCapture) override; + QPlatformImageCapture *createImageCapture(QImageCapture *imageCapture) override; QPlatformAudioOutput *createAudioOutput(QAudioOutput *q) override; diff --git a/src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever.cpp b/src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever.cpp index b581fe255..fd5aa1604 100644 --- a/src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever.cpp +++ b/src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever.cpp @@ -143,7 +143,7 @@ bool AndroidMediaMetadataRetriever::setDataSource(const QUrl &url) if (!ok) return false; - } else if (QNativeInterface::QAndroidApplication::sdkVersion() >= 14) { + } else if (QNativeInterface::QAndroidApplication::sdkVersion() >= 14 && url.scheme() != QLatin1String("content")) { // On API levels >= 14, only setDataSource(String, Map<String, String>) accepts remote media QJniObject string = QJniObject::fromString(url.toString(QUrl::FullyEncoded)); QJniObject hash("java/util/HashMap"); diff --git a/src/multimedia/platform/darwin/audio/avfaudiodecoder.mm b/src/multimedia/platform/darwin/audio/avfaudiodecoder.mm index 2ff872212..ecea99f74 100644 --- a/src/multimedia/platform/darwin/audio/avfaudiodecoder.mm +++ b/src/multimedia/platform/darwin/audio/avfaudiodecoder.mm @@ -90,7 +90,7 @@ QT_USE_NAMESPACE return; const AudioStreamBasicDescription* const asbd = CMAudioFormatDescriptionGetStreamBasicDescription(formatDescription); QAudioFormat qtFormat = CoreAudioUtils::toQAudioFormat(*asbd); - if (!qtFormat.isValid() || qtFormat != m_decoder->audioFormat()) + if (!qtFormat.isValid()) return; // Get the required size to allocate to audioBufferList @@ -314,7 +314,7 @@ void AVFAudioDecoder::setSourceDevice(QIODevice *device) void AVFAudioDecoder::start() { Q_ASSERT(!m_buffersAvailable); - if (m_state != QAudioDecoder::StoppedState) + if (isDecoding()) return; if (m_position != -1) { @@ -348,16 +348,13 @@ void AVFAudioDecoder::start() ]; if (m_device && m_loadingSource) { - m_state = QAudioDecoder::DecodingState; - emit stateChanged(m_state); + setIsDecoding(true); return; } } void AVFAudioDecoder::stop() { - QAudioDecoder::State oldState = m_state; - m_state = QAudioDecoder::StoppedState; if (m_asset) [m_asset cancelLoading]; if (m_reader) @@ -375,21 +372,7 @@ void AVFAudioDecoder::stop() m_duration = -1; emit durationChanged(m_duration); } - if (m_state != oldState) - emit stateChanged(m_state); -} - -QAudioFormat AVFAudioDecoder::audioFormat() const -{ - return m_format; -} - -void AVFAudioDecoder::setAudioFormat(const QAudioFormat &format) -{ - if (m_format != format) { - m_format = format; - emit formatChanged(m_format); - } + setIsDecoding(false); } QAudioBuffer AVFAudioDecoder::read() @@ -444,18 +427,10 @@ void AVFAudioDecoder::initAssetReader() // Set format QAudioFormat format; - if (m_format.isValid()) { - format = m_format; - } else { - format = qt_format_for_audio_track(track); - if (!format.isValid()) - { - processInvalidMedia(QAudioDecoder::FormatError, tr("Unsupported source format")); - return; - } - // ### Change QAudioDecoder's format to resolved one? - m_format = format; - emit formatChanged(m_format); + format = qt_format_for_audio_track(track); + if (!format.isValid()) { + processInvalidMedia(QAudioDecoder::FormatError, tr("Unsupported source format")); + return; } // Set duration @@ -498,10 +473,7 @@ void AVFAudioDecoder::startReading() return; } - QAudioDecoder::State oldState = m_state; - m_state = QAudioDecoder::DecodingState; - if (oldState != m_state) - emit stateChanged(m_state); + setIsDecoding(true); // Since copyNextSampleBuffer is synchronous, submit it to an async dispatch queue // to run in a separate thread. Call the handleNextSampleBuffer "callback" on another @@ -515,11 +487,8 @@ void AVFAudioDecoder::startReading() CFRelease(sampleBuffer); }); } - if (m_reader.status == AVAssetReaderStatusCompleted) { - m_state = QAudioDecoder::StoppedState; + if (m_reader.status == AVAssetReaderStatusCompleted) emit finished(); - emit stateChanged(m_state); - } }); } diff --git a/src/multimedia/platform/darwin/audio/avfaudiodecoder_p.h b/src/multimedia/platform/darwin/audio/avfaudiodecoder_p.h index 9f302cc39..5348b06fd 100644 --- a/src/multimedia/platform/darwin/audio/avfaudiodecoder_p.h +++ b/src/multimedia/platform/darwin/audio/avfaudiodecoder_p.h @@ -75,9 +75,6 @@ public: AVFAudioDecoder(QAudioDecoder *parent); virtual ~AVFAudioDecoder(); - // QAudioDecoder interface - QAudioDecoder::State state() const override { return m_state; } - QUrl source() const override; void setSource(const QUrl &fileName) override; @@ -87,9 +84,6 @@ public: void start() override; void stop() override; - QAudioFormat audioFormat() const override; - void setAudioFormat(const QAudioFormat &format) override; - QAudioBuffer read() override; bool bufferAvailable() const override; @@ -108,12 +102,8 @@ private: void processInvalidMedia(QAudioDecoder::Error errorCode, const QString& errorString); void initAssetReader(); - QAudioDecoder::State m_state = QAudioDecoder::StoppedState; - QAudioDecoder::State m_pendingState = QAudioDecoder::StoppedState; - QUrl m_source; QIODevice *m_device = nullptr; - QAudioFormat m_format; int m_buffersAvailable = 0; QList<QAudioBuffer> m_cachedBuffers; diff --git a/src/multimedia/platform/darwin/camera/avfcamera.mm b/src/multimedia/platform/darwin/camera/avfcamera.mm index b52ee7743..527f5e615 100644 --- a/src/multimedia/platform/darwin/camera/avfcamera.mm +++ b/src/multimedia/platform/darwin/camera/avfcamera.mm @@ -158,7 +158,6 @@ bool qt_convert_exposure_mode(AVCaptureDevice *captureDevice, QCamera::ExposureM AVFCamera::AVFCamera(QCamera *camera) : QPlatformCamera(camera) , m_active(false) - , m_lastStatus(QCamera::InactiveStatus) { Q_ASSERT(camera); } @@ -183,23 +182,9 @@ void AVFCamera::setActive(bool active) if (m_session) m_session->setActive(active); - Q_EMIT activeChanged(m_active); - updateStatus(); if (active) updateCameraConfiguration(); -} - -QCamera::Status AVFCamera::status() const -{ - static const QCamera::Status statusTable[2][2] = { - { QCamera::InactiveStatus, QCamera::StoppingStatus }, //Inactive state - { QCamera::StartingStatus, QCamera::ActiveStatus } //ActiveState - }; - - if (!m_session) - return QCamera::InactiveStatus; - - return statusTable[m_active ? 1 : 0][m_session->isActive() ? 1 : 0]; + Q_EMIT activeChanged(m_active); } void AVFCamera::setCamera(const QCameraDevice &camera) @@ -224,25 +209,11 @@ void AVFCamera::setCaptureSession(QPlatformMediaCaptureSession *session) } m_session = m_service->session(); - Q_ASSERT(m_session); - connect(m_session, SIGNAL(activeChanged(bool)), SLOT(updateStatus())); - m_session->setActiveCamera(QCameraDevice()); m_session->setActive(m_active); m_session->setActiveCamera(m_cameraDevice); } -void AVFCamera::updateStatus() -{ - QCamera::Status newStatus = status(); - - if (m_lastStatus != newStatus) { - qDebugCamera() << "Camera status changed: " << m_lastStatus << " -> " << newStatus; - m_lastStatus = newStatus; - Q_EMIT statusChanged(m_lastStatus); - } -} - AVCaptureConnection *AVFCamera::videoConnection() const { if (!m_session || !m_session->videoOutput() || !m_session->videoOutput()->videoDataOutput()) diff --git a/src/multimedia/platform/darwin/camera/avfcamera_p.h b/src/multimedia/platform/darwin/camera/avfcamera_p.h index 296ef0350..64959bad8 100644 --- a/src/multimedia/platform/darwin/camera/avfcamera_p.h +++ b/src/multimedia/platform/darwin/camera/avfcamera_p.h @@ -75,8 +75,6 @@ public: bool isActive() const override; void setActive(bool activce) override; - QCamera::Status status() const override; - void setCamera(const QCameraDevice &camera) override; void setCaptureSession(QPlatformMediaCaptureSession *) override; @@ -115,9 +113,6 @@ public: AVCaptureConnection *videoConnection() const; AVCaptureDevice *device() const; -private Q_SLOTS: - void updateStatus(); - private: void updateCameraConfiguration(); void updateCameraProperties(); @@ -130,7 +125,6 @@ private: QCameraDevice m_cameraDevice; bool m_active; - QCamera::Status m_lastStatus; bool isFlashSupported = false; bool isFlashAutoSupported = false; diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice.mm b/src/multimedia/platform/darwin/camera/avfcameraservice.mm index 8ee350d02..b669eacc1 100644 --- a/src/multimedia/platform/darwin/camera/avfcameraservice.mm +++ b/src/multimedia/platform/darwin/camera/avfcameraservice.mm @@ -43,9 +43,9 @@ #include "avfcameraservice_p.h" #include "avfcamera_p.h" #include "avfcamerasession_p.h" -#include "avfcameraimagecapture_p.h" +#include "avfimagecapture_p.h" #include "avfcamerarenderer_p.h" -#include "avfcameraimagecapture_p.h" +#include "avfimagecapture_p.h" #include "avfmediaencoder_p.h" #include <qmediadevices.h> #include <private/qplatformaudioinput_p.h> @@ -84,14 +84,14 @@ void AVFCameraService::setCamera(QPlatformCamera *camera) emit cameraChanged(); } -QPlatformCameraImageCapture *AVFCameraService::imageCapture() +QPlatformImageCapture *AVFCameraService::imageCapture() { return m_imageCaptureControl; } -void AVFCameraService::setImageCapture(QPlatformCameraImageCapture *imageCapture) +void AVFCameraService::setImageCapture(QPlatformImageCapture *imageCapture) { - AVFCameraImageCapture *control = static_cast<AVFCameraImageCapture *>(imageCapture); + AVFImageCapture *control = static_cast<AVFImageCapture *>(imageCapture); if (m_imageCaptureControl == control) return; diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice_p.h b/src/multimedia/platform/darwin/camera/avfcameraservice_p.h index d2c75096e..5e641cb6a 100644 --- a/src/multimedia/platform/darwin/camera/avfcameraservice_p.h +++ b/src/multimedia/platform/darwin/camera/avfcameraservice_p.h @@ -61,7 +61,7 @@ QT_BEGIN_NAMESPACE class QPlatformCamera; class QPlatformMediaEncoder; class AVFCamera; -class AVFCameraImageCapture; +class AVFImageCapture; class AVFCameraSession; class AVFMediaEncoder; @@ -75,8 +75,8 @@ public: QPlatformCamera *camera() override; void setCamera(QPlatformCamera *camera) override; - QPlatformCameraImageCapture *imageCapture() override; - void setImageCapture(QPlatformCameraImageCapture *imageCapture) override; + QPlatformImageCapture *imageCapture() override; + void setImageCapture(QPlatformImageCapture *imageCapture) override; QPlatformMediaEncoder *mediaEncoder() override; void setMediaEncoder(QPlatformMediaEncoder *encoder) override; @@ -88,7 +88,7 @@ public: AVFCameraSession *session() const { return m_session; } AVFCamera *avfCameraControl() const { return m_cameraControl; } AVFMediaEncoder *recorderControl() const { return m_encoder; } - AVFCameraImageCapture *avfImageCaptureControl() const { return m_imageCaptureControl; } + AVFImageCapture *avfImageCaptureControl() const { return m_imageCaptureControl; } AVCaptureDevice *audioCaptureDevice() const { return m_audioCaptureDevice; } public Q_SLOTS: @@ -101,7 +101,7 @@ private: AVFCameraSession *m_session = nullptr; AVFCamera *m_cameraControl = nullptr; AVFMediaEncoder *m_encoder = nullptr; - AVFCameraImageCapture *m_imageCaptureControl = nullptr; + AVFImageCapture *m_imageCaptureControl = nullptr; }; QT_END_NAMESPACE diff --git a/src/multimedia/platform/darwin/camera/avfcamerasession.mm b/src/multimedia/platform/darwin/camera/avfcamerasession.mm index 7febe567f..7f2ca7b5b 100644 --- a/src/multimedia/platform/darwin/camera/avfcamerasession.mm +++ b/src/multimedia/platform/darwin/camera/avfcamerasession.mm @@ -42,7 +42,7 @@ #include "avfcameraservice_p.h" #include "avfcamera_p.h" #include "avfcamerarenderer_p.h" -#include "avfcameraimagecapture_p.h" +#include "avfimagecapture_p.h" #include "avfmediaencoder_p.h" #include "avfcamerautility_p.h" #include <private/avfvideosink_p.h> @@ -384,7 +384,7 @@ void AVFCameraSession::attachAudioInputDevice() bool AVFCameraSession::applyImageEncoderSettings() { - if (AVFCameraImageCapture *control = m_service->avfImageCaptureControl()) + if (AVFImageCapture *control = m_service->avfImageCaptureControl()) return control->applySettings(); return false; diff --git a/src/multimedia/platform/darwin/camera/avfcameraimagecapture.mm b/src/multimedia/platform/darwin/camera/avfimagecapture.mm index 7536d88d3..5bfe8e105 100644 --- a/src/multimedia/platform/darwin/camera/avfcameraimagecapture.mm +++ b/src/multimedia/platform/darwin/camera/avfimagecapture.mm @@ -38,7 +38,7 @@ ****************************************************************************/ #include "avfcameradebug_p.h" -#include "avfcameraimagecapture_p.h" +#include "avfimagecapture_p.h" #include "avfcameraservice_p.h" #include "avfcamerautility_p.h" #include "avfcamera_p.h" @@ -56,8 +56,8 @@ QT_USE_NAMESPACE -AVFCameraImageCapture::AVFCameraImageCapture(QCameraImageCapture *parent) - : QPlatformCameraImageCapture(parent) +AVFImageCapture::AVFImageCapture(QImageCapture *parent) + : QPlatformImageCapture(parent) , m_ready(false) , m_lastCaptureId(0) , m_videoConnection(nil) @@ -71,16 +71,16 @@ AVFCameraImageCapture::AVFCameraImageCapture(QCameraImageCapture *parent) [outputSettings release]; } -AVFCameraImageCapture::~AVFCameraImageCapture() +AVFImageCapture::~AVFImageCapture() { } -bool AVFCameraImageCapture::isReadyForCapture() const +bool AVFImageCapture::isReadyForCapture() const { - return m_cameraControl && m_videoConnection && m_cameraControl->status() == QCamera::ActiveStatus; + return m_cameraControl && m_videoConnection && m_cameraControl->isActive(); } -void AVFCameraImageCapture::updateReadyStatus() +void AVFImageCapture::updateReadyStatus() { if (m_ready != isReadyForCapture()) { m_ready = !m_ready; @@ -89,19 +89,19 @@ void AVFCameraImageCapture::updateReadyStatus() } } -int AVFCameraImageCapture::doCapture(const QString &actualFileName) +int AVFImageCapture::doCapture(const QString &actualFileName) { if (!m_session) { QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(int, m_lastCaptureId), - Q_ARG(int, QCameraImageCapture::ResourceError), + Q_ARG(int, QImageCapture::ResourceError), Q_ARG(QString, tr("Image capture not set to capture session"))); return m_lastCaptureId; } if (!isReadyForCapture()) { QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(int, m_lastCaptureId), - Q_ARG(int, QCameraImageCapture::NotReadyError), + Q_ARG(int, QImageCapture::NotReadyError), Q_ARG(QString, tr("Camera not ready"))); return m_lastCaptureId; } @@ -130,7 +130,7 @@ int AVFCameraImageCapture::doCapture(const QString &actualFileName) QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(int, request.captureId), - Q_ARG(int, QCameraImageCapture::ResourceError), + Q_ARG(int, QImageCapture::ResourceError), Q_ARG(QString, errorMessage)); return; } @@ -169,14 +169,14 @@ int AVFCameraImageCapture::doCapture(const QString &actualFileName) } else { QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(int, request.captureId), - Q_ARG(int, QCameraImageCapture::OutOfSpaceError), + Q_ARG(int, QImageCapture::OutOfSpaceError), Q_ARG(QString, f.errorString())); } } else { QString errorMessage = tr("Could not open destination file:\n%1").arg(fileName); QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(int, request.captureId), - Q_ARG(int, QCameraImageCapture::ResourceError), + Q_ARG(int, QImageCapture::ResourceError), Q_ARG(QString, errorMessage)); } } @@ -186,7 +186,7 @@ int AVFCameraImageCapture::doCapture(const QString &actualFileName) qDebugCamera() << errorMessage; QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(int, request.captureId), - Q_ARG(int, QCameraImageCapture::ResourceError), + Q_ARG(int, QImageCapture::ResourceError), Q_ARG(QString, errorMessage)); } }]; @@ -194,7 +194,7 @@ int AVFCameraImageCapture::doCapture(const QString &actualFileName) return request.captureId; } -int AVFCameraImageCapture::capture(const QString &fileName) +int AVFImageCapture::capture(const QString &fileName) { QString actualFileName; actualFileName = m_storageLocation.generateFileName(fileName, @@ -206,12 +206,12 @@ int AVFCameraImageCapture::capture(const QString &fileName) return doCapture(actualFileName); } -int AVFCameraImageCapture::captureToBuffer() +int AVFImageCapture::captureToBuffer() { return doCapture(QString()); } -void AVFCameraImageCapture::onNewViewfinderFrame(const QVideoFrame &frame) +void AVFImageCapture::onNewViewfinderFrame(const QVideoFrame &frame) { QMutexLocker locker(&m_requestsMutex); @@ -221,24 +221,24 @@ void AVFCameraImageCapture::onNewViewfinderFrame(const QVideoFrame &frame) CaptureRequest request = m_captureRequests.dequeue(); Q_EMIT imageExposed(request.captureId); - (void) QtConcurrent::run(&AVFCameraImageCapture::makeCapturePreview, this, + (void) QtConcurrent::run(&AVFImageCapture::makeCapturePreview, this, request, frame, 0 /* rotation */); } -void AVFCameraImageCapture::onCameraChanged() +void AVFImageCapture::onCameraChanged() { Q_ASSERT(m_service && m_session); if (m_service->camera()) connect(m_service->camera(), SIGNAL(activeChanged(bool)), this, SLOT(updateReadyStatus())); if (m_session->videoOutput()) connect(m_session->videoOutput(), &AVFCameraRenderer::newViewfinderFrame, - this, &AVFCameraImageCapture::onNewViewfinderFrame, + this, &AVFImageCapture::onNewViewfinderFrame, Qt::DirectConnection); } -void AVFCameraImageCapture::makeCapturePreview(CaptureRequest request, +void AVFImageCapture::makeCapturePreview(CaptureRequest request, const QVideoFrame &frame, int rotation) { @@ -250,7 +250,7 @@ void AVFCameraImageCapture::makeCapturePreview(CaptureRequest request, request.previewReady->release(); } -void AVFCameraImageCapture::updateCaptureConnection() +void AVFImageCapture::updateCaptureConnection() { if (m_session && m_session->videoCaptureDevice()) { qDebugCamera() << Q_FUNC_INFO; @@ -271,7 +271,7 @@ void AVFCameraImageCapture::updateCaptureConnection() } -QImageEncoderSettings AVFCameraImageCapture::imageSettings() const +QImageEncoderSettings AVFImageCapture::imageSettings() const { QImageEncoderSettings settings; @@ -301,12 +301,12 @@ QImageEncoderSettings AVFCameraImageCapture::imageSettings() const } settings.setResolution(res); - settings.setFormat(QCameraImageCapture::JPEG); + settings.setFormat(QImageCapture::JPEG); return settings; } -void AVFCameraImageCapture::setImageSettings(const QImageEncoderSettings &settings) +void AVFImageCapture::setImageSettings(const QImageEncoderSettings &settings) { if (m_settings == settings) return; @@ -315,7 +315,7 @@ void AVFCameraImageCapture::setImageSettings(const QImageEncoderSettings &settin applySettings(); } -bool AVFCameraImageCapture::applySettings() +bool AVFImageCapture::applySettings() { if (!videoCaptureDeviceIsValid()) return false; @@ -330,7 +330,7 @@ bool AVFCameraImageCapture::applySettings() return false; } - if (m_settings.format() != QCameraImageCapture::UnspecifiedFormat && m_settings.format() != QCameraImageCapture::JPEG) { + if (m_settings.format() != QImageCapture::UnspecifiedFormat && m_settings.format() != QImageCapture::JPEG) { qDebugCamera() << Q_FUNC_INFO << "unsupported format:" << m_settings.format(); return false; } @@ -373,7 +373,7 @@ bool AVFCameraImageCapture::applySettings() return activeFormatChanged; } -void AVFCameraImageCapture::setCaptureSession(QPlatformMediaCaptureSession *session) +void AVFImageCapture::setCaptureSession(QPlatformMediaCaptureSession *session) { AVFCameraService *captureSession = static_cast<AVFCameraService *>(session); if (m_service == captureSession) @@ -396,7 +396,7 @@ void AVFCameraImageCapture::setCaptureSession(QPlatformMediaCaptureSession *sess Q_ASSERT(m_session); m_cameraControl = static_cast<AVFCamera *>(m_service->camera()); - connect(m_service, &AVFCameraService::cameraChanged, this, &AVFCameraImageCapture::onCameraChanged); + connect(m_service, &AVFCameraService::cameraChanged, this, &AVFImageCapture::onCameraChanged); connect(m_session, SIGNAL(readyToConfigureConnections()), SLOT(updateCaptureConnection())); updateCaptureConnection(); @@ -404,7 +404,7 @@ void AVFCameraImageCapture::setCaptureSession(QPlatformMediaCaptureSession *sess onCameraChanged(); } -bool AVFCameraImageCapture::videoCaptureDeviceIsValid() const +bool AVFImageCapture::videoCaptureDeviceIsValid() const { if (!m_service || !m_service->session() || !m_service->session()->videoCaptureDevice()) return false; @@ -416,4 +416,4 @@ bool AVFCameraImageCapture::videoCaptureDeviceIsValid() const return true; } -#include "moc_avfcameraimagecapture_p.cpp" +#include "moc_avfimagecapture_p.cpp" diff --git a/src/multimedia/platform/darwin/camera/avfcameraimagecapture_p.h b/src/multimedia/platform/darwin/camera/avfimagecapture_p.h index f970828e0..2d1d1b1e7 100644 --- a/src/multimedia/platform/darwin/camera/avfcameraimagecapture_p.h +++ b/src/multimedia/platform/darwin/camera/avfimagecapture_p.h @@ -56,13 +56,13 @@ #include <QtCore/qqueue.h> #include <QtCore/qsemaphore.h> #include <QtCore/qsharedpointer.h> -#include <private/qplatformcameraimagecapture_p.h> +#include <private/qplatformimagecapture_p.h> #include "avfcamerasession_p.h" #include "avfstoragelocation_p.h" QT_BEGIN_NAMESPACE -class AVFCameraImageCapture : public QPlatformCameraImageCapture +class AVFImageCapture : public QPlatformImageCapture { Q_OBJECT public: @@ -71,8 +71,8 @@ public: QSharedPointer<QSemaphore> previewReady; }; - AVFCameraImageCapture(QCameraImageCapture *parent = nullptr); - ~AVFCameraImageCapture(); + AVFImageCapture(QImageCapture *parent = nullptr); + ~AVFImageCapture(); bool isReadyForCapture() const override; @@ -112,7 +112,7 @@ private: QImageEncoderSettings m_settings; }; -Q_DECLARE_TYPEINFO(AVFCameraImageCapture::CaptureRequest, Q_PRIMITIVE_TYPE); +Q_DECLARE_TYPEINFO(AVFImageCapture::CaptureRequest, Q_PRIMITIVE_TYPE); QT_END_NAMESPACE diff --git a/src/multimedia/platform/darwin/camera/avfmediaencoder.mm b/src/multimedia/platform/darwin/camera/avfmediaencoder.mm index 6f881f986..96fa82503 100644 --- a/src/multimedia/platform/darwin/camera/avfmediaencoder.mm +++ b/src/multimedia/platform/darwin/camera/avfmediaencoder.mm @@ -111,14 +111,8 @@ AVFMediaEncoder::~AVFMediaEncoder() [m_videoSettings release]; } -QUrl AVFMediaEncoder::outputLocation() const +bool AVFMediaEncoder::isLocationWritable(const QUrl &location) const { - return m_outputLocation; -} - -bool AVFMediaEncoder::setOutputLocation(const QUrl &location) -{ - m_outputLocation = location; return location.scheme() == QLatin1String("file") || location.scheme().isEmpty(); } @@ -474,7 +468,7 @@ void AVFMediaEncoder::record() if (!audioOnly) { AVFCamera *cameraControl = m_service->avfCameraControl(); - if (!cameraControl || cameraControl->status() != QCamera::ActiveStatus) { + if (!cameraControl || !cameraControl->isActive()) { qDebugCamera() << Q_FUNC_INFO << "can not start record while camera is not active"; Q_EMIT error(QMediaRecorder::ResourceError, tr("Failed to start recording")); return; @@ -493,8 +487,8 @@ void AVFMediaEncoder::record() // rotation = (screenOrientation + (360 - cameraDevice.orientation())) % 360; } - const QString path(m_outputLocation.scheme() == QLatin1String("file") ? - m_outputLocation.path() : m_outputLocation.toString()); + const QString path(outputLocation().scheme() == QLatin1String("file") ? + outputLocation().path() : outputLocation().toString()); const QUrl fileURL(QUrl::fromLocalFile(m_storageLocation.generateFileName(path, audioOnly ? AVFStorageLocation::Audio : AVFStorageLocation::Video, QLatin1String("clip_"), diff --git a/src/multimedia/platform/darwin/camera/avfmediaencoder_p.h b/src/multimedia/platform/darwin/camera/avfmediaencoder_p.h index bd9588e27..d76df772f 100644 --- a/src/multimedia/platform/darwin/camera/avfmediaencoder_p.h +++ b/src/multimedia/platform/darwin/camera/avfmediaencoder_p.h @@ -77,8 +77,7 @@ public: AVFMediaEncoder(QMediaRecorder *parent); ~AVFMediaEncoder() override; - QUrl outputLocation() const override; - bool setOutputLocation(const QUrl &location) override; + bool isLocationWritable(const QUrl &location) const override; QMediaRecorder::RecorderState state() const override; QMediaRecorder::Status status() const override; @@ -114,7 +113,6 @@ private: AVFCameraService *m_service = nullptr; AVFScopedPointer<QT_MANGLE_NAMESPACE(AVFMediaAssetWriter)> m_writer; - QUrl m_outputLocation; AVFStorageLocation m_storageLocation; QMediaRecorder::RecorderState m_state; diff --git a/src/multimedia/platform/darwin/qdarwinformatsinfo.mm b/src/multimedia/platform/darwin/qdarwinformatsinfo.mm index 59c563537..afa1adf4a 100644 --- a/src/multimedia/platform/darwin/qdarwinformatsinfo.mm +++ b/src/multimedia/platform/darwin/qdarwinformatsinfo.mm @@ -166,7 +166,7 @@ QDarwinFormatInfo::QDarwinFormatInfo() // #endif // ### - imageFormats << QCameraImageCapture::JPEG; + imageFormats << QImageCapture::JPEG; } QDarwinFormatInfo::~QDarwinFormatInfo() diff --git a/src/multimedia/platform/darwin/qdarwinintegration.mm b/src/multimedia/platform/darwin/qdarwinintegration.mm index 753dabff4..372ce9e81 100644 --- a/src/multimedia/platform/darwin/qdarwinintegration.mm +++ b/src/multimedia/platform/darwin/qdarwinintegration.mm @@ -42,7 +42,7 @@ #include <private/avfmediaplayer_p.h> #include <private/avfcameraservice_p.h> #include <private/avfcamera_p.h> -#include <private/avfcameraimagecapture_p.h> +#include <private/avfimagecapture_p.h> #include <private/avfmediaencoder_p.h> #include <private/qdarwinformatsinfo_p.h> #include <private/avfvideosink_p.h> @@ -100,9 +100,9 @@ QPlatformMediaEncoder *QDarwinIntegration::createEncoder(QMediaRecorder *encoder return new AVFMediaEncoder(encoder); } -QPlatformCameraImageCapture *QDarwinIntegration::createImageCapture(QCameraImageCapture *imageCapture) +QPlatformImageCapture *QDarwinIntegration::createImageCapture(QImageCapture *imageCapture) { - return new AVFCameraImageCapture(imageCapture); + return new AVFImageCapture(imageCapture); } QPlatformVideoSink *QDarwinIntegration::createVideoSink(QVideoSink *sink) diff --git a/src/multimedia/platform/darwin/qdarwinintegration_p.h b/src/multimedia/platform/darwin/qdarwinintegration_p.h index 52832585e..946300761 100644 --- a/src/multimedia/platform/darwin/qdarwinintegration_p.h +++ b/src/multimedia/platform/darwin/qdarwinintegration_p.h @@ -71,7 +71,7 @@ public: QPlatformMediaPlayer *createPlayer(QMediaPlayer *player) override; QPlatformCamera *createCamera(QCamera *camera) override; QPlatformMediaEncoder *createEncoder(QMediaRecorder *) override; - QPlatformCameraImageCapture *createImageCapture(QCameraImageCapture *) override; + QPlatformImageCapture *createImageCapture(QImageCapture *) override; QPlatformVideoSink *createVideoSink(QVideoSink *) override; diff --git a/src/multimedia/platform/gstreamer/audio/qgstreameraudiodecoder.cpp b/src/multimedia/platform/gstreamer/audio/qgstreameraudiodecoder.cpp index 817e168bf..db23ac80f 100644 --- a/src/multimedia/platform/gstreamer/audio/qgstreameraudiodecoder.cpp +++ b/src/multimedia/platform/gstreamer/audio/qgstreameraudiodecoder.cpp @@ -163,21 +163,17 @@ bool QGstreamerAudioDecoder::processBusMessage(const QGstreamerMessage &message) .arg(states[pending]) << "internal" << m_state; #endif - QAudioDecoder::State prevState = m_state; - + bool isDecoding = false; switch (newState) { case GST_STATE_VOID_PENDING: case GST_STATE_NULL: - m_state = QAudioDecoder::StoppedState; - break; case GST_STATE_READY: - m_state = QAudioDecoder::StoppedState; break; case GST_STATE_PLAYING: - m_state = QAudioDecoder::DecodingState; + isDecoding = true; break; case GST_STATE_PAUSED: - m_state = QAudioDecoder::DecodingState; + isDecoding = true; //gstreamer doesn't give a reliable indication the duration //information is ready, GST_MESSAGE_DURATION is not sent by most elements @@ -187,15 +183,12 @@ bool QGstreamerAudioDecoder::processBusMessage(const QGstreamerMessage &message) break; } - if (prevState != m_state) - emit stateChanged(m_state); + setIsDecoding(isDecoding); } break; case GST_MESSAGE_EOS: - m_pendingState = m_state = QAudioDecoder::StoppedState; - emit finished(); - emit stateChanged(m_state); + finished(); break; case GST_MESSAGE_ERROR: { @@ -338,24 +331,15 @@ void QGstreamerAudioDecoder::start() // Set audio format if (m_appSink) { - if (mFormat.isValid()) { - setAudioFlags(false); - QGstMutableCaps caps = QGstUtils::capsForAudioFormat(mFormat); - gst_app_sink_set_caps(m_appSink, caps.get()); - } else { - // We want whatever the native audio format is - setAudioFlags(true); - gst_app_sink_set_caps(m_appSink, nullptr); - } + // We want whatever the native audio format is + setAudioFlags(true); + gst_app_sink_set_caps(m_appSink, nullptr); } - m_pendingState = QAudioDecoder::DecodingState; if (m_playbin.setState(GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) { qWarning() << "GStreamer; Unable to start decoding process"; m_playbin.dumpGraph("failed"); - m_pendingState = m_state = QAudioDecoder::StoppedState; - - emit stateChanged(m_state); + return; } } @@ -367,9 +351,6 @@ void QGstreamerAudioDecoder::stop() m_playbin.setState(GST_STATE_NULL); removeAppSink(); - QAudioDecoder::State oldState = m_state; - m_pendingState = m_state = QAudioDecoder::StoppedState; - // GStreamer thread is stopped. Can safely access m_buffersAvailable if (m_buffersAvailable != 0) { m_buffersAvailable = 0; @@ -386,21 +367,7 @@ void QGstreamerAudioDecoder::stop() emit durationChanged(m_duration); } - if (oldState != m_state) - emit stateChanged(m_state); -} - -QAudioFormat QGstreamerAudioDecoder::audioFormat() const -{ - return mFormat; -} - -void QGstreamerAudioDecoder::setAudioFormat(const QAudioFormat &format) -{ - if (mFormat != format) { - mFormat = format; - emit formatChanged(mFormat); - } + setIsDecoding(false); } QAudioBuffer QGstreamerAudioDecoder::read() diff --git a/src/multimedia/platform/gstreamer/audio/qgstreameraudiodecoder_p.h b/src/multimedia/platform/gstreamer/audio/qgstreameraudiodecoder_p.h index be2343916..de9d59baf 100644 --- a/src/multimedia/platform/gstreamer/audio/qgstreameraudiodecoder_p.h +++ b/src/multimedia/platform/gstreamer/audio/qgstreameraudiodecoder_p.h @@ -81,9 +81,6 @@ public: QGstreamerAudioDecoder(QAudioDecoder *parent); virtual ~QGstreamerAudioDecoder(); - // QAudioDecoder interface - QAudioDecoder::State state() const override { return m_state; } - QUrl source() const override; void setSource(const QUrl &fileName) override; @@ -93,9 +90,6 @@ public: void start() override; void stop() override; - QAudioFormat audioFormat() const override; - void setAudioFormat(const QAudioFormat &format) override; - QAudioBuffer read() override; bool bufferAvailable() const override; @@ -105,8 +99,6 @@ public: // GStreamerBusMessageFilter interface bool processBusMessage(const QGstreamerMessage &message) override; - QAudioDecoder::State pendingState() const { return m_pendingState; } - #if QT_CONFIG(gstreamer_app) QGstAppSrc *appsrc() const { return m_appSrc; } static void configureAppSrcElement(GObject*, GObject*, GParamSpec*, QGstreamerAudioDecoder *_this); @@ -125,8 +117,6 @@ private: void processInvalidMedia(QAudioDecoder::Error errorCode, const QString& errorString); static qint64 getPositionFromBuffer(GstBuffer* buffer); - QAudioDecoder::State m_state = QAudioDecoder::StoppedState; - QAudioDecoder::State m_pendingState = QAudioDecoder::StoppedState; QGstPipeline m_playbin; QGstBin m_outputBin; QGstElement m_audioConvert; @@ -135,7 +125,6 @@ private: QUrl mSource; QIODevice *mDevice = nullptr; - QAudioFormat mFormat; mutable QMutex m_buffersMutex; int m_buffersAvailable = 0; diff --git a/src/multimedia/platform/gstreamer/common/qgstutils.cpp b/src/multimedia/platform/gstreamer/common/qgstutils.cpp index 7dd733f00..5d88f7e13 100644 --- a/src/multimedia/platform/gstreamer/common/qgstutils.cpp +++ b/src/multimedia/platform/gstreamer/common/qgstutils.cpp @@ -100,12 +100,16 @@ static QAudioFormat::SampleFormat gstSampleFormatToSampleFormat(const char *fmt) */ QAudioFormat QGstUtils::audioFormatForSample(GstSample *sample) { - GstCaps* caps = gst_sample_get_caps(sample); - if (!caps) + QGstCaps caps = gst_sample_get_caps(sample); + if (caps.isNull()) return QAudioFormat(); + return audioFormatForCaps(caps); +} +QAudioFormat QGstUtils::audioFormatForCaps(QGstCaps caps) +{ QAudioFormat format; - QGstStructure s = QGstCaps(caps).at(0); + QGstStructure s = caps.at(0); if (s.name() != "audio/x-raw") return format; diff --git a/src/multimedia/platform/gstreamer/common/qgstutils_p.h b/src/multimedia/platform/gstreamer/common/qgstutils_p.h index 651152950..0e6e76954 100644 --- a/src/multimedia/platform/gstreamer/common/qgstutils_p.h +++ b/src/multimedia/platform/gstreamer/common/qgstutils_p.h @@ -72,6 +72,7 @@ class QVideoFrameFormat; namespace QGstUtils { Q_MULTIMEDIA_EXPORT QAudioFormat audioFormatForSample(GstSample *sample); + QAudioFormat audioFormatForCaps(QGstCaps caps); Q_MULTIMEDIA_EXPORT QGstMutableCaps capsForAudioFormat(const QAudioFormat &format); Q_MULTIMEDIA_EXPORT QVideoFrameFormat formatForCaps( diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercamera.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercamera.cpp index c58ecaaf1..99a44b70e 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercamera.cpp +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercamera.cpp @@ -40,7 +40,7 @@ #include <qcameradevice.h> #include "qgstreamercamera_p.h" -#include "qgstreamercameraimagecapture_p.h" +#include "qgstreamerimagecapture_p.h" #include <private/qgstreamermediadevices_p.h> #include <private/qgstreamerintegration_p.h> #include <qmediacapturesession.h> @@ -90,7 +90,6 @@ void QGstreamerCamera::setActive(bool active) m_active = active; - statusChanged(m_active ? QCamera::ActiveStatus : QCamera::InactiveStatus); emit activeChanged(active); } diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameraimagecapture.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimagecapture.cpp index e19a9c28e..f0f2f16e9 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameraimagecapture.cpp +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimagecapture.cpp @@ -37,7 +37,7 @@ ** ****************************************************************************/ -#include "qgstreamercameraimagecapture_p.h" +#include "qgstreamerimagecapture_p.h" #include "qplatformcamera_p.h" #include <private/qgstvideobuffer_p.h> #include <private/qgstutils_p.h> @@ -54,8 +54,8 @@ QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(qLcImageCapture, "qt.multimedia.imageCapture") -QGstreamerCameraImageCapture::QGstreamerCameraImageCapture(QCameraImageCapture *parent) - : QPlatformCameraImageCapture(parent), +QGstreamerImageCapture::QGstreamerImageCapture(QImageCapture *parent) + : QPlatformImageCapture(parent), QGstreamerBufferProbe(ProbeBuffers) { bin = QGstBin("imageCaptureBin"); @@ -80,16 +80,16 @@ QGstreamerCameraImageCapture::QGstreamerCameraImageCapture(QCameraImageCapture * addProbeToPad(queue.staticPad("src").pad(), false); sink.set("signal-handoffs", true); - g_signal_connect(sink.object(), "handoff", G_CALLBACK(&QGstreamerCameraImageCapture::saveImageFilter), this); + g_signal_connect(sink.object(), "handoff", G_CALLBACK(&QGstreamerImageCapture::saveImageFilter), this); } -QGstreamerCameraImageCapture::~QGstreamerCameraImageCapture() +QGstreamerImageCapture::~QGstreamerImageCapture() { if (m_session) m_session->releaseVideoPad(videoSrcPad); } -bool QGstreamerCameraImageCapture::isReadyForCapture() const +bool QGstreamerImageCapture::isReadyForCapture() const { return m_session && !passImage && cameraActive; } @@ -134,7 +134,7 @@ QString generateFileName(const QDir &dir, const QString &ext) } -int QGstreamerCameraImageCapture::capture(const QString &fileName) +int QGstreamerImageCapture::capture(const QString &fileName) { QString path = fileName; if (path.isEmpty()) @@ -143,12 +143,12 @@ int QGstreamerCameraImageCapture::capture(const QString &fileName) return doCapture(path); } -int QGstreamerCameraImageCapture::captureToBuffer() +int QGstreamerImageCapture::captureToBuffer() { return doCapture(QString()); } -int QGstreamerCameraImageCapture::doCapture(const QString &fileName) +int QGstreamerImageCapture::doCapture(const QString &fileName) { qCDebug(qLcImageCapture) << "do capture"; if (!m_session) { @@ -156,7 +156,7 @@ int QGstreamerCameraImageCapture::doCapture(const QString &fileName) //so application can associate it with returned request id. QMetaObject::invokeMethod(this, "errorOccurred", Qt::QueuedConnection, Q_ARG(int, -1), - Q_ARG(int, QCameraImageCapture::ResourceError), + Q_ARG(int, QImageCapture::ResourceError), Q_ARG(QString,tr("Image capture not set to a session."))); qCDebug(qLcImageCapture) << "error 1"; @@ -167,7 +167,7 @@ int QGstreamerCameraImageCapture::doCapture(const QString &fileName) //so application can associate it with returned request id. QMetaObject::invokeMethod(this, "errorOccurred", Qt::QueuedConnection, Q_ARG(int, -1), - Q_ARG(int, QCameraImageCapture::ResourceError), + Q_ARG(int, QImageCapture::ResourceError), Q_ARG(QString,tr("No camera available."))); qCDebug(qLcImageCapture) << "error 2"; @@ -178,7 +178,7 @@ int QGstreamerCameraImageCapture::doCapture(const QString &fileName) //so application can associate it with returned request id. QMetaObject::invokeMethod(this, "errorOccurred", Qt::QueuedConnection, Q_ARG(int, -1), - Q_ARG(int, QCameraImageCapture::NotReadyError), + Q_ARG(int, QImageCapture::NotReadyError), Q_ARG(QString,tr("Camera is not ready."))); qCDebug(qLcImageCapture) << "error 3"; @@ -198,7 +198,7 @@ int QGstreamerCameraImageCapture::doCapture(const QString &fileName) return m_lastId; } -bool QGstreamerCameraImageCapture::probeBuffer(GstBuffer *buffer) +bool QGstreamerImageCapture::probeBuffer(GstBuffer *buffer) { if (!passImage) return false; @@ -244,7 +244,7 @@ bool QGstreamerCameraImageCapture::probeBuffer(GstBuffer *buffer) return true; } -void QGstreamerCameraImageCapture::setCaptureSession(QPlatformMediaCaptureSession *session) +void QGstreamerImageCapture::setCaptureSession(QPlatformMediaCaptureSession *session) { QGstreamerMediaCapture *captureSession = static_cast<QGstreamerMediaCapture *>(session); if (m_session == captureSession) @@ -268,11 +268,11 @@ void QGstreamerCameraImageCapture::setCaptureSession(QPlatformMediaCaptureSessio gstPipeline = captureSession->pipeline(); gstPipeline.add(bin); bin.setStateSync(GST_STATE_READY); - connect(m_session, &QPlatformMediaCaptureSession::cameraChanged, this, &QGstreamerCameraImageCapture::onCameraChanged); + connect(m_session, &QPlatformMediaCaptureSession::cameraChanged, this, &QGstreamerImageCapture::onCameraChanged); onCameraChanged(); } -void QGstreamerCameraImageCapture::cameraActiveChanged(bool active) +void QGstreamerImageCapture::cameraActiveChanged(bool active) { qCDebug(qLcImageCapture) << "cameraActiveChanged" << cameraActive << active; if (cameraActive == active) @@ -282,23 +282,23 @@ void QGstreamerCameraImageCapture::cameraActiveChanged(bool active) emit readyForCaptureChanged(isReadyForCapture()); } -void QGstreamerCameraImageCapture::onCameraChanged() +void QGstreamerImageCapture::onCameraChanged() { if (m_session->camera()) { cameraActiveChanged(m_session->camera()->isActive()); - connect(m_session->camera(), &QPlatformCamera::activeChanged, this, &QGstreamerCameraImageCapture::cameraActiveChanged); + connect(m_session->camera(), &QPlatformCamera::activeChanged, this, &QGstreamerImageCapture::cameraActiveChanged); } } -gboolean QGstreamerCameraImageCapture::saveImageFilter(GstElement *element, +gboolean QGstreamerImageCapture::saveImageFilter(GstElement *element, GstBuffer *buffer, GstPad *pad, void *appdata) { Q_UNUSED(element); Q_UNUSED(pad); - QGstreamerCameraImageCapture *capture = static_cast<QGstreamerCameraImageCapture *>(appdata); + QGstreamerImageCapture *capture = static_cast<QGstreamerImageCapture *>(appdata); if (capture->pendingImages.isEmpty()) { capture->unlink(); @@ -322,7 +322,7 @@ gboolean QGstreamerCameraImageCapture::saveImageFilter(GstElement *element, } f.close(); - static QMetaMethod savedSignal = QMetaMethod::fromSignal(&QGstreamerCameraImageCapture::imageSaved); + static QMetaMethod savedSignal = QMetaMethod::fromSignal(&QGstreamerImageCapture::imageSaved); savedSignal.invoke(capture, Qt::QueuedConnection, Q_ARG(int, imageData.id), @@ -334,7 +334,7 @@ gboolean QGstreamerCameraImageCapture::saveImageFilter(GstElement *element, return TRUE; } -void QGstreamerCameraImageCapture::unlink() +void QGstreamerImageCapture::unlink() { return; if (passImage) @@ -350,7 +350,7 @@ void QGstreamerCameraImageCapture::unlink() gstPipeline.setStateSync(GST_STATE_PLAYING); } -void QGstreamerCameraImageCapture::link() +void QGstreamerImageCapture::link() { if (!(m_session && m_session->camera())) return; @@ -364,12 +364,12 @@ void QGstreamerCameraImageCapture::link() gstPipeline.setStateSync(GST_STATE_PLAYING); } -QImageEncoderSettings QGstreamerCameraImageCapture::imageSettings() const +QImageEncoderSettings QGstreamerImageCapture::imageSettings() const { return m_settings; } -void QGstreamerCameraImageCapture::setImageSettings(const QImageEncoderSettings &settings) +void QGstreamerImageCapture::setImageSettings(const QImageEncoderSettings &settings) { if (m_settings != settings) { m_settings = settings; diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameraimagecapture_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimagecapture_p.h index 38b0d33b4..50d1d9a7b 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameraimagecapture_p.h +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimagecapture_p.h @@ -52,7 +52,7 @@ // We mean it. // -#include <private/qplatformcameraimagecapture_p.h> +#include <private/qplatformimagecapture_p.h> #include "qgstreamermediacapture_p.h" #include "private/qgstreamerbufferprobe_p.h" @@ -63,13 +63,13 @@ QT_BEGIN_NAMESPACE -class QGstreamerCameraImageCapture : public QPlatformCameraImageCapture, private QGstreamerBufferProbe +class QGstreamerImageCapture : public QPlatformImageCapture, private QGstreamerBufferProbe { Q_OBJECT public: - QGstreamerCameraImageCapture(QCameraImageCapture *parent/*, const QGstPipeline &pipeline*/); - virtual ~QGstreamerCameraImageCapture(); + QGstreamerImageCapture(QImageCapture *parent/*, const QGstPipeline &pipeline*/); + virtual ~QGstreamerImageCapture(); bool isReadyForCapture() const override; int capture(const QString &fileName) override; diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp index d6ee3fdb4..237b2a505 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp @@ -39,11 +39,10 @@ #include "qgstreamermediacapture_p.h" #include "qgstreamermediaencoder_p.h" -#include "qgstreamercameraimagecapture_p.h" +#include "qgstreamerimagecapture_p.h" #include "qgstreamercamera_p.h" #include <private/qgstpipeline_p.h> -#include "qgstreamercameraimagecapture_p.h" #include "private/qgstreameraudioinput_p.h" #include "private/qgstreameraudiooutput_p.h" #include "private/qgstreamervideooutput_p.h" @@ -118,14 +117,14 @@ void QGstreamerMediaCapture::setCamera(QPlatformCamera *camera) gstPipeline.dumpGraph("camera"); } -QPlatformCameraImageCapture *QGstreamerMediaCapture::imageCapture() +QPlatformImageCapture *QGstreamerMediaCapture::imageCapture() { return m_imageCapture; } -void QGstreamerMediaCapture::setImageCapture(QPlatformCameraImageCapture *imageCapture) +void QGstreamerMediaCapture::setImageCapture(QPlatformImageCapture *imageCapture) { - QGstreamerCameraImageCapture *control = static_cast<QGstreamerCameraImageCapture *>(imageCapture); + QGstreamerImageCapture *control = static_cast<QGstreamerImageCapture *>(imageCapture); if (m_imageCapture == control) return; diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h index bf10054d1..db42c1ee8 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h @@ -60,7 +60,7 @@ QT_BEGIN_NAMESPACE class QGstreamerCamera; -class QGstreamerCameraImageCapture; +class QGstreamerImageCapture; class QGstreamerMediaEncoder; class QGstreamerAudioInput; class QGstreamerAudioOutput; @@ -77,8 +77,8 @@ public: QPlatformCamera *camera() override; void setCamera(QPlatformCamera *camera) override; - QPlatformCameraImageCapture *imageCapture() override; - void setImageCapture(QPlatformCameraImageCapture *imageCapture) override; + QPlatformImageCapture *imageCapture() override; + void setImageCapture(QPlatformImageCapture *imageCapture) override; QPlatformMediaEncoder *mediaEncoder() override; void setMediaEncoder(QPlatformMediaEncoder *encoder) override; @@ -113,7 +113,7 @@ private: QGstreamerVideoOutput *gstVideoOutput = nullptr; QGstreamerMediaEncoder *m_mediaEncoder = nullptr; - QGstreamerCameraImageCapture *m_imageCapture = nullptr; + QGstreamerImageCapture *m_imageCapture = nullptr; }; QT_END_NAMESPACE diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp index 81fcecc2e..ee67ae55d 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp @@ -71,14 +71,8 @@ QGstreamerMediaEncoder::~QGstreamerMediaEncoder() QObject::disconnect(cameraChanged); } -QUrl QGstreamerMediaEncoder::outputLocation() const +bool QGstreamerMediaEncoder::isLocationWritable(const QUrl &) const { - return m_requestedOutputLocation; -} - -bool QGstreamerMediaEncoder::setOutputLocation(const QUrl &sink) -{ - m_requestedOutputLocation = sink; return true; } @@ -300,12 +294,12 @@ void QGstreamerMediaEncoder::record() updateStatus(); // create new encoder - QString outputLocation = m_requestedOutputLocation.toLocalFile(); - if (m_requestedOutputLocation.isEmpty()) { + QString location = outputLocation().toLocalFile(); + if (outputLocation().isEmpty()) { QString container = m_resolvedSettings.mimeType().preferredSuffix(); - outputLocation = generateFileName(defaultDir(), container); + location = generateFileName(defaultDir(), container); } - QUrl actualSink = QUrl::fromLocalFile(QDir::currentPath()).resolved(outputLocation); + QUrl actualSink = QUrl::fromLocalFile(QDir::currentPath()).resolved(location); qCDebug(qLcMediaEncoder) << "recording new video to" << actualSink; Q_ASSERT(!actualSink.isEmpty()); @@ -338,7 +332,7 @@ void QGstreamerMediaEncoder::record() heartbeat.start(); gstPipeline.dumpGraph("recording"); - actualLocationChanged(QUrl::fromLocalFile(outputLocation)); + actualLocationChanged(QUrl::fromLocalFile(location)); updateStatus(); } diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h index 3c0238c02..29e210e8d 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h @@ -72,8 +72,7 @@ public: QGstreamerMediaEncoder(QMediaRecorder *parent); virtual ~QGstreamerMediaEncoder(); - QUrl outputLocation() const override; - bool setOutputLocation(const QUrl &sink) override; + bool isLocationWritable(const QUrl &sink) const override; qint64 duration() const override; @@ -103,7 +102,6 @@ private: QDir defaultDir() const; QString generateFileName(const QDir &dir, const QString &ext) const; - QUrl m_requestedOutputLocation; QMediaEncoderSettings m_settings; QMediaEncoderSettings m_resolvedSettings; QGstreamerMediaCapture *m_session = nullptr; diff --git a/src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp b/src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp index f89cf36c7..0f91e774d 100644 --- a/src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp +++ b/src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp @@ -140,22 +140,22 @@ QMediaFormat::FileFormat QGstreamerFormatInfo::fileFormatForCaps(QGstStructure s } -QCameraImageCapture::FileFormat QGstreamerFormatInfo::imageFormatForCaps(QGstStructure structure) +QImageCapture::FileFormat QGstreamerFormatInfo::imageFormatForCaps(QGstStructure structure) { const char *name = structure.name().data(); if (!strcmp(name, "image/jpeg")) { - return QCameraImageCapture::JPEG; + return QImageCapture::JPEG; } else if (!strcmp(name, "image/png")) { - return QCameraImageCapture::PNG; + return QImageCapture::PNG; } else if (!strcmp(name, "image/webp")) { - return QCameraImageCapture::WebP; + return QImageCapture::WebP; } else if (!strcmp(name, "image/webp")) { - return QCameraImageCapture::WebP; + return QImageCapture::WebP; } else if (!strcmp(name, "image/tiff")) { - return QCameraImageCapture::Tiff; + return QImageCapture::Tiff; } - return QCameraImageCapture::UnspecifiedFormat; + return QImageCapture::UnspecifiedFormat; } static QPair<QList<QMediaFormat::AudioCodec>, QList<QMediaFormat::VideoCodec>> getCodecsList(bool decode) @@ -266,9 +266,9 @@ QList<QGstreamerFormatInfo::CodecMap> QGstreamerFormatInfo::getMuxerList(bool de return muxers; } -static QList<QCameraImageCapture::FileFormat> getImageFormatList() +static QList<QImageCapture::FileFormat> getImageFormatList() { - QSet<QCameraImageCapture::FileFormat> formats; + QSet<QImageCapture::FileFormat> formats; GList *elementList = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_ENCODER, GST_RANK_MARGINAL); @@ -289,7 +289,7 @@ static QList<QCameraImageCapture::FileFormat> getImageFormatList() for (int i = 0; i < caps.size(); i++) { QGstStructure structure = caps.at(i); auto f = QGstreamerFormatInfo::imageFormatForCaps(structure); - if (f != QCameraImageCapture::UnspecifiedFormat) { + if (f != QImageCapture::UnspecifiedFormat) { // qDebug() << structure.toString() << f; formats.insert(f); } diff --git a/src/multimedia/platform/gstreamer/qgstreamerformatinfo_p.h b/src/multimedia/platform/gstreamer/qgstreamerformatinfo_p.h index 47d0f133a..f8de964e4 100644 --- a/src/multimedia/platform/gstreamer/qgstreamerformatinfo_p.h +++ b/src/multimedia/platform/gstreamer/qgstreamerformatinfo_p.h @@ -71,7 +71,7 @@ public: static QMediaFormat::AudioCodec audioCodecForCaps(QGstStructure structure); static QMediaFormat::VideoCodec videoCodecForCaps(QGstStructure structure); static QMediaFormat::FileFormat fileFormatForCaps(QGstStructure structure); - static QCameraImageCapture::FileFormat imageFormatForCaps(QGstStructure structure); + static QImageCapture::FileFormat imageFormatForCaps(QGstStructure structure); QList<CodecMap> getMuxerList(bool demuxer, QList<QMediaFormat::AudioCodec> audioCodecs, QList<QMediaFormat::VideoCodec> videoCodecs); }; diff --git a/src/multimedia/platform/gstreamer/qgstreamerintegration.cpp b/src/multimedia/platform/gstreamer/qgstreamerintegration.cpp index 06a0f6af8..732f0ed9f 100644 --- a/src/multimedia/platform/gstreamer/qgstreamerintegration.cpp +++ b/src/multimedia/platform/gstreamer/qgstreamerintegration.cpp @@ -44,7 +44,7 @@ #include "private/qgstreameraudiodecoder_p.h" #include "private/qgstreamercamera_p.h" #include "private/qgstreamermediaencoder_p.h" -#include "private/qgstreamercameraimagecapture_p.h" +#include "private/qgstreamerimagecapture_p.h" #include "private/qgstreamerformatinfo_p.h" #include "private/qgstreamervideorenderer_p.h" #include "private/qgstreamervideosink_p.h" @@ -101,9 +101,9 @@ QPlatformMediaEncoder *QGstreamerIntegration::createEncoder(QMediaRecorder *enco return new QGstreamerMediaEncoder(encoder); } -QPlatformCameraImageCapture *QGstreamerIntegration::createImageCapture(QCameraImageCapture *imageCapture) +QPlatformImageCapture *QGstreamerIntegration::createImageCapture(QImageCapture *imageCapture) { - return new QGstreamerCameraImageCapture(imageCapture); + return new QGstreamerImageCapture(imageCapture); } QPlatformVideoSink *QGstreamerIntegration::createVideoSink(QVideoSink *sink) diff --git a/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h b/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h index 0bd21ead4..14167e750 100644 --- a/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h +++ b/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h @@ -74,7 +74,7 @@ public: QPlatformMediaPlayer *createPlayer(QMediaPlayer *player) override; QPlatformCamera *createCamera(QCamera *) override; QPlatformMediaEncoder *createEncoder(QMediaRecorder *) override; - QPlatformCameraImageCapture *createImageCapture(QCameraImageCapture *) override; + QPlatformImageCapture *createImageCapture(QImageCapture *) override; QPlatformVideoSink *createVideoSink(QVideoSink *sink) override; diff --git a/src/multimedia/platform/qnx/camera/bbcameraimagecapturecontrol.cpp b/src/multimedia/platform/qnx/camera/bbcameraimagecapturecontrol.cpp index 506544d74..5a78e1ee0 100644 --- a/src/multimedia/platform/qnx/camera/bbcameraimagecapturecontrol.cpp +++ b/src/multimedia/platform/qnx/camera/bbcameraimagecapturecontrol.cpp @@ -43,7 +43,7 @@ QT_BEGIN_NAMESPACE BbCameraImageCaptureControl::BbCameraImageCaptureControl(BbCameraSession *session, QObject *parent) - : QPlatformCameraImageCapture(parent) + : QPlatformImageCapture(parent) , m_session(session) { connect(m_session, SIGNAL(readyForCaptureChanged(bool)), this, SIGNAL(readyForCaptureChanged(bool))); diff --git a/src/multimedia/platform/qnx/camera/bbcameraimagecapturecontrol_p.h b/src/multimedia/platform/qnx/camera/bbcameraimagecapturecontrol_p.h index 7a25cc0e3..62ba19c97 100644 --- a/src/multimedia/platform/qnx/camera/bbcameraimagecapturecontrol_p.h +++ b/src/multimedia/platform/qnx/camera/bbcameraimagecapturecontrol_p.h @@ -50,13 +50,13 @@ // We mean it. // -#include <private/qplatformcameraimagecapture_p.h> +#include <private/qplatformimagecapture_p.h> QT_BEGIN_NAMESPACE class BbCameraSession; -class BbCameraImageCaptureControl : public QPlatformCameraImageCapture +class BbCameraImageCaptureControl : public QPlatformImageCapture { Q_OBJECT public: diff --git a/src/multimedia/platform/qnx/camera/bbcameramediarecordercontrol.cpp b/src/multimedia/platform/qnx/camera/bbcameramediarecordercontrol.cpp index cdd4793af..eead99420 100644 --- a/src/multimedia/platform/qnx/camera/bbcameramediarecordercontrol.cpp +++ b/src/multimedia/platform/qnx/camera/bbcameramediarecordercontrol.cpp @@ -72,14 +72,9 @@ BbCameraMediaRecorderControl::BbCameraMediaRecorderControl(BbCameraSession *sess connect(m_session, SIGNAL(videoError(int,QString)), this, SIGNAL(error(int,QString))); } -QUrl BbCameraMediaRecorderControl::outputLocation() const +bool BbCameraMediaRecorderControl::isLocationWritable(const QUrl &location) const { - return m_session->outputLocation(); -} - -bool BbCameraMediaRecorderControl::setOutputLocation(const QUrl &location) -{ - return m_session->setOutputLocation(location); + return true; } QMediaRecorder::RecorderState BbCameraMediaRecorderControl::state() const @@ -130,7 +125,20 @@ void BbCameraMediaRecorderControl::applySettings() void BbCameraMediaRecorderControl::setState(QMediaRecorder::RecorderState state) { - m_session->setVideoState(state); + if (!m_session) + return; + + switch (state) { + case QMediaRecorder::RecordingState: + m_session->startVideoRecording(outputLocation()); + break; + case QMediaRecorder::StoppedState: + m_session->stopVideoRecording(); + break; + case QMediaRecorder::PausedState: + //TODO: (pause) not supported by BB10 API yet + break; + } } void BbCameraMediaRecorderControl::setMuted(bool muted) diff --git a/src/multimedia/platform/qnx/camera/bbcameramediarecordercontrol_p.h b/src/multimedia/platform/qnx/camera/bbcameramediarecordercontrol_p.h index 7b9d11ecc..27fa53ffa 100644 --- a/src/multimedia/platform/qnx/camera/bbcameramediarecordercontrol_p.h +++ b/src/multimedia/platform/qnx/camera/bbcameramediarecordercontrol_p.h @@ -62,9 +62,8 @@ class BbCameraMediaRecorderControl : public QPlatformMediaEncoder public: explicit BbCameraMediaRecorderControl(BbCameraSession *session, QObject *parent = 0); - QUrl outputLocation() const override; - bool setOutputLocation(const QUrl &location) override; QMediaRecorder::RecorderState state() const override; + bool isLocationWritable(const QUrl &location) const override; QMediaRecorder::Status status() const override; qint64 duration() const override; bool isMuted() const override; diff --git a/src/multimedia/platform/qnx/camera/bbcameraservice.cpp b/src/multimedia/platform/qnx/camera/bbcameraservice.cpp index f116fea01..6f68e68ed 100644 --- a/src/multimedia/platform/qnx/camera/bbcameraservice.cpp +++ b/src/multimedia/platform/qnx/camera/bbcameraservice.cpp @@ -78,7 +78,7 @@ QPlatformCamera *BbCameraService::camera() return m_cameraControl; } -QPlatformCameraImageCapture *BbCameraService::imageCapture() +QPlatformImageCapture *BbCameraService::imageCapture() { return m_cameraImageCaptureControl; } diff --git a/src/multimedia/platform/qnx/camera/bbcameraservice_p.h b/src/multimedia/platform/qnx/camera/bbcameraservice_p.h index 0f7f95b09..128fc1154 100644 --- a/src/multimedia/platform/qnx/camera/bbcameraservice_p.h +++ b/src/multimedia/platform/qnx/camera/bbcameraservice_p.h @@ -76,7 +76,7 @@ public: ~BbCameraService(); QPlatformCamera *camera() override; - QPlatformCameraImageCapture *imageCapture() override; + QPlatformImageCapture *imageCapture() override; QPlatformMediaEncoder *mediaEncoder() override; void setVideoPreview(QVideoSink *surface) override; diff --git a/src/multimedia/platform/qnx/camera/bbcamerasession.cpp b/src/multimedia/platform/qnx/camera/bbcamerasession.cpp index 699c8f9ef..9ce740d20 100644 --- a/src/multimedia/platform/qnx/camera/bbcamerasession.cpp +++ b/src/multimedia/platform/qnx/camera/bbcamerasession.cpp @@ -317,7 +317,7 @@ static void imageCaptureImageCallback(camera_handle_t handle, camera_buffer_t *b // We are inside a worker thread here, so emit error signal inside the main thread QMetaObject::invokeMethod(data->session, "imageCaptureError", Qt::QueuedConnection, Q_ARG(int, data->requestId), - Q_ARG(QCameraImageCapture::Error, QCameraImageCapture::FormatError), + Q_ARG(QImageCapture::Error, QImageCapture::FormatError), Q_ARG(QString, BbCameraSession::tr("Camera provides image in unsupported format"))); return; } @@ -331,7 +331,7 @@ static void imageCaptureImageCallback(camera_handle_t handle, camera_buffer_t *b // We are inside a worker thread here, so emit error signal inside the main thread QMetaObject::invokeMethod(data->session, "imageCaptureError", Qt::QueuedConnection, Q_ARG(int, data->requestId), - Q_ARG(QCameraImageCapture::Error, QCameraImageCapture::FormatError), + Q_ARG(QImageCapture::Error, QImageCapture::FormatError), Q_ARG(QString, errorMessage)); return; } @@ -349,7 +349,7 @@ int BbCameraSession::capture(const QString &fileName) m_lastImageCaptureId++; if (!isReadyForCapture()) { - emit imageCaptureError(m_lastImageCaptureId, QCameraImageCapture::NotReadyError, tr("Camera not ready")); + emit imageCaptureError(m_lastImageCaptureId, QImageCapture::NotReadyError, tr("Camera not ready")); return m_lastImageCaptureId; } @@ -406,57 +406,11 @@ void BbCameraSession::setImageSettings(const QImageEncoderSettings &settings) m_imageEncoderSettings.setCodec(QLatin1String("jpeg")); } -QUrl BbCameraSession::outputLocation() const -{ - return QUrl::fromLocalFile(m_videoOutputLocation); -} - -bool BbCameraSession::setOutputLocation(const QUrl &location) -{ - m_videoOutputLocation = location.toLocalFile(); - - return true; -} - QMediaRecorder::RecorderState BbCameraSession::videoState() const { return m_videoState; } -void BbCameraSession::setVideoState(QMediaRecorder::RecorderState state) -{ - if (m_videoState == state) - return; - - const QMediaRecorder::RecorderState previousState = m_videoState; - - if (previousState == QMediaRecorder::StoppedState) { - if (state == QMediaRecorder::RecordingState) { - if (startVideoRecording()) { - m_videoState = state; - } - } else if (state == QMediaRecorder::PausedState) { - // do nothing - } - } else if (previousState == QMediaRecorder::RecordingState) { - if (state == QMediaRecorder::StoppedState) { - stopVideoRecording(); - m_videoState = state; - } else if (state == QMediaRecorder::PausedState) { - //TODO: (pause) not supported by BB10 API yet - } - } else if (previousState == QMediaRecorder::PausedState) { - if (state == QMediaRecorder::StoppedState) { - stopVideoRecording(); - m_videoState = state; - } else if (state == QMediaRecorder::RecordingState) { - //TODO: (resume) not supported by BB10 API yet - } - } - - emit videoStateChanged(m_videoState); -} - QMediaRecorder::Status BbCameraSession::videoStatus() const { return m_videoStatus; @@ -677,11 +631,11 @@ void BbCameraSession::imageCaptured(int requestId, const QImage &rawImage, const if (image.save(&file, "JPG")) { emit imageSaved(requestId, actualFileName); } else { - emit imageCaptureError(requestId, QCameraImageCapture::OutOfSpaceError, file.errorString()); + emit imageCaptureError(requestId, QImageCapture::OutOfSpaceError, file.errorString()); } } else { const QString errorMessage = tr("Could not open destination file:\n%1").arg(actualFileName); - emit imageCaptureError(requestId, QCameraImageCapture::ResourceError, errorMessage); + emit imageCaptureError(requestId, QImageCapture::ResourceError, errorMessage); } } } @@ -986,32 +940,37 @@ static void videoRecordingStatusCallback(camera_handle_t handle, camera_devstatu } } -bool BbCameraSession::startVideoRecording() +void BbCameraSession::startVideoRecording(const QUrl &outputLocation) { + if (m_videoState == QMediaRecorder::RecordingState) + return; + m_videoRecordingDuration.invalidate(); m_videoStatus = QMediaRecorder::StartingStatus; emit videoStatusChanged(m_videoStatus); - if (m_videoOutputLocation.isEmpty()) - m_videoOutputLocation = m_mediaStorageLocation.generateFileName(QLatin1String("VID_"), m_mediaStorageLocation.defaultDir(QCamera::CaptureVideo), QLatin1String("mp4")); + QString videoOutputLocation = outputLocation.toLocalFile(); + if (videoOutputLocation.isEmpty()) + videoOutputLocation = m_mediaStorageLocation.generateFileName(QLatin1String("VID_"), m_mediaStorageLocation.defaultDir(QCamera::CaptureVideo), QLatin1String("mp4")); - emit actualLocationChanged(m_videoOutputLocation); + emit actualLocationChanged(videoOutputLocation); - const camera_error_t result = camera_start_video(m_handle, QFile::encodeName(m_videoOutputLocation), 0, videoRecordingStatusCallback, this); + const camera_error_t result = camera_start_video(m_handle, QFile::encodeName(videoOutputLocation), 0, videoRecordingStatusCallback, this); if (result != CAMERA_EOK) { m_videoStatus = QMediaRecorder::StoppedStatus; - emit videoStatusChanged(m_videoStatus); - emit videoError(QMediaRecorder::ResourceError, tr("Unable to start video recording")); - return false; + } else { + m_videoState = QMediaRecorder::RecordingState; } - - return true; + emit videoStateChanged(m_videoState); } void BbCameraSession::stopVideoRecording() { + if (m_videoState == QMediaRecorder::StoppedState) + return; + m_videoStatus = QMediaRecorder::FinalizingStatus; emit videoStatusChanged(m_videoStatus); @@ -1024,6 +983,8 @@ void BbCameraSession::stopVideoRecording() emit videoStatusChanged(m_videoStatus); m_videoRecordingDuration.invalidate(); + m_videoState = QMediaRecorder::StoppedState; + emit videoStateChanged(m_videoState); } bool BbCameraSession::isCaptureModeSupported(camera_handle_t handle, QCamera::CaptureModes mode) const diff --git a/src/multimedia/platform/qnx/camera/bbcamerasession_p.h b/src/multimedia/platform/qnx/camera/bbcamerasession_p.h index c92c2ac2d..b45a0e876 100644 --- a/src/multimedia/platform/qnx/camera/bbcamerasession_p.h +++ b/src/multimedia/platform/qnx/camera/bbcamerasession_p.h @@ -53,7 +53,7 @@ #include "bbmediastoragelocation_p.h" #include <QCamera> -#include <QCameraImageCapture> +#include <QImageCapture> #include <QElapsedTimer> #include <QMediaRecorder> #include <QMutex> @@ -107,14 +107,14 @@ public: void setImageSettings(const QImageEncoderSettings &settings); // media recorder control - QUrl outputLocation() const; - bool setOutputLocation(const QUrl &location); QMediaRecorder::RecorderState videoState() const; - void setVideoState(QMediaRecorder::RecorderState state); QMediaRecorder::Status videoStatus() const; qint64 duration() const; void applyVideoSettings(); + bool startVideoRecording(const QUrl &outputLocation); + void stopVideoRecording(); + // video encoder settings control QList<QSize> supportedResolutions(const QVideoEncoderSettings &settings, bool *continuous) const; QList<qreal> supportedFrameRates(const QVideoEncoderSettings &settings, bool *continuous) const; @@ -166,8 +166,6 @@ private: void closeCamera(); bool startViewFinder(); void stopViewFinder(); - bool startVideoRecording(); - void stopVideoRecording(); bool isCaptureModeSupported(camera_handle_t handle, QCamera::CaptureModes mode) const; QList<QSize> supportedResolutions(QCamera::CaptureMode mode) const; @@ -191,7 +189,6 @@ private: QImageEncoderSettings m_imageEncoderSettings; - QString m_videoOutputLocation; QMediaRecorder::RecorderState m_videoState; QMediaRecorder::Status m_videoStatus; QElapsedTimer m_videoRecordingDuration; diff --git a/src/multimedia/platform/qplatformaudiodecoder.cpp b/src/multimedia/platform/qplatformaudiodecoder.cpp index b7da0a304..817e0656f 100644 --- a/src/multimedia/platform/qplatformaudiodecoder.cpp +++ b/src/multimedia/platform/qplatformaudiodecoder.cpp @@ -67,28 +67,6 @@ QPlatformAudioDecoder::QPlatformAudioDecoder(QAudioDecoder *parent) } /*! - \fn QPlatformAudioDecoder::state() const - - Returns the state of a player control. -*/ - -void QPlatformAudioDecoder::stateChanged(QAudioDecoder::State newState) -{ - if (m_state == newState) - return; - m_state = newState; - emit q->stateChanged(newState); -} - -/*! - \fn QPlatformAudioDecoder::stateChanged(QAudioDecoder::State newState) - - Signals that the state of a player control has changed to \a newState. - - \sa state() -*/ - -/*! \fn QPlatformAudioDecoder::source() const Returns the current media source filename, or a null QString if none (or a device) @@ -150,6 +128,7 @@ void QPlatformAudioDecoder::error(int error, const QString &errorString) return; m_error = QAudioDecoder::Error(error); m_errorString = errorString; + setIsDecoding(false); emit q->error(m_error); } @@ -193,18 +172,6 @@ void QPlatformAudioDecoder::sourceChanged() } /*! - \fn QPlatformAudioDecoder::formatChanged(const QAudioFormat &format) - - Signals that the current audio format of the decoder has changed to \a format. - - \sa audioFormat(), setAudioFormat() -*/ -void QPlatformAudioDecoder::formatChanged(const QAudioFormat &format) -{ - emit q->formatChanged(format); -} - -/*! \fn void QPlatformAudioDecoder::finished() Signals that the decoding has finished successfully. @@ -214,6 +181,7 @@ void QPlatformAudioDecoder::formatChanged(const QAudioFormat &format) */ void QPlatformAudioDecoder::finished() { + setIsDecoding(false); emit q->finished(); } diff --git a/src/multimedia/platform/qplatformaudiodecoder_p.h b/src/multimedia/platform/qplatformaudiodecoder_p.h index 91877e647..e097b79fa 100644 --- a/src/multimedia/platform/qplatformaudiodecoder_p.h +++ b/src/multimedia/platform/qplatformaudiodecoder_p.h @@ -66,8 +66,6 @@ class Q_MULTIMEDIA_EXPORT QPlatformAudioDecoder : public QObject Q_OBJECT public: - virtual QAudioDecoder::State state() const { return m_state; } - virtual QUrl source() const = 0; virtual void setSource(const QUrl &fileName) = 0; @@ -77,17 +75,12 @@ public: virtual void start() = 0; virtual void stop() = 0; - virtual QAudioFormat audioFormat() const = 0; - virtual void setAudioFormat(const QAudioFormat &format) = 0; - virtual QAudioBuffer read() = 0; virtual bool bufferAvailable() const = 0; virtual qint64 position() const = 0; virtual qint64 duration() const = 0; - void stateChanged(QAudioDecoder::State newState); - void formatChanged(const QAudioFormat &format); void sourceChanged(); void error(int error, const QString &errorString); @@ -95,7 +88,14 @@ public: void bufferReady(); void bufferAvailableChanged(bool available); + void setIsDecoding(bool running = true) { + if (m_isDecoding == running) + return; + m_isDecoding = running; + emit q->isDecodingChanged(m_isDecoding); + } void finished(); + bool isDecoding() const { return m_isDecoding; } void positionChanged(qint64 position); void durationChanged(qint64 duration); @@ -108,9 +108,9 @@ protected: private: QAudioDecoder *q = nullptr; - QAudioDecoder::State m_state = QAudioDecoder::StoppedState; QAudioDecoder::Error m_error = QAudioDecoder::NoError; QString m_errorString; + bool m_isDecoding = false; }; QT_END_NAMESPACE diff --git a/src/multimedia/platform/qplatformcamera.cpp b/src/multimedia/platform/qplatformcamera.cpp index 796269cda..d0bc9fdcf 100644 --- a/src/multimedia/platform/qplatformcamera.cpp +++ b/src/multimedia/platform/qplatformcamera.cpp @@ -94,9 +94,7 @@ QCameraFormat QPlatformCamera::findBestCameraFormat(const QCameraDevice &camera) Sets the camera \a state. - State changes are synchronous and indicate user intention, - while camera status is used as a feedback mechanism to inform application about backend status. - Status changes are reported asynchronously with QPlatformCamera::statusChanged() signal. + State changes are synchronous and indicate user intention. \sa QCamera::State */ @@ -111,21 +109,6 @@ QCameraFormat QPlatformCamera::findBestCameraFormat(const QCameraDevice &camera) */ /*! - \fn QPlatformCamera::status() const - - Returns the status of the camera service. - - \sa QCamera::state -*/ - -/*! - \fn void QPlatformCamera::statusChanged(QCamera::Status status) - - Signal emitted when the camera \a status changes. -*/ - - -/*! \fn void QPlatformCamera::error(int error, const QString &errorString) Signal emitted when an error occurs with error code \a error and @@ -165,14 +148,6 @@ void QPlatformCamera::supportedFeaturesChanged(QCamera::Features f) emit m_camera->supportedFeaturesChanged(); } -void QPlatformCamera::statusChanged(QCamera::Status s) -{ - if (s == m_status) - return; - m_status = s; - emit m_camera->statusChanged(s); -} - void QPlatformCamera::minimumZoomFactorChanged(float factor) { if (m_minZoom == factor) diff --git a/src/multimedia/platform/qplatformcamera_p.h b/src/multimedia/platform/qplatformcamera_p.h index 990943d2d..8ddaf51ae 100644 --- a/src/multimedia/platform/qplatformcamera_p.h +++ b/src/multimedia/platform/qplatformcamera_p.h @@ -66,8 +66,6 @@ public: virtual bool isActive() const = 0; virtual void setActive(bool active) = 0; - virtual QCamera::Status status() const { return m_status; } - virtual void setCamera(const QCameraDevice &camera) = 0; virtual bool setCameraFormat(const QCameraFormat &/*format*/) { return false; } @@ -128,7 +126,6 @@ public: int colorTemperature() const { return m_colorTemperature; } void supportedFeaturesChanged(QCamera::Features); - void statusChanged(QCamera::Status); void minimumZoomFactorChanged(float factor); void maximumZoomFactorChanged(float); void focusModeChanged(QCamera::FocusMode mode); @@ -163,7 +160,6 @@ protected: private: QCamera *m_camera = nullptr; QCamera::Features m_supportedFeatures = {}; - QCamera::Status m_status = QCamera::InactiveStatus; QCamera::FocusMode m_focusMode = QCamera::FocusModeAuto; float m_minZoom = 1.; float m_maxZoom = 1.; diff --git a/src/multimedia/platform/qplatformcameraimagecapture.cpp b/src/multimedia/platform/qplatformimagecapture.cpp index 907fa3354..04c3ed337 100644 --- a/src/multimedia/platform/qplatformcameraimagecapture.cpp +++ b/src/multimedia/platform/qplatformimagecapture.cpp @@ -37,16 +37,16 @@ ** ****************************************************************************/ -#include "qplatformcameraimagecapture_p.h" +#include "qplatformimagecapture_p.h" #include <QtCore/qstringlist.h> QT_BEGIN_NAMESPACE /*! - \class QPlatformCameraImageCapture + \class QPlatformImageCapture \obsolete - \brief The QPlatformCameraImageCapture class provides a control interface + \brief The QPlatformImageCapture class provides a control interface for image capture services. \inmodule QtMultimedia @@ -57,14 +57,14 @@ QT_BEGIN_NAMESPACE /*! Constructs a new image capture control object with the given \a parent */ -QPlatformCameraImageCapture::QPlatformCameraImageCapture(QCameraImageCapture *parent) +QPlatformImageCapture::QPlatformImageCapture(QImageCapture *parent) : QObject(parent), m_imageCapture(parent) { } /*! - \fn QPlatformCameraImageCapture::isReadyForCapture() const + \fn QPlatformImageCapture::isReadyForCapture() const Identifies if a capture control is ready to perform a capture immediately (all the resources necessary for image capture are allocated, @@ -80,13 +80,13 @@ QPlatformCameraImageCapture::QPlatformCameraImageCapture(QCameraImageCapture *pa */ /*! - \fn QPlatformCameraImageCapture::readyForCaptureChanged(bool ready) + \fn QPlatformImageCapture::readyForCaptureChanged(bool ready) Signals that a capture control's \a ready state has changed. */ /*! - \fn QPlatformCameraImageCapture::capture(const QString &fileName) + \fn QPlatformImageCapture::capture(const QString &fileName) Initiates the capture of an image to \a fileName. The \a fileName can be relative or empty, @@ -103,13 +103,13 @@ QPlatformCameraImageCapture::QPlatformCameraImageCapture(QCameraImageCapture *pa */ /*! - \fn QPlatformCameraImageCapture::cancelCapture() + \fn QPlatformImageCapture::cancelCapture() Cancel pending capture requests. */ /*! - \fn QPlatformCameraImageCapture::imageExposed(int requestId) + \fn QPlatformImageCapture::imageExposed(int requestId) Signals that an image with it \a requestId has just been exposed. @@ -117,14 +117,14 @@ QPlatformCameraImageCapture::QPlatformCameraImageCapture(QCameraImageCapture *pa */ /*! - \fn QPlatformCameraImageCapture::imageCaptured(int requestId, const QImage &preview) + \fn QPlatformImageCapture::imageCaptured(int requestId, const QImage &preview) Signals that an image with it \a requestId has been captured and a \a preview is available. */ /*! - \fn QPlatformCameraImageCapture::imageMetadataAvailable(int id, const QMediaMetaData &metaData) + \fn QPlatformImageCapture::imageMetadataAvailable(int id, const QMediaMetaData &metaData) Signals that a metadata for an image with request \a id is available. @@ -132,20 +132,20 @@ QPlatformCameraImageCapture::QPlatformCameraImageCapture(QCameraImageCapture *pa */ /*! - \fn QPlatformCameraImageCapture::imageAvailable(int requestId, const QVideoFrame &buffer) + \fn QPlatformImageCapture::imageAvailable(int requestId, const QVideoFrame &buffer) Signals that a captured \a buffer with a \a requestId is available. */ /*! - \fn QPlatformCameraImageCapture::imageSaved(int requestId, const QString &fileName) + \fn QPlatformImageCapture::imageSaved(int requestId, const QString &fileName) Signals that a captured image with a \a requestId has been saved to \a fileName. */ /*! - \fn QPlatformCameraImageCapture::imageSettings() const + \fn QPlatformImageCapture::imageSettings() const Returns the currently used image encoder settings. @@ -154,20 +154,20 @@ QPlatformCameraImageCapture::QPlatformCameraImageCapture(QCameraImageCapture *pa */ /*! - \fn QPlatformCameraImageCapture::setImageSettings(const QImageEncoderSettings &settings) + \fn QPlatformImageCapture::setImageSettings(const QImageEncoderSettings &settings) Sets the selected image encoder \a settings. */ /*! - \fn QPlatformCameraImageCapture::error(int id, int error, const QString &errorString) + \fn QPlatformImageCapture::error(int id, int error, const QString &errorString) Signals the capture request \a id failed with \a error code and message \a errorString. - \sa QCameraImageCapture::Error + \sa QImageCapture::Error */ QT_END_NAMESPACE -#include "moc_qplatformcameraimagecapture_p.cpp" +#include "moc_qplatformimagecapture_p.cpp" diff --git a/src/multimedia/platform/qplatformcameraimagecapture_p.h b/src/multimedia/platform/qplatformimagecapture_p.h index 65f96a97d..441848ed0 100644 --- a/src/multimedia/platform/qplatformcameraimagecapture_p.h +++ b/src/multimedia/platform/qplatformimagecapture_p.h @@ -51,9 +51,9 @@ // We mean it. // -#include <QtMultimedia/qcameraimagecapture.h> +#include <QtMultimedia/qimagecapture.h> #include <QtMultimedia/qmediametadata.h> -#include <QtMultimedia/qcameraimagecapture.h> +#include <QtMultimedia/qimagecapture.h> QT_BEGIN_NAMESPACE @@ -63,9 +63,9 @@ class QPlatformMediaCaptureSession; class QImageEncoderSettingsPrivate; class Q_MULTIMEDIA_EXPORT QImageEncoderSettings { - QCameraImageCapture::FileFormat m_format = QCameraImageCapture::UnspecifiedFormat; + QImageCapture::FileFormat m_format = QImageCapture::UnspecifiedFormat; QSize m_resolution; - QCameraImageCapture::Quality m_quality = QCameraImageCapture::NormalQuality; + QImageCapture::Quality m_quality = QImageCapture::NormalQuality; public: bool operator==(const QImageEncoderSettings &other) { @@ -75,18 +75,18 @@ public: } bool operator!=(const QImageEncoderSettings &other) { return !operator==(other); } - QCameraImageCapture::FileFormat format() const { return m_format; } - void setFormat(QCameraImageCapture::FileFormat f) { m_format = f; } + QImageCapture::FileFormat format() const { return m_format; } + void setFormat(QImageCapture::FileFormat f) { m_format = f; } QSize resolution() const { return m_resolution; } void setResolution(const QSize &s) { m_resolution = s; } void setResolution(int width, int height) { m_resolution = QSize(width, height); } - QCameraImageCapture::Quality quality() const { return m_quality; } - void setQuality(QCameraImageCapture::Quality quality) { m_quality = quality; } + QImageCapture::Quality quality() const { return m_quality; } + void setQuality(QImageCapture::Quality quality) { m_quality = quality; } }; -class Q_MULTIMEDIA_EXPORT QPlatformCameraImageCapture : public QObject +class Q_MULTIMEDIA_EXPORT QPlatformImageCapture : public QObject { Q_OBJECT @@ -102,7 +102,7 @@ public: virtual void setMetaData(const QMediaMetaData &m) { m_metaData = m; } QMediaMetaData metaData() const { return m_metaData; } - QCameraImageCapture *imageCapture() { return m_imageCapture; } + QImageCapture *imageCapture() { return m_imageCapture; } Q_SIGNALS: void readyForCaptureChanged(bool ready); @@ -116,9 +116,9 @@ Q_SIGNALS: void error(int id, int error, const QString &errorString); protected: - explicit QPlatformCameraImageCapture(QCameraImageCapture *parent = nullptr); + explicit QPlatformImageCapture(QImageCapture *parent = nullptr); private: - QCameraImageCapture *m_imageCapture = nullptr; + QImageCapture *m_imageCapture = nullptr; QMediaMetaData m_metaData; }; diff --git a/src/multimedia/platform/qplatformmediacapture_p.h b/src/multimedia/platform/qplatformmediacapture_p.h index 222a98686..a988f3de4 100644 --- a/src/multimedia/platform/qplatformmediacapture_p.h +++ b/src/multimedia/platform/qplatformmediacapture_p.h @@ -55,7 +55,7 @@ QT_BEGIN_NAMESPACE class QPlatformCamera; -class QPlatformCameraImageCapture; +class QPlatformImageCapture; class QPlatformMediaEncoder; class QAudioDevice; class QCameraDevice; @@ -73,8 +73,8 @@ public: virtual QPlatformCamera *camera() = 0; virtual void setCamera(QPlatformCamera *) {} - virtual QPlatformCameraImageCapture *imageCapture() = 0; - virtual void setImageCapture(QPlatformCameraImageCapture *) {} + virtual QPlatformImageCapture *imageCapture() = 0; + virtual void setImageCapture(QPlatformImageCapture *) {} virtual QPlatformMediaEncoder *mediaEncoder() = 0; virtual void setMediaEncoder(QPlatformMediaEncoder *) {} diff --git a/src/multimedia/platform/qplatformmediaencoder_p.h b/src/multimedia/platform/qplatformmediaencoder_p.h index 2661718d9..950fd2726 100644 --- a/src/multimedia/platform/qplatformmediaencoder_p.h +++ b/src/multimedia/platform/qplatformmediaencoder_p.h @@ -136,8 +136,8 @@ class Q_MULTIMEDIA_EXPORT QPlatformMediaEncoder { public: virtual ~QPlatformMediaEncoder() {} - virtual QUrl outputLocation() const = 0; - virtual bool setOutputLocation(const QUrl &location) = 0; + + virtual bool isLocationWritable(const QUrl &location) const = 0; virtual QMediaRecorder::RecorderState state() const { return m_state; } virtual void setState(QMediaRecorder::RecorderState state) = 0; @@ -155,6 +155,8 @@ public: QMediaRecorder::Error error() const { return m_error;} QString errorString() const { return m_errorString; } + QUrl outputLocation() const { return m_outputLocation; } + void setOutputLocation(const QUrl &location) { m_outputLocation = location; } QUrl actualLocation() const { return m_actualLocation; } void clearActualLocation() { m_actualLocation.clear(); } void clearError() { error(QMediaRecorder::NoError, QString()); } @@ -174,6 +176,8 @@ private: QMediaRecorder::Error m_error = QMediaRecorder::NoError; QString m_errorString; QUrl m_actualLocation; + QUrl m_outputLocation; + QMediaRecorder::RecorderState m_state = QMediaRecorder::StoppedState; QMediaRecorder::Status m_status = QMediaRecorder::StoppedStatus; }; diff --git a/src/multimedia/platform/qplatformmediaformatinfo_p.h b/src/multimedia/platform/qplatformmediaformatinfo_p.h index 9e56bee41..8842304ca 100644 --- a/src/multimedia/platform/qplatformmediaformatinfo_p.h +++ b/src/multimedia/platform/qplatformmediaformatinfo_p.h @@ -52,7 +52,7 @@ // #include <private/qtmultimediaglobal_p.h> -#include <qcameraimagecapture.h> +#include <qimagecapture.h> #include <qmediaformat.h> QT_BEGIN_NAMESPACE @@ -77,7 +77,7 @@ public: QList<CodecMap> encoders; QList<CodecMap> decoders; - QList<QCameraImageCapture::FileFormat> imageFormats; + QList<QImageCapture::FileFormat> imageFormats; }; QT_END_NAMESPACE diff --git a/src/multimedia/platform/qplatformmediaintegration_p.h b/src/multimedia/platform/qplatformmediaintegration_p.h index 9d28a9528..67938d910 100644 --- a/src/multimedia/platform/qplatformmediaintegration_p.h +++ b/src/multimedia/platform/qplatformmediaintegration_p.h @@ -59,7 +59,7 @@ class QMediaPlayer; class QAudioDecoder; class QCamera; class QMediaRecorder; -class QCameraImageCapture; +class QImageCapture; class QMediaDevices; class QPlatformMediaDevices; class QPlatformMediaCaptureSession; @@ -67,7 +67,7 @@ class QPlatformMediaPlayer; class QPlatformAudioDecoder; class QPlatformCamera; class QPlatformMediaEncoder; -class QPlatformCameraImageCapture; +class QPlatformImageCapture; class QPlatformMediaFormatInfo; class QObject; class QPlatformVideoSink; @@ -94,7 +94,7 @@ public: virtual QPlatformMediaPlayer *createPlayer(QMediaPlayer *) { return nullptr; } virtual QPlatformCamera *createCamera(QCamera *) { return nullptr; } virtual QPlatformMediaEncoder *createEncoder(QMediaRecorder *) { return nullptr; } - virtual QPlatformCameraImageCapture *createImageCapture(QCameraImageCapture *) { return nullptr; } + virtual QPlatformImageCapture *createImageCapture(QImageCapture *) { return nullptr; } virtual QPlatformAudioInput *createAudioInput(QAudioInput *); virtual QPlatformAudioOutput *createAudioOutput(QAudioOutput *); diff --git a/src/multimedia/platform/windows/player/mfmetadata.cpp b/src/multimedia/platform/windows/common/mfmetadata.cpp index d64b3fa2f..587d757d6 100644 --- a/src/multimedia/platform/windows/player/mfmetadata.cpp +++ b/src/multimedia/platform/windows/common/mfmetadata.cpp @@ -43,9 +43,10 @@ #include <mfapi.h> #include <mfidl.h> +#include <propvarutil.h> +#include <propkey.h> #include "mfmetadata_p.h" -#include "Propkey.h" //#define DEBUG_MEDIAFOUNDATION @@ -176,21 +177,21 @@ static QVariant convertValue(const PROPVARIANT& var) return value; } -static QVariant metaDataValue(IPropertyStore *m_content, const PROPERTYKEY &key) +static QVariant metaDataValue(IPropertyStore *content, const PROPERTYKEY &key) { QVariant value; PROPVARIANT var; PropVariantInit(&var); HRESULT hr = S_FALSE; - if (m_content) - hr = m_content->GetValue(key, &var); + if (content) + hr = content->GetValue(key, &var); if (SUCCEEDED(hr)) { value = convertValue(var); // some metadata needs to be reformatted - if (value.isValid() && m_content) { + if (value.isValid() && content) { if (key == PKEY_Media_ClassPrimaryID /*QMediaMetaData::MediaType*/) { QString v = value.toString(); if (v == QLatin1String("{D1607DBC-E323-4BE2-86A1-48A42A28441E}")) @@ -211,12 +212,12 @@ static QVariant metaDataValue(IPropertyStore *m_content, const PROPERTYKEY &key) } else if (key == PKEY_Video_FrameHeight /*Resolution*/) { QSize res; res.setHeight(value.toUInt()); - if (m_content && SUCCEEDED(m_content->GetValue(PKEY_Video_FrameWidth, &var))) + if (content && SUCCEEDED(content->GetValue(PKEY_Video_FrameWidth, &var))) res.setWidth(convertValue(var).toUInt()); value = res; } else if (key == PKEY_Video_Orientation) { uint orientation = 0; - if (m_content && SUCCEEDED(m_content->GetValue(PKEY_Video_Orientation, &var))) + if (content && SUCCEEDED(content->GetValue(PKEY_Video_Orientation, &var))) orientation = convertValue(var).toUInt(); value = orientation; } else if (key == PKEY_Video_FrameRate) { @@ -233,17 +234,17 @@ QMediaMetaData MFMetaData::fromNative(IMFMediaSource* mediaSource) { QMediaMetaData metaData; - IPropertyStore *m_content = nullptr; - if (!SUCCEEDED(MFGetService(mediaSource, MF_PROPERTY_HANDLER_SERVICE, IID_PPV_ARGS(&m_content)))) + IPropertyStore *content = nullptr; + if (!SUCCEEDED(MFGetService(mediaSource, MF_PROPERTY_HANDLER_SERVICE, IID_PPV_ARGS(&content)))) return metaData; - Q_ASSERT(m_content); + Q_ASSERT(content); DWORD cProps; - if (SUCCEEDED(m_content->GetCount(&cProps))) { + if (SUCCEEDED(content->GetCount(&cProps))) { for (DWORD i = 0; i < cProps; i++) { PROPERTYKEY key; - if (FAILED(m_content->GetAt(i, &key))) + if (FAILED(content->GetAt(i, &key))) continue; QMediaMetaData::Key mediaKey; if (key == PKEY_Author) { @@ -325,11 +326,191 @@ QMediaMetaData MFMetaData::fromNative(IMFMediaSource* mediaSource) } else { continue; } - metaData.insert(mediaKey, metaDataValue(m_content, key)); + metaData.insert(mediaKey, metaDataValue(content, key)); } } - m_content->Release(); + content->Release(); return metaData; } + +static REFPROPERTYKEY propertyKeyForMetaDataKey(QMediaMetaData::Key key) +{ + switch (key) { + case QMediaMetaData::Key::Title: + return PKEY_Title; + case QMediaMetaData::Key::Author: + return PKEY_Author; + case QMediaMetaData::Key::Comment: + return PKEY_Comment; + case QMediaMetaData::Key::Genre: + return PKEY_Music_Genre; + case QMediaMetaData::Key::Copyright: + return PKEY_Copyright; + case QMediaMetaData::Key::Publisher: + return PKEY_Media_Publisher; + case QMediaMetaData::Key::Url: + return PKEY_Media_AuthorUrl; + case QMediaMetaData::Key::AlbumTitle: + return PKEY_Music_AlbumTitle; + case QMediaMetaData::Key::AlbumArtist: + return PKEY_Music_AlbumArtist; + case QMediaMetaData::Key::TrackNumber: + return PKEY_Music_TrackNumber; + case QMediaMetaData::Key::Date: + return PKEY_Media_DateEncoded; + case QMediaMetaData::Key::Composer: + return PKEY_Music_Composer; + case QMediaMetaData::Key::Duration: + return PKEY_Media_Duration; + case QMediaMetaData::Key::Language: + return PKEY_Language; + case QMediaMetaData::Key::Description: + return PKEY_Media_EncodingSettings; + case QMediaMetaData::Key::AudioBitRate: + return PKEY_Audio_EncodingBitrate; + case QMediaMetaData::Key::ContributingArtist: + return PKEY_Music_Artist; + case QMediaMetaData::Key::ThumbnailImage: + return PKEY_ThumbnailStream; + case QMediaMetaData::Key::Orientation: + return PKEY_Video_Orientation; + case QMediaMetaData::Key::VideoFrameRate: + return PKEY_Video_FrameRate; + case QMediaMetaData::Key::VideoBitRate: + return PKEY_Video_EncodingBitrate; + case QMediaMetaData::MediaType: + return PKEY_Media_ClassPrimaryID; + default: + return PKEY_Null; + } +} + +static void setStringProperty(IPropertyStore *content, REFPROPERTYKEY key, const QString &value) +{ + PROPVARIANT propValue = {}; + if (SUCCEEDED(InitPropVariantFromString(reinterpret_cast<LPCWSTR>(value.utf16()), &propValue))) { + if (SUCCEEDED(PSCoerceToCanonicalValue(key, &propValue))) + content->SetValue(key, propValue); + PropVariantClear(&propValue); + } +} + +static void setUInt32Property(IPropertyStore *content, REFPROPERTYKEY key, quint32 value) +{ + PROPVARIANT propValue = {}; + if (SUCCEEDED(InitPropVariantFromUInt32(ULONG(value), &propValue))) { + if (SUCCEEDED(PSCoerceToCanonicalValue(key, &propValue))) + content->SetValue(key, propValue); + PropVariantClear(&propValue); + } +} + +static void setUInt64Property(IPropertyStore *content, REFPROPERTYKEY key, quint64 value) +{ + PROPVARIANT propValue = {}; + if (SUCCEEDED(InitPropVariantFromUInt64(ULONGLONG(value), &propValue))) { + if (SUCCEEDED(PSCoerceToCanonicalValue(key, &propValue))) + content->SetValue(key, propValue); + PropVariantClear(&propValue); + } +} + +static void setFileTimeProperty(IPropertyStore *content, REFPROPERTYKEY key, const FILETIME *ft) +{ + PROPVARIANT propValue = {}; + if (SUCCEEDED(InitPropVariantFromFileTime(ft, &propValue))) { + if (SUCCEEDED(PSCoerceToCanonicalValue(key, &propValue))) + content->SetValue(key, propValue); + PropVariantClear(&propValue); + } +} + +void MFMetaData::toNative(const QMediaMetaData &metaData, IPropertyStore *content) +{ + if (content) { + + for (const auto &key : metaData.keys()) { + + QVariant value = metaData.value(key); + + if (key == QMediaMetaData::Key::MediaType) { + + QString strValue = metaData.stringValue(key); + QString v; + + // Sets property to one of the MediaClassPrimaryID values defined by Microsoft: + // https://docs.microsoft.com/en-us/windows/win32/wmformat/wm-mediaprimaryid + if (strValue == QLatin1String("Music")) + v = QLatin1String("{D1607DBC-E323-4BE2-86A1-48A42A28441E}"); + else if (strValue == QLatin1String("Video")) + v = QLatin1String("{DB9830BD-3AB3-4FAB-8A37-1A995F7FF74B}"); + else if (strValue == QLatin1String("Audio")) + v = QLatin1String("{01CD0F29-DA4E-4157-897B-6275D50C4F11}"); + else + v = QLatin1String("{FCF24A76-9A57-4036-990D-E35DD8B244E1}"); + + setStringProperty(content, PKEY_Media_ClassPrimaryID, v); + + } else if (key == QMediaMetaData::Key::Duration) { + + setUInt64Property(content, PKEY_Media_Duration, value.toULongLong() * 10000); + + } else if (key == QMediaMetaData::Key::Resolution) { + + QSize res = value.toSize(); + setUInt32Property(content, PKEY_Video_FrameWidth, quint32(res.width())); + setUInt32Property(content, PKEY_Video_FrameHeight, quint32(res.height())); + + } else if (key == QMediaMetaData::Key::Orientation) { + + setUInt32Property(content, PKEY_Video_Orientation, value.toUInt()); + + } else if (key == QMediaMetaData::Key::VideoFrameRate) { + + qreal fps = value.toReal(); + setUInt32Property(content, PKEY_Video_FrameRate, quint32(fps * 1000)); + + } else if (key == QMediaMetaData::Key::TrackNumber) { + + setUInt32Property(content, PKEY_Music_TrackNumber, value.toUInt()); + + } else if (key == QMediaMetaData::Key::AudioBitRate) { + + setUInt32Property(content, PKEY_Audio_EncodingBitrate, value.toUInt()); + + } else if (key == QMediaMetaData::Key::VideoBitRate) { + + setUInt32Property(content, PKEY_Video_EncodingBitrate, value.toUInt()); + + } else if (key == QMediaMetaData::Key::Date) { + + // Convert QDateTime to FILETIME by converting to 100-nsecs since + // 01/01/1970 UTC and adding the difference from 1601 to 1970. + ULARGE_INTEGER t = {}; + t.QuadPart = ULONGLONG(value.toDateTime().toUTC().toMSecsSinceEpoch() * 10000 + + 116444736000000000LL); + + FILETIME ft = {}; + ft.dwHighDateTime = t.HighPart; + ft.dwLowDateTime = t.LowPart; + + setFileTimeProperty(content, PKEY_Media_DateEncoded, &ft); + + } else { + + // By default use as string and let PSCoerceToCanonicalValue() + // do validation and type conversion. + REFPROPERTYKEY propKey = propertyKeyForMetaDataKey(key); + + if (propKey != PKEY_Null) { + QString strValue = metaData.stringValue(key); + if (!strValue.isEmpty()) + setStringProperty(content, propKey, strValue); + } + } + } + } +} + diff --git a/src/multimedia/platform/windows/player/mfmetadata_p.h b/src/multimedia/platform/windows/common/mfmetadata_p.h index 813b42cf3..d1846e9c5 100644 --- a/src/multimedia/platform/windows/player/mfmetadata_p.h +++ b/src/multimedia/platform/windows/common/mfmetadata_p.h @@ -60,6 +60,7 @@ class MFMetaData { public: static QMediaMetaData fromNative(IMFMediaSource* mediaSource); + static void toNative(const QMediaMetaData &metaData, IPropertyStore *content); }; #endif diff --git a/src/multimedia/platform/windows/decoder/mfaudiodecodercontrol.cpp b/src/multimedia/platform/windows/decoder/mfaudiodecodercontrol.cpp index 953281f31..7a460533d 100644 --- a/src/multimedia/platform/windows/decoder/mfaudiodecodercontrol.cpp +++ b/src/multimedia/platform/windows/decoder/mfaudiodecodercontrol.cpp @@ -44,8 +44,6 @@ MFAudioDecoderControl::MFAudioDecoderControl(QAudioDecoder *parent) : QPlatformAudioDecoder(parent) , m_decoderSourceReader(new MFDecoderSourceReader) , m_sourceResolver(new SourceResolver) - , m_resampler(0) - , m_state(QAudioDecoder::StoppedState) , m_device(0) , m_mfInputStreamID(0) , m_mfOutputStreamID(0) @@ -56,21 +54,10 @@ MFAudioDecoderControl::MFAudioDecoderControl(QAudioDecoder *parent) , m_mfOutputType(0) , m_convertSample(0) , m_sourceReady(false) - , m_resamplerDirty(false) { - CoCreateInstance(CLSID_CResamplerMediaObject, NULL, CLSCTX_INPROC_SERVER, IID_IMFTransform, (LPVOID*)(&m_resampler)); - if (!m_resampler) { - qCritical("MFAudioDecoderControl: Failed to create resampler(CLSID_CResamplerMediaObject)!"); - return; - } - m_resampler->AddInputStreams(1, &m_mfInputStreamID); - connect(m_sourceResolver, SIGNAL(mediaSourceReady()), this, SLOT(handleMediaSourceReady())); connect(m_sourceResolver, SIGNAL(error(long)), this, SLOT(handleMediaSourceError(long))); connect(m_decoderSourceReader, SIGNAL(finished()), this, SLOT(handleSourceFinished())); - - QAudioFormat defaultFormat; - setAudioFormat(defaultFormat); } MFAudioDecoderControl::~MFAudioDecoderControl() @@ -80,13 +67,6 @@ MFAudioDecoderControl::~MFAudioDecoderControl() m_decoderSourceReader->shutdown(); m_decoderSourceReader->Release(); m_sourceResolver->Release(); - if (m_resampler) - m_resampler->Release(); -} - -QAudioDecoder::State MFAudioDecoderControl::state() const -{ - return m_state; } QUrl MFAudioDecoderControl::source() const @@ -107,9 +87,9 @@ void MFAudioDecoderControl::onSourceCleared() durationDirty = true; } if (positionDirty) - emit positionChanged(m_position); + positionChanged(m_position); if (durationDirty) - emit durationChanged(m_duration); + durationChanged(m_duration); } void MFAudioDecoderControl::setSource(const QUrl &fileName) @@ -118,7 +98,7 @@ void MFAudioDecoderControl::setSource(const QUrl &fileName) return; m_sourceReady = false; m_sourceResolver->cancel(); - m_decoderSourceReader->setSource(0, m_audioFormat); + m_decoderSourceReader->setSource(nullptr); m_device = 0; m_source = fileName; if (!m_source.isEmpty()) { @@ -128,7 +108,7 @@ void MFAudioDecoderControl::setSource(const QUrl &fileName) } else { onSourceCleared(); } - emit sourceChanged(); + sourceChanged(); } QIODevice* MFAudioDecoderControl::sourceDevice() const @@ -142,7 +122,7 @@ void MFAudioDecoderControl::setSourceDevice(QIODevice *device) return; m_sourceReady = false; m_sourceResolver->cancel(); - m_decoderSourceReader->setSource(0, m_audioFormat); + m_decoderSourceReader->setSource(nullptr); m_source.clear(); m_device = device; if (m_device) { @@ -152,48 +132,17 @@ void MFAudioDecoderControl::setSourceDevice(QIODevice *device) } else { onSourceCleared(); } - emit sourceChanged(); -} - -void MFAudioDecoderControl::updateResamplerOutputType() -{ - m_resamplerDirty = false; - if (m_audioFormat == m_sourceOutputFormat) - return; - HRESULT hr = m_resampler->SetOutputType(m_mfOutputStreamID, m_mfOutputType, 0); - if (SUCCEEDED(hr)) { - MFT_OUTPUT_STREAM_INFO streamInfo; - m_resampler->GetOutputStreamInfo(m_mfOutputStreamID, &streamInfo); - if ((streamInfo.dwFlags & (MFT_OUTPUT_STREAM_PROVIDES_SAMPLES | MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES)) == 0) { - //if resampler does not allocate output sample memory, we do it here - if (m_convertSample) { - m_convertSample->Release(); - m_convertSample = 0; - } - if (SUCCEEDED(MFCreateSample(&m_convertSample))) { - IMFMediaBuffer *mbuf = 0;; - if (SUCCEEDED(MFCreateMemoryBuffer(streamInfo.cbSize, &mbuf))) { - m_convertSample->AddBuffer(mbuf); - mbuf->Release(); - } - } - } - } else { - qWarning() << "MFAudioDecoderControl: failed to SetOutputType of resampler" << hr; - } + sourceChanged(); } void MFAudioDecoderControl::handleMediaSourceReady() { m_loadingSource = false; m_sourceReady = true; - IMFMediaType *mediaType = m_decoderSourceReader->setSource(m_sourceResolver->mediaSource(), m_audioFormat); + IMFMediaType *mediaType = m_decoderSourceReader->setSource(m_sourceResolver->mediaSource()); m_sourceOutputFormat = QAudioFormat(); if (mediaType) { - m_sourceOutputFormat = m_audioFormat; - QAudioFormat af = m_audioFormat; - UINT32 val = 0; if (SUCCEEDED(mediaType->GetUINT32(MF_MT_AUDIO_NUM_CHANNELS, &val))) { m_sourceOutputFormat.setChannelCount(int(val)); @@ -210,30 +159,15 @@ void MFAudioDecoderControl::handleMediaSourceReady() m_sourceOutputFormat.setSampleFormat(QAudioFormat::Float); } else if (bitsPerSample == 8) { m_sourceOutputFormat.setSampleFormat(QAudioFormat::UInt8); - } else { + } else if (bitsPerSample == 16) { m_sourceOutputFormat.setSampleFormat(QAudioFormat::Int16); + } else if (bitsPerSample == 32){ + m_sourceOutputFormat.setSampleFormat(QAudioFormat::Int32); } } - - if (m_audioFormat.channelCount() <= 0) { - af.setChannelCount(m_sourceOutputFormat.channelCount()); - } - if (m_audioFormat.sampleRate() <= 0) { - af.setSampleRate(m_sourceOutputFormat.sampleRate()); - } - setAudioFormat(af); } if (m_sourceResolver->mediaSource()) { - if (mediaType && m_resampler) { - HRESULT hr = S_OK; - hr = m_resampler->SetInputType(m_mfInputStreamID, mediaType, 0); - if (SUCCEEDED(hr)) { - updateResamplerOutputType(); - } else { - qWarning() << "MFAudioDecoderControl: failed to SetInputType of resampler" << hr; - } - } IMFPresentationDescriptor *pd; if (SUCCEEDED(m_sourceResolver->mediaSource()->CreatePresentationDescriptor(&pd))) { UINT64 duration = 0; @@ -242,15 +176,14 @@ void MFAudioDecoderControl::handleMediaSourceReady() duration /= 10000; if (m_duration != qint64(duration)) { m_duration = qint64(duration); - emit durationChanged(m_duration); + durationChanged(m_duration); } } - if (m_state == QAudioDecoder::DecodingState) { + if (isDecoding()) { activatePipeline(); } - } else if (m_state != QAudioDecoder::StoppedState) { - m_state = QAudioDecoder::StoppedState; - emit stateChanged(m_state); + } else if (isDecoding()) { + setIsDecoding(false); } } @@ -258,58 +191,49 @@ void MFAudioDecoderControl::handleMediaSourceError(long hr) { Q_UNUSED(hr); m_loadingSource = false; - m_decoderSourceReader->setSource(0, m_audioFormat); - if (m_state != QAudioDecoder::StoppedState) { - m_state = QAudioDecoder::StoppedState; - emit stateChanged(m_state); - } + m_decoderSourceReader->setSource(nullptr); + setIsDecoding(false); } void MFAudioDecoderControl::activatePipeline() { Q_ASSERT(!m_bufferReady); - m_state = QAudioDecoder::DecodingState; + setIsDecoding(true); connect(m_decoderSourceReader, SIGNAL(sampleAdded()), this, SLOT(handleSampleAdded())); - if (m_resamplerDirty) { - updateResamplerOutputType(); - } m_decoderSourceReader->reset(); m_decoderSourceReader->readNextSample(); if (m_position != 0) { m_position = 0; - emit positionChanged(0); + positionChanged(0); } } void MFAudioDecoderControl::start() { - if (m_state != QAudioDecoder::StoppedState) + if (isDecoding()) return; if (m_loadingSource) { //deferred starting - m_state = QAudioDecoder::DecodingState; - emit stateChanged(m_state); + setIsDecoding(true); return; } if (!m_decoderSourceReader->mediaSource()) return; activatePipeline(); - emit stateChanged(m_state); } void MFAudioDecoderControl::stop() { - if (m_state == QAudioDecoder::StoppedState) + if (!isDecoding()) return; - m_state = QAudioDecoder::StoppedState; disconnect(m_decoderSourceReader, SIGNAL(sampleAdded()), this, SLOT(handleSampleAdded())); if (m_bufferReady) { m_bufferReady = false; emit bufferAvailableChanged(m_bufferReady); } - emit stateChanged(m_state); + setIsDecoding(false); } void MFAudioDecoderControl::handleSampleAdded() @@ -317,64 +241,29 @@ void MFAudioDecoderControl::handleSampleAdded() QList<IMFSample*> samples = m_decoderSourceReader->takeSamples(); Q_ASSERT(samples.count() > 0); Q_ASSERT(!m_bufferReady); - Q_ASSERT(m_resampler); LONGLONG sampleStartTime = 0; IMFSample *firstSample = samples.first(); firstSample->GetSampleTime(&sampleStartTime); QByteArray abuf; - if (m_sourceOutputFormat == m_audioFormat) { - //no need for resampling - for (IMFSample *s : qAsConst(samples)) { - IMFMediaBuffer *buffer; - s->ConvertToContiguousBuffer(&buffer); - DWORD bufLen = 0; - BYTE *buf = 0; - if (SUCCEEDED(buffer->Lock(&buf, NULL, &bufLen))) { - abuf.push_back(QByteArray(reinterpret_cast<char*>(buf), bufLen)); - buffer->Unlock(); - } - buffer->Release(); - LONGLONG sampleTime = 0, sampleDuration = 0; - s->GetSampleTime(&sampleTime); - s->GetSampleDuration(&sampleDuration); - m_position = qint64(sampleTime + sampleDuration) / 10000; - s->Release(); - } - } else { - for (IMFSample *s : qAsConst(samples)) { - HRESULT hr = m_resampler->ProcessInput(m_mfInputStreamID, s, 0); - if (SUCCEEDED(hr)) { - MFT_OUTPUT_DATA_BUFFER outputDataBuffer; - outputDataBuffer.dwStreamID = m_mfOutputStreamID; - while (true) { - outputDataBuffer.pEvents = 0; - outputDataBuffer.dwStatus = 0; - outputDataBuffer.pSample = m_convertSample; - DWORD status = 0; - if (SUCCEEDED(m_resampler->ProcessOutput(0, 1, &outputDataBuffer, &status))) { - IMFMediaBuffer *buffer; - outputDataBuffer.pSample->ConvertToContiguousBuffer(&buffer); - DWORD bufLen = 0; - BYTE *buf = 0; - if (SUCCEEDED(buffer->Lock(&buf, NULL, &bufLen))) { - abuf.push_back(QByteArray(reinterpret_cast<char*>(buf), bufLen)); - buffer->Unlock(); - } - buffer->Release(); - } else { - break; - } - } - } - LONGLONG sampleTime = 0, sampleDuration = 0; - s->GetSampleTime(&sampleTime); - s->GetSampleDuration(&sampleDuration); - m_position = qint64(sampleTime + sampleDuration) / 10000; - s->Release(); + for (IMFSample *s : qAsConst(samples)) { + IMFMediaBuffer *buffer; + s->ConvertToContiguousBuffer(&buffer); + DWORD bufLen = 0; + BYTE *buf = 0; + if (SUCCEEDED(buffer->Lock(&buf, NULL, &bufLen))) { + abuf.push_back(QByteArray(reinterpret_cast<char*>(buf), bufLen)); + buffer->Unlock(); } + buffer->Release(); + LONGLONG sampleTime = 0, sampleDuration = 0; + s->GetSampleTime(&sampleTime); + s->GetSampleDuration(&sampleDuration); + m_position = qint64(sampleTime + sampleDuration) / 10000; + s->Release(); } + // WMF uses 100-nanosecond units, QAudioDecoder uses milliseconds, QAudioBuffer uses microseconds... - m_cachedAudioBuffer = QAudioBuffer(abuf, m_audioFormat, qint64(sampleStartTime / 10)); + m_cachedAudioBuffer = QAudioBuffer(abuf, m_sourceOutputFormat, qint64(sampleStartTime / 10)); m_bufferReady = true; emit positionChanged(m_position); emit bufferAvailableChanged(m_bufferReady); @@ -387,54 +276,6 @@ void MFAudioDecoderControl::handleSourceFinished() emit finished(); } -QAudioFormat MFAudioDecoderControl::audioFormat() const -{ - return m_audioFormat; -} - -void MFAudioDecoderControl::setAudioFormat(const QAudioFormat &format) -{ - if (m_audioFormat == format || !m_resampler) - return; - m_audioFormat = format; - - if (m_audioFormat.isValid()) { - IMFMediaType *mediaType = 0; - MFCreateMediaType(&mediaType); - mediaType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio); - if (format.sampleFormat() == QAudioFormat::Float) { - mediaType->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_Float); - } else { - mediaType->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_PCM); - } - - mediaType->SetUINT32(MF_MT_AUDIO_NUM_CHANNELS, UINT32(m_audioFormat.channelCount())); - mediaType->SetUINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, UINT32(m_audioFormat.sampleRate())); - UINT32 alignmentBlock = UINT32(m_audioFormat.bytesPerFrame()); - mediaType->SetUINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, alignmentBlock); - UINT32 avgBytesPerSec = UINT32(m_audioFormat.sampleRate() * m_audioFormat.bytesPerFrame()); - mediaType->SetUINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, avgBytesPerSec); - mediaType->SetUINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, UINT32(m_audioFormat.bytesPerSample()*8)); - mediaType->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE); - - if (m_mfOutputType) - m_mfOutputType->Release(); - m_mfOutputType = mediaType; - } else { - if (m_mfOutputType) - m_mfOutputType->Release(); - m_mfOutputType = NULL; - } - - if (m_sourceReady && m_state == QAudioDecoder::StoppedState) { - updateResamplerOutputType(); - } else { - m_resamplerDirty = true; - } - - emit formatChanged(m_audioFormat); -} - QAudioBuffer MFAudioDecoderControl::read() { if (!m_bufferReady) diff --git a/src/multimedia/platform/windows/decoder/mfaudiodecodercontrol_p.h b/src/multimedia/platform/windows/decoder/mfaudiodecodercontrol_p.h index 56edb95c0..8cd769e67 100644 --- a/src/multimedia/platform/windows/decoder/mfaudiodecodercontrol_p.h +++ b/src/multimedia/platform/windows/decoder/mfaudiodecodercontrol_p.h @@ -64,8 +64,6 @@ public: MFAudioDecoderControl(QAudioDecoder *parent); ~MFAudioDecoderControl(); - QAudioDecoder::State state() const; - QUrl source() const; void setSource(const QUrl &fileName); @@ -75,9 +73,6 @@ public: void start(); void stop(); - QAudioFormat audioFormat() const; - void setAudioFormat(const QAudioFormat &format); - QAudioBuffer read(); bool bufferAvailable() const; @@ -91,17 +86,13 @@ private Q_SLOTS: void handleSourceFinished(); private: - void updateResamplerOutputType(); void activatePipeline(); void onSourceCleared(); MFDecoderSourceReader *m_decoderSourceReader; SourceResolver *m_sourceResolver; - IMFTransform *m_resampler; - QAudioDecoder::State m_state; QUrl m_source; QIODevice *m_device; - QAudioFormat m_audioFormat; DWORD m_mfInputStreamID; DWORD m_mfOutputStreamID; bool m_bufferReady; @@ -113,7 +104,6 @@ private: IMFSample *m_convertSample; QAudioFormat m_sourceOutputFormat; bool m_sourceReady; - bool m_resamplerDirty; }; #endif//MFAUDIODECODERCONTROL_H diff --git a/src/multimedia/platform/windows/decoder/mfdecodersourcereader.cpp b/src/multimedia/platform/windows/decoder/mfdecodersourcereader.cpp index 381c60dc5..d10839a63 100644 --- a/src/multimedia/platform/windows/decoder/mfdecodersourcereader.cpp +++ b/src/multimedia/platform/windows/decoder/mfdecodersourcereader.cpp @@ -64,7 +64,7 @@ IMFMediaSource* MFDecoderSourceReader::mediaSource() return m_source; } -IMFMediaType* MFDecoderSourceReader::setSource(IMFMediaSource *source, const QAudioFormat &audioFormat) +IMFMediaType* MFDecoderSourceReader::setSource(IMFMediaSource *source) { IMFMediaType *mediaType = NULL; if (m_source == source) @@ -90,12 +90,7 @@ IMFMediaType* MFDecoderSourceReader::setSource(IMFMediaSource *source, const QAu IMFMediaType *pPartialType = NULL; MFCreateMediaType(&pPartialType); pPartialType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio); - - if (audioFormat.sampleFormat() == QAudioFormat::Float) { - pPartialType->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_Float); - } else { - pPartialType->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_PCM); - } + pPartialType->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_PCM); m_sourceReader->SetCurrentMediaType(DWORD(MF_SOURCE_READER_FIRST_AUDIO_STREAM), NULL, pPartialType); pPartialType->Release(); diff --git a/src/multimedia/platform/windows/decoder/mfdecodersourcereader_p.h b/src/multimedia/platform/windows/decoder/mfdecodersourcereader_p.h index 7d63f5368..6730dbf7f 100644 --- a/src/multimedia/platform/windows/decoder/mfdecodersourcereader_p.h +++ b/src/multimedia/platform/windows/decoder/mfdecodersourcereader_p.h @@ -69,7 +69,7 @@ public: void shutdown(); IMFMediaSource* mediaSource(); - IMFMediaType* setSource(IMFMediaSource *source, const QAudioFormat &audioFormat); + IMFMediaType* setSource(IMFMediaSource *source); void reset(); void readNextSample(); diff --git a/src/multimedia/platform/windows/mediacapture/qwindowscamera.cpp b/src/multimedia/platform/windows/mediacapture/qwindowscamera.cpp index 8be1ab1e1..d5e8ecc97 100644 --- a/src/multimedia/platform/windows/mediacapture/qwindowscamera.cpp +++ b/src/multimedia/platform/windows/mediacapture/qwindowscamera.cpp @@ -68,28 +68,6 @@ void QWindowsCamera::setActive(bool active) m_mediaDeviceSession->setActive(active); emit activeChanged(m_active); - updateStatus(); -} - -QCamera::Status QWindowsCamera::status() const -{ - if (!m_mediaDeviceSession) - return QCamera::InactiveStatus; - - if (m_active) - return m_mediaDeviceSession->isActive() ? QCamera::ActiveStatus : QCamera::StartingStatus; - - return m_mediaDeviceSession->isActive() ? QCamera::StoppingStatus : QCamera::InactiveStatus; -} - -void QWindowsCamera::updateStatus() -{ - QCamera::Status newStatus = status(); - - if (m_lastStatus != newStatus) { - m_lastStatus = newStatus; - statusChanged(m_lastStatus); - } } void QWindowsCamera::setCamera(const QCameraDevice &camera) @@ -107,8 +85,11 @@ void QWindowsCamera::setCaptureSession(QPlatformMediaCaptureSession *session) if (m_captureService == captureService) return; - if (m_mediaDeviceSession) + if (m_mediaDeviceSession) { m_mediaDeviceSession->setActive(false); + m_mediaDeviceSession->setCameraFormat({}); + m_mediaDeviceSession->setActiveCamera({}); + } m_captureService = captureService; if (!m_captureService) { @@ -118,7 +99,7 @@ void QWindowsCamera::setCaptureSession(QPlatformMediaCaptureSession *session) m_mediaDeviceSession = m_captureService->session(); Q_ASSERT(m_mediaDeviceSession); - connect(m_mediaDeviceSession, SIGNAL(activeChanged(bool)), SLOT(updateStatus())); + connect(m_mediaDeviceSession, SIGNAL(activeChanged(bool)), SLOT(setActive(bool))); m_mediaDeviceSession->setActiveCamera(m_cameraDevice); m_mediaDeviceSession->setCameraFormat(m_cameraFormat); diff --git a/src/multimedia/platform/windows/mediacapture/qwindowscamera_p.h b/src/multimedia/platform/windows/mediacapture/qwindowscamera_p.h index 1665c492d..c1dce1e7b 100644 --- a/src/multimedia/platform/windows/mediacapture/qwindowscamera_p.h +++ b/src/multimedia/platform/windows/mediacapture/qwindowscamera_p.h @@ -66,9 +66,6 @@ public: virtual ~QWindowsCamera(); bool isActive() const override; - void setActive(bool active) override; - - QCamera::Status status() const override; void setCamera(const QCameraDevice &camera) override; @@ -77,14 +74,13 @@ public: bool setCameraFormat(const QCameraFormat &format) override; private Q_SLOTS: - void updateStatus(); + void setActive(bool active) override; private: QWindowsMediaCaptureService *m_captureService = nullptr; QWindowsMediaDeviceSession *m_mediaDeviceSession = nullptr; QCameraDevice m_cameraDevice; QCameraFormat m_cameraFormat; - QCamera::Status m_lastStatus = QCamera::InactiveStatus; bool m_active = false; }; diff --git a/src/multimedia/platform/windows/mediacapture/qwindowscameraimagecapture.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsimagecapture.cpp index b4499d61c..0c5e188ca 100644 --- a/src/multimedia/platform/windows/mediacapture/qwindowscameraimagecapture.cpp +++ b/src/multimedia/platform/windows/mediacapture/qwindowsimagecapture.cpp @@ -37,7 +37,7 @@ ** ****************************************************************************/ -#include "qwindowscameraimagecapture_p.h" +#include "qwindowsimagecapture_p.h" #include "qwindowsmediadevicesession_p.h" #include "qwindowsmediacapture_p.h" @@ -47,21 +47,21 @@ QT_BEGIN_NAMESPACE -QWindowsCameraImageCapture::QWindowsCameraImageCapture(QCameraImageCapture *parent) - : QPlatformCameraImageCapture(parent) +QWindowsImageCapture::QWindowsImageCapture(QImageCapture *parent) + : QPlatformImageCapture(parent) { } -QWindowsCameraImageCapture::~QWindowsCameraImageCapture() = default; +QWindowsImageCapture::~QWindowsImageCapture() = default; -bool QWindowsCameraImageCapture::isReadyForCapture() const +bool QWindowsImageCapture::isReadyForCapture() const { if (!m_mediaDeviceSession) return false; return !m_capturing && m_mediaDeviceSession->isActive() && !m_mediaDeviceSession->activeCamera().isNull(); } -int QWindowsCameraImageCapture::capture(const QString &fileName) +int QWindowsImageCapture::capture(const QString &fileName) { QString ext = writerFormat(m_settings.format()); QString path = m_storageLocation.generateFileName(fileName, QWindowsStorageLocation::Image, @@ -69,12 +69,12 @@ int QWindowsCameraImageCapture::capture(const QString &fileName) return doCapture(path); } -int QWindowsCameraImageCapture::captureToBuffer() +int QWindowsImageCapture::captureToBuffer() { return doCapture(QString()); } -int QWindowsCameraImageCapture::doCapture(const QString &fileName) +int QWindowsImageCapture::doCapture(const QString &fileName) { if (!isReadyForCapture()) return -1; @@ -83,17 +83,17 @@ int QWindowsCameraImageCapture::doCapture(const QString &fileName) return m_captureId; } -QImageEncoderSettings QWindowsCameraImageCapture::imageSettings() const +QImageEncoderSettings QWindowsImageCapture::imageSettings() const { return m_settings; } -void QWindowsCameraImageCapture::setImageSettings(const QImageEncoderSettings &settings) +void QWindowsImageCapture::setImageSettings(const QImageEncoderSettings &settings) { m_settings = settings; } -void QWindowsCameraImageCapture::setCaptureSession(QPlatformMediaCaptureSession *session) +void QWindowsImageCapture::setCaptureSession(QPlatformMediaCaptureSession *session) { QWindowsMediaCaptureService *captureService = static_cast<QWindowsMediaCaptureService *>(session); if (m_captureService == captureService) @@ -118,7 +118,7 @@ void QWindowsCameraImageCapture::setCaptureSession(QPlatformMediaCaptureSession this, SLOT(handleNewVideoFrame(QVideoFrame))); } -void QWindowsCameraImageCapture::handleNewVideoFrame(const QVideoFrame &frame) +void QWindowsImageCapture::handleNewVideoFrame(const QVideoFrame &frame) { if (m_capturing) { @@ -136,7 +136,7 @@ void QWindowsCameraImageCapture::handleNewVideoFrame(const QVideoFrame &frame) if (!m_fileName.isEmpty()) { - (void)QtConcurrent::run(&QWindowsCameraImageCapture::saveImage, this, + (void)QtConcurrent::run(&QWindowsImageCapture::saveImage, this, m_captureId, m_fileName, image, metaData, m_settings); } @@ -145,7 +145,7 @@ void QWindowsCameraImageCapture::handleNewVideoFrame(const QVideoFrame &frame) } } -void QWindowsCameraImageCapture::saveImage(int captureId, const QString &fileName, +void QWindowsImageCapture::saveImage(int captureId, const QString &fileName, const QImage &image, const QMediaMetaData &metaData, const QImageEncoderSettings &settings) { @@ -169,21 +169,21 @@ void QWindowsCameraImageCapture::saveImage(int captureId, const QString &fileNam Q_ARG(int, captureId), Q_ARG(QString, fileName)); } -QString QWindowsCameraImageCapture::writerFormat(QCameraImageCapture::FileFormat reqFormat) +QString QWindowsImageCapture::writerFormat(QImageCapture::FileFormat reqFormat) { QString format; switch (reqFormat) { - case QCameraImageCapture::FileFormat::JPEG: + case QImageCapture::FileFormat::JPEG: format = QLatin1String("jpg"); break; - case QCameraImageCapture::FileFormat::PNG: + case QImageCapture::FileFormat::PNG: format = QLatin1String("png"); break; - case QCameraImageCapture::FileFormat::WebP: + case QImageCapture::FileFormat::WebP: format = QLatin1String("webp"); break; - case QCameraImageCapture::FileFormat::Tiff: + case QImageCapture::FileFormat::Tiff: format = QLatin1String("tiff"); break; default: @@ -198,22 +198,22 @@ QString QWindowsCameraImageCapture::writerFormat(QCameraImageCapture::FileFormat return QLatin1String("jpg"); } -int QWindowsCameraImageCapture::writerQuality(const QString &writerFormat, - QCameraImageCapture::Quality quality) +int QWindowsImageCapture::writerQuality(const QString &writerFormat, + QImageCapture::Quality quality) { if (writerFormat.compare(QLatin1String("jpg"), Qt::CaseInsensitive) == 0 || writerFormat.compare(QLatin1String("jpeg"), Qt::CaseInsensitive) == 0) { switch (quality) { - case QCameraImageCapture::Quality::VeryLowQuality: + case QImageCapture::Quality::VeryLowQuality: return 10; - case QCameraImageCapture::Quality::LowQuality: + case QImageCapture::Quality::LowQuality: return 30; - case QCameraImageCapture::Quality::NormalQuality: + case QImageCapture::Quality::NormalQuality: return 75; - case QCameraImageCapture::Quality::HighQuality: + case QImageCapture::Quality::HighQuality: return 90; - case QCameraImageCapture::Quality::VeryHighQuality: + case QImageCapture::Quality::VeryHighQuality: return 98; default: return 75; diff --git a/src/multimedia/platform/windows/mediacapture/qwindowscameraimagecapture_p.h b/src/multimedia/platform/windows/mediacapture/qwindowsimagecapture_p.h index 4cd405454..cafc71087 100644 --- a/src/multimedia/platform/windows/mediacapture/qwindowscameraimagecapture_p.h +++ b/src/multimedia/platform/windows/mediacapture/qwindowsimagecapture_p.h @@ -37,8 +37,8 @@ ** ****************************************************************************/ -#ifndef QWINDOWSCAMERAIMAGECAPTURE_H -#define QWINDOWSCAMERAIMAGECAPTURE_H +#ifndef QWindowsImageCapture_H +#define QWindowsImageCapture_H // // W A R N I N G @@ -53,19 +53,19 @@ #include "qwindowsstoragelocation_p.h" -#include <private/qplatformcameraimagecapture_p.h> +#include <private/qplatformimagecapture_p.h> QT_BEGIN_NAMESPACE class QWindowsMediaDeviceSession; class QWindowsMediaCaptureService; -class QWindowsCameraImageCapture : public QPlatformCameraImageCapture +class QWindowsImageCapture : public QPlatformImageCapture { Q_OBJECT public: - explicit QWindowsCameraImageCapture(QCameraImageCapture *parent); - virtual ~QWindowsCameraImageCapture(); + explicit QWindowsImageCapture(QImageCapture *parent); + virtual ~QWindowsImageCapture(); bool isReadyForCapture() const override; @@ -85,9 +85,9 @@ private: void saveImage(int captureId, const QString &fileName, const QImage &image, const QMediaMetaData &metaData, const QImageEncoderSettings &settings); - QString writerFormat(QCameraImageCapture::FileFormat reqFormat); + QString writerFormat(QImageCapture::FileFormat reqFormat); int writerQuality(const QString &writerFormat, - QCameraImageCapture::Quality quality); + QImageCapture::Quality quality); QWindowsMediaCaptureService *m_captureService = nullptr; QWindowsMediaDeviceSession *m_mediaDeviceSession = nullptr; @@ -100,4 +100,4 @@ private: QT_END_NAMESPACE -#endif // QWINDOWSCAMERAIMAGECAPTURE_H +#endif // QWindowsImageCapture_H diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture.cpp index 043e3ac41..34be2e7cb 100644 --- a/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture.cpp +++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture.cpp @@ -42,7 +42,7 @@ #include "qwindowsmediaencoder_p.h" #include "qwindowscamera_p.h" #include "qwindowsmediadevicesession_p.h" -#include "qwindowscameraimagecapture_p.h" +#include "qwindowsimagecapture_p.h" #include "qmediadevices.h" #include "qaudiodevice.h" #include "qplatformaudioinput_p.h" @@ -79,14 +79,14 @@ void QWindowsMediaCaptureService::setCamera(QPlatformCamera *camera) emit cameraChanged(); } -QPlatformCameraImageCapture *QWindowsMediaCaptureService::imageCapture() +QPlatformImageCapture *QWindowsMediaCaptureService::imageCapture() { return m_imageCapture; } -void QWindowsMediaCaptureService::setImageCapture(QPlatformCameraImageCapture *imageCapture) +void QWindowsMediaCaptureService::setImageCapture(QPlatformImageCapture *imageCapture) { - QWindowsCameraImageCapture *control = static_cast<QWindowsCameraImageCapture *>(imageCapture); + QWindowsImageCapture *control = static_cast<QWindowsImageCapture *>(imageCapture); if (m_imageCapture == control) return; diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture_p.h b/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture_p.h index f5da2f498..a1a167a6d 100644 --- a/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture_p.h +++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediacapture_p.h @@ -58,7 +58,7 @@ QT_BEGIN_NAMESPACE class QWindowsMediaEncoder; class QWindowsCamera; class QWindowsMediaDeviceSession; -class QWindowsCameraImageCapture; +class QWindowsImageCapture; class QPlatformAudioInput; class QWindowsMediaCaptureService : public QPlatformMediaCaptureSession @@ -72,8 +72,8 @@ public: QPlatformCamera *camera() override; void setCamera(QPlatformCamera *camera) override; - QPlatformCameraImageCapture *imageCapture() override; - void setImageCapture(QPlatformCameraImageCapture *imageCapture) override; + QPlatformImageCapture *imageCapture() override; + void setImageCapture(QPlatformImageCapture *imageCapture) override; QPlatformMediaEncoder *mediaEncoder() override; void setMediaEncoder(QPlatformMediaEncoder *encoder) override; @@ -87,7 +87,7 @@ public: private: QWindowsCamera *m_camera = nullptr; QWindowsMediaDeviceSession *m_mediaDeviceSession = nullptr; - QWindowsCameraImageCapture *m_imageCapture = nullptr; + QWindowsImageCapture *m_imageCapture = nullptr; QWindowsMediaEncoder *m_encoder = nullptr; }; diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp index 1ecd8af0b..28c387d2e 100644 --- a/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp +++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp @@ -41,9 +41,11 @@ #include "qwindowsmediadevicesession_p.h" #include "qwindowsmediacapture_p.h" +#include "mfmetadata_p.h" #include <QtCore/QUrl> #include <QtCore/QMimeType> #include <Mferror.h> +#include <shobjidl.h> QT_BEGIN_NAMESPACE @@ -56,14 +58,8 @@ QWindowsMediaEncoder::QWindowsMediaEncoder(QMediaRecorder *parent) m_settings.mimeType(); } -QUrl QWindowsMediaEncoder::outputLocation() const +bool QWindowsMediaEncoder::isLocationWritable(const QUrl &location) const { - return m_outputLocation; -} - -bool QWindowsMediaEncoder::setOutputLocation(const QUrl &location) -{ - m_outputLocation = location; return location.scheme() == QLatin1String("file") || location.scheme().isEmpty(); } @@ -128,21 +124,21 @@ void QWindowsMediaEncoder::setState(QMediaRecorder::RecorderState state) const bool audioOnly = m_settings.videoCodec() == QMediaFormat::VideoCodec::Unspecified; - const QString path = (m_outputLocation.scheme() == QLatin1String("file") ? - m_outputLocation.path() : m_outputLocation.toString()); + const QString path = (outputLocation().scheme() == QLatin1String("file") ? + outputLocation().path() : outputLocation().toString()); - QString fileName = m_storageLocation.generateFileName(path, audioOnly - ? QWindowsStorageLocation::Audio - : QWindowsStorageLocation::Video, - QLatin1String("clip_"), - m_settings.mimeType().preferredSuffix()); + m_fileName = m_storageLocation.generateFileName(path, audioOnly + ? QWindowsStorageLocation::Audio + : QWindowsStorageLocation::Video, + QLatin1String("clip_"), + m_settings.mimeType().preferredSuffix()); - if (m_mediaDeviceSession->startRecording(fileName, audioOnly)) { + if (m_mediaDeviceSession->startRecording(m_fileName, audioOnly)) { m_state = QMediaRecorder::RecordingState; m_lastStatus = QMediaRecorder::StartingStatus; - actualLocationChanged(QUrl::fromLocalFile(fileName)); + actualLocationChanged(QUrl::fromLocalFile(m_fileName)); stateChanged(m_state); statusChanged(m_lastStatus); @@ -203,6 +199,35 @@ void QWindowsMediaEncoder::setCaptureSession(QPlatformMediaCaptureSession *sessi onCameraChanged(); } +void QWindowsMediaEncoder::setMetaData(const QMediaMetaData &metaData) +{ + m_metaData = metaData; +} + +QMediaMetaData QWindowsMediaEncoder::metaData() const +{ + return m_metaData; +} + +void QWindowsMediaEncoder::saveMetadata() +{ + if (!m_metaData.isEmpty()) { + + const QString nativeFileName = QDir::toNativeSeparators(m_fileName); + + IPropertyStore *store = nullptr; + + if (SUCCEEDED(SHGetPropertyStoreFromParsingName(reinterpret_cast<LPCWSTR>(nativeFileName.utf16()), + nullptr, GPS_READWRITE, IID_PPV_ARGS(&store)))) { + + MFMetaData::toNative(m_metaData, store); + + store->Commit(); + store->Release(); + } + } +} + void QWindowsMediaEncoder::onDurationChanged(qint64 duration) { m_duration = duration; @@ -235,6 +260,8 @@ void QWindowsMediaEncoder::onRecordingStarted() void QWindowsMediaEncoder::onRecordingStopped() { + saveMetadata(); + auto lastState = m_state; auto lastStatus = m_lastStatus; m_state = QMediaRecorder::StoppedState; diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder_p.h b/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder_p.h index ffa73b428..f7ec37b03 100644 --- a/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder_p.h +++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder_p.h @@ -70,8 +70,7 @@ class QWindowsMediaEncoder : public QObject, public QPlatformMediaEncoder public: explicit QWindowsMediaEncoder(QMediaRecorder *parent); - QUrl outputLocation() const override; - bool setOutputLocation(const QUrl &location) override; + bool isLocationWritable(const QUrl &location) const override; QMediaRecorder::RecorderState state() const override; QMediaRecorder::Status status() const override; qint64 duration() const override; @@ -79,6 +78,9 @@ public: void setEncoderSettings(const QMediaEncoderSettings &settings) override; + void setMetaData(const QMediaMetaData &metaData) override; + QMediaMetaData metaData() const override; + void setCaptureSession(QPlatformMediaCaptureSession *session); public Q_SLOTS: @@ -92,13 +94,16 @@ private Q_SLOTS: void onStreamingError(int errorCode); private: + void saveMetadata(); + QWindowsMediaCaptureService *m_captureService = nullptr; QWindowsMediaDeviceSession *m_mediaDeviceSession = nullptr; - QUrl m_outputLocation; QMediaRecorder::RecorderState m_state = QMediaRecorder::StoppedState; QMediaRecorder::Status m_lastStatus = QMediaRecorder::StoppedStatus; QMediaEncoderSettings m_settings; QWindowsStorageLocation m_storageLocation; + QString m_fileName; + QMediaMetaData m_metaData; qint64 m_duration = 0; }; diff --git a/src/multimedia/platform/windows/player/mfplayersession.cpp b/src/multimedia/platform/windows/player/mfplayersession.cpp index 1fa05c33a..50a022fc3 100644 --- a/src/multimedia/platform/windows/player/mfplayersession.cpp +++ b/src/multimedia/platform/windows/player/mfplayersession.cpp @@ -53,7 +53,7 @@ #include "mfplayercontrol_p.h" #include "mfevrvideowindowcontrol_p.h" #include "mfvideorenderercontrol_p.h" -#include "mfmetadata_p.h" +#include <private/mfmetadata_p.h> #include "mfplayersession_p.h" #include <mferror.h> diff --git a/src/multimedia/platform/windows/qwindowsformatinfo.cpp b/src/multimedia/platform/windows/qwindowsformatinfo.cpp index 2e308ffbe..cda24d6eb 100644 --- a/src/multimedia/platform/windows/qwindowsformatinfo.cpp +++ b/src/multimedia/platform/windows/qwindowsformatinfo.cpp @@ -81,7 +81,7 @@ QWindowsFormatInfo::QWindowsFormatInfo() }; // #### - imageFormats = { QCameraImageCapture::JPEG, QCameraImageCapture::PNG }; + imageFormats = { QImageCapture::JPEG, QImageCapture::PNG }; } diff --git a/src/multimedia/platform/windows/qwindowsintegration.cpp b/src/multimedia/platform/windows/qwindowsintegration.cpp index 7509205a4..8f259beb7 100644 --- a/src/multimedia/platform/windows/qwindowsintegration.cpp +++ b/src/multimedia/platform/windows/qwindowsintegration.cpp @@ -41,7 +41,7 @@ #include <private/qwindowsmediadevices_p.h> #include <private/qwindowsformatinfo_p.h> #include <private/qwindowsmediacapture_p.h> -#include <private/qwindowscameraimagecapture_p.h> +#include <private/qwindowsimagecapture_p.h> #include <private/qwindowscamera_p.h> #include <private/qwindowsmediaencoder_p.h> #include <private/mfplayercontrol_p.h> @@ -113,9 +113,9 @@ QPlatformMediaEncoder *QWindowsIntegration::createEncoder(QMediaRecorder *encode return new QWindowsMediaEncoder(encoder); } -QPlatformCameraImageCapture *QWindowsIntegration::createImageCapture(QCameraImageCapture *imageCapture) +QPlatformImageCapture *QWindowsIntegration::createImageCapture(QImageCapture *imageCapture) { - return new QWindowsCameraImageCapture(imageCapture); + return new QWindowsImageCapture(imageCapture); } QPlatformVideoSink *QWindowsIntegration::createVideoSink(QVideoSink *sink) diff --git a/src/multimedia/platform/windows/qwindowsintegration_p.h b/src/multimedia/platform/windows/qwindowsintegration_p.h index 9d3c9b836..44edf8900 100644 --- a/src/multimedia/platform/windows/qwindowsintegration_p.h +++ b/src/multimedia/platform/windows/qwindowsintegration_p.h @@ -76,7 +76,7 @@ public: QPlatformMediaPlayer *createPlayer(QMediaPlayer *parent) override; QPlatformCamera *createCamera(QCamera *camera) override; QPlatformMediaEncoder *createEncoder(QMediaRecorder *encoder) override; - QPlatformCameraImageCapture *createImageCapture(QCameraImageCapture *imageCapture) override; + QPlatformImageCapture *createImageCapture(QImageCapture *imageCapture) override; QPlatformVideoSink *createVideoSink(QVideoSink *sink) override; diff --git a/src/multimedia/qmediaformat.cpp b/src/multimedia/qmediaformat.cpp index c91b23425..ca9fc0cd3 100644 --- a/src/multimedia/qmediaformat.cpp +++ b/src/multimedia/qmediaformat.cpp @@ -432,8 +432,7 @@ bool QMediaFormat::operator==(const QMediaFormat &other) const */ void QMediaFormat::resolveForEncoding(ResolveFlags flags) { - if (isSupported(Encode)) - return; + const bool requiresVideo = (flags & ResolveFlags::RequiresVideo) != 0; QMediaFormat nullFormat; auto supportedFormats = nullFormat.supportedFileFormats(QMediaFormat::Encode); @@ -456,6 +455,10 @@ void QMediaFormat::resolveForEncoding(ResolveFlags flags) return *list; }; + // reset format if it does not support video when video is required + if (requiresVideo && this->supportedVideoCodecs(QMediaFormat::Encode).isEmpty()) + fmt = QMediaFormat::UnspecifiedFormat; + // reset non supported formats and codecs if (!supportedFormats.contains(fmt)) fmt = QMediaFormat::UnspecifiedFormat; @@ -464,7 +467,7 @@ void QMediaFormat::resolveForEncoding(ResolveFlags flags) if ((flags == NoFlags) || !supportedVideoCodecs.contains(video)) video = QMediaFormat::VideoCodec::Unspecified; - if (!(flags == NoFlags)) { + if (requiresVideo) { // try finding a file format that is supported if (fmt == QMediaFormat::UnspecifiedFormat) fmt = bestSupportedFileFormat(audio, video); @@ -483,7 +486,7 @@ void QMediaFormat::resolveForEncoding(ResolveFlags flags) return; // find a working video codec - if (!(flags == NoFlags)) { + if (requiresVideo) { // reset the audio codec, so that we won't throw away the video codec // if it is supported (choosing the specified video codec has higher // priority than the specified audio codec) diff --git a/src/multimedia/qmediaformat.h b/src/multimedia/qmediaformat.h index 68dc16103..b74ac39ec 100644 --- a/src/multimedia/qmediaformat.h +++ b/src/multimedia/qmediaformat.h @@ -115,6 +115,7 @@ public: Encode, Decode }; + Q_ENUM(ConversionMode) enum ResolveFlags { @@ -146,13 +147,13 @@ public: void setAudioCodec(AudioCodec codec) { audio = codec; } AudioCodec audioCodec() const { return audio; } - bool isSupported(ConversionMode mode) const; + Q_INVOKABLE bool isSupported(ConversionMode mode) const; QMimeType mimeType() const; - QList<QMediaFormat::FileFormat> supportedFileFormats(ConversionMode m); - QList<QMediaFormat::VideoCodec> supportedVideoCodecs(ConversionMode m); - QList<QMediaFormat::AudioCodec> supportedAudioCodecs(ConversionMode m); + Q_INVOKABLE QList<QMediaFormat::FileFormat> supportedFileFormats(ConversionMode m); + Q_INVOKABLE QList<QMediaFormat::VideoCodec> supportedVideoCodecs(ConversionMode m); + Q_INVOKABLE QList<QMediaFormat::AudioCodec> supportedAudioCodecs(ConversionMode m); static QString fileFormatName(QMediaFormat::FileFormat c); static QString audioCodecName(QMediaFormat::AudioCodec c); diff --git a/src/multimedia/recording/qmediacapturesession.cpp b/src/multimedia/recording/qmediacapturesession.cpp index d82800e35..90cd27066 100644 --- a/src/multimedia/recording/qmediacapturesession.cpp +++ b/src/multimedia/recording/qmediacapturesession.cpp @@ -41,7 +41,7 @@ #include "qaudiodevice.h" #include "qcamera.h" #include "qmediarecorder.h" -#include "qcameraimagecapture.h" +#include "qimagecapture.h" #include "qvideosink.h" #include <qpointer.h> @@ -61,7 +61,7 @@ public: QAudioInput *audioInput = nullptr; QAudioOutput *audioOutput = nullptr; QCamera *camera = nullptr; - QCameraImageCapture *imageCapture = nullptr; + QImageCapture *imageCapture = nullptr; QMediaRecorder *encoder = nullptr; QVideoSink *videoSink = nullptr; QPointer<QObject> videoOutput; @@ -94,13 +94,13 @@ public: A preview of the captured media can be seen by setting a QVideoSink of QVideoWidget using setVideoOutput() and heard by routing the audio to an output device using setAudioOutput(). - You can capture still images from a camera by setting a QCameraImageCapture object on the capture session, + You can capture still images from a camera by setting a QImageCapture object on the capture session, and record audio/video using a QMediaRecorder. If you need a simple class that records media from the default camera and microphone, you can use QMediaRecorder. That class uses a QMediaCaptureSession behind the scene to support audio and video capture. - \sa QCamera, QAudioDevice, QMediaRecorder, QCameraImageCapture, QMediaRecorder + \sa QCamera, QAudioDevice, QMediaRecorder, QImageCapture, QMediaRecorder */ /*! @@ -112,6 +112,7 @@ QMediaCaptureSession::QMediaCaptureSession(QObject *parent) { d_ptr->q = this; d_ptr->captureSession = QPlatformMediaIntegration::instance()->createCaptureSession(); + Q_ASSERT(d_ptr->captureSession); } /*! @@ -131,14 +132,6 @@ QMediaCaptureSession::~QMediaCaptureSession() } /*! - Returns false if media capture is not supported. - */ -bool QMediaCaptureSession::isAvailable() const -{ - return d_ptr->captureSession != nullptr; -} - -/*! Returns the device that is being used to capture audio. */ QAudioInput *QMediaCaptureSession::audioInput() const @@ -194,15 +187,15 @@ void QMediaCaptureSession::setCamera(QCamera *camera) \brief the object used to capture still images. - Add a QCameraImageCapture object to the capture session to enable + Add a QImageCapture object to the capture session to enable capturing of still images from the camera. */ -QCameraImageCapture *QMediaCaptureSession::imageCapture() +QImageCapture *QMediaCaptureSession::imageCapture() { return d_ptr->imageCapture; } -void QMediaCaptureSession::setImageCapture(QCameraImageCapture *imageCapture) +void QMediaCaptureSession::setImageCapture(QImageCapture *imageCapture) { if (d_ptr->imageCapture == imageCapture) return; diff --git a/src/multimedia/recording/qmediacapturesession.h b/src/multimedia/recording/qmediacapturesession.h index 8d662a3bd..50ece6aff 100644 --- a/src/multimedia/recording/qmediacapturesession.h +++ b/src/multimedia/recording/qmediacapturesession.h @@ -49,7 +49,7 @@ class QCamera; class QAudioInput; class QAudioOutput; class QCameraDevice; -class QCameraImageCapture; // ### rename to QMediaImageCapture +class QImageCapture; // ### rename to QMediaImageCapture class QMediaRecorder; class QPlatformMediaCaptureSession; class QVideoSink; @@ -60,31 +60,29 @@ class Q_MULTIMEDIA_EXPORT QMediaCaptureSession : public QObject Q_OBJECT Q_PROPERTY(QAudioInput *audioInput READ audioInput WRITE setAudioInput NOTIFY audioInputChanged) Q_PROPERTY(QCamera *camera READ camera WRITE setCamera NOTIFY cameraChanged) - Q_PROPERTY(QCameraImageCapture *imageCapture READ imageCapture WRITE setImageCapture NOTIFY imageCaptureChanged) + Q_PROPERTY(QImageCapture *imageCapture READ imageCapture WRITE setImageCapture NOTIFY imageCaptureChanged) Q_PROPERTY(QMediaRecorder *encoder READ encoder WRITE setEncoder NOTIFY encoderChanged) Q_PROPERTY(QObject *videoOutput READ videoOutput WRITE setVideoOutput NOTIFY videoOutputChanged) public: explicit QMediaCaptureSession(QObject *parent = nullptr); ~QMediaCaptureSession(); - bool isAvailable() const; - QAudioInput *audioInput() const; void setAudioInput(QAudioInput *device); QCamera *camera() const; void setCamera(QCamera *camera); - QCameraImageCapture *imageCapture(); - void setImageCapture(QCameraImageCapture *imageCapture); + QImageCapture *imageCapture(); + void setImageCapture(QImageCapture *imageCapture); QMediaRecorder *encoder(); void setEncoder(QMediaRecorder *recorder); - void setVideoOutput(QObject *preview); + void setVideoOutput(QObject *output); QObject *videoOutput() const; - void setVideoSink(QVideoSink *preview); + void setVideoSink(QVideoSink *sink); QVideoSink *videoSink() const; void setAudioOutput(QAudioOutput *output); diff --git a/src/multimedia/recording/qmediarecorder.cpp b/src/multimedia/recording/qmediarecorder.cpp index 69a07ada3..2091980ac 100644 --- a/src/multimedia/recording/qmediarecorder.cpp +++ b/src/multimedia/recording/qmediarecorder.cpp @@ -144,12 +144,11 @@ void QMediaRecorder::setCaptureSession(QMediaCaptureSession *session) Setting the location can fail, for example when the service supports only local file system locations but a network URL was passed. If the service - does not support media recording this setting the output location will - always fail. + does not support media recording, setting the output location will + always fail. If the operation fails an errorOccured signal is emitted. The \a location can be relative or empty; - in this case the encoder uses the system specific place and file naming scheme. - After recording has stated, QMediaRecorder::outputLocation() returns the actual output location. + in the latter case the encoder uses the system specific place and file naming scheme. */ /*! @@ -175,15 +174,17 @@ QUrl QMediaRecorder::outputLocation() const return d_func()->control ? d_func()->control->outputLocation() : QUrl(); } -bool QMediaRecorder::setOutputLocation(const QUrl &location) +void QMediaRecorder::setOutputLocation(const QUrl &location) { Q_D(QMediaRecorder); - if (!d->control) - return false; + if (!d->control) { + emit errorOccurred(QMediaRecorder::ResourceError, tr("Not available")); + return; + } + d->control->setOutputLocation(location); d->control->clearActualLocation(); - if (d->control && d->captureSession) - return d->control->setOutputLocation(location); - return false; + if (!location.isEmpty() && !d->control->isLocationWritable(location)) + emit errorOccurred(QMediaRecorder::LocationNotWritable, tr("Output location not writable")); } QUrl QMediaRecorder::actualLocation() const diff --git a/src/multimedia/recording/qmediarecorder.h b/src/multimedia/recording/qmediarecorder.h index d92cd3ec9..d65d516b1 100644 --- a/src/multimedia/recording/qmediarecorder.h +++ b/src/multimedia/recording/qmediarecorder.h @@ -116,7 +116,8 @@ public: NoError, ResourceError, FormatError, - OutOfSpaceError + OutOfSpaceError, + LocationNotWritable }; Q_ENUM(Error) @@ -126,7 +127,7 @@ public: bool isAvailable() const; QUrl outputLocation() const; - bool setOutputLocation(const QUrl &location); + void setOutputLocation(const QUrl &location); QUrl actualLocation() const; diff --git a/src/multimediaquick/qquickimagecapture.cpp b/src/multimediaquick/qquickimagecapture.cpp index 27f655c85..76a25db46 100644 --- a/src/multimediaquick/qquickimagecapture.cpp +++ b/src/multimediaquick/qquickimagecapture.cpp @@ -87,7 +87,7 @@ QT_BEGIN_NAMESPACE */ QQuickImageCapture::QQuickImageCapture(QObject *parent) - : QCameraImageCapture(parent) + : QImageCapture(parent) { connect(this, SIGNAL(imageCaptured(int,QImage)), this, SLOT(_q_imageCaptured(int,QImage))); } diff --git a/src/multimediaquick/qquickimagecapture_p.h b/src/multimediaquick/qquickimagecapture_p.h index f01d95ecf..9b88232c0 100644 --- a/src/multimediaquick/qquickimagecapture_p.h +++ b/src/multimediaquick/qquickimagecapture_p.h @@ -52,7 +52,7 @@ // #include <qcamera.h> -#include <qcameraimagecapture.h> +#include <qimagecapture.h> #include <qmediametadata.h> #include <QtQml/qqml.h> @@ -61,7 +61,7 @@ QT_BEGIN_NAMESPACE class QUrl; -class QQuickImageCapture : public QCameraImageCapture +class QQuickImageCapture : public QImageCapture { Q_OBJECT Q_PROPERTY(QString preview READ preview NOTIFY previewChanged) diff --git a/src/multimediaquick/qtmultimediaquicktypes_p.h b/src/multimediaquick/qtmultimediaquicktypes_p.h index f44e3245b..dc4de9450 100644 --- a/src/multimediaquick/qtmultimediaquicktypes_p.h +++ b/src/multimediaquick/qtmultimediaquicktypes_p.h @@ -85,10 +85,10 @@ struct QCameraForeign QML_NAMED_ELEMENT(Camera) }; -struct QCameraImageCaptureForeign +struct QImageCaptureForeign { Q_GADGET - QML_FOREIGN(QCameraImageCapture) + QML_FOREIGN(QImageCapture) QML_NAMED_ELEMENT(ImageCapture) }; diff --git a/src/multimediawidgets/doc/snippets/multimedia-snippets/camera.cpp b/src/multimediawidgets/doc/snippets/multimedia-snippets/camera.cpp index a63bf50a9..f6984e7d3 100644 --- a/src/multimediawidgets/doc/snippets/multimedia-snippets/camera.cpp +++ b/src/multimediawidgets/doc/snippets/multimedia-snippets/camera.cpp @@ -41,12 +41,12 @@ // Extracted from src/multimedia/doc/snippets/multimedia-snippets/camera.cpp #include "qcamera.h" #include "qvideowidget.h" -#include "qcameraimagecapture.h" +#include "qimagecapture.h" /* Globals so that everything is consistent. */ QCamera *camera = 0; QCameraViewfinder *viewfinder = 0; -QCameraImageCapture *imageCapture = 0; +QImageCapture *imageCapture = 0; void camera_blah() { @@ -58,7 +58,7 @@ void camera_blah() camera->setViewfinder(viewfinder); - imageCapture = new QCameraImageCapture(camera); + imageCapture = new QImageCapture(camera); camera->setCaptureMode(QCamera::CaptureStillImage); camera->start(); diff --git a/tests/auto/integration/qaudiodecoderbackend/tst_qaudiodecoderbackend.cpp b/tests/auto/integration/qaudiodecoderbackend/tst_qaudiodecoderbackend.cpp index 8a948e905..5e32efa16 100644 --- a/tests/auto/integration/qaudiodecoderbackend/tst_qaudiodecoderbackend.cpp +++ b/tests/auto/integration/qaudiodecoderbackend/tst_qaudiodecoderbackend.cpp @@ -72,7 +72,7 @@ void tst_QAudioDecoderBackend::init() void tst_QAudioDecoderBackend::initTestCase() { QAudioDecoder d; - if (!d.isAvailable()) + if (!d.isSupported()) QSKIP("Audio decoder service is not available"); } @@ -102,30 +102,29 @@ void tst_QAudioDecoderBackend::fileTest() int byteCount = 0; int sampleCount = 0; - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QVERIFY(d.bufferAvailable() == false); QCOMPARE(d.source(), QString("")); - QVERIFY(d.audioFormat() == QAudioFormat()); // Test local file QFileInfo fileInfo(QFINDTESTDATA(TEST_FILE_NAME)); QUrl url = QUrl::fromLocalFile(fileInfo.absoluteFilePath()); d.setSource(url); - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QVERIFY(!d.bufferAvailable()); QCOMPARE(d.source(), url); QSignalSpy readySpy(&d, SIGNAL(bufferReady())); QSignalSpy bufferChangedSpy(&d, SIGNAL(bufferAvailableChanged(bool))); QSignalSpy errorSpy(&d, SIGNAL(error(QAudioDecoder::Error))); - QSignalSpy stateSpy(&d, SIGNAL(stateChanged(QAudioDecoder::State))); + QSignalSpy isDecodingSpy(&d, SIGNAL(isDecodingChanged(bool))); QSignalSpy durationSpy(&d, SIGNAL(durationChanged(qint64))); QSignalSpy finishedSpy(&d, SIGNAL(finished())); QSignalSpy positionSpy(&d, SIGNAL(positionChanged(qint64))); d.start(); - QTRY_VERIFY(d.state() == QAudioDecoder::DecodingState); - QTRY_VERIFY(!stateSpy.isEmpty()); + QTRY_VERIFY(d.isDecoding()); + QTRY_VERIFY(!isDecodingSpy.isEmpty()); QTRY_VERIFY(!readySpy.isEmpty()); QTRY_VERIFY(!bufferChangedSpy.isEmpty()); QVERIFY(d.bufferAvailable()); @@ -141,11 +140,6 @@ void tst_QAudioDecoderBackend::fileTest() QCOMPARE(buffer.format().sampleFormat(), QAudioFormat::Int16); QCOMPARE(buffer.byteCount(), buffer.sampleCount() * 2); // 16bit mono - // This does not make a lot of sense - // The decoder's audioFormat() should report the actual buffer format? - // // The decoder should still have no format set - // QVERIFY(d.audioFormat() == QAudioFormat()); - QVERIFY(errorSpy.isEmpty()); duration += buffer.duration(); @@ -179,94 +173,10 @@ void tst_QAudioDecoderBackend::fileTest() QVERIFY(qAbs((d.position() + (buffer.duration() / 1000)) - 1000) < 20); QTRY_COMPARE(finishedSpy.count(), 1); QVERIFY(!d.bufferAvailable()); - QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); - - d.stop(); - QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); - QTRY_COMPARE(durationSpy.count(), 2); - QCOMPARE(d.duration(), qint64(-1)); - QVERIFY(!d.bufferAvailable()); - readySpy.clear(); - bufferChangedSpy.clear(); - stateSpy.clear(); - durationSpy.clear(); - finishedSpy.clear(); - positionSpy.clear(); - - // change output audio format - QAudioFormat format; - format.setChannelCount(2); - format.setSampleRate(11050); - format.setSampleFormat(QAudioFormat::UInt8); - - d.setAudioFormat(format); - - // We expect 1 second still, at 11050 * 2 samples == 22k samples. - // (at 1 byte/sample -> 22kb) - - // Make sure it stuck - QVERIFY(d.audioFormat() == format); - - duration = 0; - sampleCount = 0; - byteCount = 0; - - d.start(); - QTRY_VERIFY(d.state() == QAudioDecoder::DecodingState); - QTRY_VERIFY(!stateSpy.isEmpty()); - QTRY_VERIFY(!readySpy.isEmpty()); - QTRY_VERIFY(!bufferChangedSpy.isEmpty()); - QVERIFY(d.bufferAvailable()); - QTRY_VERIFY(!durationSpy.isEmpty()); - QVERIFY(qAbs(d.duration() - 1000) < 20); - - buffer = d.read(); - QVERIFY(buffer.isValid()); - // See if we got the right format - QVERIFY(buffer.format() == format); - - // The decoder should still have the same format - QVERIFY(d.audioFormat() == format); - - QVERIFY(errorSpy.isEmpty()); - - duration += buffer.duration(); - sampleCount += buffer.sampleCount(); - byteCount += buffer.byteCount(); - - // Now drain the decoder - if (duration < 998000) { - QTRY_COMPARE(d.bufferAvailable(), true); - } - - while (d.bufferAvailable()) { - buffer = d.read(); - QVERIFY(buffer.isValid()); - QTRY_VERIFY(!positionSpy.isEmpty()); - QVERIFY(positionSpy.takeLast().at(0).toLongLong() == qint64(duration / 1000)); - QVERIFY(d.position() - (duration / 1000) < 20); - - duration += buffer.duration(); - sampleCount += buffer.sampleCount(); - byteCount += buffer.byteCount(); - - if (duration < 998000) { - QTRY_COMPARE(d.bufferAvailable(), true); - } - } - - // Resampling might end up with fewer or more samples - // so be a bit sloppy - QVERIFY(qAbs(sampleCount - 22047) < 100); - QVERIFY(qAbs(byteCount - 22047) < 100); - QVERIFY(qAbs(qint64(duration) - 1000000) < 20000); - QVERIFY(qAbs((d.position() + (buffer.duration() / 1000)) - 1000) < 20); - QTRY_COMPARE(finishedSpy.count(), 1); - QVERIFY(!d.bufferAvailable()); - QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); + QTRY_VERIFY(!d.isDecoding()); d.stop(); - QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); + QTRY_VERIFY(!d.isDecoding()); QTRY_COMPARE(durationSpy.count(), 2); QCOMPARE(d.duration(), qint64(-1)); QVERIFY(!d.bufferAvailable()); @@ -282,31 +192,29 @@ void tst_QAudioDecoderBackend::unsupportedFileTest() QSKIP("There is no audio decoding support on this platform."); QAudioBuffer buffer; - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QVERIFY(d.bufferAvailable() == false); QCOMPARE(d.source(), QString("")); - QVERIFY(d.audioFormat() == QAudioFormat()); // Test local file QFileInfo fileInfo(QFINDTESTDATA(TEST_UNSUPPORTED_FILE_NAME)); QUrl url = QUrl::fromLocalFile(fileInfo.absoluteFilePath()); d.setSource(url); - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QVERIFY(!d.bufferAvailable()); QCOMPARE(d.source(), url); QSignalSpy readySpy(&d, SIGNAL(bufferReady())); QSignalSpy bufferChangedSpy(&d, SIGNAL(bufferAvailableChanged(bool))); QSignalSpy errorSpy(&d, SIGNAL(error(QAudioDecoder::Error))); - QSignalSpy stateSpy(&d, SIGNAL(stateChanged(QAudioDecoder::State))); + QSignalSpy isDecodingSpy(&d, SIGNAL(isDecodingChanged(bool))); QSignalSpy durationSpy(&d, SIGNAL(durationChanged(qint64))); QSignalSpy finishedSpy(&d, SIGNAL(finished())); QSignalSpy positionSpy(&d, SIGNAL(positionChanged(qint64))); d.start(); - QTRY_VERIFY(d.state() == QAudioDecoder::StoppedState); + QTRY_VERIFY(!d.isDecoding()); QVERIFY(!d.bufferAvailable()); - QCOMPARE(d.audioFormat(), QAudioFormat()); QCOMPARE(d.duration(), qint64(-1)); QCOMPARE(d.position(), qint64(-1)); @@ -321,7 +229,7 @@ void tst_QAudioDecoderBackend::unsupportedFileTest() // Check all other spies. QVERIFY(readySpy.isEmpty()); QVERIFY(bufferChangedSpy.isEmpty()); - QVERIFY(stateSpy.isEmpty()); + QVERIFY(isDecodingSpy.isEmpty()); QVERIFY(finishedSpy.isEmpty()); QVERIFY(positionSpy.isEmpty()); QVERIFY(durationSpy.isEmpty()); @@ -330,7 +238,7 @@ void tst_QAudioDecoderBackend::unsupportedFileTest() // Try read even if the file is not supported to test robustness. buffer = d.read(); - QTRY_VERIFY(d.state() == QAudioDecoder::StoppedState); + QTRY_VERIFY(!d.isDecoding()); QVERIFY(!buffer.isValid()); QVERIFY(!d.bufferAvailable()); QCOMPARE(d.position(), qint64(-1)); @@ -338,14 +246,14 @@ void tst_QAudioDecoderBackend::unsupportedFileTest() QVERIFY(errorSpy.isEmpty()); QVERIFY(readySpy.isEmpty()); QVERIFY(bufferChangedSpy.isEmpty()); - QVERIFY(stateSpy.isEmpty()); + QVERIFY(isDecodingSpy.isEmpty()); QVERIFY(finishedSpy.isEmpty()); QVERIFY(positionSpy.isEmpty()); QVERIFY(durationSpy.isEmpty()); d.stop(); - QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); + QTRY_VERIFY(!d.isDecoding()); QCOMPARE(d.duration(), qint64(-1)); QVERIFY(!d.bufferAvailable()); } @@ -361,31 +269,29 @@ void tst_QAudioDecoderBackend::corruptedFileTest() QSKIP("There is no audio decoding support on this platform."); QAudioBuffer buffer; - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QVERIFY(d.bufferAvailable() == false); QCOMPARE(d.source(), QUrl()); - QVERIFY(d.audioFormat() == QAudioFormat()); // Test local file QFileInfo fileInfo(QFINDTESTDATA(TEST_CORRUPTED_FILE_NAME)); QUrl url = QUrl::fromLocalFile(fileInfo.absoluteFilePath()); d.setSource(url); - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QVERIFY(!d.bufferAvailable()); QCOMPARE(d.source(), url); QSignalSpy readySpy(&d, SIGNAL(bufferReady())); QSignalSpy bufferChangedSpy(&d, SIGNAL(bufferAvailableChanged(bool))); QSignalSpy errorSpy(&d, SIGNAL(error(QAudioDecoder::Error))); - QSignalSpy stateSpy(&d, SIGNAL(stateChanged(QAudioDecoder::State))); + QSignalSpy isDecodingSpy(&d, SIGNAL(isDecodingChanged(bool))); QSignalSpy durationSpy(&d, SIGNAL(durationChanged(qint64))); QSignalSpy finishedSpy(&d, SIGNAL(finished())); QSignalSpy positionSpy(&d, SIGNAL(positionChanged(qint64))); d.start(); - QTRY_VERIFY(d.state() == QAudioDecoder::StoppedState); + QTRY_VERIFY(!d.isDecoding()); QVERIFY(!d.bufferAvailable()); - QCOMPARE(d.audioFormat(), QAudioFormat()); QCOMPARE(d.duration(), qint64(-1)); QCOMPARE(d.position(), qint64(-1)); @@ -400,7 +306,7 @@ void tst_QAudioDecoderBackend::corruptedFileTest() // Check all other spies. QVERIFY(readySpy.isEmpty()); QVERIFY(bufferChangedSpy.isEmpty()); - QVERIFY(stateSpy.isEmpty()); + QVERIFY(isDecodingSpy.isEmpty()); QVERIFY(finishedSpy.isEmpty()); QVERIFY(positionSpy.isEmpty()); QVERIFY(durationSpy.isEmpty()); @@ -409,7 +315,7 @@ void tst_QAudioDecoderBackend::corruptedFileTest() // Try read even if the file is corrupted to test the robustness. buffer = d.read(); - QTRY_VERIFY(d.state() == QAudioDecoder::StoppedState); + QTRY_VERIFY(!d.isDecoding()); QVERIFY(!buffer.isValid()); QVERIFY(!d.bufferAvailable()); QCOMPARE(d.position(), qint64(-1)); @@ -417,14 +323,14 @@ void tst_QAudioDecoderBackend::corruptedFileTest() QVERIFY(errorSpy.isEmpty()); QVERIFY(readySpy.isEmpty()); QVERIFY(bufferChangedSpy.isEmpty()); - QVERIFY(stateSpy.isEmpty()); + QVERIFY(isDecodingSpy.isEmpty()); QVERIFY(finishedSpy.isEmpty()); QVERIFY(positionSpy.isEmpty()); QVERIFY(durationSpy.isEmpty()); d.stop(); - QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); + QTRY_VERIFY(!d.isDecoding()); QCOMPARE(d.duration(), qint64(-1)); QVERIFY(!d.bufferAvailable()); } @@ -436,31 +342,29 @@ void tst_QAudioDecoderBackend::invalidSource() QSKIP("There is no audio decoding support on this platform."); QAudioBuffer buffer; - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QVERIFY(d.bufferAvailable() == false); QCOMPARE(d.source(), QUrl()); - QVERIFY(d.audioFormat() == QAudioFormat()); // Test invalid file source QFileInfo fileInfo(TEST_INVALID_SOURCE); QUrl url = QUrl::fromLocalFile(fileInfo.absoluteFilePath()); d.setSource(url); - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QVERIFY(!d.bufferAvailable()); QCOMPARE(d.source(), url); QSignalSpy readySpy(&d, SIGNAL(bufferReady())); QSignalSpy bufferChangedSpy(&d, SIGNAL(bufferAvailableChanged(bool))); QSignalSpy errorSpy(&d, SIGNAL(error(QAudioDecoder::Error))); - QSignalSpy stateSpy(&d, SIGNAL(stateChanged(QAudioDecoder::State))); + QSignalSpy isDecodingSpy(&d, SIGNAL(isDecodingChanged(bool))); QSignalSpy durationSpy(&d, SIGNAL(durationChanged(qint64))); QSignalSpy finishedSpy(&d, SIGNAL(finished())); QSignalSpy positionSpy(&d, SIGNAL(positionChanged(qint64))); d.start(); - QTRY_VERIFY(d.state() == QAudioDecoder::StoppedState); + QTRY_VERIFY(!d.isDecoding()); QVERIFY(!d.bufferAvailable()); - QCOMPARE(d.audioFormat(), QAudioFormat()); QCOMPARE(d.duration(), qint64(-1)); QCOMPARE(d.position(), qint64(-1)); @@ -475,7 +379,7 @@ void tst_QAudioDecoderBackend::invalidSource() // Check all other spies. QVERIFY(readySpy.isEmpty()); QVERIFY(bufferChangedSpy.isEmpty()); - QVERIFY(stateSpy.isEmpty()); + QVERIFY(isDecodingSpy.isEmpty()); QVERIFY(finishedSpy.isEmpty()); QVERIFY(positionSpy.isEmpty()); QVERIFY(durationSpy.isEmpty()); @@ -483,7 +387,7 @@ void tst_QAudioDecoderBackend::invalidSource() errorSpy.clear(); d.stop(); - QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); + QTRY_VERIFY(!d.isDecoding()); QCOMPARE(d.duration(), qint64(-1)); QVERIFY(!d.bufferAvailable()); @@ -493,9 +397,8 @@ void tst_QAudioDecoderBackend::invalidSource() d.setSourceDevice(&file); d.start(); - QTRY_VERIFY(d.state() == QAudioDecoder::StoppedState); + QTRY_VERIFY(!d.isDecoding()); QVERIFY(!d.bufferAvailable()); - QCOMPARE(d.audioFormat(), QAudioFormat()); QCOMPARE(d.duration(), qint64(-1)); QCOMPARE(d.position(), qint64(-1)); @@ -508,7 +411,7 @@ void tst_QAudioDecoderBackend::invalidSource() // Check all other spies. QVERIFY(readySpy.isEmpty()); QVERIFY(bufferChangedSpy.isEmpty()); - QVERIFY(stateSpy.isEmpty()); + QVERIFY(isDecodingSpy.isEmpty()); QVERIFY(finishedSpy.isEmpty()); QVERIFY(positionSpy.isEmpty()); QVERIFY(durationSpy.isEmpty()); @@ -516,7 +419,7 @@ void tst_QAudioDecoderBackend::invalidSource() errorSpy.clear(); d.stop(); - QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); + QTRY_VERIFY(!d.isDecoding()); QCOMPARE(d.duration(), qint64(-1)); QVERIFY(!d.bufferAvailable()); } @@ -536,15 +439,14 @@ void tst_QAudioDecoderBackend::deviceTest() QSignalSpy readySpy(&d, SIGNAL(bufferReady())); QSignalSpy bufferChangedSpy(&d, SIGNAL(bufferAvailableChanged(bool))); QSignalSpy errorSpy(&d, SIGNAL(error(QAudioDecoder::Error))); - QSignalSpy stateSpy(&d, SIGNAL(stateChanged(QAudioDecoder::State))); + QSignalSpy isDecodingSpy(&d, SIGNAL(isDecodingChanged(bool))); QSignalSpy durationSpy(&d, SIGNAL(durationChanged(qint64))); QSignalSpy finishedSpy(&d, SIGNAL(finished())); QSignalSpy positionSpy(&d, SIGNAL(positionChanged(qint64))); - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QVERIFY(d.bufferAvailable() == false); QCOMPARE(d.source(), QString("")); - QVERIFY(d.audioFormat() == QAudioFormat()); QFileInfo fileInfo(QFINDTESTDATA(TEST_FILE_NAME)); QFile file(fileInfo.absoluteFilePath()); @@ -554,13 +456,10 @@ void tst_QAudioDecoderBackend::deviceTest() QVERIFY(d.sourceDevice() == &file); QVERIFY(d.source().isEmpty()); - // We haven't set the format yet - QVERIFY(d.audioFormat() == QAudioFormat()); - d.start(); - QTRY_VERIFY(d.state() == QAudioDecoder::DecodingState); - QTRY_VERIFY(!stateSpy.isEmpty()); + QTRY_VERIFY(d.isDecoding()); + QTRY_VERIFY(!isDecodingSpy.isEmpty()); QTRY_VERIFY(!readySpy.isEmpty()); QTRY_VERIFY(!bufferChangedSpy.isEmpty()); QVERIFY(d.bufferAvailable()); @@ -605,52 +504,10 @@ void tst_QAudioDecoderBackend::deviceTest() QVERIFY(qAbs((d.position() + (buffer.duration() / 1000)) - 1000) < 20); QTRY_COMPARE(finishedSpy.count(), 1); QVERIFY(!d.bufferAvailable()); - QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); - - d.stop(); - QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); - QVERIFY(!d.bufferAvailable()); - QTRY_COMPARE(durationSpy.count(), 2); - QCOMPARE(d.duration(), qint64(-1)); - readySpy.clear(); - bufferChangedSpy.clear(); - stateSpy.clear(); - durationSpy.clear(); - finishedSpy.clear(); - positionSpy.clear(); - - // Now try changing formats - QAudioFormat format; - format.setChannelCount(2); - format.setSampleRate(8000); - format.setSampleFormat(QAudioFormat::UInt8); - - d.setAudioFormat(format); - - // Make sure it stuck - QVERIFY(d.audioFormat() == format); - - d.start(); - QTRY_VERIFY(d.state() == QAudioDecoder::DecodingState); - QTRY_VERIFY(!stateSpy.isEmpty()); - QTRY_VERIFY(!readySpy.isEmpty()); - QTRY_VERIFY(!bufferChangedSpy.isEmpty()); - QVERIFY(d.bufferAvailable()); - QTRY_VERIFY(!durationSpy.isEmpty()); - QVERIFY(qAbs(d.duration() - 1000) < 20); - - buffer = d.read(); - QVERIFY(buffer.isValid()); - // See if we got the right format - QVERIFY(buffer.format() == format); - - // The decoder should still have the same format - QVERIFY(d.audioFormat() == format); - - QVERIFY(errorSpy.isEmpty()); + QTRY_VERIFY(!d.isDecoding()); d.stop(); - QTRY_COMPARE(d.state(), QAudioDecoder::StoppedState); + QTRY_VERIFY(!d.isDecoding()); QVERIFY(!d.bufferAvailable()); QTRY_COMPARE(durationSpy.count(), 2); QCOMPARE(d.duration(), qint64(-1)); diff --git a/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp b/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp index 75e06a4a4..a656c1da0 100644 --- a/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp +++ b/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp @@ -33,10 +33,10 @@ #include <QDebug> #include <private/qplatformcamera_p.h> -#include <private/qplatformcameraimagecapture_p.h> +#include <private/qplatformimagecapture_p.h> #include <qcamera.h> #include <qcameradevice.h> -#include <qcameraimagecapture.h> +#include <qimagecapture.h> #include <qmediacapturesession.h> #include <qobject.h> #include <qmediadevices.h> @@ -158,16 +158,14 @@ void tst_QCameraBackend::testCameraStates() QMediaCaptureSession session; QCamera camera; camera.setCameraDevice(QCameraDevice()); - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); QSignalSpy errorSignal(&camera, SIGNAL(errorOccurred(QCamera::Error, const QString &))); QSignalSpy activeChangedSignal(&camera, SIGNAL(activeChanged(bool))); - QSignalSpy statusChangedSignal(&camera, SIGNAL(statusChanged(QCamera::Status))); QCOMPARE(camera.isActive(), false); - QCOMPARE(camera.status(), QCamera::InactiveStatus); // Camera should not startup with a null QCameraDevice as device camera.start(); @@ -182,14 +180,10 @@ void tst_QCameraBackend::testCameraStates() QCOMPARE(camera.isActive(), true); QTRY_COMPARE(activeChangedSignal.size(), 1); QCOMPARE(activeChangedSignal.last().first().value<bool>(), true); - QTRY_COMPARE(camera.status(), QCamera::ActiveStatus); - QCOMPARE(statusChangedSignal.last().first().value<QCamera::Status>(), QCamera::ActiveStatus); camera.stop(); QCOMPARE(camera.isActive(), false); QCOMPARE(activeChangedSignal.last().first().value<bool>(), false); - QTRY_COMPARE(camera.status(), QCamera::InactiveStatus); - QCOMPARE(statusChangedSignal.last().first().value<QCamera::Status>(), QCamera::InactiveStatus); QCOMPARE(camera.errorString(), QString()); } @@ -212,7 +206,6 @@ void tst_QCameraBackend::testCameraStartParallel() camera2.start(); QCOMPARE(camera1.isActive(), true); - QTRY_COMPARE(camera1.status(), QCamera::ActiveStatus); QCOMPARE(camera1.error(), QCamera::NoError); QCOMPARE(camera2.isActive(), true); QCOMPARE(camera2.error(), QCamera::NoError); @@ -225,7 +218,7 @@ void tst_QCameraBackend::testCameraCapture() { QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); @@ -236,11 +229,11 @@ void tst_QCameraBackend::testCameraCapture() QSignalSpy capturedSignal(&imageCapture, SIGNAL(imageCaptured(int,QImage))); QSignalSpy savedSignal(&imageCapture, SIGNAL(imageSaved(int,QString))); - QSignalSpy errorSignal(&imageCapture, SIGNAL(errorOccurred(int,QCameraImageCapture::Error,const QString&))); + QSignalSpy errorSignal(&imageCapture, SIGNAL(errorOccurred(int,QImageCapture::Error,const QString&))); imageCapture.captureToFile(); QTRY_COMPARE(errorSignal.size(), 1); - QCOMPARE(imageCapture.error(), QCameraImageCapture::NotReadyError); + QCOMPARE(imageCapture.error(), QImageCapture::NotReadyError); QCOMPARE(capturedSignal.size(), 0); errorSignal.clear(); @@ -250,7 +243,7 @@ void tst_QCameraBackend::testCameraCapture() camera.start(); QTRY_VERIFY(imageCapture.isReadyForCapture()); - QCOMPARE(camera.status(), QCamera::ActiveStatus); + QVERIFY(camera.isActive()); QCOMPARE(errorSignal.size(), 0); int id = imageCapture.captureToFile(); @@ -260,7 +253,7 @@ void tst_QCameraBackend::testCameraCapture() QTRY_COMPARE(capturedSignal.size(), 1); QCOMPARE(capturedSignal.last().first().toInt(), id); QCOMPARE(errorSignal.size(), 0); - QCOMPARE(imageCapture.error(), QCameraImageCapture::NoError); + QCOMPARE(imageCapture.error(), QImageCapture::NoError); QCOMPARE(savedSignal.last().first().toInt(), id); QString location = savedSignal.last().last().toString(); @@ -281,7 +274,7 @@ void tst_QCameraBackend::testCaptureToBuffer() QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); @@ -289,12 +282,12 @@ void tst_QCameraBackend::testCaptureToBuffer() camera.setActive(true); - QTRY_COMPARE(camera.status(), QCamera::ActiveStatus); + QTRY_VERIFY(camera.isActive()); QSignalSpy capturedSignal(&imageCapture, SIGNAL(imageCaptured(int,QImage))); QSignalSpy imageAvailableSignal(&imageCapture, SIGNAL(imageAvailable(int,QVideoFrame))); QSignalSpy savedSignal(&imageCapture, SIGNAL(imageSaved(int,QString))); - QSignalSpy errorSignal(&imageCapture, SIGNAL(errorOccurred(int,QCameraImageCapture::Error,const QString&))); + QSignalSpy errorSignal(&imageCapture, SIGNAL(errorOccurred(int,QImageCapture::Error,const QString&))); camera.start(); QTRY_VERIFY(imageCapture.isReadyForCapture()); @@ -330,7 +323,7 @@ void tst_QCameraBackend::testCameraCaptureMetadata() QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); @@ -377,7 +370,7 @@ void tst_QCameraBackend::testExposureCompensation() //exposure compensation should be preserved during start camera.start(); - QTRY_COMPARE(camera.status(), QCamera::ActiveStatus); + QTRY_VERIFY(camera.isActive()); QCOMPARE(camera.exposureCompensation(), 1.0); @@ -407,7 +400,7 @@ void tst_QCameraBackend::testExposureMode() } camera.stop(); - QTRY_COMPARE(camera.status(), QCamera::InactiveStatus); + QTRY_VERIFY(!camera.isActive()); // Auto camera.setExposureMode(QCamera::ExposureAuto); @@ -472,7 +465,7 @@ void tst_QCameraBackend::testVideoRecording() } QTRY_VERIFY(camera->isActive()); - QTRY_COMPARE(camera->status(), QCamera::ActiveStatus); + QTRY_VERIFY(camera->isActive()); QTRY_COMPARE(recorder.status(), QMediaRecorder::StoppedStatus); for (int recordings = 0; recordings < 2; ++recordings) { diff --git a/tests/auto/unit/mockbackend/qmockaudiodecoder.h b/tests/auto/unit/mockbackend/qmockaudiodecoder.h index 24cd98756..a106a83d2 100644 --- a/tests/auto/unit/mockbackend/qmockaudiodecoder.h +++ b/tests/auto/unit/mockbackend/qmockaudiodecoder.h @@ -49,7 +49,6 @@ class QMockAudioDecoder : public QPlatformAudioDecoder public: QMockAudioDecoder(QAudioDecoder *parent = 0) : QPlatformAudioDecoder(parent) - , mState(QAudioDecoder::StoppedState) , mDevice(0) , mPosition(-1) , mSerial(0) @@ -59,29 +58,11 @@ public: mFormat.setSampleRate(1000); } - QAudioDecoder::State state() const - { - return mState; - } - QUrl source() const { return mSource; } - QAudioFormat audioFormat() const - { - return mFormat; - } - - void setAudioFormat(const QAudioFormat &format) - { - if (mFormat != format) { - mFormat = format; - emit formatChanged(mFormat); - } - } - void setSource(const QUrl &fileName) { mSource = fileName; @@ -106,10 +87,9 @@ public: // 5 buffers void start() { - if (mState == QAudioDecoder::StoppedState) { + if (!isDecoding()) { if (!mSource.isEmpty()) { - mState = QAudioDecoder::DecodingState; - emit stateChanged(mState); + setIsDecoding(true); emit durationChanged(duration()); QTimer::singleShot(50, this, SLOT(pretendDecode())); @@ -121,12 +101,11 @@ public: void stop() { - if (mState != QAudioDecoder::StoppedState) { - mState = QAudioDecoder::StoppedState; + if (isDecoding()) { mSerial = 0; mPosition = 0; mBuffers.clear(); - emit stateChanged(mState); + setIsDecoding(false); emit bufferAvailableChanged(false); } } @@ -143,9 +122,7 @@ public: emit bufferAvailableChanged(false); if (mBuffers.isEmpty() && mSerial >= MOCK_DECODER_MAX_BUFFERS) { - mState = QAudioDecoder::StoppedState; emit finished(); - emit stateChanged(mState); } else QTimer::singleShot(50, this, SLOT(pretendDecode())); } @@ -189,7 +166,6 @@ private slots: } public: - QAudioDecoder::State mState; QUrl mSource; QIODevice *mDevice; QAudioFormat mFormat; diff --git a/tests/auto/unit/mockbackend/qmockcamera.h b/tests/auto/unit/mockbackend/qmockcamera.h index f10c972f9..2184f464a 100644 --- a/tests/auto/unit/mockbackend/qmockcamera.h +++ b/tests/auto/unit/mockbackend/qmockcamera.h @@ -50,7 +50,6 @@ public: QMockCamera(QCamera *parent) : QPlatformCamera(parent), - m_status(QCamera::InactiveStatus), m_propertyChangesSupported(false) { if (!simpleCamera) { @@ -71,25 +70,15 @@ public: if (m_active == active) return; m_active = active; - setStatus(active ? QCamera::ActiveStatus : QCamera::InactiveStatus); emit activeChanged(active); } - QCamera::Status status() const override { return m_status; } - /* helper method to emit the signal error */ void setError(QCamera::Error err, QString errorString) { emit error(err, errorString); } - /* helper method to emit the signal statusChaged */ - void setStatus(QCamera::Status newStatus) - { - m_status = newStatus; - emit statusChanged(newStatus); - } - void setCamera(const QCameraDevice &camera) override { m_camera = camera; @@ -183,7 +172,6 @@ public: } bool m_active = false; - QCamera::Status m_status; QCameraDevice m_camera; bool m_propertyChangesSupported; }; diff --git a/tests/auto/unit/mockbackend/qmockimagecapture.cpp b/tests/auto/unit/mockbackend/qmockimagecapture.cpp index 23e9fad60..9e2396113 100644 --- a/tests/auto/unit/mockbackend/qmockimagecapture.cpp +++ b/tests/auto/unit/mockbackend/qmockimagecapture.cpp @@ -29,11 +29,11 @@ #include <qmockimagecapture.h> #include <qmockcamera.h> #include <qmockmediacapturesession.h> -#include <qcameraimagecapture.h> +#include <qimagecapture.h> #include <qcamera.h> -QMockImageCapture::QMockImageCapture(QCameraImageCapture *parent) - : QPlatformCameraImageCapture(parent) +QMockImageCapture::QMockImageCapture(QImageCapture *parent) + : QPlatformImageCapture(parent) { } @@ -51,7 +51,7 @@ int QMockImageCapture::capture(const QString &fileName) QTimer::singleShot(5, this, SLOT(captured())); return m_captureRequest; } else { - emit error(-1, QCameraImageCapture::NotReadyError, + emit error(-1, QImageCapture::NotReadyError, QLatin1String("Could not capture in stopped state")); } diff --git a/tests/auto/unit/mockbackend/qmockimagecapture.h b/tests/auto/unit/mockbackend/qmockimagecapture.h index 139c12474..8d7cea1a4 100644 --- a/tests/auto/unit/mockbackend/qmockimagecapture.h +++ b/tests/auto/unit/mockbackend/qmockimagecapture.h @@ -33,18 +33,18 @@ #include <QTimer> #include <QtMultimedia/qmediametadata.h> -#include "private/qplatformcameraimagecapture_p.h" +#include "private/qplatformimagecapture_p.h" #include "private/qplatformcamera_p.h" QT_BEGIN_NAMESPACE class QMockMediaCaptureSession; -class QMockImageCapture : public QPlatformCameraImageCapture +class QMockImageCapture : public QPlatformImageCapture { Q_OBJECT public: - QMockImageCapture(QCameraImageCapture *parent); + QMockImageCapture(QImageCapture *parent); ~QMockImageCapture() { diff --git a/tests/auto/unit/mockbackend/qmockintegration.cpp b/tests/auto/unit/mockbackend/qmockintegration.cpp index 614542042..16e65a7b8 100644 --- a/tests/auto/unit/mockbackend/qmockintegration.cpp +++ b/tests/auto/unit/mockbackend/qmockintegration.cpp @@ -94,7 +94,7 @@ QPlatformCamera *QMockIntegration::createCamera(QCamera *parent) return m_lastCamera; } -QPlatformCameraImageCapture *QMockIntegration::createImageCapture(QCameraImageCapture *capture) +QPlatformImageCapture *QMockIntegration::createImageCapture(QImageCapture *capture) { return new QMockImageCapture(capture); } diff --git a/tests/auto/unit/mockbackend/qmockintegration_p.h b/tests/auto/unit/mockbackend/qmockintegration_p.h index e46b35713..7c32d7783 100644 --- a/tests/auto/unit/mockbackend/qmockintegration_p.h +++ b/tests/auto/unit/mockbackend/qmockintegration_p.h @@ -75,7 +75,7 @@ public: QPlatformMediaPlayer *createPlayer(QMediaPlayer *) override; QPlatformCamera *createCamera(QCamera *) override; QPlatformMediaEncoder *createEncoder(QMediaRecorder *) override; - QPlatformCameraImageCapture *createImageCapture(QCameraImageCapture *) override; + QPlatformImageCapture *createImageCapture(QImageCapture *) override; QPlatformMediaCaptureSession *createCaptureSession() override; QPlatformVideoSink *createVideoSink(QVideoSink *) override; diff --git a/tests/auto/unit/mockbackend/qmockmediacapturesession.h b/tests/auto/unit/mockbackend/qmockmediacapturesession.h index 8ddbeefcd..1d18c664b 100644 --- a/tests/auto/unit/mockbackend/qmockmediacapturesession.h +++ b/tests/auto/unit/mockbackend/qmockmediacapturesession.h @@ -60,11 +60,11 @@ public: mockCameraControl = control; } - void setImageCapture(QPlatformCameraImageCapture *imageCapture) override + void setImageCapture(QPlatformImageCapture *imageCapture) override { mockImageCapture = imageCapture; } - QPlatformCameraImageCapture *imageCapture() override { return hasControls ? mockImageCapture : nullptr; } + QPlatformImageCapture *imageCapture() override { return hasControls ? mockImageCapture : nullptr; } QPlatformMediaEncoder *mediaEncoder() override { return hasControls ? mockControl : nullptr; } void setMediaEncoder(QPlatformMediaEncoder *encoder) override @@ -88,7 +88,7 @@ public: } QMockCamera *mockCameraControl = nullptr; - QPlatformCameraImageCapture *mockImageCapture = nullptr; + QPlatformImageCapture *mockImageCapture = nullptr; QMockMediaEncoder *mockControl = nullptr; QPlatformAudioInput *m_audioInput = nullptr; bool hasControls; diff --git a/tests/auto/unit/mockbackend/qmockmediaencoder.h b/tests/auto/unit/mockbackend/qmockmediaencoder.h index f49fc5e78..7c1cb07a6 100644 --- a/tests/auto/unit/mockbackend/qmockmediaencoder.h +++ b/tests/auto/unit/mockbackend/qmockmediaencoder.h @@ -46,14 +46,8 @@ public: { } - QUrl outputLocation() const + bool isLocationWritable(const QUrl &) const { - return m_sink; - } - - bool setOutputLocation(const QUrl &sink) - { - m_sink = sink; return true; } @@ -98,7 +92,7 @@ public: emit statusChanged(m_status); emit durationChanged(m_position); - QUrl actualLocation = m_sink.isEmpty() ? QUrl::fromLocalFile("default_name.mp4") : m_sink; + QUrl actualLocation = outputLocation().isEmpty() ? QUrl::fromLocalFile("default_name.mp4") : outputLocation(); emit actualLocationChanged(actualLocation); } @@ -136,7 +130,6 @@ public: public: QMediaMetaData m_metaData; - QUrl m_sink; QMediaRecorder::RecorderState m_state; QMediaRecorder::Status m_status; QMediaEncoderSettings m_settings; diff --git a/tests/auto/unit/multimedia/CMakeLists.txt b/tests/auto/unit/multimedia/CMakeLists.txt index 4ed5121f8..46e48ca6c 100644 --- a/tests/auto/unit/multimedia/CMakeLists.txt +++ b/tests/auto/unit/multimedia/CMakeLists.txt @@ -6,7 +6,8 @@ add_subdirectory(qaudioformat) add_subdirectory(qaudionamespace) add_subdirectory(qcamera) add_subdirectory(qcameradevice) -add_subdirectory(qcameraimagecapture) +add_subdirectory(qimagecapture) +add_subdirectory(qmediaformat) add_subdirectory(qmediaplayer) add_subdirectory(qmediaplaylist) add_subdirectory(qmediarecorder) diff --git a/tests/auto/unit/multimedia/qaudiodecoder/tst_qaudiodecoder.cpp b/tests/auto/unit/multimedia/qaudiodecoder/tst_qaudiodecoder.cpp index cd404d448..1c200cb21 100644 --- a/tests/auto/unit/multimedia/qaudiodecoder/tst_qaudiodecoder.cpp +++ b/tests/auto/unit/multimedia/qaudiodecoder/tst_qaudiodecoder.cpp @@ -61,12 +61,12 @@ tst_QAudioDecoder::tst_QAudioDecoder() void tst_QAudioDecoder::ctors() { QAudioDecoder d; - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QVERIFY(d.bufferAvailable() == false); QCOMPARE(d.source(), QString("")); d.setSource(QUrl()); - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QVERIFY(d.bufferAvailable() == false); QCOMPARE(d.source(), QUrl()); } @@ -74,7 +74,7 @@ void tst_QAudioDecoder::ctors() void tst_QAudioDecoder::read() { QAudioDecoder d; - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QVERIFY(d.bufferAvailable() == false); QSignalSpy readySpy(&d, SIGNAL(bufferReady())); @@ -84,7 +84,7 @@ void tst_QAudioDecoder::read() // Starting with empty source == error d.start(); - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QVERIFY(d.bufferAvailable() == false); QCOMPARE(readySpy.count(), 0); @@ -100,7 +100,7 @@ void tst_QAudioDecoder::read() bufferChangedSpy.clear(); d.start(); - QCOMPARE(d.state(), QAudioDecoder::DecodingState); + QVERIFY(d.isDecoding()); QCOMPARE(d.bufferAvailable(), false); // not yet // Try to read @@ -135,7 +135,7 @@ void tst_QAudioDecoder::read() void tst_QAudioDecoder::stop() { QAudioDecoder d; - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QVERIFY(d.bufferAvailable() == false); QSignalSpy readySpy(&d, SIGNAL(bufferReady())); @@ -145,7 +145,7 @@ void tst_QAudioDecoder::stop() // Starting with empty source == error d.start(); - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QVERIFY(d.bufferAvailable() == false); QCOMPARE(readySpy.count(), 0); @@ -161,7 +161,7 @@ void tst_QAudioDecoder::stop() bufferChangedSpy.clear(); d.start(); - QCOMPARE(d.state(), QAudioDecoder::DecodingState); + QVERIFY(d.isDecoding()); QCOMPARE(d.bufferAvailable(), false); // not yet // Try to read @@ -180,14 +180,14 @@ void tst_QAudioDecoder::stop() // Now stop d.stop(); - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QVERIFY(d.bufferAvailable() == false); } void tst_QAudioDecoder::format() { QAudioDecoder d; - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QVERIFY(d.bufferAvailable() == false); QSignalSpy readySpy(&d, SIGNAL(bufferReady())); @@ -203,7 +203,7 @@ void tst_QAudioDecoder::format() bufferChangedSpy.clear(); d.start(); - QCOMPARE(d.state(), QAudioDecoder::DecodingState); + QVERIFY(d.isDecoding()); QCOMPARE(d.bufferAvailable(), false); // not yet // Try to read @@ -218,28 +218,7 @@ void tst_QAudioDecoder::format() QTRY_VERIFY(d.bufferAvailable()); b = d.read(); - QVERIFY(d.audioFormat() == b.format()); - - // Setting format while decoding is forbidden - QAudioFormat f(d.audioFormat()); - f.setChannelCount(2); - - d.setAudioFormat(f); - QVERIFY(d.audioFormat() != f); - QVERIFY(d.audioFormat() == b.format()); - - // Now stop, and set something specific - d.stop(); - d.setAudioFormat(f); - QVERIFY(d.audioFormat() == f); - - // Decode again - d.start(); - QTRY_VERIFY(d.bufferAvailable()); - - b = d.read(); - QVERIFY(d.audioFormat() == f); - QVERIFY(b.format() == f); + QVERIFY(b.format().isValid()); } void tst_QAudioDecoder::source() @@ -275,18 +254,18 @@ void tst_QAudioDecoder::readAll() { QAudioDecoder d; d.setSource(QUrl::fromLocalFile("Foo")); - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QSignalSpy durationSpy(&d, SIGNAL(durationChanged(qint64))); QSignalSpy positionSpy(&d, SIGNAL(positionChanged(qint64))); - QSignalSpy stateSpy(&d, SIGNAL(stateChanged(QAudioDecoder::State))); + QSignalSpy isDecodingSpy(&d, SIGNAL(isDecodingChanged(bool))); QSignalSpy finishedSpy(&d, SIGNAL(finished())); QSignalSpy bufferAvailableSpy(&d, SIGNAL(bufferAvailableChanged(bool))); d.start(); int i = 0; forever { - QVERIFY(d.state() == QAudioDecoder::DecodingState); - QCOMPARE(stateSpy.count(), 1); + QVERIFY(d.isDecoding()); + QCOMPARE(isDecodingSpy.count(), 1); QCOMPARE(durationSpy.count(), 1); QVERIFY(finishedSpy.isEmpty()); QTRY_VERIFY(bufferAvailableSpy.count() >= 1); @@ -301,10 +280,10 @@ void tst_QAudioDecoder::readAll() i++; if (i == MOCK_DECODER_MAX_BUFFERS) { QCOMPARE(finishedSpy.count(), 1); - QCOMPARE(stateSpy.count(), 2); - QVERIFY(d.state() == QAudioDecoder::StoppedState); - QList<QVariant> arguments = stateSpy.takeLast(); - QVERIFY(arguments.at(0).toInt() == (int)QAudioDecoder::StoppedState); + QCOMPARE(isDecodingSpy.count(), 2); + QVERIFY(!d.isDecoding()); + QList<QVariant> arguments = isDecodingSpy.takeLast(); + QVERIFY(arguments.at(0).toBool() == false); QVERIFY(!d.bufferAvailable()); QVERIFY(!bufferAvailableSpy.isEmpty()); arguments = bufferAvailableSpy.takeLast(); @@ -324,7 +303,7 @@ void tst_QAudioDecoder::nullControl() QVERIFY(d.error() == QAudioDecoder::NotSupportedError); QVERIFY(!d.errorString().isEmpty()); - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); QVERIFY(d.source().isEmpty()); d.setSource(QUrl::fromLocalFile("test")); @@ -335,12 +314,6 @@ void tst_QAudioDecoder::nullControl() d.setSourceDevice(&f); QVERIFY(d.sourceDevice() == nullptr); - QAudioFormat format; - format.setChannelCount(2); - QVERIFY(!d.audioFormat().isValid()); - d.setAudioFormat(format); - QVERIFY(!d.audioFormat().isValid()); - QVERIFY(!d.read().isValid()); QVERIFY(!d.bufferAvailable()); @@ -350,7 +323,7 @@ void tst_QAudioDecoder::nullControl() d.start(); QVERIFY(d.error() == QAudioDecoder::NotSupportedError); QVERIFY(!d.errorString().isEmpty()); - QVERIFY(d.state() == QAudioDecoder::StoppedState); + QVERIFY(!d.isDecoding()); d.stop(); } diff --git a/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp b/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp index 2137ac4ca..8955e08fc 100644 --- a/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp +++ b/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp @@ -33,10 +33,10 @@ #include <qvideosink.h> #include <private/qplatformcamera_p.h> -#include <private/qplatformcameraimagecapture_p.h> +#include <private/qplatformimagecapture_p.h> #include <qcamera.h> #include <qcameradevice.h> -#include <qcameraimagecapture.h> +#include <qimagecapture.h> #include <qmediacapturesession.h> #include <qobject.h> #include <qmediadevices.h> @@ -76,7 +76,6 @@ private slots: void testErrorSignal(); void testError(); void testErrorString(); - void testStatus(); // Test cases to for focus handling @@ -212,26 +211,26 @@ void tst_QCamera::testSimpleCameraCapture() QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); QVERIFY(!imageCapture.isReadyForCapture()); QVERIFY(imageCapture.isAvailable()); - QCOMPARE(imageCapture.error(), QCameraImageCapture::NoError); + QCOMPARE(imageCapture.error(), QImageCapture::NoError); QVERIFY(imageCapture.errorString().isEmpty()); - QSignalSpy errorSignal(&imageCapture, SIGNAL(errorOccurred(int,QCameraImageCapture::Error,QString))); + QSignalSpy errorSignal(&imageCapture, SIGNAL(errorOccurred(int,QImageCapture::Error,QString))); imageCapture.captureToFile(QString::fromLatin1("/dev/null")); QCOMPARE(errorSignal.size(), 1); - QCOMPARE(imageCapture.error(), QCameraImageCapture::NotReadyError); + QCOMPARE(imageCapture.error(), QImageCapture::NotReadyError); QVERIFY(!imageCapture.errorString().isEmpty()); camera.start(); imageCapture.captureToFile(QString::fromLatin1("/dev/null")); QCOMPARE(errorSignal.size(), 1); - QCOMPARE(imageCapture.error(), QCameraImageCapture::NoError); + QCOMPARE(imageCapture.error(), QImageCapture::NoError); QVERIFY(imageCapture.errorString().isEmpty()); } @@ -239,19 +238,19 @@ void tst_QCamera::testCameraCapture() { QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); QVERIFY(!imageCapture.isReadyForCapture()); QSignalSpy capturedSignal(&imageCapture, SIGNAL(imageCaptured(int,QImage))); - QSignalSpy errorSignal(&imageCapture, SIGNAL(errorOccurred(int,QCameraImageCapture::Error,QString))); + QSignalSpy errorSignal(&imageCapture, SIGNAL(errorOccurred(int,QImageCapture::Error,QString))); imageCapture.captureToFile(QString::fromLatin1("/dev/null")); QCOMPARE(capturedSignal.size(), 0); QCOMPARE(errorSignal.size(), 1); - QCOMPARE(imageCapture.error(), QCameraImageCapture::NotReadyError); + QCOMPARE(imageCapture.error(), QImageCapture::NotReadyError); errorSignal.clear(); @@ -263,14 +262,14 @@ void tst_QCamera::testCameraCapture() QTRY_COMPARE(capturedSignal.size(), 1); QCOMPARE(errorSignal.size(), 0); - QCOMPARE(imageCapture.error(), QCameraImageCapture::NoError); + QCOMPARE(imageCapture.error(), QImageCapture::NoError); } void tst_QCamera::testCameraCaptureMetadata() { QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); @@ -441,18 +440,15 @@ void tst_QCamera::testCameraEncodingProperyChange() { QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); - QSignalSpy statusChangedSignal(&camera, SIGNAL(statusChanged(QCamera::Status))); + QSignalSpy activeChangedSignal(&camera, SIGNAL(activeChanged(bool))); camera.start(); QCOMPARE(camera.isActive(), true); - QCOMPARE(camera.status(), QCamera::ActiveStatus); - - QCOMPARE(statusChangedSignal.count(), 1); - statusChangedSignal.clear(); + QCOMPARE(activeChangedSignal.count(), 1); } void tst_QCamera::testSetVideoOutput() @@ -543,8 +539,6 @@ void tst_QCamera::testSetVideoOutputDestruction() void tst_QCamera::testEnumDebug() { - QTest::ignoreMessage(QtDebugMsg, "QCamera::ActiveStatus"); - qDebug() << QCamera::ActiveStatus; QTest::ignoreMessage(QtDebugMsg, "QCamera::CameraError"); qDebug() << QCamera::CameraError; // QTest::ignoreMessage(QtDebugMsg, "QCameraDevice::FrontFace"); @@ -705,27 +699,6 @@ void tst_QCamera::testErrorString() QVERIFY(camera.errorString() == QString("CameraError Error")); } -/* Test case for verifying Status of QCamera. */ -void tst_QCamera::testStatus() -{ - QMediaCaptureSession session; - QCamera camera; - session.setCamera(&camera); - auto *service = integration.lastCaptureService(); - - /* Set the QPlatformCamera status and verify if it is set correctly in QCamera */ - service->mockCameraControl->setStatus(QCamera::StartingStatus); - QVERIFY(camera.status() == QCamera::StartingStatus); - - /* Set the QPlatformCamera status and verify if it is set correctly in QCamera */ - service->mockCameraControl->setStatus(QCamera::StartingStatus); - QVERIFY(camera.status() == QCamera::StartingStatus); - - /* Set the QPlatformCamera status and verify if it is set correctly in QCamera */ - service->mockCameraControl->setStatus(QCamera::UnavailableStatus); - QVERIFY(camera.status() == QCamera::UnavailableStatus); -} - //Added this code to cover QCamera::FocusModeHyperfocal and QCamera::FocusModeAutoNear //As the FocusModeHyperfocal and FocusModeAutoNear are not supported we can not set the focus mode to these Focus Modes void tst_QCamera::testFocusMode() diff --git a/tests/auto/unit/multimedia/qcameraimagecapture/CMakeLists.txt b/tests/auto/unit/multimedia/qimagecapture/CMakeLists.txt index 11b5c643a..11a2c79bc 100644 --- a/tests/auto/unit/multimedia/qcameraimagecapture/CMakeLists.txt +++ b/tests/auto/unit/multimedia/qimagecapture/CMakeLists.txt @@ -1,12 +1,12 @@ -# Generated from qcameraimagecapture.pro. +# Generated from qimagecapture.pro. ##################################################################### -## tst_qcameraimagecapture Test: +## tst_qimagecapture Test: ##################################################################### -qt_internal_add_test(tst_qcameraimagecapture +qt_internal_add_test(tst_qimagecapture SOURCES - tst_qcameraimagecapture.cpp + tst_qimagecapture.cpp INCLUDE_DIRECTORIES ../../mockbackend PUBLIC_LIBRARIES diff --git a/tests/auto/unit/multimedia/qcameraimagecapture/tst_qcameraimagecapture.cpp b/tests/auto/unit/multimedia/qimagecapture/tst_qimagecapture.cpp index c69af0621..b81f989db 100644 --- a/tests/auto/unit/multimedia/qcameraimagecapture/tst_qcameraimagecapture.cpp +++ b/tests/auto/unit/multimedia/qimagecapture/tst_qimagecapture.cpp @@ -30,9 +30,9 @@ #include <QDebug> #include <private/qplatformcamera_p.h> -#include <private/qplatformcameraimagecapture_p.h> +#include <private/qplatformimagecapture_p.h> #include <qcamera.h> -#include <qcameraimagecapture.h> +#include <qimagecapture.h> #include <qmediacapturesession.h> #include "qmockmediacapturesession.h" @@ -40,7 +40,7 @@ QT_USE_NAMESPACE -class tst_QCameraImageCapture: public QObject +class tst_QImageCapture: public QObject { Q_OBJECT @@ -68,40 +68,40 @@ private: QMockIntegration *mockIntegration; }; -void tst_QCameraImageCapture::initTestCase() +void tst_QImageCapture::initTestCase() { mockIntegration = new QMockIntegration; } -void tst_QCameraImageCapture::init() +void tst_QImageCapture::init() { } -void tst_QCameraImageCapture::cleanup() +void tst_QImageCapture::cleanup() { } -void tst_QCameraImageCapture::cleanupTestCase() +void tst_QImageCapture::cleanupTestCase() { delete mockIntegration; } -void tst_QCameraImageCapture::constructor() +void tst_QImageCapture::constructor() { QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); QVERIFY(imageCapture.isAvailable() == true); } -void tst_QCameraImageCapture::isAvailable() +void tst_QImageCapture::isAvailable() { { QMediaCaptureSession session; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setImageCapture(&imageCapture); QVERIFY(!imageCapture.isAvailable()); @@ -110,7 +110,7 @@ void tst_QCameraImageCapture::isAvailable() { QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); @@ -118,11 +118,11 @@ void tst_QCameraImageCapture::isAvailable() } } -void tst_QCameraImageCapture::deleteMediaSource() +void tst_QImageCapture::deleteMediaSource() { QMediaCaptureSession session; QCamera *camera = new QCamera; - QCameraImageCapture *capture = new QCameraImageCapture; + QImageCapture *capture = new QImageCapture; session.setCamera(camera); session.setImageCapture(capture); @@ -137,11 +137,11 @@ void tst_QCameraImageCapture::deleteMediaSource() delete capture; } -void tst_QCameraImageCapture::isReadyForCapture() +void tst_QImageCapture::isReadyForCapture() { QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); @@ -154,11 +154,11 @@ void tst_QCameraImageCapture::isReadyForCapture() camera.stop(); } -void tst_QCameraImageCapture::capture() +void tst_QImageCapture::capture() { QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); @@ -172,77 +172,77 @@ void tst_QCameraImageCapture::capture() camera.stop(); } -void tst_QCameraImageCapture::encodingSettings() +void tst_QImageCapture::encodingSettings() { QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); QVERIFY(imageCapture.isAvailable() == true); - imageCapture.setFileFormat(QCameraImageCapture::JPEG); - imageCapture.setQuality(QCameraImageCapture::NormalQuality); - QVERIFY(imageCapture.fileFormat() == QCameraImageCapture::JPEG); - QVERIFY(imageCapture.quality() == QCameraImageCapture::NormalQuality); + imageCapture.setFileFormat(QImageCapture::JPEG); + imageCapture.setQuality(QImageCapture::NormalQuality); + QVERIFY(imageCapture.fileFormat() == QImageCapture::JPEG); + QVERIFY(imageCapture.quality() == QImageCapture::NormalQuality); } -void tst_QCameraImageCapture::errors() +void tst_QImageCapture::errors() { QMockCamera::Simple simple; { QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); QVERIFY(imageCapture.isAvailable() == true); imageCapture.captureToFile(QString::fromLatin1("/dev/null")); - QCOMPARE(imageCapture.error(), QCameraImageCapture::NotReadyError); + QCOMPARE(imageCapture.error(), QImageCapture::NotReadyError); QVERIFY(!imageCapture.errorString().isEmpty()); } QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); camera.start(); QVERIFY(imageCapture.isAvailable() == true); - QVERIFY(imageCapture.error() == QCameraImageCapture::NoError); + QVERIFY(imageCapture.error() == QImageCapture::NoError); QVERIFY(imageCapture.errorString().isEmpty()); imageCapture.captureToFile(); - QVERIFY(imageCapture.error() == QCameraImageCapture::NoError); + QVERIFY(imageCapture.error() == QImageCapture::NoError); QVERIFY(imageCapture.errorString().isEmpty()); } -void tst_QCameraImageCapture::error() +void tst_QImageCapture::error() { QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); - QSignalSpy spy(&imageCapture, SIGNAL(errorOccurred(int,QCameraImageCapture::Error,QString))); + QSignalSpy spy(&imageCapture, SIGNAL(errorOccurred(int,QImageCapture::Error,QString))); imageCapture.captureToFile(); QTest::qWait(30); QVERIFY(spy.count() == 1); QVERIFY(qvariant_cast<int>(spy.at(0).at(0)) == -1); - QVERIFY(qvariant_cast<QCameraImageCapture::Error>(spy.at(0).at(1)) == QCameraImageCapture::NotReadyError); + QVERIFY(qvariant_cast<QImageCapture::Error>(spy.at(0).at(1)) == QImageCapture::NotReadyError); QVERIFY(qvariant_cast<QString>(spy.at(0).at(2)) == "Could not capture in stopped state"); spy.clear(); } -void tst_QCameraImageCapture::imageCaptured() +void tst_QImageCapture::imageCaptured() { QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); @@ -261,11 +261,11 @@ void tst_QCameraImageCapture::imageCaptured() camera.stop(); } -void tst_QCameraImageCapture::imageExposed() +void tst_QImageCapture::imageExposed() { QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); @@ -282,11 +282,11 @@ void tst_QCameraImageCapture::imageExposed() camera.stop(); } -void tst_QCameraImageCapture::imageSaved() +void tst_QImageCapture::imageSaved() { QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); @@ -304,11 +304,11 @@ void tst_QCameraImageCapture::imageSaved() camera.stop(); } -void tst_QCameraImageCapture::readyForCaptureChanged() +void tst_QImageCapture::readyForCaptureChanged() { QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); @@ -329,6 +329,6 @@ void tst_QCameraImageCapture::readyForCaptureChanged() spy.clear(); } -QTEST_MAIN(tst_QCameraImageCapture) +QTEST_MAIN(tst_QImageCapture) -#include "tst_qcameraimagecapture.moc" +#include "tst_qimagecapture.moc" diff --git a/tests/auto/unit/multimedia/qmediaformat/CMakeLists.txt b/tests/auto/unit/multimedia/qmediaformat/CMakeLists.txt new file mode 100644 index 000000000..23c4ad18c --- /dev/null +++ b/tests/auto/unit/multimedia/qmediaformat/CMakeLists.txt @@ -0,0 +1,7 @@ +qt_internal_add_test(tst_qmediaformat + SOURCES + tst_qmediaformat.cpp + PUBLIC_LIBRARIES + Qt::Gui + Qt::MultimediaPrivate +) diff --git a/tests/auto/unit/multimedia/qmediaformat/tst_qmediaformat.cpp b/tests/auto/unit/multimedia/qmediaformat/tst_qmediaformat.cpp new file mode 100644 index 000000000..b7a31d300 --- /dev/null +++ b/tests/auto/unit/multimedia/qmediaformat/tst_qmediaformat.cpp @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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 General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** 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-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> +#include <QDebug> +#include <QtMultimedia/qmediaformat.h> + +class tst_QMediaFormat : public QObject +{ + Q_OBJECT + +private slots: + void testResolveForEncoding(); +}; + +void tst_QMediaFormat::testResolveForEncoding() +{ + QMediaFormat format; + + auto hasVideoCodecs = !format.supportedVideoCodecs(QMediaFormat::Encode).isEmpty(); + + // Resolve codecs for audio only stream + format.resolveForEncoding(QMediaFormat::NoFlags); + QVERIFY(format.audioCodec() != QMediaFormat::AudioCodec::Unspecified); + QVERIFY(format.fileFormat() != QMediaFormat::FileFormat::UnspecifiedFormat); + QVERIFY(format.videoCodec() == QMediaFormat::VideoCodec::Unspecified); + + // Resolve codecs for audio/video stream + format.resolveForEncoding(QMediaFormat::RequiresVideo); + QVERIFY(format.audioCodec() != QMediaFormat::AudioCodec::Unspecified); + QVERIFY(format.fileFormat() != QMediaFormat::FileFormat::UnspecifiedFormat); + if (hasVideoCodecs) + QVERIFY(format.videoCodec() != QMediaFormat::VideoCodec::Unspecified); + else + QVERIFY(format.videoCodec() == QMediaFormat::VideoCodec::Unspecified); + + // Resolve again for audio only stream + format.resolveForEncoding(QMediaFormat::NoFlags); + QVERIFY(format.videoCodec() == QMediaFormat::VideoCodec::Unspecified); +} + +QTEST_MAIN(tst_QMediaFormat) +#include "tst_qmediaformat.moc" diff --git a/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp b/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp index 5529f470f..ed7b90234 100644 --- a/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp +++ b/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp @@ -132,7 +132,7 @@ void tst_QMediaRecorder::testNullControls() QCOMPARE(recorder.duration(), qint64(0)); recorder.setOutputLocation(QUrl("file://test/save/file.mp4")); - QCOMPARE(recorder.outputLocation(), QUrl()); + QCOMPARE(recorder.outputLocation(), QUrl("file://test/save/file.mp4")); QCOMPARE(recorder.actualLocation(), QUrl()); QMediaFormat format; diff --git a/tests/auto/unit/multimediawidgets/qcamerawidgets/tst_qcamerawidgets.cpp b/tests/auto/unit/multimediawidgets/qcamerawidgets/tst_qcamerawidgets.cpp index 3314ad547..7db456190 100644 --- a/tests/auto/unit/multimediawidgets/qcamerawidgets/tst_qcamerawidgets.cpp +++ b/tests/auto/unit/multimediawidgets/qcamerawidgets/tst_qcamerawidgets.cpp @@ -32,10 +32,10 @@ #include <QDebug> #include <private/qplatformcamera_p.h> -#include <private/qplatformcameraimagecapture_p.h> +#include <private/qplatformimagecapture_p.h> #include <qmediacapturesession.h> #include <qcamera.h> -#include <qcameraimagecapture.h> +#include <qimagecapture.h> #include <qgraphicsvideoitem.h> #include <qobject.h> #include <qvideowidget.h> @@ -76,17 +76,16 @@ void tst_QCameraWidgets::testCameraEncodingProperyChange() { QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture; + QImageCapture imageCapture; session.setCamera(&camera); session.setImageCapture(&imageCapture); - QSignalSpy statusChangedSignal(&camera, SIGNAL(statusChanged(QCamera::Status))); + QSignalSpy activeChangedSignal(&camera, SIGNAL(activeChanged(bool))); camera.start(); QCOMPARE(camera.isActive(), true); - QCOMPARE(camera.status(), QCamera::ActiveStatus); - QCOMPARE(statusChangedSignal.count(), 1); + QCOMPARE(activeChangedSignal.count(), 1); } void tst_QCameraWidgets::testSetVideoOutput() |