diff options
author | Tim Blechmann <tim@klingt.org> | 2024-04-03 11:58:43 +0800 |
---|---|---|
committer | Tim Blechmann <tim@klingt.org> | 2024-04-09 21:51:40 +0800 |
commit | 4ef4fa1aa0181adaaaa33aa86286c3c4ff7d93af (patch) | |
tree | 22fac10fe4a2721a947cd6b4c55098ff04c717a5 /src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp | |
parent | 657e002678c8f48cde02227419d2321a0957bb7a (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.cpp | 20 |
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" |