diff options
author | Artem Dyomin <artem.dyomin@qt.io> | 2023-02-15 15:39:39 +0100 |
---|---|---|
committer | Artem Dyomin <artem.dyomin@qt.io> | 2023-02-17 09:05:45 +0000 |
commit | 68430756ac8f477bf91f9691d39f1605829f9500 (patch) | |
tree | d2c3ed285aaeb2b5269060f906ef18aacbb0e243 /tests | |
parent | 5677aa3337a8925304c52e0c750c8c91f16f8f8c (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')
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"); |