From c7108362fe5c11db4e268231f7dda1c44e6978a1 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Thu, 20 May 2021 16:01:41 +0200 Subject: Improve gstreamer capture pipeline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Lars Knoll --- .../mediacapture/qgstreamercameraimagecapture.cpp | 2 +- .../gstreamer/mediacapture/qgstreamermediacapture.cpp | 14 ++++++++------ .../gstreamer/mediacapture/qgstreamermediaencoder.cpp | 17 +++++++++++------ 3 files changed, 20 insertions(+), 13 deletions(-) (limited to 'src/multimedia') 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"; -- cgit v1.2.3