summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2024-03-01 12:05:12 +0800
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-03-05 12:54:16 +0000
commit3039a8d2ac6bdbbe4c8486f0db48ad43308a7cb0 (patch)
treeb6461e0d8481b370efa2197b23372574dbc52cc7
parentb95a71c6abd31f293ac85c457912b837b6c7e367 (diff)
GStreamer: link camera bin only when pipeline is paused
Task-id: QTBUG-122638 Pick-to: 6.5 Change-Id: I057a915394aba710d8eac94f98fed28c67822004 Reviewed-by: Mikko Hallamaa <mikko.hallamaa@qt.io> Reviewed-by: Lars Sutterud <lars.sutterud@qt.io> Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io> Reviewed-by: Artem Dyomin <artem.dyomin@qt.io> (cherry picked from commit a4fab41303f67ccfae3716ad64ea354c8669998d) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> (cherry picked from commit c7b54e31c7da3c1e1b55d66efc9ee8ecaba27963)
-rw-r--r--src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp46
1 files changed, 24 insertions, 22 deletions
diff --git a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp
index 28b985fa2..6520272a6 100644
--- a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp
+++ b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp
@@ -89,36 +89,38 @@ void QGstreamerMediaCapture::setCamera(QPlatformCamera *camera)
if (gstCamera == control)
return;
- if (gstCamera) {
- unlinkTeeFromPad(gstVideoTee, encoderVideoSink);
- unlinkTeeFromPad(gstVideoTee, imageCaptureSink);
+ gstPipeline.modifyPipelineWhileNotRunning([&] {
+ if (gstCamera) {
+ unlinkTeeFromPad(gstVideoTee, encoderVideoSink);
+ unlinkTeeFromPad(gstVideoTee, imageCaptureSink);
- auto camera = gstCamera->gstElement();
+ auto camera = gstCamera->gstElement();
- gstPipeline.stopAndRemoveElements(camera, gstVideoTee, gstVideoOutput->gstElement());
+ gstPipeline.stopAndRemoveElements(camera, gstVideoTee, gstVideoOutput->gstElement());
- gstVideoTee = {};
- gstCamera->setCaptureSession(nullptr);
- }
+ gstVideoTee = {};
+ gstCamera->setCaptureSession(nullptr);
+ }
- gstCamera = control;
- if (gstCamera) {
- QGstElement camera = gstCamera->gstElement();
- gstVideoTee = QGstElement::createFromFactory("tee", "videotee");
- gstVideoTee.set("allow-not-linked", true);
+ gstCamera = control;
+ if (gstCamera) {
+ QGstElement camera = gstCamera->gstElement();
+ gstVideoTee = QGstElement::createFromFactory("tee", "videotee");
+ gstVideoTee.set("allow-not-linked", true);
- gstPipeline.add(gstVideoOutput->gstElement(), camera, gstVideoTee);
+ gstPipeline.add(gstVideoOutput->gstElement(), camera, gstVideoTee);
- linkTeeToPad(gstVideoTee, encoderVideoSink);
- linkTeeToPad(gstVideoTee, gstVideoOutput->gstElement().staticPad("sink"));
- linkTeeToPad(gstVideoTee, imageCaptureSink);
+ linkTeeToPad(gstVideoTee, encoderVideoSink);
+ linkTeeToPad(gstVideoTee, gstVideoOutput->gstElement().staticPad("sink"));
+ linkTeeToPad(gstVideoTee, imageCaptureSink);
- qLinkGstElements(camera, gstVideoTee);
+ qLinkGstElements(camera, gstVideoTee);
- gstVideoOutput->gstElement().setState(GST_STATE_PLAYING);
- gstVideoTee.setState(GST_STATE_PLAYING);
- camera.setState(GST_STATE_PLAYING);
- }
+ gstVideoOutput->gstElement().setState(GST_STATE_PLAYING);
+ gstVideoTee.setState(GST_STATE_PLAYING);
+ camera.setState(GST_STATE_PLAYING);
+ }
+ });
gstPipeline.dumpGraph("camera");