summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2024-03-05 11:51:55 +0800
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-03-08 09:21:01 +0000
commit9011f590a5ac82d6c61baa7f0e67e80488fe2538 (patch)
tree1c50235190e8016682271a747ce8fdd92d58496b
parente3a250d53454ae65cc55c384502e063dcd87ac09 (diff)
GStreamer: media capture - only capture active cameras
`Camera::setActive` did not have any effect, as the camera was always active. So we hook into the `QGstreamerCamera::activeChanged` signal in order to activate the camera in QGstreamerMediaCapture. Fixes: QTBUG-122959 Pick-to: 6.5 Change-Id: Ifce4c59f58eb074e285ee9dfc012ac8fd8637a1f Reviewed-by: Mikko Hallamaa <mikko.hallamaa@qt.io> Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io> Reviewed-by: Artem Dyomin <artem.dyomin@qt.io> (cherry picked from commit b6f02dff45941494f981ae72b6981549d17b4c8b) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> (cherry picked from commit a04b5d8e94f478b3643986b18792f99fe7cac420)
-rw-r--r--src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp55
-rw-r--r--src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture_p.h3
2 files changed, 38 insertions, 20 deletions
diff --git a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp
index 86acfd07c..8eb37ac06 100644
--- a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp
+++ b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp
@@ -83,46 +83,61 @@ QPlatformCamera *QGstreamerMediaCapture::camera()
return gstCamera;
}
-void QGstreamerMediaCapture::setCamera(QPlatformCamera *camera)
+void QGstreamerMediaCapture::setCamera(QPlatformCamera *platformCamera)
{
- QGstreamerCamera *control = static_cast<QGstreamerCamera *>(camera);
- if (gstCamera == control)
+ QGstreamerCamera *camera = static_cast<QGstreamerCamera *>(platformCamera);
+ if (gstCamera == camera)
return;
- gstPipeline.modifyPipelineWhileNotRunning([&] {
- if (gstCamera) {
- unlinkTeeFromPad(gstVideoTee, encoderVideoSink);
- unlinkTeeFromPad(gstVideoTee, imageCaptureSink);
+ if (gstCamera) {
+ QObject::disconnect(gstCameraActiveConnection);
+ if (gstVideoTee)
+ setCameraActive(false);
+ }
- auto camera = gstCamera->gstElement();
+ gstCamera = camera;
- gstPipeline.stopAndRemoveElements(camera, gstVideoTee, gstVideoOutput->gstElement());
+ if (gstCamera) {
+ gstCameraActiveConnection = QObject::connect(camera, &QGstreamerCamera::activeChanged, this,
+ &QGstreamerMediaCapture::setCameraActive);
+ if (gstCamera->isActive())
+ setCameraActive(true);
+ }
- gstVideoTee = {};
- gstCamera->setCaptureSession(nullptr);
- }
+ emit cameraChanged();
+}
- gstCamera = control;
- if (gstCamera) {
- QGstElement camera = gstCamera->gstElement();
+void QGstreamerMediaCapture::setCameraActive(bool activate)
+{
+ gstPipeline.modifyPipelineWhileNotRunning([&] {
+ if (activate) {
+ QGstElement cameraElement = gstCamera->gstElement();
gstVideoTee = QGstElement::createFromFactory("tee", "videotee");
gstVideoTee.set("allow-not-linked", true);
- gstPipeline.add(gstVideoOutput->gstElement(), camera, gstVideoTee);
+ gstPipeline.add(gstVideoOutput->gstElement(), cameraElement, gstVideoTee);
linkTeeToPad(gstVideoTee, encoderVideoSink);
linkTeeToPad(gstVideoTee, gstVideoOutput->gstElement().staticPad("sink"));
linkTeeToPad(gstVideoTee, imageCaptureSink);
- qLinkGstElements(camera, gstVideoTee);
+ qLinkGstElements(cameraElement, gstVideoTee);
gstPipeline.syncChildrenState();
+ } else {
+ unlinkTeeFromPad(gstVideoTee, encoderVideoSink);
+ unlinkTeeFromPad(gstVideoTee, imageCaptureSink);
+
+ auto camera = gstCamera->gstElement();
+
+ gstPipeline.stopAndRemoveElements(camera, gstVideoTee, gstVideoOutput->gstElement());
+
+ gstVideoTee = {};
+ gstCamera->setCaptureSession(nullptr);
}
});
gstPipeline.dumpGraph("camera");
-
- emit cameraChanged();
}
QPlatformImageCapture *QGstreamerMediaCapture::imageCapture()
@@ -211,7 +226,7 @@ void QGstreamerMediaCapture::linkEncoder(QGstPad audioSink, QGstPad videoSink)
encoderAudioCapsFilter.src().link(audioSink);
linkTeeToPad(gstAudioTee, encoderAudioCapsFilter.sink());
- encoderAudioCapsFilter.syncStateWithParent();
+ encoderVideoCapsFilter.syncStateWithParent();
encoderAudioSink = encoderAudioCapsFilter.sink();
}
});
diff --git a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture_p.h b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture_p.h
index f790f741f..ec7d6a3f1 100644
--- a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture_p.h
+++ b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture_p.h
@@ -64,6 +64,8 @@ public:
QGstreamerVideoSink *gstreamerVideoSink() const;
private:
+ void setCameraActive(bool activate);
+
explicit QGstreamerMediaCapture(QGstreamerVideoOutput *videoOutput);
friend QGstreamerMediaEncoder;
@@ -72,6 +74,7 @@ private:
QGstreamerAudioInput *gstAudioInput = nullptr;
QGstreamerCamera *gstCamera = nullptr;
+ QMetaObject::Connection gstCameraActiveConnection;
QGstElement gstAudioTee;
QGstElement gstVideoTee;