diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-02-02 20:36:06 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-02-09 14:34:35 +0000 |
commit | b010b331e52890b5d9be0218aa91c849adb1f63f (patch) | |
tree | 13815d4854deef4fd8e0f6867e4223324b571826 | |
parent | d9fcf2ab6ac24cdba9a9ff3f0e32a39938216cee (diff) |
Use the new QMediaEncoderSettings in QMediaRecorder
Switch the backends for Android (compiles but untested),
AFFoundation and GStreamer over to use the new
QMediaEncoderSettings.
Get rid of the old *EncoderControl classes and associated
infrastructure.
Change-Id: Ic75ff43eab55aeb0ab53d7248f7f5ff70b14c05f
Reviewed-by: Doris Verria <doris.verria@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
97 files changed, 1946 insertions, 6204 deletions
diff --git a/examples/multimedia/audiorecorder/audiorecorder.cpp b/examples/multimedia/audiorecorder/audiorecorder.cpp index ddd28bcdf..3a73dd7f0 100644 --- a/examples/multimedia/audiorecorder/audiorecorder.cpp +++ b/examples/multimedia/audiorecorder/audiorecorder.cpp @@ -87,22 +87,21 @@ AudioRecorder::AudioRecorder() //audio codecs ui->audioCodecBox->addItem(tr("Default"), QVariant(QString())); - for (auto &codecName: m_audioRecorder->supportedAudioCodecs()) { - ui->audioCodecBox->addItem(codecName, QVariant(codecName)); - } + for (auto &codec : QMediaEncoderInfo::supportedAudioCodecs()) + ui->audioCodecBox->addItem(QMediaFormat::audioCodecDescription(codec), QVariant::fromValue(codec)); //containers ui->containerBox->addItem(tr("Default"), QVariant(QString())); - for (auto &containerName: m_audioRecorder->supportedContainers()) { - ui->containerBox->addItem(containerName, QVariant(containerName)); + for (auto &container : QMediaEncoderInfo::supportedFileFormats()) { + if (container < QMediaFormat::AAC) // ### Somewhat hacky, skip video formats + continue; + ui->containerBox->addItem(QMediaFormat::fileFormatDescription(container), QVariant::fromValue(container)); } //sample rate - ui->sampleRateBox->addItem(tr("Default"), QVariant(0)); - for (int sampleRate: m_audioRecorder->supportedAudioSampleRates()) { - ui->sampleRateBox->addItem(QString::number(sampleRate), QVariant( - sampleRate)); - } + auto sampleRates = m_audioRecorder->audioInput().supportedSampleRates(); + ui->sampleRateBox->setRange(sampleRates.minimum, sampleRates.maximum); + ui->sampleRateBox->setValue(qBound(sampleRates.minimum, 44100, sampleRates.maximum)); //channels ui->channelsBox->addItem(tr("Default"), QVariant(-1)); @@ -194,19 +193,18 @@ void AudioRecorder::toggleRecord() if (m_audioRecorder->state() == QMediaRecorder::StoppedState) { m_audioRecorder->setAudioInput(boxValue(ui->audioDeviceBox).value<QAudioDeviceInfo>()); - QAudioEncoderSettings settings; - settings.setCodec(boxValue(ui->audioCodecBox).toString()); - settings.setSampleRate(boxValue(ui->sampleRateBox).toInt()); - settings.setBitRate(boxValue(ui->bitrateBox).toInt()); - settings.setChannelCount(boxValue(ui->channelsBox).toInt()); + QMediaEncoderSettings settings; + settings.setFormat(boxValue(ui->containerBox).value<QMediaFormat::FileFormat>()); + settings.setAudioCodec(boxValue(ui->audioCodecBox).value<QMediaFormat::AudioCodec>()); + settings.setAudioSampleRate(ui->sampleRateBox->value()); + settings.setAudioBitRate(boxValue(ui->bitrateBox).toInt()); + settings.setAudioChannelCount(boxValue(ui->channelsBox).toInt()); settings.setQuality(QMultimedia::EncodingQuality(ui->qualitySlider->value())); settings.setEncodingMode(ui->constantQualityRadioButton->isChecked() ? QMultimedia::ConstantQualityEncoding : QMultimedia::ConstantBitRateEncoding); - QString container = boxValue(ui->containerBox).toString(); - - m_audioRecorder->setEncodingSettings(settings, QVideoEncoderSettings(), container); + m_audioRecorder->setEncoderSettings(settings); m_audioRecorder->record(); } else { diff --git a/examples/multimedia/audiorecorder/audiorecorder.ui b/examples/multimedia/audiorecorder/audiorecorder.ui index 6ea510524..bd2560622 100644 --- a/examples/multimedia/audiorecorder/audiorecorder.ui +++ b/examples/multimedia/audiorecorder/audiorecorder.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>297</width> - <height>374</height> + <height>476</height> </rect> </property> <property name="windowTitle"> @@ -51,9 +51,6 @@ <item row="2" column="1"> <widget class="QComboBox" name="containerBox"/> </item> - <item row="3" column="1"> - <widget class="QComboBox" name="sampleRateBox"/> - </item> <item row="1" column="1"> <widget class="QComboBox" name="audioCodecBox"/> </item> @@ -67,6 +64,9 @@ <item row="4" column="1"> <widget class="QComboBox" name="channelsBox"/> </item> + <item row="3" column="1"> + <widget class="QSpinBox" name="sampleRateBox"/> + </item> </layout> </item> <item row="1" column="0" colspan="3"> diff --git a/examples/multimediawidgets/camera/camera.cpp b/examples/multimediawidgets/camera/camera.cpp index 533a2d4db..f573970d2 100644 --- a/examples/multimediawidgets/camera/camera.cpp +++ b/examples/multimediawidgets/camera/camera.cpp @@ -222,19 +222,12 @@ void Camera::configureVideoSettings() VideoSettings settingsDialog(m_mediaRecorder.data()); settingsDialog.setWindowFlags(settingsDialog.windowFlags() & ~Qt::WindowContextHelpButtonHint); - settingsDialog.setAudioSettings(m_audioSettings); - settingsDialog.setVideoSettings(m_videoSettings); - settingsDialog.setFormat(m_videoContainerFormat); + settingsDialog.setEncoderSettings(m_encoderSettings); if (settingsDialog.exec()) { - m_audioSettings = settingsDialog.audioSettings(); - m_videoSettings = settingsDialog.videoSettings(); - m_videoContainerFormat = settingsDialog.format(); - - m_mediaRecorder->setEncodingSettings( - m_audioSettings, - m_videoSettings, - m_videoContainerFormat); + m_encoderSettings = settingsDialog.encoderSettings(); + + m_mediaRecorder->setEncoderSettings(m_encoderSettings); m_camera->unload(); m_camera->start(); diff --git a/examples/multimediawidgets/camera/camera.h b/examples/multimediawidgets/camera/camera.h index d45923cc4..a59aad28b 100644 --- a/examples/multimediawidgets/camera/camera.h +++ b/examples/multimediawidgets/camera/camera.h @@ -127,9 +127,7 @@ private: QScopedPointer<QMediaRecorder> m_mediaRecorder; QImageEncoderSettings m_imageSettings; - QAudioEncoderSettings m_audioSettings; - QVideoEncoderSettings m_videoSettings; - QString m_videoContainerFormat; + QMediaEncoderSettings m_encoderSettings; bool m_isCapturingImage = false; bool m_applicationExiting = false; }; diff --git a/examples/multimediawidgets/camera/imagesettings.h b/examples/multimediawidgets/camera/imagesettings.h index 1e4ac536e..a4cbc7c9b 100644 --- a/examples/multimediawidgets/camera/imagesettings.h +++ b/examples/multimediawidgets/camera/imagesettings.h @@ -69,9 +69,6 @@ public: explicit ImageSettings(QCameraImageCapture *imageCapture, QWidget *parent = nullptr); ~ImageSettings(); - QAudioEncoderSettings audioSettings() const; - void setAudioSettings(const QAudioEncoderSettings &settings); - QImageEncoderSettings imageSettings() const; void setImageSettings(const QImageEncoderSettings &settings); diff --git a/examples/multimediawidgets/camera/videosettings.cpp b/examples/multimediawidgets/camera/videosettings.cpp index f9c79fa12..b41462489 100644 --- a/examples/multimediawidgets/camera/videosettings.cpp +++ b/examples/multimediawidgets/camera/videosettings.cpp @@ -52,65 +52,65 @@ #include "ui_videosettings.h" #include <QComboBox> +#include <QSpinBox> #include <QDebug> #include <QMediaRecorder> #include <QMediaService> - - -VideoSettings::VideoSettings(QMediaRecorder *mediaRecorder, QWidget *parent) : - QDialog(parent), - ui(new Ui::VideoSettingsUi), - mediaRecorder(mediaRecorder) +#include <QMediaFormat> +#include <QAudioDeviceInfo> +#include <QCameraInfo> + +VideoSettings::VideoSettings(QMediaRecorder *mediaRecorder, QWidget *parent) + : QDialog(parent), + ui(new Ui::VideoSettingsUi), + mediaRecorder(mediaRecorder) { ui->setupUi(this); //audio codecs ui->audioCodecBox->addItem(tr("Default audio codec"), QVariant(QString())); - const QStringList supportedAudioCodecs = mediaRecorder->supportedAudioCodecs(); - for (const QString &codecName : supportedAudioCodecs) { - QString description = mediaRecorder->audioCodecDescription(codecName); - ui->audioCodecBox->addItem(codecName + ": " + description, QVariant(codecName)); + const auto supportedAudioCodecs = QMediaEncoderInfo::supportedAudioCodecs(); + for (const auto &codec : supportedAudioCodecs) { + QString description = QMediaFormat::audioCodecDescription(codec); + ui->audioCodecBox->addItem(QMediaFormat::audioCodecName(codec) + ": " + description, QVariant::fromValue(codec)); } //sample rate: - const QList<int>supportedAudioSampleRates = mediaRecorder->supportedAudioSampleRates(); - for (int sampleRate : supportedAudioSampleRates) - ui->audioSampleRateBox->addItem(QString::number(sampleRate), QVariant(sampleRate)); - - ui->audioQualitySlider->setRange(0, int(QMultimedia::VeryHighQuality)); + const auto sampleRates = mediaRecorder->audioInput().supportedSampleRates(); + ui->audioSampleRateBox->setRange(sampleRates.minimum, sampleRates.maximum); //video codecs ui->videoCodecBox->addItem(tr("Default video codec"), QVariant(QString())); - const QStringList supportedVideoCodecs = mediaRecorder->supportedVideoCodecs(); - for (const QString &codecName : supportedVideoCodecs) { - QString description = mediaRecorder->videoCodecDescription(codecName); - ui->videoCodecBox->addItem(codecName + ": " + description, QVariant(codecName)); + const auto supportedVideoCodecs = QMediaEncoderInfo::supportedVideoCodecs(); + for (const auto &codec : supportedVideoCodecs) { + QString description = QMediaFormat::videoCodecDescription(codec); + ui->videoCodecBox->addItem(QMediaFormat::videoCodecName(codec) + ": " + description, QVariant::fromValue(codec)); } - ui->videoQualitySlider->setRange(0, int(QMultimedia::VeryHighQuality)); - ui->videoResolutionBox->addItem(tr("Default")); - const QList<QSize> supportedResolutions = mediaRecorder->supportedResolutions(); + auto supportedResolutions = mediaRecorder->videoInput().photoResolutions(); // ### Should use resolutions from video formats for (const QSize &resolution : supportedResolutions) { ui->videoResolutionBox->addItem(QString("%1x%2").arg(resolution.width()).arg(resolution.height()), QVariant(resolution)); } ui->videoFramerateBox->addItem(tr("Default")); - const QList<qreal> supportedFrameRates = mediaRecorder->supportedFrameRates(); - for (qreal rate : supportedFrameRates) { - QString rateString = QString("%1").arg(rate, 0, 'f', 2); - ui->videoFramerateBox->addItem(rateString, QVariant(rate)); - } +// const QList<qreal> supportedFrameRates = mediaRecorder->supportedFrameRates(); +// for (qreal rate : supportedFrameRates) { +// QString rateString = QString("%1").arg(rate, 0, 'f', 2); +// ui->videoFramerateBox->addItem(rateString, QVariant(rate)); +// } //containers ui->containerFormatBox->addItem(tr("Default container"), QVariant(QString())); - const QStringList formats = mediaRecorder->supportedContainers(); - for (const QString &format : formats) { - ui->containerFormatBox->addItem(format + ": " + mediaRecorder->containerDescription(format), - QVariant(format)); + const auto formats = QMediaEncoderInfo::supportedFileFormats(); + for (auto format : formats) { + ui->containerFormatBox->addItem(QMediaFormat::fileFormatName(format) + ": " + QMediaFormat::fileFormatDescription(format), + QVariant::fromValue(format)); } + + ui->qualitySlider->setRange(0, int(QMultimedia::VeryHighQuality)); } VideoSettings::~VideoSettings() @@ -130,59 +130,42 @@ void VideoSettings::changeEvent(QEvent *e) } } -QAudioEncoderSettings VideoSettings::audioSettings() const -{ - QAudioEncoderSettings settings = mediaRecorder->audioSettings(); - settings.setCodec(boxValue(ui->audioCodecBox).toString()); - settings.setQuality(QMultimedia::EncodingQuality(ui->audioQualitySlider->value())); - settings.setSampleRate(boxValue(ui->audioSampleRateBox).toInt()); - return settings; -} - -void VideoSettings::setAudioSettings(const QAudioEncoderSettings &audioSettings) +QMediaEncoderSettings VideoSettings::encoderSettings() const { - selectComboBoxItem(ui->audioCodecBox, QVariant(audioSettings.codec())); - selectComboBoxItem(ui->audioSampleRateBox, QVariant(audioSettings.sampleRate())); - ui->audioQualitySlider->setValue(audioSettings.quality()); -} + QMediaEncoderSettings settings = mediaRecorder->encoderSettings(); + settings.setQuality(QMultimedia::EncodingQuality(ui->qualitySlider->value())); + settings.setFormat(boxValue(ui->containerFormatBox).value<QMediaFormat::FileFormat>()); -QVideoEncoderSettings VideoSettings::videoSettings() const -{ - QVideoEncoderSettings settings = mediaRecorder->videoSettings(); - settings.setCodec(boxValue(ui->videoCodecBox).toString()); - settings.setQuality(QMultimedia::EncodingQuality(ui->videoQualitySlider->value())); - settings.setResolution(boxValue(ui->videoResolutionBox).toSize()); - settings.setFrameRate(boxValue(ui->videoFramerateBox).value<qreal>()); + settings.setAudioCodec(boxValue(ui->audioCodecBox).value<QMediaFormat::AudioCodec>()); + settings.setAudioSampleRate(ui->audioSampleRateBox->value()); + settings.setVideoCodec(boxValue(ui->videoCodecBox).value<QMediaFormat::VideoCodec>()); + settings.setVideoResolution(boxValue(ui->videoResolutionBox).toSize()); + settings.setVideoFrameRate(boxValue(ui->videoFramerateBox).value<qreal>()); return settings; } -void VideoSettings::setVideoSettings(const QVideoEncoderSettings &videoSettings) +void VideoSettings::setEncoderSettings(const QMediaEncoderSettings &encoderSettings) { - selectComboBoxItem(ui->videoCodecBox, QVariant(videoSettings.codec())); - selectComboBoxItem(ui->videoResolutionBox, QVariant(videoSettings.resolution())); - ui->videoQualitySlider->setValue(videoSettings.quality()); + selectComboBoxItem(ui->containerFormatBox, QVariant::fromValue(encoderSettings.format())); + ui->qualitySlider->setValue(encoderSettings.quality()); + + selectComboBoxItem(ui->audioCodecBox, QVariant::fromValue(encoderSettings.audioCodec())); + ui->audioSampleRateBox->setValue(encoderSettings.audioSampleRate()); + + selectComboBoxItem(ui->videoCodecBox, QVariant::fromValue(encoderSettings.videoCodec())); + selectComboBoxItem(ui->videoResolutionBox, QVariant(encoderSettings.videoResolution())); //special case for frame rate for (int i = 0; i < ui->videoFramerateBox->count(); ++i) { qreal itemRate = ui->videoFramerateBox->itemData(i).value<qreal>(); - if (qFuzzyCompare(itemRate, videoSettings.frameRate())) { + if (qFuzzyCompare(itemRate, encoderSettings.videoFrameRate())) { ui->videoFramerateBox->setCurrentIndex(i); break; } } } -QString VideoSettings::format() const -{ - return boxValue(ui->containerFormatBox).toString(); -} - -void VideoSettings::setFormat(const QString &format) -{ - selectComboBoxItem(ui->containerFormatBox, QVariant(format)); -} - QVariant VideoSettings::boxValue(const QComboBox *box) const { int idx = box->currentIndex(); diff --git a/examples/multimediawidgets/camera/videosettings.h b/examples/multimediawidgets/camera/videosettings.h index a192942a9..35970d150 100644 --- a/examples/multimediawidgets/camera/videosettings.h +++ b/examples/multimediawidgets/camera/videosettings.h @@ -69,14 +69,8 @@ public: explicit VideoSettings(QMediaRecorder *mediaRecorder, QWidget *parent = nullptr); ~VideoSettings(); - QAudioEncoderSettings audioSettings() const; - void setAudioSettings(const QAudioEncoderSettings&); - - QVideoEncoderSettings videoSettings() const; - void setVideoSettings(const QVideoEncoderSettings&); - - QString format() const; - void setFormat(const QString &format); + QMediaEncoderSettings encoderSettings() const; + void setEncoderSettings(const QMediaEncoderSettings&); protected: void changeEvent(QEvent *e) override; diff --git a/examples/multimediawidgets/camera/videosettings.ui b/examples/multimediawidgets/camera/videosettings.ui index 940b7db7a..e30e31608 100644 --- a/examples/multimediawidgets/camera/videosettings.ui +++ b/examples/multimediawidgets/camera/videosettings.ui @@ -6,149 +6,150 @@ <rect> <x>0</x> <y>0</y> - <width>561</width> - <height>369</height> + <width>686</width> + <height>499</height> </rect> </property> <property name="windowTitle"> <string>Video Settings</string> </property> - <layout class="QGridLayout" name="gridLayout_4"> - <item row="0" column="0"> - <widget class="QScrollArea" name="scrollArea"> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> + <layout class="QGridLayout" name="gridLayout_3"> + <item row="4" column="1"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> </property> - <property name="widgetResizable"> - <bool>true</bool> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property> - <widget class="QWidget" name="scrollAreaWidgetContents"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>543</width> - <height>250</height> - </rect> + </widget> + </item> + <item row="2" column="1"> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Video</string> + </property> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="1" column="0" colspan="2"> + <widget class="QComboBox" name="videoResolutionBox"/> + </item> + <item row="4" column="0" colspan="2"> + <widget class="QLabel" name="label_6"> + <property name="text"> + <string>Video Codec:</string> + </property> + </widget> + </item> + <item row="3" column="0" colspan="2"> + <widget class="QComboBox" name="videoFramerateBox"/> + </item> + <item row="2" column="0" colspan="2"> + <widget class="QLabel" name="label_9"> + <property name="text"> + <string>Framerate:</string> + </property> + </widget> + </item> + <item row="0" column="0" colspan="2"> + <widget class="QLabel" name="label_8"> + <property name="text"> + <string>Resolution:</string> + </property> + </widget> + </item> + <item row="5" column="0" colspan="2"> + <widget class="QComboBox" name="videoCodecBox"/> + </item> + </layout> + </widget> + </item> + <item row="2" column="0"> + <widget class="QWidget" name="widget" native="true"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> </property> - <layout class="QGridLayout" name="gridLayout_3"> - <item row="0" column="0"> - <widget class="QGroupBox" name="groupBox"> - <property name="title"> - <string>Audio</string> - </property> - <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="0" colspan="2"> - <widget class="QLabel" name="label_2"> - <property name="text"> - <string>Audio Codec:</string> - </property> - </widget> - </item> - <item row="1" column="0" colspan="2"> - <widget class="QComboBox" name="audioCodecBox"/> - </item> - <item row="2" column="0" colspan="2"> - <widget class="QLabel" name="label_5"> - <property name="text"> - <string>Sample Rate:</string> - </property> - </widget> - </item> - <item row="3" column="0" colspan="2"> - <widget class="QComboBox" name="audioSampleRateBox"/> - </item> - <item row="4" column="0"> - <widget class="QLabel" name="label_3"> - <property name="text"> - <string>Quality:</string> - </property> - </widget> - </item> - <item row="4" column="1"> - <widget class="QSlider" name="audioQualitySlider"> - <property name="maximum"> - <number>4</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item row="0" column="1" rowspan="3"> - <widget class="QGroupBox" name="groupBox_2"> - <property name="title"> - <string>Video</string> - </property> - <layout class="QGridLayout" name="gridLayout_2"> - <item row="0" column="0" colspan="2"> - <widget class="QLabel" name="label_8"> - <property name="text"> - <string>Resolution:</string> - </property> - </widget> - </item> - <item row="1" column="0" colspan="2"> - <widget class="QComboBox" name="videoResolutionBox"/> - </item> - <item row="2" column="0" colspan="2"> - <widget class="QLabel" name="label_9"> - <property name="text"> - <string>Framerate:</string> - </property> - </widget> - </item> - <item row="3" column="0" colspan="2"> - <widget class="QComboBox" name="videoFramerateBox"/> - </item> - <item row="4" column="0" colspan="2"> - <widget class="QLabel" name="label_6"> - <property name="text"> - <string>Video Codec:</string> - </property> - </widget> - </item> - <item row="5" column="0" colspan="2"> - <widget class="QComboBox" name="videoCodecBox"/> - </item> - <item row="6" column="0"> - <widget class="QLabel" name="label_7"> - <property name="text"> - <string>Quality:</string> - </property> - </widget> - </item> - <item row="6" column="1"> - <widget class="QSlider" name="videoQualitySlider"> - <property name="maximum"> - <number>4</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_4"> - <property name="text"> - <string>Container Format:</string> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QComboBox" name="containerFormatBox"/> - </item> - </layout> - </widget> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QGroupBox" name="groupBox_3"> + <property name="title"> + <string>Audio</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Audio Codec:</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="audioCodecBox"/> + </item> + <item> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>Sample Rate:</string> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="audioSampleRateBox"/> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox"> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Quality:</string> + </property> + </widget> + </item> + <item> + <widget class="QSlider" name="qualitySlider"> + <property name="maximum"> + <number>4</number> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>File Format:</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="containerFormatBox"/> + </item> + </layout> + </widget> + </item> + </layout> </widget> </item> - <item row="1" column="0"> + <item row="3" column="0"> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -156,21 +157,11 @@ <property name="sizeHint" stdset="0"> <size> <width>20</width> - <height>14</height> + <height>40</height> </size> </property> </spacer> </item> - <item row="2" column="0"> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> - </property> - </widget> - </item> </layout> </widget> <resources/> diff --git a/src/imports/multimedia/qdeclarativecamerarecorder.cpp b/src/imports/multimedia/qdeclarativecamerarecorder.cpp index 2739d19e0..fecff9145 100644 --- a/src/imports/multimedia/qdeclarativecamerarecorder.cpp +++ b/src/imports/multimedia/qdeclarativecamerarecorder.cpp @@ -103,7 +103,7 @@ QDeclarativeCameraRecorder::~QDeclarativeCameraRecorder() */ QSize QDeclarativeCameraRecorder::captureResolution() { - return m_videoSettings.resolution(); + return m_encoderSettings.videoResolution(); } /*! @@ -114,9 +114,9 @@ QSize QDeclarativeCameraRecorder::captureResolution() \sa {QtMultimedia::CameraImageProcessing::whiteBalanceMode}{whileBalanceMode} */ -QString QDeclarativeCameraRecorder::audioCodec() const +QMediaFormat::AudioCodec QDeclarativeCameraRecorder::audioCodec() const { - return m_audioSettings.codec(); + return m_encoderSettings.audioCodec(); } /*! @@ -125,9 +125,9 @@ QString QDeclarativeCameraRecorder::audioCodec() const This property holds the video codec to be used for recording video. Typically this is \c h264. */ -QString QDeclarativeCameraRecorder::videoCodec() const +QMediaFormat::VideoCodec QDeclarativeCameraRecorder::videoCodec() const { - return m_videoSettings.codec(); + return m_encoderSettings.videoCodec(); } /*! @@ -136,47 +136,48 @@ QString QDeclarativeCameraRecorder::videoCodec() const This property holds the media container to be used for recording video. Typically this is \c mp4. */ -QString QDeclarativeCameraRecorder::mediaContainer() const +QMediaFormat::FileFormat QDeclarativeCameraRecorder::mediaContainer() const { - return m_mediaContainer; + return m_encoderSettings.format(); } void QDeclarativeCameraRecorder::setCaptureResolution(const QSize &resolution) { - m_videoSettings = m_recorder->videoSettings(); + m_encoderSettings = m_recorder->encoderSettings(); if (resolution != captureResolution()) { - m_videoSettings.setResolution(resolution); - m_recorder->setVideoSettings(m_videoSettings); + m_encoderSettings.setVideoResolution(resolution); + m_recorder->setEncoderSettings(m_encoderSettings); emit captureResolutionChanged(resolution); } } -void QDeclarativeCameraRecorder::setAudioCodec(const QString &codec) +void QDeclarativeCameraRecorder::setAudioCodec(QMediaFormat::AudioCodec codec) { - m_audioSettings = m_recorder->audioSettings(); + m_encoderSettings = m_recorder->encoderSettings(); if (codec != audioCodec()) { - m_audioSettings.setCodec(codec); - m_recorder->setAudioSettings(m_audioSettings); - emit audioCodecChanged(codec); + m_encoderSettings.setAudioCodec(codec); + m_recorder->setEncoderSettings(m_encoderSettings); + emit audioCodecChanged(); } } -void QDeclarativeCameraRecorder::setVideoCodec(const QString &codec) +void QDeclarativeCameraRecorder::setVideoCodec(QMediaFormat::VideoCodec codec) { - m_videoSettings = m_recorder->videoSettings(); + m_encoderSettings = m_recorder->encoderSettings(); if (codec != videoCodec()) { - m_videoSettings.setCodec(codec); - m_recorder->setVideoSettings(m_videoSettings); - emit videoCodecChanged(codec); + m_encoderSettings.setVideoCodec(codec); + m_recorder->setEncoderSettings(m_encoderSettings); + emit videoCodecChanged(); } } -void QDeclarativeCameraRecorder::setMediaContainer(const QString &container) +void QDeclarativeCameraRecorder::setMediaContainer(QMediaFormat::FileFormat container) { - if (container != m_mediaContainer) { - m_mediaContainer = container; - m_recorder->setContainerFormat(container); - emit mediaContainerChanged(container); + m_encoderSettings = m_recorder->encoderSettings(); + if (container != m_encoderSettings.format()) { + m_encoderSettings.setFormat(container); + m_recorder->setEncoderSettings(m_encoderSettings); + emit mediaContainerChanged(); } } @@ -187,7 +188,7 @@ void QDeclarativeCameraRecorder::setMediaContainer(const QString &container) */ qreal QDeclarativeCameraRecorder::frameRate() const { - return m_videoSettings.frameRate(); + return m_encoderSettings.videoFrameRate(); } /*! @@ -197,7 +198,7 @@ qreal QDeclarativeCameraRecorder::frameRate() const */ int QDeclarativeCameraRecorder::videoBitRate() const { - return m_videoSettings.bitRate(); + return m_encoderSettings.videoBitRate(); } /*! @@ -207,7 +208,7 @@ int QDeclarativeCameraRecorder::videoBitRate() const */ int QDeclarativeCameraRecorder::audioBitRate() const { - return m_audioSettings.bitRate(); + return m_encoderSettings.audioBitRate(); } /*! @@ -218,7 +219,7 @@ int QDeclarativeCameraRecorder::audioBitRate() const */ int QDeclarativeCameraRecorder::audioChannels() const { - return m_audioSettings.channelCount(); + return m_encoderSettings.audioChannelCount(); } /*! @@ -228,7 +229,7 @@ int QDeclarativeCameraRecorder::audioChannels() const */ int QDeclarativeCameraRecorder::audioSampleRate() const { - return m_audioSettings.sampleRate(); + return m_encoderSettings.audioSampleRate(); } /*! @@ -254,7 +255,7 @@ int QDeclarativeCameraRecorder::audioSampleRate() const */ QDeclarativeCameraRecorder::EncodingMode QDeclarativeCameraRecorder::videoEncodingMode() const { - return EncodingMode(m_videoSettings.encodingMode()); + return EncodingMode(m_encoderSettings.encodingMode()); } /*! @@ -277,75 +278,75 @@ QDeclarativeCameraRecorder::EncodingMode QDeclarativeCameraRecorder::videoEncodi */ QDeclarativeCameraRecorder::EncodingMode QDeclarativeCameraRecorder::audioEncodingMode() const { - return EncodingMode(m_audioSettings.encodingMode()); + return EncodingMode(m_encoderSettings.encodingMode()); } void QDeclarativeCameraRecorder::setFrameRate(qreal frameRate) { - m_videoSettings = m_recorder->videoSettings(); - if (!qFuzzyCompare(m_videoSettings.frameRate(),frameRate)) { - m_videoSettings.setFrameRate(frameRate); - m_recorder->setVideoSettings(m_videoSettings); + m_encoderSettings = m_recorder->encoderSettings(); + if (!qFuzzyCompare(m_encoderSettings.videoFrameRate(),frameRate)) { + m_encoderSettings.setVideoFrameRate(frameRate); + m_recorder->setEncoderSettings(m_encoderSettings); emit frameRateChanged(frameRate); } } void QDeclarativeCameraRecorder::setVideoBitRate(int rate) { - m_videoSettings = m_recorder->videoSettings(); - if (m_videoSettings.bitRate() != rate) { - m_videoSettings.setBitRate(rate); - m_recorder->setVideoSettings(m_videoSettings); + m_encoderSettings = m_recorder->encoderSettings(); + if (m_encoderSettings.videoBitRate() != rate) { + m_encoderSettings.setVideoBitRate(rate); + m_recorder->setEncoderSettings(m_encoderSettings); emit videoBitRateChanged(rate); } } void QDeclarativeCameraRecorder::setAudioBitRate(int rate) { - m_audioSettings = m_recorder->audioSettings(); - if (m_audioSettings.bitRate() != rate) { - m_audioSettings.setBitRate(rate); - m_recorder->setAudioSettings(m_audioSettings); + m_encoderSettings = m_recorder->encoderSettings(); + if (m_encoderSettings.audioBitRate() != rate) { + m_encoderSettings.setAudioBitRate(rate); + m_recorder->setEncoderSettings(m_encoderSettings); emit audioBitRateChanged(rate); } } void QDeclarativeCameraRecorder::setAudioChannels(int channels) { - m_audioSettings = m_recorder->audioSettings(); - if (m_audioSettings.channelCount() != channels) { - m_audioSettings.setChannelCount(channels); - m_recorder->setAudioSettings(m_audioSettings); + m_encoderSettings = m_recorder->encoderSettings(); + if (m_encoderSettings.audioChannelCount() != channels) { + m_encoderSettings.setAudioChannelCount(channels); + m_recorder->setEncoderSettings(m_encoderSettings); emit audioChannelsChanged(channels); } } void QDeclarativeCameraRecorder::setAudioSampleRate(int rate) { - m_audioSettings = m_recorder->audioSettings(); - if (m_audioSettings.sampleRate() != rate) { - m_audioSettings.setSampleRate(rate); - m_recorder->setAudioSettings(m_audioSettings); + m_encoderSettings = m_recorder->encoderSettings(); + if (m_encoderSettings.audioSampleRate() != rate) { + m_encoderSettings.setAudioSampleRate(rate); + m_recorder->setEncoderSettings(m_encoderSettings); emit audioSampleRateChanged(rate); } } void QDeclarativeCameraRecorder::setAudioEncodingMode(QDeclarativeCameraRecorder::EncodingMode encodingMode) { - m_audioSettings = m_recorder->audioSettings(); - if (m_audioSettings.encodingMode() != QMultimedia::EncodingMode(encodingMode)) { - m_audioSettings.setEncodingMode(QMultimedia::EncodingMode(encodingMode)); - m_recorder->setAudioSettings(m_audioSettings); + m_encoderSettings = m_recorder->encoderSettings(); + if (m_encoderSettings.encodingMode() != QMultimedia::EncodingMode(encodingMode)) { + m_encoderSettings.setEncodingMode(QMultimedia::EncodingMode(encodingMode)); + m_recorder->setEncoderSettings(m_encoderSettings); emit audioEncodingModeChanged(encodingMode); } } void QDeclarativeCameraRecorder::setVideoEncodingMode(QDeclarativeCameraRecorder::EncodingMode encodingMode) { - m_videoSettings = m_recorder->videoSettings(); - if (m_videoSettings.encodingMode() != QMultimedia::EncodingMode(encodingMode)) { - m_videoSettings.setEncodingMode(QMultimedia::EncodingMode(encodingMode)); - m_recorder->setVideoSettings(m_videoSettings); + m_encoderSettings = m_recorder->encoderSettings(); + if (m_encoderSettings.encodingMode() != QMultimedia::EncodingMode(encodingMode)) { + m_encoderSettings.setEncodingMode(QMultimedia::EncodingMode(encodingMode)); + m_recorder->setEncoderSettings(m_encoderSettings); emit videoEncodingModeChanged(encodingMode); } } diff --git a/src/imports/multimedia/qdeclarativecamerarecorder_p.h b/src/imports/multimedia/qdeclarativecamerarecorder_p.h index be30f48f6..da1894507 100644 --- a/src/imports/multimedia/qdeclarativecamerarecorder_p.h +++ b/src/imports/multimedia/qdeclarativecamerarecorder_p.h @@ -54,6 +54,7 @@ #include <qcamera.h> #include <qmediarecorder.h> #include <qmediaencodersettings.h> +#include <qmediaformat.h> QT_BEGIN_NAMESPACE @@ -70,19 +71,19 @@ class QDeclarativeCameraRecorder : public QObject Q_PROPERTY(RecorderState recorderState READ recorderState WRITE setRecorderState NOTIFY recorderStateChanged) Q_PROPERTY(RecorderStatus recorderStatus READ recorderStatus NOTIFY recorderStatusChanged) - Q_PROPERTY(QString videoCodec READ videoCodec WRITE setVideoCodec NOTIFY videoCodecChanged) + Q_PROPERTY(QMediaFormat::VideoCodec videoCodec READ videoCodec WRITE setVideoCodec NOTIFY videoCodecChanged) Q_PROPERTY(QSize resolution READ captureResolution WRITE setCaptureResolution NOTIFY captureResolutionChanged) Q_PROPERTY(qreal frameRate READ frameRate WRITE setFrameRate NOTIFY frameRateChanged) Q_PROPERTY(int videoBitRate READ videoBitRate WRITE setVideoBitRate NOTIFY videoBitRateChanged) Q_PROPERTY(EncodingMode videoEncodingMode READ videoEncodingMode WRITE setVideoEncodingMode NOTIFY videoEncodingModeChanged) - Q_PROPERTY(QString audioCodec READ audioCodec WRITE setAudioCodec NOTIFY audioCodecChanged) + Q_PROPERTY(QMediaFormat::AudioCodec audioCodec READ audioCodec WRITE setAudioCodec NOTIFY audioCodecChanged) Q_PROPERTY(int audioBitRate READ audioBitRate WRITE setAudioBitRate NOTIFY audioBitRateChanged) Q_PROPERTY(int audioChannels READ audioChannels WRITE setAudioChannels NOTIFY audioChannelsChanged) Q_PROPERTY(int audioSampleRate READ audioSampleRate WRITE setAudioSampleRate NOTIFY audioSampleRateChanged) Q_PROPERTY(EncodingMode audioEncodingMode READ audioEncodingMode WRITE setAudioEncodingMode NOTIFY audioEncodingModeChanged) - Q_PROPERTY(QString mediaContainer READ mediaContainer WRITE setMediaContainer NOTIFY mediaContainerChanged) + Q_PROPERTY(QMediaFormat::FileFormat mediaContainer READ mediaContainer WRITE setMediaContainer NOTIFY mediaContainerChanged) Q_PROPERTY(qint64 duration READ duration NOTIFY durationChanged) Q_PROPERTY(QString outputLocation READ outputLocation WRITE setOutputLocation NOTIFY outputLocationChanged) @@ -137,9 +138,9 @@ public: qint64 duration() const; bool isMuted() const; - QString audioCodec() const; - QString videoCodec() const; - QString mediaContainer() const; + QMediaFormat::AudioCodec audioCodec() const; + QMediaFormat::VideoCodec videoCodec() const; + QMediaFormat::FileFormat mediaContainer() const; Error errorCode() const; QString errorString() const; @@ -164,9 +165,9 @@ public Q_SLOTS: void setMetadata(const QString &key, const QVariant &value); void setCaptureResolution(const QSize &resolution); - void setAudioCodec(const QString &codec); - void setVideoCodec(const QString &codec); - void setMediaContainer(const QString &container); + void setAudioCodec(QMediaFormat::AudioCodec codec); + void setVideoCodec(QMediaFormat::VideoCodec codec); + void setMediaContainer(QMediaFormat::FileFormat container); void setFrameRate(qreal frameRate); void setVideoBitRate(int rate); @@ -190,9 +191,9 @@ Q_SIGNALS: void metaDataChanged(const QString &key, const QVariant &value); void captureResolutionChanged(const QSize &); - void audioCodecChanged(const QString &codec); - void videoCodecChanged(const QString &codec); - void mediaContainerChanged(const QString &container); + void audioCodecChanged(); + void videoCodecChanged(); + void mediaContainerChanged(); void frameRateChanged(qreal arg); void videoBitRateChanged(int arg); @@ -214,9 +215,7 @@ private: QMediaRecorder *m_recorder; - QAudioEncoderSettings m_audioSettings; - QVideoEncoderSettings m_videoSettings; - QString m_mediaContainer; + QMediaEncoderSettings m_encoderSettings; }; QT_END_NAMESPACE diff --git a/src/multimedia/CMakeLists.txt b/src/multimedia/CMakeLists.txt index 2e408425c..1ecca6352 100644 --- a/src/multimedia/CMakeLists.txt +++ b/src/multimedia/CMakeLists.txt @@ -31,20 +31,17 @@ qt_internal_add_module(Multimedia camera/qcameraimageprocessing.cpp camera/qcameraimageprocessing.h camera/qcamerainfo.cpp camera/qcamerainfo.h camera/qcamerainfo_p.h controls/qaudiodecodercontrol.cpp controls/qaudiodecodercontrol.h - controls/qaudioencodersettingscontrol.cpp controls/qaudioencodersettingscontrol.h controls/qcameracontrol.cpp controls/qcameracontrol.h controls/qcameraexposurecontrol.cpp controls/qcameraexposurecontrol.h controls/qcamerafocuscontrol.cpp controls/qcamerafocuscontrol.h controls/qcameraimagecapturecontrol.cpp controls/qcameraimagecapturecontrol.h controls/qcameraimageprocessingcontrol.cpp controls/qcameraimageprocessingcontrol.h controls/qimageencodercontrol.cpp controls/qimageencodercontrol.h - controls/qmediacontainercontrol.cpp controls/qmediacontainercontrol.h controls/qmediaplayercontrol.cpp controls/qmediaplayercontrol.h controls/qmediarecordercontrol.cpp controls/qmediarecordercontrol.h controls/qmediastreamscontrol.cpp controls/qmediastreamscontrol.h controls/qmetadatareadercontrol.cpp controls/qmetadatareadercontrol.h controls/qmetadatawritercontrol.cpp controls/qmetadatawritercontrol.h - controls/qvideoencodersettingscontrol.cpp controls/qvideoencodersettingscontrol.h controls/qvideorenderercontrol.cpp controls/qvideorenderercontrol.h controls/qvideowindowcontrol.cpp controls/qvideowindowcontrol.h platform/qmediaplatformcaptureinterface.cpp platform/qmediaplatformcaptureinterface_p.h @@ -203,15 +200,12 @@ qt_internal_extend_target(Multimedia CONDITION QT_FEATURE_gstreamer platform/gstreamer/audio/qaudiooutput_gstreamer.cpp platform/gstreamer/audio/qaudiooutput_gstreamer_p.h platform/gstreamer/audio/qgstreameraudiodecodercontrol.cpp platform/gstreamer/audio/qgstreameraudiodecodercontrol_p.h platform/gstreamer/common/qgstappsrc.cpp platform/gstreamer/common/qgstappsrc_p.h - platform/gstreamer/common/qgstreameraudioencoder.cpp platform/gstreamer/common/qgstreameraudioencoder_p.h - platform/gstreamer/common/qgstreamercontainer.cpp platform/gstreamer/common/qgstreamercontainer_p.h platform/gstreamer/common/qgstcodecsinfo.cpp platform/gstreamer/common/qgstcodecsinfo_p.h platform/gstreamer/common/qgstreamerbufferprobe.cpp platform/gstreamer/common/qgstreamerbufferprobe_p.h platform/gstreamer/common/qgstreamerbushelper.cpp platform/gstreamer/common/qgstreamerbushelper_p.h platform/gstreamer/common/qgstreamermessage.cpp platform/gstreamer/common/qgstreamermessage_p.h platform/gstreamer/common/qgstreamerplayercontrol.cpp platform/gstreamer/common/qgstreamerplayercontrol_p.h platform/gstreamer/common/qgstreamerplayersession.cpp platform/gstreamer/common/qgstreamerplayersession_p.h - platform/gstreamer/common/qgstreamervideoencoder.cpp platform/gstreamer/common/qgstreamervideoencoder_p.h platform/gstreamer/common/qgstreamervideooverlay.cpp platform/gstreamer/common/qgstreamervideooverlay_p.h platform/gstreamer/common/qgstreamervideorenderer.cpp platform/gstreamer/common/qgstreamervideorenderer_p.h platform/gstreamer/common/qgstreamervideorendererinterface.cpp platform/gstreamer/common/qgstreamervideorendererinterface_p.h @@ -237,8 +231,6 @@ qt_internal_extend_target(Multimedia CONDITION QT_FEATURE_gstreamer qt_internal_extend_target(Multimedia CONDITION QT_FEATURE_gstreamer AND use_camerabin SOURCES - platform/gstreamer/camerabin/qgstreameraudioencodercontrol.cpp platform/gstreamer/camerabin/qgstreameraudioencodercontrol_p.h - platform/gstreamer/camerabin/qgstreamercontainercontrol.cpp platform/gstreamer/camerabin/qgstreamercontainercontrol_p.h platform/gstreamer/camerabin/camerabincontrol.cpp platform/gstreamer/camerabin/camerabincontrol_p.h platform/gstreamer/camerabin/camerabinimagecapture.cpp platform/gstreamer/camerabin/camerabinimagecapture_p.h platform/gstreamer/camerabin/camerabinimageencoder.cpp platform/gstreamer/camerabin/camerabinimageencoder_p.h @@ -247,7 +239,6 @@ qt_internal_extend_target(Multimedia CONDITION QT_FEATURE_gstreamer AND use_came platform/gstreamer/camerabin/camerabinrecorder.cpp platform/gstreamer/camerabin/camerabinrecorder_p.h platform/gstreamer/camerabin/camerabinservice.cpp platform/gstreamer/camerabin/camerabinservice_p.h platform/gstreamer/camerabin/camerabinsession.cpp platform/gstreamer/camerabin/camerabinsession_p.h - platform/gstreamer/camerabin/qgstreamervideoencodercontrol.cpp platform/gstreamer/camerabin/qgstreamervideoencodercontrol_p.h DEFINES GST_USE_CAMERABIN ) @@ -351,7 +342,6 @@ qt_internal_extend_target(Multimedia CONDITION ANDROID platform/android/common/qandroidglobal_p.h 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/qandroidaudioencodersettingscontrol.cpp platform/android/mediacapture/qandroidaudioencodersettingscontrol_p.h platform/android/mediacapture/qandroidcameracontrol.cpp platform/android/mediacapture/qandroidcameracontrol_p.h platform/android/mediacapture/qandroidcameraexposurecontrol.cpp platform/android/mediacapture/qandroidcameraexposurecontrol_p.h platform/android/mediacapture/qandroidcamerafocuscontrol.cpp platform/android/mediacapture/qandroidcamerafocuscontrol_p.h @@ -362,9 +352,7 @@ qt_internal_extend_target(Multimedia CONDITION ANDROID platform/android/mediacapture/qandroidcaptureservice.cpp platform/android/mediacapture/qandroidcaptureservice_p.h platform/android/mediacapture/qandroidcapturesession.cpp platform/android/mediacapture/qandroidcapturesession_p.h platform/android/mediacapture/qandroidimageencodercontrol.cpp platform/android/mediacapture/qandroidimageencodercontrol_p.h - platform/android/mediacapture/qandroidmediacontainercontrol.cpp platform/android/mediacapture/qandroidmediacontainercontrol_p.h platform/android/mediacapture/qandroidmediarecordercontrol.cpp platform/android/mediacapture/qandroidmediarecordercontrol_p.h - platform/android/mediacapture/qandroidvideoencodersettingscontrol.cpp platform/android/mediacapture/qandroidvideoencodersettingscontrol_p.h platform/android/mediaplayer/qandroidmediaplayercontrol.cpp platform/android/mediaplayer/qandroidmediaplayercontrol_p.h platform/android/mediaplayer/qandroidmediaplayervideorenderercontrol.cpp platform/android/mediaplayer/qandroidmediaplayervideorenderercontrol_p.h platform/android/mediaplayer/qandroidmediaservice.cpp platform/android/mediaplayer/qandroidmediaservice_p.h @@ -449,7 +437,6 @@ qt_internal_extend_target(Multimedia CONDITION IOS AND NOT WATCHOS qt_internal_extend_target(Multimedia CONDITION APPLE AND NOT TVOS AND NOT WATCHOS SOURCES - platform/darwin/camera/avfaudioencodersettingscontrol.mm platform/darwin/camera/avfaudioencodersettingscontrol_p.h platform/darwin/camera/avfcameracontrol.mm platform/darwin/camera/avfcameracontrol_p.h platform/darwin/camera/avfcameradebug_p.h platform/darwin/camera/avfcameraexposurecontrol.mm platform/darwin/camera/avfcameraexposurecontrol_p.h @@ -462,9 +449,7 @@ qt_internal_extend_target(Multimedia CONDITION APPLE AND NOT TVOS AND NOT WATCHO platform/darwin/camera/avfcamerawindowcontrol.mm platform/darwin/camera/avfcamerawindowcontrol_p.h platform/darwin/camera/avfimagecapturecontrol.mm platform/darwin/camera/avfimagecapturecontrol_p.h platform/darwin/camera/avfimageencodercontrol.mm platform/darwin/camera/avfimageencodercontrol_p.h - platform/darwin/camera/avfmediacontainercontrol.mm platform/darwin/camera/avfmediacontainercontrol_p.h platform/darwin/camera/avfstoragelocation.mm platform/darwin/camera/avfstoragelocation_p.h - platform/darwin/camera/avfvideoencodersettingscontrol.mm platform/darwin/camera/avfvideoencodersettingscontrol_p.h ) qt_internal_extend_target(Multimedia CONDITION MACOS AND NOT TVOS AND NOT WATCHOS diff --git a/src/multimedia/controls/controls.pri b/src/multimedia/controls/controls.pri index 3f5b32c72..f196894cb 100644 --- a/src/multimedia/controls/controls.pri +++ b/src/multimedia/controls/controls.pri @@ -3,20 +3,17 @@ INCLUDEPATH += controls PUBLIC_HEADERS += \ controls/qaudiodecodercontrol.h \ - controls/qaudioencodersettingscontrol.h \ controls/qcameracontrol.h \ controls/qcameraexposurecontrol.h \ controls/qcamerafocuscontrol.h \ controls/qcameraimagecapturecontrol.h \ controls/qcameraimageprocessingcontrol.h \ controls/qimageencodercontrol.h \ - controls/qmediacontainercontrol.h \ controls/qmediaplayercontrol.h \ controls/qmediarecordercontrol.h \ controls/qmediastreamscontrol.h \ controls/qmetadatareadercontrol.h \ controls/qmetadatawritercontrol.h \ - controls/qvideoencodersettingscontrol.h \ controls/qvideorenderercontrol.h \ controls/qvideowindowcontrol.h \ @@ -27,7 +24,6 @@ SOURCES += \ controls/qcameraimagecapturecontrol.cpp \ controls/qcameraimageprocessingcontrol.cpp \ controls/qimageencodercontrol.cpp \ - controls/qmediacontainercontrol.cpp \ controls/qmediaplayercontrol.cpp \ controls/qmediarecordercontrol.cpp \ controls/qmediastreamscontrol.cpp \ @@ -36,5 +32,3 @@ SOURCES += \ controls/qvideorenderercontrol.cpp \ controls/qvideowindowcontrol.cpp \ controls/qaudiodecodercontrol.cpp \ - controls/qvideoencodersettingscontrol.cpp \ - controls/qaudioencodersettingscontrol.cpp \ diff --git a/src/multimedia/controls/qaudioencodersettingscontrol.cpp b/src/multimedia/controls/qaudioencodersettingscontrol.cpp deleted file mode 100644 index 692fa28e2..000000000 --- a/src/multimedia/controls/qaudioencodersettingscontrol.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qaudioencodersettingscontrol.h" -#include <QtCore/qstringlist.h> - -QT_BEGIN_NAMESPACE - - -/*! - \class QAudioEncoderSettingsControl - \obsolete - \inmodule QtMultimedia - - \ingroup multimedia_control - - \brief The QAudioEncoderSettingsControl class provides access to the settings of a - media service that performs audio encoding. - - If a QMediaService supports encoding audio data it will implement - QAudioEncoderSettingsControl. This control provides information about the limits - of restricted audio encoder options and allows the selection of a set of - audio encoder settings as specified in a QAudioEncoderSettings object. - - The functionality provided by this control is exposed to application code through the - QMediaRecorder class. - - The interface name of QAudioEncoderSettingsControl is \c org.qt-project.qt.audioencodersettingscontrol/5.0 as - defined in QAudioEncoderSettingsControl_iid. - - \sa QMediaService::requestControl(), QMediaRecorder -*/ - -/*! - \macro QAudioEncoderSettingsControl_iid - - \c org.qt-project.qt.audioencodersettingscontrol/5.0 - - Defines the interface name of the QAudioEncoderSettingsControl class. - - \relates QAudioEncoderSettingsControl -*/ - -/*! - Create a new audio encoder settings control object with the given \a parent. -*/ -QAudioEncoderSettingsControl::QAudioEncoderSettingsControl(QObject *parent) - :QObject(parent) -{ -} - -/*! - \fn QAudioEncoderSettingsControl::supportedAudioCodecs() const - - Returns the list of supported audio codec names. -*/ - -/*! - \fn QAudioEncoderSettingsControl::codecDescription(const QString &codecName) const - - Returns the description of audio codec \a codecName. -*/ - -/*! - \fn QAudioEncoderSettingsControl::supportedSampleRates(const QAudioEncoderSettings &settings = QAudioEncoderSettings(), - bool *continuous) const - - Returns the list of supported audio sample rates, if known. - - If non null audio \a settings parameter is passed, - the returned list is reduced to sample rates supported with partial settings applied. - - It can be used for example to query the list of sample rates, supported by specific audio codec. - - If the encoder supports arbitrary sample rates within the supported rates range, - *\a continuous is set to true, otherwise *\a continuous is set to false. -*/ - -/*! - \fn QAudioEncoderSettingsControl::audioSettings() const - - Returns the audio encoder settings. - - The returned value may be different tha passed to QAudioEncoderSettingsControl::setAudioSettings() - if the settings contains the default or undefined parameters. - In this case if the undefined parameters are already resolved, they should be returned. -*/ - -/*! - \fn QAudioEncoderSettingsControl::setAudioSettings(const QAudioEncoderSettings &settings) - - Sets the selected audio \a settings. -*/ - -QT_END_NAMESPACE - -#include "moc_qaudioencodersettingscontrol.cpp" diff --git a/src/multimedia/controls/qaudioencodersettingscontrol.h b/src/multimedia/controls/qaudioencodersettingscontrol.h deleted file mode 100644 index b2e257f33..000000000 --- a/src/multimedia/controls/qaudioencodersettingscontrol.h +++ /dev/null @@ -1,82 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QAUDIOENCODERSETTINGSCONTROL_H -#define QAUDIOENCODERSETTINGSCONTROL_H - -#include <QtMultimedia/qmediaservice.h> -#include <QtMultimedia/qmediarecorder.h> -#include <QtCore/qlist.h> -#include <QtCore/qpair.h> - -QT_BEGIN_NAMESPACE - -class QAudioFormat; -QT_END_NAMESPACE - -QT_BEGIN_NAMESPACE - -// Required for QDoc workaround -class QString; - -class Q_MULTIMEDIA_EXPORT QAudioEncoderSettingsControl : public QObject -{ - Q_OBJECT - -public: - virtual QStringList supportedAudioCodecs() const = 0; - virtual QString codecDescription(const QString &codecName) const = 0; - - virtual QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, - bool *continuous = nullptr) const = 0; - - virtual QAudioEncoderSettings audioSettings() const = 0; - virtual void setAudioSettings(const QAudioEncoderSettings &settings) = 0; - -protected: - explicit QAudioEncoderSettingsControl(QObject *parent = nullptr); -}; - -#define QAudioEncoderSettingsControl_iid "org.qt-project.qt.audioencodersettingscontrol/5.0" -Q_MEDIA_DECLARE_CONTROL(QAudioEncoderSettingsControl, QAudioEncoderSettingsControl_iid) - -QT_END_NAMESPACE - - -#endif // QAUDIOENCODERSETTINGSCONTROL_H diff --git a/src/multimedia/controls/qmediacontainercontrol.cpp b/src/multimedia/controls/qmediacontainercontrol.cpp deleted file mode 100644 index 851979199..000000000 --- a/src/multimedia/controls/qmediacontainercontrol.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#include "qmediacontainercontrol.h" - -QT_BEGIN_NAMESPACE - -/*! - \class QMediaContainerControl - \obsolete - - \brief The QMediaContainerControl class provides access to the output container format of a QMediaService. - - \inmodule QtMultimedia - - - \ingroup multimedia_control - - If a QMediaService supports writing encoded data it will implement - QMediaContainerControl. This control provides information about the output - containers supported by a media service and allows one to be selected as - the current output containers. - - The functionality provided by this control is exposed to application code - through the QMediaRecorder class. - - The interface name of QMediaContainerControl is \c org.qt-project.qt.mediacontainercontrol/5.0 as - defined in QMediaContainerControl_iid. - - \sa QMediaService::requestControl(), QMediaRecorder -*/ - -/*! - \macro QMediaContainerControl_iid - - \c org.qt-project.qt.mediacontainercontrol/5.0 - - Defines the interface name of the QMediaContainerControl class. - - \relates QMediaContainerControl -*/ - -/*! - Constructs a new media container control with the given \a parent. -*/ -QMediaContainerControl::QMediaContainerControl(QObject *parent) - :QObject(parent) -{ -} - -/*! - \fn QMediaContainerControl::supportedContainers() const - - Returns a list of MIME types of supported container formats. -*/ - -/*! - \fn QMediaContainerControl::containerFormat() const - - Returns the selected container format. -*/ - -/*! - \fn QMediaContainerControl::setContainerFormat(const QString &format) - - Sets the current container \a format. -*/ - -/*! - \fn QMediaContainerControl::containerDescription(const QString &formatMimeType) const - - Returns a description of the container \a formatMimeType. -*/ - -QT_END_NAMESPACE - -#include "moc_qmediacontainercontrol.cpp" diff --git a/src/multimedia/controls/qmediacontainercontrol.h b/src/multimedia/controls/qmediacontainercontrol.h deleted file mode 100644 index 34753b44c..000000000 --- a/src/multimedia/controls/qmediacontainercontrol.h +++ /dev/null @@ -1,72 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#ifndef QMEDIACONTAINERCONTROL_H -#define QMEDIACONTAINERCONTROL_H - -#include <QtMultimedia/qmediaservice.h> - -QT_BEGIN_NAMESPACE - -// Required for QDoc workaround -class QString; - -class Q_MULTIMEDIA_EXPORT QMediaContainerControl : public QObject -{ - Q_OBJECT - -public: - virtual QStringList supportedContainers() const = 0; - virtual QString containerFormat() const = 0; - virtual void setContainerFormat(const QString &format) = 0; - - virtual QString containerDescription(const QString &formatMimeType) const = 0; - -protected: - explicit QMediaContainerControl(QObject *parent = nullptr); -}; - -#define QMediaContainerControl_iid "org.qt-project.qt.mediacontainercontrol/5.0" -Q_MEDIA_DECLARE_CONTROL(QMediaContainerControl, QMediaContainerControl_iid) - -QT_END_NAMESPACE - - -#endif // QMEDIACONTAINERCONTROL_H diff --git a/src/multimedia/controls/qmediarecordercontrol.h b/src/multimedia/controls/qmediarecordercontrol.h index e0851bac4..647ae2de4 100644 --- a/src/multimedia/controls/qmediarecordercontrol.h +++ b/src/multimedia/controls/qmediarecordercontrol.h @@ -74,6 +74,8 @@ public: virtual QAudioDeviceInfo audioInput() const = 0; virtual bool setAudioInput(const QAudioDeviceInfo &id) = 0; + virtual void setEncoderSettings(const QMediaEncoderSettings &settings) = 0; + Q_SIGNALS: void stateChanged(QMediaRecorder::State state); void statusChanged(QMediaRecorder::Status status); diff --git a/src/multimedia/controls/qvideoencodersettingscontrol.cpp b/src/multimedia/controls/qvideoencodersettingscontrol.cpp deleted file mode 100644 index 710b67455..000000000 --- a/src/multimedia/controls/qvideoencodersettingscontrol.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qvideoencodersettingscontrol.h" -#include <QtCore/qstringlist.h> -#include <QtCore/qvariant.h> - -QT_BEGIN_NAMESPACE - -/*! - \class QVideoEncoderSettingsControl - \obsolete - - \inmodule QtMultimedia - - - \ingroup multimedia_control - - \brief The QVideoEncoderSettingsControl class provides access to the settings - of a media service that performs video encoding. - - If a QMediaService supports encoding video data it will implement - QVideoEncoderSettingsControl. This control provides information about the limits - of restricted video encoder options and allows the selection of a set of - video encoder settings as specified in a QVideoEncoderSettings object. - - The functionality provided by this control is exposed to application code - through the QMediaRecorder class. - - The interface name of QVideoEncoderSettingsControl is \c org.qt-project.qt.videoencodersettingscontrol/5.0 as - defined in QVideoEncoderSettingsControl_iid. - - \sa QMediaRecorder, QVideoEncoderSettings, QMediaService::requestControl() -*/ - -/*! - \macro QVideoEncoderSettingsControl_iid - - \c org.qt-project.qt.videoencodersettingscontrol/5.0 - - Defines the interface name of the QVideoEncoderSettingsControl class. - - \relates QVideoEncoderSettingsControl -*/ - -/*! - Create a new video encoder settings control object with the given \a parent. -*/ -QVideoEncoderSettingsControl::QVideoEncoderSettingsControl(QObject *parent) - :QObject(parent) -{ -} - -/*! - \fn QVideoEncoderSettingsControl::supportedVideoCodecs() const - - Returns the list of supported video codecs. -*/ - -/*! - \fn QVideoEncoderSettingsControl::videoCodecDescription(const QString &codec) const - - Returns a description of a video \a codec. -*/ - -/*! - \fn QVideoEncoderSettingsControl::supportedResolutions(const QVideoEncoderSettings &settings = QVideoEncoderSettings(), - bool *continuous = 0) const - - Returns a list of supported resolutions. - - If non null video \a settings parameter is passed, - the returned list is reduced to resolution supported with partial settings like - \l {QVideoEncoderSettings::setCodec()}{video codec} or - \l {QVideoEncoderSettings::setFrameRate()}{frame rate} applied. - - If the encoder supports arbitrary resolutions within the supported resolutions range, - *\a continuous is set to true, otherwise *\a continuous is set to false. - - \sa QVideoEncoderSettings::resolution() -*/ - -/*! - \fn QVideoEncoderSettingsControl::supportedFrameRates(const QVideoEncoderSettings &settings = QVideoEncoderSettings(), - bool *continuous = 0) const - - Returns a list of supported frame rates. - - If non null video \a settings parameter is passed, - the returned list is reduced to frame rates supported with partial settings like - \l {QVideoEncoderSettings::setCodec()}{video codec} or - \l {QVideoEncoderSettings::setResolution()}{video resolution} applied. - - If the encoder supports arbitrary frame rates within the supported range, - *\a continuous is set to true, otherwise *\a continuous is set to false. - - \sa QVideoEncoderSettings::frameRate() -*/ - -/*! - \fn QVideoEncoderSettingsControl::videoSettings() const - - Returns the video encoder settings. - - The returned value may be different tha passed to QVideoEncoderSettingsControl::setVideoSettings() - if the settings contains the default or undefined parameters. - In this case if the undefined parameters are already resolved, they should be returned. -*/ - -/*! - \fn QVideoEncoderSettingsControl::setVideoSettings(const QVideoEncoderSettings &settings) - - Sets the selected video encoder \a settings. -*/ - -QT_END_NAMESPACE - -#include "moc_qvideoencodersettingscontrol.cpp" diff --git a/src/multimedia/controls/qvideoencodersettingscontrol.h b/src/multimedia/controls/qvideoencodersettingscontrol.h deleted file mode 100644 index 3edca2d56..000000000 --- a/src/multimedia/controls/qvideoencodersettingscontrol.h +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QVIDEOENCODERSETTINGSCONTROL_H -#define QVIDEOENCODERSETTINGSCONTROL_H - -#include <QtMultimedia/qmediaservice.h> -#include <QtMultimedia/qmediarecorder.h> - -#include <QtCore/qpair.h> -#include <QtCore/qsize.h> - -QT_BEGIN_NAMESPACE - -class QByteArray; -QT_END_NAMESPACE - -QT_BEGIN_NAMESPACE - -// Required for QDoc workaround -class QString; - -class Q_MULTIMEDIA_EXPORT QVideoEncoderSettingsControl : public QObject -{ - Q_OBJECT - -public: - virtual QStringList supportedVideoCodecs() const = 0; - virtual QString videoCodecDescription(const QString &codec) const = 0; - - virtual QVideoEncoderSettings videoSettings() const = 0; - virtual void setVideoSettings(const QVideoEncoderSettings &settings) = 0; - -protected: - explicit QVideoEncoderSettingsControl(QObject *parent = nullptr); -}; - -#define QVideoEncoderSettingsControl_iid "org.qt-project.qt.videoencodersettingscontrol/5.0" -Q_MEDIA_DECLARE_CONTROL(QVideoEncoderSettingsControl, QVideoEncoderSettingsControl_iid) - -QT_END_NAMESPACE - - -#endif diff --git a/src/multimedia/platform/android/mediacapture/mediacapture.pri b/src/multimedia/platform/android/mediacapture/mediacapture.pri index 8a6959d94..6d785d366 100644 --- a/src/multimedia/platform/android/mediacapture/mediacapture.pri +++ b/src/multimedia/platform/android/mediacapture/mediacapture.pri @@ -11,9 +11,6 @@ SOURCES += \ $$PWD/qandroidcamerafocuscontrol.cpp \ $$PWD/qandroidcapturesession.cpp \ $$PWD/qandroidmediarecordercontrol.cpp \ - $$PWD/qandroidaudioencodersettingscontrol.cpp \ - $$PWD/qandroidmediacontainercontrol.cpp \ - $$PWD/qandroidvideoencodersettingscontrol.cpp \ $$PWD/qandroidcameravideorenderercontrol.cpp HEADERS += \ @@ -27,7 +24,4 @@ HEADERS += \ $$PWD/qandroidcamerafocuscontrol_p.h \ $$PWD/qandroidcapturesession_p.h \ $$PWD/qandroidmediarecordercontrol_p.h \ - $$PWD/qandroidaudioencodersettingscontrol_p.h \ - $$PWD/qandroidmediacontainercontrol_p.h \ - $$PWD/qandroidvideoencodersettingscontrol_p.h \ $$PWD/qandroidcameravideorenderercontrol_p.h diff --git a/src/multimedia/platform/android/mediacapture/qandroidaudioencodersettingscontrol.cpp b/src/multimedia/platform/android/mediacapture/qandroidaudioencodersettingscontrol.cpp deleted file mode 100644 index 50a3ca0b6..000000000 --- a/src/multimedia/platform/android/mediacapture/qandroidaudioencodersettingscontrol.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qandroidaudioencodersettingscontrol_p.h" - -#include "qandroidcapturesession_p.h" - -QT_BEGIN_NAMESPACE - -QAndroidAudioEncoderSettingsControl::QAndroidAudioEncoderSettingsControl(QAndroidCaptureSession *session) - : QAudioEncoderSettingsControl() - , m_session(session) -{ -} - -QStringList QAndroidAudioEncoderSettingsControl::supportedAudioCodecs() const -{ - return QStringList() << QLatin1String("amr-nb") << QLatin1String("amr-wb") << QLatin1String("aac"); -} - -QString QAndroidAudioEncoderSettingsControl::codecDescription(const QString &codecName) const -{ - if (codecName == QLatin1String("amr-nb")) - return tr("Adaptive Multi-Rate Narrowband (AMR-NB) audio codec"); - else if (codecName == QLatin1String("amr-wb")) - return tr("Adaptive Multi-Rate Wideband (AMR-WB) audio codec"); - else if (codecName == QLatin1String("aac")) - return tr("AAC Low Complexity (AAC-LC) audio codec"); - - return QString(); -} - -QList<int> QAndroidAudioEncoderSettingsControl::supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous) const -{ - if (continuous) - *continuous = false; - - if (settings.isNull() || settings.codec().isNull() || settings.codec() == QLatin1String("aac")) { - return QList<int>() << 8000 << 11025 << 12000 << 16000 << 22050 - << 24000 << 32000 << 44100 << 48000 << 96000; - } else if (settings.codec() == QLatin1String("amr-nb")) { - return QList<int>() << 8000; - } else if (settings.codec() == QLatin1String("amr-wb")) { - return QList<int>() << 16000; - } - - return QList<int>(); -} - -QAudioEncoderSettings QAndroidAudioEncoderSettingsControl::audioSettings() const -{ - return m_session->audioSettings(); -} - -void QAndroidAudioEncoderSettingsControl::setAudioSettings(const QAudioEncoderSettings &settings) -{ - m_session->setAudioSettings(settings); -} - -QT_END_NAMESPACE diff --git a/src/multimedia/platform/android/mediacapture/qandroidaudioencodersettingscontrol_p.h b/src/multimedia/platform/android/mediacapture/qandroidaudioencodersettingscontrol_p.h deleted file mode 100644 index df380a290..000000000 --- a/src/multimedia/platform/android/mediacapture/qandroidaudioencodersettingscontrol_p.h +++ /dev/null @@ -1,78 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QANDROIDAUDIOENCODERSETTINGSCONTROL_H -#define QANDROIDAUDIOENCODERSETTINGSCONTROL_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include <qaudioencodersettingscontrol.h> - -QT_BEGIN_NAMESPACE - -class QAndroidCaptureSession; - -class QAndroidAudioEncoderSettingsControl : public QAudioEncoderSettingsControl -{ - Q_OBJECT -public: - explicit QAndroidAudioEncoderSettingsControl(QAndroidCaptureSession *session); - - QStringList supportedAudioCodecs() const override; - QString codecDescription(const QString &codecName) const override; - QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = 0) const override; - QAudioEncoderSettings audioSettings() const override; - void setAudioSettings(const QAudioEncoderSettings &settings) override; - -private: - QAndroidCaptureSession *m_session; -}; - -QT_END_NAMESPACE - -#endif // QANDROIDAUDIOENCODERSETTINGSCONTROL_H diff --git a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp index bbd69ff49..26095fd36 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp @@ -50,9 +50,6 @@ #include "qandroidcameraimageprocessingcontrol_p.h" #include "qandroidimageencodercontrol_p.h" #include "qandroidcameraimagecapturecontrol_p.h" -#include "qandroidaudioencodersettingscontrol_p.h" -#include "qandroidvideoencodersettingscontrol_p.h" -#include "qandroidmediacontainercontrol_p.h" QT_BEGIN_NAMESPACE @@ -76,23 +73,14 @@ QAndroidCaptureService::QAndroidCaptureService(QMediaRecorder::CaptureMode mode) m_cameraImageProcessingControl = 0; m_imageEncoderControl = 0; m_imageCaptureControl = 0; - m_videoEncoderSettingsControl = 0; } m_captureSession = new QAndroidCaptureSession(m_cameraSession); m_recorderControl = new QAndroidMediaRecorderControl(m_captureSession); - m_audioEncoderSettingsControl = new QAndroidAudioEncoderSettingsControl(m_captureSession); - m_mediaContainerControl = new QAndroidMediaContainerControl(m_captureSession); - - if (m_videoEnabled) - m_videoEncoderSettingsControl = new QAndroidVideoEncoderSettingsControl(m_captureSession); } QAndroidCaptureService::~QAndroidCaptureService() { - delete m_audioEncoderSettingsControl; - delete m_videoEncoderSettingsControl; - delete m_mediaContainerControl; delete m_recorderControl; delete m_captureSession; delete m_cameraControl; @@ -110,15 +98,6 @@ QObject *QAndroidCaptureService::requestControl(const char *name) if (qstrcmp(name, QMediaRecorderControl_iid) == 0) return m_recorderControl; - if (qstrcmp(name, QMediaContainerControl_iid) == 0) - return m_mediaContainerControl; - - if (qstrcmp(name, QAudioEncoderSettingsControl_iid) == 0) - return m_audioEncoderSettingsControl; - - if (qstrcmp(name, QVideoEncoderSettingsControl_iid) == 0) - return m_videoEncoderSettingsControl; - if (qstrcmp(name, QCameraControl_iid) == 0) return m_cameraControl; diff --git a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h index 3bdb30bbe..b9d7bb685 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h +++ b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h @@ -68,9 +68,6 @@ class QAndroidCameraFocusControl; class QAndroidCameraImageProcessingControl; class QAndroidImageEncoderControl; class QAndroidCameraImageCaptureControl; -class QAndroidAudioEncoderSettingsControl; -class QAndroidVideoEncoderSettingsControl; -class QAndroidMediaContainerControl; class QAndroidCaptureService : public QMediaPlatformCaptureInterface { @@ -96,9 +93,6 @@ private: QAndroidCameraImageProcessingControl *m_cameraImageProcessingControl; QAndroidImageEncoderControl *m_imageEncoderControl; QAndroidCameraImageCaptureControl *m_imageCaptureControl; - QAndroidAudioEncoderSettingsControl *m_audioEncoderSettingsControl; - QAndroidVideoEncoderSettingsControl *m_videoEncoderSettingsControl; - QAndroidMediaContainerControl *m_mediaContainerControl; }; QT_END_NAMESPACE diff --git a/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp b/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp index 64969a064..7672e7a01 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp @@ -58,9 +58,7 @@ QAndroidCaptureSession::QAndroidCaptureSession(QAndroidCameraSession *cameraSess , m_duration(0) , m_state(QMediaRecorder::StoppedState) , m_status(QMediaRecorder::UnloadedStatus) - , m_containerFormatDirty(true) - , m_videoSettingsDirty(true) - , m_audioSettingsDirty(true) + , m_encoderSettingsDirty(true) , m_outputFormat(AndroidMediaRecorder::DefaultOutputFormat) , m_audioEncoder(AndroidMediaRecorder::DefaultAudioEncoder) , m_videoEncoder(AndroidMediaRecorder::DefaultVideoEncoder) @@ -234,21 +232,55 @@ void QAndroidCaptureSession::start() m_mediaRecorder->setOutputFormat(m_outputFormat); // Set audio encoder settings - m_mediaRecorder->setAudioChannels(m_audioSettings.channelCount()); - m_mediaRecorder->setAudioEncodingBitRate(m_audioSettings.bitRate()); - m_mediaRecorder->setAudioSamplingRate(m_audioSettings.sampleRate()); + m_mediaRecorder->setAudioChannels(m_encoderSettings.audioChannelCount()); + m_mediaRecorder->setAudioEncodingBitRate(m_encoderSettings.audioBitRate()); + m_mediaRecorder->setAudioSamplingRate(m_encoderSettings.audioSampleRate()); m_mediaRecorder->setAudioEncoder(m_audioEncoder); // Set video encoder settings if (m_cameraSession) { - m_mediaRecorder->setVideoSize(m_videoSettings.resolution()); - m_mediaRecorder->setVideoFrameRate(qRound(m_videoSettings.frameRate())); - m_mediaRecorder->setVideoEncodingBitRate(m_videoSettings.bitRate()); + m_mediaRecorder->setVideoSize(m_encoderSettings.videoResolution()); + m_mediaRecorder->setVideoFrameRate(qRound(m_encoderSettings.videoFrameRate())); + m_mediaRecorder->setVideoEncodingBitRate(m_encoderSettings.videoBitRate()); m_mediaRecorder->setVideoEncoder(m_videoEncoder); m_mediaRecorder->setOrientationHint(m_cameraSession->currentCameraRotation()); } + const char *extension = "mp4"; + switch(m_encoderSettings.format()) { + case QMediaFormat::MPEG4: + break; + case QMediaFormat::Ogg: + extension = "ogg"; + break; + case QMediaFormat::QuickTime: + extension = "mov"; + break; + case QMediaFormat::WebM: + extension = "webm"; + break; + case QMediaFormat::AAC: + extension = "aac"; + break; + case QMediaFormat::MP3: + extension = "mp3"; + break; + case QMediaFormat::Mpeg4Audio: + extension = "m4a"; + break; + case QMediaFormat::Opus: + extension = "opus"; + case QMediaFormat::ASF: + case QMediaFormat::AVI: + case QMediaFormat::Matroska: + case QMediaFormat::FLAC: + case QMediaFormat::Wave: + case QMediaFormat::WindowsMediaAudio: + case QMediaFormat::UnspecifiedFormat: + break; + } + // Set output file QString filePath = m_mediaStorageLocation.generateFileName( m_requestedOutputLocation.isLocalFile() ? m_requestedOutputLocation.toLocalFile() @@ -257,7 +289,7 @@ void QAndroidCaptureSession::start() : QMediaStorageLocation::Sounds, m_cameraSession ? QLatin1String("VID_") : QLatin1String("REC_"), - m_containerFormat); + QString::fromUtf8(extension)); m_usedOutputLocation = QUrl::fromLocalFile(filePath); m_mediaRecorder->setOutputFile(filePath); @@ -366,84 +398,58 @@ qint64 QAndroidCaptureSession::duration() const return m_duration; } -void QAndroidCaptureSession::setContainerFormat(const QString &format) +void QAndroidCaptureSession::setEncoderSettings(const QMediaEncoderSettings &settings) { - if (m_containerFormat == format) - return; - - m_containerFormat = format; - m_containerFormatDirty = true; + m_encoderSettings = settings; + m_encoderSettings.resolveFormat(m_cameraSession ? QMediaEncoderSettings::AudioAndVideo : QMediaEncoderSettings::AudioOnly); + m_encoderSettingsDirty = true; } -void QAndroidCaptureSession::setAudioSettings(const QAudioEncoderSettings &settings) -{ - if (m_audioSettings == settings) - return; - - m_audioSettings = settings; - m_audioSettingsDirty = true; -} - -void QAndroidCaptureSession::setVideoSettings(const QVideoEncoderSettings &settings) +void QAndroidCaptureSession::applySettings() { - if (!m_cameraSession || m_videoSettings == settings) + if (!m_encoderSettingsDirty) return; - m_videoSettings = settings; - m_videoSettingsDirty = true; -} - -void QAndroidCaptureSession::applySettings() -{ // container settings - if (m_containerFormatDirty) { - if (m_containerFormat.isEmpty()) { - m_containerFormat = m_defaultSettings.outputFileExtension; - m_outputFormat = m_defaultSettings.outputFormat; - } else if (m_containerFormat == QLatin1String("3gp")) { - m_outputFormat = AndroidMediaRecorder::THREE_GPP; - } else if (!m_cameraSession && m_containerFormat == QLatin1String("amr")) { - m_outputFormat = AndroidMediaRecorder::AMR_NB_Format; - } else if (!m_cameraSession && m_containerFormat == QLatin1String("awb")) { - m_outputFormat = AndroidMediaRecorder::AMR_WB_Format; - } else { - m_containerFormat = QStringLiteral("mp4"); - m_outputFormat = AndroidMediaRecorder::MPEG_4; - } - - m_containerFormatDirty = false; + auto fileFormat = m_encoderSettings.format(); + if (!m_cameraSession && fileFormat == QMediaFormat::AAC) { + m_outputFormat = AndroidMediaRecorder::AAC_ADTS; + } else if (fileFormat == QMediaFormat::Ogg) { + m_outputFormat = AndroidMediaRecorder::OGG; + } else if (fileFormat == QMediaFormat::WebM) { + m_outputFormat = AndroidMediaRecorder::WEBM; +// } else if (fileFormat == QLatin1String("3gp")) { +// m_outputFormat = AndroidMediaRecorder::THREE_GPP; + } else { + // fallback to MP4 + m_outputFormat = AndroidMediaRecorder::MPEG_4; } // audio settings - if (m_audioSettingsDirty) { - if (m_audioSettings.channelCount() <= 0) - m_audioSettings.setChannelCount(m_defaultSettings.audioChannels); - if (m_audioSettings.bitRate() <= 0) - m_audioSettings.setBitRate(m_defaultSettings.audioBitRate); - if (m_audioSettings.sampleRate() <= 0) - m_audioSettings.setSampleRate(m_defaultSettings.audioSampleRate); - - if (m_audioSettings.codec().isEmpty()) - m_audioEncoder = m_defaultSettings.audioEncoder; - else if (m_audioSettings.codec() == QLatin1String("aac")) - m_audioEncoder = AndroidMediaRecorder::AAC; - else if (m_audioSettings.codec() == QLatin1String("amr-nb")) - m_audioEncoder = AndroidMediaRecorder::AMR_NB_Encoder; - else if (m_audioSettings.codec() == QLatin1String("amr-wb")) - m_audioEncoder = AndroidMediaRecorder::AMR_WB_Encoder; - else - m_audioEncoder = m_defaultSettings.audioEncoder; + if (m_encoderSettings.audioChannelCount() <= 0) + m_encoderSettings.setAudioChannelCount(m_defaultSettings.audioChannels); + if (m_encoderSettings.audioBitRate() <= 0) + m_encoderSettings.setAudioBitRate(m_defaultSettings.audioBitRate); + if (m_encoderSettings.audioSampleRate() <= 0) + m_encoderSettings.setAudioSampleRate(m_defaultSettings.audioSampleRate); + + if (m_encoderSettings.audioCodec() == QMediaFormat::AudioCodec::AAC) + m_audioEncoder = AndroidMediaRecorder::AAC; + else if (m_encoderSettings.audioCodec() == QMediaFormat::AudioCodec::Opus) + m_audioEncoder = AndroidMediaRecorder::OPUS; + else if (m_encoderSettings.audioCodec() == QMediaFormat::AudioCodec::Vorbis) + m_audioEncoder = AndroidMediaRecorder::VORBIS; + else + m_audioEncoder = m_defaultSettings.audioEncoder; - m_audioSettingsDirty = false; - } // video settings - if (m_cameraSession && m_cameraSession->camera() && m_videoSettingsDirty) { - if (m_videoSettings.resolution().isEmpty()) { - m_videoSettings.setResolution(m_defaultSettings.videoResolution); - } else if (!m_supportedResolutions.contains(m_videoSettings.resolution())) { + if (m_cameraSession && m_cameraSession->camera()) { + if (m_encoderSettings.videoResolution().isEmpty()) { + m_encoderSettings.setVideoResolution(m_defaultSettings.videoResolution); + } else if (!m_supportedResolutions.contains(m_encoderSettings.videoResolution())) { // if the requested resolution is not supported, find the closest one - QSize reqSize = m_videoSettings.resolution(); + QSize reqSize = m_encoderSettings.videoResolution(); int reqPixelCount = reqSize.width() * reqSize.height(); QList<int> supportedPixelCounts; for (int i = 0; i < m_supportedResolutions.size(); ++i) { @@ -451,33 +457,30 @@ void QAndroidCaptureSession::applySettings() supportedPixelCounts.append(s.width() * s.height()); } int closestIndex = qt_findClosestValue(supportedPixelCounts, reqPixelCount); - m_videoSettings.setResolution(m_supportedResolutions.at(closestIndex)); + m_encoderSettings.setVideoResolution(m_supportedResolutions.at(closestIndex)); } - if (m_videoSettings.frameRate() <= 0) - m_videoSettings.setFrameRate(m_defaultSettings.videoFrameRate); - if (m_videoSettings.bitRate() <= 0) - m_videoSettings.setBitRate(m_defaultSettings.videoBitRate); + if (m_encoderSettings.videoFrameRate() <= 0) + m_encoderSettings.setVideoFrameRate(m_defaultSettings.videoFrameRate); + if (m_encoderSettings.videoBitRate() <= 0) + m_encoderSettings.setVideoBitRate(m_defaultSettings.videoBitRate); - if (m_videoSettings.codec().isEmpty()) - m_videoEncoder = m_defaultSettings.videoEncoder; - else if (m_videoSettings.codec() == QLatin1String("h263")) - m_videoEncoder = AndroidMediaRecorder::H263; - else if (m_videoSettings.codec() == QLatin1String("h264")) + if (m_encoderSettings.videoCodec() == QMediaFormat::VideoCodec::H264) m_videoEncoder = AndroidMediaRecorder::H264; - else if (m_videoSettings.codec() == QLatin1String("mpeg4_sp")) + else if (m_encoderSettings.videoCodec() == QMediaFormat::VideoCodec::H265) + m_videoEncoder = AndroidMediaRecorder::HEVC; + else if (m_encoderSettings.videoCodec() == QMediaFormat::VideoCodec::MPEG4) m_videoEncoder = AndroidMediaRecorder::MPEG_4_SP; else m_videoEncoder = m_defaultSettings.videoEncoder; - m_videoSettingsDirty = false; } } void QAndroidCaptureSession::updateResolution() { m_cameraSession->camera()->stopPreviewSynchronous(); - m_cameraSession->applyResolution(m_videoSettings.resolution(), false); + m_cameraSession->applyResolution(m_encoderSettings.videoResolution(), false); } void QAndroidCaptureSession::restartViewfinder() diff --git a/src/multimedia/platform/android/mediacapture/qandroidcapturesession_p.h b/src/multimedia/platform/android/mediacapture/qandroidcapturesession_p.h index 8e0067e93..b5f40fc46 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcapturesession_p.h +++ b/src/multimedia/platform/android/mediacapture/qandroidcapturesession_p.h @@ -86,14 +86,8 @@ public: qint64 duration() const; - QString containerFormat() const { return m_containerFormat; } - void setContainerFormat(const QString &format); - - QAudioEncoderSettings audioSettings() const { return m_audioSettings; } - void setAudioSettings(const QAudioEncoderSettings &settings); - - QVideoEncoderSettings videoSettings() const { return m_videoSettings; } - void setVideoSettings(const QVideoEncoderSettings &settings); + void setEncoderSettings(const QMediaEncoderSettings &settings); + QMediaEncoderSettings encoderSettings() { return m_encoderSettings; } void applySettings(); @@ -139,7 +133,7 @@ private: , videoEncoder(AndroidMediaRecorder::DefaultVideoEncoder) , videoBitRate(1) , videoFrameRate(-1) - , videoResolution(320, 240) + , videoResolution(1280, 720) , isNull(true) { } }; @@ -174,12 +168,8 @@ private: CaptureProfile m_defaultSettings; - QString m_containerFormat; - QAudioEncoderSettings m_audioSettings; - QVideoEncoderSettings m_videoSettings; - bool m_containerFormatDirty; - bool m_videoSettingsDirty; - bool m_audioSettingsDirty; + QMediaEncoderSettings m_encoderSettings; + bool m_encoderSettingsDirty = false; AndroidMediaRecorder::OutputFormat m_outputFormat; AndroidMediaRecorder::AudioEncoder m_audioEncoder; AndroidMediaRecorder::VideoEncoder m_videoEncoder; diff --git a/src/multimedia/platform/android/mediacapture/qandroidmediacontainercontrol.cpp b/src/multimedia/platform/android/mediacapture/qandroidmediacontainercontrol.cpp deleted file mode 100644 index 45fe7092c..000000000 --- a/src/multimedia/platform/android/mediacapture/qandroidmediacontainercontrol.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qandroidmediacontainercontrol_p.h" - -#include "qandroidcapturesession_p.h" - -QT_BEGIN_NAMESPACE - -QAndroidMediaContainerControl::QAndroidMediaContainerControl(QAndroidCaptureSession *session) - : QMediaContainerControl() - , m_session(session) -{ -} - -QStringList QAndroidMediaContainerControl::supportedContainers() const -{ - return QStringList() << QLatin1String("mp4") - << QLatin1String("3gp") - << QLatin1String("amr") - << QLatin1String("awb"); -} - -QString QAndroidMediaContainerControl::containerFormat() const -{ - return m_session->containerFormat(); -} - -void QAndroidMediaContainerControl::setContainerFormat(const QString &format) -{ - m_session->setContainerFormat(format); -} - -QString QAndroidMediaContainerControl::containerDescription(const QString &formatMimeType) const -{ - if (formatMimeType == QLatin1String("mp4")) - return tr("MPEG4 media file format"); - else if (formatMimeType == QLatin1String("3gp")) - return tr("3GPP media file format"); - else if (formatMimeType == QLatin1String("amr")) - return tr("AMR NB file format"); - else if (formatMimeType == QLatin1String("awb")) - return tr("AMR WB file format"); - - return QString(); -} - -QT_END_NAMESPACE diff --git a/src/multimedia/platform/android/mediacapture/qandroidmediacontainercontrol_p.h b/src/multimedia/platform/android/mediacapture/qandroidmediacontainercontrol_p.h deleted file mode 100644 index 00f09970f..000000000 --- a/src/multimedia/platform/android/mediacapture/qandroidmediacontainercontrol_p.h +++ /dev/null @@ -1,77 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QANDROIDMEDIACONTAINERCONTROL_H -#define QANDROIDMEDIACONTAINERCONTROL_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include <qmediacontainercontrol.h> - -QT_BEGIN_NAMESPACE - -class QAndroidCaptureSession; - -class QAndroidMediaContainerControl : public QMediaContainerControl -{ - Q_OBJECT -public: - QAndroidMediaContainerControl(QAndroidCaptureSession *session); - - QStringList supportedContainers() const override; - QString containerFormat() const override; - void setContainerFormat(const QString &format) override; - QString containerDescription(const QString &formatMimeType) const override; - -private: - QAndroidCaptureSession *m_session; -}; - -QT_END_NAMESPACE - -#endif // QANDROIDMEDIACONTAINERCONTROL_H diff --git a/src/multimedia/platform/android/mediacapture/qandroidmediarecordercontrol.cpp b/src/multimedia/platform/android/mediacapture/qandroidmediarecordercontrol.cpp index a7aea4a87..fd77523f9 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidmediarecordercontrol.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidmediarecordercontrol.cpp @@ -136,5 +136,10 @@ bool QAndroidMediaRecorderControl::setAudioInput(const QAudioDeviceInfo &info) return true; } +void QAndroidMediaRecorderControl::setEncoderSettings(const QMediaEncoderSettings &settings) +{ + m_session->setEncoderSettings(settings); +} + QT_END_NAMESPACE diff --git a/src/multimedia/platform/android/mediacapture/qandroidmediarecordercontrol_p.h b/src/multimedia/platform/android/mediacapture/qandroidmediarecordercontrol_p.h index 53e9b366e..0ef2370c8 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidmediarecordercontrol_p.h +++ b/src/multimedia/platform/android/mediacapture/qandroidmediarecordercontrol_p.h @@ -75,6 +75,8 @@ public: QAudioDeviceInfo audioInput() const override; bool setAudioInput(const QAudioDeviceInfo &id) override; + void setEncoderSettings(const QMediaEncoderSettings &settings) override; + public Q_SLOTS: void setState(QMediaRecorder::State state) override; void setMuted(bool muted) override; diff --git a/src/multimedia/platform/android/mediacapture/qandroidvideoencodersettingscontrol.cpp b/src/multimedia/platform/android/mediacapture/qandroidvideoencodersettingscontrol.cpp deleted file mode 100644 index cda1d2dd3..000000000 --- a/src/multimedia/platform/android/mediacapture/qandroidvideoencodersettingscontrol.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qandroidvideoencodersettingscontrol_p.h" - -#include "qandroidcapturesession_p.h" - -QT_BEGIN_NAMESPACE - -QAndroidVideoEncoderSettingsControl::QAndroidVideoEncoderSettingsControl(QAndroidCaptureSession *session) - : QVideoEncoderSettingsControl() - , m_session(session) -{ -} - -QStringList QAndroidVideoEncoderSettingsControl::supportedVideoCodecs() const -{ - return QStringList() << QLatin1String("h263") - << QLatin1String("h264") - << QLatin1String("mpeg4_sp"); -} - -QString QAndroidVideoEncoderSettingsControl::videoCodecDescription(const QString &codecName) const -{ - if (codecName == QLatin1String("h263")) - return tr("H.263 compression"); - else if (codecName == QLatin1String("h264")) - return tr("H.264 compression"); - else if (codecName == QLatin1String("mpeg4_sp")) - return tr("MPEG-4 SP compression"); - - return QString(); -} - -QVideoEncoderSettings QAndroidVideoEncoderSettingsControl::videoSettings() const -{ - return m_session->videoSettings(); -} - -void QAndroidVideoEncoderSettingsControl::setVideoSettings(const QVideoEncoderSettings &settings) -{ - m_session->setVideoSettings(settings); -} - -QT_END_NAMESPACE diff --git a/src/multimedia/platform/android/mediacapture/qandroidvideoencodersettingscontrol_p.h b/src/multimedia/platform/android/mediacapture/qandroidvideoencodersettingscontrol_p.h deleted file mode 100644 index d17825d87..000000000 --- a/src/multimedia/platform/android/mediacapture/qandroidvideoencodersettingscontrol_p.h +++ /dev/null @@ -1,77 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QANDROIDVIDEOENCODERSETTINGSCONTROL_H -#define QANDROIDVIDEOENCODERSETTINGSCONTROL_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include <qvideoencodersettingscontrol.h> - -QT_BEGIN_NAMESPACE - -class QAndroidCaptureSession; - -class QAndroidVideoEncoderSettingsControl : public QVideoEncoderSettingsControl -{ - Q_OBJECT -public: - explicit QAndroidVideoEncoderSettingsControl(QAndroidCaptureSession *session); - - QStringList supportedVideoCodecs() const override; - QString videoCodecDescription(const QString &codecName) const override; - QVideoEncoderSettings videoSettings() const override; - void setVideoSettings(const QVideoEncoderSettings &settings) override; - -private: - QAndroidCaptureSession *m_session; -}; - -QT_END_NAMESPACE - -#endif // QANDROIDVIDEOENCODERSETTINGSCONTROL_H diff --git a/src/multimedia/platform/android/qandroidformatsinfo.cpp b/src/multimedia/platform/android/qandroidformatsinfo.cpp index c6860e3c9..b8491492a 100644 --- a/src/multimedia/platform/android/qandroidformatsinfo.cpp +++ b/src/multimedia/platform/android/qandroidformatsinfo.cpp @@ -44,45 +44,47 @@ QT_BEGIN_NAMESPACE QAndroidFormatInfo::QAndroidFormatInfo() { // ### Properly determine the set of supported codecs, this is a minimal set gathered from the old code base - m_decodableAudioCodecs << Qt::AudioCodec::AAC << Qt::AudioCodec::MP3; - m_encodableAudioCodecs << Qt::AudioCodec::AAC << Qt::AudioCodec::MP3; - m_decodableVideoCodecs << Qt::VideoCodec::MPEG4 << Qt::VideoCodec::H264; - m_encodableVideoCodecs << Qt::VideoCodec::MPEG4 << Qt::VideoCodec::H264; - m_decodableMediaContainers << Qt::MediaContainer::MPEG4 << Qt::MediaContainer::MP3; - m_encodableMediaContainers << Qt::MediaContainer::MPEG4 << Qt::MediaContainer::MP3; + m_decodableAudioCodecs << QMediaFormat::AudioCodec::AAC << QMediaFormat::AudioCodec::MP3 << QMediaFormat::AudioCodec::Opus + << QMediaFormat::AudioCodec::Vorbis; + m_encodableAudioCodecs = m_decodableAudioCodecs; + m_decodableVideoCodecs << QMediaFormat::VideoCodec::MPEG4 << QMediaFormat::VideoCodec::H264 << QMediaFormat::VideoCodec::H265; + m_encodableVideoCodecs = m_decodableVideoCodecs; + m_decodableFileFormats << QMediaFormat::FileFormat::MPEG4 << QMediaFormat::FileFormat::MP3 << QMediaFormat::AAC + << QMediaFormat::Ogg << QMediaFormat::WebM; + m_encodableFileFormats = m_decodableFileFormats; } -QAndroidFormatInfo::~QAndroidFormatInfo +QAndroidFormatInfo::~QAndroidFormatInfo() { } -QList<Qt::MediaContainer> QAndroidFormatInfo::decodableMediaContainers() const +QList<QMediaFormat::FileFormat> QAndroidFormatInfo::decodableMediaContainers() const { - return m_decodableMediaContainers; + return m_decodableFileFormats; } -QList<Qt::AudioCodec> QAndroidFormatInfo::decodableAudioCodecs() const +QList<QMediaFormat::AudioCodec> QAndroidFormatInfo::decodableAudioCodecs() const { return m_decodableAudioCodecs; } -QList<Qt::VideoCodec> QAndroidFormatInfo::decodableVideoCodecs() const +QList<QMediaFormat::VideoCodec> QAndroidFormatInfo::decodableVideoCodecs() const { return m_decodableVideoCodecs; } -QList<Qt::MediaContainer> QAndroidFormatInfo::encodableMediaContainers() const +QList<QMediaFormat::FileFormat> QAndroidFormatInfo::encodableMediaContainers() const { - return m_encodableMediaContainers; + return m_encodableFileFormats; } -QList<Qt::AudioCodec> QAndroidFormatInfo::encodableAudioCodecs() const +QList<QMediaFormat::AudioCodec> QAndroidFormatInfo::encodableAudioCodecs() const { return m_encodableAudioCodecs; } -QList<Qt::VideoCodec> QAndroidFormatInfo::encodableVideoCodecs() const +QList<QMediaFormat::VideoCodec> QAndroidFormatInfo::encodableVideoCodecs() const { return m_encodableVideoCodecs; } diff --git a/src/multimedia/platform/android/qandroidformatsinfo_p.h b/src/multimedia/platform/android/qandroidformatsinfo_p.h index 54ce80072..c3f744ebc 100644 --- a/src/multimedia/platform/android/qandroidformatsinfo_p.h +++ b/src/multimedia/platform/android/qandroidformatsinfo_p.h @@ -70,11 +70,11 @@ public: QList<QMediaFormat::VideoCodec> encodableVideoCodecs() const override; private: - QList<QMediaFormat::FileFormat> m_decodableMediaContainers; + QList<QMediaFormat::FileFormat> m_decodableFileFormats; QList<QMediaFormat::AudioCodec> m_decodableAudioCodecs; QList<QMediaFormat::VideoCodec> m_decodableVideoCodecs; - QList<QMediaFormat::FileFormat> m_encodableMediaContainers; + QList<QMediaFormat::FileFormat> m_encodableFileFormats; QList<QMediaFormat::AudioCodec> m_encodableAudioCodecs; QList<QMediaFormat::VideoCodec> m_encodableVideoCodecs; }; diff --git a/src/multimedia/platform/android/wrappers/jni/androidmediarecorder_p.h b/src/multimedia/platform/android/wrappers/jni/androidmediarecorder_p.h index 9cba14f75..6cab2285a 100644 --- a/src/multimedia/platform/android/wrappers/jni/androidmediarecorder_p.h +++ b/src/multimedia/platform/android/wrappers/jni/androidmediarecorder_p.h @@ -107,7 +107,9 @@ public: DefaultAudioEncoder = 0, AMR_NB_Encoder = 1, AMR_WB_Encoder = 2, - AAC = 3 + AAC = 3, + OPUS = 7, + VORBIS = 6 }; enum AudioSource { @@ -124,7 +126,8 @@ public: DefaultVideoEncoder = 0, H263 = 1, H264 = 2, - MPEG_4_SP = 3 + MPEG_4_SP = 3, + HEVC = 5 }; enum VideoSource { @@ -137,7 +140,10 @@ public: THREE_GPP = 1, MPEG_4 = 2, AMR_NB_Format = 3, - AMR_WB_Format = 4 + AMR_WB_Format = 4, + AAC_ADTS = 6, + OGG = 11, + WEBM = 9 }; AndroidMediaRecorder(); diff --git a/src/multimedia/platform/darwin/camera/avfaudioencodersettingscontrol.mm b/src/multimedia/platform/darwin/camera/avfaudioencodersettingscontrol.mm deleted file mode 100644 index b613ca32a..000000000 --- a/src/multimedia/platform/darwin/camera/avfaudioencodersettingscontrol.mm +++ /dev/null @@ -1,226 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "avfaudioencodersettingscontrol_p.h" - -#include "avfcameraservice_p.h" -#include "avfcamerasession_p.h" - -#include <AVFoundation/AVFoundation.h> -#include <CoreAudio/CoreAudioTypes.h> - -QT_BEGIN_NAMESPACE - -struct AudioCodecInfo -{ - QString description; - int id; - - AudioCodecInfo() : id(0) { } - AudioCodecInfo(const QString &desc, int i) - : description(desc), id(i) - { } -}; - -typedef QMap<QString, AudioCodecInfo> SupportedAudioCodecs; -Q_GLOBAL_STATIC_WITH_ARGS(QString , defaultCodec, (QLatin1String("aac"))) -Q_GLOBAL_STATIC(SupportedAudioCodecs, supportedCodecs) - -AVFAudioEncoderSettingsControl::AVFAudioEncoderSettingsControl(AVFCameraService *service) - : QAudioEncoderSettingsControl() - , m_service(service) -{ - if (supportedCodecs->isEmpty()) { - supportedCodecs->insert(QStringLiteral("lpcm"), - AudioCodecInfo(QStringLiteral("Linear PCM"), - kAudioFormatLinearPCM)); - supportedCodecs->insert(QStringLiteral("ulaw"), - AudioCodecInfo(QStringLiteral("PCM Mu-Law 2:1"), - kAudioFormatULaw)); - supportedCodecs->insert(QStringLiteral("alaw"), - AudioCodecInfo(QStringLiteral("PCM A-Law 2:1"), - kAudioFormatALaw)); - supportedCodecs->insert(QStringLiteral("ima4"), - AudioCodecInfo(QStringLiteral("IMA 4:1 ADPCM"), - kAudioFormatAppleIMA4)); - supportedCodecs->insert(QStringLiteral("alac"), - AudioCodecInfo(QStringLiteral("Apple Lossless Audio Codec"), - kAudioFormatAppleLossless)); - supportedCodecs->insert(QStringLiteral("aac"), - AudioCodecInfo(QStringLiteral("MPEG-4 Low Complexity AAC"), - kAudioFormatMPEG4AAC)); - supportedCodecs->insert(QStringLiteral("aach"), - AudioCodecInfo(QStringLiteral("MPEG-4 High Efficiency AAC"), - kAudioFormatMPEG4AAC_HE)); - supportedCodecs->insert(QStringLiteral("aacl"), - AudioCodecInfo(QStringLiteral("MPEG-4 AAC Low Delay"), - kAudioFormatMPEG4AAC_LD)); - supportedCodecs->insert(QStringLiteral("aace"), - AudioCodecInfo(QStringLiteral("MPEG-4 AAC Enhanced Low Delay"), - kAudioFormatMPEG4AAC_ELD)); - supportedCodecs->insert(QStringLiteral("aacf"), - AudioCodecInfo(QStringLiteral("MPEG-4 AAC Enhanced Low Delay with SBR"), - kAudioFormatMPEG4AAC_ELD_SBR)); - supportedCodecs->insert(QStringLiteral("aacp"), - AudioCodecInfo(QStringLiteral("MPEG-4 HE AAC V2"), - kAudioFormatMPEG4AAC_HE_V2)); - supportedCodecs->insert(QStringLiteral("ilbc"), - AudioCodecInfo(QStringLiteral("iLBC"), - kAudioFormatiLBC)); - } -} - -QStringList AVFAudioEncoderSettingsControl::supportedAudioCodecs() const -{ - return supportedCodecs->keys(); -} - -QString AVFAudioEncoderSettingsControl::codecDescription(const QString &codecName) const -{ - return supportedCodecs->value(codecName).description; -} - -QList<int> AVFAudioEncoderSettingsControl::supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous) const -{ - Q_UNUSED(settings); - - if (continuous) - *continuous = true; - - return QList<int>() << 8000 << 96000; -} - -QAudioEncoderSettings AVFAudioEncoderSettingsControl::audioSettings() const -{ - return m_actualSettings; -} - -void AVFAudioEncoderSettingsControl::setAudioSettings(const QAudioEncoderSettings &settings) -{ - if (m_requestedSettings == settings) - return; - - m_requestedSettings = m_actualSettings = settings; -} - -NSDictionary *AVFAudioEncoderSettingsControl::applySettings() -{ - if (m_service->session()->state() != QCamera::LoadedState && - m_service->session()->state() != QCamera::ActiveState) { - return nil; - } - - NSMutableDictionary *settings = [NSMutableDictionary dictionary]; - - QString codec = m_requestedSettings.codec().isEmpty() ? *defaultCodec : m_requestedSettings.codec(); - if (!supportedCodecs->contains(codec)) { - qWarning("Unsupported codec: '%s'", codec.toLocal8Bit().constData()); - codec = *defaultCodec; - } - [settings setObject:[NSNumber numberWithInt:supportedCodecs->value(codec).id] forKey:AVFormatIDKey]; - m_actualSettings.setCodec(codec); - -#ifdef Q_OS_OSX - if (m_requestedSettings.encodingMode() == QMultimedia::ConstantQualityEncoding) { - int quality; - switch (m_requestedSettings.quality()) { - case QMultimedia::VeryLowQuality: - quality = AVAudioQualityMin; - break; - case QMultimedia::LowQuality: - quality = AVAudioQualityLow; - break; - case QMultimedia::HighQuality: - quality = AVAudioQualityHigh; - break; - case QMultimedia::VeryHighQuality: - quality = AVAudioQualityMax; - break; - case QMultimedia::NormalQuality: - default: - quality = AVAudioQualityMedium; - break; - } - [settings setObject:[NSNumber numberWithInt:quality] forKey:AVEncoderAudioQualityKey]; - - } else -#endif - if (m_requestedSettings.bitRate() > 0){ - [settings setObject:[NSNumber numberWithInt:m_requestedSettings.bitRate()] forKey:AVEncoderBitRateKey]; - } - - int sampleRate = m_requestedSettings.sampleRate(); - int channelCount = m_requestedSettings.channelCount(); - -#ifdef Q_OS_IOS - // Some keys are mandatory only on iOS - if (codec == QLatin1String("lpcm")) { - [settings setObject:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; - [settings setObject:[NSNumber numberWithInt:NO] forKey:AVLinearPCMIsBigEndianKey]; - [settings setObject:[NSNumber numberWithInt:NO] forKey:AVLinearPCMIsFloatKey]; - [settings setObject:[NSNumber numberWithInt:NO] forKey:AVLinearPCMIsNonInterleaved]; - } - - if (codec == QLatin1String("alac")) - [settings setObject:[NSNumber numberWithInt:24] forKey:AVEncoderBitDepthHintKey]; - - if (sampleRate <= 0) - sampleRate = codec == QLatin1String("ilbc") ? 8000 : 44100; - if (channelCount <= 0) - channelCount = codec == QLatin1String("ilbc") ? 1 : 2; -#endif - - if (sampleRate > 0) { - [settings setObject:[NSNumber numberWithInt:sampleRate] forKey:AVSampleRateKey]; - m_actualSettings.setSampleRate(sampleRate); - } - if (channelCount > 0) { - [settings setObject:[NSNumber numberWithInt:channelCount] forKey:AVNumberOfChannelsKey]; - m_actualSettings.setChannelCount(channelCount); - } - - return settings; -} - -void AVFAudioEncoderSettingsControl::unapplySettings() -{ - m_actualSettings = m_requestedSettings; -} - -QT_END_NAMESPACE diff --git a/src/multimedia/platform/darwin/camera/avfaudioencodersettingscontrol_p.h b/src/multimedia/platform/darwin/camera/avfaudioencodersettingscontrol_p.h deleted file mode 100644 index b1851a5bf..000000000 --- a/src/multimedia/platform/darwin/camera/avfaudioencodersettingscontrol_p.h +++ /dev/null @@ -1,86 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef AVFAUDIOENCODERSETTINGSCONTROL_H -#define AVFAUDIOENCODERSETTINGSCONTROL_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include <qaudioencodersettingscontrol.h> - -@class NSDictionary; -@class AVCaptureAudioDataOutput; - -QT_BEGIN_NAMESPACE - -class AVFCameraService; - -class AVFAudioEncoderSettingsControl : public QAudioEncoderSettingsControl -{ -public: - explicit AVFAudioEncoderSettingsControl(AVFCameraService *service); - - QStringList supportedAudioCodecs() const override; - QString codecDescription(const QString &codecName) const override; - QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = nullptr) const override; - QAudioEncoderSettings audioSettings() const override; - void setAudioSettings(const QAudioEncoderSettings &settings) override; - - NSDictionary *applySettings(); - void unapplySettings(); - -private: - AVFCameraService *m_service; - - QAudioEncoderSettings m_requestedSettings; - QAudioEncoderSettings m_actualSettings; -}; - -QT_END_NAMESPACE - -#endif // AVFAUDIOENCODERSETTINGSCONTROL_H diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice.mm b/src/multimedia/platform/darwin/camera/avfcameraservice.mm index a536889cb..101e9cf4e 100644 --- a/src/multimedia/platform/darwin/camera/avfcameraservice.mm +++ b/src/multimedia/platform/darwin/camera/avfcameraservice.mm @@ -52,9 +52,6 @@ #include "avfcamerafocuscontrol_p.h" #include "avfcameraexposurecontrol_p.h" #include "avfimageencodercontrol_p.h" -#include "avfaudioencodersettingscontrol_p.h" -#include "avfvideoencodersettingscontrol_p.h" -#include "avfmediacontainercontrol_p.h" #include "avfcamerawindowcontrol_p.h" #ifdef Q_OS_IOS @@ -87,9 +84,6 @@ AVFCameraService::AVFCameraService() #endif m_imageEncoderControl = new AVFImageEncoderControl(this); - m_audioEncoderSettingsControl = new AVFAudioEncoderSettingsControl(this); - m_videoEncoderSettingsControl = new AVFVideoEncoderSettingsControl(this); - m_mediaContainerControl = new AVFMediaContainerControl(this); } AVFCameraService::~AVFCameraService() @@ -121,9 +115,6 @@ AVFCameraService::~AVFCameraService() delete m_cameraFocusControl; delete m_cameraExposureControl; delete m_imageEncoderControl; - delete m_audioEncoderSettingsControl; - delete m_videoEncoderSettingsControl; - delete m_mediaContainerControl; delete m_session; } @@ -152,15 +143,6 @@ QObject *AVFCameraService::requestControl(const char *name) if (qstrcmp(name, QImageEncoderControl_iid) == 0) return m_imageEncoderControl; - if (qstrcmp(name, QAudioEncoderSettingsControl_iid) == 0) - return m_audioEncoderSettingsControl; - - if (qstrcmp(name, QVideoEncoderSettingsControl_iid) == 0) - return m_videoEncoderSettingsControl; - - if (qstrcmp(name, QMediaContainerControl_iid) == 0) - return m_mediaContainerControl; - if (!m_captureWindowControl) { if (qstrcmp(name, QVideoWindowControl_iid) == 0) { m_captureWindowControl = new AVFCameraWindowControl(this); diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice_p.h b/src/multimedia/platform/darwin/camera/avfcameraservice_p.h index 321ab262d..c8b085bdb 100644 --- a/src/multimedia/platform/darwin/camera/avfcameraservice_p.h +++ b/src/multimedia/platform/darwin/camera/avfcameraservice_p.h @@ -71,9 +71,6 @@ class AVFCameraExposureControl; class AVFImageEncoderControl; class AVFMediaRecorderControl; class AVFMediaRecorderControlIOS; -class AVFAudioEncoderSettingsControl; -class AVFVideoEncoderSettingsControl; -class AVFMediaContainerControl; class AVFCameraWindowControl; class AVFCameraService : public QMediaPlatformCaptureInterface @@ -95,9 +92,6 @@ public: AVFCameraExposureControl *cameraExposureControl() const {return m_cameraExposureControl; } AVFCameraRendererControl *videoOutput() const {return m_videoOutput; } AVFImageEncoderControl *imageEncoderControl() const {return m_imageEncoderControl; } - AVFAudioEncoderSettingsControl *audioEncoderSettingsControl() const { return m_audioEncoderSettingsControl; } - AVFVideoEncoderSettingsControl *videoEncoderSettingsControl() const {return m_videoEncoderSettingsControl; } - AVFMediaContainerControl *mediaContainerControl() const { return m_mediaContainerControl; } private: AVFCameraSession *m_session; @@ -109,9 +103,6 @@ private: AVFCameraFocusControl *m_cameraFocusControl; AVFCameraExposureControl *m_cameraExposureControl; AVFImageEncoderControl *m_imageEncoderControl; - AVFAudioEncoderSettingsControl *m_audioEncoderSettingsControl; - AVFVideoEncoderSettingsControl *m_videoEncoderSettingsControl; - AVFMediaContainerControl *m_mediaContainerControl; AVFCameraWindowControl *m_captureWindowControl; }; diff --git a/src/multimedia/platform/darwin/camera/avfmediacontainercontrol.mm b/src/multimedia/platform/darwin/camera/avfmediacontainercontrol.mm deleted file mode 100644 index 09049de0b..000000000 --- a/src/multimedia/platform/darwin/camera/avfmediacontainercontrol.mm +++ /dev/null @@ -1,113 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "avfmediacontainercontrol_p.h" - -#include <AVFoundation/AVMediaFormat.h> -#include <QtCore/qmap.h> - -QT_BEGIN_NAMESPACE - -struct ContainerInfo -{ - QString description; - NSString *fileType; - - ContainerInfo() : fileType(nil) { } - ContainerInfo(const QString &desc, NSString *type) - : description(desc), fileType(type) - { } -}; - -typedef QMap<QString, ContainerInfo> SupportedContainers; -Q_GLOBAL_STATIC(SupportedContainers, containers); - -AVFMediaContainerControl::AVFMediaContainerControl(AVFCameraService *) - : QMediaContainerControl() - , m_format(QStringLiteral("mov")) // .mov is the default container format on Apple platforms -{ - if (containers->isEmpty()) { - containers->insert(QStringLiteral("mov"), - ContainerInfo(QStringLiteral("QuickTime movie file format"), - AVFileTypeQuickTimeMovie)); - containers->insert(QStringLiteral("mp4"), - ContainerInfo(QStringLiteral("MPEG-4 file format"), - AVFileTypeMPEG4)); - containers->insert(QStringLiteral("m4v"), - ContainerInfo(QStringLiteral("iTunes video file format"), - AVFileTypeAppleM4V)); -#ifdef Q_OS_IOS - containers->insert(QStringLiteral("3gp"), - ContainerInfo(QStringLiteral("3GPP file format"), - AVFileType3GPP)); -#endif - } -} - -QStringList AVFMediaContainerControl::supportedContainers() const -{ - return containers->keys(); -} - -QString AVFMediaContainerControl::containerFormat() const -{ - return m_format; -} - -void AVFMediaContainerControl::setContainerFormat(const QString &format) -{ - if (!containers->contains(format)) { - qWarning("Unsupported container format: '%s'", format.toLocal8Bit().constData()); - return; - } - - m_format = format; -} - -QString AVFMediaContainerControl::containerDescription(const QString &formatMimeType) const -{ - return containers->value(formatMimeType).description; -} - -NSString *AVFMediaContainerControl::fileType() const -{ - return containers->value(m_format).fileType; -} - -QT_END_NAMESPACE diff --git a/src/multimedia/platform/darwin/camera/avfmediacontainercontrol_p.h b/src/multimedia/platform/darwin/camera/avfmediacontainercontrol_p.h deleted file mode 100644 index 9450dc16a..000000000 --- a/src/multimedia/platform/darwin/camera/avfmediacontainercontrol_p.h +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef AVFMEDIACONTAINERCONTROL_H -#define AVFMEDIACONTAINERCONTROL_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include <qmediacontainercontrol.h> - -@class NSString; - -QT_BEGIN_NAMESPACE - -class AVFCameraService; - -class AVFMediaContainerControl : public QMediaContainerControl -{ -public: - explicit AVFMediaContainerControl(AVFCameraService *service); - - QStringList supportedContainers() const override; - QString containerFormat() const override; - void setContainerFormat(const QString &format) override; - QString containerDescription(const QString &formatMimeType) const override; - - NSString *fileType() const; - -private: - QString m_format; -}; - -QT_END_NAMESPACE - -#endif // AVFMEDIACONTAINERCONTROL_H diff --git a/src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm b/src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm index 40e10bc60..721f2c1fa 100644 --- a/src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm +++ b/src/multimedia/platform/darwin/camera/avfmediarecordercontrol.mm @@ -42,16 +42,15 @@ #include "avfcamerasession_p.h" #include "avfcameraservice_p.h" #include "avfcameracontrol_p.h" -#include "avfaudioencodersettingscontrol_p.h" -#include "avfvideoencodersettingscontrol_p.h" -#include "avfmediacontainercontrol_p.h" #include "qaudiodeviceinfo.h" #include "qmediadevicemanager.h" +#include "private/qdarwinformatsinfo_p.h" +#include "avfcamerautility_p.h" #include <QtCore/qurl.h> #include <QtCore/qfileinfo.h> #include <QtMultimedia/qcameracontrol.h> - +#include <CoreAudio/CoreAudio.h> QT_USE_NAMESPACE @@ -237,6 +236,231 @@ qreal AVFMediaRecorderControl::volume() const return m_volume; } +static NSDictionary *avfAudioSettings(const QMediaEncoderSettings &encoderSettings) +{ + NSMutableDictionary *settings = [NSMutableDictionary dictionary]; + + int codecId = QDarwinFormatInfo::audioFormatForCodec(encoderSettings.audioCodec()); + + [settings setObject:[NSNumber numberWithInt:codecId] forKey:AVFormatIDKey]; + +#ifdef Q_OS_OSX + if (encoderSettings.encodingMode() == QMultimedia::ConstantQualityEncoding) { + int quality; + switch (encoderSettings.quality()) { + case QMultimedia::VeryLowQuality: + quality = AVAudioQualityMin; + break; + case QMultimedia::LowQuality: + quality = AVAudioQualityLow; + break; + case QMultimedia::HighQuality: + quality = AVAudioQualityHigh; + break; + case QMultimedia::VeryHighQuality: + quality = AVAudioQualityMax; + break; + case QMultimedia::NormalQuality: + default: + quality = AVAudioQualityMedium; + break; + } + [settings setObject:[NSNumber numberWithInt:quality] forKey:AVEncoderAudioQualityKey]; + + } else +#endif + if (encoderSettings.audioBitRate() > 0) + [settings setObject:[NSNumber numberWithInt:encoderSettings.audioBitRate()] forKey:AVEncoderBitRateKey]; + + int sampleRate = encoderSettings.audioSampleRate(); + int channelCount = encoderSettings.audioChannelCount(); + +#ifdef Q_OS_IOS + // Some keys are mandatory only on iOS + if (sampleRate <= 0) + sampleRate = 44100; + if (channelCount <= 0) + channelCount = 2; +#endif + + if (sampleRate > 0) + [settings setObject:[NSNumber numberWithInt:sampleRate] forKey:AVSampleRateKey]; + if (channelCount > 0) + [settings setObject:[NSNumber numberWithInt:channelCount] forKey:AVNumberOfChannelsKey]; + + return settings; +} + +static bool formatSupportsFramerate(AVCaptureDeviceFormat *format, qreal fps) +{ + if (format && fps > qreal(0)) { + const qreal epsilon = 0.1; + for (AVFrameRateRange *range in format.videoSupportedFrameRateRanges) { + if (range.maxFrameRate - range.minFrameRate < epsilon) { + if (qAbs(fps - range.maxFrameRate) < epsilon) + return true; + } + + if (fps >= range.minFrameRate && fps <= range.maxFrameRate) + return true; + } + } + + return false; +} + +NSDictionary *avfVideoSettings(QMediaEncoderSettings &encoderSettings, AVCaptureDevice *device, AVCaptureConnection *connection) +{ + if (!device) + return nil; + + // ### How to set file type???? + // Maybe need to use AVCaptureVideoDataOutput on macOS as well? + + // ### re-add needFpsChange +// AVFPSRange currentFps = qt_current_framerates(device, connection); + + NSMutableDictionary *videoSettings = [NSMutableDictionary dictionary]; + + // -- Codec + + // AVVideoCodecKey is the only mandatory key + auto codec = encoderSettings.videoCodec(); + NSString *c = QDarwinFormatInfo::videoFormatForCodec(codec); + [videoSettings setObject:c forKey:AVVideoCodecKey]; + [c release]; + + // -- Resolution + + int w = encoderSettings.videoResolution().width(); + int h = encoderSettings.videoResolution().height(); + + if (AVCaptureDeviceFormat *currentFormat = device.activeFormat) { + CMFormatDescriptionRef formatDesc = currentFormat.formatDescription; + CMVideoDimensions dim = CMVideoFormatDescriptionGetDimensions(formatDesc); + FourCharCode formatCodec = CMVideoFormatDescriptionGetCodecType(formatDesc); + + // We have to change the device's activeFormat in 3 cases: + // - the requested recording resolution is higher than the current device resolution + // - the requested recording resolution has a different aspect ratio than the current device aspect ratio + // - the requested frame rate is not available for the current device format + AVCaptureDeviceFormat *newFormat = nil; + if ((w <= 0 || h <= 0) + && encoderSettings.videoFrameRate() > 0 + && !formatSupportsFramerate(currentFormat, encoderSettings.videoFrameRate())) { + + newFormat = qt_find_best_framerate_match(device, + formatCodec, + encoderSettings.videoFrameRate()); + + } else if (w > 0 && h > 0) { + AVCaptureDeviceFormat *f = qt_find_best_resolution_match(device, + encoderSettings.videoResolution(), + formatCodec); + + if (f) { + CMVideoDimensions d = CMVideoFormatDescriptionGetDimensions(f.formatDescription); + qreal fAspectRatio = qreal(d.width) / d.height; + + if (w > dim.width || h > dim.height + || qAbs((qreal(dim.width) / dim.height) - fAspectRatio) > 0.01) { + newFormat = f; + } + } + } + + if (qt_set_active_format(device, newFormat, false /*### !needFpsChange*/)) { + formatDesc = newFormat.formatDescription; + dim = CMVideoFormatDescriptionGetDimensions(formatDesc); + } + + if (w > 0 && h > 0) { + // Make sure the recording resolution has the same aspect ratio as the device's + // current resolution + qreal deviceAspectRatio = qreal(dim.width) / dim.height; + qreal recAspectRatio = qreal(w) / h; + if (qAbs(deviceAspectRatio - recAspectRatio) > 0.01) { + if (recAspectRatio > deviceAspectRatio) + w = qRound(h * deviceAspectRatio); + else + h = qRound(w / deviceAspectRatio); + } + + // recording resolution can't be higher than the device's active resolution + w = qMin(w, dim.width); + h = qMin(h, dim.height); + } + } + + if (w > 0 && h > 0) { + // Width and height must be divisible by 2 + w += w & 1; + h += h & 1; + + [videoSettings setObject:[NSNumber numberWithInt:w] forKey:AVVideoWidthKey]; + [videoSettings setObject:[NSNumber numberWithInt:h] forKey:AVVideoHeightKey]; + encoderSettings.setVideoResolution(w, h); + } else { + encoderSettings.setVideoResolution(qt_device_format_resolution(device.activeFormat)); + } + + // -- FPS + + if (true /*needFpsChange*/) { + const qreal fps = encoderSettings.videoFrameRate(); + qt_set_framerate_limits(device, connection, fps, fps); + } + encoderSettings.setVideoFrameRate(qt_current_framerates(device, connection).second); + + // -- Codec Settings + + NSMutableDictionary *codecProperties = [NSMutableDictionary dictionary]; + int bitrate = -1; + float quality = -1.f; + + if (encoderSettings.encodingMode() == QMultimedia::ConstantQualityEncoding) { + if (encoderSettings.quality() != QMultimedia::NormalQuality) { + if (codec != QMediaFormat::VideoCodec::MotionJPEG) { + qWarning("ConstantQualityEncoding is not supported for MotionJPEG"); + } else { + switch (encoderSettings.quality()) { + case QMultimedia::VeryLowQuality: + quality = 0.f; + break; + case QMultimedia::LowQuality: + quality = 0.25f; + break; + case QMultimedia::HighQuality: + quality = 0.75f; + break; + case QMultimedia::VeryHighQuality: + quality = 1.f; + break; + default: + quality = -1.f; // NormalQuality, let the system decide + break; + } + } + } + } else if (encoderSettings.encodingMode() == QMultimedia::AverageBitRateEncoding){ + if (codec != QMediaFormat::VideoCodec::H264 && codec != QMediaFormat::VideoCodec::H265) + qWarning() << "AverageBitRateEncoding is not supported for codec" << QMediaFormat::videoCodecName(codec); + else + bitrate = encoderSettings.videoBitRate(); + } else { + qWarning("Encoding mode is not supported"); + } + + if (bitrate != -1) + [codecProperties setObject:[NSNumber numberWithInt:bitrate] forKey:AVVideoAverageBitRateKey]; + if (quality != -1.f) + [codecProperties setObject:[NSNumber numberWithFloat:quality] forKey:AVVideoQualityKey]; + + [videoSettings setObject:codecProperties forKey:AVVideoCompressionPropertiesKey]; + + return videoSettings; +} + void AVFMediaRecorderControl::applySettings() { if (m_state != QMediaRecorder::StoppedState @@ -245,13 +469,19 @@ void AVFMediaRecorderControl::applySettings() return; } + bool videoEnabled = m_cameraControl->captureMode().testFlag(QCamera::CaptureVideo); + QMediaEncoderSettings resolved = m_settings; + resolved.resolveFormat(videoEnabled ? QMediaEncoderSettings::AudioAndVideo : QMediaEncoderSettings::AudioOnly); + // Configure audio settings - [m_movieOutput setOutputSettings:m_service->audioEncoderSettingsControl()->applySettings() + [m_movieOutput setOutputSettings:avfAudioSettings(resolved) forConnection:[m_movieOutput connectionWithMediaType:AVMediaTypeAudio]]; // Configure video settings AVCaptureConnection *videoConnection = [m_movieOutput connectionWithMediaType:AVMediaTypeVideo]; - NSDictionary *videoSettings = m_service->videoEncoderSettingsControl()->applySettings(videoConnection); + AVCaptureDevice *captureDevice = m_session->videoCaptureDevice(); + + NSDictionary *videoSettings = avfVideoSettings(resolved, captureDevice, videoConnection); const AVFConfigurationLock lock(m_session->videoCaptureDevice()); // prevents activeFormat from being overridden @@ -260,8 +490,8 @@ void AVFMediaRecorderControl::applySettings() void AVFMediaRecorderControl::unapplySettings() { - m_service->audioEncoderSettingsControl()->unapplySettings(); - m_service->videoEncoderSettingsControl()->unapplySettings([m_movieOutput connectionWithMediaType:AVMediaTypeVideo]); +// m_service->audioEncoderSettingsControl()->unapplySettings(); +// m_service->videoEncoderSettingsControl()->unapplySettings([m_movieOutput connectionWithMediaType:AVMediaTypeVideo]); } QAudioDeviceInfo AVFMediaRecorderControl::audioInput() const @@ -291,6 +521,11 @@ bool AVFMediaRecorderControl::setAudioInput(const QAudioDeviceInfo &id) return false; } +void AVFMediaRecorderControl::setEncoderSettings(const QMediaEncoderSettings &settings) +{ + m_settings = settings; +} + void AVFMediaRecorderControl::setState(QMediaRecorder::State state) { if (m_state == state) @@ -305,7 +540,7 @@ void AVFMediaRecorderControl::setState(QMediaRecorder::State state) QString outputLocationPath = m_outputLocation.scheme() == QLatin1String("file") ? m_outputLocation.path() : m_outputLocation.toString(); - QString extension = m_service->mediaContainerControl()->containerFormat(); + QString extension = "mov";// ######m_service->mediaContainerControl()->containerFormat(); QUrl actualLocation = QUrl::fromLocalFile( m_storageLocation.generateFileName(outputLocationPath, diff --git a/src/multimedia/platform/darwin/camera/avfmediarecordercontrol_p.h b/src/multimedia/platform/darwin/camera/avfmediarecordercontrol_p.h index b9900bd1a..02a8581d2 100644 --- a/src/multimedia/platform/darwin/camera/avfmediarecordercontrol_p.h +++ b/src/multimedia/platform/darwin/camera/avfmediarecordercontrol_p.h @@ -93,6 +93,8 @@ public: QAudioDeviceInfo audioInput() const override; bool setAudioInput(const QAudioDeviceInfo &id) override; + void setEncoderSettings(const QMediaEncoderSettings &settings) override; + public Q_SLOTS: void setState(QMediaRecorder::State state) override; void setMuted(bool muted) override; @@ -114,6 +116,7 @@ private: bool m_connected; QUrl m_outputLocation; + QMediaEncoderSettings m_settings; QMediaRecorder::State m_state; QMediaRecorder::Status m_lastStatus; diff --git a/src/multimedia/platform/darwin/camera/avfvideoencodersettingscontrol.mm b/src/multimedia/platform/darwin/camera/avfvideoencodersettingscontrol.mm deleted file mode 100644 index 36da08d43..000000000 --- a/src/multimedia/platform/darwin/camera/avfvideoencodersettingscontrol.mm +++ /dev/null @@ -1,311 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "avfvideoencodersettingscontrol_p.h" - -#include "avfcameraservice_p.h" -#include "avfcamerautility_p.h" -#include "avfcamerasession_p.h" -#include "avfcamerarenderercontrol_p.h" - -#include <AVFoundation/AVFoundation.h> - -QT_BEGIN_NAMESPACE - -Q_GLOBAL_STATIC_WITH_ARGS(QStringList, supportedCodecs, (QStringList() << QLatin1String("avc1") - << QLatin1String("jpeg") - #ifdef Q_OS_OSX - << QLatin1String("ap4h") - << QLatin1String("apcn") - #endif - )) - -static bool format_supports_framerate(AVCaptureDeviceFormat *format, qreal fps) -{ - if (format && fps > qreal(0)) { - const qreal epsilon = 0.1; - for (AVFrameRateRange *range in format.videoSupportedFrameRateRanges) { - if (range.maxFrameRate - range.minFrameRate < epsilon) { - if (qAbs(fps - range.maxFrameRate) < epsilon) - return true; - } - - if (fps >= range.minFrameRate && fps <= range.maxFrameRate) - return true; - } - } - - return false; -} - -static bool real_list_contains(const QList<qreal> &list, qreal value) -{ - for (qreal r : list) { - if (qFuzzyCompare(r, value)) - return true; - } - return false; -} - -AVFVideoEncoderSettingsControl::AVFVideoEncoderSettingsControl(AVFCameraService *service) - : QVideoEncoderSettingsControl() - , m_service(service) - , m_restoreFormat(nil) -{ -} - -QStringList AVFVideoEncoderSettingsControl::supportedVideoCodecs() const -{ - return *supportedCodecs; -} - -QString AVFVideoEncoderSettingsControl::videoCodecDescription(const QString &codecName) const -{ - if (codecName == QLatin1String("avc1")) - return QStringLiteral("H.264"); - else if (codecName == QLatin1String("jpeg")) - return QStringLiteral("M-JPEG"); -#ifdef Q_OS_OSX - else if (codecName == QLatin1String("ap4h")) - return QStringLiteral("Apple ProRes 4444"); - else if (codecName == QLatin1String("apcn")) - return QStringLiteral("Apple ProRes 422 Standard Definition"); -#endif - - return QString(); -} - -QVideoEncoderSettings AVFVideoEncoderSettingsControl::videoSettings() const -{ - return m_actualSettings; -} - -void AVFVideoEncoderSettingsControl::setVideoSettings(const QVideoEncoderSettings &settings) -{ - if (m_requestedSettings == settings) - return; - - m_requestedSettings = m_actualSettings = settings; -} - -NSDictionary *AVFVideoEncoderSettingsControl::applySettings(AVCaptureConnection *connection) -{ - if (m_service->session()->state() != QCamera::LoadedState && - m_service->session()->state() != QCamera::ActiveState) { - return nil; - } - - AVCaptureDevice *device = m_service->session()->videoCaptureDevice(); - if (!device) - return nil; - - AVFPSRange currentFps = qt_current_framerates(device, connection); - const bool needFpsChange = m_requestedSettings.frameRate() > 0 - && m_requestedSettings.frameRate() != currentFps.second; - - NSMutableDictionary *videoSettings = [NSMutableDictionary dictionary]; - - // -- Codec - - // AVVideoCodecKey is the only mandatory key - QString codec = m_requestedSettings.codec().isEmpty() ? supportedCodecs->first() : m_requestedSettings.codec(); - if (!supportedCodecs->contains(codec)) { - qWarning("Unsupported codec: '%s'", codec.toLocal8Bit().constData()); - codec = supportedCodecs->first(); - } - [videoSettings setObject:codec.toNSString() forKey:AVVideoCodecKey]; - m_actualSettings.setCodec(codec); - - // -- Resolution - - int w = m_requestedSettings.resolution().width(); - int h = m_requestedSettings.resolution().height(); - - if (AVCaptureDeviceFormat *currentFormat = device.activeFormat) { - CMFormatDescriptionRef formatDesc = currentFormat.formatDescription; - CMVideoDimensions dim = CMVideoFormatDescriptionGetDimensions(formatDesc); - - // We have to change the device's activeFormat in 3 cases: - // - the requested recording resolution is higher than the current device resolution - // - the requested recording resolution has a different aspect ratio than the current device aspect ratio - // - the requested frame rate is not available for the current device format - AVCaptureDeviceFormat *newFormat = nil; - if ((w <= 0 || h <= 0) - && m_requestedSettings.frameRate() > 0 - && !format_supports_framerate(currentFormat, m_requestedSettings.frameRate())) { - - newFormat = qt_find_best_framerate_match(device, - m_service->session()->defaultCodec(), - m_requestedSettings.frameRate()); - - } else if (w > 0 && h > 0) { - AVCaptureDeviceFormat *f = qt_find_best_resolution_match(device, - m_requestedSettings.resolution(), - m_service->session()->defaultCodec()); - - if (f) { - CMVideoDimensions d = CMVideoFormatDescriptionGetDimensions(f.formatDescription); - qreal fAspectRatio = qreal(d.width) / d.height; - - if (w > dim.width || h > dim.height - || qAbs((qreal(dim.width) / dim.height) - fAspectRatio) > 0.01) { - newFormat = f; - } - } - } - - if (qt_set_active_format(device, newFormat, !needFpsChange)) { - m_restoreFormat = [currentFormat retain]; - formatDesc = newFormat.formatDescription; - dim = CMVideoFormatDescriptionGetDimensions(formatDesc); - } - - if (w > 0 && h > 0) { - // Make sure the recording resolution has the same aspect ratio as the device's - // current resolution - qreal deviceAspectRatio = qreal(dim.width) / dim.height; - qreal recAspectRatio = qreal(w) / h; - if (qAbs(deviceAspectRatio - recAspectRatio) > 0.01) { - if (recAspectRatio > deviceAspectRatio) - w = qRound(h * deviceAspectRatio); - else - h = qRound(w / deviceAspectRatio); - } - - // recording resolution can't be higher than the device's active resolution - w = qMin(w, dim.width); - h = qMin(h, dim.height); - } - } - - if (w > 0 && h > 0) { - // Width and height must be divisible by 2 - w += w & 1; - h += h & 1; - - [videoSettings setObject:[NSNumber numberWithInt:w] forKey:AVVideoWidthKey]; - [videoSettings setObject:[NSNumber numberWithInt:h] forKey:AVVideoHeightKey]; - m_actualSettings.setResolution(w, h); - } else { - m_actualSettings.setResolution(qt_device_format_resolution(device.activeFormat)); - } - - // -- FPS - - if (needFpsChange) { - m_restoreFps = currentFps; - const qreal fps = m_requestedSettings.frameRate(); - qt_set_framerate_limits(device, connection, fps, fps); - } - m_actualSettings.setFrameRate(qt_current_framerates(device, connection).second); - - // -- Codec Settings - - NSMutableDictionary *codecProperties = [NSMutableDictionary dictionary]; - int bitrate = -1; - float quality = -1.f; - - if (m_requestedSettings.encodingMode() == QMultimedia::ConstantQualityEncoding) { - if (m_requestedSettings.quality() != QMultimedia::NormalQuality) { - if (codec != QLatin1String("jpeg")) { - qWarning("ConstantQualityEncoding is not supported for codec: '%s'", codec.toLocal8Bit().constData()); - } else { - switch (m_requestedSettings.quality()) { - case QMultimedia::VeryLowQuality: - quality = 0.f; - break; - case QMultimedia::LowQuality: - quality = 0.25f; - break; - case QMultimedia::HighQuality: - quality = 0.75f; - break; - case QMultimedia::VeryHighQuality: - quality = 1.f; - break; - default: - quality = -1.f; // NormalQuality, let the system decide - break; - } - } - } - } else if (m_requestedSettings.encodingMode() == QMultimedia::AverageBitRateEncoding){ - if (codec != QLatin1String("avc1")) - qWarning("AverageBitRateEncoding is not supported for codec: '%s'", codec.toLocal8Bit().constData()); - else - bitrate = m_requestedSettings.bitRate(); - } else { - qWarning("Encoding mode is not supported"); - } - - if (bitrate != -1) - [codecProperties setObject:[NSNumber numberWithInt:bitrate] forKey:AVVideoAverageBitRateKey]; - if (quality != -1.f) - [codecProperties setObject:[NSNumber numberWithFloat:quality] forKey:AVVideoQualityKey]; - - [videoSettings setObject:codecProperties forKey:AVVideoCompressionPropertiesKey]; - - return videoSettings; -} - -void AVFVideoEncoderSettingsControl::unapplySettings(AVCaptureConnection *connection) -{ - m_actualSettings = m_requestedSettings; - - AVCaptureDevice *device = m_service->session()->videoCaptureDevice(); - if (!device) - return; - - const bool needFpsChanged = m_restoreFps.first || m_restoreFps.second; - - if (m_restoreFormat) { - qt_set_active_format(device, m_restoreFormat, !needFpsChanged); - [m_restoreFormat release]; - m_restoreFormat = nil; - } - - if (needFpsChanged) { - qt_set_framerate_limits(device, connection, m_restoreFps.first, m_restoreFps.second); - m_restoreFps = AVFPSRange(); - } -} - -QT_END_NAMESPACE - -#include "moc_avfvideoencodersettingscontrol_p.cpp" diff --git a/src/multimedia/platform/darwin/camera/avfvideoencodersettingscontrol_p.h b/src/multimedia/platform/darwin/camera/avfvideoencodersettingscontrol_p.h deleted file mode 100644 index 0b0338ad6..000000000 --- a/src/multimedia/platform/darwin/camera/avfvideoencodersettingscontrol_p.h +++ /dev/null @@ -1,93 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef AVFVIDEOENCODERSETTINGSCONTROL_H -#define AVFVIDEOENCODERSETTINGSCONTROL_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include <qvideoencodersettingscontrol.h> - -#include "avfcamerautility_p.h" -#import <AVFoundation/AVFoundation.h> - -@class NSDictionary; - -QT_BEGIN_NAMESPACE - -class AVFCameraService; - -class AVFVideoEncoderSettingsControl : public QVideoEncoderSettingsControl -{ - Q_OBJECT - -public: - explicit AVFVideoEncoderSettingsControl(AVFCameraService *service); - - QStringList supportedVideoCodecs() const override; - QString videoCodecDescription(const QString &codecName) const override; - - QVideoEncoderSettings videoSettings() const override; - void setVideoSettings(const QVideoEncoderSettings &requestedVideoSettings) override; - - NSDictionary *applySettings(AVCaptureConnection *connection); - void unapplySettings(AVCaptureConnection *connection); - -private: - AVFCameraService *m_service; - - QVideoEncoderSettings m_requestedSettings; - QVideoEncoderSettings m_actualSettings; - - AVCaptureDeviceFormat *m_restoreFormat; - AVFPSRange m_restoreFps; -}; - -QT_END_NAMESPACE - -#endif // AVFVIDEOENCODERSETTINGSCONTROL_H diff --git a/src/multimedia/platform/darwin/camera/camera.pri b/src/multimedia/platform/darwin/camera/camera.pri index 16953d07a..648c5c358 100644 --- a/src/multimedia/platform/darwin/camera/camera.pri +++ b/src/multimedia/platform/darwin/camera/camera.pri @@ -11,9 +11,6 @@ HEADERS += \ $$PWD/avfcameraexposurecontrol_p.h \ $$PWD/avfcamerautility_p.h \ $$PWD/avfimageencodercontrol_p.h \ - $$PWD/avfvideoencodersettingscontrol_p.h \ - $$PWD/avfmediacontainercontrol_p.h \ - $$PWD/avfaudioencodersettingscontrol_p.h \ $$PWD/avfcamerawindowcontrol_p.h \ SOURCES += \ @@ -28,9 +25,6 @@ SOURCES += \ $$PWD/avfcameraexposurecontrol.mm \ $$PWD/avfcamerautility.mm \ $$PWD/avfimageencodercontrol.mm \ - $$PWD/avfvideoencodersettingscontrol.mm \ - $$PWD/avfmediacontainercontrol.mm \ - $$PWD/avfaudioencodersettingscontrol.mm \ $$PWD/avfcamerawindowcontrol.mm \ osx { diff --git a/src/multimedia/platform/darwin/qdarwinformatsinfo.mm b/src/multimedia/platform/darwin/qdarwinformatsinfo.mm index 5b953e4a7..16e8458e2 100644 --- a/src/multimedia/platform/darwin/qdarwinformatsinfo.mm +++ b/src/multimedia/platform/darwin/qdarwinformatsinfo.mm @@ -40,6 +40,7 @@ #include "qdarwinformatsinfo_p.h" #include <AVFoundation/AVFoundation.h> #include <qdebug.h> + QT_BEGIN_NAMESPACE static struct { @@ -53,7 +54,7 @@ static struct { { "video/quicktime", QMediaFormat::QuickTime }, { "video/ogg", QMediaFormat::Ogg }, { "audio/mp3", QMediaFormat::MP3 }, - { nullptr, QMediaFormat::MPEG4 } + { nullptr, QMediaFormat::UnspecifiedFormat } }; static struct { @@ -69,7 +70,7 @@ static struct { { "video/mp4; codecs=\"vp09\"", QMediaFormat::VideoCodec::VP9 }, { "video/mp4; codecs=\"av01\"", QMediaFormat::VideoCodec::AV1 }, // ### ???? { "video/mp4; codecs=\"jpeg\"", QMediaFormat::VideoCodec::MotionJPEG }, - { nullptr, QMediaFormat::VideoCodec::Invalid } + { nullptr, QMediaFormat::VideoCodec::Unspecified } }; static struct { @@ -82,7 +83,7 @@ static struct { { "video/mp4; codecs=\"ac-3\"", QMediaFormat::AudioCodec::AC3 }, { "video/mp4; codecs=\"ec-3\"", QMediaFormat::AudioCodec::EAC3 }, { "audio/flac", QMediaFormat::AudioCodec::FLAC }, - { nullptr, QMediaFormat::AudioCodec::Invalid }, + { nullptr, QMediaFormat::AudioCodec::Unspecified }, }; QDarwinFormatInfo::QDarwinFormatInfo() @@ -128,7 +129,6 @@ QDarwinFormatInfo::QDarwinFormatInfo() QDarwinFormatInfo::~QDarwinFormatInfo() { - } QList<QMediaFormat::FileFormat> QDarwinFormatInfo::decodableMediaContainers() const @@ -160,4 +160,66 @@ QList<QMediaFormat::VideoCodec> QDarwinFormatInfo::encodableVideoCodecs() const { return m_encodableVideoCodecs; } + +int QDarwinFormatInfo::audioFormatForCodec(QMediaFormat::AudioCodec codec) +{ + int codecId = kAudioFormatMPEG4AAC; + switch (codec) { + case QMediaFormat::AudioCodec::Unspecified: + case QMediaFormat::AudioCodec::DolbyTrueHD: + case QMediaFormat::AudioCodec::Opus: + case QMediaFormat::AudioCodec::Vorbis: + case QMediaFormat::AudioCodec::Wave: + case QMediaFormat::AudioCodec::WindowsMediaAudio: + // Unsupported, shouldn't happen. Fall back to AAC + case QMediaFormat::AudioCodec::AAC: + codecId = kAudioFormatMPEG4AAC; + break; + case QMediaFormat::AudioCodec::MP3: + codecId = kAudioFormatMPEGLayer3; + break; + case QMediaFormat::AudioCodec::AC3: + codecId = kAudioFormatAC3; + break; + case QMediaFormat::AudioCodec::EAC3: + codecId = kAudioFormatEnhancedAC3; + break; + case QMediaFormat::AudioCodec::FLAC: + codecId = kAudioFormatFLAC; + break; + } + return codecId; +} + +NSString *QDarwinFormatInfo::videoFormatForCodec(QMediaFormat::VideoCodec codec) +{ + const char *c = "hvc1"; // fallback is H265 + switch (codec) { + case QMediaFormat::VideoCodec::Unspecified: + case QMediaFormat::VideoCodec::VP8: + case QMediaFormat::VideoCodec::H265: + case QMediaFormat::VideoCodec::AV1: + case QMediaFormat::VideoCodec::Theora: + break; + + case QMediaFormat::VideoCodec::MPEG1: + c = "mp1v"; + break; + case QMediaFormat::VideoCodec::MPEG2: + c = "mp2v"; + break; + case QMediaFormat::VideoCodec::MPEG4: + c = "mp4v"; + break; + case QMediaFormat::VideoCodec::H264: + c = "avc1"; + break; + case QMediaFormat::VideoCodec::VP9: + c = "vp09"; + break; + case QMediaFormat::VideoCodec::MotionJPEG: + c = "jpeg"; + } + return [NSString stringWithUTF8String:c]; +} QT_END_NAMESPACE diff --git a/src/multimedia/platform/darwin/qdarwinformatsinfo_p.h b/src/multimedia/platform/darwin/qdarwinformatsinfo_p.h index fc6ee1743..ad53c745b 100644 --- a/src/multimedia/platform/darwin/qdarwinformatsinfo_p.h +++ b/src/multimedia/platform/darwin/qdarwinformatsinfo_p.h @@ -72,6 +72,9 @@ public: QList<QMediaFormat::AudioCodec> encodableAudioCodecs() const override; QList<QMediaFormat::VideoCodec> encodableVideoCodecs() const override; + static int audioFormatForCodec(QMediaFormat::AudioCodec codec); + static NSString *videoFormatForCodec(QMediaFormat::VideoCodec codec); + private: QList<QMediaFormat::FileFormat> m_decodableMediaContainers; QList<QMediaFormat::AudioCodec> m_decodableAudioCodecs; diff --git a/src/multimedia/platform/gstreamer/camerabin/camerabincontrol.cpp b/src/multimedia/platform/gstreamer/camerabin/camerabincontrol.cpp index 8abf38ce8..d303142ac 100644 --- a/src/multimedia/platform/gstreamer/camerabin/camerabincontrol.cpp +++ b/src/multimedia/platform/gstreamer/camerabin/camerabincontrol.cpp @@ -39,9 +39,6 @@ #include <QtMultimedia/private/qtmultimediaglobal_p.h> #include "camerabincontrol.h" -#include "camerabincontainer.h" -#include "camerabinaudioencoder.h" -#include "camerabinvideoencoder.h" #include "camerabinimageencoder.h" #include "camerabinfocus.h" #include "camerabinimageprocessing.h" diff --git a/src/multimedia/platform/gstreamer/camerabin/camerabinrecorder.cpp b/src/multimedia/platform/gstreamer/camerabin/camerabinrecorder.cpp index a0507d140..fe848df2d 100644 --- a/src/multimedia/platform/gstreamer/camerabin/camerabinrecorder.cpp +++ b/src/multimedia/platform/gstreamer/camerabin/camerabinrecorder.cpp @@ -39,9 +39,6 @@ #include "camerabinrecorder.h" #include "camerabincontrol.h" -#include "private/qgstreameraudioencoder_p.h" -#include "private/qgstreamervideoencoder_p.h" -#include "private/qgstreamercontainer_p.h" #include "qaudiodeviceinfo.h" #include <QtCore/QDebug> @@ -130,10 +127,11 @@ qint64 CameraBinRecorder::duration() const void CameraBinRecorder::applySettings() { - QGStreamerContainerControl *containerControl = m_session->mediaContainerControl(); - QGStreamerAudioEncoderControl *audioEncoderControl = m_session->audioEncodeControl(); - QGStreamerVideoEncoderControl *audioEncoderControl = m_session->videoEncodeControl(); - containerConrol->applySettings(audioEncoderControl, audioEncoderControl); + // ###### +// QGStreamerContainerControl *containerControl = m_session->mediaContainerControl(); +// QGStreamerAudioEncoderControl *audioEncoderControl = m_session->audioEncodeControl(); +// QGStreamerVideoEncoderControl *audioEncoderControl = m_session->videoEncodeControl(); +// containerConrol->applySettings(audioEncoderControl, audioEncoderControl); } QAudioDeviceInfo CameraBinRecorder::audioInput() const diff --git a/src/multimedia/platform/gstreamer/camerabin/camerabinservice.cpp b/src/multimedia/platform/gstreamer/camerabin/camerabinservice.cpp index 131ab36cd..d4565332c 100644 --- a/src/multimedia/platform/gstreamer/camerabin/camerabinservice.cpp +++ b/src/multimedia/platform/gstreamer/camerabin/camerabinservice.cpp @@ -41,9 +41,6 @@ #include "camerabinservice.h" #include "camerabinsession.h" #include "camerabinrecorder.h" -#include "camerabincontainer.h" -#include "camerabinaudioencoder.h" -#include "camerabinvideoencoder.h" #include "camerabinimageencoder.h" #include "camerabincontrol.h" #include "camerabinmetadata.h" @@ -119,19 +116,9 @@ QObject *CameraBinService::requestControl(const char *name) if (qstrcmp(name,QMediaRecorderControl_iid) == 0) return m_captureSession->recorderControl(); - if (qstrcmp(name,QAudioEncoderSettingsControl_iid) == 0) - return m_captureSession->audioEncodeControl(); - - if (qstrcmp(name,QVideoEncoderSettingsControl_iid) == 0) - return m_captureSession->videoEncodeControl(); - if (qstrcmp(name,QImageEncoderControl_iid) == 0) return m_captureSession->imageEncodeControl(); - - if (qstrcmp(name,QMediaContainerControl_iid) == 0) - return m_captureSession->mediaContainerControl(); - if (qstrcmp(name,QCameraControl_iid) == 0) return m_captureSession->cameraControl(); diff --git a/src/multimedia/platform/gstreamer/camerabin/camerabinsession.cpp b/src/multimedia/platform/gstreamer/camerabin/camerabinsession.cpp index 095986ecb..1f1e85f70 100644 --- a/src/multimedia/platform/gstreamer/camerabin/camerabinsession.cpp +++ b/src/multimedia/platform/gstreamer/camerabin/camerabinsession.cpp @@ -41,9 +41,6 @@ #include "camerabinsession.h" #include "camerabincontrol.h" #include "camerabinrecorder.h" -#include "private/qgstreamercontainer_p.h" -#include "private/qgstreameraudioencoder_p.h" -#include "private/qgstreamervideoencoder_p.h" #include "camerabinimageencoder.h" #if QT_CONFIG(gstreamer_photography) @@ -162,11 +159,8 @@ CameraBinSession::CameraBinSession(GstElementFactory *sourceFactory, QObject *pa m_busHelper->installMessageFilter(this); m_cameraControl = new CameraBinControl(this); - m_audioEncodeControl = new QGStreamerAudioEncoderControl(this); - m_videoEncodeControl = new QGStreamerVideoEncoderControl(this); m_imageEncodeControl = new CameraBinImageEncoder(this); m_recorderControl = new CameraBinRecorder(this); - m_mediaContainerControl = new QGStreamerContainerControl(this); m_imageProcessingControl = new CameraBinImageProcessing(this); QByteArray envFlags = qgetenv("QT_GSTREAMER_CAMERABIN_FLAGS"); diff --git a/src/multimedia/platform/gstreamer/camerabin/camerabinsession_p.h b/src/multimedia/platform/gstreamer/camerabin/camerabinsession_p.h index f307ae970..e34d3bead 100644 --- a/src/multimedia/platform/gstreamer/camerabin/camerabinsession_p.h +++ b/src/multimedia/platform/gstreamer/camerabin/camerabinsession_p.h @@ -72,11 +72,8 @@ QT_BEGIN_NAMESPACE class QGstreamerMessage; class QGstreamerBusHelper; class CameraBinControl; -class QGStreamerAudioEncoderControl; -class QGStreamerVideoEncoderControl; class CameraBinImageEncoder; class CameraBinRecorder; -class QGStreamerContainerControl; class CameraBinExposure; class CameraBinFlash; class CameraBinFocus; @@ -124,8 +121,6 @@ public: GstElementFactory *sourceFactory() const { return m_sourceFactory; } CameraBinControl *cameraControl() const { return m_cameraControl; } - QGStreamerAudioEncoderControl *audioEncodeControl() const { return m_audioEncodeControl; } - QGStreamerVideoEncoderControl *videoEncodeControl() const { return m_videoEncodeControl; } CameraBinImageEncoder *imageEncodeControl() const { return m_imageEncodeControl; } #if QT_CONFIG(gstreamer_photography) @@ -136,7 +131,6 @@ public: CameraBinImageProcessing *imageProcessingControl() const { return m_imageProcessingControl; } CameraBinRecorder *recorderControl() const { return m_recorderControl; } - QGStreamerContainerControl *mediaContainerControl() const { return m_mediaContainerControl; } QGstreamerElementFactory *audioInput() const { return m_audioInputFactory; } void setAudioInput(QGstreamerElementFactory *audioInput); @@ -229,11 +223,8 @@ private: QGstreamerVideoRendererInterface *m_viewfinderInterface; CameraBinControl *m_cameraControl; - QGStreamerAudioEncoderControl *m_audioEncodeControl; - QGStreamerVideoEncoderControl *m_videoEncodeControl; CameraBinImageEncoder *m_imageEncodeControl; CameraBinRecorder *m_recorderControl; - QGStreamerContainerControl *m_mediaContainerControl; #if QT_CONFIG(gstreamer_photography) CameraBinExposure *m_cameraExposureControl; CameraBinFocus *m_cameraFocusControl; diff --git a/src/multimedia/platform/gstreamer/common/common.pri b/src/multimedia/platform/gstreamer/common/common.pri index 499663008..b57cf4d00 100644 --- a/src/multimedia/platform/gstreamer/common/common.pri +++ b/src/multimedia/platform/gstreamer/common/common.pri @@ -14,9 +14,6 @@ HEADERS += \ $$PWD/qgstreamerplayercontrol_p.h \ $$PWD/qgstvideorendererplugin_p.h \ $$PWD/qgstvideorenderersink_p.h \ - $$PWD/qgstreamercontainer_p.h \ - $$PWD/qgstreameraudioencoder_p.h \ - $$PWD/qgstreamervideoencoder_p.h SOURCES += \ $$PWD/qgstappsrc.cpp \ @@ -34,6 +31,3 @@ SOURCES += \ $$PWD/qgstreamerplayercontrol.cpp \ $$PWD/qgstvideorendererplugin.cpp \ $$PWD/qgstvideorenderersink.cpp \ - $$PWD/qgstreamercontainer.cpp \ - $$PWD/qgstreameraudioencoder.cpp \ - $$PWD/qgstreamervideoencoder.cpp diff --git a/src/multimedia/platform/gstreamer/common/qgstcodecsinfo.cpp b/src/multimedia/platform/gstreamer/common/qgstcodecsinfo.cpp index 2f1dc4391..580d4ea8e 100644 --- a/src/multimedia/platform/gstreamer/common/qgstcodecsinfo.cpp +++ b/src/multimedia/platform/gstreamer/common/qgstcodecsinfo.cpp @@ -132,8 +132,8 @@ void QGstCodecsInfo::updateCodecs(ElementType elementType) << "video/x-raw-yuv" << "video/x-raw-rgb"; QSet<QByteArray> fieldsToAdd; - fieldsToAdd << "mpegversion" << "layer" << "layout" << "raversion" - << "wmaversion" << "wmvversion" << "variant" << "systemstream"; + fieldsToAdd << "mpegversion" << "layer" << "layout" + << "variant"; GList *element = elements; while (element) { @@ -229,11 +229,10 @@ GList *QGstCodecsInfo::elementFactories(ElementType elementType) const gstElementType = GST_ELEMENT_FACTORY_TYPE_MUXER; break; case AudioDecoder: - gstElementType = (GstElementFactoryListType)(GST_ELEMENT_FACTORY_TYPE_DECODER | GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO); + gstElementType = (GstElementFactoryListType)(GST_ELEMENT_FACTORY_TYPE_PARSER | GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO); break; case VideoDecoder: - // GST_ELEMENT_FACTORY_TYPE_VIDEO_ENCODER also lists image encoders. We don't want these here. - gstElementType = (GstElementFactoryListType)(GST_ELEMENT_FACTORY_TYPE_DECODER | GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO); + gstElementType = (GstElementFactoryListType)(GST_ELEMENT_FACTORY_TYPE_PARSER | GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO); break; case Demuxer: gstElementType = GST_ELEMENT_FACTORY_TYPE_DEMUXER; diff --git a/src/multimedia/platform/gstreamer/common/qgstreameraudioencoder.cpp b/src/multimedia/platform/gstreamer/common/qgstreameraudioencoder.cpp deleted file mode 100644 index 701533b43..000000000 --- a/src/multimedia/platform/gstreamer/common/qgstreameraudioencoder.cpp +++ /dev/null @@ -1,289 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtMultimedia/private/qtmultimediaglobal_p.h> -#include "qgstreameraudioencoder_p.h" -#include "qgstreamercontainer_p.h" -#include <private/qgstutils_p.h> - -#include <QtCore/qdebug.h> - -QT_BEGIN_NAMESPACE - -QGStreamerAudioEncoderControl::QGStreamerAudioEncoderControl(QObject *parent) - : QAudioEncoderSettingsControl(parent) - , m_codecs(QGstCodecsInfo::AudioEncoder) -{ -} - -QGStreamerAudioEncoderControl::~QGStreamerAudioEncoderControl() -{ -} - -QStringList QGStreamerAudioEncoderControl::supportedAudioCodecs() const -{ - return m_codecs.supportedCodecs(); -} - -QString QGStreamerAudioEncoderControl::codecDescription(const QString &codecName) const -{ - return m_codecs.codecDescription(codecName); -} - -QList<int> QGStreamerAudioEncoderControl::supportedSampleRates(const QAudioEncoderSettings &, bool *) const -{ - //TODO check element caps to find actual values - - return QList<int>(); -} - -QAudioEncoderSettings QGStreamerAudioEncoderControl::audioSettings() const -{ - return m_audioSettings; -} - -void QGStreamerAudioEncoderControl::setAudioSettings(const QAudioEncoderSettings &settings) -{ - if (m_audioSettings != settings) { - m_audioSettings = settings; - m_actualAudioSettings = settings; - emit settingsChanged(); - } -} - -QAudioEncoderSettings QGStreamerAudioEncoderControl::actualAudioSettings() const -{ - return m_actualAudioSettings; -} - -void QGStreamerAudioEncoderControl::setActualAudioSettings(const QAudioEncoderSettings &settings) -{ - m_actualAudioSettings = settings; -} - -void QGStreamerAudioEncoderControl::resetActualSettings() -{ - m_actualAudioSettings = m_audioSettings; -} - -GstEncodingProfile *QGStreamerAudioEncoderControl::createProfile() -{ - QString codec = m_actualAudioSettings.codec(); - QString preset = m_actualAudioSettings.encodingOption(QStringLiteral("preset")).toString(); - GstCaps *caps; - - if (codec.isEmpty()) - return 0; - - caps = gst_caps_from_string(codec.toLatin1()); - - GstEncodingProfile *profile = (GstEncodingProfile *)gst_encoding_audio_profile_new( - caps, - !preset.isEmpty() ? preset.toLatin1().constData() : NULL, //preset - NULL, //restriction - 0); //presence - - gst_caps_unref(caps); - - return profile; -} - -void QGStreamerAudioEncoderControl::applySettings(GstElement *encoder) -{ - GObjectClass * const objectClass = G_OBJECT_GET_CLASS(encoder); - const char * const name = qt_gst_element_get_factory_name(encoder); - - const bool isVorbis = qstrcmp(name, "vorbisenc") == 0; - - const int bitRate = m_actualAudioSettings.bitRate(); - if (!isVorbis && bitRate == -1) { - // Bit rate is invalid, don't evaluate the remaining conditions unless the encoder is - // vorbisenc which is known to accept -1 as an unspecified bitrate. - } else if (g_object_class_find_property(objectClass, "bitrate")) { - g_object_set(G_OBJECT(encoder), "bitrate", bitRate, NULL); - } else if (g_object_class_find_property(objectClass, "target-bitrate")) { - g_object_set(G_OBJECT(encoder), "target-bitrate", bitRate, NULL); - } - - if (isVorbis) { - static const double qualities[] = { 0.1, 0.3, 0.5, 0.7, 1.0 }; - g_object_set(G_OBJECT(encoder), "quality", qualities[m_actualAudioSettings.quality()], NULL); - } -} - - -QSet<QString> QGStreamerAudioEncoderControl::supportedStreamTypes(const QString &codecName) const -{ - return m_codecs.supportedStreamTypes(codecName); -} - -GstElement *QGStreamerAudioEncoderControl::createEncoder() -{ - QString codec = m_audioSettings.codec(); - GstElement *encoderElement = gst_element_factory_make(m_codecs.codecElement(codec).constData(), NULL); - if (!encoderElement) - return 0; - - GstBin * encoderBin = GST_BIN(gst_bin_new("audio-encoder-bin")); - - GstElement *sinkCapsFilter = gst_element_factory_make("capsfilter", NULL); - GstElement *srcCapsFilter = gst_element_factory_make("capsfilter", NULL); - - gst_bin_add_many(encoderBin, sinkCapsFilter, encoderElement, srcCapsFilter, NULL); - gst_element_link_many(sinkCapsFilter, encoderElement, srcCapsFilter, NULL); - - // add ghostpads - GstPad *pad = gst_element_get_static_pad(sinkCapsFilter, "sink"); - gst_element_add_pad(GST_ELEMENT(encoderBin), gst_ghost_pad_new("sink", pad)); - gst_object_unref(GST_OBJECT(pad)); - - pad = gst_element_get_static_pad(srcCapsFilter, "src"); - gst_element_add_pad(GST_ELEMENT(encoderBin), gst_ghost_pad_new("src", pad)); - gst_object_unref(GST_OBJECT(pad)); - - if (m_audioSettings.sampleRate() > 0 || m_audioSettings.channelCount() > 0) { - GstCaps *caps = gst_caps_new_empty(); - GstStructure *structure = qt_gst_structure_new_empty("audio/x-raw"); - - if (m_audioSettings.sampleRate() > 0) - gst_structure_set(structure, "rate", G_TYPE_INT, m_audioSettings.sampleRate(), NULL ); - - if (m_audioSettings.channelCount() > 0) - gst_structure_set(structure, "channels", G_TYPE_INT, m_audioSettings.channelCount(), NULL ); - - gst_caps_append_structure(caps,structure); - - g_object_set(G_OBJECT(sinkCapsFilter), "caps", caps, NULL); - - gst_caps_unref(caps); - } - - // Some encoders support several codecs. Setting a caps filter downstream with the desired - // codec (which is actually a string representation of the caps) will make sure we use the - // correct codec. - GstCaps *caps = gst_caps_from_string(codec.toUtf8().constData()); - g_object_set(G_OBJECT(srcCapsFilter), "caps", caps, NULL); - gst_caps_unref(caps); - - if (encoderElement) { - if (m_audioSettings.encodingMode() == QMultimedia::ConstantQualityEncoding) { - QMultimedia::EncodingQuality qualityValue = m_audioSettings.quality(); - - if (codec == QLatin1String("audio/x-vorbis")) { - double qualityTable[] = { - 0.1, //VeryLow - 0.3, //Low - 0.5, //Normal - 0.7, //High - 1.0 //VeryHigh - }; - g_object_set(G_OBJECT(encoderElement), "quality", qualityTable[qualityValue], NULL); - } else if (codec == QLatin1String("audio/mpeg")) { - g_object_set(G_OBJECT(encoderElement), "target", 0, NULL); //constant quality mode - qreal quality[] = { - 1, //VeryLow - 3, //Low - 5, //Normal - 7, //High - 9 //VeryHigh - }; - g_object_set(G_OBJECT(encoderElement), "quality", quality[qualityValue], NULL); - } else if (codec == QLatin1String("audio/x-speex")) { - //0-10 range with default 8 - double qualityTable[] = { - 2, //VeryLow - 5, //Low - 8, //Normal - 9, //High - 10 //VeryHigh - }; - g_object_set(G_OBJECT(encoderElement), "quality", qualityTable[qualityValue], NULL); - } else if (codec.startsWith("audio/AMR")) { - int band[] = { - 0, //VeryLow - 2, //Low - 4, //Normal - 6, //High - 7 //VeryHigh - }; - - g_object_set(G_OBJECT(encoderElement), "band-mode", band[qualityValue], NULL); - } - } else { - int bitrate = m_audioSettings.bitRate(); - if (bitrate > 0) { - if (codec == QLatin1String("audio/mpeg")) { - g_object_set(G_OBJECT(encoderElement), "target", 1, NULL); //constant bitrate mode - } - g_object_set(G_OBJECT(encoderElement), "bitrate", bitrate, NULL); - } - } - -#if 0 - QMap<QString, QVariant> options = m_options.value(codec); - for (auto it = options.cbegin(), end = options.cend(); it != end; ++it) { - const QString &option = it.key(); - const QVariant &value = it.value(); - - switch (value.typeId()) { - case QMetaType::Int: - g_object_set(G_OBJECT(encoderElement), option.toLatin1(), value.toInt(), NULL); - break; - case QMetaType::Bool: - g_object_set(G_OBJECT(encoderElement), option.toLatin1(), value.toBool(), NULL); - break; - case QMetaType::Double: - g_object_set(G_OBJECT(encoderElement), option.toLatin1(), value.toDouble(), NULL); - break; - case QMetaType::QString: - g_object_set(G_OBJECT(encoderElement), option.toLatin1(), value.toString().toUtf8().constData(), NULL); - break; - default: - qWarning() << "unsupported option type:" << option << value; - break; - } - - } -#endif - } - - return GST_ELEMENT(encoderBin); -} - -QT_END_NAMESPACE diff --git a/src/multimedia/platform/gstreamer/common/qgstreameraudioencoder_p.h b/src/multimedia/platform/gstreamer/common/qgstreameraudioencoder_p.h deleted file mode 100644 index 316f57e77..000000000 --- a/src/multimedia/platform/gstreamer/common/qgstreameraudioencoder_p.h +++ /dev/null @@ -1,117 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QGSTREAMERAUDIOENCODER_H -#define QGSTREAMERAUDIOENCODER_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include <QtMultimedia/private/qtmultimediaglobal_p.h> -#include <qaudioencodersettingscontrol.h> - -#include <QtCore/qstringlist.h> -#include <QtCore/qmap.h> -#include <QtCore/qset.h> - -#include <gst/gst.h> -#include <gst/pbutils/pbutils.h> - -#include <gst/pbutils/encoding-profile.h> -#include <private/qgstcodecsinfo_p.h> - -#include <qaudioformat.h> - -QT_BEGIN_NAMESPACE -class CameraBinSession; - -class QGStreamerAudioEncoderControl : public QAudioEncoderSettingsControl -{ - Q_OBJECT -public: - QGStreamerAudioEncoderControl(QObject *parent); - virtual ~QGStreamerAudioEncoderControl(); - - QStringList supportedAudioCodecs() const override; - QString codecDescription(const QString &codecName) const override; - - QStringList supportedEncodingOptions(const QString &codec) const; - QVariant encodingOption(const QString &codec, const QString &name) const; - void setEncodingOption(const QString &codec, const QString &name, const QVariant &value); - - QList<int> supportedSampleRates(const QAudioEncoderSettings &settings = QAudioEncoderSettings(), - bool *isContinuous = 0) const override; - QList<int> supportedChannelCounts(const QAudioEncoderSettings &settings = QAudioEncoderSettings()) const; - QList<int> supportedSampleSizes(const QAudioEncoderSettings &settings = QAudioEncoderSettings()) const; - - QAudioEncoderSettings audioSettings() const override; - void setAudioSettings(const QAudioEncoderSettings &) override; - - QAudioEncoderSettings actualAudioSettings() const; - void setActualAudioSettings(const QAudioEncoderSettings&); - void resetActualSettings(); - - GstEncodingProfile *createProfile(); - - void applySettings(GstElement *element); - - QSet<QString> supportedStreamTypes(const QString &codecName) const; - GstElement *createEncoder(); - -Q_SIGNALS: - void settingsChanged(); - -private: - QGstCodecsInfo m_codecs; - - QAudioEncoderSettings m_actualAudioSettings; - QAudioEncoderSettings m_audioSettings; -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/multimedia/platform/gstreamer/common/qgstreamercontainer.cpp b/src/multimedia/platform/gstreamer/common/qgstreamercontainer.cpp deleted file mode 100644 index 21fb09f39..000000000 --- a/src/multimedia/platform/gstreamer/common/qgstreamercontainer.cpp +++ /dev/null @@ -1,239 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtMultimedia/private/qtmultimediaglobal_p.h> -#include "qgstreamercontainer_p.h" -#include "qgstreameraudioencoder_p.h" -#include "qgstreamervideoencoder_p.h" -#include <private/qgstutils_p.h> - -#include <QtCore/qdebug.h> - -QT_BEGIN_NAMESPACE - -QGStreamerContainerControl::QGStreamerContainerControl(QObject *parent) - :QMediaContainerControl(parent) - , m_supportedContainers(QGstCodecsInfo::Muxer) -{ -} - -QStringList QGStreamerContainerControl::supportedContainers() const -{ - return m_supportedContainers.supportedCodecs(); -} - -QString QGStreamerContainerControl::containerDescription(const QString &formatMimeType) const -{ - return m_supportedContainers.codecDescription(formatMimeType); -} - -QString QGStreamerContainerControl::containerFormat() const -{ - return m_format; -} - -void QGStreamerContainerControl::setContainerFormat(const QString &format) -{ - if (m_format != format) { - m_format = format; - m_actualFormat = format; - emit settingsChanged(); - } -} - -QString QGStreamerContainerControl::actualContainerFormat() const -{ - return m_actualFormat; -} - -void QGStreamerContainerControl::setActualContainerFormat(const QString &containerFormat) -{ - m_actualFormat = containerFormat; -} - -void QGStreamerContainerControl::resetActualContainerFormat() -{ - m_actualFormat = m_format; -} - -GstEncodingContainerProfile *QGStreamerContainerControl::createProfile() -{ - GstCaps *caps = nullptr; - - if (m_actualFormat.isEmpty()) - return 0; - - QString format = m_actualFormat; - const QStringList supportedFormats = m_supportedContainers.supportedCodecs(); - - //if format is not in the list of supported gstreamer mime types, - //try to find the mime type with matching extension - if (!supportedFormats.contains(format)) { - format.clear(); - QString extension = QGstUtils::fileExtensionForMimeType(m_actualFormat); - for (const QString &formatCandidate : supportedFormats) { - if (QGstUtils::fileExtensionForMimeType(formatCandidate) == extension) { - format = formatCandidate; - break; - } - } - } - - if (format.isEmpty()) - return nullptr; - - caps = gst_caps_from_string(format.toLatin1()); - - GstEncodingContainerProfile *profile = (GstEncodingContainerProfile *)gst_encoding_container_profile_new( - "camerabin2_profile", - (gchar *)"custom camera profile", - caps, - NULL); //preset - - gst_caps_unref(caps); - - return profile; -} - -GstEncodingContainerProfile *QGStreamerContainerControl::fullProfile(QGStreamerAudioEncoderControl *audioEncoderControl, - QGStreamerVideoEncoderControl *videoEncoderControl) -{ - auto *containerProfile = createProfile(); - if (containerProfile) { - GstEncodingProfile *audioProfile = audioEncoderControl ? audioEncoderControl->createProfile() : nullptr; - GstEncodingProfile *videoProfile = videoEncoderControl ? videoEncoderControl->createProfile() : nullptr; - qDebug() << "audio profile" << gst_caps_to_string(gst_encoding_profile_get_format(audioProfile)); - qDebug() << "video profile" << gst_caps_to_string(gst_encoding_profile_get_format(videoProfile)); - qDebug() << "conta profile" << gst_caps_to_string(gst_encoding_profile_get_format((GstEncodingProfile *)containerProfile)); - - if (videoProfile) { - if (!gst_encoding_container_profile_add_profile(containerProfile, videoProfile)) - gst_encoding_profile_unref(videoProfile); - } - if (audioProfile) { - if (!gst_encoding_container_profile_add_profile(containerProfile, audioProfile)) - gst_encoding_profile_unref(audioProfile); - } - } - - return containerProfile; -} - -void QGStreamerContainerControl::applySettings(QGStreamerAudioEncoderControl *audioEncoderControl, QGStreamerVideoEncoderControl *videoEncoderControl) -{ - resetActualContainerFormat(); - audioEncoderControl->resetActualSettings(); - videoEncoderControl->resetActualSettings(); - - //encodebin doesn't like the encoding profile with ANY caps, - //if container and codecs are not specified, - //try to find a commonly used supported combination - if (containerFormat().isEmpty() && - audioEncoderControl->audioSettings().codec().isEmpty() && - videoEncoderControl->videoSettings().codec().isEmpty()) { - - QList<QStringList> candidates; - - // By order of preference - - // .mp4 (h264, AAC) - candidates.append(QStringList() << "video/quicktime, variant=(string)iso" << "video/x-h264" << "audio/mpeg, mpegversion=(int)4"); - - // .mp4 (h264, AC3) - candidates.append(QStringList() << "video/quicktime, variant=(string)iso" << "video/x-h264" << "audio/x-ac3"); - - // .mp4 (h264, MP3) - candidates.append(QStringList() << "video/quicktime, variant=(string)iso" << "video/x-h264" << "audio/mpeg, mpegversion=(int)1, layer=(int)3"); - - // .mkv (h264, AAC) - candidates.append(QStringList() << "video/x-matroska" << "video/x-h264" << "audio/mpeg, mpegversion=(int)4"); - - // .mkv (h264, AC3) - candidates.append(QStringList() << "video/x-matroska" << "video/x-h264" << "audio/x-ac3"); - - // .mkv (h264, MP3) - candidates.append(QStringList() << "video/x-matroska" << "video/x-h264" << "audio/mpeg, mpegversion=(int)1, layer=(int)3"); - - // .mov (h264, AAC) - candidates.append(QStringList() << "video/quicktime" << "video/x-h264" << "audio/mpeg, mpegversion=(int)4"); - - // .mov (h264, MP3) - candidates.append(QStringList() << "video/quicktime" << "video/x-h264" << "audio/mpeg, mpegversion=(int)1, layer=(int)3"); - - // .webm (VP8, Vorbis) - candidates.append(QStringList() << "video/webm" << "video/x-vp8" << "audio/x-vorbis"); - - // .ogg (Theora, Vorbis) - candidates.append(QStringList() << "application/ogg" << "video/x-theora" << "audio/x-vorbis"); - - // .avi (DivX, MP3) - candidates.append(QStringList() << "video/x-msvideo" << "video/x-divx" << "audio/mpeg, mpegversion=(int)1, layer=(int)3"); - - for (const QStringList &candidate : qAsConst(candidates)) { - if (supportedContainers().contains(candidate[0]) && - videoEncoderControl->supportedVideoCodecs().contains(candidate[1]) && - audioEncoderControl->supportedAudioCodecs().contains(candidate[2])) { - setActualContainerFormat(candidate[0]); - - QVideoEncoderSettings videoSettings = videoEncoderControl->videoSettings(); - videoSettings.setCodec(candidate[1]); - videoEncoderControl->setActualVideoSettings(videoSettings); - - QAudioEncoderSettings audioSettings = audioEncoderControl->audioSettings(); - audioSettings.setCodec(candidate[2]); - audioEncoderControl->setActualAudioSettings(audioSettings); - - break; - } - } - } -} - -QSet<QString> QGStreamerContainerControl::supportedStreamTypes(const QString &container) const -{ - return m_supportedContainers.supportedStreamTypes(container); -} - -QString QGStreamerContainerControl::containerExtension() const -{ - return QGstUtils::fileExtensionForMimeType(m_format); -} - - -QT_END_NAMESPACE diff --git a/src/multimedia/platform/gstreamer/common/qgstreamercontainer_p.h b/src/multimedia/platform/gstreamer/common/qgstreamercontainer_p.h deleted file mode 100644 index 524e921c1..000000000 --- a/src/multimedia/platform/gstreamer/common/qgstreamercontainer_p.h +++ /dev/null @@ -1,111 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#ifndef QGSTREAMERCONTAINERCONTROL_H -#define QGSTREAMERCONTAINERCONTROL_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include <QtMultimedia/private/qtmultimediaglobal_p.h> -#include <qmediacontainercontrol.h> -#include <QtCore/qstringlist.h> -#include <QtCore/qset.h> - -#include <gst/gst.h> -#include <gst/pbutils/pbutils.h> - -#include <gst/pbutils/encoding-profile.h> -#include <private/qgstcodecsinfo_p.h> - -QT_BEGIN_NAMESPACE - -class QGStreamerAudioEncoderControl; -class QGStreamerVideoEncoderControl; - -class QGStreamerContainerControl : public QMediaContainerControl -{ -Q_OBJECT -public: - QGStreamerContainerControl(QObject *parent); - virtual ~QGStreamerContainerControl() {} - - QStringList supportedContainers() const override; - QString containerDescription(const QString &formatMimeType) const override; - - QString containerFormat() const override; - void setContainerFormat(const QString &format) override; - - QString actualContainerFormat() const; - void setActualContainerFormat(const QString &containerFormat); - void resetActualContainerFormat(); - - GstEncodingContainerProfile *createProfile(); - - GstEncodingContainerProfile *fullProfile(QGStreamerAudioEncoderControl *audioEncoderControl, QGStreamerVideoEncoderControl *videoEncoderControl); - - void applySettings(QGStreamerAudioEncoderControl *audioEncoderControl, QGStreamerVideoEncoderControl *videoEncoderControl); - - QByteArray formatElementName() const { return m_supportedContainers.codecElement(containerFormat()); } - QSet<QString> supportedStreamTypes(const QString &container) const; - - QString containerExtension() const; - -Q_SIGNALS: - void settingsChanged(); - -private: - QString m_format; - QString m_actualFormat; - - QGstCodecsInfo m_supportedContainers; -}; - -QT_END_NAMESPACE - -#endif // CAMERABINMEDIACONTAINERCONTROL_H diff --git a/src/multimedia/platform/gstreamer/common/qgstreamervideoencoder.cpp b/src/multimedia/platform/gstreamer/common/qgstreamervideoencoder.cpp deleted file mode 100644 index eeec9a651..000000000 --- a/src/multimedia/platform/gstreamer/common/qgstreamervideoencoder.cpp +++ /dev/null @@ -1,355 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtMultimedia/private/qtmultimediaglobal_p.h> -#include "qgstreamervideoencoder_p.h" -#include "qgstreamercontainer_p.h" -#include <private/qgstutils_p.h> - -#include <QtCore/qdebug.h> - -QT_BEGIN_NAMESPACE - -QGStreamerVideoEncoderControl::QGStreamerVideoEncoderControl() - : QVideoEncoderSettingsControl() - , m_codecs(QGstCodecsInfo::VideoEncoder) -{ -} - -QGStreamerVideoEncoderControl::~QGStreamerVideoEncoderControl() -{ -} - -QStringList QGStreamerVideoEncoderControl::supportedVideoCodecs() const -{ - return m_codecs.supportedCodecs(); -} - -QString QGStreamerVideoEncoderControl::videoCodecDescription(const QString &codecName) const -{ - return m_codecs.codecDescription(codecName); -} - -QVideoEncoderSettings QGStreamerVideoEncoderControl::videoSettings() const -{ - return m_videoSettings; -} - -void QGStreamerVideoEncoderControl::setVideoSettings(const QVideoEncoderSettings &settings) -{ - if (m_videoSettings != settings) { - m_actualVideoSettings = settings; - m_videoSettings = settings; - emit settingsChanged(); - } -} - -QVideoEncoderSettings QGStreamerVideoEncoderControl::actualVideoSettings() const -{ - return m_actualVideoSettings; -} - -void QGStreamerVideoEncoderControl::setActualVideoSettings(const QVideoEncoderSettings &settings) -{ - m_actualVideoSettings = settings; -} - -void QGStreamerVideoEncoderControl::resetActualSettings() -{ - m_actualVideoSettings = m_videoSettings; -} - - -QPair<int,int> QGStreamerVideoEncoderControl::rateAsRational(qreal frameRate) const -{ - if (frameRate < 0) - frameRate = m_actualVideoSettings.frameRate(); - - if (frameRate > 0.001) { - //convert to rational number - QList<int> denumCandidates; - denumCandidates << 1 << 2 << 3 << 5 << 10 << 25 << 30 << 50 << 100 << 1001 << 1000; - - qreal error = 1.0; - int num = 1; - int denum = 1; - - for (int curDenum : qAsConst(denumCandidates)) { - int curNum = qRound(frameRate*curDenum); - qreal curError = qAbs(qreal(curNum)/curDenum - frameRate); - - if (curError < error) { - error = curError; - num = curNum; - denum = curDenum; - } - - if (curError < 1e-8) - break; - } - - return QPair<int,int>(num,denum); - } - - return QPair<int,int>(); -} - -GstEncodingProfile *QGStreamerVideoEncoderControl::createProfile() -{ - QString codec = m_actualVideoSettings.codec(); - GstCaps *caps = !codec.isEmpty() ? gst_caps_from_string(codec.toLatin1()) : nullptr; - - if (!caps) - return nullptr; - - QString preset = m_actualVideoSettings.encodingOption(QStringLiteral("preset")).toString(); - GstEncodingVideoProfile *profile = gst_encoding_video_profile_new( - caps, - !preset.isEmpty() ? preset.toLatin1().constData() : NULL, //preset - NULL, //restriction - 0); //presence - - gst_caps_unref(caps); - - gst_encoding_video_profile_set_pass(profile, 0); - gst_encoding_video_profile_set_variableframerate(profile, TRUE); - - return (GstEncodingProfile *)profile; -} - -void QGStreamerVideoEncoderControl::applySettings(GstElement *encoder) -{ - GObjectClass * const objectClass = G_OBJECT_GET_CLASS(encoder); - const char * const name = qt_gst_element_get_factory_name(encoder); - - const int bitRate = m_actualVideoSettings.bitRate(); - if (bitRate == -1) { - // Bit rate is invalid, don't evaluate the remaining conditions. - } else if (g_object_class_find_property(objectClass, "bitrate")) { - g_object_set(G_OBJECT(encoder), "bitrate", bitRate, NULL); - } else if (g_object_class_find_property(objectClass, "target-bitrate")) { - g_object_set(G_OBJECT(encoder), "target-bitrate", bitRate, NULL); - } - - if (qstrcmp(name, "theoraenc") == 0) { - static const int qualities[] = { 8, 16, 32, 45, 60 }; - g_object_set(G_OBJECT(encoder), "quality", qualities[m_actualVideoSettings.quality()], NULL); - } else if (qstrncmp(name, "avenc_", 6) == 0) { - if (g_object_class_find_property(objectClass, "pass")) { - static const int modes[] = { 0, 2, 512, 1024 }; - g_object_set(G_OBJECT(encoder), "pass", modes[m_actualVideoSettings.encodingMode()], NULL); - } - if (g_object_class_find_property(objectClass, "quantizer")) { - static const double qualities[] = { 20, 8.0, 3.0, 2.5, 2.0 }; - g_object_set(G_OBJECT(encoder), "quantizer", qualities[m_actualVideoSettings.quality()], NULL); - } - } else if (qstrncmp(name, "omx", 3) == 0) { - if (!g_object_class_find_property(objectClass, "control-rate")) { - } else switch (m_actualVideoSettings.encodingMode()) { - case QMultimedia::ConstantBitRateEncoding: - g_object_set(G_OBJECT(encoder), "control-rate", 2, NULL); - break; - case QMultimedia::AverageBitRateEncoding: - g_object_set(G_OBJECT(encoder), "control-rate", 1, NULL); - break; - default: - g_object_set(G_OBJECT(encoder), "control-rate", 0, NULL); - } - } -} - - -QSet<QString> QGStreamerVideoEncoderControl::supportedStreamTypes(const QString &codecName) const -{ - return m_codecs.supportedStreamTypes(codecName); -} - - -GstElement *QGStreamerVideoEncoderControl::createEncoder() -{ - QString codec = m_videoSettings.codec(); - GstElement *encoderElement = gst_element_factory_make(m_codecs.codecElement(codec).constData(), "video-encoder"); - if (!encoderElement) - return 0; - - GstBin *encoderBin = GST_BIN(gst_bin_new("video-encoder-bin")); - - GstElement *sinkCapsFilter = gst_element_factory_make("capsfilter", "capsfilter-video-in"); - GstElement *srcCapsFilter = gst_element_factory_make("capsfilter", "capsfilter-video-out"); - gst_bin_add_many(encoderBin, sinkCapsFilter, srcCapsFilter, NULL); - - GstElement *colorspace = gst_element_factory_make("videoconvert", NULL); - gst_bin_add(encoderBin, colorspace); - gst_bin_add(encoderBin, encoderElement); - - gst_element_link_many(sinkCapsFilter, colorspace, encoderElement, srcCapsFilter, NULL); - - // add ghostpads - GstPad *pad = gst_element_get_static_pad(sinkCapsFilter, "sink"); - gst_element_add_pad(GST_ELEMENT(encoderBin), gst_ghost_pad_new("sink", pad)); - gst_object_unref(GST_OBJECT(pad)); - - pad = gst_element_get_static_pad(srcCapsFilter, "src"); - gst_element_add_pad(GST_ELEMENT(encoderBin), gst_ghost_pad_new("src", pad)); - gst_object_unref(GST_OBJECT(pad)); - - if (encoderElement) { - if (m_videoSettings.encodingMode() == QMultimedia::ConstantQualityEncoding) { - QMultimedia::EncodingQuality qualityValue = m_videoSettings.quality(); - - if (codec == QLatin1String("video/x-h264")) { - //constant quantizer mode - g_object_set(G_OBJECT(encoderElement), "pass", 4, NULL); - int qualityTable[] = { - 50, //VeryLow - 35, //Low - 21, //Normal - 15, //High - 8 //VeryHigh - }; - g_object_set(G_OBJECT(encoderElement), "quantizer", qualityTable[qualityValue], NULL); - } else if (codec == QLatin1String("video/x-xvid")) { - //constant quantizer mode - g_object_set(G_OBJECT(encoderElement), "pass", 3, NULL); - int qualityTable[] = { - 32, //VeryLow - 12, //Low - 5, //Normal - 3, //High - 2 //VeryHigh - }; - int quant = qualityTable[qualityValue]; - g_object_set(G_OBJECT(encoderElement), "quantizer", quant, NULL); - } else if (codec.startsWith(QLatin1String("video/mpeg"))) { - //constant quantizer mode - g_object_set(G_OBJECT(encoderElement), "pass", 2, NULL); - //quant from 1 to 30, default ~3 - double qualityTable[] = { - 20, //VeryLow - 8.0, //Low - 3.0, //Normal - 2.5, //High - 2.0 //VeryHigh - }; - double quant = qualityTable[qualityValue]; - g_object_set(G_OBJECT(encoderElement), "quantizer", quant, NULL); - } else if (codec == QLatin1String("video/x-theora")) { - int qualityTable[] = { - 8, //VeryLow - 16, //Low - 32, //Normal - 45, //High - 60 //VeryHigh - }; - //quality from 0 to 63 - int quality = qualityTable[qualityValue]; - g_object_set(G_OBJECT(encoderElement), "quality", quality, NULL); - } - } else { - int bitrate = m_videoSettings.bitRate(); - if (bitrate > 0) { - g_object_set(G_OBJECT(encoderElement), "bitrate", bitrate, NULL); - } - } - -#if 0 - QMap<QString,QVariant> options = m_options.value(codec); - for (auto it = options.cbegin(), end = options.cend(); it != end; ++it) { - const QString &option = it.key(); - const QVariant &value = it.value(); - - switch (value.typeId()) { - case QMetaType::Int: - g_object_set(G_OBJECT(encoderElement), option.toLatin1(), value.toInt(), NULL); - break; - case QMetaType::Bool: - g_object_set(G_OBJECT(encoderElement), option.toLatin1(), value.toBool(), NULL); - break; - case QMetaType::Double: - g_object_set(G_OBJECT(encoderElement), option.toLatin1(), value.toDouble(), NULL); - break; - case QMetaType::QString: - g_object_set(G_OBJECT(encoderElement), option.toLatin1(), value.toString().toUtf8().constData(), NULL); - break; - default: - qWarning() << "unsupported option type:" << option << value; - break; - } - - } -#endif - } - - if (!m_videoSettings.resolution().isEmpty() || m_videoSettings.frameRate() > 0.001) { - GstCaps *caps = QGstUtils::videoFilterCaps(); - - if (!m_videoSettings.resolution().isEmpty()) { - gst_caps_set_simple( - caps, - "width", G_TYPE_INT, m_videoSettings.resolution().width(), - "height", G_TYPE_INT, m_videoSettings.resolution().height(), - NULL); - } - - if (m_videoSettings.frameRate() > 0.001) { - QPair<int,int> rate = rateAsRational(); - gst_caps_set_simple( - caps, - "framerate", GST_TYPE_FRACTION, rate.first, rate.second, - NULL); - } - - //qDebug() << "set video caps filter:" << gst_caps_to_string(caps); - - g_object_set(G_OBJECT(sinkCapsFilter), "caps", caps, NULL); - - gst_caps_unref(caps); - } - - // Some encoders support several codecs. Setting a caps filter downstream with the desired - // codec (which is actually a string representation of the caps) will make sure we use the - // correct codec. - GstCaps *caps = gst_caps_from_string(codec.toUtf8().constData()); - g_object_set(G_OBJECT(srcCapsFilter), "caps", caps, NULL); - gst_caps_unref(caps); - - return GST_ELEMENT(encoderBin); -} - -QT_END_NAMESPACE diff --git a/src/multimedia/platform/gstreamer/common/qgstreamervideoencoder_p.h b/src/multimedia/platform/gstreamer/common/qgstreamervideoencoder_p.h deleted file mode 100644 index ae0395f2d..000000000 --- a/src/multimedia/platform/gstreamer/common/qgstreamervideoencoder_p.h +++ /dev/null @@ -1,107 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QGSTREAMERVIDEOENCODER_H -#define QGSTREAMERVIDEOENCODER_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include <QtMultimedia/private/qtmultimediaglobal_p.h> -#include <qvideoencodersettingscontrol.h> - -#include <QtCore/qstringlist.h> -#include <QtCore/qmap.h> -#include <QtCore/qset.h> - -#include <gst/gst.h> -#include <gst/pbutils/pbutils.h> - -#include <gst/pbutils/encoding-profile.h> -#include <private/qgstcodecsinfo_p.h> - -QT_BEGIN_NAMESPACE - -class QGStreamerVideoEncoderControl : public QVideoEncoderSettingsControl -{ - Q_OBJECT -public: - QGStreamerVideoEncoderControl(); - virtual ~QGStreamerVideoEncoderControl(); - - QPair<int,int> rateAsRational(qreal = -1.) const; - - QStringList supportedVideoCodecs() const override; - QString videoCodecDescription(const QString &codecName) const override; - - QVideoEncoderSettings videoSettings() const override; - void setVideoSettings(const QVideoEncoderSettings &settings) override; - - QVideoEncoderSettings actualVideoSettings() const; - void setActualVideoSettings(const QVideoEncoderSettings&); - void resetActualSettings(); - - GstEncodingProfile *createProfile(); - - void applySettings(GstElement *encoder); - - QSet<QString> supportedStreamTypes(const QString &codecName) const; - GstElement *createEncoder(); - -Q_SIGNALS: - void settingsChanged(); - -private: - QGstCodecsInfo m_codecs; - - QVideoEncoderSettings m_actualVideoSettings; - QVideoEncoderSettings m_videoSettings; -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/multimedia/platform/gstreamer/common/qgstutils.cpp b/src/multimedia/platform/gstreamer/common/qgstutils.cpp index 694bc751f..2adcb65e7 100644 --- a/src/multimedia/platform/gstreamer/common/qgstutils.cpp +++ b/src/multimedia/platform/gstreamer/common/qgstutils.cpp @@ -999,6 +999,37 @@ void qt_gst_util_double_to_fraction(gdouble src, gint *dest_n, gint *dest_d) gst_util_double_to_fraction(src, dest_n, dest_d); } +QPair<int,int> qt_gstRateAsRational(qreal frameRate) +{ + if (frameRate > 0.001) { + //convert to rational number + QList<int> denumCandidates; + denumCandidates << 1 << 2 << 3 << 5 << 10 << 25 << 30 << 50 << 100 << 1001 << 1000; + + qreal error = 1.0; + int num = 1; + int denum = 1; + + for (int curDenum : qAsConst(denumCandidates)) { + int curNum = qRound(frameRate*curDenum); + qreal curError = qAbs(qreal(curNum)/curDenum - frameRate); + + if (curError < error) { + error = curError; + num = curNum; + denum = curDenum; + } + + if (curError < 1e-8) + break; + } + + return QPair<int,int>(num,denum); + } + + return QPair<int,int>(); +} + QDebug operator <<(QDebug debug, GstCaps *caps) { if (caps) { diff --git a/src/multimedia/platform/gstreamer/common/qgstutils_p.h b/src/multimedia/platform/gstreamer/common/qgstutils_p.h index 75c525771..7b6b6ded1 100644 --- a/src/multimedia/platform/gstreamer/common/qgstutils_p.h +++ b/src/multimedia/platform/gstreamer/common/qgstutils_p.h @@ -213,6 +213,7 @@ Q_MULTIMEDIA_EXPORT const gchar *qt_gst_element_get_factory_name(GstElement *ele Q_MULTIMEDIA_EXPORT gboolean qt_gst_caps_can_intersect(const GstCaps * caps1, const GstCaps * caps2); Q_MULTIMEDIA_EXPORT GList *qt_gst_video_sinks(); Q_MULTIMEDIA_EXPORT void qt_gst_util_double_to_fraction(gdouble src, gint *dest_n, gint *dest_d); +QPair<int,int> qt_gstRateAsRational(qreal frameRate); Q_MULTIMEDIA_EXPORT QDebug operator <<(QDebug debug, GstCaps *caps); diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp index f618541a0..7679c4647 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp @@ -40,9 +40,6 @@ #include "qgstreamercaptureservice_p.h" #include "qgstreamercapturesession_p.h" #include "qgstreamerrecordercontrol_p.h" -#include "private/qgstreameraudioencoder_p.h" -#include "private/qgstreamervideoencoder_p.h" -#include "private/qgstreamercontainer_p.h" #include "qgstreamerimageencode_p.h" #include "qgstreamercameracontrol_p.h" #include <private/qgstreamerbushelper_p.h> @@ -104,19 +101,9 @@ QObject *QGstreamerCaptureService::requestControl(const char *name) if (qstrcmp(name,QMediaRecorderControl_iid) == 0) return m_captureSession->recorderControl(); - if (qstrcmp(name,QAudioEncoderSettingsControl_iid) == 0) - return m_captureSession->audioEncodeControl(); - - if (qstrcmp(name,QVideoEncoderSettingsControl_iid) == 0) - return m_captureSession->videoEncodeControl(); - if (qstrcmp(name,QImageEncoderControl_iid) == 0) return m_captureSession->imageEncodeControl(); - - if (qstrcmp(name,QMediaContainerControl_iid) == 0) - return m_captureSession->mediaContainerControl(); - if (qstrcmp(name,QCameraControl_iid) == 0) return m_cameraControl; diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp index 33b61ea10..193ccaa34 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp @@ -39,9 +39,6 @@ #include "qgstreamercapturesession_p.h" #include "qgstreamerrecordercontrol_p.h" -#include "private/qgstreamercontainer_p.h" -#include "private/qgstreameraudioencoder_p.h" -#include "private/qgstreamervideoencoder_p.h" #include "qgstreamerimageencode_p.h" #include <qmediarecorder.h> #include <qmediadevicemanager.h> @@ -49,10 +46,12 @@ #include <private/qgstreamerbushelper_p.h> #include <private/qaudiodeviceinfo_gstreamer_p.h> #include <private/qgstutils_p.h> - +#include <private/qgstreamerintegration_p.h> +#include <private/qgstreamerformatsinfo_p.h> #include <gst/gsttagsetter.h> #include <gst/gstversion.h> #include <gst/video/video.h> +#include <gst/pbutils/encoding-profile.h> #include <QtCore/qdebug.h> #include <QtCore/qurl.h> @@ -98,14 +97,11 @@ QGstreamerCaptureSession::QGstreamerCaptureSession(QGstreamerCaptureSession::Cap m_busHelper = new QGstreamerBusHelper(m_bus, this); m_busHelper->installMessageFilter(this); - m_audioEncodeControl = new QGStreamerAudioEncoderControl(this); - m_videoEncodeControl = new QGStreamerVideoEncoderControl(); m_imageEncodeControl = new QGstreamerImageEncode(this); m_recorderControl = new QGstreamerRecorderControl(this); connect(m_recorderControl, &QGstreamerRecorderControl::error, [](int e, const QString &str) { qWarning() << QMediaRecorder::Error(e) << ":" << str.toLatin1().constData(); }); - m_mediaContainerControl = new QGStreamerContainerControl(this); } QGstreamerCaptureSession::~QGstreamerCaptureSession() @@ -130,6 +126,107 @@ GstElement *QGstreamerCaptureSession::buildFileSink() return fileSink; } + +static GstEncodingContainerProfile *createContainerProfile(const QMediaEncoderSettings &settings) +{ + GstCaps *caps = nullptr; + + auto *formatInfo = QGstreamerIntegration::instance()->m_formatsInfo; + + if (!formatInfo->encodableMediaContainers().contains(settings.format())) + return nullptr; + + const char *format = formatInfo->nativeFormat(settings.format()); + Q_ASSERT(format); + + caps = gst_caps_from_string(format); + + GstEncodingContainerProfile *profile = (GstEncodingContainerProfile *)gst_encoding_container_profile_new( + "container_profile", + (gchar *)"custom container profile", + caps, + NULL); //preset + + gst_caps_unref(caps); + + return profile; +} + +static GstEncodingProfile *createVideoProfile(const QMediaEncoderSettings &settings) +{ + auto *formatInfo = QGstreamerIntegration::instance()->m_formatsInfo; + + if (!formatInfo->encodableVideoCodecs().contains(settings.videoCodec())) + return nullptr; + + const char *codec = formatInfo->nativeFormat(settings.videoCodec()); + Q_ASSERT(codec); + GstCaps *caps = gst_caps_from_string(codec); + + if (!caps) + return nullptr; + + GstEncodingVideoProfile *profile = gst_encoding_video_profile_new( + caps, + nullptr, + NULL, //restriction + 0); //presence + + gst_caps_unref(caps); + + gst_encoding_video_profile_set_pass(profile, 0); + gst_encoding_video_profile_set_variableframerate(profile, TRUE); + + return (GstEncodingProfile *)profile; +} + +static GstEncodingProfile *createAudioProfile(const QMediaEncoderSettings &settings) +{ + auto *formatInfo = QGstreamerIntegration::instance()->m_formatsInfo; + + if (!formatInfo->encodableAudioCodecs().contains(settings.audioCodec())) + return nullptr; + + const char *codec = formatInfo->nativeFormat(settings.audioCodec()); + Q_ASSERT(codec); + + GstCaps *caps = gst_caps_from_string(codec); + + GstEncodingProfile *profile = (GstEncodingProfile *)gst_encoding_audio_profile_new( + caps, + nullptr, //preset + NULL, //restriction + 0); //presence + + gst_caps_unref(caps); + + return profile; +} + + +static GstEncodingContainerProfile *createEncodingProfile(const QMediaEncoderSettings &settings, QGstreamerCaptureSession::CaptureMode mode) +{ + auto *containerProfile = createContainerProfile(settings); + if (containerProfile) { + GstEncodingProfile *audioProfile = mode & QGstreamerCaptureSession::Audio ? createAudioProfile(settings) : nullptr; + GstEncodingProfile *videoProfile = mode & QGstreamerCaptureSession::Video ? createVideoProfile(settings) : nullptr; + qDebug() << "audio profile" << gst_caps_to_string(gst_encoding_profile_get_format(audioProfile)); + qDebug() << "video profile" << gst_caps_to_string(gst_encoding_profile_get_format(videoProfile)); + qDebug() << "conta profile" << gst_caps_to_string(gst_encoding_profile_get_format((GstEncodingProfile *)containerProfile)); + + if (videoProfile) { + if (!gst_encoding_container_profile_add_profile(containerProfile, videoProfile)) + gst_encoding_profile_unref(videoProfile); + } + if (audioProfile) { + if (!gst_encoding_container_profile_add_profile(containerProfile, audioProfile)) + gst_encoding_profile_unref(audioProfile); + } + } + + return containerProfile; +} + GstElement *QGstreamerCaptureSession::buildEncodeBin() { GstElement *encoder = gst_element_factory_make("encodebin", "encoder"); @@ -138,10 +235,7 @@ GstElement *QGstreamerCaptureSession::buildEncodeBin() return nullptr; } - m_mediaContainerControl->applySettings(m_audioEncodeControl, m_videoEncodeControl); - auto *audioEncode = m_captureMode & Audio ? m_audioEncodeControl : nullptr; - auto *videoEncode = m_captureMode & Video ? m_videoEncodeControl : nullptr; - auto *encodingProfile = m_mediaContainerControl->fullProfile(audioEncode, videoEncode); + auto *encodingProfile = createEncodingProfile(m_recorderControl->resolvedEncoderSettings(), m_captureMode); g_object_set (G_OBJECT(encoder), "profile", @@ -231,9 +325,9 @@ GstElement *QGstreamerCaptureSession::buildVideoPreview() qreal frameRate = 0; if (m_captureMode & Video) { - QVideoEncoderSettings videoSettings = m_videoEncodeControl->videoSettings(); - resolution = videoSettings.resolution(); - frameRate = videoSettings.frameRate(); + QMediaEncoderSettings videoSettings = m_recorderControl->resolvedEncoderSettings(); + resolution = videoSettings.videoResolution(); + frameRate = videoSettings.videoFrameRate(); } else if (m_captureMode & Image) { resolution = m_imageEncodeControl->imageSettings().resolution(); } @@ -245,7 +339,7 @@ GstElement *QGstreamerCaptureSession::buildVideoPreview() gst_caps_set_simple(caps, "height", G_TYPE_INT, resolution.height(), NULL); } if (frameRate > 0.001) { - QPair<int,int> rate = m_videoEncodeControl->rateAsRational(); + QPair<int,int> rate = qt_gstRateAsRational(frameRate); //qDebug() << "frame rate:" << num << denum; diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h index 3f70659a8..09c650388 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h @@ -68,11 +68,8 @@ QT_BEGIN_NAMESPACE class QGstreamerMessage; class QGstreamerBusHelper; -class QGStreamerAudioEncoderControl; -class QGStreamerVideoEncoderControl; class QGstreamerImageEncode; class QGstreamerRecorderControl; -class QGStreamerContainerControl; class QGstreamerVideoRendererInterface; class QCameraInfo; @@ -120,12 +117,9 @@ public: QUrl outputLocation() const; bool setOutputLocation(const QUrl& sink); - QGStreamerAudioEncoderControl *audioEncodeControl() const { return m_audioEncodeControl; } - QGStreamerVideoEncoderControl *videoEncodeControl() const { return m_videoEncodeControl; } QGstreamerImageEncode *imageEncodeControl() const { return m_imageEncodeControl; } QGstreamerRecorderControl *recorderControl() const { return m_recorderControl; } - QGStreamerContainerControl *mediaContainerControl() const { return m_mediaContainerControl; } QGstreamerElementFactory *audioPreview() const { return m_audioPreviewFactory; } void setAudioPreview(QGstreamerElementFactory *audioPreview); @@ -203,11 +197,8 @@ private: QObject *m_viewfinder; QGstreamerVideoRendererInterface *m_viewfinderInterface; - QGStreamerAudioEncoderControl *m_audioEncodeControl; - QGStreamerVideoEncoderControl *m_videoEncodeControl; QGstreamerImageEncode *m_imageEncodeControl; QGstreamerRecorderControl *m_recorderControl; - QGStreamerContainerControl *m_mediaContainerControl; QGstreamerBusHelper *m_busHelper; GstBus* m_bus; diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp index b1c433874..7c60ed4d1 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp @@ -38,9 +38,6 @@ ****************************************************************************/ #include "qgstreamerrecordercontrol_p.h" -#include "private/qgstreameraudioencoder_p.h" -#include "private/qgstreamervideoencoder_p.h" -#include "private/qgstreamercontainer_p.h" #include <QtCore/QDebug> #include <QtGui/qdesktopservices.h> #include <QStandardPaths> @@ -157,7 +154,7 @@ void QGstreamerRecorderControl::record() m_state = QMediaRecorder::RecordingState; if (m_outputLocation.isEmpty()) { - QString container = m_session->mediaContainerControl()->containerExtension(); + QString container;// ### = m_session->mediaContainerControl()->containerExtension(); if (container.isEmpty()) container = "raw"; @@ -214,103 +211,6 @@ void QGstreamerRecorderControl::stop() void QGstreamerRecorderControl::applySettings() { - //Check the codecs are compatible with container, - //and choose the compatible codecs/container if omitted - QGStreamerAudioEncoderControl *audioEncodeControl = m_session->audioEncodeControl(); - QGStreamerVideoEncoderControl *videoEncodeControl = m_session->videoEncodeControl(); - QGStreamerContainerControl *mediaContainerControl = m_session->mediaContainerControl(); - -#if 0 - mediaContainerControl->applySettings(audioEncodeControl, videoEncodeControl); -#else - bool needAudio = m_session->captureMode() & QGstreamerCaptureSession::Audio; - bool needVideo = m_session->captureMode() & QGstreamerCaptureSession::Video; - - QStringList containerCandidates; - if (mediaContainerControl->containerFormat().isEmpty()) - containerCandidates = mediaContainerControl->supportedContainers(); - else - containerCandidates << mediaContainerControl->containerFormat(); - - - QStringList audioCandidates; - if (needAudio) { - QAudioEncoderSettings audioSettings = audioEncodeControl->audioSettings(); - if (audioSettings.codec().isEmpty()) - audioCandidates = audioEncodeControl->supportedAudioCodecs(); - else - audioCandidates << audioSettings.codec(); - } - - QStringList videoCandidates; - if (needVideo) { - QVideoEncoderSettings videoSettings = videoEncodeControl->videoSettings(); - if (videoSettings.codec().isEmpty()) - videoCandidates = videoEncodeControl->supportedVideoCodecs(); - else - videoCandidates << videoSettings.codec(); - } - - QString container; - QString audioCodec; - QString videoCodec; - - for (const QString &containerCandidate : qAsConst(containerCandidates)) { - QSet<QString> supportedTypes = mediaContainerControl->supportedStreamTypes(containerCandidate); - - audioCodec.clear(); - videoCodec.clear(); - - if (needAudio) { - bool found = false; - for (const QString &audioCandidate : qAsConst(audioCandidates)) { - QSet<QString> audioTypes = audioEncodeControl->supportedStreamTypes(audioCandidate); - if (audioTypes.intersects(supportedTypes)) { - found = true; - audioCodec = audioCandidate; - break; - } - } - if (!found) - continue; - } - - if (needVideo) { - bool found = false; - for (const QString &videoCandidate : qAsConst(videoCandidates)) { - QSet<QString> videoTypes = videoEncodeControl->supportedStreamTypes(videoCandidate); - if (videoTypes.intersects(supportedTypes)) { - found = true; - videoCodec = videoCandidate; - break; - } - } - if (!found) - continue; - } - - container = containerCandidate; - break; - } - - if (container.isEmpty()) { - emit error(QMediaRecorder::FormatError, tr("Not compatible codecs and container format.")); - } else { - mediaContainerControl->setContainerFormat(container); - - if (needAudio) { - QAudioEncoderSettings audioSettings = audioEncodeControl->audioSettings(); - audioSettings.setCodec(audioCodec); - audioEncodeControl->setAudioSettings(audioSettings); - } - - if (needVideo) { - QVideoEncoderSettings videoSettings = videoEncodeControl->videoSettings(); - videoSettings.setCodec(videoCodec); - videoEncodeControl->setVideoSettings(videoSettings); - } - } -#endif } QAudioDeviceInfo QGstreamerRecorderControl::audioInput() const @@ -324,6 +224,19 @@ bool QGstreamerRecorderControl::setAudioInput(const QAudioDeviceInfo &info) return true; } +void QGstreamerRecorderControl::setEncoderSettings(const QMediaEncoderSettings &settings) +{ + m_settings = settings; +} + +QMediaEncoderSettings QGstreamerRecorderControl::resolvedEncoderSettings() const +{ + QMediaEncoderSettings f = m_settings; + f.resolveFormat(m_session->captureMode() & QGstreamerCaptureSession::Video ? + QMediaEncoderSettings::AudioAndVideo : QMediaEncoderSettings::AudioOnly); + return f; +} + bool QGstreamerRecorderControl::isMuted() const { diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol_p.h index 1225b76d2..667789b74 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol_p.h +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerrecordercontrol_p.h @@ -83,6 +83,10 @@ public: QAudioDeviceInfo audioInput() const override; bool setAudioInput(const QAudioDeviceInfo &id) override; + void setEncoderSettings(const QMediaEncoderSettings &settings) override; + QMediaEncoderSettings encoderSettings() const { return m_settings; } + QMediaEncoderSettings resolvedEncoderSettings() const; + public slots: void setState(QMediaRecorder::State state) override; void record(); @@ -100,6 +104,7 @@ private: QString generateFileName(const QDir &dir, const QString &ext) const; QUrl m_outputLocation; + QMediaEncoderSettings m_settings; QGstreamerCaptureSession *m_session; QMediaRecorder::State m_state; QMediaRecorder::Status m_status; diff --git a/src/multimedia/platform/gstreamer/qgstreamerformatsinfo.cpp b/src/multimedia/platform/gstreamer/qgstreamerformatsinfo.cpp index 6f6b6913c..6b2744f3d 100644 --- a/src/multimedia/platform/gstreamer/qgstreamerformatsinfo.cpp +++ b/src/multimedia/platform/gstreamer/qgstreamerformatsinfo.cpp @@ -51,11 +51,11 @@ static struct { { "video/x-ms-asf", QMediaFormat::FileFormat::ASF }, { "video/x-msvideo", QMediaFormat::FileFormat::AVI }, { "video/x-matroska", QMediaFormat::FileFormat::Matroska }, - { "video/quicktime, variant=(string)iso", QMediaFormat::FileFormat::MPEG4 }, + { "video/mpeg", QMediaFormat::FileFormat::MPEG4 }, { "video/quicktime", QMediaFormat::FileFormat::QuickTime }, { "video/ogg", QMediaFormat::FileFormat::Ogg }, { "video/webm", QMediaFormat::FileFormat::WebM }, - { nullptr, QMediaFormat::FileFormat::MPEG4 } + { nullptr, QMediaFormat::FileFormat::UnspecifiedFormat } }; static struct { @@ -65,26 +65,25 @@ static struct { { "audio/mpeg, mpegversion=(int)1, layer=(int)3", QMediaFormat::FileFormat::MP3 }, { "audio/mpeg, mpegversion=(int)4", QMediaFormat::FileFormat::AAC }, { "audio/x-flac", QMediaFormat::FileFormat::FLAC }, - { "audio/x-wma, wmaversion=(int)1", QMediaFormat::FileFormat::WindowsMediaAudio }, - { "audio/x-wma, wmaversion=(int)2", QMediaFormat::FileFormat::WindowsMediaAudio }, - { nullptr, QMediaFormat::FileFormat::MPEG4 }, + { "audio/x-wma", QMediaFormat::FileFormat::WindowsMediaAudio }, + { nullptr, QMediaFormat::FileFormat::UnspecifiedFormat }, }; static struct { const char *name; QMediaFormat::VideoCodec value; } videoCodecMap[] = { - { "video/mpeg, mpegversion=(int)1, systemstream=(boolean)false", QMediaFormat::VideoCodec::MPEG1 }, - { "video/mpeg, mpegversion=(int)2, systemstream=(boolean)false", QMediaFormat::VideoCodec::MPEG2 }, - { "video/mpeg, mpegversion=(int)4, systemstream=(boolean)false", QMediaFormat::VideoCodec::MPEG4 }, + { "video/mpeg, mpegversion=(int)1", QMediaFormat::VideoCodec::MPEG1 }, + { "video/mpeg, mpegversion=(int)2", QMediaFormat::VideoCodec::MPEG2 }, + { "video/mpeg, mpegversion=(int)4", QMediaFormat::VideoCodec::MPEG4 }, { "video/x-h264", QMediaFormat::VideoCodec::H264 }, { "video/x-h265", QMediaFormat::VideoCodec::H265 }, { "video/x-vp8", QMediaFormat::VideoCodec::VP8 }, { "video/x-vp9", QMediaFormat::VideoCodec::VP9 }, { "video/x-av1", QMediaFormat::VideoCodec::AV1 }, { "video/x-theora", QMediaFormat::VideoCodec::Theora }, - { "video/", QMediaFormat::VideoCodec::MotionJPEG }, - { nullptr, QMediaFormat::VideoCodec::Invalid } + { "video/x-jpeg", QMediaFormat::VideoCodec::MotionJPEG }, + { nullptr, QMediaFormat::VideoCodec::Unspecified } }; static struct { @@ -96,25 +95,27 @@ static struct { { "audio/x-ac3", QMediaFormat::AudioCodec::AC3 }, { "audio/x-eac3", QMediaFormat::AudioCodec::EAC3 }, { "audio/x-flac", QMediaFormat::AudioCodec::FLAC }, - { "audio/x-wma, wmaversion=(int)1", QMediaFormat::AudioCodec::WindowsMediaAudio }, - { "audio/x-wma, wmaversion=(int)2", QMediaFormat::AudioCodec::WindowsMediaAudio }, + { "audio/x-wma", QMediaFormat::AudioCodec::WindowsMediaAudio }, { "audio/x-true-hd", QMediaFormat::AudioCodec::DolbyTrueHD }, { "audio/x-vorbis", QMediaFormat::AudioCodec::Vorbis }, - { nullptr, QMediaFormat::AudioCodec::Invalid }, + { nullptr, QMediaFormat::AudioCodec::Unspecified }, }; -template<typename Map> -static auto getList(QGstCodecsInfo::ElementType type, Map *map) +template<typename Map, typename Hash> +static auto getList(QGstCodecsInfo::ElementType type, Map *map, Hash &hash) { using T = decltype(map->value); QList<T> list; QGstCodecsInfo info(type); auto codecs = info.supportedCodecs(); for (const auto &c : codecs) { + if (type == QGstCodecsInfo::AudioDecoder) + qDebug() << "gst format" << c; Map *m = map; while (m->name) { if (m->name == c.toLatin1()) { list.append(m->value); + hash.insert(m->value, m->name); break; } ++m; @@ -125,15 +126,15 @@ static auto getList(QGstCodecsInfo::ElementType type, Map *map) QGstreamerFormatsInfo::QGstreamerFormatsInfo() { - m_decodableMediaContainers = getList(QGstCodecsInfo::Demuxer, videoFormatsMap); - m_decodableMediaContainers.append(getList(QGstCodecsInfo::AudioDecoder, audioFormatsMap)); - m_decodableAudioCodecs = getList(QGstCodecsInfo::AudioDecoder, audioCodecMap); - m_decodableVideoCodecs = getList(QGstCodecsInfo::VideoDecoder, videoCodecMap); - - m_encodableMediaContainers = getList(QGstCodecsInfo::Muxer, videoFormatsMap); - m_encodableMediaContainers.append(getList(QGstCodecsInfo::AudioEncoder, audioFormatsMap)); - m_encodableAudioCodecs = getList(QGstCodecsInfo::AudioEncoder, audioCodecMap); - m_encodableVideoCodecs = getList(QGstCodecsInfo::VideoEncoder, videoCodecMap); + m_decodableMediaContainers = getList(QGstCodecsInfo::Demuxer, videoFormatsMap, formatToCaps); + m_decodableMediaContainers.append(getList(QGstCodecsInfo::AudioDecoder, audioFormatsMap, formatToCaps)); + m_decodableAudioCodecs = getList(QGstCodecsInfo::AudioDecoder, audioCodecMap, audioToCaps); + m_decodableVideoCodecs = getList(QGstCodecsInfo::VideoDecoder, videoCodecMap, videoToCaps); + + m_encodableMediaContainers = getList(QGstCodecsInfo::Muxer, videoFormatsMap, formatToCaps); + m_encodableMediaContainers.append(getList(QGstCodecsInfo::AudioEncoder, audioFormatsMap, formatToCaps)); + m_encodableAudioCodecs = getList(QGstCodecsInfo::AudioEncoder, audioCodecMap, audioToCaps); + m_encodableVideoCodecs = getList(QGstCodecsInfo::VideoEncoder, videoCodecMap, videoToCaps); } QGstreamerFormatsInfo::~QGstreamerFormatsInfo() diff --git a/src/multimedia/platform/gstreamer/qgstreamerformatsinfo_p.h b/src/multimedia/platform/gstreamer/qgstreamerformatsinfo_p.h index dff690fd6..e81319532 100644 --- a/src/multimedia/platform/gstreamer/qgstreamerformatsinfo_p.h +++ b/src/multimedia/platform/gstreamer/qgstreamerformatsinfo_p.h @@ -52,6 +52,7 @@ // #include <private/qmediaplatformformatinfo_p.h> +#include <qhash.h> #include <qlist.h> QT_BEGIN_NAMESPACE @@ -70,6 +71,10 @@ public: QList<QMediaFormat::AudioCodec> encodableAudioCodecs() const override; QList<QMediaFormat::VideoCodec> encodableVideoCodecs() const override; + const char *nativeFormat(QMediaFormat::FileFormat f) const { return formatToCaps.value(f); } + const char *nativeFormat(QMediaFormat::AudioCodec c) const { return audioToCaps.value(c); } + const char *nativeFormat(QMediaFormat::VideoCodec c) const { return videoToCaps.value(c); } + private: QList<QMediaFormat::FileFormat> m_decodableMediaContainers; QList<QMediaFormat::AudioCodec> m_decodableAudioCodecs; @@ -78,6 +83,10 @@ private: QList<QMediaFormat::FileFormat> m_encodableMediaContainers; QList<QMediaFormat::AudioCodec> m_encodableAudioCodecs; QList<QMediaFormat::VideoCodec> m_encodableVideoCodecs; + + QHash<QMediaFormat::FileFormat, const char *> formatToCaps; + QHash<QMediaFormat::AudioCodec, const char *> audioToCaps; + QHash<QMediaFormat::VideoCodec, const char *> videoToCaps; }; QT_END_NAMESPACE diff --git a/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h b/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h index 8a0106627..a06beb34a 100644 --- a/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h +++ b/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h @@ -57,6 +57,7 @@ QT_BEGIN_NAMESPACE class QGstreamerDeviceManager; class QGstreamerPlayerInterface; +class QGstreamerFormatsInfo; class QGstreamerIntegration : public QMediaPlatformIntegration { @@ -64,6 +65,7 @@ public: QGstreamerIntegration(); ~QGstreamerIntegration(); + static QGstreamerIntegration *instance() { return static_cast<QGstreamerIntegration *>(QMediaPlatformIntegration::instance()); } QMediaPlatformDeviceManager *deviceManager() override; QMediaPlatformFormatInfo *formatInfo() override; @@ -72,7 +74,7 @@ public: QMediaPlatformPlayerInterface *createPlayerInterface() override; QGstreamerDeviceManager *m_manager = nullptr; - QMediaPlatformFormatInfo *m_formatsInfo = nullptr; + QGstreamerFormatsInfo *m_formatsInfo = nullptr; }; QT_END_NAMESPACE diff --git a/src/multimedia/qmediaformat.cpp b/src/multimedia/qmediaformat.cpp index 43bd38d4b..0a5e9a27f 100644 --- a/src/multimedia/qmediaformat.cpp +++ b/src/multimedia/qmediaformat.cpp @@ -67,6 +67,11 @@ constexpr bool audioSupportMatrix[QMediaFormat::FileFormat::LastFileFormat + 1][ { false, false, false, false, false, false, false, false, false, true }, // WindowsMediaAudio }; +inline bool formatSupportsCodec(QMediaFormat::FileFormat format, QMediaFormat::AudioCodec codec) +{ + return audioSupportMatrix[format][(int)codec]; +} + // info from https://en.wikipedia.org/wiki/Comparison_of_video_container_formats constexpr bool videoSupportMatrix[QMediaFormat::FileFormat::LastFileFormat + 1][(int)QMediaFormat::VideoCodec::LastVideoCodec + 1] = { @@ -89,6 +94,36 @@ constexpr bool videoSupportMatrix[QMediaFormat::FileFormat::LastFileFormat + 1][ { false, false, false, false, false, false, false, false, false, false }, // WindowsMediaAudio }; +inline bool formatSupportsCodec(QMediaFormat::FileFormat format, QMediaFormat::VideoCodec codec) +{ + return videoSupportMatrix[format][(int)codec]; +} + + +constexpr QMediaFormat::FileFormat videoFormatPriorityList[] = +{ + QMediaFormat::MPEG4, + QMediaFormat::QuickTime, + QMediaFormat::AVI, + QMediaFormat::WebM, + QMediaFormat::ASF, + QMediaFormat::Matroska, + QMediaFormat::Ogg, + QMediaFormat::UnspecifiedFormat +}; + +constexpr QMediaFormat::FileFormat audioFormatPriorityList[] = +{ + QMediaFormat::AAC, + QMediaFormat::MP3, + QMediaFormat::Mpeg4Audio, + QMediaFormat::Opus, + QMediaFormat::FLAC, + QMediaFormat::WindowsMediaAudio, + QMediaFormat::Wave, + QMediaFormat::UnspecifiedFormat +}; + constexpr QMediaFormat::AudioCodec audioPriorityList[] = { QMediaFormat::AudioCodec::AAC, @@ -101,7 +136,7 @@ constexpr QMediaFormat::AudioCodec audioPriorityList[] = QMediaFormat::AudioCodec::FLAC, QMediaFormat::AudioCodec::Vorbis, QMediaFormat::AudioCodec::Wave, - QMediaFormat::AudioCodec::Invalid + QMediaFormat::AudioCodec::Unspecified }; constexpr QMediaFormat::VideoCodec videoPriorityList[] = @@ -120,6 +155,84 @@ constexpr QMediaFormat::VideoCodec videoPriorityList[] = } +void QMediaFormatPrivate::resolveForEncoding(QMediaFormat *f, bool audioOnly) +{ + auto supportedFormats = QMediaEncoderInfo::supportedFileFormats(); + auto supportedAudioCodecs = QMediaEncoderInfo::supportedAudioCodecs(); + auto supportedVideoCodecs = QMediaEncoderInfo::supportedVideoCodecs(); + + auto bestSupportedFileFormat = [&](QMediaFormat::AudioCodec audio = QMediaFormat::AudioCodec::Unspecified, + QMediaFormat::VideoCodec video = QMediaFormat::VideoCodec::Unspecified) + { + auto *list = audioOnly ? audioFormatPriorityList : videoFormatPriorityList; + while (*list != QMediaFormat::UnspecifiedFormat) { + if (supportedFormats.contains(*list)) { + if ((audio == QMediaFormat::AudioCodec::Unspecified || formatSupportsCodec(f->fmt, audio)) && + (video == QMediaFormat::VideoCodec::Unspecified || formatSupportsCodec(f->fmt, video))) + break; + } + ++list; + } + return *list; + }; + + // reset non supported formats and codecs + if (!supportedFormats.contains(f->fmt)) + f->fmt = QMediaFormat::UnspecifiedFormat; + if (!supportedAudioCodecs.contains(f->audio)) + f->audio = QMediaFormat::AudioCodec::Unspecified; + if (audioOnly || !supportedVideoCodecs.contains(f->video)) + f->video = QMediaFormat::VideoCodec::Unspecified; + + // try finding a file format that is supported + if (f->fmt == QMediaFormat::UnspecifiedFormat) + f->fmt = bestSupportedFileFormat(f->audio, f->video); + // try without the audio codec + if (f->fmt == QMediaFormat::UnspecifiedFormat) + f->fmt = bestSupportedFileFormat(QMediaFormat::AudioCodec::Unspecified, f->video); + // try without the video codec + if (f->fmt == QMediaFormat::UnspecifiedFormat) + f->fmt = bestSupportedFileFormat(f->audio); + // give me a format that's supported + if (f->fmt == QMediaFormat::UnspecifiedFormat) + f->fmt = bestSupportedFileFormat(); + // still nothing? Give up + if (f->fmt == QMediaFormat::UnspecifiedFormat) + return; + + // now that we have a format, reset codecs that won't work + if (f->audio != QMediaFormat::AudioCodec::Unspecified) { + if (!formatSupportsCodec(f->fmt, f->audio) || !supportedAudioCodecs.contains(f->audio)) + f->audio = QMediaFormat::AudioCodec::Unspecified; + } + if (f->video != QMediaFormat::VideoCodec::Unspecified) { + if (!formatSupportsCodec(f->fmt, f->video) || !supportedVideoCodecs.contains(f->video)) + f->video = QMediaFormat::VideoCodec::Unspecified; + } + + // find a matching audio format + if (f->audio == QMediaFormat::AudioCodec::Unspecified) { + auto *list = audioPriorityList; + while (*list != QMediaFormat::AudioCodec::Unspecified) { + if (supportedAudioCodecs.contains(*list) && formatSupportsCodec(f->fmt, *list)) + break; + ++list; + } + f->audio = *list; + } + + // find a matching video format + if (!audioOnly && f->video == QMediaFormat::VideoCodec::Unspecified) { + auto *list = videoPriorityList; + while (*list != QMediaFormat::VideoCodec::Unspecified) { + if (supportedVideoCodecs.contains(*list) && formatSupportsCodec(f->fmt, *list)) + break; + ++list; + } + f->video = *list; + } +} + /*! \enum QMediaFormat::FileFormat Describes the container format used in a multimedia file or stream. @@ -148,21 +261,6 @@ QMediaFormat::QMediaFormat(FileFormat format) : fmt(format) { Q_UNUSED(d); - const QMediaFormat::VideoCodec *v = videoPriorityList; - while (*v != QMediaFormat::VideoCodec::Invalid) { - if (videoSupportMatrix[fmt][(int)*v]) - break; - ++v; - } - video = *v; - - const QMediaFormat::AudioCodec *a = audioPriorityList; - while (*a != QMediaFormat::AudioCodec::Invalid) { - if (videoSupportMatrix[fmt][(int)*a]) - break; - ++a; - } - audio = *a; } QMediaFormat::~QMediaFormat() = default; @@ -240,13 +338,13 @@ bool QMediaFormat::canDecode() const { if (!QMediaDecoderInfo::supportedFileFormats().contains(fmt)) return false; - if (audio == QMediaFormat::AudioCodec::Invalid && video == QMediaFormat::VideoCodec::Invalid) + if (audio == QMediaFormat::AudioCodec::Unspecified && video == QMediaFormat::VideoCodec::Unspecified) return false; - if (audio != QMediaFormat::AudioCodec::Invalid) { + if (audio != QMediaFormat::AudioCodec::Unspecified) { if (!QMediaDecoderInfo::supportedAudioCodecs().contains(audio)) return false; } - if (video != QMediaFormat::VideoCodec::Invalid) { + if (video != QMediaFormat::VideoCodec::Unspecified) { if (!QMediaDecoderInfo::supportedVideoCodecs().contains(video)) return false; } @@ -262,13 +360,13 @@ bool QMediaFormat::canEncode() const { if (!QMediaEncoderInfo::supportedFileFormats().contains(fmt)) return false; - if (audio == QMediaFormat::AudioCodec::Invalid && video == QMediaFormat::VideoCodec::Invalid) + if (audio == QMediaFormat::AudioCodec::Unspecified && video == QMediaFormat::VideoCodec::Unspecified) return false; - if (audio != QMediaFormat::AudioCodec::Invalid) { + if (audio != QMediaFormat::AudioCodec::Unspecified) { if (!QMediaEncoderInfo::supportedAudioCodecs().contains(audio)) return false; } - if (video != QMediaFormat::VideoCodec::Invalid) { + if (video != QMediaFormat::VideoCodec::Unspecified) { if (!QMediaEncoderInfo::supportedVideoCodecs().contains(video)) return false; } @@ -344,6 +442,7 @@ QString QMediaFormat::videoCodecName(QMediaFormat::VideoCodec c) QString QMediaFormat::fileFormatDescription(QMediaFormat::FileFormat c) { constexpr const char *descriptions[] = { + "Unspecified File Format", "Windows Media Format (ASF)", "Audio Video Interleave (AVI)", "Matroska Multimedia Container", @@ -360,13 +459,13 @@ QString QMediaFormat::fileFormatDescription(QMediaFormat::FileFormat c) "Wave File", "Windows Media Audio", }; - return QString::fromUtf8(descriptions[int(c)]); + return QString::fromUtf8(descriptions[int(c) + 1]); } QString QMediaFormat::audioCodecDescription(QMediaFormat::AudioCodec c) { constexpr const char *descriptions[] = { - "Invalid Audio Codec", + "Unspecified Audio Codec", "MP3", "Advanced Audio Codec (AAC)", "Dolby Digital (AC3)", @@ -384,7 +483,7 @@ QString QMediaFormat::audioCodecDescription(QMediaFormat::AudioCodec c) QString QMediaFormat::videoCodecDescription(QMediaFormat::VideoCodec c) { constexpr const char *descriptions[] = { - "Invalid", + "Unspecified Video Codec", "MPEG-1 Video", "MPEG-2 Video", "MPEG-4 Video", diff --git a/src/multimedia/qmediaformat.h b/src/multimedia/qmediaformat.h index baf4d90eb..69e795545 100644 --- a/src/multimedia/qmediaformat.h +++ b/src/multimedia/qmediaformat.h @@ -46,11 +46,19 @@ QT_BEGIN_NAMESPACE -class QMediaFormatPrivate; +class QMediaFormat; +class QMediaEncoderSettings; +class QMediaFormatPrivate +{ + friend class QMediaEncoderSettings; + static void resolveForEncoding(QMediaFormat *fmt, bool audioOnly); +}; + class Q_MULTIMEDIA_EXPORT QMediaFormat { public: enum FileFormat { + UnspecifiedFormat = -1, // Video Formats ASF, AVI, @@ -71,7 +79,7 @@ public: }; enum class AudioCodec { - Invalid = -1, + Unspecified = -1, MP3, AAC, AC3, @@ -86,7 +94,7 @@ public: }; enum class VideoCodec { - Invalid = -1, + Unspecified = -1, MPEG1, MPEG2, MPEG4, @@ -100,12 +108,13 @@ public: LastVideoCodec = MotionJPEG }; - QMediaFormat(FileFormat format); + QMediaFormat(FileFormat format = UnspecifiedFormat); ~QMediaFormat(); QMediaFormat(const QMediaFormat &other); QMediaFormat &operator=(const QMediaFormat &other); FileFormat format() const { return fmt; } + void setFormat(FileFormat f) { fmt = f; } bool setVideoCodec(VideoCodec codec); VideoCodec videoCodec() const { return video; } @@ -126,10 +135,11 @@ public: static QString audioCodecDescription(QMediaFormat::AudioCodec c); static QString videoCodecDescription(QMediaFormat::VideoCodec c); -private: +protected: + friend class QMediaFormatPrivate; FileFormat fmt; - AudioCodec audio = AudioCodec::Invalid; - VideoCodec video = VideoCodec::Invalid; + AudioCodec audio = AudioCodec::Unspecified; + VideoCodec video = VideoCodec::Unspecified; QMediaFormatPrivate *d = nullptr; }; diff --git a/src/multimedia/recording/qmediaencodersettings.cpp b/src/multimedia/recording/qmediaencodersettings.cpp index 13b7f0e06..1c0414b8d 100644 --- a/src/multimedia/recording/qmediaencodersettings.cpp +++ b/src/multimedia/recording/qmediaencodersettings.cpp @@ -38,485 +38,164 @@ ****************************************************************************/ #include "qmediaencodersettings.h" +#include "qmediaformat.h" QT_BEGIN_NAMESPACE -static void qRegisterEncoderSettingsMetaTypes() -{ - qRegisterMetaType<QAudioEncoderSettings>(); - qRegisterMetaType<QVideoEncoderSettings>(); - qRegisterMetaType<QImageEncoderSettings>(); -} - -Q_CONSTRUCTOR_FUNCTION(qRegisterEncoderSettingsMetaTypes) - - -class QAudioEncoderSettingsPrivate : public QSharedData -{ -public: - bool isNull = true; - QMultimedia::EncodingMode encodingMode = QMultimedia::ConstantQualityEncoding; - QString codec; - int bitrate = -1; - int sampleRate = -1; - int channels = -1; - QMultimedia::EncodingQuality quality = QMultimedia::NormalQuality; - QVariantMap encodingOptions; -}; - /*! - \class QAudioEncoderSettings + \class QMediaEncoderSettings - \brief The QAudioEncoderSettings class provides a set of audio encoder settings. + \brief The QMediaEncoderSettings class provides a settings to encode a media file. \inmodule QtMultimedia \ingroup multimedia \ingroup multimedia_recording - A audio encoder settings object is used to specify the audio encoder - settings used by QMediaRecorder. Audio encoder settings are selected by - constructing a QAudioEncoderSettings object, setting the desired properties - and then passing it to a QMediaRecorder instance using the - QMediaRecorder::setEncodingSettings() function. + A media encoder settings object is used to specify the encoder + settings used by QMediaRecorder. Settings are selected by + constructing a QMediaEncoderSettings object specifying an output file format, + setting the desired properties and then passing it to a QMediaRecorder instance + using the QMediaRecorder::setEncoderSettings() function. \snippet multimedia-snippets/media.cpp Audio encoder settings - \sa QMediaRecorder, QAudioEncoderSettingsControl + \sa QMediaRecorder */ -/*! - Construct a null audio encoder settings object. -*/ -QAudioEncoderSettings::QAudioEncoderSettings() - :d(new QAudioEncoderSettingsPrivate) +class QMediaEncoderSettingsPrivate : public QSharedData { -} +public: + bool isNull = true; + QMultimedia::EncodingMode encodingMode = QMultimedia::ConstantQualityEncoding; + QMultimedia::EncodingQuality quality = QMultimedia::NormalQuality; -/*! - Constructs a copy of the audio encoder settings object \a other. -*/ + int audioBitrate = -1; + int audioSampleRate = -1; + int audioChannels = -1; -QAudioEncoderSettings::QAudioEncoderSettings(const QAudioEncoderSettings& other) - :d(other.d) -{ -} + QSize videoResolution = QSize(-1, -1); + int videoFrameRate = -1; + int videoBitRate = -1; +}; /*! - Destroys an audio encoder settings object. + Creates andefault media encoder settings object. Qt will automatically try to + pick the best possible encoding for the content. */ - -QAudioEncoderSettings::~QAudioEncoderSettings() +QMediaEncoderSettings::QMediaEncoderSettings() + : QMediaEncoderSettings(QMediaFormat::UnspecifiedFormat) { } + /*! - Assigns the value of \a other to an audio encoder settings object. + Creates an audio encoder settings object with a given \a format. */ - -QAudioEncoderSettings& QAudioEncoderSettings::operator=(const QAudioEncoderSettings &other) +QMediaEncoderSettings::QMediaEncoderSettings(FileFormat format) + : QMediaFormat(format), + d(new QMediaEncoderSettingsPrivate) { - d = other.d; - return *this; + } /*! - Determines if \a other is of equal value to an audio encoder settings - object. - - Returns true if the settings objects are of equal value, and false if they - are not of equal value. + Creates a copy of the encoder settings object \a other. */ - -bool QAudioEncoderSettings::operator==(const QAudioEncoderSettings &other) const +QMediaEncoderSettings::QMediaEncoderSettings(const QMediaEncoderSettings &other) + : QMediaFormat(other), + d(other.d) { - return (d == other.d) || - (d->isNull == other.d->isNull && - d->encodingMode == other.d->encodingMode && - d->bitrate == other.d->bitrate && - d->sampleRate == other.d->sampleRate && - d->channels == other.d->channels && - d->quality == other.d->quality && - d->codec == other.d->codec && - d->encodingOptions == other.d->encodingOptions); } -/*! - Determines if \a other is of equal value to an audio encoder settings - object. - - Returns true if the settings objects are not of equal value, and true if - they are of equal value. -*/ - -bool QAudioEncoderSettings::operator!=(const QAudioEncoderSettings &other) const +QMediaEncoderSettings &QMediaEncoderSettings::operator=(const QMediaEncoderSettings &other) { - return !(*this == other); + QMediaFormat::operator=(other); + d = other.d; + return *this; } -/*! - Identifies if an audio settings object is initialized. - - Returns true if the settings object is null, and false if it is not. -*/ - -bool QAudioEncoderSettings::isNull() const +QMediaEncoderSettings::~QMediaEncoderSettings() { - return d->isNull; } /*! - Returns the audio encoding mode. + Returns the encoding mode. \sa QMultimedia::EncodingMode */ -QMultimedia::EncodingMode QAudioEncoderSettings::encodingMode() const +QMultimedia::EncodingMode QMediaEncoderSettings::encodingMode() const { return d->encodingMode; } /*! - Sets the audio encoding \a mode setting. + Sets the encoding \a mode setting. If QMultimedia::ConstantQualityEncoding is set, the quality - encoding parameter is used and bit rate is ignored, - otherwise the bitrate is used. - - The audio codec, channels count and sample rate settings are used in all - the encoding modes. + encoding parameter is used and bit rates are ignored, + otherwise the bitrates are used. \sa encodingMode(), QMultimedia::EncodingMode */ -void QAudioEncoderSettings::setEncodingMode(QMultimedia::EncodingMode mode) +void QMediaEncoderSettings::setEncodingMode(QMultimedia::EncodingMode mode) { d->encodingMode = mode; } -/*! - Returns the audio codec. -*/ -QString QAudioEncoderSettings::codec() const -{ - return d->codec; -} - -/*! - Sets the audio \a codec. -*/ -void QAudioEncoderSettings::setCodec(const QString& codec) -{ - d->isNull = false; - d->codec = codec; -} - -/*! - Returns the bit rate of the compressed audio stream in bits per second. -*/ -int QAudioEncoderSettings::bitRate() const -{ - return d->bitrate; -} - -/*! - Returns the number of audio channels. -*/ -int QAudioEncoderSettings::channelCount() const -{ - return d->channels; -} - -/*! - Sets the number of audio \a channels. - - A value of -1 indicates the encoder should make an optimal choice based on - what is available from the audio source and the limitations of the codec. -*/ -void QAudioEncoderSettings::setChannelCount(int channels) -{ - d->isNull = false; - d->channels = channels; -} - -/*! - Sets the audio bit \a rate in bits per second. -*/ -void QAudioEncoderSettings::setBitRate(int rate) -{ - d->isNull = false; - d->bitrate = rate; -} - -/*! - Returns the audio sample rate in Hz. -*/ -int QAudioEncoderSettings::sampleRate() const -{ - return d->sampleRate; -} - -/*! - Sets the audio sample \a rate in Hz. - - A value of -1 indicates the encoder should make an optimal choice based on what is avaialbe - from the audio source and the limitations of the codec. - */ -void QAudioEncoderSettings::setSampleRate(int rate) -{ - d->isNull = false; - d->sampleRate = rate; -} - -/*! - Returns the audio encoding quality. -*/ - -QMultimedia::EncodingQuality QAudioEncoderSettings::quality() const +QMultimedia::EncodingQuality QMediaEncoderSettings::quality() const { return d->quality; } -/*! - Set the audio encoding \a quality. - - Setting the audio quality parameter allows backend to choose the balanced - set of encoding parameters to achieve the desired quality level. - - The \a quality settings parameter is only used in the - \l {QMultimedia::ConstantQualityEncoding}{constant quality} \l{encodingMode()}{encoding mode}. -*/ -void QAudioEncoderSettings::setQuality(QMultimedia::EncodingQuality quality) +void QMediaEncoderSettings::setQuality(QMultimedia::EncodingQuality quality) { - d->isNull = false; d->quality = quality; } /*! - Returns the value of encoding \a option. + Resolves the format to a format that is supported by QMediaRecorder. - \sa setEncodingOption(), encodingOptions() -*/ -QVariant QAudioEncoderSettings::encodingOption(const QString &option) const + This method tries to find the best possible match for unspecified settings. + Settings that are not supported by the encoder will be modified to the closest + match that is supported. + */ +void QMediaEncoderSettings::resolveFormat(QMediaEncoderSettings::ResolveMode mode) { - return d->encodingOptions.value(option); + QMediaFormatPrivate::resolveForEncoding(this, mode == AudioOnly); } /*! - Returns the all the encoding options as QVariantMap. - - \sa encodingOption(), setEncodingOptions() -*/ -QVariantMap QAudioEncoderSettings::encodingOptions() const -{ - return d->encodingOptions; -} - -/*! - Set the encoding \a option to \a value. - - The supported set and meaning of encoding options are - system and selected codec specific. - - \sa encodingOption(), setEncodingOptions() -*/ -void QAudioEncoderSettings::setEncodingOption(const QString &option, const QVariant &value) -{ - d->isNull = false; - if (value.isNull()) - d->encodingOptions.remove(option); - else - d->encodingOptions.insert(option, value); -} - -/*! - Replace all the encoding options with \a options. - - The supported set and meaning of encoding options are - system and selected codec specific. - - \sa encodingOption(), setEncodingOption() -*/ -void QAudioEncoderSettings::setEncodingOptions(const QVariantMap &options) -{ - d->isNull = false; - d->encodingOptions = options; -} - -class QVideoEncoderSettingsPrivate : public QSharedData -{ -public: - bool isNull = true; - QMultimedia::EncodingMode encodingMode = QMultimedia::ConstantQualityEncoding; - QString codec; - int bitrate = -1; - QSize resolution; - qreal frameRate = 0; - QMultimedia::EncodingQuality quality = QMultimedia::NormalQuality; - QVariantMap encodingOptions; -}; - -/*! - \class QVideoEncoderSettings - - \brief The QVideoEncoderSettings class provides a set of video encoder settings. - - \inmodule QtMultimedia - \ingroup multimedia - \ingroup multimedia_recording - - A video encoder settings object is used to specify the video encoder - settings used by QMediaRecorder. Video encoder settings are selected by - constructing a QVideoEncoderSettings object, setting the desired properties - and then passing it to a QMediaRecorder instance using the - QMediaRecorder::setEncodingSettings() function. - - \snippet multimedia-snippets/media.cpp Video encoder settings - - \sa QMediaRecorder, QVideoEncoderSettingsControl -*/ - -/*! - Constructs a null video encoder settings object. -*/ - -QVideoEncoderSettings::QVideoEncoderSettings() - :d(new QVideoEncoderSettingsPrivate) -{ -} - -/*! - Constructs a copy of the video encoder settings object \a other. -*/ - -QVideoEncoderSettings::QVideoEncoderSettings(const QVideoEncoderSettings& other) - :d(other.d) -{ -} - -/*! - Destroys a video encoder settings object. -*/ - -QVideoEncoderSettings::~QVideoEncoderSettings() -{ -} - -/*! - Assigns the value of \a other to a video encoder settings object. -*/ -QVideoEncoderSettings &QVideoEncoderSettings::operator=(const QVideoEncoderSettings &other) -{ - d = other.d; - return *this; -} - -/*! - Determines if \a other is of equal value to a video encoder settings object. - - Returns true if the settings objects are of equal value, and false if they - are not of equal value. -*/ -bool QVideoEncoderSettings::operator==(const QVideoEncoderSettings &other) const -{ - return (d == other.d) || - (d->isNull == other.d->isNull && - d->encodingMode == other.d->encodingMode && - d->bitrate == other.d->bitrate && - d->quality == other.d->quality && - d->codec == other.d->codec && - d->resolution == other.d->resolution && - qFuzzyCompare(d->frameRate, other.d->frameRate) && - d->encodingOptions == other.d->encodingOptions); -} - -/*! - Determines if \a other is of equal value to a video encoder settings object. - - Returns true if the settings objects are not of equal value, and false if - they are of equal value. -*/ -bool QVideoEncoderSettings::operator!=(const QVideoEncoderSettings &other) const -{ - return !(*this == other); -} - -/*! - Identifies if a video encoder settings object is uninitalized. - - Returns true if the settings are null, and false if they are not. + Returns the resolution of the encoded video. */ -bool QVideoEncoderSettings::isNull() const +QSize QMediaEncoderSettings::videoResolution() const { - return d->isNull; + return d->videoResolution; } /*! - Returns the video encoding mode. - - \sa QMultimedia::EncodingMode -*/ -QMultimedia::EncodingMode QVideoEncoderSettings::encodingMode() const -{ - return d->encodingMode; -} - -/*! - Sets the video encoding \a mode. - - If QMultimedia::ConstantQualityEncoding is set, - the quality encoding parameter is used and bit rate is ignored, - otherwise the bitrate is used. - - The rest of encoding settings are respected regardless of encoding mode. - - \sa QMultimedia::EncodingMode -*/ -void QVideoEncoderSettings::setEncodingMode(QMultimedia::EncodingMode mode) -{ - d->isNull = false; - d->encodingMode = mode; -} + Sets the \a resolution of the encoded video. -/*! - Returns the video codec. + An empty QSize indicates the encoder should make an optimal choice based on + what is available from the video source and the limitations of the codec. */ - -QString QVideoEncoderSettings::codec() const +void QMediaEncoderSettings::setVideoResolution(const QSize &size) { - return d->codec; + d->videoResolution = size; } -/*! - Sets the video \a codec. -*/ -void QVideoEncoderSettings::setCodec(const QString& codec) -{ - d->isNull = false; - d->codec = codec; -} +/*! \fn void QMediaEncoderSettings::setVideoResolution(int width, int height) -/*! - Returns bit rate of the encoded video stream in bits per second. -*/ -int QVideoEncoderSettings::bitRate() const -{ - return d->bitrate; -} + Sets the \a width and \a height of the resolution of the encoded video. -/*! - Sets the bit rate of the encoded video stream to \a value. + \overload */ -void QVideoEncoderSettings::setBitRate(int value) -{ - d->isNull = false; - d->bitrate = value; -} - /*! Returns the video frame rate. */ -qreal QVideoEncoderSettings::frameRate() const +qreal QMediaEncoderSettings::videoFrameRate() const { - return d->frameRate; + return d->videoFrameRate; } /*! @@ -527,125 +206,94 @@ qreal QVideoEncoderSettings::frameRate() const A value of 0 indicates the encoder should make an optimal choice based on what is available from the video source and the limitations of the codec. */ - -void QVideoEncoderSettings::setFrameRate(qreal rate) +void QMediaEncoderSettings::setVideoFrameRate(qreal rate) { - d->isNull = false; - d->frameRate = rate; + d->videoFrameRate = rate; } /*! - Returns the resolution of the encoded video. + Returns the bit rate of the compressed video stream in bits per second. */ - -QSize QVideoEncoderSettings::resolution() const +int QMediaEncoderSettings::videoBitRate() const { - return d->resolution; + return d->videoBitRate; } /*! - Sets the \a resolution of the encoded video. - - An empty QSize indicates the encoder should make an optimal choice based on - what is available from the video source and the limitations of the codec. + Sets the video bit \a rate in bits per second. */ - -void QVideoEncoderSettings::setResolution(const QSize &resolution) +void QMediaEncoderSettings::setVideoBitRate(int bitrate) { - d->isNull = false; - d->resolution = resolution; + d->videoBitRate = bitrate; } /*! - Sets the \a width and \a height of the resolution of the encoded video. - - \overload + Returns the bit rate of the compressed audio stream in bits per second. */ - -void QVideoEncoderSettings::setResolution(int width, int height) +int QMediaEncoderSettings::audioBitRate() const { - d->isNull = false; - d->resolution = QSize(width, height); + return d->audioBitrate; } /*! - Returns the video encoding quality. + Sets the audio bit \a rate in bits per second. */ - -QMultimedia::EncodingQuality QVideoEncoderSettings::quality() const +void QMediaEncoderSettings::setAudioBitRate(int bitrate) { - return d->quality; + d->audioBitrate = bitrate; } /*! - Sets the video encoding \a quality. - - Setting the video quality parameter allows backend to choose the balanced - set of encoding parameters to achieve the desired quality level. - - The \a quality settings parameter is only used in the - \l {QMultimedia::ConstantQualityEncoding}{constant quality} \l{encodingMode()}{encoding mode}. - The \a quality settings parameter is only used in the \l - {QMultimedia::ConstantQualityEncoding}{constant quality} - \l{encodingMode()}{encoding mode}. + Returns the number of audio channels. */ - -void QVideoEncoderSettings::setQuality(QMultimedia::EncodingQuality quality) +int QMediaEncoderSettings::audioChannelCount() const { - d->isNull = false; - d->quality = quality; + return d->audioChannels; } /*! - Returns the value of encoding \a option. + Sets the number of audio \a channels. - \sa setEncodingOption(), encodingOptions() + A value of -1 indicates the encoder should make an optimal choice based on + what is available from the audio source and the limitations of the codec. */ -QVariant QVideoEncoderSettings::encodingOption(const QString &option) const +void QMediaEncoderSettings::setAudioChannelCount(int channels) { - return d->encodingOptions.value(option); + d->audioChannels = channels; } /*! - Returns the all the encoding options as QVariantMap. - - \sa encodingOption(), setEncodingOptions() + Returns the audio sample rate in Hz. */ -QVariantMap QVideoEncoderSettings::encodingOptions() const +int QMediaEncoderSettings::audioSampleRate() const { - return d->encodingOptions; + return d->audioSampleRate; } /*! - Set the encoding \a option \a value. - - The supported set and meaning of encoding options are - system and selected codec specific. + Sets the audio sample \a rate in Hz. - \sa encodingOption(), setEncodingOptions() + A value of -1 indicates the encoder should make an optimal choice based on what is avaialbe + from the audio source and the limitations of the codec. */ -void QVideoEncoderSettings::setEncodingOption(const QString &option, const QVariant &value) +void QMediaEncoderSettings::setAudioSampleRate(int rate) { - d->isNull = false; - if (value.isNull()) - d->encodingOptions.remove(option); - else - d->encodingOptions.insert(option, value); + d->audioSampleRate = rate; } -/*! - Replace all the encoding options with \a options. - - The supported set and meaning of encoding options are - system and selected codec specific. - \sa encodingOption(), setEncodingOption() -*/ -void QVideoEncoderSettings::setEncodingOptions(const QVariantMap &options) +class QAudioEncoderSettingsPrivate : public QSharedData { - d->isNull = false; - d->encodingOptions = options; -} +public: + bool isNull = true; + QMultimedia::EncodingMode encodingMode = QMultimedia::ConstantQualityEncoding; + QString codec; + int bitrate = -1; + int sampleRate = -1; + int channels = -1; + QMultimedia::EncodingQuality quality = QMultimedia::NormalQuality; + QVariantMap encodingOptions; +}; class QImageEncoderSettingsPrivate : public QSharedData @@ -879,9 +527,3 @@ void QImageEncoderSettings::setEncodingOptions(const QVariantMap &options) QT_END_NAMESPACE - - -QMediaEncoderSettings::QMediaEncoderSettings() -{ - -} diff --git a/src/multimedia/recording/qmediaencodersettings.h b/src/multimedia/recording/qmediaencodersettings.h index 3bf57d70c..673c6f3a4 100644 --- a/src/multimedia/recording/qmediaencodersettings.h +++ b/src/multimedia/recording/qmediaencodersettings.h @@ -46,114 +46,36 @@ #include <QtCore/qvariant.h> #include <QtMultimedia/qtmultimediaglobal.h> #include <QtMultimedia/qmultimedia.h> +#include <QtMultimedia/qmediaformat.h> QT_BEGIN_NAMESPACE - - -class QAudioEncoderSettingsPrivate; -class Q_MULTIMEDIA_EXPORT QAudioEncoderSettings -{ -public: - QAudioEncoderSettings(); - QAudioEncoderSettings(const QAudioEncoderSettings& other); - - ~QAudioEncoderSettings(); - - QAudioEncoderSettings& operator=(const QAudioEncoderSettings &other); - bool operator==(const QAudioEncoderSettings &other) const; - bool operator!=(const QAudioEncoderSettings &other) const; - - bool isNull() const; - - QMultimedia::EncodingMode encodingMode() const; - void setEncodingMode(QMultimedia::EncodingMode); - - QString codec() const; - void setCodec(const QString& codec); - - int bitRate() const; - void setBitRate(int bitrate); - - int channelCount() const; - void setChannelCount(int channels); - - int sampleRate() const; - void setSampleRate(int rate); - - QMultimedia::EncodingQuality quality() const; - void setQuality(QMultimedia::EncodingQuality quality); - - QVariant encodingOption(const QString &option) const; - QVariantMap encodingOptions() const; - void setEncodingOption(const QString &option, const QVariant &value); - void setEncodingOptions(const QVariantMap &options); - -private: - QSharedDataPointer<QAudioEncoderSettingsPrivate> d; -}; - -class QVideoEncoderSettingsPrivate; -class Q_MULTIMEDIA_EXPORT QVideoEncoderSettings +class QMediaEncoderSettingsPrivate; +class Q_MULTIMEDIA_EXPORT QMediaEncoderSettings : public QMediaFormat { public: - QVideoEncoderSettings(); - QVideoEncoderSettings(const QVideoEncoderSettings& other); - - ~QVideoEncoderSettings(); - - QVideoEncoderSettings& operator=(const QVideoEncoderSettings &other); - bool operator==(const QVideoEncoderSettings &other) const; - bool operator!=(const QVideoEncoderSettings &other) const; - - bool isNull() const; + QMediaEncoderSettings(); + QMediaEncoderSettings(FileFormat format); + QMediaEncoderSettings(const QMediaEncoderSettings& other); + QMediaEncoderSettings& operator=(const QMediaEncoderSettings &other); + ~QMediaEncoderSettings(); QMultimedia::EncodingMode encodingMode() const; void setEncodingMode(QMultimedia::EncodingMode); - QString codec() const; - void setCodec(const QString &); - - QSize resolution() const; - void setResolution(const QSize &); - void setResolution(int width, int height); - - qreal frameRate() const; - void setFrameRate(qreal rate); - - int bitRate() const; - void setBitRate(int bitrate); - QMultimedia::EncodingQuality quality() const; void setQuality(QMultimedia::EncodingQuality quality); - QVariant encodingOption(const QString &option) const; - QVariantMap encodingOptions() const; - void setEncodingOption(const QString &option, const QVariant &value); - void setEncodingOptions(const QVariantMap &options); - -private: - QSharedDataPointer<QVideoEncoderSettingsPrivate> d; -}; - -class QMediaFormat; -class Q_MULTIMEDIA_EXPORT QMediaEncoderSettings -{ - - QMediaEncoderSettings(); - - QMediaFormat format(); - void setMediaFormat(const QMediaFormat &); - - QMultimedia::EncodingMode encodingMode() const; - void setEncodingMode(QMultimedia::EncodingMode); + enum ResolveMode { + AudioOnly, + AudioAndVideo + }; - QMultimedia::EncodingQuality quality() const; - void setQuality(QMultimedia::EncodingQuality quality); + void resolveFormat(ResolveMode mode = AudioAndVideo); QSize videoResolution() const; void setVideoResolution(const QSize &); - void setVideoResolution(int width, int height); + void setVideoResolution(int width, int height) { setVideoResolution(QSize(width, height)); } qreal videoFrameRate() const; void setVideoFrameRate(qreal rate); @@ -166,6 +88,12 @@ class Q_MULTIMEDIA_EXPORT QMediaEncoderSettings int audioChannelCount() const; void setAudioChannelCount(int channels); + + int audioSampleRate() const; + void setAudioSampleRate(int rate); + +private: + QSharedDataPointer<QMediaEncoderSettingsPrivate> d; }; class QImageEncoderSettingsPrivate; @@ -204,9 +132,4 @@ private: QT_END_NAMESPACE -Q_DECLARE_METATYPE(QAudioEncoderSettings) -Q_DECLARE_METATYPE(QVideoEncoderSettings) -Q_DECLARE_METATYPE(QImageEncoderSettings) - - #endif diff --git a/src/multimedia/recording/qmediarecorder.cpp b/src/multimedia/recording/qmediarecorder.cpp index e9e5b4660..d2ac3d1a0 100644 --- a/src/multimedia/recording/qmediarecorder.cpp +++ b/src/multimedia/recording/qmediarecorder.cpp @@ -44,10 +44,7 @@ #include "qmediasource_p.h" #include <qmediaservice.h> #include <qmetadatawritercontrol.h> -#include <qaudioencodersettingscontrol.h> -#include <qvideoencodersettingscontrol.h> #include <qaudiodeviceinfo.h> -#include <qmediacontainercontrol.h> #include <qcamera.h> #include <qcameracontrol.h> #include <private/qmediaplatformintegration_p.h> @@ -121,9 +118,6 @@ void QMediaRecorderPrivate::_q_serviceDestroyed() { mediaSource = nullptr; control = nullptr; - formatControl = nullptr; - audioControl = nullptr; - videoControl = nullptr; metaDataControl = nullptr; settingsChanged = true; } @@ -298,12 +292,6 @@ bool QMediaRecorder::setMediaSource(QMediaSource *object) if (d->control) service->releaseControl(d->control); - if (d->formatControl) - service->releaseControl(d->formatControl); - if (d->audioControl) - service->releaseControl(d->audioControl); - if (d->videoControl) - service->releaseControl(d->videoControl); if (d->metaDataControl) { disconnect(d->metaDataControl, SIGNAL(metaDataChanged()), this, SIGNAL(metaDataChanged())); @@ -320,9 +308,6 @@ bool QMediaRecorder::setMediaSource(QMediaSource *object) } d->control = nullptr; - d->formatControl = nullptr; - d->audioControl = nullptr; - d->videoControl = nullptr; d->metaDataControl = nullptr; d->mediaSource = object; @@ -337,10 +322,6 @@ bool QMediaRecorder::setMediaSource(QMediaSource *object) d->control = qobject_cast<QMediaRecorderControl*>(service->requestControl(QMediaRecorderControl_iid)); if (d->control) { - d->formatControl = qobject_cast<QMediaContainerControl *>(service->requestControl(QMediaContainerControl_iid)); - d->audioControl = qobject_cast<QAudioEncoderSettingsControl *>(service->requestControl(QAudioEncoderSettingsControl_iid)); - d->videoControl = qobject_cast<QVideoEncoderSettingsControl *>(service->requestControl(QVideoEncoderSettingsControl_iid)); - QObject *control = service->requestControl(QMetaDataWriterControl_iid); if (control) { d->metaDataControl = qobject_cast<QMetaDataWriterControl *>(control); @@ -552,311 +533,42 @@ qreal QMediaRecorder::volume() const return d_func()->control ? d_func()->control->volume() : 1.0; } - -void QMediaRecorder::setVolume(qreal volume) -{ - Q_D(QMediaRecorder); - - if (d->control) { - volume = qMax(qreal(0.0), volume); - d->control->setVolume(volume); - } -} - -/*! - Returns a list of supported container formats. -*/ -QStringList QMediaRecorder::supportedContainers() const -{ - return d_func()->formatControl ? - d_func()->formatControl->supportedContainers() : QStringList(); -} - -/*! - Returns a description of a container \a format. -*/ -QString QMediaRecorder::containerDescription(const QString &format) const -{ - return d_func()->formatControl ? - d_func()->formatControl->containerDescription(format) : QString(); -} - -/*! - Returns the selected container format. -*/ - -QString QMediaRecorder::containerFormat() const -{ - return d_func()->formatControl ? - d_func()->formatControl->containerFormat() : QString(); -} - -/*! - Returns a list of supported audio codecs. -*/ -QStringList QMediaRecorder::supportedAudioCodecs() const -{ - return d_func()->audioControl ? - d_func()->audioControl->supportedAudioCodecs() : QStringList(); -} - -/*! - Returns a description of an audio \a codec. -*/ -QString QMediaRecorder::audioCodecDescription(const QString &codec) const -{ - return d_func()->audioControl ? - d_func()->audioControl->codecDescription(codec) : QString(); -} - -/*! - Returns a list of supported audio sample rates. - - If non null audio \a settings parameter is passed, the returned list is - reduced to sample rates supported with partial settings applied. - - This can be used to query the list of sample rates, supported by specific - audio codec. - - If the encoder supports arbitrary sample rates within the supported rates - range, *\a continuous is set to true, otherwise *\a continuous is set to - false. -*/ - -QList<int> QMediaRecorder::supportedAudioSampleRates(const QAudioEncoderSettings &settings, bool *continuous) const -{ - if (continuous) - *continuous = false; - - return d_func()->audioControl ? - d_func()->audioControl->supportedSampleRates(settings, continuous) : QList<int>(); -} - -/*! - Returns a list of resolutions video can be encoded at. - - If non null video \a settings parameter is passed, the returned list is - reduced to resolution supported with partial settings like video codec or - framerate applied. - - If the encoder supports arbitrary resolutions within the supported range, - *\a continuous is set to true, otherwise *\a continuous is set to false. - - \sa QVideoEncoderSettings::resolution() -*/ -QList<QSize> QMediaRecorder::supportedResolutions(const QVideoEncoderSettings &, bool *continuous) const -{ - if (continuous) - *continuous = true; - - QCamera *camera = qobject_cast<QCamera *>(mediaSource()); - if (!camera) - return {}; - - QCameraInfo info = camera->cameraInfo(); - const auto formats = info.videoFormats(); - QList<QSize> resolutions; - for (const auto &f : formats) - resolutions.append(f.resolution()); - return resolutions; -} - -/*! - Returns a list of frame rates video can be encoded at. - - If non null video \a settings parameter is passed, the returned list is - reduced to frame rates supported with partial settings like video codec or - resolution applied. - - If the encoder supports arbitrary frame rates within the supported range, - *\a continuous is set to true, otherwise *\a continuous is set to false. - - \sa QVideoEncoderSettings::frameRate() -*/ -QList<qreal> QMediaRecorder::supportedFrameRates(const QVideoEncoderSettings &settings, bool *continuous) const -{ - if (continuous) - *continuous = true; - - QSize resolution = settings.resolution(); - - QCamera *camera = qobject_cast<QCamera *>(mediaSource()); - if (!camera) - return {}; - - QCameraInfo info = camera->cameraInfo(); - const auto formats = info.videoFormats(); - qreal min = 0.; - qreal max = 1.e6; - for (const auto &f : formats) { - QSize formatResolution = f.resolution(); - if (formatResolution.width() >= resolution.width() || formatResolution.height() >= resolution.height()) { - // we can downsample, framerates are usable - min = qMin(min, f.minFrameRate()); - max = qMax(max, f.maxFrameRate()); - } - } - - if (min == 0.) - return {}; - - return QList<qreal>() << min << max; -} - -/*! - Returns a list of supported video codecs. -*/ -QStringList QMediaRecorder::supportedVideoCodecs() const -{ - return d_func()->videoControl ? - d_func()->videoControl->supportedVideoCodecs() : QStringList(); -} - -/*! - Returns a description of a video \a codec. - - \sa setEncodingSettings() -*/ -QString QMediaRecorder::videoCodecDescription(const QString &codec) const -{ - return d_func()->videoControl ? - d_func()->videoControl->videoCodecDescription(codec) : QString(); -} - /*! - Returns the audio encoder settings being used. + Sets the encoder settings to \a settings. - \sa setEncodingSettings() + \sa QMediaEncoderSettings */ - -QAudioEncoderSettings QMediaRecorder::audioSettings() const -{ - return d_func()->audioControl ? - d_func()->audioControl->audioSettings() : QAudioEncoderSettings(); -} - -/*! - Returns the video encoder settings being used. - - \sa setEncodingSettings() -*/ - -QVideoEncoderSettings QMediaRecorder::videoSettings() const -{ - return d_func()->videoControl ? - d_func()->videoControl->videoSettings() : QVideoEncoderSettings(); -} - -/*! - Sets the audio encoder \a settings. - - If some parameters are not specified, or null settings are passed, the - encoder will choose default encoding parameters, depending on media - source properties. - - It's only possible to change settings when the encoder is in the - QMediaEncoder::StoppedState state. - - \sa audioSettings(), videoSettings(), containerFormat() -*/ - -void QMediaRecorder::setAudioSettings(const QAudioEncoderSettings &settings) +void QMediaRecorder::setEncoderSettings(const QMediaEncoderSettings &settings) { Q_D(QMediaRecorder); - //restart camera if it can't apply new settings in the Active state - d->restartCamera(); - - if (d->audioControl) { - d->audioControl->setAudioSettings(settings); - d->applySettingsLater(); - } + d->encoderSettings = settings; + d->control->setEncoderSettings(settings); + d->applySettingsLater(); } /*! - Sets the video encoder \a settings. - - If some parameters are not specified, or null settings are passed, the - encoder will choose default encoding parameters, depending on media - source properties. + Returns the current encoder settings. - It's only possible to change settings when the encoder is in the - QMediaEncoder::StoppedState state. - - \sa audioSettings(), videoSettings(), containerFormat() + \sa QMediaEncoderSettings */ - -void QMediaRecorder::setVideoSettings(const QVideoEncoderSettings &settings) +QMediaEncoderSettings QMediaRecorder::encoderSettings() const { - Q_D(QMediaRecorder); - - d->restartCamera(); - - if (d->videoControl) { - d->videoControl->setVideoSettings(settings); - d->applySettingsLater(); - } + return d_func()->encoderSettings; } -/*! - Sets the media \a container format. - - If the container format is not specified, the - encoder will choose format, depending on media source properties - and encoding settings selected. - - It's only possible to change settings when the encoder is in the - QMediaEncoder::StoppedState state. - \sa audioSettings(), videoSettings(), containerFormat() -*/ - -void QMediaRecorder::setContainerFormat(const QString &container) +void QMediaRecorder::setVolume(qreal volume) { Q_D(QMediaRecorder); - d->restartCamera(); - - if (d->formatControl) { - d->formatControl->setContainerFormat(container); - d->applySettingsLater(); + if (d->control) { + volume = qMax(qreal(0.0), volume); + d->control->setVolume(volume); } } /*! - Sets the \a audio and \a video encoder settings and \a container format. - - If some parameters are not specified, or null settings are passed, the - encoder will choose default encoding parameters, depending on media - source properties. - - It's only possible to change settings when the encoder is in the - QMediaEncoder::StoppedState state. - - \sa audioSettings(), videoSettings(), containerFormat() -*/ - -void QMediaRecorder::setEncodingSettings(const QAudioEncoderSettings &audio, - const QVideoEncoderSettings &video, - const QString &container) -{ - Q_D(QMediaRecorder); - - d->restartCamera(); - - if (d->audioControl) - d->audioControl->setAudioSettings(audio); - - if (d->videoControl) - d->videoControl->setVideoSettings(video); - - if (d->formatControl) - d->formatControl->setContainerFormat(container); - - d->applySettingsLater(); -} - -/*! Start recording. While the recorder state is changed immediately to QMediaRecorder::RecordingState, @@ -1108,7 +820,7 @@ QStringList QMediaRecorder::availableMetaData() const */ /*! - Returns the active audio input name. + Returns the active audio input. */ QAudioDeviceInfo QMediaRecorder::audioInput() const @@ -1119,6 +831,17 @@ QAudioDeviceInfo QMediaRecorder::audioInput() const } /*! + Returns information about the active video input. +*/ +QCameraInfo QMediaRecorder::videoInput() const +{ + Q_D(const QMediaRecorder); + + auto *camera = qobject_cast<QCamera *>(d->mediaSource); + return camera ? camera->cameraInfo() : QCameraInfo(); +} + +/*! Set the active audio input to \a device. */ diff --git a/src/multimedia/recording/qmediarecorder.h b/src/multimedia/recording/qmediarecorder.h index 5c633c2e2..65499398c 100644 --- a/src/multimedia/recording/qmediarecorder.h +++ b/src/multimedia/recording/qmediarecorder.h @@ -53,6 +53,7 @@ QT_BEGIN_NAMESPACE class QUrl; class QSize; class QAudioFormat; +class QCameraInfo; QT_END_NAMESPACE QT_BEGIN_NAMESPACE @@ -139,35 +140,8 @@ public: bool isMuted() const; qreal volume() const; - QStringList supportedContainers() const; - QString containerDescription(const QString &format) const; - - QStringList supportedAudioCodecs() const; - QString audioCodecDescription(const QString &codecName) const; - - QList<int> supportedAudioSampleRates(const QAudioEncoderSettings &settings = QAudioEncoderSettings(), - bool *continuous = nullptr) const; - - QStringList supportedVideoCodecs() const; - QString videoCodecDescription(const QString &codecName) const; - - QList<QSize> supportedResolutions(const QVideoEncoderSettings &settings = QVideoEncoderSettings(), - bool *continuous = nullptr) const; - - QList<qreal> supportedFrameRates(const QVideoEncoderSettings &settings = QVideoEncoderSettings(), - bool *continuous = nullptr) const; - - QAudioEncoderSettings audioSettings() const; - QVideoEncoderSettings videoSettings() const; - QString containerFormat() const; - - void setAudioSettings(const QAudioEncoderSettings &audioSettings); - void setVideoSettings(const QVideoEncoderSettings &videoSettings); - void setContainerFormat(const QString &container); - - void setEncodingSettings(const QAudioEncoderSettings &audioSettings, - const QVideoEncoderSettings &videoSettings = QVideoEncoderSettings(), - const QString &containerMimeType = QString()); + void setEncoderSettings(const QMediaEncoderSettings &); + QMediaEncoderSettings encoderSettings() const; bool isMetaDataAvailable() const; bool isMetaDataWritable() const; @@ -177,6 +151,7 @@ public: QStringList availableMetaData() const; QAudioDeviceInfo audioInput() const; + QCameraInfo videoInput() const; public Q_SLOTS: void record(); diff --git a/src/multimedia/recording/qmediarecorder_p.h b/src/multimedia/recording/qmediarecorder_p.h index ecfc030b1..6a7ae4039 100644 --- a/src/multimedia/recording/qmediarecorder_p.h +++ b/src/multimedia/recording/qmediarecorder_p.h @@ -77,9 +77,6 @@ public: QPointer<QMediaSource> mediaSource; QMediaRecorderControl *control = nullptr; - QMediaContainerControl *formatControl = nullptr; - QAudioEncoderSettingsControl *audioControl = nullptr; - QVideoEncoderSettingsControl *videoControl = nullptr; QMetaDataWriterControl *metaDataControl = nullptr; bool settingsChanged = false; @@ -90,6 +87,7 @@ public: QMediaRecorder::Error error = QMediaRecorder::NoError; QString errorString; QUrl actualLocation; + QMediaEncoderSettings encoderSettings; void _q_stateChanged(QMediaRecorder::State state); void _q_error(int error, const QString &errorString); diff --git a/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp b/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp index 9b6bf700f..ccd799ef6 100644 --- a/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp +++ b/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp @@ -546,9 +546,9 @@ void tst_QCameraBackend::testVideoRecording() camera->setCaptureMode(QCamera::CaptureVideo); - QVideoEncoderSettings videoSettings; - videoSettings.setResolution(320, 240); - recorder.setVideoSettings(videoSettings); + QMediaEncoderSettings videoSettings; + videoSettings.setVideoResolution(320, 240); + recorder.setEncoderSettings(videoSettings); QCOMPARE(recorder.status(), QMediaRecorder::UnloadedStatus); diff --git a/tests/auto/unit/mockbackend/CMakeLists.txt b/tests/auto/unit/mockbackend/CMakeLists.txt index e1aa32433..8c152cecf 100644 --- a/tests/auto/unit/mockbackend/CMakeLists.txt +++ b/tests/auto/unit/mockbackend/CMakeLists.txt @@ -15,14 +15,12 @@ target_link_libraries(QtMultimediaMockBackend INTERFACE target_sources(QtMultimediaMockBackend INTERFACE mockaudiodecodercontrol.h mockaudiodecoderservice.h - mockaudioencodercontrol.h mockcameracontrol.h mockcameraexposurecontrol.h mockcamerafocuscontrol.h mockcameraimagecapturecontrol.h mockcameraimageprocessingcontrol.h mockimageencodercontrol.h - mockmediacontainercontrol.h mockmediaplayercontrol.h mockmediaplayerservice.h mockmediarecordercontrol.h @@ -32,7 +30,6 @@ target_sources(QtMultimediaMockBackend INTERFACE mockmediastreamscontrol.h mockmetadatareadercontrol.h mockmetadatawritercontrol.h - mockvideoencodercontrol.h mockvideorenderercontrol.h mockvideosurface.h mockvideowindowcontrol.h diff --git a/tests/auto/unit/mockbackend/capture.pri b/tests/auto/unit/mockbackend/capture.pri index 549ac7978..77e180c00 100644 --- a/tests/auto/unit/mockbackend/capture.pri +++ b/tests/auto/unit/mockbackend/capture.pri @@ -1,14 +1,11 @@ HEADERS *= \ - $$PWD/mockaudioencodercontrol.h \ $$PWD/mockcameracontrol.h \ $$PWD/mockcameraexposurecontrol.h \ $$PWD/mockcamerafocuscontrol.h \ $$PWD/mockcameraimagecapturecontrol.h \ $$PWD/mockcameraimageprocessingcontrol.h \ $$PWD/mockimageencodercontrol.h \ - $$PWD/mockmediacontainercontrol.h \ $$PWD/mockmediarecordercontrol.h \ $$PWD/mockmediarecorderservice.h \ $$PWD/mockmetadatawritercontrol.h \ $$PWD/mockvideodeviceselectorcontrol.h \ - $$PWD/mockvideoencodercontrol.h \ diff --git a/tests/auto/unit/mockbackend/mockaudioencodercontrol.h b/tests/auto/unit/mockbackend/mockaudioencodercontrol.h deleted file mode 100644 index af8f3d0f8..000000000 --- a/tests/auto/unit/mockbackend/mockaudioencodercontrol.h +++ /dev/null @@ -1,94 +0,0 @@ -/**************************************************************************** -** -** 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$ -** -****************************************************************************/ - -#ifndef MOCKAUDIOENCODERCONTROL_H -#define MOCKAUDIOENCODERCONTROL_H - -#include "qaudioencodersettingscontrol.h" - -class MockAudioEncoderControl : public QAudioEncoderSettingsControl -{ - Q_OBJECT -public: - MockAudioEncoderControl(QObject *parent): - QAudioEncoderSettingsControl(parent) - { - m_codecs << "audio/x-raw" << "audio/mpeg"; - m_descriptions << "Pulse Code Modulation" << "mp3 format"; - m_audioSettings.setCodec("audio/x-raw"); - m_audioSettings.setBitRate(128*1024); - m_audioSettings.setSampleRate(8000); - m_freqs << 8000 << 11025 << 22050 << 44100; - } - - ~MockAudioEncoderControl() {} - - QAudioEncoderSettings audioSettings() const - { - return m_audioSettings; - } - - void setAudioSettings(const QAudioEncoderSettings &settings) - { - m_audioSettings = settings; - } - - QList<int> supportedChannelCounts(const QAudioEncoderSettings & = QAudioEncoderSettings()) const - { - QList<int> list; list << 1 << 2; return list; - } - - QList<int> supportedSampleRates(const QAudioEncoderSettings & = QAudioEncoderSettings(), bool *continuous = 0) const - { - if (continuous) - *continuous = false; - - return m_freqs; - } - - QStringList supportedAudioCodecs() const - { - return m_codecs; - } - - QString codecDescription(const QString &codecName) const - { - return m_descriptions.value(m_codecs.indexOf(codecName)); - } - -private: - QAudioEncoderSettings m_audioSettings; - - QStringList m_codecs; - QStringList m_descriptions; - - QList<int> m_freqs; - -}; - -#endif // MOCKAUDIOENCODERCONTROL_H diff --git a/tests/auto/unit/mockbackend/mockmediacontainercontrol.h b/tests/auto/unit/mockbackend/mockmediacontainercontrol.h deleted file mode 100644 index 08562a469..000000000 --- a/tests/auto/unit/mockbackend/mockmediacontainercontrol.h +++ /dev/null @@ -1,84 +0,0 @@ -/**************************************************************************** -** -** 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$ -** -****************************************************************************/ - -#ifndef MOCKMEDIACONTAINERCONTROL_H -#define MOCKMEDIACONTAINERCONTROL_H - -#include <QObject> -#include "qmediacontainercontrol.h" -#include <QMap> -#include <QString> -#include <QStringList> - -QT_USE_NAMESPACE -class MockMediaContainerControl : public QMediaContainerControl -{ - Q_OBJECT -public: - MockMediaContainerControl(QObject *parent): - QMediaContainerControl(parent) - { - m_supportedContainers.append("wav"); - m_supportedContainers.append("mp3"); - m_supportedContainers.append("mov"); - - m_descriptions.insert("wav", "WAV format"); - m_descriptions.insert("mp3", "MP3 format"); - m_descriptions.insert("mov", "MOV format"); - } - - virtual ~MockMediaContainerControl() {}; - - QStringList supportedContainers() const - { - return m_supportedContainers; - } - - QString containerFormat() const - { - return m_format; - } - - void setContainerFormat(const QString &formatMimeType) - { - if (m_supportedContainers.contains(formatMimeType)) - m_format = formatMimeType; - } - - QString containerDescription(const QString &formatMimeType) const - { - return m_descriptions.value(formatMimeType); - } - -private: - QStringList m_supportedContainers; - QMap<QString, QString> m_descriptions; - QString m_format; -}; - -#endif // MOCKMEDIACONTAINERCONTROL_H diff --git a/tests/auto/unit/mockbackend/mockmediarecordercontrol.h b/tests/auto/unit/mockbackend/mockmediarecordercontrol.h index 4c7b4d165..7c27861f7 100644 --- a/tests/auto/unit/mockbackend/mockmediarecordercontrol.h +++ b/tests/auto/unit/mockbackend/mockmediarecordercontrol.h @@ -101,6 +101,8 @@ public: return true; } + void setEncoderSettings(const QMediaEncoderSettings &) {} + using QMediaRecorderControl::error; diff --git a/tests/auto/unit/mockbackend/mockmediarecorderservice.h b/tests/auto/unit/mockbackend/mockmediarecorderservice.h index 38d1c387a..803b7bab0 100644 --- a/tests/auto/unit/mockbackend/mockmediarecorderservice.h +++ b/tests/auto/unit/mockbackend/mockmediarecorderservice.h @@ -31,10 +31,7 @@ #include "qmediaservice.h" -#include "mockaudioencodercontrol.h" #include "mockmediarecordercontrol.h" -#include "mockvideoencodercontrol.h" -#include "mockmediacontainercontrol.h" #include "mockmetadatawritercontrol.h" #include "mockcamerafocuscontrol.h" #include "mockcameraimageprocessingcontrol.h" @@ -54,9 +51,6 @@ public: : hasControls(true) { mockControl = new MockMediaRecorderControl(this); - mockAudioEncoderControl = new MockAudioEncoderControl(this); - mockFormatControl = new MockMediaContainerControl(this); - mockVideoEncoderControl = new MockVideoEncoderControl(this); mockMetaDataControl = new MockMetaDataWriterControl(this); mockCameraControl = new MockCameraControl(this); mockExposureControl = new MockCameraExposureControl(this); @@ -75,14 +69,8 @@ public: if (!hasControls) return nullptr; - if (qstrcmp(name,QAudioEncoderSettingsControl_iid) == 0) - return mockAudioEncoderControl; if (qstrcmp(name,QMediaRecorderControl_iid) == 0) return mockControl; - if (qstrcmp(name,QMediaContainerControl_iid) == 0) - return mockFormatControl; - if (qstrcmp(name,QVideoEncoderSettingsControl_iid) == 0) - return mockVideoEncoderControl; if (qstrcmp(name, QMetaDataWriterControl_iid) == 0) return mockMetaDataControl; @@ -141,9 +129,6 @@ public: int windowRef; MockMediaRecorderControl *mockControl; - QAudioEncoderSettingsControl *mockAudioEncoderControl; - QMediaContainerControl *mockFormatControl; - QVideoEncoderSettingsControl *mockVideoEncoderControl; MockMetaDataWriterControl *mockMetaDataControl; bool hasControls; diff --git a/tests/auto/unit/mockbackend/mockvideoencodercontrol.h b/tests/auto/unit/mockbackend/mockvideoencodercontrol.h deleted file mode 100644 index f98eed3df..000000000 --- a/tests/auto/unit/mockbackend/mockvideoencodercontrol.h +++ /dev/null @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** 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$ -** -****************************************************************************/ - -#ifndef MOCKVIDEOENCODERCONTROL_H -#define MOCKVIDEOENCODERCONTROL_H - -#include "qvideoencodersettingscontrol.h" - -class MockVideoEncoderControl : public QVideoEncoderSettingsControl -{ - Q_OBJECT -public: - MockVideoEncoderControl(QObject *parent): - QVideoEncoderSettingsControl(parent) - { - m_videoCodecs << "video/3gpp" << "video/H264"; - m_sizes << QSize(320,240) << QSize(640,480); - m_framerates << 30 << 15 << 1; - } - ~MockVideoEncoderControl() {} - - QVideoEncoderSettings videoSettings() const { return m_videoSettings; } - void setVideoSettings(const QVideoEncoderSettings &settings) { m_videoSettings = settings; }; - - QStringList supportedVideoCodecs() const { return m_videoCodecs; } - QString videoCodecDescription(const QString &codecName) const { return codecName; } - -private: - QVideoEncoderSettings m_videoSettings; - - QStringList m_videoCodecs; - QList<QSize> m_sizes; - QList<qreal> m_framerates; -}; - -#endif // MOCKVIDEOENCODERCONTROL_H diff --git a/tests/auto/unit/multimedia/CMakeLists.txt b/tests/auto/unit/multimedia/CMakeLists.txt index bd3d0d236..37ebc2b86 100644 --- a/tests/auto/unit/multimedia/CMakeLists.txt +++ b/tests/auto/unit/multimedia/CMakeLists.txt @@ -9,7 +9,6 @@ add_subdirectory(qcamera) add_subdirectory(qcamerainfo) add_subdirectory(qcameraimagecapture) add_subdirectory(qmediasink) -add_subdirectory(qmediacontainercontrol) add_subdirectory(qmediasource) add_subdirectory(qmediaplayer) add_subdirectory(qmediaplaylist) @@ -19,7 +18,6 @@ add_subdirectory(qmediaservice) add_subdirectory(qmediatimerange) add_subdirectory(qmetadatareadercontrol) add_subdirectory(qmetadatawritercontrol) -add_subdirectory(qvideoencodersettingscontrol) add_subdirectory(qvideoframe) add_subdirectory(qvideosurfaceformat) add_subdirectory(qaudiobuffer) diff --git a/tests/auto/unit/multimedia/multimedia.pro b/tests/auto/unit/multimedia/multimedia.pro index 1e2c09c79..d1be5e850 100644 --- a/tests/auto/unit/multimedia/multimedia.pro +++ b/tests/auto/unit/multimedia/multimedia.pro @@ -10,7 +10,6 @@ SUBDIRS += \ qcamerainfo \ qcameraimagecapture \ qmediasink \ - qmediacontainercontrol \ qmediasource \ qmediaplayer \ qmediaplaylist \ @@ -20,7 +19,6 @@ SUBDIRS += \ qmediatimerange \ qmetadatareadercontrol \ qmetadatawritercontrol \ - qvideoencodersettingscontrol \ qvideoframe \ qvideosurfaceformat \ # qwavedecoder \ diff --git a/tests/auto/unit/multimedia/qaudiorecorder/tst_qaudiorecorder.cpp b/tests/auto/unit/multimedia/qaudiorecorder/tst_qaudiorecorder.cpp index 9d8629baf..599d87dca 100644 --- a/tests/auto/unit/multimedia/qaudiorecorder/tst_qaudiorecorder.cpp +++ b/tests/auto/unit/multimedia/qaudiorecorder/tst_qaudiorecorder.cpp @@ -32,7 +32,6 @@ #include <qaudioformat.h> #include <qmediarecorder.h> -#include <qaudioencodersettingscontrol.h> #include <qmediarecordercontrol.h> #include <qaudiodeviceinfo.h> #include <qaudioinput.h> diff --git a/tests/auto/unit/multimedia/qmediacontainercontrol/CMakeLists.txt b/tests/auto/unit/multimedia/qmediacontainercontrol/CMakeLists.txt deleted file mode 100644 index c9d9c7bbb..000000000 --- a/tests/auto/unit/multimedia/qmediacontainercontrol/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -# Generated from qmediacontainercontrol.pro. - -##################################################################### -## tst_qmediacontainercontrol Test: -##################################################################### - -qt_add_test(tst_qmediacontainercontrol - SOURCES - tst_qmediacontainercontrol.cpp - INCLUDE_DIRECTORIES - ../../mockbackend - PUBLIC_LIBRARIES - # Remove: L${CMAKE_CURRENT_SOURCE_DIR} - Qt::Gui - Qt::MultimediaPrivate - QtMultimediaMockBackend -) diff --git a/tests/auto/unit/multimedia/qmediacontainercontrol/qmediacontainercontrol.pro b/tests/auto/unit/multimedia/qmediacontainercontrol/qmediacontainercontrol.pro deleted file mode 100644 index 7158bb5dc..000000000 --- a/tests/auto/unit/multimedia/qmediacontainercontrol/qmediacontainercontrol.pro +++ /dev/null @@ -1,9 +0,0 @@ -CONFIG += testcase -TARGET = tst_qmediacontainercontrol - -QT += multimedia-private testlib - -SOURCES += tst_qmediacontainercontrol.cpp - -include (../../mockbackend/mockbackend.pri) - diff --git a/tests/auto/unit/multimedia/qmediacontainercontrol/tst_qmediacontainercontrol.cpp b/tests/auto/unit/multimedia/qmediacontainercontrol/tst_qmediacontainercontrol.cpp deleted file mode 100644 index 616f8e3e3..000000000 --- a/tests/auto/unit/multimedia/qmediacontainercontrol/tst_qmediacontainercontrol.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/**************************************************************************** -** -** 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$ -** -****************************************************************************/ - -//TESTED_COMPONENT=src/multimedia - -#include <QtTest/QtTest> -#include "qmediacontainercontrol.h" -#include "qmediarecorder.h" - -#include "mockmediacontainercontrol.h" - -//MaemoAPI- -class tst_QMediaContainerControl :public QObject -{ - Q_OBJECT - -private slots: - //to test the constructor - void tst_mediacontainercontrol() - { - - QObject obj; - MockMediaContainerControl control(&obj); - QStringList strlist=control.supportedContainers(); - QStringList strlist1; - strlist1 << "wav" << "mp3" << "mov"; - QVERIFY(strlist[0]==strlist1[0]); //checking with "wav" mime type - QVERIFY(strlist[1]==strlist1[1]); //checking with "mp3" mime type - QVERIFY(strlist[2]==strlist1[2]); //checking with "mov" mime type - - control.setContainerFormat("wav"); - const QString str("wav"); - QVERIFY2(control.containerFormat() == str,"Failed"); - - const QString str1("WAV format"); - QVERIFY2(control.containerDescription("wav") == str1,"FAILED"); - } -}; - -QTEST_MAIN(tst_QMediaContainerControl); -#include "tst_qmediacontainercontrol.moc" diff --git a/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp b/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp index 2fe2e6be4..baf1dd9a4 100644 --- a/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp +++ b/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp @@ -37,9 +37,6 @@ #include <qmediarecordercontrol.h> #include <qmediarecorder.h> #include <qmetadatawritercontrol.h> -#include <qaudioencodersettingscontrol.h> -#include <qmediacontainercontrol.h> -#include <qvideoencodersettingscontrol.h> #include <qaudioformat.h> #include <qmockintegration_p.h> @@ -67,9 +64,6 @@ private slots: void testMute(); void testVolume(); void testAudioDeviceControl(); - void testAudioEncodeControl(); - void testMediaFormatsControl(); - void testVideoEncodeControl(); void testEncodingSettings(); void testAudioSettings(); void testVideoSettings(); @@ -142,22 +136,6 @@ void tst_QMediaRecorder::testNullService() QCOMPARE(recorder.state(), QMediaRecorder::StoppedState); QCOMPARE(recorder.error(), QMediaRecorder::NoError); QCOMPARE(recorder.duration(), qint64(0)); - QCOMPARE(recorder.supportedContainers(), QStringList()); - QCOMPARE(recorder.containerDescription(id), QString()); - QCOMPARE(recorder.supportedAudioCodecs(), QStringList()); - QCOMPARE(recorder.audioCodecDescription(id), QString()); - QCOMPARE(recorder.supportedAudioSampleRates(), QList<int>()); - QCOMPARE(recorder.supportedVideoCodecs(), QStringList()); - QCOMPARE(recorder.videoCodecDescription(id), QString()); - bool continuous = true; - QCOMPARE(recorder.supportedResolutions(QVideoEncoderSettings(), &continuous), QList<QSize>()); - QCOMPARE(continuous, false); - continuous = true; - QCOMPARE(recorder.supportedFrameRates(QVideoEncoderSettings(), &continuous), QList<qreal>()); - QCOMPARE(continuous, false); - QCOMPARE(recorder.audioSettings(), QAudioEncoderSettings()); - QCOMPARE(recorder.videoSettings(), QVideoEncoderSettings()); - QCOMPARE(recorder.containerFormat(), QString()); QVERIFY(!recorder.isMuted()); recorder.setMuted(true); QVERIFY(!recorder.isMuted()); @@ -165,8 +143,6 @@ void tst_QMediaRecorder::testNullService() void tst_QMediaRecorder::testNullControls() { - const QString id(QLatin1String("application/x-format")); - service->hasControls = false; MockMediaSource object(nullptr, service); QMediaRecorder recorder(&object); @@ -175,40 +151,24 @@ void tst_QMediaRecorder::testNullControls() QCOMPARE(recorder.state(), QMediaRecorder::StoppedState); QCOMPARE(recorder.error(), QMediaRecorder::NoError); QCOMPARE(recorder.duration(), qint64(0)); - QCOMPARE(recorder.supportedContainers(), QStringList()); - QCOMPARE(recorder.containerDescription(id), QString()); - QCOMPARE(recorder.supportedAudioCodecs(), QStringList()); - QCOMPARE(recorder.audioCodecDescription(id), QString()); - QCOMPARE(recorder.supportedAudioSampleRates(), QList<int>()); - QCOMPARE(recorder.supportedVideoCodecs(), QStringList()); - QCOMPARE(recorder.videoCodecDescription(id), QString()); - bool continuous = true; - QCOMPARE(recorder.supportedResolutions(QVideoEncoderSettings(), &continuous), QList<QSize>()); - QCOMPARE(continuous, false); - continuous = true; - QCOMPARE(recorder.supportedFrameRates(QVideoEncoderSettings(), &continuous), QList<qreal>()); - QCOMPARE(continuous, false); - QCOMPARE(recorder.audioSettings(), QAudioEncoderSettings()); - QCOMPARE(recorder.videoSettings(), QVideoEncoderSettings()); - QCOMPARE(recorder.containerFormat(), QString()); recorder.setOutputLocation(QUrl("file://test/save/file.mp4")); QCOMPARE(recorder.outputLocation(), QUrl()); QCOMPARE(recorder.actualLocation(), QUrl()); - QAudioEncoderSettings audio; - audio.setCodec(id); - audio.setQuality(QMultimedia::LowQuality); + QMediaEncoderSettings settings; + settings.setFormat(QMediaFormat::MPEG4); + settings.setAudioCodec(QMediaFormat::AudioCodec::AAC); + settings.setQuality(QMultimedia::LowQuality); - QVideoEncoderSettings video; - video.setCodec(id); - video.setResolution(640, 480); + settings.setVideoCodec(QMediaFormat::VideoCodec::VP9); + settings.setVideoResolution(640, 480); - recorder.setEncodingSettings(audio, video, id); + recorder.setEncoderSettings(settings); - QCOMPARE(recorder.audioSettings(), QAudioEncoderSettings()); - QCOMPARE(recorder.videoSettings(), QVideoEncoderSettings()); - QCOMPARE(recorder.containerFormat(), QString()); + QCOMPARE(recorder.encoderSettings().audioCodec(), QMediaFormat::AudioCodec::AAC); + QCOMPARE(recorder.encoderSettings().videoCodec(), QMediaFormat::VideoCodec::VP9); + QCOMPARE(recorder.encoderSettings().format(), QMediaFormat::MPEG4); QSignalSpy spy(&recorder, SIGNAL(stateChanged(QMediaRecorder::State))); @@ -387,422 +347,387 @@ void tst_QMediaRecorder::testAudioDeviceControl() // QVERIFY(audio->inputDescription("device2").compare("dev2 comment") == 0); } -void tst_QMediaRecorder::testAudioEncodeControl() -{ - QStringList codecs = capture->supportedAudioCodecs(); - QVERIFY(codecs.count() == 2); - QVERIFY(capture->audioCodecDescription("audio/x-raw") == "Pulse Code Modulation"); - QList<int> rates; - rates << 8000 << 11025 << 22050 << 44100; - QCOMPARE(capture->supportedAudioSampleRates(), rates); -} - -void tst_QMediaRecorder::testMediaFormatsControl() -{ - QCOMPARE(capture->supportedContainers(), QStringList() << "wav" << "mp3" << "mov"); - - QCOMPARE(capture->containerDescription("wav"), QString("WAV format")); - QCOMPARE(capture->containerDescription("mp3"), QString("MP3 format")); - QCOMPARE(capture->containerDescription("ogg"), QString()); -} - -void tst_QMediaRecorder::testVideoEncodeControl() -{ - bool continuous = false; - QList<QSize> sizes = capture->supportedResolutions(QVideoEncoderSettings(), &continuous); - QCOMPARE(sizes.count(), 2); - QCOMPARE(continuous, true); - - QList<qreal> rates = capture->supportedFrameRates(QVideoEncoderSettings(), &continuous); - QCOMPARE(rates.count(), 3); - QCOMPARE(continuous, false); - - QStringList vCodecs = capture->supportedVideoCodecs(); - QVERIFY(vCodecs.count() == 2); - QCOMPARE(capture->videoCodecDescription("video/3gpp"), QString("video/3gpp")); -} - void tst_QMediaRecorder::testEncodingSettings() { - QAudioEncoderSettings audioSettings = capture->audioSettings(); - QCOMPARE(audioSettings.codec(), QString("audio/x-raw")); - QCOMPARE(audioSettings.bitRate(), 128*1024); - QCOMPARE(audioSettings.sampleRate(), 8000); - QCOMPARE(audioSettings.quality(), QMultimedia::NormalQuality); - QCOMPARE(audioSettings.channelCount(), -1); - - QCOMPARE(audioSettings.encodingMode(), QMultimedia::ConstantQualityEncoding); - - QVideoEncoderSettings videoSettings = capture->videoSettings(); - QCOMPARE(videoSettings.codec(), QString()); - QCOMPARE(videoSettings.bitRate(), -1); - QCOMPARE(videoSettings.resolution(), QSize()); - QCOMPARE(videoSettings.frameRate(), 0.0); - QCOMPARE(videoSettings.quality(), QMultimedia::NormalQuality); - QCOMPARE(videoSettings.encodingMode(), QMultimedia::ConstantQualityEncoding); - - QString format = capture->containerFormat(); - QCOMPARE(format, QString()); - - audioSettings.setCodec("audio/mpeg"); - audioSettings.setSampleRate(44100); - audioSettings.setBitRate(256*1024); - audioSettings.setQuality(QMultimedia::HighQuality); - audioSettings.setEncodingMode(QMultimedia::AverageBitRateEncoding); - - videoSettings.setCodec("video/3gpp"); - videoSettings.setBitRate(800); - videoSettings.setFrameRate(24*1024); - videoSettings.setResolution(QSize(800,600)); - videoSettings.setQuality(QMultimedia::HighQuality); - audioSettings.setEncodingMode(QMultimedia::TwoPassEncoding); - - format = QString("mov"); - - capture->setAudioSettings(audioSettings); - capture->setVideoSettings(videoSettings); - capture->setContainerFormat(format); - - QCOMPARE(capture->audioSettings(), audioSettings); - QCOMPARE(capture->videoSettings(), videoSettings); - QCOMPARE(capture->containerFormat(), format); +// QAudioEncoderSettings audioSettings = capture->audioSettings(); +// QCOMPARE(audioSettings.codec(), QString("audio/x-raw")); +// QCOMPARE(audioSettings.bitRate(), 128*1024); +// QCOMPARE(audioSettings.sampleRate(), 8000); +// QCOMPARE(audioSettings.quality(), QMultimedia::NormalQuality); +// QCOMPARE(audioSettings.channelCount(), -1); + +// QCOMPARE(audioSettings.encodingMode(), QMultimedia::ConstantQualityEncoding); + +// QVideoEncoderSettings videoSettings = capture->videoSettings(); +// QCOMPARE(videoSettings.codec(), QString()); +// QCOMPARE(videoSettings.bitRate(), -1); +// QCOMPARE(videoSettings.resolution(), QSize()); +// QCOMPARE(videoSettings.frameRate(), 0.0); +// QCOMPARE(videoSettings.quality(), QMultimedia::NormalQuality); +// QCOMPARE(videoSettings.encodingMode(), QMultimedia::ConstantQualityEncoding); + +// QString format = capture->containerFormat(); +// QCOMPARE(format, QString()); + +// audioSettings.setCodec("audio/mpeg"); +// audioSettings.setSampleRate(44100); +// audioSettings.setBitRate(256*1024); +// audioSettings.setQuality(QMultimedia::HighQuality); +// audioSettings.setEncodingMode(QMultimedia::AverageBitRateEncoding); + +// videoSettings.setCodec("video/3gpp"); +// videoSettings.setBitRate(800); +// videoSettings.setFrameRate(24*1024); +// videoSettings.setResolution(QSize(800,600)); +// videoSettings.setQuality(QMultimedia::HighQuality); +// audioSettings.setEncodingMode(QMultimedia::TwoPassEncoding); + +// format = QString("mov"); + +// capture->setAudioSettings(audioSettings); +// capture->setVideoSettings(videoSettings); +// capture->setContainerFormat(format); + +// QCOMPARE(capture->audioSettings(), audioSettings); +// QCOMPARE(capture->videoSettings(), videoSettings); +// QCOMPARE(capture->containerFormat(), format); } void tst_QMediaRecorder::testAudioSettings() { - QAudioEncoderSettings settings; - QVERIFY(settings.isNull()); - QVERIFY(settings == QAudioEncoderSettings()); - - QCOMPARE(settings.codec(), QString()); - settings.setCodec(QLatin1String("codecName")); - QCOMPARE(settings.codec(), QLatin1String("codecName")); - QVERIFY(!settings.isNull()); - QVERIFY(settings != QAudioEncoderSettings()); - - settings = QAudioEncoderSettings(); - QCOMPARE(settings.bitRate(), -1); - settings.setBitRate(128000); - QCOMPARE(settings.bitRate(), 128000); - QVERIFY(!settings.isNull()); - - settings = QAudioEncoderSettings(); - QCOMPARE(settings.quality(), QMultimedia::NormalQuality); - settings.setQuality(QMultimedia::HighQuality); - QCOMPARE(settings.quality(), QMultimedia::HighQuality); - QVERIFY(!settings.isNull()); - - settings = QAudioEncoderSettings(); - QCOMPARE(settings.sampleRate(), -1); - settings.setSampleRate(44100); - QCOMPARE(settings.sampleRate(), 44100); - QVERIFY(!settings.isNull()); - - settings = QAudioEncoderSettings(); - QCOMPARE(settings.channelCount(), -1); - settings.setChannelCount(2); - QCOMPARE(settings.channelCount(), 2); - QVERIFY(!settings.isNull()); - - settings = QAudioEncoderSettings(); - settings.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); - QCOMPARE(settings.encodingOption(QLatin1String("encoderOption")), QVariant(1)); - QVariantMap options; - options.insert(QLatin1String("encoderOption"), QVariant(1)); - QCOMPARE(settings.encodingOptions(), options); - options.insert(QLatin1String("encoderOption2"), QVariant(2)); - options.remove(QLatin1String("encoderOption")); - settings.setEncodingOptions(options); - QCOMPARE(settings.encodingOption(QLatin1String("encoderOption")), QVariant()); - QCOMPARE(settings.encodingOption(QLatin1String("encoderOption2")), QVariant(2)); - QVERIFY(!settings.isNull()); - QVERIFY(settings != QAudioEncoderSettings()); - - settings = QAudioEncoderSettings(); - QVERIFY(settings.isNull()); - QCOMPARE(settings.codec(), QString()); - QCOMPARE(settings.bitRate(), -1); - QCOMPARE(settings.quality(), QMultimedia::NormalQuality); - QCOMPARE(settings.sampleRate(), -1); - QVERIFY(settings.encodingOptions().isEmpty()); - - { - QAudioEncoderSettings settings1; - QAudioEncoderSettings settings2; - QCOMPARE(settings2, settings1); - - settings2 = settings1; - QCOMPARE(settings2, settings1); - QVERIFY(settings2.isNull()); - - settings1.setQuality(QMultimedia::HighQuality); - - QVERIFY(settings2.isNull()); - QVERIFY(!settings1.isNull()); - QVERIFY(settings1 != settings2); - } - - { - QAudioEncoderSettings settings1; - QAudioEncoderSettings settings2(settings1); - QCOMPARE(settings2, settings1); - - settings2 = settings1; - QCOMPARE(settings2, settings1); - QVERIFY(settings2.isNull()); - - settings1.setQuality(QMultimedia::HighQuality); - - QVERIFY(settings2.isNull()); - QVERIFY(!settings1.isNull()); - QVERIFY(settings1 != settings2); - } - - QAudioEncoderSettings settings1; - settings1.setBitRate(1); - QAudioEncoderSettings settings2; - settings2.setBitRate(1); - QVERIFY(settings1 == settings2); - settings2.setBitRate(2); - QVERIFY(settings1 != settings2); - - settings1 = QAudioEncoderSettings(); - settings1.setChannelCount(1); - settings2 = QAudioEncoderSettings(); - settings2.setChannelCount(1); - QVERIFY(settings1 == settings2); - settings2.setChannelCount(2); - QVERIFY(settings1 != settings2); - - settings1 = QAudioEncoderSettings(); - settings1.setCodec("codec1"); - settings2 = QAudioEncoderSettings(); - settings2.setCodec("codec1"); - QVERIFY(settings1 == settings2); - settings2.setCodec("codec2"); - QVERIFY(settings1 != settings2); - - settings1 = QAudioEncoderSettings(); - settings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); - settings2 = QAudioEncoderSettings(); - settings2.setEncodingMode(QMultimedia::ConstantBitRateEncoding); - QVERIFY(settings1 == settings2); - settings2.setEncodingMode(QMultimedia::TwoPassEncoding); - QVERIFY(settings1 != settings2); - - settings1 = QAudioEncoderSettings(); - settings1.setQuality(QMultimedia::NormalQuality); - settings2 = QAudioEncoderSettings(); - settings2.setQuality(QMultimedia::NormalQuality); - QVERIFY(settings1 == settings2); - settings2.setQuality(QMultimedia::LowQuality); - QVERIFY(settings1 != settings2); - - settings1 = QAudioEncoderSettings(); - settings1.setSampleRate(1); - settings2 = QAudioEncoderSettings(); - settings2.setSampleRate(1); - QVERIFY(settings1 == settings2); - settings2.setSampleRate(2); - QVERIFY(settings1 != settings2); - - settings1 = QAudioEncoderSettings(); - settings1.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); - settings2 = QAudioEncoderSettings(); - settings2.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); - QVERIFY(settings1 == settings2); - settings2.setEncodingOption(QLatin1String("encoderOption"), QVariant(2)); - QVERIFY(settings1 != settings2); +// QAudioEncoderSettings settings; +// QVERIFY(settings.isNull()); +// QVERIFY(settings == QAudioEncoderSettings()); + +// QCOMPARE(settings.codec(), QString()); +// settings.setCodec(QLatin1String("codecName")); +// QCOMPARE(settings.codec(), QLatin1String("codecName")); +// QVERIFY(!settings.isNull()); +// QVERIFY(settings != QAudioEncoderSettings()); + +// settings = QAudioEncoderSettings(); +// QCOMPARE(settings.bitRate(), -1); +// settings.setBitRate(128000); +// QCOMPARE(settings.bitRate(), 128000); +// QVERIFY(!settings.isNull()); + +// settings = QAudioEncoderSettings(); +// QCOMPARE(settings.quality(), QMultimedia::NormalQuality); +// settings.setQuality(QMultimedia::HighQuality); +// QCOMPARE(settings.quality(), QMultimedia::HighQuality); +// QVERIFY(!settings.isNull()); + +// settings = QAudioEncoderSettings(); +// QCOMPARE(settings.sampleRate(), -1); +// settings.setSampleRate(44100); +// QCOMPARE(settings.sampleRate(), 44100); +// QVERIFY(!settings.isNull()); + +// settings = QAudioEncoderSettings(); +// QCOMPARE(settings.channelCount(), -1); +// settings.setChannelCount(2); +// QCOMPARE(settings.channelCount(), 2); +// QVERIFY(!settings.isNull()); + +// settings = QAudioEncoderSettings(); +// settings.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); +// QCOMPARE(settings.encodingOption(QLatin1String("encoderOption")), QVariant(1)); +// QVariantMap options; +// options.insert(QLatin1String("encoderOption"), QVariant(1)); +// QCOMPARE(settings.encodingOptions(), options); +// options.insert(QLatin1String("encoderOption2"), QVariant(2)); +// options.remove(QLatin1String("encoderOption")); +// settings.setEncodingOptions(options); +// QCOMPARE(settings.encodingOption(QLatin1String("encoderOption")), QVariant()); +// QCOMPARE(settings.encodingOption(QLatin1String("encoderOption2")), QVariant(2)); +// QVERIFY(!settings.isNull()); +// QVERIFY(settings != QAudioEncoderSettings()); + +// settings = QAudioEncoderSettings(); +// QVERIFY(settings.isNull()); +// QCOMPARE(settings.codec(), QString()); +// QCOMPARE(settings.bitRate(), -1); +// QCOMPARE(settings.quality(), QMultimedia::NormalQuality); +// QCOMPARE(settings.sampleRate(), -1); +// QVERIFY(settings.encodingOptions().isEmpty()); + +// { +// QAudioEncoderSettings settings1; +// QAudioEncoderSettings settings2; +// QCOMPARE(settings2, settings1); + +// settings2 = settings1; +// QCOMPARE(settings2, settings1); +// QVERIFY(settings2.isNull()); + +// settings1.setQuality(QMultimedia::HighQuality); + +// QVERIFY(settings2.isNull()); +// QVERIFY(!settings1.isNull()); +// QVERIFY(settings1 != settings2); +// } + +// { +// QAudioEncoderSettings settings1; +// QAudioEncoderSettings settings2(settings1); +// QCOMPARE(settings2, settings1); + +// settings2 = settings1; +// QCOMPARE(settings2, settings1); +// QVERIFY(settings2.isNull()); + +// settings1.setQuality(QMultimedia::HighQuality); + +// QVERIFY(settings2.isNull()); +// QVERIFY(!settings1.isNull()); +// QVERIFY(settings1 != settings2); +// } + +// QAudioEncoderSettings settings1; +// settings1.setBitRate(1); +// QAudioEncoderSettings settings2; +// settings2.setBitRate(1); +// QVERIFY(settings1 == settings2); +// settings2.setBitRate(2); +// QVERIFY(settings1 != settings2); + +// settings1 = QAudioEncoderSettings(); +// settings1.setChannelCount(1); +// settings2 = QAudioEncoderSettings(); +// settings2.setChannelCount(1); +// QVERIFY(settings1 == settings2); +// settings2.setChannelCount(2); +// QVERIFY(settings1 != settings2); + +// settings1 = QAudioEncoderSettings(); +// settings1.setCodec("codec1"); +// settings2 = QAudioEncoderSettings(); +// settings2.setCodec("codec1"); +// QVERIFY(settings1 == settings2); +// settings2.setCodec("codec2"); +// QVERIFY(settings1 != settings2); + +// settings1 = QAudioEncoderSettings(); +// settings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); +// settings2 = QAudioEncoderSettings(); +// settings2.setEncodingMode(QMultimedia::ConstantBitRateEncoding); +// QVERIFY(settings1 == settings2); +// settings2.setEncodingMode(QMultimedia::TwoPassEncoding); +// QVERIFY(settings1 != settings2); + +// settings1 = QAudioEncoderSettings(); +// settings1.setQuality(QMultimedia::NormalQuality); +// settings2 = QAudioEncoderSettings(); +// settings2.setQuality(QMultimedia::NormalQuality); +// QVERIFY(settings1 == settings2); +// settings2.setQuality(QMultimedia::LowQuality); +// QVERIFY(settings1 != settings2); + +// settings1 = QAudioEncoderSettings(); +// settings1.setSampleRate(1); +// settings2 = QAudioEncoderSettings(); +// settings2.setSampleRate(1); +// QVERIFY(settings1 == settings2); +// settings2.setSampleRate(2); +// QVERIFY(settings1 != settings2); + +// settings1 = QAudioEncoderSettings(); +// settings1.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); +// settings2 = QAudioEncoderSettings(); +// settings2.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); +// QVERIFY(settings1 == settings2); +// settings2.setEncodingOption(QLatin1String("encoderOption"), QVariant(2)); +// QVERIFY(settings1 != settings2); } void tst_QMediaRecorder::testVideoSettings() { - QVideoEncoderSettings settings; - QVERIFY(settings.isNull()); - QVERIFY(settings == QVideoEncoderSettings()); - - QCOMPARE(settings.codec(), QString()); - settings.setCodec(QLatin1String("codecName")); - QCOMPARE(settings.codec(), QLatin1String("codecName")); - QVERIFY(!settings.isNull()); - QVERIFY(settings != QVideoEncoderSettings()); - - settings = QVideoEncoderSettings(); - QCOMPARE(settings.bitRate(), -1); - settings.setBitRate(128000); - QCOMPARE(settings.bitRate(), 128000); - QVERIFY(!settings.isNull()); - - settings = QVideoEncoderSettings(); - QCOMPARE(settings.quality(), QMultimedia::NormalQuality); - settings.setQuality(QMultimedia::HighQuality); - QCOMPARE(settings.quality(), QMultimedia::HighQuality); - QVERIFY(!settings.isNull()); - - settings = QVideoEncoderSettings(); - QCOMPARE(settings.frameRate(), qreal()); - settings.setFrameRate(30000.0/10001); - QVERIFY(qFuzzyCompare(settings.frameRate(), qreal(30000.0/10001))); - settings.setFrameRate(24.0); - QVERIFY(qFuzzyCompare(settings.frameRate(), qreal(24.0))); - QVERIFY(!settings.isNull()); - - settings = QVideoEncoderSettings(); - QCOMPARE(settings.resolution(), QSize()); - settings.setResolution(QSize(320,240)); - QCOMPARE(settings.resolution(), QSize(320,240)); - settings.setResolution(800,600); - QCOMPARE(settings.resolution(), QSize(800,600)); - QVERIFY(!settings.isNull()); - - settings = QVideoEncoderSettings(); - settings.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); - QCOMPARE(settings.encodingOption(QLatin1String("encoderOption")), QVariant(1)); - QVariantMap options; - options.insert(QLatin1String("encoderOption"), QVariant(1)); - QCOMPARE(settings.encodingOptions(), options); - options.insert(QLatin1String("encoderOption2"), QVariant(2)); - options.remove(QLatin1String("encoderOption")); - settings.setEncodingOptions(options); - QCOMPARE(settings.encodingOption(QLatin1String("encoderOption")), QVariant()); - QCOMPARE(settings.encodingOption(QLatin1String("encoderOption2")), QVariant(2)); - QVERIFY(!settings.isNull()); - QVERIFY(settings != QVideoEncoderSettings()); - - settings = QVideoEncoderSettings(); - QVERIFY(settings.isNull()); - QCOMPARE(settings.codec(), QString()); - QCOMPARE(settings.bitRate(), -1); - QCOMPARE(settings.quality(), QMultimedia::NormalQuality); - QCOMPARE(settings.frameRate(), qreal()); - QCOMPARE(settings.resolution(), QSize()); - QVERIFY(settings.encodingOptions().isEmpty()); - - { - QVideoEncoderSettings settings1; - QVideoEncoderSettings settings2; - QCOMPARE(settings2, settings1); - - settings2 = settings1; - QCOMPARE(settings2, settings1); - QVERIFY(settings2.isNull()); - - settings1.setQuality(QMultimedia::HighQuality); - - QVERIFY(settings2.isNull()); - QVERIFY(!settings1.isNull()); - QVERIFY(settings1 != settings2); - } - - { - QVideoEncoderSettings settings1; - QVideoEncoderSettings settings2(settings1); - QCOMPARE(settings2, settings1); - - settings2 = settings1; - QCOMPARE(settings2, settings1); - QVERIFY(settings2.isNull()); - - settings1.setQuality(QMultimedia::HighQuality); - - QVERIFY(settings2.isNull()); - QVERIFY(!settings1.isNull()); - QVERIFY(settings1 != settings2); - } - - QVideoEncoderSettings settings1; - settings1.setBitRate(1); - QVideoEncoderSettings settings2; - settings2.setBitRate(1); - QVERIFY(settings1 == settings2); - settings2.setBitRate(2); - QVERIFY(settings1 != settings2); - - settings1 = QVideoEncoderSettings(); - settings1.setResolution(800,600); - settings2 = QVideoEncoderSettings(); - settings2.setResolution(QSize(800,600)); - QVERIFY(settings1 == settings2); - settings2.setResolution(QSize(400,300)); - QVERIFY(settings1 != settings2); - - settings1 = QVideoEncoderSettings(); - settings1.setCodec("codec1"); - settings2 = QVideoEncoderSettings(); - settings2.setCodec("codec1"); - QVERIFY(settings1 == settings2); - settings2.setCodec("codec2"); - QVERIFY(settings1 != settings2); - - settings1 = QVideoEncoderSettings(); - settings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); - settings2 = QVideoEncoderSettings(); - settings2.setEncodingMode(QMultimedia::ConstantBitRateEncoding); - QVERIFY(settings1 == settings2); - settings2.setEncodingMode(QMultimedia::TwoPassEncoding); - QVERIFY(settings1 != settings2); - - settings1 = QVideoEncoderSettings(); - settings1.setQuality(QMultimedia::NormalQuality); - settings2 = QVideoEncoderSettings(); - settings2.setQuality(QMultimedia::NormalQuality); - QVERIFY(settings1 == settings2); - settings2.setQuality(QMultimedia::LowQuality); - QVERIFY(settings1 != settings2); - - settings1 = QVideoEncoderSettings(); - settings1.setFrameRate(1); - settings2 = QVideoEncoderSettings(); - settings2.setFrameRate(1); - QVERIFY(settings1 == settings2); - settings2.setFrameRate(2); - QVERIFY(settings1 != settings2); - - settings1 = QVideoEncoderSettings(); - settings1.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); - settings2 = QVideoEncoderSettings(); - settings2.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); - QVERIFY(settings1 == settings2); - settings2.setEncodingOption(QLatin1String("encoderOption"), QVariant(2)); - QVERIFY(settings1 != settings2); +// QVideoEncoderSettings settings; +// QVERIFY(settings.isNull()); +// QVERIFY(settings == QVideoEncoderSettings()); + +// QCOMPARE(settings.codec(), QString()); +// settings.setCodec(QLatin1String("codecName")); +// QCOMPARE(settings.codec(), QLatin1String("codecName")); +// QVERIFY(!settings.isNull()); +// QVERIFY(settings != QVideoEncoderSettings()); + +// settings = QVideoEncoderSettings(); +// QCOMPARE(settings.bitRate(), -1); +// settings.setBitRate(128000); +// QCOMPARE(settings.bitRate(), 128000); +// QVERIFY(!settings.isNull()); + +// settings = QVideoEncoderSettings(); +// QCOMPARE(settings.quality(), QMultimedia::NormalQuality); +// settings.setQuality(QMultimedia::HighQuality); +// QCOMPARE(settings.quality(), QMultimedia::HighQuality); +// QVERIFY(!settings.isNull()); + +// settings = QVideoEncoderSettings(); +// QCOMPARE(settings.frameRate(), qreal()); +// settings.setFrameRate(30000.0/10001); +// QVERIFY(qFuzzyCompare(settings.frameRate(), qreal(30000.0/10001))); +// settings.setFrameRate(24.0); +// QVERIFY(qFuzzyCompare(settings.frameRate(), qreal(24.0))); +// QVERIFY(!settings.isNull()); + +// settings = QVideoEncoderSettings(); +// QCOMPARE(settings.resolution(), QSize()); +// settings.setResolution(QSize(320,240)); +// QCOMPARE(settings.resolution(), QSize(320,240)); +// settings.setResolution(800,600); +// QCOMPARE(settings.resolution(), QSize(800,600)); +// QVERIFY(!settings.isNull()); + +// settings = QVideoEncoderSettings(); +// settings.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); +// QCOMPARE(settings.encodingOption(QLatin1String("encoderOption")), QVariant(1)); +// QVariantMap options; +// options.insert(QLatin1String("encoderOption"), QVariant(1)); +// QCOMPARE(settings.encodingOptions(), options); +// options.insert(QLatin1String("encoderOption2"), QVariant(2)); +// options.remove(QLatin1String("encoderOption")); +// settings.setEncodingOptions(options); +// QCOMPARE(settings.encodingOption(QLatin1String("encoderOption")), QVariant()); +// QCOMPARE(settings.encodingOption(QLatin1String("encoderOption2")), QVariant(2)); +// QVERIFY(!settings.isNull()); +// QVERIFY(settings != QVideoEncoderSettings()); + +// settings = QVideoEncoderSettings(); +// QVERIFY(settings.isNull()); +// QCOMPARE(settings.codec(), QString()); +// QCOMPARE(settings.bitRate(), -1); +// QCOMPARE(settings.quality(), QMultimedia::NormalQuality); +// QCOMPARE(settings.frameRate(), qreal()); +// QCOMPARE(settings.resolution(), QSize()); +// QVERIFY(settings.encodingOptions().isEmpty()); + +// { +// QVideoEncoderSettings settings1; +// QVideoEncoderSettings settings2; +// QCOMPARE(settings2, settings1); + +// settings2 = settings1; +// QCOMPARE(settings2, settings1); +// QVERIFY(settings2.isNull()); + +// settings1.setQuality(QMultimedia::HighQuality); + +// QVERIFY(settings2.isNull()); +// QVERIFY(!settings1.isNull()); +// QVERIFY(settings1 != settings2); +// } + +// { +// QVideoEncoderSettings settings1; +// QVideoEncoderSettings settings2(settings1); +// QCOMPARE(settings2, settings1); + +// settings2 = settings1; +// QCOMPARE(settings2, settings1); +// QVERIFY(settings2.isNull()); + +// settings1.setQuality(QMultimedia::HighQuality); + +// QVERIFY(settings2.isNull()); +// QVERIFY(!settings1.isNull()); +// QVERIFY(settings1 != settings2); +// } + +// QVideoEncoderSettings settings1; +// settings1.setBitRate(1); +// QVideoEncoderSettings settings2; +// settings2.setBitRate(1); +// QVERIFY(settings1 == settings2); +// settings2.setBitRate(2); +// QVERIFY(settings1 != settings2); + +// settings1 = QVideoEncoderSettings(); +// settings1.setResolution(800,600); +// settings2 = QVideoEncoderSettings(); +// settings2.setResolution(QSize(800,600)); +// QVERIFY(settings1 == settings2); +// settings2.setResolution(QSize(400,300)); +// QVERIFY(settings1 != settings2); + +// settings1 = QVideoEncoderSettings(); +// settings1.setCodec("codec1"); +// settings2 = QVideoEncoderSettings(); +// settings2.setCodec("codec1"); +// QVERIFY(settings1 == settings2); +// settings2.setCodec("codec2"); +// QVERIFY(settings1 != settings2); + +// settings1 = QVideoEncoderSettings(); +// settings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); +// settings2 = QVideoEncoderSettings(); +// settings2.setEncodingMode(QMultimedia::ConstantBitRateEncoding); +// QVERIFY(settings1 == settings2); +// settings2.setEncodingMode(QMultimedia::TwoPassEncoding); +// QVERIFY(settings1 != settings2); + +// settings1 = QVideoEncoderSettings(); +// settings1.setQuality(QMultimedia::NormalQuality); +// settings2 = QVideoEncoderSettings(); +// settings2.setQuality(QMultimedia::NormalQuality); +// QVERIFY(settings1 == settings2); +// settings2.setQuality(QMultimedia::LowQuality); +// QVERIFY(settings1 != settings2); + +// settings1 = QVideoEncoderSettings(); +// settings1.setFrameRate(1); +// settings2 = QVideoEncoderSettings(); +// settings2.setFrameRate(1); +// QVERIFY(settings1 == settings2); +// settings2.setFrameRate(2); +// QVERIFY(settings1 != settings2); + +// settings1 = QVideoEncoderSettings(); +// settings1.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); +// settings2 = QVideoEncoderSettings(); +// settings2.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); +// QVERIFY(settings1 == settings2); +// settings2.setEncodingOption(QLatin1String("encoderOption"), QVariant(2)); +// QVERIFY(settings1 != settings2); } void tst_QMediaRecorder::testSettingsApplied() { - MockMediaSource object(nullptr, service); +// MockMediaSource object(nullptr, service); - //if the media recorder is not configured after construction - //the settings are applied in the next event loop - QMediaRecorder recorder(&object); - QCOMPARE(mock->m_settingAppliedCount, 0); - QTRY_COMPARE(mock->m_settingAppliedCount, 1); +// //if the media recorder is not configured after construction +// //the settings are applied in the next event loop +// QMediaRecorder recorder(&object); +// QCOMPARE(mock->m_settingAppliedCount, 0); +// QTRY_COMPARE(mock->m_settingAppliedCount, 1); - QVideoEncoderSettings videoSettings; - videoSettings.setResolution(640,480); - recorder.setVideoSettings(videoSettings); +// QVideoEncoderSettings videoSettings; +// videoSettings.setResolution(640,480); +// recorder.setVideoSettings(videoSettings); - QAudioEncoderSettings audioSettings; - audioSettings.setQuality(QMultimedia::HighQuality); - recorder.setAudioSettings(audioSettings); +// QAudioEncoderSettings audioSettings; +// audioSettings.setQuality(QMultimedia::HighQuality); +// recorder.setAudioSettings(audioSettings); - recorder.setContainerFormat("mkv"); +// recorder.setContainerFormat("mkv"); - QCOMPARE(mock->m_settingAppliedCount, 1); - QTRY_COMPARE(mock->m_settingAppliedCount, 2); +// QCOMPARE(mock->m_settingAppliedCount, 1); +// QTRY_COMPARE(mock->m_settingAppliedCount, 2); - //encoder settings are applied before recording if changed - audioSettings.setQuality(QMultimedia::VeryHighQuality); - recorder.setAudioSettings(audioSettings); +// //encoder settings are applied before recording if changed +// audioSettings.setQuality(QMultimedia::VeryHighQuality); +// recorder.setAudioSettings(audioSettings); - QCOMPARE(mock->m_settingAppliedCount, 2); - recorder.record(); - QCOMPARE(mock->m_settingAppliedCount, 3); +// QCOMPARE(mock->m_settingAppliedCount, 2); +// recorder.record(); +// QCOMPARE(mock->m_settingAppliedCount, 3); - recorder.stop(); +// recorder.stop(); - //applySettings is not called if setting has not changes - recorder.record(); - QCOMPARE(mock->m_settingAppliedCount, 3); +// //applySettings is not called if setting has not changes +// recorder.record(); +// QCOMPARE(mock->m_settingAppliedCount, 3); } void tst_QMediaRecorder::nullMetaDataControl() @@ -969,135 +894,135 @@ void tst_QMediaRecorder::setMetaData() void tst_QMediaRecorder::testAudioSettingsCopyConstructor() { /* create an object for AudioEncodersettings */ - QAudioEncoderSettings audiosettings; - QVERIFY(audiosettings.isNull()); - - /* setting the desired properties for the AudioEncoder */ - audiosettings.setBitRate(128*1000); - audiosettings.setChannelCount(4); - audiosettings.setCodec("audio/x-raw"); - audiosettings.setEncodingMode(QMultimedia::ConstantBitRateEncoding); - audiosettings.setQuality(QMultimedia::LowQuality); - audiosettings.setSampleRate(44100); - - /* Copy constructor */ - QAudioEncoderSettings other(audiosettings); - QVERIFY(!(other.isNull())); - - /* Verifying whether data is copied properly or not */ - QVERIFY(other.bitRate() == audiosettings.bitRate()); - QVERIFY(other.sampleRate() == audiosettings.sampleRate()); - QVERIFY(other.channelCount() == audiosettings.channelCount()); - QCOMPARE(other.codec(), audiosettings.codec()); - QVERIFY(other.encodingMode() == audiosettings.encodingMode()); - QVERIFY(other.quality() == audiosettings.quality()); +// QAudioEncoderSettings audiosettings; +// QVERIFY(audiosettings.isNull()); + +// /* setting the desired properties for the AudioEncoder */ +// audiosettings.setBitRate(128*1000); +// audiosettings.setChannelCount(4); +// audiosettings.setCodec("audio/x-raw"); +// audiosettings.setEncodingMode(QMultimedia::ConstantBitRateEncoding); +// audiosettings.setQuality(QMultimedia::LowQuality); +// audiosettings.setSampleRate(44100); + +// /* Copy constructor */ +// QAudioEncoderSettings other(audiosettings); +// QVERIFY(!(other.isNull())); + +// /* Verifying whether data is copied properly or not */ +// QVERIFY(other.bitRate() == audiosettings.bitRate()); +// QVERIFY(other.sampleRate() == audiosettings.sampleRate()); +// QVERIFY(other.channelCount() == audiosettings.channelCount()); +// QCOMPARE(other.codec(), audiosettings.codec()); +// QVERIFY(other.encodingMode() == audiosettings.encodingMode()); +// QVERIFY(other.quality() == audiosettings.quality()); } void tst_QMediaRecorder::testAudioSettingsOperatorNotEqual() { /* create an object for AudioEncodersettings */ - QAudioEncoderSettings audiosettings1; - QVERIFY(audiosettings1.isNull()); - - QAudioEncoderSettings audiosettings2; - QVERIFY(audiosettings2.isNull()); - - /* setting the desired properties to for the AudioEncoder */ - audiosettings1.setBitRate(128*1000); - audiosettings1.setChannelCount(4); - audiosettings1.setCodec("audio/x-raw"); - audiosettings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); - audiosettings1.setQuality(QMultimedia::LowQuality); - audiosettings1.setSampleRate(44100); - - /* setting the desired properties for the AudioEncoder */ - audiosettings2.setBitRate(128*1000); - audiosettings2.setChannelCount(4); - audiosettings2.setCodec("audio/x-raw"); - audiosettings2.setEncodingMode(QMultimedia::ConstantBitRateEncoding); - audiosettings2.setQuality(QMultimedia::LowQuality); - audiosettings2.setSampleRate(44100); - - /* verify the both are equal or not */ - QVERIFY(!(audiosettings1 != audiosettings2)); - - /* Modify the settings value for one object */ - audiosettings2.setBitRate(64*1000); - audiosettings2.setEncodingMode(QMultimedia::ConstantQualityEncoding); - - /* verify the not equal opertor */ - QVERIFY(audiosettings1 != audiosettings2); - - QVERIFY(audiosettings2.bitRate() != audiosettings1.bitRate()); - QVERIFY(audiosettings2.encodingMode() != audiosettings1.encodingMode()); +// QAudioEncoderSettings audiosettings1; +// QVERIFY(audiosettings1.isNull()); + +// QAudioEncoderSettings audiosettings2; +// QVERIFY(audiosettings2.isNull()); + +// /* setting the desired properties to for the AudioEncoder */ +// audiosettings1.setBitRate(128*1000); +// audiosettings1.setChannelCount(4); +// audiosettings1.setCodec("audio/x-raw"); +// audiosettings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); +// audiosettings1.setQuality(QMultimedia::LowQuality); +// audiosettings1.setSampleRate(44100); + +// /* setting the desired properties for the AudioEncoder */ +// audiosettings2.setBitRate(128*1000); +// audiosettings2.setChannelCount(4); +// audiosettings2.setCodec("audio/x-raw"); +// audiosettings2.setEncodingMode(QMultimedia::ConstantBitRateEncoding); +// audiosettings2.setQuality(QMultimedia::LowQuality); +// audiosettings2.setSampleRate(44100); + +// /* verify the both are equal or not */ +// QVERIFY(!(audiosettings1 != audiosettings2)); + +// /* Modify the settings value for one object */ +// audiosettings2.setBitRate(64*1000); +// audiosettings2.setEncodingMode(QMultimedia::ConstantQualityEncoding); + +// /* verify the not equal opertor */ +// QVERIFY(audiosettings1 != audiosettings2); + +// QVERIFY(audiosettings2.bitRate() != audiosettings1.bitRate()); +// QVERIFY(audiosettings2.encodingMode() != audiosettings1.encodingMode()); } void tst_QMediaRecorder::testAudioSettingsOperatorEqual() { /* create an object for AudioEncodersettings */ - QAudioEncoderSettings audiosettings1; - QVERIFY(audiosettings1.isNull()); - - /* setting the desired properties to for the AudioEncoder */ - audiosettings1.setBitRate(128*1000); - audiosettings1.setChannelCount(4); - audiosettings1.setCodec("audio/x-raw"); - audiosettings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); - audiosettings1.setQuality(QMultimedia::LowQuality); - audiosettings1.setSampleRate(44100); - - QAudioEncoderSettings audiosettings2; - QVERIFY(audiosettings2.isNull()); - - /* setting the desired properties for the AudioEncoder */ - audiosettings2.setBitRate(128*1000); - audiosettings2.setChannelCount(4); - audiosettings2.setCodec("audio/x-raw"); - audiosettings2.setEncodingMode(QMultimedia::ConstantBitRateEncoding); - audiosettings2.setQuality(QMultimedia::LowQuality); - audiosettings2.setSampleRate(44100); - - /* verify both the values are same or not */ - QVERIFY(audiosettings1 == audiosettings2); - audiosettings2.setChannelCount(2); - QVERIFY(audiosettings1 != audiosettings2); +// QAudioEncoderSettings audiosettings1; +// QVERIFY(audiosettings1.isNull()); + +// /* setting the desired properties to for the AudioEncoder */ +// audiosettings1.setBitRate(128*1000); +// audiosettings1.setChannelCount(4); +// audiosettings1.setCodec("audio/x-raw"); +// audiosettings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); +// audiosettings1.setQuality(QMultimedia::LowQuality); +// audiosettings1.setSampleRate(44100); + +// QAudioEncoderSettings audiosettings2; +// QVERIFY(audiosettings2.isNull()); + +// /* setting the desired properties for the AudioEncoder */ +// audiosettings2.setBitRate(128*1000); +// audiosettings2.setChannelCount(4); +// audiosettings2.setCodec("audio/x-raw"); +// audiosettings2.setEncodingMode(QMultimedia::ConstantBitRateEncoding); +// audiosettings2.setQuality(QMultimedia::LowQuality); +// audiosettings2.setSampleRate(44100); + +// /* verify both the values are same or not */ +// QVERIFY(audiosettings1 == audiosettings2); +// audiosettings2.setChannelCount(2); +// QVERIFY(audiosettings1 != audiosettings2); } void tst_QMediaRecorder::testAudioSettingsOperatorAssign() { /* create an object for AudioEncodersettings */ - QAudioEncoderSettings audiosettings1; - QVERIFY(audiosettings1.isNull()); - - /* setting the desired properties for the AudioEncoder */ - audiosettings1.setBitRate(128*1000); - audiosettings1.setChannelCount(4); - audiosettings1.setCodec("audio/x-raw"); - audiosettings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); - audiosettings1.setQuality(QMultimedia::LowQuality); - audiosettings1.setSampleRate(44100); - - QAudioEncoderSettings audiosettings2; - audiosettings2 = audiosettings1; - /* Verifying whether data is copied properly or not */ - QVERIFY(audiosettings2.bitRate() == audiosettings1.bitRate()); - QVERIFY(audiosettings2.sampleRate() == audiosettings1.sampleRate()); - QVERIFY(audiosettings2.channelCount() == audiosettings1.channelCount()); - QCOMPARE(audiosettings2.codec(), audiosettings1.codec()); - QVERIFY(audiosettings2.encodingMode() == audiosettings1.encodingMode()); - QVERIFY(audiosettings2.quality() == audiosettings1.quality()); +// QAudioEncoderSettings audiosettings1; +// QVERIFY(audiosettings1.isNull()); + +// /* setting the desired properties for the AudioEncoder */ +// audiosettings1.setBitRate(128*1000); +// audiosettings1.setChannelCount(4); +// audiosettings1.setCodec("audio/x-raw"); +// audiosettings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); +// audiosettings1.setQuality(QMultimedia::LowQuality); +// audiosettings1.setSampleRate(44100); + +// QAudioEncoderSettings audiosettings2; +// audiosettings2 = audiosettings1; +// /* Verifying whether data is copied properly or not */ +// QVERIFY(audiosettings2.bitRate() == audiosettings1.bitRate()); +// QVERIFY(audiosettings2.sampleRate() == audiosettings1.sampleRate()); +// QVERIFY(audiosettings2.channelCount() == audiosettings1.channelCount()); +// QCOMPARE(audiosettings2.codec(), audiosettings1.codec()); +// QVERIFY(audiosettings2.encodingMode() == audiosettings1.encodingMode()); +// QVERIFY(audiosettings2.quality() == audiosettings1.quality()); } void tst_QMediaRecorder::testAudioSettingsDestructor() { /* Creating null object for the audioencodersettings */ - QAudioEncoderSettings * audiosettings = new QAudioEncoderSettings; +// QAudioEncoderSettings * audiosettings = new QAudioEncoderSettings; - /* Verifying the object is null or not */ - QVERIFY(audiosettings->isNull()); - /* delete the allocated memory */ - delete audiosettings; +// /* Verifying the object is null or not */ +// QVERIFY(audiosettings->isNull()); +// /* delete the allocated memory */ +// delete audiosettings; } /* availability() API test. */ @@ -1180,269 +1105,269 @@ void tst_QMediaRecorder::testEnum() /* Test the QVideoEncoderSettings quality API*/ void tst_QMediaRecorder::testVideoSettingsQuality() { - /* Create the instance*/ - QVideoEncoderSettings settings; - QVERIFY(settings.isNull()); - QVERIFY(settings == QVideoEncoderSettings()); +// /* Create the instance*/ +// QVideoEncoderSettings settings; +// QVERIFY(settings.isNull()); +// QVERIFY(settings == QVideoEncoderSettings()); - /* Verify the default value is intialised correctly*/ - QCOMPARE(settings.quality(), QMultimedia::NormalQuality); +// /* Verify the default value is intialised correctly*/ +// QCOMPARE(settings.quality(), QMultimedia::NormalQuality); - /* Set all types of Quality parameter and Verify if it is set correctly*/ - settings.setQuality(QMultimedia::HighQuality); - QCOMPARE(settings.quality(), QMultimedia::HighQuality); - QVERIFY(!settings.isNull()); +// /* Set all types of Quality parameter and Verify if it is set correctly*/ +// settings.setQuality(QMultimedia::HighQuality); +// QCOMPARE(settings.quality(), QMultimedia::HighQuality); +// QVERIFY(!settings.isNull()); - settings.setQuality(QMultimedia::VeryLowQuality); - QCOMPARE(settings.quality(), QMultimedia::VeryLowQuality); +// settings.setQuality(QMultimedia::VeryLowQuality); +// QCOMPARE(settings.quality(), QMultimedia::VeryLowQuality); - settings.setQuality(QMultimedia::LowQuality); - QCOMPARE(settings.quality(), QMultimedia::LowQuality); +// settings.setQuality(QMultimedia::LowQuality); +// QCOMPARE(settings.quality(), QMultimedia::LowQuality); - settings.setQuality(QMultimedia::VeryHighQuality); - QCOMPARE(settings.quality(), QMultimedia::VeryHighQuality); +// settings.setQuality(QMultimedia::VeryHighQuality); +// QCOMPARE(settings.quality(), QMultimedia::VeryHighQuality); } /* Test QVideoEncoderSettings encodingMode */ void tst_QMediaRecorder::testVideoSettingsEncodingMode() { - /* Create the instance*/ - QVideoEncoderSettings settings; - QVERIFY(settings.isNull()); - QVERIFY(settings == QVideoEncoderSettings()); +// /* Create the instance*/ +// QVideoEncoderSettings settings; +// QVERIFY(settings.isNull()); +// QVERIFY(settings == QVideoEncoderSettings()); - /* Verify the default values are initialised correctly*/ - QCOMPARE(settings.encodingMode(), QMultimedia::ConstantQualityEncoding); - QVERIFY(settings.isNull()); +// /* Verify the default values are initialised correctly*/ +// QCOMPARE(settings.encodingMode(), QMultimedia::ConstantQualityEncoding); +// QVERIFY(settings.isNull()); - /* Set each type of encoding mode and Verify if it is set correctly*/ - settings.setEncodingMode(QMultimedia::ConstantBitRateEncoding); - QCOMPARE(settings.encodingMode(),QMultimedia::ConstantBitRateEncoding); - QVERIFY(!settings.isNull()); +// /* Set each type of encoding mode and Verify if it is set correctly*/ +// settings.setEncodingMode(QMultimedia::ConstantBitRateEncoding); +// QCOMPARE(settings.encodingMode(),QMultimedia::ConstantBitRateEncoding); +// QVERIFY(!settings.isNull()); - settings.setEncodingMode(QMultimedia::AverageBitRateEncoding); - QCOMPARE(settings.encodingMode(), QMultimedia::AverageBitRateEncoding); +// settings.setEncodingMode(QMultimedia::AverageBitRateEncoding); +// QCOMPARE(settings.encodingMode(), QMultimedia::AverageBitRateEncoding); - settings.setEncodingMode(QMultimedia::TwoPassEncoding); - QCOMPARE(settings.encodingMode(), QMultimedia::TwoPassEncoding); +// settings.setEncodingMode(QMultimedia::TwoPassEncoding); +// QCOMPARE(settings.encodingMode(), QMultimedia::TwoPassEncoding); } /* Test QVideoEncoderSettings copy constructor */ void tst_QMediaRecorder::testVideoSettingsCopyConstructor() { - /* Create the instance and initialise it*/ - QVideoEncoderSettings settings1; - settings1.setCodec(QLatin1String("codecName")); - settings1.setBitRate(128000); - settings1.setQuality(QMultimedia::HighQuality); - settings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); - settings1.setFrameRate(30000.0/10001); - settings1.setResolution(QSize(320,240)); - - /* Create another instance with instance1 as argument*/ - QVideoEncoderSettings settings2(settings1); - - /* Verify if all the parameters are copied correctly*/ - QCOMPARE(settings2 != settings1, false); - QCOMPARE(settings2.codec(), QLatin1String("codecName")); - QCOMPARE(settings2.bitRate(), 128000); - QCOMPARE(settings2.encodingMode(), QMultimedia::ConstantBitRateEncoding); - QVERIFY(qFuzzyCompare(settings2.frameRate(), qreal(30000.0/10001))); - QCOMPARE(settings2.resolution(), QSize(320,240)); - QCOMPARE(settings2.quality(), QMultimedia::HighQuality); - - /* Verify both the instances are equal*/ - QCOMPARE(settings2, settings1); - QVERIFY(!settings2.isNull()); +// /* Create the instance and initialise it*/ +// QVideoEncoderSettings settings1; +// settings1.setCodec(QLatin1String("codecName")); +// settings1.setBitRate(128000); +// settings1.setQuality(QMultimedia::HighQuality); +// settings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); +// settings1.setFrameRate(30000.0/10001); +// settings1.setResolution(QSize(320,240)); + +// /* Create another instance with instance1 as argument*/ +// QVideoEncoderSettings settings2(settings1); + +// /* Verify if all the parameters are copied correctly*/ +// QCOMPARE(settings2 != settings1, false); +// QCOMPARE(settings2.codec(), QLatin1String("codecName")); +// QCOMPARE(settings2.bitRate(), 128000); +// QCOMPARE(settings2.encodingMode(), QMultimedia::ConstantBitRateEncoding); +// QVERIFY(qFuzzyCompare(settings2.frameRate(), qreal(30000.0/10001))); +// QCOMPARE(settings2.resolution(), QSize(320,240)); +// QCOMPARE(settings2.quality(), QMultimedia::HighQuality); + +// /* Verify both the instances are equal*/ +// QCOMPARE(settings2, settings1); +// QVERIFY(!settings2.isNull()); } /* Test QVideoEncoderSettings Overloaded Operator assignment*/ void tst_QMediaRecorder::testVideoSettingsOperatorAssignment() { - /* Create two instances.*/ - QVideoEncoderSettings settings1; - QVideoEncoderSettings settings2; - QCOMPARE(settings2, settings1); - QVERIFY(settings2.isNull()); - - /* Initialize all the parameters */ - settings1.setCodec(QLatin1String("codecName")); - settings1.setBitRate(128000); - settings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); - settings1.setFrameRate(30000.0/10001); - settings1.setResolution(QSize(320,240)); - settings1.setQuality(QMultimedia::HighQuality); - /* Assign one object to other*/ - settings2 = settings1; - - /* Verify all the parameters are copied correctly*/ - QCOMPARE(settings2, settings1); - QCOMPARE(settings2.codec(), QLatin1String("codecName")); - QCOMPARE(settings2.bitRate(), 128000); - QCOMPARE(settings2.encodingMode(), QMultimedia::ConstantBitRateEncoding); - QVERIFY(qFuzzyCompare(settings2.frameRate(), qreal(30000.0/10001))); - QCOMPARE(settings2.resolution(), QSize(320,240)); - QCOMPARE(settings2.quality(), QMultimedia::HighQuality); - QCOMPARE(settings2, settings1); - QVERIFY(!settings2.isNull()); +// /* Create two instances.*/ +// QVideoEncoderSettings settings1; +// QVideoEncoderSettings settings2; +// QCOMPARE(settings2, settings1); +// QVERIFY(settings2.isNull()); + +// /* Initialize all the parameters */ +// settings1.setCodec(QLatin1String("codecName")); +// settings1.setBitRate(128000); +// settings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); +// settings1.setFrameRate(30000.0/10001); +// settings1.setResolution(QSize(320,240)); +// settings1.setQuality(QMultimedia::HighQuality); +// /* Assign one object to other*/ +// settings2 = settings1; + +// /* Verify all the parameters are copied correctly*/ +// QCOMPARE(settings2, settings1); +// QCOMPARE(settings2.codec(), QLatin1String("codecName")); +// QCOMPARE(settings2.bitRate(), 128000); +// QCOMPARE(settings2.encodingMode(), QMultimedia::ConstantBitRateEncoding); +// QVERIFY(qFuzzyCompare(settings2.frameRate(), qreal(30000.0/10001))); +// QCOMPARE(settings2.resolution(), QSize(320,240)); +// QCOMPARE(settings2.quality(), QMultimedia::HighQuality); +// QCOMPARE(settings2, settings1); +// QVERIFY(!settings2.isNull()); } /* Test QVideoEncoderSettings Overloaded OperatorNotEqual*/ void tst_QMediaRecorder::testVideoSettingsOperatorNotEqual() { - /* Create the instance and set the bit rate and Verify objects with OperatorNotEqual*/ - QVideoEncoderSettings settings1; - settings1.setBitRate(1); - QVideoEncoderSettings settings2; - settings2.setBitRate(1); - /* OperatorNotEqual returns false when both objects are equal*/ - QCOMPARE(settings1 != settings2, false); - settings2.setBitRate(2); - /* OperatorNotEqual returns true when both objects are not equal*/ - QVERIFY(settings1 != settings2); - - /* Verify Resolution with not equal operator*/ - settings1 = QVideoEncoderSettings(); - settings1.setResolution(800,600); - settings2 = QVideoEncoderSettings(); - settings2.setResolution(QSize(800,600)); - /* OperatorNotEqual returns false when both objects are equal*/ - QCOMPARE(settings1 != settings2, false); - settings2.setResolution(QSize(400,300)); - /* OperatorNotEqual returns true when both objects are not equal*/ - QVERIFY(settings1 != settings2); - - /* Verify Codec with not equal operator*/ - settings1 = QVideoEncoderSettings(); - settings1.setCodec("codec1"); - settings2 = QVideoEncoderSettings(); - settings2.setCodec("codec1"); - /* OperatorNotEqual returns false when both objects are equal*/ - QCOMPARE(settings1 != settings2, false); - settings2.setCodec("codec2"); - /* OperatorNotEqual returns true when both objects are not equal*/ - QVERIFY(settings1 != settings2); - - /* Verify EncodingMode with not equal operator*/ - settings1 = QVideoEncoderSettings(); - settings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); - settings2 = QVideoEncoderSettings(); - settings2.setEncodingMode(QMultimedia::ConstantBitRateEncoding); - /* OperatorNotEqual returns false when both objects are equal*/ - QCOMPARE(settings1 != settings2, false); - settings2.setEncodingMode(QMultimedia::TwoPassEncoding); - /* OperatorNotEqual returns true when both objects are not equal*/ - QVERIFY(settings1 != settings2); - - /* Verify Quality with not equal operator*/ - settings1 = QVideoEncoderSettings(); - settings1.setQuality(QMultimedia::NormalQuality); - settings2 = QVideoEncoderSettings(); - settings2.setQuality(QMultimedia::NormalQuality); - /* OperatorNotEqual returns false when both objects are equal*/ - QCOMPARE(settings1 != settings2, false); - settings2.setQuality(QMultimedia::LowQuality); - /* OperatorNotEqual returns true when both objects are not equal*/ - QVERIFY(settings1 != settings2); - - /* Verify FrameRate with not equal operator*/ - settings1 = QVideoEncoderSettings(); - settings1.setFrameRate(1); - settings2 = QVideoEncoderSettings(); - settings2.setFrameRate(1); - /* OperatorNotEqual returns false when both objects are equal*/ - QCOMPARE(settings1 != settings2, false); - settings2.setFrameRate(2); - /* OperatorNotEqual returns true when both objects are not equal*/ - QVERIFY(settings1 != settings2); +// /* Create the instance and set the bit rate and Verify objects with OperatorNotEqual*/ +// QVideoEncoderSettings settings1; +// settings1.setBitRate(1); +// QVideoEncoderSettings settings2; +// settings2.setBitRate(1); +// /* OperatorNotEqual returns false when both objects are equal*/ +// QCOMPARE(settings1 != settings2, false); +// settings2.setBitRate(2); +// /* OperatorNotEqual returns true when both objects are not equal*/ +// QVERIFY(settings1 != settings2); + +// /* Verify Resolution with not equal operator*/ +// settings1 = QVideoEncoderSettings(); +// settings1.setResolution(800,600); +// settings2 = QVideoEncoderSettings(); +// settings2.setResolution(QSize(800,600)); +// /* OperatorNotEqual returns false when both objects are equal*/ +// QCOMPARE(settings1 != settings2, false); +// settings2.setResolution(QSize(400,300)); +// /* OperatorNotEqual returns true when both objects are not equal*/ +// QVERIFY(settings1 != settings2); + +// /* Verify Codec with not equal operator*/ +// settings1 = QVideoEncoderSettings(); +// settings1.setCodec("codec1"); +// settings2 = QVideoEncoderSettings(); +// settings2.setCodec("codec1"); +// /* OperatorNotEqual returns false when both objects are equal*/ +// QCOMPARE(settings1 != settings2, false); +// settings2.setCodec("codec2"); +// /* OperatorNotEqual returns true when both objects are not equal*/ +// QVERIFY(settings1 != settings2); + +// /* Verify EncodingMode with not equal operator*/ +// settings1 = QVideoEncoderSettings(); +// settings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); +// settings2 = QVideoEncoderSettings(); +// settings2.setEncodingMode(QMultimedia::ConstantBitRateEncoding); +// /* OperatorNotEqual returns false when both objects are equal*/ +// QCOMPARE(settings1 != settings2, false); +// settings2.setEncodingMode(QMultimedia::TwoPassEncoding); +// /* OperatorNotEqual returns true when both objects are not equal*/ +// QVERIFY(settings1 != settings2); + +// /* Verify Quality with not equal operator*/ +// settings1 = QVideoEncoderSettings(); +// settings1.setQuality(QMultimedia::NormalQuality); +// settings2 = QVideoEncoderSettings(); +// settings2.setQuality(QMultimedia::NormalQuality); +// /* OperatorNotEqual returns false when both objects are equal*/ +// QCOMPARE(settings1 != settings2, false); +// settings2.setQuality(QMultimedia::LowQuality); +// /* OperatorNotEqual returns true when both objects are not equal*/ +// QVERIFY(settings1 != settings2); + +// /* Verify FrameRate with not equal operator*/ +// settings1 = QVideoEncoderSettings(); +// settings1.setFrameRate(1); +// settings2 = QVideoEncoderSettings(); +// settings2.setFrameRate(1); +// /* OperatorNotEqual returns false when both objects are equal*/ +// QCOMPARE(settings1 != settings2, false); +// settings2.setFrameRate(2); +// /* OperatorNotEqual returns true when both objects are not equal*/ +// QVERIFY(settings1 != settings2); } /* Test QVideoEncoderSettings Overloaded comparison operator*/ void tst_QMediaRecorder::testVideoSettingsOperatorComparison() { - /* Create the instance and set the bit rate and Verify objects with comparison operator*/ - QVideoEncoderSettings settings1; - settings1.setBitRate(1); - QVideoEncoderSettings settings2; - settings2.setBitRate(1); - - /* Comparison operator returns true when both objects are equal*/ - QVERIFY(settings1 == settings2); - settings2.setBitRate(2); - /* Comparison operator returns false when both objects are not equal*/ - QCOMPARE(settings1 == settings2, false); - - /* Verify resolution with comparison operator*/ - settings1 = QVideoEncoderSettings(); - settings1.setResolution(800,600); - settings2 = QVideoEncoderSettings(); - settings2.setResolution(QSize(800,600)); - /* Comparison operator returns true when both objects are equal*/ - QVERIFY(settings1 == settings2); - settings2.setResolution(QSize(400,300)); - /* Comparison operator returns false when both objects are not equal*/ - QCOMPARE(settings1 == settings2, false); - - /* Verify Codec with comparison operator*/ - settings1 = QVideoEncoderSettings(); - settings1.setCodec("codec1"); - settings2 = QVideoEncoderSettings(); - settings2.setCodec("codec1"); - /* Comparison operator returns true when both objects are equal*/ - QVERIFY(settings1 == settings2); - settings2.setCodec("codec2"); - /* Comparison operator returns false when both objects are not equal*/ - QCOMPARE(settings1 == settings2, false); - - /* Verify EncodingMode with comparison operator*/ - settings1 = QVideoEncoderSettings(); - settings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); - settings2 = QVideoEncoderSettings(); - settings2.setEncodingMode(QMultimedia::ConstantBitRateEncoding); - /* Comparison operator returns true when both objects are equal*/ - QVERIFY(settings1 == settings2); - settings2.setEncodingMode(QMultimedia::TwoPassEncoding); - /* Comparison operator returns false when both objects are not equal*/ - QCOMPARE(settings1 == settings2, false); - - /* Verify Quality with comparison operator*/ - settings1 = QVideoEncoderSettings(); - settings1.setQuality(QMultimedia::NormalQuality); - settings2 = QVideoEncoderSettings(); - settings2.setQuality(QMultimedia::NormalQuality); - /* Comparison operator returns true when both objects are equal*/ - QVERIFY(settings1 == settings2); - settings2.setQuality(QMultimedia::LowQuality); - /* Comparison operator returns false when both objects are not equal*/ - QCOMPARE(settings1 == settings2, false); - - /* Verify FrameRate with comparison operator*/ - settings1 = QVideoEncoderSettings(); - settings1.setFrameRate(1); - settings2 = QVideoEncoderSettings(); - settings2.setFrameRate(1); - /* Comparison operator returns true when both objects are equal*/ - QVERIFY(settings1 == settings2); - settings2.setFrameRate(2); - /* Comparison operator returns false when both objects are not equal*/ - QCOMPARE(settings1 == settings2, false); +// /* Create the instance and set the bit rate and Verify objects with comparison operator*/ +// QVideoEncoderSettings settings1; +// settings1.setBitRate(1); +// QVideoEncoderSettings settings2; +// settings2.setBitRate(1); + +// /* Comparison operator returns true when both objects are equal*/ +// QVERIFY(settings1 == settings2); +// settings2.setBitRate(2); +// /* Comparison operator returns false when both objects are not equal*/ +// QCOMPARE(settings1 == settings2, false); + +// /* Verify resolution with comparison operator*/ +// settings1 = QVideoEncoderSettings(); +// settings1.setResolution(800,600); +// settings2 = QVideoEncoderSettings(); +// settings2.setResolution(QSize(800,600)); +// /* Comparison operator returns true when both objects are equal*/ +// QVERIFY(settings1 == settings2); +// settings2.setResolution(QSize(400,300)); +// /* Comparison operator returns false when both objects are not equal*/ +// QCOMPARE(settings1 == settings2, false); + +// /* Verify Codec with comparison operator*/ +// settings1 = QVideoEncoderSettings(); +// settings1.setCodec("codec1"); +// settings2 = QVideoEncoderSettings(); +// settings2.setCodec("codec1"); +// /* Comparison operator returns true when both objects are equal*/ +// QVERIFY(settings1 == settings2); +// settings2.setCodec("codec2"); +// /* Comparison operator returns false when both objects are not equal*/ +// QCOMPARE(settings1 == settings2, false); + +// /* Verify EncodingMode with comparison operator*/ +// settings1 = QVideoEncoderSettings(); +// settings1.setEncodingMode(QMultimedia::ConstantBitRateEncoding); +// settings2 = QVideoEncoderSettings(); +// settings2.setEncodingMode(QMultimedia::ConstantBitRateEncoding); +// /* Comparison operator returns true when both objects are equal*/ +// QVERIFY(settings1 == settings2); +// settings2.setEncodingMode(QMultimedia::TwoPassEncoding); +// /* Comparison operator returns false when both objects are not equal*/ +// QCOMPARE(settings1 == settings2, false); + +// /* Verify Quality with comparison operator*/ +// settings1 = QVideoEncoderSettings(); +// settings1.setQuality(QMultimedia::NormalQuality); +// settings2 = QVideoEncoderSettings(); +// settings2.setQuality(QMultimedia::NormalQuality); +// /* Comparison operator returns true when both objects are equal*/ +// QVERIFY(settings1 == settings2); +// settings2.setQuality(QMultimedia::LowQuality); +// /* Comparison operator returns false when both objects are not equal*/ +// QCOMPARE(settings1 == settings2, false); + +// /* Verify FrameRate with comparison operator*/ +// settings1 = QVideoEncoderSettings(); +// settings1.setFrameRate(1); +// settings2 = QVideoEncoderSettings(); +// settings2.setFrameRate(1); +// /* Comparison operator returns true when both objects are equal*/ +// QVERIFY(settings1 == settings2); +// settings2.setFrameRate(2); +// /* Comparison operator returns false when both objects are not equal*/ +// QCOMPARE(settings1 == settings2, false); } /* Test the destuctor of the QVideoEncoderSettings*/ void tst_QMediaRecorder::testVideoSettingsDestructor() { - /* Create the instance on heap and verify if object deleted correctly*/ - QVideoEncoderSettings *settings1 = new QVideoEncoderSettings(); - QVERIFY(settings1 != nullptr); - QVERIFY(settings1->isNull()); - delete settings1; - - /* Create the instance on heap and initialise it and verify if object deleted correctly.*/ - QVideoEncoderSettings *settings2 = new QVideoEncoderSettings(); - QVERIFY(settings2 != nullptr); - settings2->setCodec(QString("codec")); - QVERIFY(!settings2->isNull()); - delete settings2; +// /* Create the instance on heap and verify if object deleted correctly*/ +// QVideoEncoderSettings *settings1 = new QVideoEncoderSettings(); +// QVERIFY(settings1 != nullptr); +// QVERIFY(settings1->isNull()); +// delete settings1; + +// /* Create the instance on heap and initialise it and verify if object deleted correctly.*/ +// QVideoEncoderSettings *settings2 = new QVideoEncoderSettings(); +// QVERIFY(settings2 != nullptr); +// settings2->setCodec(QString("codec")); +// QVERIFY(!settings2->isNull()); +// delete settings2; } QTEST_GUILESS_MAIN(tst_QMediaRecorder) diff --git a/tests/auto/unit/multimedia/qmediasink/tst_qmediasink.cpp b/tests/auto/unit/multimedia/qmediasink/tst_qmediasink.cpp index ea99964da..00cf54be9 100644 --- a/tests/auto/unit/multimedia/qmediasink/tst_qmediasink.cpp +++ b/tests/auto/unit/multimedia/qmediasink/tst_qmediasink.cpp @@ -35,12 +35,8 @@ #include <qmediarecordercontrol.h> #include <qmediarecorder.h> #include <qmetadatawritercontrol.h> -#include <qaudioencodersettingscontrol.h> -#include <qmediacontainercontrol.h> -#include <qvideoencodersettingscontrol.h> #include <qaudioformat.h> -#include "mockmediacontainercontrol.h" #include "mockmetadatawritercontrol.h" #include "mockmediarecordercontrol.h" #include "mockmediasource.h" @@ -56,7 +52,6 @@ public: mockControl(control), hasControls(true) { - mockContainerControl = new MockMediaContainerControl(parent); //Creating the object for Media mockMetaDataControl = new MockMetaDataWriterControl(parent); //Creating the object for MetaData } @@ -64,8 +59,6 @@ public: { if (hasControls && qstrcmp(name,QMediaRecorderControl_iid) == 0) return mockControl; - if (hasControls && qstrcmp(name,QMediaContainerControl_iid) == 0) - return mockContainerControl; if (hasControls && qstrcmp(name, QMetaDataWriterControl_iid) == 0) return mockMetaDataControl; @@ -75,7 +68,6 @@ public: void releaseControl(QObject *) override {} //Initialising the objects for the media QObject *mockControl; - QMediaContainerControl *mockContainerControl; MockMetaDataWriterControl *mockMetaDataControl; bool hasControls; }; diff --git a/tests/auto/unit/multimedia/qvideoencodersettingscontrol/CMakeLists.txt b/tests/auto/unit/multimedia/qvideoencodersettingscontrol/CMakeLists.txt deleted file mode 100644 index dce65b023..000000000 --- a/tests/auto/unit/multimedia/qvideoencodersettingscontrol/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -# Generated from qvideoencodersettingscontrol.pro. - -##################################################################### -## tst_qvideoencodersettingscontrol Test: -##################################################################### - -qt_add_test(tst_qvideoencodersettingscontrol - SOURCES - tst_qvideoencodersettingscontrol.cpp - PUBLIC_LIBRARIES - Qt::Gui - Qt::MultimediaPrivate -) diff --git a/tests/auto/unit/multimedia/qvideoencodersettingscontrol/qvideoencodersettingscontrol.pro b/tests/auto/unit/multimedia/qvideoencodersettingscontrol/qvideoencodersettingscontrol.pro deleted file mode 100644 index 7b7ef7679..000000000 --- a/tests/auto/unit/multimedia/qvideoencodersettingscontrol/qvideoencodersettingscontrol.pro +++ /dev/null @@ -1,8 +0,0 @@ -CONFIG += testcase -TARGET = tst_qvideoencodersettingscontrol - -QT += multimedia-private testlib - -SOURCES += \ - tst_qvideoencodersettingscontrol.cpp - diff --git a/tests/auto/unit/multimedia/qvideoencodersettingscontrol/tst_qvideoencodersettingscontrol.cpp b/tests/auto/unit/multimedia/qvideoencodersettingscontrol/tst_qvideoencodersettingscontrol.cpp deleted file mode 100644 index cae624135..000000000 --- a/tests/auto/unit/multimedia/qvideoencodersettingscontrol/tst_qvideoencodersettingscontrol.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/**************************************************************************** -** -** 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$ -** -****************************************************************************/ - -//TESTED_COMPONENT=src/multimedia - -#include <QtTest/QtTest> -#include "qvideoencodersettingscontrol.h" -class MyVideEncoderControl: public QVideoEncoderSettingsControl -{ - Q_OBJECT - -public: - MyVideEncoderControl(QObject *parent = nullptr ):QVideoEncoderSettingsControl(parent) - { - - } - - ~MyVideEncoderControl() override - { - - } - - [[nodiscard]] QStringList supportedVideoCodecs() const override - { - return QStringList(); - - } - - [[nodiscard]] QString videoCodecDescription(const QString &codecName) const override - { - Q_UNUSED(codecName); - return QString(); - - } - - [[nodiscard]] QVideoEncoderSettings videoSettings() const override - { - return QVideoEncoderSettings(); - } - - void setVideoSettings(const QVideoEncoderSettings &settings) override - { - Q_UNUSED(settings); - } -}; - -class tst_QVideoEncoderSettingsControl: public QObject -{ - Q_OBJECT -private slots: - void constructor(); -}; - -void tst_QVideoEncoderSettingsControl::constructor() -{ - QObject parent; - MyVideEncoderControl control(&parent); -} - -QTEST_MAIN(tst_QVideoEncoderSettingsControl) -#include "tst_qvideoencodersettingscontrol.moc" - - |