diff options
author | Tim Blechmann <tim@klingt.org> | 2024-03-01 11:03:11 +0800 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-03-05 07:37:56 +0000 |
commit | 74c50ec3a074a85c11bc7056ff542cd8dd22187c (patch) | |
tree | 57e1ca5e977b166133bf03ecd71a4aa922103b1c | |
parent | e45b8f0f20162a625b115f3d91b4906e957852c2 (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.cpp | 80 |
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) |