summaryrefslogtreecommitdiffstats
path: root/src/multimedia/recording
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-02-02 20:36:06 +0100
committerLars Knoll <lars.knoll@qt.io>2021-02-09 14:34:35 +0000
commitb010b331e52890b5d9be0218aa91c849adb1f63f (patch)
tree13815d4854deef4fd8e0f6867e4223324b571826 /src/multimedia/recording
parentd9fcf2ab6ac24cdba9a9ff3f0e32a39938216cee (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.cpp576
-rw-r--r--src/multimedia/recording/qmediaencodersettings.h117
-rw-r--r--src/multimedia/recording/qmediarecorder.cpp329
-rw-r--r--src/multimedia/recording/qmediarecorder.h33
-rw-r--r--src/multimedia/recording/qmediarecorder_p.h4
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);