summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-05-21 11:11:52 +0200
committerLars Knoll <lars.knoll@qt.io>2021-05-21 12:28:27 +0000
commit57a11c18947a032e70d5d416e0c42d0fe8a10977 (patch)
tree54864e2c3ecfc563e564ab4663de49472d47f9ff
parentc7108362fe5c11db4e268231f7dda1c44e6978a1 (diff)
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>
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp4
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp10
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h1
-rw-r--r--tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp50
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)