summaryrefslogtreecommitdiffstats
path: root/src/multimedia
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-05-20 16:01:41 +0200
committerLars Knoll <lars.knoll@qt.io>2021-05-21 12:28:06 +0000
commitc7108362fe5c11db4e268231f7dda1c44e6978a1 (patch)
tree4791c67f4371d4c0a3b6d11c1784ddc66c4bf5ee /src/multimedia
parentbf0f87dc4f4480efe51b8ba5b5706f8c1ce7a4fb (diff)
Improve gstreamer capture pipeline
Avoid sync state changes that can not happen synchronously, leading to very slow timeouts on the pipeline. This makes the whole capture experience on Linux snappy. Change-Id: Ib49d4d3962c861515a883fe61505e0d3f3178428 Reviewed-by: André de la Rocha <andre.rocha@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/multimedia')
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamercameraimagecapture.cpp2
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp14
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp17
3 files changed, 20 insertions, 13 deletions
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameraimagecapture.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameraimagecapture.cpp
index 9e803ead5..e19a9c28e 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameraimagecapture.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameraimagecapture.cpp
@@ -360,7 +360,7 @@ void QGstreamerCameraImageCapture::link()
videoSrcPad = m_session->getVideoPad();
videoSrcPad.link(bin.staticPad("sink"));
bin.lockState(false);
- bin.setStateSync(GST_STATE_PAUSED);
+ bin.setState(GST_STATE_PAUSED);
gstPipeline.setStateSync(GST_STATE_PLAYING);
}
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp
index 4c8d04e92..6fbd56cec 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp
@@ -99,8 +99,9 @@ void QGstreamerMediaCapture::setCamera(QPlatformCamera *camera)
if (gstCamera == control)
return;
- //auto state = gstPipeline.state();
- gstPipeline.setStateSync(GST_STATE_PAUSED);
+ auto state = gstPipeline.state();
+ if (state != GST_STATE_PAUSED)
+ gstPipeline.setStateSync(GST_STATE_PAUSED);
if (gstVideoTee.isNull()) {
gstVideoTee = QGstElement("tee", "videotee");
@@ -120,13 +121,14 @@ void QGstreamerMediaCapture::setCamera(QPlatformCamera *camera)
gstCamera = control;
if (gstCamera) {
- gstPipeline.add(gstCamera->gstElement());
+ QGstElement camera = gstCamera->gstElement();
+ gstPipeline.add(camera);
gstCamera->gstElement().link(gstVideoTee);
- gstCamera->gstElement().setStateSync(gstPipeline.state());
gstCamera->setCaptureSession(this);
- //gstCamera->setPipeline(gstPipeline); // needed?
+ camera.setState(GST_STATE_PAUSED);
}
- gstPipeline.setStateSync(GST_STATE_PLAYING);
+ if (state != GST_STATE_PAUSED)
+ gstPipeline.setState(state);
emit cameraChanged();
gstPipeline.dumpGraph("camera");
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp
index 86b57139c..b73586a62 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp
@@ -110,7 +110,7 @@ void QGstreamerMediaEncoder::updateStatus()
auto newStatus = statusTable[state()][sessionState];
- qCDebug(qLcMediaEncoder) << "updateStatus" << newStatus;
+ qCDebug(qLcMediaEncoder) << "updateStatus" << state() << sessionState << newStatus;
statusChanged(newStatus);
}
@@ -287,13 +287,18 @@ void QGstreamerMediaEncoder::record()
{
if (!m_session)
return;
- if (state() == QMediaEncoder::PausedState) {
+ auto oldState = state();
+ stateChanged(QMediaEncoder::RecordingState);
+
+ if (oldState == QMediaEncoder::PausedState) {
// coming from paused state
+ stateChanged(QMediaEncoder::RecordingState);
gstEncoder.setState(GST_STATE_PLAYING);
updateStatus();
return;
}
+ updateStatus();
// create new encoder
if (m_requestedOutputLocation.isEmpty()) {
QString container = m_resolvedSettings.mimeType().preferredSuffix();
@@ -322,9 +327,9 @@ void QGstreamerMediaEncoder::record()
}
}
- gstEncoder.setStateSync(GST_STATE_PAUSED);
- gstFileSink.setStateSync(GST_STATE_PAUSED);
- gstPipeline.setStateSync(GST_STATE_PLAYING);
+ gstEncoder.setState(GST_STATE_PAUSED);
+ gstFileSink.setState(GST_STATE_PAUSED);
+ gstPipeline.setState(GST_STATE_PLAYING);
m_duration.start();
heartbeat.start();
@@ -360,7 +365,7 @@ void QGstreamerMediaEncoder::stop()
m_session->releaseVideoPad(videoSrcPad);
audioSrcPad = videoSrcPad = {};
- gstPipeline.setStateSync(GST_STATE_PLAYING);
+ gstPipeline.setState(GST_STATE_PLAYING);
//with live sources it's necessary to send EOS even to pipeline
//before going to STOPPED state
qCDebug(qLcMediaEncoder) << ">>>>>>>>>>>>> sending EOS";