diff options
author | Tim Blechmann <tim@klingt.org> | 2024-03-01 12:05:12 +0800 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-03-05 12:54:16 +0000 |
commit | 3039a8d2ac6bdbbe4c8486f0db48ad43308a7cb0 (patch) | |
tree | b6461e0d8481b370efa2197b23372574dbc52cc7 | |
parent | b95a71c6abd31f293ac85c457912b837b6c7e367 (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.cpp | 46 |
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"); |