summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2024-03-21 10:08:24 +0800
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-03-26 20:10:16 +0000
commit6087e267f244428c7078d8699935d3daece89861 (patch)
tree1dd3adb7994b31a60e89ab4374a9c687209eb758
parentf495515e72dbdbccc0b2234a76218b99953a03d0 (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)
-rw-r--r--src/plugins/multimedia/gstreamer/audio/qgstreameraudiosink.cpp2
-rw-r--r--src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp2
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgst.cpp13
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgst_p.h2
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgstreameraudioinput.cpp10
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgstreameraudiooutput.cpp10
-rw-r--r--src/plugins/multimedia/gstreamer/mediacapture/qgstreamercamera.cpp2
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());