diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-05-21 11:11:52 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-05-21 12:28:27 +0000 |
commit | 57a11c18947a032e70d5d416e0c42d0fe8a10977 (patch) | |
tree | 54864e2c3ecfc563e564ab4663de49472d47f9ff | |
parent | c7108362fe5c11db4e268231f7dda1c44e6978a1 (diff) | |
download | qtmultimedia-57a11c18947a032e70d5d416e0c42d0fe8a10977.tar.gz |
Correctly resolve the actual output file for QMediaEncoder
The gstreamer media encoder remembered the last location as
something that could be re-used for the next encoding run.
Fix that and ensure it'll pick a new file name if the requested
output location is empty.
Change-Id: I02077c8632fc106701e8c5081ee8b5e1361b18df
Reviewed-by: André de la Rocha <andre.rocha@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
4 files changed, 33 insertions, 32 deletions
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp index 6fbd56cec..c2ad52fff 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp @@ -154,7 +154,7 @@ void QGstreamerMediaCapture::setImageCapture(QPlatformCameraImageCapture *imageC if (m_imageCapture) m_imageCapture->setCaptureSession(this); - gstPipeline.setStateSync(GST_STATE_PLAYING); + gstPipeline.setState(GST_STATE_PLAYING); emit imageCaptureChanged(); } @@ -175,7 +175,7 @@ void QGstreamerMediaCapture::setMediaEncoder(QPlatformMediaEncoder *encoder) if (m_mediaEncoder) m_mediaEncoder->setCaptureSession(this); if (state == GST_STATE_PLAYING) - gstPipeline.setStateSync(state); + gstPipeline.setState(state); emit encoderChanged(); gstPipeline.dumpGraph("encoder"); diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp index b73586a62..956426e8c 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp @@ -72,12 +72,11 @@ QGstreamerMediaEncoder::~QGstreamerMediaEncoder() QUrl QGstreamerMediaEncoder::outputLocation() const { - return m_outputLocation; + return m_requestedOutputLocation; } bool QGstreamerMediaEncoder::setOutputLocation(const QUrl &sink) { - m_outputLocation = sink; m_requestedOutputLocation = sink; return true; } @@ -300,11 +299,12 @@ void QGstreamerMediaEncoder::record() updateStatus(); // create new encoder + QString outputLocation = m_requestedOutputLocation.toLocalFile(); if (m_requestedOutputLocation.isEmpty()) { QString container = m_resolvedSettings.mimeType().preferredSuffix(); - m_outputLocation = QUrl(generateFileName(defaultDir(), container)); + outputLocation = generateFileName(defaultDir(), container); } - QUrl actualSink = QUrl::fromLocalFile(QDir::currentPath()).resolved(m_outputLocation); + QUrl actualSink = QUrl::fromLocalFile(QDir::currentPath()).resolved(outputLocation); qCDebug(qLcMediaEncoder) << "recording new video to" << actualSink; Q_ASSERT(!actualSink.isEmpty()); @@ -335,7 +335,7 @@ void QGstreamerMediaEncoder::record() heartbeat.start(); gstPipeline.dumpGraph("recording"); - actualLocationChanged(m_outputLocation); + actualLocationChanged(QUrl::fromLocalFile(outputLocation)); updateStatus(); } diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h index 502adb6e9..ae4170c5d 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h @@ -104,7 +104,6 @@ private: QString generateFileName(const QDir &dir, const QString &ext) const; QUrl m_requestedOutputLocation; - QUrl m_outputLocation; QMediaEncoderSettings m_settings; QMediaEncoderSettings m_resolvedSettings; QGstreamerMediaCapture *m_session = nullptr; diff --git a/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp b/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp index 5692a3845..1db116d7b 100644 --- a/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp +++ b/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp @@ -471,35 +471,37 @@ void tst_QCameraBackend::testVideoRecording() QTRY_COMPARE(camera->status(), QCamera::ActiveStatus); QTRY_COMPARE(recorder.status(), QMediaEncoder::StoppedStatus); - //record 1 seconds clip - recorder.record(); - QTRY_COMPARE(recorder.status(), QMediaEncoder::RecordingStatus); - QCOMPARE(recorderStatusSignal.last().first().value<QMediaEncoder::Status>(), recorder.status()); - QTest::qWait(1000); - recorderStatusSignal.clear(); - recorder.stop(); - bool foundFinalizingStatus = false; - for (auto &list : recorderStatusSignal) { - if (qvariant_cast<QMediaEncoder::Status>(list.first()) == QMediaEncoder::FinalizingStatus) { - foundFinalizingStatus = true; - break; + for (int recordings = 0; recordings < 2; ++recordings) { + //record 200ms clip + recorder.record(); + QTRY_COMPARE(recorder.status(), QMediaEncoder::RecordingStatus); + QCOMPARE(recorderStatusSignal.last().first().value<QMediaEncoder::Status>(), recorder.status()); + QTest::qWait(200); + recorderStatusSignal.clear(); + recorder.stop(); + bool foundFinalizingStatus = false; + for (auto &list : recorderStatusSignal) { + if (qvariant_cast<QMediaEncoder::Status>(list.first()) == QMediaEncoder::FinalizingStatus) { + foundFinalizingStatus = true; + break; + } } - } - QVERIFY(foundFinalizingStatus); - QTRY_COMPARE(recorder.status(), QMediaEncoder::StoppedStatus); - QCOMPARE(recorderStatusSignal.last().first().value<QMediaEncoder::Status>(), recorder.status()); + QVERIFY(foundFinalizingStatus); + QTRY_COMPARE(recorder.status(), QMediaEncoder::StoppedStatus); + QCOMPARE(recorderStatusSignal.last().first().value<QMediaEncoder::Status>(), recorder.status()); - QVERIFY(errorSignal.isEmpty()); - QVERIFY(recorderErrorSignal.isEmpty()); + QVERIFY(errorSignal.isEmpty()); + QVERIFY(recorderErrorSignal.isEmpty()); - QString fileName = recorder.actualLocation().toLocalFile(); - QVERIFY(!fileName.isEmpty()); + QString fileName = recorder.actualLocation().toLocalFile(); + QVERIFY(!fileName.isEmpty()); - QVERIFY(QFileInfo(fileName).size() > 0); - QFile(fileName).remove(); + QVERIFY(QFileInfo(fileName).size() > 0); + QFile(fileName).remove(); - QTRY_COMPARE(recorder.status(), QMediaEncoder::StoppedStatus); - QCOMPARE(recorderStatusSignal.last().first().value<QMediaEncoder::Status>(), recorder.status()); + QTRY_COMPARE(recorder.status(), QMediaEncoder::StoppedStatus); + QCOMPARE(recorderStatusSignal.last().first().value<QMediaEncoder::Status>(), recorder.status()); + } } QTEST_MAIN(tst_QCameraBackend) |