summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2023-02-15 15:39:39 +0100
committerArtem Dyomin <artem.dyomin@qt.io>2023-02-17 09:05:45 +0000
commit68430756ac8f477bf91f9691d39f1605829f9500 (patch)
treed2c3ed285aaeb2b5269060f906ef18aacbb0e243 /tests
parent5677aa3337a8925304c52e0c750c8c91f16f8f8c (diff)
Fix ffmpeg encoding issues
Fixed a bunch of problems: - wrong frame intervals in macos camera and screen capturing - missing frame rate in screen capturing format - wrong scaling in encoder Also, some recording tests have been added Task-number: QTBUG-103226 Pick-to: 6.5 Change-Id: Id775f31e01d75d5c9f3c4ec20c33074acab1ab20 Reviewed-by: Lars Knoll <lars@knoll.priv.no>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp50
-rw-r--r--tests/auto/integration/qscreencapture_integration/BLACKLIST4
-rw-r--r--tests/auto/integration/qscreencapture_integration/tst_qscreencapture_integration.cpp64
3 files changed, 97 insertions, 21 deletions
diff --git a/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp b/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp
index 05dd1def1..0f9ebab6f 100644
--- a/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp
+++ b/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp
@@ -9,6 +9,7 @@
#include <QtCore/qlocale.h>
#include <QDebug>
#include <QVideoSink>
+#include <QMediaPlayer>
#include <private/qplatformcamera_p.h>
#include <private/qplatformimagecapture_p.h>
@@ -571,32 +572,39 @@ void tst_QCameraBackend::testVideoRecording()
QTRY_VERIFY(camera->isActive());
QTRY_VERIFY(camera->isActive());
- for (int recordings = 0; recordings < 2; ++recordings) {
- //record 200ms clip
- recorder.record();
- durationChanged.clear();
- if (!recorderErrorSignal.empty() || recorderErrorSignal.wait(100)) {
- QCOMPARE(recorderErrorSignal.last().first().toInt(), QMediaRecorder::FormatError);
- break;
- }
- QTRY_VERIFY(durationChanged.size());
+ recorder.record();
+ durationChanged.clear();
+ if (!recorderErrorSignal.empty() || recorderErrorSignal.wait(550)) {
+ QCOMPARE(recorderErrorSignal.last().first().toInt(), QMediaRecorder::FormatError);
+ return;
+ }
- QCOMPARE(recorder.metaData(), metaData);
+ QTRY_VERIFY(durationChanged.size());
- recorderStateChanged.clear();
- recorder.stop();
- QTRY_VERIFY(recorderStateChanged.size() > 0);
- QVERIFY(recorder.recorderState() == QMediaRecorder::StoppedState);
+ QCOMPARE(recorder.metaData(), metaData);
- QVERIFY(errorSignal.isEmpty());
- QVERIFY(recorderErrorSignal.isEmpty());
+ recorderStateChanged.clear();
+ recorder.stop();
+ QTRY_VERIFY(recorderStateChanged.size() > 0);
+ QVERIFY(recorder.recorderState() == QMediaRecorder::StoppedState);
- QString fileName = recorder.actualLocation().toLocalFile();
- QVERIFY(!fileName.isEmpty());
- QVERIFY(QFileInfo(fileName).size() > 0);
- QFile(fileName).remove();
- }
+ QVERIFY(errorSignal.isEmpty());
+ QVERIFY(recorderErrorSignal.isEmpty());
+
+ QString fileName = recorder.actualLocation().toLocalFile();
+ QVERIFY(!fileName.isEmpty());
+ QVERIFY(QFileInfo(fileName).size() > 0);
+
+ QMediaPlayer player;
+ player.setSource(fileName);
+ QCOMPARE_EQ(player.metaData().value(QMediaMetaData::Resolution).toSize(), QSize(320, 240));
+ QCOMPARE_GT(player.duration(), 350);
+ QCOMPARE_LT(player.duration(), 550);
+
+ // TODO: integrate with a virtual camera and check mediaplayer output
+
+ QFile(fileName).remove();
}
void tst_QCameraBackend::testNativeMetadata()
diff --git a/tests/auto/integration/qscreencapture_integration/BLACKLIST b/tests/auto/integration/qscreencapture_integration/BLACKLIST
index 97f518059..36abeb884 100644
--- a/tests/auto/integration/qscreencapture_integration/BLACKLIST
+++ b/tests/auto/integration/qscreencapture_integration/BLACKLIST
@@ -1,3 +1,7 @@
macos ci
windows ci
android ci
+
+#QTBUG-111190, v4l2m2m issues
+[recordToFile]
+linux ci
diff --git a/tests/auto/integration/qscreencapture_integration/tst_qscreencapture_integration.cpp b/tests/auto/integration/qscreencapture_integration/tst_qscreencapture_integration.cpp
index 617eacf97..328fc125a 100644
--- a/tests/auto/integration/qscreencapture_integration/tst_qscreencapture_integration.cpp
+++ b/tests/auto/integration/qscreencapture_integration/tst_qscreencapture_integration.cpp
@@ -11,6 +11,8 @@
#include <qpainter.h>
#include <qscreencapture.h>
#include <qsignalspy.h>
+#include <qmediarecorder.h>
+#include <qmediaplayer.h>
#include <vector>
@@ -115,6 +117,7 @@ private slots:
void captureScreenByDefault();
void captureSecondaryScreen();
void removeWindowWhileCapture();
+ void recordToFile();
void removeScreenWhileCapture(); // Keep the test last defined. TODO: find a way to restore
// application screens.
@@ -274,6 +277,12 @@ void tst_QScreenCaptureIntegration::removeWhileCapture(
void tst_QScreenCaptureIntegration::initTestCase()
{
+#if defined(Q_OS_LINUX)
+ if (qEnvironmentVariable("QTEST_ENVIRONMENT").toLower() == "ci" &&
+ qEnvironmentVariable("XDG_SESSION_TYPE").toLower() != "x11")
+ QSKIP("Skip on wayland; to be fixed");
+#endif
+
if (!QApplication::primaryScreen())
QSKIP("No screens found");
@@ -368,6 +377,61 @@ void tst_QScreenCaptureIntegration::removeWindowWhileCapture()
[&widget]() { widget.reset(); });
}
+void tst_QScreenCaptureIntegration::recordToFile()
+{
+ QScreenCapture sc;
+ QSignalSpy errorsSpy(&sc, &QScreenCapture::errorOccurred);
+ // sc.setScreen(screen);
+ QMediaCaptureSession session;
+ QMediaRecorder recorder;
+ session.setScreenCapture(&sc);
+ session.setRecorder(&recorder);
+ recorder.setVideoResolution(1280, 960);
+
+ // Insert metadata
+ QMediaMetaData metaData;
+ metaData.insert(QMediaMetaData::Author, QString::fromUtf8("Author"));
+ metaData.insert(QMediaMetaData::Date, QDateTime::currentDateTime());
+ recorder.setMetaData(metaData);
+ sc.setActive(true);
+
+ QTest::qWait(200); // wait a bit for SC threading activating
+
+ {
+ QSignalSpy recorderStateChanged(&recorder, &QMediaRecorder::recorderStateChanged);
+
+ recorder.record();
+
+ QTRY_VERIFY(!recorderStateChanged.empty());
+ QCOMPARE(recorder.recorderState(), QMediaRecorder::RecordingState);
+ }
+
+ QTest::qWait(600);
+
+ {
+ QSignalSpy recorderStateChanged(&recorder, &QMediaRecorder::recorderStateChanged);
+
+ recorder.stop();
+
+ QTRY_VERIFY(!recorderStateChanged.empty());
+ QCOMPARE(recorder.recorderState(), QMediaRecorder::StoppedState);
+ }
+
+ QString fileName = recorder.actualLocation().toLocalFile();
+ QVERIFY(!fileName.isEmpty());
+ QVERIFY(QFileInfo(fileName).size() > 0);
+
+ QMediaPlayer player;
+ player.setSource(fileName);
+ QCOMPARE_EQ(player.metaData().value(QMediaMetaData::Resolution).toSize(), QSize(1280, 960));
+ QCOMPARE_GT(player.duration(), 350);
+ QCOMPARE_LT(player.duration(), 650);
+
+ // TODO: check frames changes with QMediaPlayer
+
+ QFile(fileName).remove();
+}
+
void tst_QScreenCaptureIntegration::removeScreenWhileCapture()
{
QSKIP("TODO: find a reliable way to emulate it");