summaryrefslogtreecommitdiffstats
path: root/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2024-04-03 11:58:43 +0800
committerTim Blechmann <tim@klingt.org>2024-04-09 21:51:40 +0800
commit4ef4fa1aa0181adaaaa33aa86286c3c4ff7d93af (patch)
tree22fac10fe4a2721a947cd6b4c55098ff04c717a5 /src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp
parent657e002678c8f48cde02227419d2321a0957bb7a (diff)
GStreamer: QGStreamerAudioSource fix potential memory leak
`invokeMethod` is not called if the object is destroyed before the slot is invoked. We replace the explicit reference counting with a handle type, which is passed via a lambda function. This also allows us so remove the moc-ing Pick-to: 6.5 6.6 6.7 Change-Id: I50eb3b23b5c83b01c98f6f3a99b0d5889bde718d Reviewed-by: Artem Dyomin <artem.dyomin@qt.io> Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io>
Diffstat (limited to 'src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp')
-rw-r--r--src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp20
1 files changed, 11 insertions, 9 deletions
diff --git a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp
index 6daa71ac2..ba9823d98 100644
--- a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp
+++ b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp
@@ -294,10 +294,10 @@ QGstAppSink QGStreamerAudioSource::createAppSink()
return sink;
}
-void QGStreamerAudioSource::newDataAvailable(GstSample *sample)
+void QGStreamerAudioSource::newDataAvailable(QGstSampleHandle sample)
{
if (m_audioSink) {
- GstBuffer *buffer = gst_sample_get_buffer(sample);
+ GstBuffer *buffer = gst_sample_get_buffer(sample.get());
GstMapInfo mapInfo;
gst_buffer_map(buffer, &mapInfo, GST_MAP_READ);
const char *bufferData = (const char*)mapInfo.data;
@@ -314,8 +314,6 @@ void QGStreamerAudioSource::newDataAvailable(GstSample *sample)
gst_buffer_unmap(buffer, &mapInfo);
}
-
- gst_sample_unref(sample);
}
GstFlowReturn QGStreamerAudioSource::new_sample(GstAppSink *sink, gpointer user_data)
@@ -323,8 +321,14 @@ GstFlowReturn QGStreamerAudioSource::new_sample(GstAppSink *sink, gpointer user_
// "Note that the preroll buffer will also be returned as the first buffer when calling gst_app_sink_pull_buffer()."
QGStreamerAudioSource *control = static_cast<QGStreamerAudioSource*>(user_data);
- GstSample *sample = gst_app_sink_pull_sample(sink);
- QMetaObject::invokeMethod(control, "newDataAvailable", Qt::AutoConnection, Q_ARG(GstSample *, sample));
+ QGstSampleHandle sample{
+ gst_app_sink_pull_sample(sink),
+ QGstSampleHandle::HasRef,
+ };
+
+ QMetaObject::invokeMethod(control, [control, sample = std::move(sample)]() mutable {
+ control->newDataAvailable(std::move(sample));
+ });
return GST_FLOW_OK;
}
@@ -337,7 +341,7 @@ void QGStreamerAudioSource::eos(GstAppSink *, gpointer user_data)
GStreamerInputPrivate::GStreamerInputPrivate(QGStreamerAudioSource *audio)
{
- m_audioDevice = qobject_cast<QGStreamerAudioSource*>(audio);
+ m_audioDevice = audio;
}
qint64 GStreamerInputPrivate::readData(char *data, qint64 len)
@@ -363,5 +367,3 @@ qint64 GStreamerInputPrivate::bytesAvailable() const
QT_END_NAMESPACE
-
-#include "moc_qgstreameraudiosource_p.cpp"