From fbc6f09f49734b44ce6ef8eede04fb4b5c5d493d Mon Sep 17 00:00:00 2001 From: Tim Blechmann Date: Wed, 21 Feb 2024 19:36:08 +0800 Subject: GStreamer: QGstElement - simplify callback apis MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Use lambdas instead of local Impl structs * pass callback via lambda function Pick-to: 6.6 6.5 Change-Id: Icb1db5ef55e6ce0bcb61ec823bfb8a7c4bd16ed0 Reviewed-by: Jøger Hansegård Reviewed-by: Artem Dyomin Reviewed-by: Qt CI Bot Reviewed-by: Mikko Hallamaa Reviewed-by: Lars Sutterud (cherry picked from commit ca444c770cfc1f6da6a0dd953dcbe2a3e4019139) Reviewed-by: Qt Cherry-pick Bot --- src/plugins/multimedia/gstreamer/common/qgst_p.h | 36 +++++++++++++----------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/plugins/multimedia/gstreamer/common/qgst_p.h b/src/plugins/multimedia/gstreamer/common/qgst_p.h index 9b02b2dbc..e1f5b92fc 100644 --- a/src/plugins/multimedia/gstreamer/common/qgst_p.h +++ b/src/plugins/multimedia/gstreamer/common/qgst_p.h @@ -428,21 +428,25 @@ public: template void addProbe(T *instance, GstPadProbeType type) { - struct Impl { - static GstPadProbeReturn callback(GstPad *pad, GstPadProbeInfo *info, gpointer userData) { - return (static_cast(userData)->*Member)(QGstPad(pad, NeedsRef), info); - }; + auto callback = [](GstPad *pad, GstPadProbeInfo *info, gpointer userData) { + return (static_cast(userData)->*Member)(QGstPad(pad, NeedsRef), info); }; - gst_pad_add_probe (pad(), type, Impl::callback, instance, nullptr); + gst_pad_add_probe(pad(), type, callback, instance, nullptr); } - void doInIdleProbe(std::function work) { + template + void doInIdleProbe(Functor &&work) + { struct CallbackData { QSemaphore waitDone; - std::function work; - } cd; - cd.work = work; + Functor work; + }; + + CallbackData cd{ + .waitDone = QSemaphore{}, + .work = std::forward(work), + }; auto callback= [](GstPad *, GstPadProbeInfo *, gpointer p) { auto cd = reinterpret_cast(p); @@ -457,16 +461,14 @@ public: template void addEosProbe(T *instance) { - struct Impl { - static GstPadProbeReturn callback(GstPad */*pad*/, GstPadProbeInfo *info, gpointer userData) { - if (GST_EVENT_TYPE(GST_PAD_PROBE_INFO_DATA(info)) != GST_EVENT_EOS) - return GST_PAD_PROBE_PASS; - (static_cast(userData)->*Member)(); - return GST_PAD_PROBE_REMOVE; - }; + auto callback = [](GstPad *, GstPadProbeInfo *info, gpointer userData) { + if (GST_EVENT_TYPE(GST_PAD_PROBE_INFO_DATA(info)) != GST_EVENT_EOS) + return GST_PAD_PROBE_PASS; + (static_cast(userData)->*Member)(); + return GST_PAD_PROBE_REMOVE; }; - gst_pad_add_probe (pad(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, Impl::callback, instance, nullptr); + gst_pad_add_probe(pad(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, callback, instance, nullptr); } }; -- cgit v1.2.3