summaryrefslogtreecommitdiffstats
path: root/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp')
-rw-r--r--tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp975
1 files changed, 975 insertions, 0 deletions
diff --git a/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp b/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp
new file mode 100644
index 000000000..ba80f9951
--- /dev/null
+++ b/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp
@@ -0,0 +1,975 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//TESTED_COMPONENT=src/multimedia
+
+#include <QtTest/QtTest>
+#include <QDebug>
+#include <QtMultimedia/qmediametadata.h>
+#include <private/qplatformmediaencoder_p.h>
+#include <qmediarecorder.h>
+#include <qaudioformat.h>
+#include <qmockintegration_p.h>
+#include <qmediacapturesession.h>
+
+#include "qmockmediacapturesession.h"
+#include "qmockmediaencoder.h"
+
+QT_USE_NAMESPACE
+
+class tst_QMediaRecorder : public QObject
+{
+ Q_OBJECT
+
+public slots:
+ void initTestCase();
+ void cleanupTestCase();
+
+private slots:
+ void testBasicSession();
+ void testNullControls();
+ void testDeleteMediaSource();
+ void testError();
+ void testSink();
+ void testRecord();
+ void testEncodingSettings();
+ void testAudioSettings();
+ void testVideoSettings();
+ void testSettingsApplied();
+
+ void metaData();
+
+ void testAudioSettingsCopyConstructor();
+ void testAudioSettingsOperatorNotEqual();
+ void testAudioSettingsOperatorEqual();
+ void testAudioSettingsOperatorAssign();
+
+ void testIsAvailable();
+ void testEnum();
+
+ void testVideoSettingsQuality();
+ void testVideoSettingsEncodingMode();
+ void testVideoSettingsCopyConstructor();
+ void testVideoSettingsOperatorAssignment();
+ void testVideoSettingsOperatorNotEqual();
+ void testVideoSettingsOperatorComparison();
+
+private:
+ QMockIntegration *mockIntegration = nullptr;
+ QMediaCaptureSession *captureSession;
+ QCamera *object = nullptr;
+ QMockMediaCaptureSession *service = nullptr;
+ QMockMediaEncoder *mock;
+ QMediaRecorder *encoder;
+};
+
+void tst_QMediaRecorder::initTestCase()
+{
+ mockIntegration = new QMockIntegration;
+ captureSession = new QMediaCaptureSession;
+ object = new QCamera;
+ encoder = new QMediaRecorder;
+ captureSession->setCamera(object);
+ captureSession->setEncoder(encoder);
+ service = mockIntegration->lastCaptureService();
+ mock = service->mockControl;
+}
+
+void tst_QMediaRecorder::cleanupTestCase()
+{
+ delete encoder;
+ delete object;
+ delete captureSession;
+ delete mockIntegration;
+}
+
+void tst_QMediaRecorder::testBasicSession()
+{
+ QMediaCaptureSession session;
+ QCamera camera;
+ QMediaRecorder recorder;
+ session.setCamera(&camera);
+ session.setEncoder(&recorder);
+
+ QCOMPARE(recorder.outputLocation(), QUrl());
+ QCOMPARE(recorder.recorderState(), QMediaRecorder::StoppedState);
+ QCOMPARE(recorder.error(), QMediaRecorder::NoError);
+ QCOMPARE(recorder.duration(), qint64(0));
+}
+
+void tst_QMediaRecorder::testNullControls()
+{
+ // With the new changes, hasControls does not make much sense anymore
+ // since the session does not own the controls
+ // The equivalent of this test would be to not set the control to the session
+ // ???
+ QMediaCaptureSession session;
+ // mockIntegration->lastCaptureService()->hasControls = false;
+ QCamera camera;
+ QMediaRecorder recorder;
+ session.setCamera(&camera);
+ // session.setEncoder(&recorder);
+
+ QCOMPARE(recorder.outputLocation(), QUrl());
+ QCOMPARE(recorder.recorderState(), QMediaRecorder::StoppedState);
+ QCOMPARE(recorder.error(), QMediaRecorder::NoError);
+ QCOMPARE(recorder.duration(), qint64(0));
+
+ recorder.setOutputLocation(QUrl("file://test/save/file.mp4"));
+ QCOMPARE(recorder.outputLocation(), QUrl());
+ QCOMPARE(recorder.actualLocation(), QUrl());
+
+ QMediaEncoderSettings settings;
+ settings.setFileFormat(QMediaFormat::MPEG4);
+ settings.setAudioCodec(QMediaFormat::AudioCodec::AAC);
+ settings.setQuality(QMediaEncoderSettings::LowQuality);
+
+ settings.setVideoCodec(QMediaFormat::VideoCodec::VP9);
+ settings.setVideoResolution(640, 480);
+
+ recorder.setEncoderSettings(settings);
+
+ QCOMPARE(recorder.encoderSettings().audioCodec(), QMediaFormat::AudioCodec::AAC);
+ QCOMPARE(recorder.encoderSettings().videoCodec(), QMediaFormat::VideoCodec::VP9);
+ QCOMPARE(recorder.encoderSettings().fileFormat(), QMediaFormat::MPEG4);
+
+ QSignalSpy spy(&recorder, SIGNAL(recorderStateChanged(RecorderState)));
+
+ recorder.record();
+ QCOMPARE(recorder.recorderState(), QMediaRecorder::StoppedState);
+ QCOMPARE(recorder.error(), QMediaRecorder::NoError);
+ QCOMPARE(spy.count(), 0);
+
+ recorder.pause();
+ QCOMPARE(recorder.recorderState(), QMediaRecorder::StoppedState);
+ QCOMPARE(recorder.error(), QMediaRecorder::NoError);
+ QCOMPARE(spy.count(), 0);
+
+ recorder.stop();
+ QCOMPARE(recorder.recorderState(), QMediaRecorder::StoppedState);
+ QCOMPARE(recorder.error(), QMediaRecorder::NoError);
+ QCOMPARE(spy.count(), 0);
+}
+
+void tst_QMediaRecorder::testDeleteMediaSource()
+{
+ QMediaCaptureSession session;
+ QCamera *camera = new QCamera;
+ QMediaRecorder *recorder = new QMediaRecorder;
+ session.setCamera(camera);
+ session.setEncoder(recorder);
+
+ QVERIFY(session.camera() == camera);
+ QVERIFY(recorder->isAvailable());
+
+ delete camera;
+
+ QVERIFY(session.camera() == nullptr);
+ QVERIFY(recorder->isAvailable());
+
+ delete recorder;
+}
+
+void tst_QMediaRecorder::testError()
+{
+ const QString errorString(QLatin1String("format error"));
+
+ QSignalSpy spy(encoder, SIGNAL(errorOccurred(Error, const QString&)));
+
+ QCOMPARE(encoder->error(), QMediaRecorder::NoError);
+ QCOMPARE(encoder->errorString(), QString());
+
+ mock->error(QMediaRecorder::FormatError, errorString);
+ QCOMPARE(encoder->error(), QMediaRecorder::FormatError);
+ QCOMPARE(encoder->errorString(), errorString);
+ QCOMPARE(spy.count(), 1);
+
+ QCOMPARE(spy.last()[0].value<QMediaRecorder::Error>(), QMediaRecorder::FormatError);
+}
+
+void tst_QMediaRecorder::testSink()
+{
+ encoder->setOutputLocation(QUrl("test.tmp"));
+ QUrl s = encoder->outputLocation();
+ QCOMPARE(s.toString(), QString("test.tmp"));
+ QCOMPARE(encoder->actualLocation(), QUrl());
+
+ //the actual location is available after record
+ encoder->record();
+ QCOMPARE(encoder->actualLocation().toString(), QString("test.tmp"));
+ encoder->stop();
+ QCOMPARE(encoder->actualLocation().toString(), QString("test.tmp"));
+
+ //setOutputLocation resets the actual location
+ encoder->setOutputLocation(QUrl());
+ QCOMPARE(encoder->actualLocation(), QUrl());
+
+ encoder->record();
+ QCOMPARE(encoder->actualLocation(), QUrl::fromLocalFile("default_name.mp4"));
+ encoder->stop();
+ QCOMPARE(encoder->actualLocation(), QUrl::fromLocalFile("default_name.mp4"));
+}
+
+void tst_QMediaRecorder::testRecord()
+{
+ QSignalSpy stateSignal(encoder,SIGNAL(recorderStateChanged(RecorderState)));
+ QSignalSpy statusSignal(encoder,SIGNAL(statusChanged(Status)));
+ QSignalSpy progressSignal(encoder, SIGNAL(durationChanged(qint64)));
+ encoder->record();
+ QCOMPARE(encoder->recorderState(), QMediaRecorder::RecordingState);
+ QCOMPARE(encoder->error(), QMediaRecorder::NoError);
+ QCOMPARE(encoder->errorString(), QString());
+
+ QCOMPARE(stateSignal.count(), 1);
+ QCOMPARE(stateSignal.last()[0].value<QMediaRecorder::RecorderState>(), QMediaRecorder::RecordingState);
+
+ QTestEventLoop::instance().enterLoop(1);
+
+ QCOMPARE(encoder->status(), QMediaRecorder::RecordingStatus);
+ QVERIFY(!statusSignal.isEmpty());
+ QCOMPARE(statusSignal.last()[0].value<QMediaRecorder::Status>(), QMediaRecorder::RecordingStatus);
+ statusSignal.clear();
+
+ QVERIFY(progressSignal.count() > 0);
+
+ encoder->pause();
+
+ QCOMPARE(encoder->recorderState(), QMediaRecorder::PausedState);
+
+ QCOMPARE(stateSignal.count(), 2);
+
+ QTestEventLoop::instance().enterLoop(1);
+ QCOMPARE(encoder->status(), QMediaRecorder::PausedStatus);
+ QVERIFY(!statusSignal.isEmpty());
+ QCOMPARE(statusSignal.last()[0].value<QMediaRecorder::Status>(), QMediaRecorder::PausedStatus);
+ statusSignal.clear();
+
+ encoder->stop();
+
+ QCOMPARE(encoder->recorderState(), QMediaRecorder::StoppedState);
+ QCOMPARE(stateSignal.count(), 3);
+
+ QTestEventLoop::instance().enterLoop(1);
+ QCOMPARE(encoder->status(), QMediaRecorder::StoppedStatus);
+ QVERIFY(!statusSignal.isEmpty());
+ QCOMPARE(statusSignal.last()[0].value<QMediaRecorder::Status>(), QMediaRecorder::StoppedStatus);
+ statusSignal.clear();
+
+ mock->stop();
+ QCOMPARE(stateSignal.count(), 3);
+}
+
+void tst_QMediaRecorder::testEncodingSettings()
+{
+ QMediaEncoderSettings settings = encoder->encoderSettings();
+ QCOMPARE(settings.fileFormat(), QMediaFormat::UnspecifiedFormat);
+ QCOMPARE(settings.audioCodec(), QMediaFormat::AudioCodec::Unspecified);
+ QCOMPARE(settings.videoCodec(), QMediaFormat::VideoCodec::Unspecified);
+ QCOMPARE(settings.quality(), QMediaEncoderSettings::NormalQuality);
+ QCOMPARE(settings.encodingMode(), QMediaEncoderSettings::ConstantQualityEncoding);
+
+ settings.setAudioCodec(QMediaFormat::AudioCodec::MP3);
+ settings.setAudioSampleRate(44100);
+ settings.setAudioBitRate(256*1024);
+ settings.setQuality(QMediaEncoderSettings::HighQuality);
+ settings.setEncodingMode(QMediaEncoderSettings::AverageBitRateEncoding);
+
+ settings.setVideoCodec(QMediaFormat::VideoCodec::H264);
+ settings.setVideoBitRate(800);
+ settings.setVideoFrameRate(24*1024);
+ settings.setVideoResolution(QSize(800,600));
+
+ encoder->setEncoderSettings(settings);
+
+ QCOMPARE(encoder->encoderSettings(), settings);
+}
+
+void tst_QMediaRecorder::testAudioSettings()
+{
+ QMediaEncoderSettings settings;
+ QVERIFY(settings == QMediaEncoderSettings());
+
+ QCOMPARE(settings.fileFormat(), QMediaFormat::UnspecifiedFormat);
+ QCOMPARE(settings.audioBitRate(), -1);
+ QCOMPARE(settings.quality(), QMediaEncoderSettings::NormalQuality);
+ QCOMPARE(settings.audioSampleRate(), -1);
+
+ settings.setFileFormat(QMediaFormat::AAC);
+ QCOMPARE(settings.fileFormat(), QMediaFormat::AAC);
+ QVERIFY(settings != QMediaEncoderSettings());
+
+ settings = QMediaEncoderSettings();
+ QCOMPARE(settings.audioBitRate(), -1);
+ settings.setAudioBitRate(128000);
+ QCOMPARE(settings.audioBitRate(), 128000);
+
+ settings = QMediaEncoderSettings();
+ QCOMPARE(settings.quality(), QMediaEncoderSettings::NormalQuality);
+ settings.setQuality(QMediaEncoderSettings::HighQuality);
+ QCOMPARE(settings.quality(), QMediaEncoderSettings::HighQuality);
+
+ settings = QMediaEncoderSettings();
+ QCOMPARE(settings.audioSampleRate(), -1);
+ settings.setAudioSampleRate(44100);
+ QCOMPARE(settings.audioSampleRate(), 44100);
+
+ settings = QMediaEncoderSettings();
+ QCOMPARE(settings.audioChannelCount(), -1);
+ settings.setAudioChannelCount(2);
+ QCOMPARE(settings.audioChannelCount(), 2);
+
+ settings = QMediaEncoderSettings();
+
+ {
+ QMediaEncoderSettings settings1;
+ QMediaEncoderSettings settings2;
+ QCOMPARE(settings2, settings1);
+
+ settings2 = settings1;
+ QCOMPARE(settings2, settings1);
+
+ settings1.setQuality(QMediaEncoderSettings::HighQuality);
+
+ QVERIFY(settings1 != settings2);
+ }
+
+ {
+ QMediaEncoderSettings settings1;
+ QMediaEncoderSettings settings2(settings1);
+ QCOMPARE(settings2, settings1);
+
+ settings2 = settings1;
+ QCOMPARE(settings2, settings1);
+
+ settings1.setQuality(QMediaEncoderSettings::HighQuality);
+
+ QVERIFY(settings1 != settings2);
+ }
+
+ QMediaEncoderSettings settings1;
+ settings1.setAudioBitRate(1);
+ QMediaEncoderSettings settings2;
+ settings2.setAudioBitRate(1);
+ QVERIFY(settings1 == settings2);
+ settings2.setAudioBitRate(2);
+ QVERIFY(settings1 != settings2);
+
+ settings1 = QMediaEncoderSettings();
+ settings1.setAudioChannelCount(1);
+ settings2 = QMediaEncoderSettings();
+ settings2.setAudioChannelCount(1);
+ QVERIFY(settings1 == settings2);
+ settings2.setAudioChannelCount(2);
+ QVERIFY(settings1 != settings2);
+
+ settings1 = QMediaEncoderSettings();
+ settings1.setAudioCodec(QMediaFormat::AudioCodec::MP3);
+ settings2 = QMediaEncoderSettings();
+ settings2.setAudioCodec(QMediaFormat::AudioCodec::MP3);
+ QVERIFY(settings1 == settings2);
+ settings2.setAudioCodec(QMediaFormat::AudioCodec::FLAC);
+ QVERIFY(settings1 != settings2);
+
+ settings1 = QMediaEncoderSettings();
+ settings1.setEncodingMode(QMediaEncoderSettings::ConstantBitRateEncoding);
+ settings2 = QMediaEncoderSettings();
+ settings2.setEncodingMode(QMediaEncoderSettings::ConstantBitRateEncoding);
+ QVERIFY(settings1 == settings2);
+ settings2.setEncodingMode(QMediaEncoderSettings::AverageBitRateEncoding);
+ QVERIFY(settings1 != settings2);
+
+ settings1 = QMediaEncoderSettings();
+ settings1.setQuality(QMediaEncoderSettings::NormalQuality);
+ settings2 = QMediaEncoderSettings();
+ settings2.setQuality(QMediaEncoderSettings::NormalQuality);
+ QVERIFY(settings1 == settings2);
+ settings2.setQuality(QMediaEncoderSettings::LowQuality);
+ QVERIFY(settings1 != settings2);
+
+ settings1 = QMediaEncoderSettings();
+ settings1.setAudioSampleRate(1);
+ settings2 = QMediaEncoderSettings();
+ settings2.setAudioSampleRate(1);
+ QVERIFY(settings1 == settings2);
+ settings2.setAudioSampleRate(2);
+ QVERIFY(settings1 != settings2);
+}
+
+void tst_QMediaRecorder::testVideoSettings()
+{
+ QMediaEncoderSettings settings;
+ QVERIFY(settings == QMediaEncoderSettings());
+
+ QCOMPARE(settings.videoCodec(), QMediaFormat::VideoCodec::Unspecified);
+ settings.setVideoCodec(QMediaFormat::VideoCodec::H265);
+ QCOMPARE(settings.videoCodec(), QMediaFormat::VideoCodec::H265);
+ QVERIFY(settings != QMediaEncoderSettings());
+
+ settings = QMediaEncoderSettings();
+ QCOMPARE(settings.videoBitRate(), -1);
+ settings.setVideoBitRate(128000);
+ QCOMPARE(settings.videoBitRate(), 128000);
+
+ settings = QMediaEncoderSettings();
+ QCOMPARE(settings.quality(), QMediaEncoderSettings::NormalQuality);
+ settings.setQuality(QMediaEncoderSettings::HighQuality);
+ QCOMPARE(settings.quality(), QMediaEncoderSettings::HighQuality);
+
+ settings = QMediaEncoderSettings();
+ QCOMPARE(settings.videoFrameRate(), -1);
+ settings.setVideoFrameRate(60);
+ QVERIFY(qFuzzyCompare(settings.videoFrameRate(), qreal(60)));
+ settings.setVideoFrameRate(24.0);
+ QVERIFY(qFuzzyCompare(settings.videoFrameRate(), qreal(24.0)));
+
+ settings = QMediaEncoderSettings();
+ QCOMPARE(settings.videoResolution(), QSize());
+ settings.setVideoResolution(QSize(320,240));
+ QCOMPARE(settings.videoResolution(), QSize(320,240));
+ settings.setVideoResolution(800,600);
+ QCOMPARE(settings.videoResolution(), QSize(800,600));
+
+ settings = QMediaEncoderSettings();
+ QCOMPARE(settings.videoCodec(), QMediaFormat::VideoCodec::Unspecified);
+ QCOMPARE(settings.videoBitRate(), -1);
+ QCOMPARE(settings.quality(), QMediaEncoderSettings::NormalQuality);
+ QCOMPARE(settings.videoFrameRate(), -1);
+ QCOMPARE(settings.videoResolution(), QSize());
+
+ {
+ QMediaEncoderSettings settings1;
+ QMediaEncoderSettings settings2;
+ QCOMPARE(settings2, settings1);
+
+ settings2 = settings1;
+ QCOMPARE(settings2, settings1);
+
+ settings1.setQuality(QMediaEncoderSettings::HighQuality);
+ QVERIFY(settings1 != settings2);
+ }
+
+ {
+ QMediaEncoderSettings settings1;
+ QMediaEncoderSettings settings2(settings1);
+ QCOMPARE(settings2, settings1);
+
+ settings2 = settings1;
+ QCOMPARE(settings2, settings1);
+
+ settings1.setQuality(QMediaEncoderSettings::HighQuality);
+ QVERIFY(settings1 != settings2);
+ }
+
+ QMediaEncoderSettings settings1;
+ settings1.setVideoBitRate(1);
+ QMediaEncoderSettings settings2;
+ settings2.setVideoBitRate(1);
+ QVERIFY(settings1 == settings2);
+ settings2.setVideoBitRate(2);
+ QVERIFY(settings1 != settings2);
+
+ settings1 = QMediaEncoderSettings();
+ settings1.setVideoResolution(800,600);
+ settings2 = QMediaEncoderSettings();
+ settings2.setVideoResolution(QSize(800,600));
+ QVERIFY(settings1 == settings2);
+ settings2.setVideoResolution(QSize(400,300));
+ QVERIFY(settings1 != settings2);
+
+ settings1 = QMediaEncoderSettings();
+ settings1.setVideoCodec(QMediaFormat::VideoCodec::H265);
+ settings2 = QMediaEncoderSettings();
+ settings2.setVideoCodec(QMediaFormat::VideoCodec::H265);
+ QVERIFY(settings1 == settings2);
+ settings2.setVideoCodec(QMediaFormat::VideoCodec::AV1);
+ QVERIFY(settings1 != settings2);
+
+ settings1 = QMediaEncoderSettings();
+ settings1.setEncodingMode(QMediaEncoderSettings::ConstantBitRateEncoding);
+ settings2 = QMediaEncoderSettings();
+ settings2.setEncodingMode(QMediaEncoderSettings::ConstantBitRateEncoding);
+ QVERIFY(settings1 == settings2);
+ settings2.setEncodingMode(QMediaEncoderSettings::AverageBitRateEncoding);
+ QVERIFY(settings1 != settings2);
+
+ settings1 = QMediaEncoderSettings();
+ settings1.setQuality(QMediaEncoderSettings::NormalQuality);
+ settings2 = QMediaEncoderSettings();
+ settings2.setQuality(QMediaEncoderSettings::NormalQuality);
+ QVERIFY(settings1 == settings2);
+ settings2.setQuality(QMediaEncoderSettings::LowQuality);
+ QVERIFY(settings1 != settings2);
+
+ settings1 = QMediaEncoderSettings();
+ settings1.setVideoFrameRate(1);
+ settings2 = QMediaEncoderSettings();
+ settings2.setVideoFrameRate(1);
+ QVERIFY(settings1 == settings2);
+ settings2.setVideoFrameRate(2);
+ QVERIFY(settings1 != settings2);
+}
+
+void tst_QMediaRecorder::testSettingsApplied()
+{
+ QMediaCaptureSession session;
+ QMediaRecorder encoder;
+ session.setEncoder(&encoder);
+ auto *mock = mockIntegration->lastCaptureService()->mockControl;
+
+ //if the media recorder is not configured after construction
+ //the settings are applied in the next event loop
+ QCOMPARE(mock->m_settingAppliedCount, 0);
+ QTRY_COMPARE(mock->m_settingAppliedCount, 1);
+
+ QMediaEncoderSettings settings;
+ settings.setVideoResolution(640,480);
+ encoder.setEncoderSettings(settings);
+
+ QCOMPARE(mock->m_settingAppliedCount, 1);
+ QTRY_COMPARE(mock->m_settingAppliedCount, 2);
+
+ //encoder settings are applied before recording if changed
+ settings.setQuality(QMediaEncoderSettings::VeryHighQuality);
+ encoder.setEncoderSettings(settings);
+
+ QCOMPARE(mock->m_settingAppliedCount, 2);
+ encoder.record();
+ QCOMPARE(mock->m_settingAppliedCount, 3);
+
+ encoder.stop();
+}
+
+void tst_QMediaRecorder::metaData()
+{
+ QMediaCaptureSession session;
+ QCamera camera;
+ QMediaRecorder recorder;
+ session.setCamera(&camera);
+ session.setEncoder(&recorder);
+
+ QVERIFY(recorder.metaData().isEmpty());
+
+ QMediaMetaData data;
+ data.insert(QMediaMetaData::Author, QString::fromUtf8("John Doe"));
+ recorder.setMetaData(data);
+
+ QCOMPARE(recorder.metaData().value(QMediaMetaData::Author).toString(), QString::fromUtf8("John Doe"));
+}
+
+void tst_QMediaRecorder::testAudioSettingsCopyConstructor()
+{
+ /* create an object for AudioEncodersettings */
+ QMediaEncoderSettings audiosettings;
+
+ /* setting the desired properties for the AudioEncoder */
+ audiosettings.setAudioBitRate(128*1000);
+ audiosettings.setAudioChannelCount(4);
+ audiosettings.setAudioCodec(QMediaFormat::AudioCodec::ALAC);
+ audiosettings.setEncodingMode(QMediaEncoderSettings::ConstantBitRateEncoding);
+ audiosettings.setQuality(QMediaEncoderSettings::LowQuality);
+ audiosettings.setAudioSampleRate(44100);
+
+ /* Copy constructor */
+ QMediaEncoderSettings other(audiosettings);
+
+ /* Verifying whether data is copied properly or not */
+ QVERIFY(other.audioBitRate() == audiosettings.audioBitRate());
+ QVERIFY(other.audioSampleRate() == audiosettings.audioSampleRate());
+ QVERIFY(other.audioChannelCount() == audiosettings.audioChannelCount());
+ QCOMPARE(other.audioCodec(), audiosettings.audioCodec());
+ QVERIFY(other.encodingMode() == audiosettings.encodingMode());
+ QVERIFY(other.quality() == audiosettings.quality());
+}
+
+void tst_QMediaRecorder::testAudioSettingsOperatorNotEqual()
+{
+ /* create an object for AudioEncodersettings */
+ QMediaEncoderSettings audiosettings1;
+ QMediaEncoderSettings audiosettings2;
+
+ /* setting the desired properties to for the AudioEncoder */
+ audiosettings1.setAudioBitRate(128*1000);
+ audiosettings1.setAudioChannelCount(4);
+ audiosettings1.setAudioCodec(QMediaFormat::AudioCodec::FLAC);
+ audiosettings1.setEncodingMode(QMediaEncoderSettings::ConstantBitRateEncoding);
+ audiosettings1.setQuality(QMediaEncoderSettings::LowQuality);
+ audiosettings1.setAudioSampleRate(44100);
+
+ /* setting the desired properties for the AudioEncoder */
+ audiosettings2.setAudioBitRate(128*1000);
+ audiosettings2.setAudioChannelCount(4);
+ audiosettings2.setAudioCodec(QMediaFormat::AudioCodec::FLAC);
+ audiosettings2.setEncodingMode(QMediaEncoderSettings::ConstantBitRateEncoding);
+ audiosettings2.setQuality(QMediaEncoderSettings::LowQuality);
+ audiosettings2.setAudioSampleRate(44100);
+
+ /* verify the both are equal or not */
+ QVERIFY(audiosettings1 == audiosettings2);
+ QVERIFY(!(audiosettings1 != audiosettings2));
+
+ /* Modify the settings value for one object */
+ audiosettings2.setAudioBitRate(64*1000);
+ audiosettings2.setEncodingMode(QMediaEncoderSettings::ConstantQualityEncoding);
+
+ /* verify the not equal opertor */
+ QVERIFY(audiosettings1 != audiosettings2);
+
+ QVERIFY(audiosettings2.audioBitRate() != audiosettings1.audioBitRate());
+ QVERIFY(audiosettings2.encodingMode() != audiosettings1.encodingMode());
+}
+
+void tst_QMediaRecorder::testAudioSettingsOperatorEqual()
+{
+ /* create an object for AudioEncodersettings */
+ QMediaEncoderSettings audiosettings1;
+
+ /* setting the desired properties to for the AudioEncoder */
+ audiosettings1.setAudioBitRate(128*1000);
+ audiosettings1.setAudioChannelCount(4);
+ audiosettings1.setAudioCodec(QMediaFormat::AudioCodec::FLAC);
+ audiosettings1.setEncodingMode(QMediaEncoderSettings::ConstantBitRateEncoding);
+ audiosettings1.setQuality(QMediaEncoderSettings::LowQuality);
+ audiosettings1.setAudioSampleRate(44100);
+
+ QMediaEncoderSettings audiosettings2;
+
+ /* setting the desired properties for the AudioEncoder */
+ audiosettings2.setAudioBitRate(128*1000);
+ audiosettings2.setAudioChannelCount(4);
+ audiosettings2.setAudioCodec(QMediaFormat::AudioCodec::FLAC);
+ audiosettings2.setEncodingMode(QMediaEncoderSettings::ConstantBitRateEncoding);
+ audiosettings2.setQuality(QMediaEncoderSettings::LowQuality);
+ audiosettings2.setAudioSampleRate(44100);
+
+ /* verify both the values are same or not */
+ QVERIFY(audiosettings1 == audiosettings2);
+ audiosettings2.setAudioChannelCount(2);
+ QVERIFY(audiosettings1 != audiosettings2);
+}
+
+void tst_QMediaRecorder::testAudioSettingsOperatorAssign()
+{
+
+ /* create an object for AudioEncodersettings */
+ QMediaEncoderSettings audiosettings1;
+
+ /* setting the desired properties for the AudioEncoder */
+ audiosettings1.setAudioBitRate(128*1000);
+ audiosettings1.setAudioChannelCount(4);
+ audiosettings1.setAudioCodec(QMediaFormat::AudioCodec::FLAC);
+ audiosettings1.setEncodingMode(QMediaEncoderSettings::ConstantBitRateEncoding);
+ audiosettings1.setQuality(QMediaEncoderSettings::LowQuality);
+ audiosettings1.setAudioSampleRate(44100);
+
+ QMediaEncoderSettings audiosettings2;
+ audiosettings2 = audiosettings1;
+ /* Verifying whether data is copied properly or not */
+ QVERIFY(audiosettings2.audioBitRate() == audiosettings1.audioBitRate());
+ QVERIFY(audiosettings2.audioSampleRate() == audiosettings1.audioSampleRate());
+ QVERIFY(audiosettings2.audioChannelCount() == audiosettings1.audioChannelCount());
+ QCOMPARE(audiosettings2.audioCodec(), audiosettings1.audioCodec());
+ QVERIFY(audiosettings2.encodingMode() == audiosettings1.encodingMode());
+ QVERIFY(audiosettings2.quality() == audiosettings1.quality());
+}
+
+void tst_QMediaRecorder::testIsAvailable()
+{
+ {
+ QMediaCaptureSession session;
+ QCamera camera;
+ QMediaRecorder recorder;
+ session.setCamera(&camera);
+ session.setEncoder(&recorder);
+ QCOMPARE(recorder.isAvailable(), true);
+ }
+ {
+ QMediaRecorder recorder;
+ QCOMPARE(recorder.isAvailable(), false);
+ }
+}
+
+/* enum QMediaRecorder::ResourceError property test. */
+void tst_QMediaRecorder::testEnum()
+{
+ const QString errorString(QLatin1String("resource error"));
+
+ QSignalSpy spy(encoder, SIGNAL(errorOccurred(Error, const QString&)));
+
+ QCOMPARE(encoder->error(), QMediaRecorder::NoError);
+ QCOMPARE(encoder->errorString(), QString());
+
+ emit mock->error(QMediaRecorder::ResourceError, errorString);
+ QCOMPARE(encoder->error(), QMediaRecorder::ResourceError);
+ QCOMPARE(encoder->errorString(), errorString);
+ QCOMPARE(spy.count(), 1);
+
+ QCOMPARE(spy.last()[0].value<QMediaRecorder::Error>(), QMediaRecorder::ResourceError);
+}
+
+/* Test the QMediaEncoderSettings quality API*/
+void tst_QMediaRecorder::testVideoSettingsQuality()
+{
+ /* Create the instance*/
+ QMediaEncoderSettings settings;
+ QVERIFY(settings == QMediaEncoderSettings());
+
+ /* Verify the default value is intialised correctly*/
+ QCOMPARE(settings.quality(), QMediaEncoderSettings::NormalQuality);
+
+ /* Set all types of Quality parameter and Verify if it is set correctly*/
+ settings.setQuality(QMediaEncoderSettings::HighQuality);
+ QCOMPARE(settings.quality(), QMediaEncoderSettings::HighQuality);
+
+ settings.setQuality(QMediaEncoderSettings::VeryLowQuality);
+ QCOMPARE(settings.quality(), QMediaEncoderSettings::VeryLowQuality);
+
+ settings.setQuality(QMediaEncoderSettings::LowQuality);
+ QCOMPARE(settings.quality(), QMediaEncoderSettings::LowQuality);
+
+ settings.setQuality(QMediaEncoderSettings::VeryHighQuality);
+ QCOMPARE(settings.quality(), QMediaEncoderSettings::VeryHighQuality);
+}
+
+/* Test QMediaEncoderSettings encodingMode */
+void tst_QMediaRecorder::testVideoSettingsEncodingMode()
+{
+ /* Create the instance*/
+ QMediaEncoderSettings settings;
+ QVERIFY(settings == QMediaEncoderSettings());
+
+ /* Verify the default values are initialised correctly*/
+ QCOMPARE(settings.encodingMode(), QMediaEncoderSettings::ConstantQualityEncoding);
+
+ /* Set each type of encoding mode and Verify if it is set correctly*/
+ settings.setEncodingMode(QMediaEncoderSettings::ConstantBitRateEncoding);
+ QCOMPARE(settings.encodingMode(),QMediaEncoderSettings::ConstantBitRateEncoding);
+
+ settings.setEncodingMode(QMediaEncoderSettings::AverageBitRateEncoding);
+ QCOMPARE(settings.encodingMode(), QMediaEncoderSettings::AverageBitRateEncoding);
+}
+
+/* Test QMediaEncoderSettings copy constructor */
+void tst_QMediaRecorder::testVideoSettingsCopyConstructor()
+{
+ /* Create the instance and initialise it*/
+ QMediaEncoderSettings settings1;
+ settings1.setVideoCodec(QMediaFormat::VideoCodec::Theora);
+ settings1.setVideoBitRate(128000);
+ settings1.setQuality(QMediaEncoderSettings::HighQuality);
+ settings1.setEncodingMode(QMediaEncoderSettings::ConstantBitRateEncoding);
+ settings1.setVideoFrameRate(60.);
+ settings1.setVideoResolution(QSize(320,240));
+
+ /* Create another instance with instance1 as argument*/
+ QMediaEncoderSettings settings2(settings1);
+
+ /* Verify if all the parameters are copied correctly*/
+ QCOMPARE(settings2 != settings1, false);
+ QCOMPARE(settings2.videoCodec(), QMediaFormat::VideoCodec::Theora);
+ QCOMPARE(settings2.videoBitRate(), 128000);
+ QCOMPARE(settings2.encodingMode(), QMediaEncoderSettings::ConstantBitRateEncoding);
+ QVERIFY(qFuzzyCompare(settings2.videoFrameRate(), qreal(60.)));
+ QCOMPARE(settings2.videoResolution(), QSize(320,240));
+ QCOMPARE(settings2.quality(), QMediaEncoderSettings::HighQuality);
+
+ /* Verify both the instances are equal*/
+ QCOMPARE(settings2, settings1);
+}
+
+/* Test QMediaEncoderSettings Overloaded Operator assignment*/
+void tst_QMediaRecorder::testVideoSettingsOperatorAssignment()
+{
+ /* Create two instances.*/
+ QMediaEncoderSettings settings1;
+ QMediaEncoderSettings settings2;
+ QCOMPARE(settings2, settings1);
+
+ /* Initialize all the parameters */
+ settings1.setVideoCodec(QMediaFormat::VideoCodec::Theora);
+ settings1.setVideoBitRate(128000);
+ settings1.setEncodingMode(QMediaEncoderSettings::ConstantBitRateEncoding);
+ settings1.setVideoFrameRate(60.);
+ settings1.setVideoResolution(QSize(320,240));
+ settings1.setQuality(QMediaEncoderSettings::HighQuality);
+ /* Assign one object to other*/
+ settings2 = settings1;
+
+ /* Verify all the parameters are copied correctly*/
+ QCOMPARE(settings2, settings1);
+ QCOMPARE(settings2.videoCodec(), QMediaFormat::VideoCodec::Theora);
+ QCOMPARE(settings2.videoBitRate(), 128000);
+ QCOMPARE(settings2.encodingMode(), QMediaEncoderSettings::ConstantBitRateEncoding);
+ QVERIFY(qFuzzyCompare(settings2.videoFrameRate(), qreal(60.)));
+ QCOMPARE(settings2.videoResolution(), QSize(320,240));
+ QCOMPARE(settings2.quality(), QMediaEncoderSettings::HighQuality);
+ QCOMPARE(settings2, settings1);
+}
+
+/* Test QMediaEncoderSettings Overloaded OperatorNotEqual*/
+void tst_QMediaRecorder::testVideoSettingsOperatorNotEqual()
+{
+ /* Create the instance and set the bit rate and Verify objects with OperatorNotEqual*/
+ QMediaEncoderSettings settings1;
+ settings1.setVideoBitRate(1);
+ QMediaEncoderSettings settings2;
+ settings2.setVideoBitRate(1);
+ /* OperatorNotEqual returns false when both objects are equal*/
+ QCOMPARE(settings1 != settings2, false);
+ settings2.setVideoBitRate(2);
+ /* OperatorNotEqual returns true when both objects are not equal*/
+ QVERIFY(settings1 != settings2);
+
+ /* Verify Resolution with not equal operator*/
+ settings1 = QMediaEncoderSettings();
+ settings1.setVideoResolution(800,600);
+ settings2 = QMediaEncoderSettings();
+ settings2.setVideoResolution(QSize(800,600));
+ /* OperatorNotEqual returns false when both objects are equal*/
+ QCOMPARE(settings1 != settings2, false);
+ settings2.setVideoResolution(QSize(400,300));
+ /* OperatorNotEqual returns true when both objects are not equal*/
+ QVERIFY(settings1 != settings2);
+
+ /* Verify Codec with not equal operator*/
+ settings1 = QMediaEncoderSettings();
+ settings1.setVideoCodec(QMediaFormat::VideoCodec::Theora);
+ settings2 = QMediaEncoderSettings();
+ settings2.setVideoCodec(QMediaFormat::VideoCodec::Theora);
+ /* OperatorNotEqual returns false when both objects are equal*/
+ QCOMPARE(settings1 != settings2, false);
+ settings2.setVideoCodec(QMediaFormat::VideoCodec::AV1);
+ /* OperatorNotEqual returns true when both objects are not equal*/
+ QVERIFY(settings1 != settings2);
+
+ /* Verify EncodingMode with not equal operator*/
+ settings1 = QMediaEncoderSettings();
+ settings1.setEncodingMode(QMediaEncoderSettings::ConstantBitRateEncoding);
+ settings2 = QMediaEncoderSettings();
+ settings2.setEncodingMode(QMediaEncoderSettings::ConstantBitRateEncoding);
+ /* OperatorNotEqual returns false when both objects are equal*/
+ QCOMPARE(settings1 != settings2, false);
+ settings2.setEncodingMode(QMediaEncoderSettings::AverageBitRateEncoding);
+ /* OperatorNotEqual returns true when both objects are not equal*/
+ QVERIFY(settings1 != settings2);
+
+ /* Verify Quality with not equal operator*/
+ settings1 = QMediaEncoderSettings();
+ settings1.setQuality(QMediaEncoderSettings::NormalQuality);
+ settings2 = QMediaEncoderSettings();
+ settings2.setQuality(QMediaEncoderSettings::NormalQuality);
+ /* OperatorNotEqual returns false when both objects are equal*/
+ QCOMPARE(settings1 != settings2, false);
+ settings2.setQuality(QMediaEncoderSettings::LowQuality);
+ /* OperatorNotEqual returns true when both objects are not equal*/
+ QVERIFY(settings1 != settings2);
+
+ /* Verify FrameRate with not equal operator*/
+ settings1 = QMediaEncoderSettings();
+ settings1.setVideoFrameRate(1);
+ settings2 = QMediaEncoderSettings();
+ settings2.setVideoFrameRate(1);
+ /* OperatorNotEqual returns false when both objects are equal*/
+ QCOMPARE(settings1 != settings2, false);
+ settings2.setVideoFrameRate(2);
+ /* OperatorNotEqual returns true when both objects are not equal*/
+ QVERIFY(settings1 != settings2);
+}
+
+/* Test QMediaEncoderSettings Overloaded comparison operator*/
+void tst_QMediaRecorder::testVideoSettingsOperatorComparison()
+{
+ /* Create the instance and set the bit rate and Verify objects with comparison operator*/
+ QMediaEncoderSettings settings1;
+ settings1.setVideoBitRate(1);
+ QMediaEncoderSettings settings2;
+ settings2.setVideoBitRate(1);
+
+ /* Comparison operator returns true when both objects are equal*/
+ QVERIFY(settings1 == settings2);
+ settings2.setVideoBitRate(2);
+ /* Comparison operator returns false when both objects are not equal*/
+ QCOMPARE(settings1 == settings2, false);
+
+ /* Verify resolution with comparison operator*/
+ settings1 = QMediaEncoderSettings();
+ settings1.setVideoResolution(800,600);
+ settings2 = QMediaEncoderSettings();
+ settings2.setVideoResolution(QSize(800,600));
+ /* Comparison operator returns true when both objects are equal*/
+ QVERIFY(settings1 == settings2);
+ settings2.setVideoResolution(QSize(400,300));
+ /* Comparison operator returns false when both objects are not equal*/
+ QCOMPARE(settings1 == settings2, false);
+
+ /* Verify Codec with comparison operator*/
+ settings1 = QMediaEncoderSettings();
+ settings1.setVideoCodec(QMediaFormat::VideoCodec::Theora);
+ settings2 = QMediaEncoderSettings();
+ settings2.setVideoCodec(QMediaFormat::VideoCodec::Theora);
+ /* Comparison operator returns true when both objects are equal*/
+ QVERIFY(settings1 == settings2);
+ settings2.setVideoCodec(QMediaFormat::VideoCodec::AV1);
+ /* Comparison operator returns false when both objects are not equal*/
+ QCOMPARE(settings1 == settings2, false);
+
+ /* Verify EncodingMode with comparison operator*/
+ settings1 = QMediaEncoderSettings();
+ settings1.setEncodingMode(QMediaEncoderSettings::ConstantBitRateEncoding);
+ settings2 = QMediaEncoderSettings();
+ settings2.setEncodingMode(QMediaEncoderSettings::ConstantBitRateEncoding);
+ /* Comparison operator returns true when both objects are equal*/
+ QVERIFY(settings1 == settings2);
+ settings2.setEncodingMode(QMediaEncoderSettings::AverageBitRateEncoding);
+ /* Comparison operator returns false when both objects are not equal*/
+ QCOMPARE(settings1 == settings2, false);
+
+ /* Verify Quality with comparison operator*/
+ settings1 = QMediaEncoderSettings();
+ settings1.setQuality(QMediaEncoderSettings::NormalQuality);
+ settings2 = QMediaEncoderSettings();
+ settings2.setQuality(QMediaEncoderSettings::NormalQuality);
+ /* Comparison operator returns true when both objects are equal*/
+ QVERIFY(settings1 == settings2);
+ settings2.setQuality(QMediaEncoderSettings::LowQuality);
+ /* Comparison operator returns false when both objects are not equal*/
+ QCOMPARE(settings1 == settings2, false);
+
+ /* Verify FrameRate with comparison operator*/
+ settings1 = QMediaEncoderSettings();
+ settings1.setVideoFrameRate(1);
+ settings2 = QMediaEncoderSettings();
+ settings2.setVideoFrameRate(1);
+ /* Comparison operator returns true when both objects are equal*/
+ QVERIFY(settings1 == settings2);
+ settings2.setVideoFrameRate(2);
+ /* Comparison operator returns false when both objects are not equal*/
+ QCOMPARE(settings1 == settings2, false);
+}
+
+QTEST_GUILESS_MAIN(tst_QMediaRecorder)
+#include "tst_qmediarecorder.moc"