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 /src/multimedia/recording | |
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>
Diffstat (limited to 'src/multimedia/recording')
-rw-r--r-- | src/multimedia/recording/qmediaencodersettings.cpp | 576 | ||||
-rw-r--r-- | src/multimedia/recording/qmediaencodersettings.h | 117 | ||||
-rw-r--r-- | src/multimedia/recording/qmediarecorder.cpp | 329 | ||||
-rw-r--r-- | src/multimedia/recording/qmediarecorder.h | 33 | ||||
-rw-r--r-- | src/multimedia/recording/qmediarecorder_p.h | 4 |
5 files changed, 160 insertions, 899 deletions
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); |