diff options
author | Tim Blechmann <tim@klingt.org> | 2024-03-21 10:08:24 +0800 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-03-26 20:10:16 +0000 |
commit | 6087e267f244428c7078d8699935d3daece89861 (patch) | |
tree | 1dd3adb7994b31a60e89ab4374a9c687209eb758 | |
parent | f495515e72dbdbccc0b2234a76218b99953a03d0 (diff) |
GStreamer: introduce `createFromDevice`
`createFromDevice` internally takes care of the glib reference count.
This should fix a reference count error in the non-pulseaudio
configuration.
Pick-to: 6.5
Change-Id: I28871677c331fb6a40052694de441e61dc3e16a1
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io>
Reviewed-by: Mikko Hallamaa <mikko.hallamaa@qt.io>
(cherry picked from commit 07788a4e3d1fe842506cbced237d280cfd4e2386)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
(cherry picked from commit c660888d487fd6a0f33bda858a48b964cc03d764)
7 files changed, 24 insertions, 17 deletions
diff --git a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosink.cpp b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosink.cpp index cedc59a96..46d51dff5 100644 --- a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosink.cpp +++ b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosink.cpp @@ -62,7 +62,7 @@ QGStreamerAudioSink::QGStreamerAudioSink(const QAudioDevice &device, QGstAppSrc // g_signal_connect (gstDecodeBin, "pad-added", (GCallback) padAdded, conv); const auto *audioInfo = static_cast<const QGStreamerAudioDeviceInfo *>(device.handle()); - gstOutput = QGstElement(gst_device_create_element(audioInfo->gstDevice.get(), nullptr)); + gstOutput = QGstElement::createFromDevice(audioInfo->gstDevice, nullptr); gstPipeline.add(gstAppSrc, queue, /*gstDecodeBin, */ audioconvert, gstVolume, gstOutput); qLinkGstElements(gstAppSrc, queue, audioconvert, gstVolume, gstOutput); diff --git a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp index b7c437e43..10b5d02c7 100644 --- a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp +++ b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp @@ -127,7 +127,7 @@ bool QGStreamerAudioSource::open() return false; } - gstInput = QGstElement(gst_device_create_element(deviceInfo->gstDevice.get(), nullptr)); + gstInput = QGstElement::createFromDevice(deviceInfo->gstDevice); if (gstInput.isNull()) { setError(QAudio::OpenError); setState(QAudio::StoppedState); diff --git a/src/plugins/multimedia/gstreamer/common/qgst.cpp b/src/plugins/multimedia/gstreamer/common/qgst.cpp index c67269165..bd951d11a 100644 --- a/src/plugins/multimedia/gstreamer/common/qgst.cpp +++ b/src/plugins/multimedia/gstreamer/common/qgst.cpp @@ -732,6 +732,19 @@ QGstElement QGstElement::createFromFactory(const char *factory, const char *name }; } +QGstElement QGstElement::createFromDevice(const QGstDeviceHandle &device, const char *name) +{ + return createFromDevice(device.get(), name); +} + +QGstElement QGstElement::createFromDevice(GstDevice *device, const char *name) +{ + return QGstElement{ + gst_device_create_element(device, name), + QGstElement::NeedsRef, + }; +} + QGstPad QGstElement::staticPad(const char *name) const { return QGstPad(gst_element_get_static_pad(element(), name), HasRef); diff --git a/src/plugins/multimedia/gstreamer/common/qgst_p.h b/src/plugins/multimedia/gstreamer/common/qgst_p.h index a0838f960..a63febf44 100644 --- a/src/plugins/multimedia/gstreamer/common/qgst_p.h +++ b/src/plugins/multimedia/gstreamer/common/qgst_p.h @@ -447,6 +447,8 @@ public: explicit QGstElement(GstElement *element, RefMode mode = NeedsRef); static QGstElement createFromFactory(const char *factory, const char *name = nullptr); + static QGstElement createFromDevice(const QGstDeviceHandle &, const char *name = nullptr); + static QGstElement createFromDevice(GstDevice *, const char *name = nullptr); QGstPad staticPad(const char *name) const; QGstPad src() const; diff --git a/src/plugins/multimedia/gstreamer/common/qgstreameraudioinput.cpp b/src/plugins/multimedia/gstreamer/common/qgstreameraudioinput.cpp index ad00903e8..a3e9cecb2 100644 --- a/src/plugins/multimedia/gstreamer/common/qgstreameraudioinput.cpp +++ b/src/plugins/multimedia/gstreamer/common/qgstreameraudioinput.cpp @@ -79,14 +79,10 @@ void QGstreamerAudioInput::setAudioDevice(const QAudioDevice &device) qCWarning(qLcMediaAudioInput) << "Invalid audio device"; } else { auto *deviceInfo = static_cast<const QGStreamerAudioDeviceInfo *>(m_audioDevice.handle()); - if (deviceInfo && deviceInfo->gstDevice) { - newSrc = QGstElement{ - gst_device_create_element(deviceInfo->gstDevice.get(), "audiosrc"), - QGstElement::HasRef, - }; - } else { + if (deviceInfo && deviceInfo->gstDevice) + newSrc = QGstElement::createFromDevice(deviceInfo->gstDevice, "audiosrc"); + else qCWarning(qLcMediaAudioInput) << "Invalid audio device"; - } } if (newSrc.isNull()) { diff --git a/src/plugins/multimedia/gstreamer/common/qgstreameraudiooutput.cpp b/src/plugins/multimedia/gstreamer/common/qgstreameraudiooutput.cpp index 0f4d6fa29..d8135a714 100644 --- a/src/plugins/multimedia/gstreamer/common/qgstreameraudiooutput.cpp +++ b/src/plugins/multimedia/gstreamer/common/qgstreameraudiooutput.cpp @@ -90,14 +90,10 @@ void QGstreamerAudioOutput::setAudioDevice(const QAudioDevice &info) qCWarning(qLcMediaAudioOutput) << "Invalid audio device"; } else { auto *deviceInfo = static_cast<const QGStreamerAudioDeviceInfo *>(m_audioOutput.handle()); - if (deviceInfo && deviceInfo->gstDevice) { - newSink = QGstElement{ - gst_device_create_element(deviceInfo->gstDevice.get(), "audiosink"), - QGstElement::HasRef, - }; - } else { + if (deviceInfo && deviceInfo->gstDevice) + newSink = QGstElement::createFromDevice(deviceInfo->gstDevice, "audiosink"); + else qCWarning(qLcMediaAudioOutput) << "Invalid audio device"; - } } if (newSink.isNull()) { diff --git a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamercamera.cpp b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamercamera.cpp index 226a08bc9..2e83f2d5c 100644 --- a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamercamera.cpp +++ b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamercamera.cpp @@ -90,7 +90,7 @@ void QGstreamerCamera::setCamera(const QCameraDevice &camera) } else { auto *integration = static_cast<QGstreamerIntegration *>(QGstreamerIntegration::instance()); auto *device = integration->videoDevice(camera.id()); - gstNewCamera = QGstElement(gst_device_create_element(device, "camerasrc")); + gstNewCamera = QGstElement::createFromDevice(device, "camerasrc"); if (QGstStructure properties = gst_device_get_properties(device); !properties.isNull()) { if (properties.name() == "v4l2deviceprovider") m_v4l2DevicePath = QString::fromUtf8(properties["device.path"].toString()); |