summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2024-03-01 11:03:11 +0800
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-03-05 07:37:56 +0000
commit74c50ec3a074a85c11bc7056ff542cd8dd22187c (patch)
tree57e1ca5e977b166133bf03ecd71a4aa922103b1c
parente45b8f0f20162a625b115f3d91b4906e957852c2 (diff)
GStreamer: media capture - safer encoder linking/unlinking
we need to make sure that the pipeline is not running when linking/unlinking the encoder bin. Pick-to: 6.6 6.5 Change-Id: Ie1f92c3a8204d34695e35499e7bdfe81d929912a Reviewed-by: Artem Dyomin <artem.dyomin@qt.io> (cherry picked from commit 2514e79878d30c424cc2364b3d726c25eb133285) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp80
1 files changed, 42 insertions, 38 deletions
diff --git a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp
index d6c680bd3..28b985fa2 100644
--- a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp
+++ b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp
@@ -182,57 +182,61 @@ QPlatformMediaRecorder *QGstreamerMediaCapture::mediaRecorder()
void QGstreamerMediaCapture::linkEncoder(QGstPad audioSink, QGstPad videoSink)
{
- if (!gstVideoTee.isNull() && !videoSink.isNull()) {
- auto caps = gst_pad_get_current_caps(gstVideoTee.sink().pad());
+ gstPipeline.modifyPipelineWhileNotRunning([&] {
+ if (!gstVideoTee.isNull() && !videoSink.isNull()) {
+ auto caps = gst_pad_get_current_caps(gstVideoTee.sink().pad());
- encoderVideoCapsFilter =
- QGstElement::createFromFactory("capsfilter", "encoderVideoCapsFilter");
- Q_ASSERT(encoderVideoCapsFilter);
- encoderVideoCapsFilter.set("caps", QGstCaps(caps, QGstCaps::HasRef));
+ encoderVideoCapsFilter =
+ QGstElement::createFromFactory("capsfilter", "encoderVideoCapsFilter");
+ Q_ASSERT(encoderVideoCapsFilter);
+ encoderVideoCapsFilter.set("caps", QGstCaps(caps, QGstCaps::HasRef));
- gstPipeline.add(encoderVideoCapsFilter);
+ gstPipeline.add(encoderVideoCapsFilter);
- encoderVideoCapsFilter.src().link(videoSink);
- linkTeeToPad(gstVideoTee, encoderVideoCapsFilter.sink());
- encoderVideoCapsFilter.setState(GST_STATE_PLAYING);
- encoderVideoSink = encoderVideoCapsFilter.sink();
- }
+ encoderVideoCapsFilter.src().link(videoSink);
+ linkTeeToPad(gstVideoTee, encoderVideoCapsFilter.sink());
+ encoderVideoCapsFilter.setState(GST_STATE_PLAYING);
+ encoderVideoSink = encoderVideoCapsFilter.sink();
+ }
- if (!gstAudioTee.isNull() && !audioSink.isNull()) {
- auto caps = gst_pad_get_current_caps(gstAudioTee.sink().pad());
+ if (!gstAudioTee.isNull() && !audioSink.isNull()) {
+ auto caps = gst_pad_get_current_caps(gstAudioTee.sink().pad());
- encoderAudioCapsFilter =
- QGstElement::createFromFactory("capsfilter", "encoderAudioCapsFilter");
- Q_ASSERT(encoderAudioCapsFilter);
- encoderAudioCapsFilter.set("caps", QGstCaps(caps, QGstCaps::HasRef));
+ encoderAudioCapsFilter =
+ QGstElement::createFromFactory("capsfilter", "encoderAudioCapsFilter");
+ Q_ASSERT(encoderAudioCapsFilter);
+ encoderAudioCapsFilter.set("caps", QGstCaps(caps, QGstCaps::HasRef));
- gstPipeline.add(encoderAudioCapsFilter);
+ gstPipeline.add(encoderAudioCapsFilter);
- encoderAudioCapsFilter.src().link(audioSink);
- linkTeeToPad(gstAudioTee, encoderAudioCapsFilter.sink());
- encoderAudioCapsFilter.setState(GST_STATE_PLAYING);
- encoderAudioSink = encoderAudioCapsFilter.sink();
- }
+ encoderAudioCapsFilter.src().link(audioSink);
+ linkTeeToPad(gstAudioTee, encoderAudioCapsFilter.sink());
+ encoderAudioCapsFilter.setState(GST_STATE_PLAYING);
+ encoderAudioSink = encoderAudioCapsFilter.sink();
+ }
+ });
}
void QGstreamerMediaCapture::unlinkEncoder()
{
- if (!encoderVideoCapsFilter.isNull()) {
- encoderVideoCapsFilter.src().unlinkPeer();
- unlinkTeeFromPad(gstVideoTee, encoderVideoCapsFilter.sink());
- gstPipeline.stopAndRemoveElements(encoderVideoCapsFilter);
- encoderVideoCapsFilter = {};
- }
+ gstPipeline.modifyPipelineWhileNotRunning([&] {
+ if (!encoderVideoCapsFilter.isNull()) {
+ encoderVideoCapsFilter.src().unlinkPeer();
+ unlinkTeeFromPad(gstVideoTee, encoderVideoCapsFilter.sink());
+ gstPipeline.stopAndRemoveElements(encoderVideoCapsFilter);
+ encoderVideoCapsFilter = {};
+ }
- if (!encoderAudioCapsFilter.isNull()) {
- encoderAudioCapsFilter.src().unlinkPeer();
- unlinkTeeFromPad(gstAudioTee, encoderAudioCapsFilter.sink());
- gstPipeline.stopAndRemoveElements(encoderAudioCapsFilter);
- encoderAudioCapsFilter = {};
- }
+ if (!encoderAudioCapsFilter.isNull()) {
+ encoderAudioCapsFilter.src().unlinkPeer();
+ unlinkTeeFromPad(gstAudioTee, encoderAudioCapsFilter.sink());
+ gstPipeline.stopAndRemoveElements(encoderAudioCapsFilter);
+ encoderAudioCapsFilter = {};
+ }
- encoderAudioSink = {};
- encoderVideoSink = {};
+ encoderAudioSink = {};
+ encoderVideoSink = {};
+ });
}
void QGstreamerMediaCapture::setAudioInput(QPlatformAudioInput *input)