diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-05-20 16:01:41 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-05-21 12:28:06 +0000 |
commit | c7108362fe5c11db4e268231f7dda1c44e6978a1 (patch) | |
tree | 4791c67f4371d4c0a3b6d11c1784ddc66c4bf5ee | |
parent | bf0f87dc4f4480efe51b8ba5b5706f8c1ce7a4fb (diff) | |
download | qtmultimedia-c7108362fe5c11db4e268231f7dda1c44e6978a1.tar.gz |
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>
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"; |