From 63db99a8ee1fa6430cf5f6ab3406323bd7c14850 Mon Sep 17 00:00:00 2001 From: Dmytro Poplavskiy Date: Fri, 18 May 2012 10:26:51 +1000 Subject: [PATCH] Added custom parameters to Audio/Video/ImageEncodingSettings This allows to specify more advanced and system/codec specific settings Change-Id: Ia0a2e94eaf56df285a219018e0beab895a2e7c2a Reviewed-by: Ling Hu --- .../recording/qmediaencodersettings.cpp | 175 +++++++++++++++++- .../recording/qmediaencodersettings.h | 16 ++ tests/auto/unit/qcamera/tst_qcamera.cpp | 23 +++ .../qmediarecorder/tst_qmediarecorder.cpp | 46 +++++ 4 files changed, 254 insertions(+), 6 deletions(-) diff --git a/src/multimedia/recording/qmediaencodersettings.cpp b/src/multimedia/recording/qmediaencodersettings.cpp index 309ddef9..edb72b51 100644 --- a/src/multimedia/recording/qmediaencodersettings.cpp +++ b/src/multimedia/recording/qmediaencodersettings.cpp @@ -78,7 +78,8 @@ public: bitrate(other.bitrate), sampleRate(other.sampleRate), channels(other.channels), - quality(other.quality) + quality(other.quality), + encodingOptions(other.encodingOptions) { } @@ -89,6 +90,7 @@ public: int sampleRate; int channels; QtMultimedia::EncodingQuality quality; + QVariantMap encodingOptions; private: QAudioEncoderSettingsPrivate& operator=(const QAudioEncoderSettingsPrivate &other); @@ -166,7 +168,8 @@ bool QAudioEncoderSettings::operator==(const QAudioEncoderSettings &other) const d->sampleRate == other.d->sampleRate && d->channels == other.d->channels && d->quality == other.d->quality && - d->codec == other.d->codec); + d->codec == other.d->codec && + d->encodingOptions == other.d->encodingOptions); } /*! @@ -318,6 +321,57 @@ void QAudioEncoderSettings::setQuality(QtMultimedia::EncodingQuality quality) d->quality = quality; } +/*! + Returns the value of encoding \a option. + + \sa setEncodingOption(), encodingOptions() +*/ +QVariant QAudioEncoderSettings::encodingOption(const QString &option) const +{ + return d->encodingOptions.value(option); +} + +/*! + Returns the all the encoding options as QVariantMap. + + \sa encodingOption(), setEncodingOptions() +*/ +QVariantMap QAudioEncoderSettings::encodingOptions() const +{ + return d->encodingOptions; +} + +/*! + Set the encoding \a option \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 \a encoding options. + + The supported set and meaning of encoding options are + system and selected codec specific. + + \sa encodingOption(), setEncodingOptions() +*/ +void QAudioEncoderSettings::setEncodingOptions(const QVariantMap &options) +{ + d->isNull = false; + d->encodingOptions = options; +} + class QVideoEncoderSettingsPrivate : public QSharedData { public: @@ -338,7 +392,8 @@ public: bitrate(other.bitrate), resolution(other.resolution), frameRate(other.frameRate), - quality(other.quality) + quality(other.quality), + encodingOptions(other.encodingOptions) { } @@ -349,6 +404,7 @@ public: QSize resolution; qreal frameRate; QtMultimedia::EncodingQuality quality; + QVariantMap encodingOptions; private: QVideoEncoderSettingsPrivate& operator=(const QVideoEncoderSettingsPrivate &other); @@ -420,7 +476,8 @@ bool QVideoEncoderSettings::operator==(const QVideoEncoderSettings &other) const d->quality == other.d->quality && d->codec == other.d->codec && d->resolution == other.d->resolution && - qFuzzyCompare(d->frameRate, other.d->frameRate)); + qFuzzyCompare(d->frameRate, other.d->frameRate) && + d->encodingOptions == other.d->encodingOptions); } /*! @@ -592,6 +649,56 @@ void QVideoEncoderSettings::setQuality(QtMultimedia::EncodingQuality quality) d->quality = quality; } +/*! + Returns the value of encoding \a option. + + \sa setEncodingOption(), encodingOptions() +*/ +QVariant QVideoEncoderSettings::encodingOption(const QString &option) const +{ + return d->encodingOptions.value(option); +} + +/*! + Returns the all the encoding options as QVariantMap. + + \sa encodingOption(), setEncodingOptions() +*/ +QVariantMap QVideoEncoderSettings::encodingOptions() const +{ + return d->encodingOptions; +} + +/*! + Set the encoding \a option \a value. + + The supported set and meaning of encoding options are + system and selected codec specific. + + \sa encodingOption(), setEncodingOptions() +*/ +void QVideoEncoderSettings::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 \a encoding options. + + The supported set and meaning of encoding options are + system and selected codec specific. + + \sa encodingOption(), setEncodingOptions() +*/ +void QVideoEncoderSettings::setEncodingOptions(const QVariantMap &options) +{ + d->isNull = false; + d->encodingOptions = options; +} class QImageEncoderSettingsPrivate : public QSharedData @@ -608,7 +715,8 @@ public: isNull(other.isNull), codec(other.codec), resolution(other.resolution), - quality(other.quality) + quality(other.quality), + encodingOptions(other.encodingOptions) { } @@ -616,6 +724,7 @@ public: QString codec; QSize resolution; QtMultimedia::EncodingQuality quality; + QVariantMap encodingOptions; private: QImageEncoderSettingsPrivate& operator=(const QImageEncoderSettingsPrivate &other); @@ -687,7 +796,8 @@ bool QImageEncoderSettings::operator==(const QImageEncoderSettings &other) const (d->isNull == other.d->isNull && d->quality == other.d->quality && d->codec == other.d->codec && - d->resolution == other.d->resolution); + d->resolution == other.d->resolution && + d->encodingOptions == other.d->encodingOptions); } @@ -783,5 +893,58 @@ void QImageEncoderSettings::setQuality(QtMultimedia::EncodingQuality quality) d->isNull = false; d->quality = quality; } + +/*! + Returns the value of encoding \a option. + + \sa setEncodingOption(), encodingOptions() +*/ +QVariant QImageEncoderSettings::encodingOption(const QString &option) const +{ + return d->encodingOptions.value(option); +} + +/*! + Returns the all the encoding options as QVariantMap. + + \sa encodingOption(), setEncodingOptions() +*/ +QVariantMap QImageEncoderSettings::encodingOptions() const +{ + return d->encodingOptions; +} + +/*! + Set the encoding \a option \a value. + + The supported set and meaning of encoding options are + system and selected codec specific. + + \sa encodingOption(), setEncodingOptions() +*/ +void QImageEncoderSettings::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 \a encoding options. + + The supported set and meaning of encoding options are + system and selected codec specific. + + \sa encodingOption(), setEncodingOptions() +*/ +void QImageEncoderSettings::setEncodingOptions(const QVariantMap &options) +{ + d->isNull = false; + d->encodingOptions = options; +} + + QT_END_NAMESPACE diff --git a/src/multimedia/recording/qmediaencodersettings.h b/src/multimedia/recording/qmediaencodersettings.h index c2f2f1dd..c7448fee 100644 --- a/src/multimedia/recording/qmediaencodersettings.h +++ b/src/multimedia/recording/qmediaencodersettings.h @@ -45,6 +45,7 @@ #include #include #include +#include #include #include "qtmedianamespace.h" @@ -89,6 +90,11 @@ public: QtMultimedia::EncodingQuality quality() const; void setQuality(QtMultimedia::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 d; }; @@ -127,6 +133,11 @@ public: QtMultimedia::EncodingQuality quality() const; void setQuality(QtMultimedia::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 d; }; @@ -156,6 +167,11 @@ public: QtMultimedia::EncodingQuality quality() const; void setQuality(QtMultimedia::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 d; }; diff --git a/tests/auto/unit/qcamera/tst_qcamera.cpp b/tests/auto/unit/qcamera/tst_qcamera.cpp index 838041db..42bc69ec 100644 --- a/tests/auto/unit/qcamera/tst_qcamera.cpp +++ b/tests/auto/unit/qcamera/tst_qcamera.cpp @@ -791,11 +791,26 @@ void tst_QCamera::testImageSettings() QCOMPARE(settings.resolution(), QSize(800,600)); QVERIFY(!settings.isNull()); + settings = QImageEncoderSettings(); + settings.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); + QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption")), QVariant(1)); + QVariantMap options; + options.insert(QLatin1Literal("encoderOption"), QVariant(1)); + QCOMPARE(settings.encodingOptions(), options); + options.insert(QLatin1Literal("encoderOption2"), QVariant(2)); + options.remove(QLatin1Literal("encoderOption")); + settings.setEncodingOptions(options); + QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption")), QVariant()); + QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption2")), QVariant(2)); + QVERIFY(!settings.isNull()); + QVERIFY(settings != QImageEncoderSettings()); + settings = QImageEncoderSettings(); QVERIFY(settings.isNull()); QCOMPARE(settings.codec(), QString()); QCOMPARE(settings.quality(), QtMultimedia::NormalQuality); QCOMPARE(settings.resolution(), QSize()); + QVERIFY(settings.encodingOptions().isEmpty()); { QImageEncoderSettings settings1; @@ -855,6 +870,14 @@ void tst_QCamera::testImageSettings() QVERIFY(settings1 == settings2); settings2.setQuality(QtMultimedia::LowQuality); QVERIFY(settings1 != settings2); + + settings1 = QImageEncoderSettings(); + settings1.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); + settings2 = QImageEncoderSettings(); + settings2.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); + QVERIFY(settings1 == settings2); + settings2.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(2)); + QVERIFY(settings1 != settings2); } void tst_QCamera::testCameraLock() diff --git a/tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp b/tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp index aad7b873..bb5c8b52 100644 --- a/tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp +++ b/tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp @@ -515,12 +515,27 @@ void tst_QMediaRecorder::testAudioSettings() QCOMPARE(settings.channelCount(), 2); QVERIFY(!settings.isNull()); + settings = QAudioEncoderSettings(); + settings.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); + QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption")), QVariant(1)); + QVariantMap options; + options.insert(QLatin1Literal("encoderOption"), QVariant(1)); + QCOMPARE(settings.encodingOptions(), options); + options.insert(QLatin1Literal("encoderOption2"), QVariant(2)); + options.remove(QLatin1Literal("encoderOption")); + settings.setEncodingOptions(options); + QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption")), QVariant()); + QCOMPARE(settings.encodingOption(QLatin1Literal("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(), QtMultimedia::NormalQuality); QCOMPARE(settings.sampleRate(), -1); + QVERIFY(settings.encodingOptions().isEmpty()); { QAudioEncoderSettings settings1; @@ -601,6 +616,14 @@ void tst_QMediaRecorder::testAudioSettings() QVERIFY(settings1 == settings2); settings2.setSampleRate(2); QVERIFY(settings1 != settings2); + + settings1 = QAudioEncoderSettings(); + settings1.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); + settings2 = QAudioEncoderSettings(); + settings2.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); + QVERIFY(settings1 == settings2); + settings2.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(2)); + QVERIFY(settings1 != settings2); } void tst_QMediaRecorder::testVideoSettings() @@ -643,6 +666,20 @@ void tst_QMediaRecorder::testVideoSettings() QCOMPARE(settings.resolution(), QSize(800,600)); QVERIFY(!settings.isNull()); + settings = QVideoEncoderSettings(); + settings.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); + QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption")), QVariant(1)); + QVariantMap options; + options.insert(QLatin1Literal("encoderOption"), QVariant(1)); + QCOMPARE(settings.encodingOptions(), options); + options.insert(QLatin1Literal("encoderOption2"), QVariant(2)); + options.remove(QLatin1Literal("encoderOption")); + settings.setEncodingOptions(options); + QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption")), QVariant()); + QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption2")), QVariant(2)); + QVERIFY(!settings.isNull()); + QVERIFY(settings != QVideoEncoderSettings()); + settings = QVideoEncoderSettings(); QVERIFY(settings.isNull()); QCOMPARE(settings.codec(), QString()); @@ -650,6 +687,7 @@ void tst_QMediaRecorder::testVideoSettings() QCOMPARE(settings.quality(), QtMultimedia::NormalQuality); QCOMPARE(settings.frameRate(), qreal()); QCOMPARE(settings.resolution(), QSize()); + QVERIFY(settings.encodingOptions().isEmpty()); { QVideoEncoderSettings settings1; @@ -730,6 +768,14 @@ void tst_QMediaRecorder::testVideoSettings() QVERIFY(settings1 == settings2); settings2.setFrameRate(2); QVERIFY(settings1 != settings2); + + settings1 = QVideoEncoderSettings(); + settings1.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); + settings2 = QVideoEncoderSettings(); + settings2.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); + QVERIFY(settings1 == settings2); + settings2.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(2)); + QVERIFY(settings1 != settings2); } void tst_QMediaRecorder::testSettingsApplied()