diff options
author | Tim Blechmann <tim@klingt.org> | 2024-03-05 11:51:55 +0800 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-03-08 09:21:01 +0000 |
commit | 9011f590a5ac82d6c61baa7f0e67e80488fe2538 (patch) | |
tree | 1c50235190e8016682271a747ce8fdd92d58496b | |
parent | e3a250d53454ae65cc55c384502e063dcd87ac09 (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.cpp | 55 | ||||
-rw-r--r-- | src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture_p.h | 3 |
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; |