From 4a9c9f8cd490223ba5bd10f22831264980628738 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Tue, 17 Sep 2019 22:42:51 +0200 Subject: [PATCH] gstreamer: disconnect callbacks, avoid gst_discoverer_stop --- src/engine/gstenginepipeline.cpp | 57 ++++++++++++++++++++++---------- src/engine/gstenginepipeline.h | 8 ++++- 2 files changed, 46 insertions(+), 19 deletions(-) diff --git a/src/engine/gstenginepipeline.cpp b/src/engine/gstenginepipeline.cpp index 1f26c895b..395d98764 100644 --- a/src/engine/gstenginepipeline.cpp +++ b/src/engine/gstenginepipeline.cpp @@ -105,7 +105,13 @@ GstEnginePipeline::GstEnginePipeline(GstEngine *engine) equalizer_(nullptr), rgvolume_(nullptr), rglimiter_(nullptr), - discoverer_(nullptr) + discoverer_(nullptr), + about_to_finish_cb_id_(-1), + pad_added_cb_id_(-1), + notify_source_cb_id_(-1), + bus_cb_id_(-1), + discovery_finished_cb_id_(-1), + discovery_discovered_cb_id_(-1) { if (!sElementDeleter) { @@ -118,18 +124,33 @@ GstEnginePipeline::GstEnginePipeline(GstEngine *engine) GstEnginePipeline::~GstEnginePipeline() { - if (pipeline_) { - gst_bus_set_sync_handler(gst_pipeline_get_bus(GST_PIPELINE(pipeline_)), nullptr, nullptr, nullptr); - g_source_remove(bus_cb_id_); - gst_element_set_state(pipeline_, GST_STATE_NULL); - gst_object_unref(GST_OBJECT(pipeline_)); + if (discoverer_) { + + if (discovery_discovered_cb_id_ != -1) + g_signal_handler_disconnect(G_OBJECT(discoverer_), discovery_discovered_cb_id_); + if (discovery_finished_cb_id_ != -1) + g_signal_handler_disconnect(G_OBJECT(discoverer_), discovery_finished_cb_id_); + + g_object_unref(discoverer_); } - if (discoverer_) { -#ifdef Q_OS_LINUX - gst_discoverer_stop(discoverer_); -#endif - g_object_unref(discoverer_); + if (pipeline_) { + + if (about_to_finish_cb_id_ != -1) + g_signal_handler_disconnect(G_OBJECT(pipeline_), about_to_finish_cb_id_); + + if (pad_added_cb_id_ != -1) + g_signal_handler_disconnect(G_OBJECT(pipeline_), pad_added_cb_id_); + + if (notify_source_cb_id_ != -1) + g_signal_handler_disconnect(G_OBJECT(pipeline_), notify_source_cb_id_); + + gst_bus_set_sync_handler(gst_pipeline_get_bus(GST_PIPELINE(pipeline_)), nullptr, nullptr, nullptr); + if (bus_cb_id_ != -1) + g_source_remove(bus_cb_id_); + gst_element_set_state(pipeline_, GST_STATE_NULL); + + gst_object_unref(GST_OBJECT(pipeline_)); } } @@ -449,16 +470,15 @@ bool GstEnginePipeline::InitFromUrl(const QByteArray &stream_url, const QUrl ori flags &= ~0x00000001; g_object_set(G_OBJECT(pipeline_), "flags", flags, nullptr); - CHECKED_GCONNECT(G_OBJECT(pipeline_), "about-to-finish", &AboutToFinishCallback, this); - - CHECKED_GCONNECT(G_OBJECT(pipeline_), "pad-added", &NewPadCallback, this); - CHECKED_GCONNECT(G_OBJECT(pipeline_), "notify::source", &SourceSetupCallback, this); + about_to_finish_cb_id_ = CHECKED_GCONNECT(G_OBJECT(pipeline_), "about-to-finish", &AboutToFinishCallback, this); + pad_added_cb_id_ = CHECKED_GCONNECT(G_OBJECT(pipeline_), "pad-added", &NewPadCallback, this); + notify_source_cb_id_ = CHECKED_GCONNECT(G_OBJECT(pipeline_), "notify::source", &SourceSetupCallback, this); // Setting up a discoverer discoverer_ = gst_discoverer_new(kDiscoveryTimeoutS * GST_SECOND, nullptr); if (discoverer_) { - CHECKED_GCONNECT(G_OBJECT(discoverer_), "discovered", &StreamDiscovered, this); - CHECKED_GCONNECT(G_OBJECT(discoverer_), "finished", &StreamDiscoveryFinished, this); + discovery_discovered_cb_id_ = CHECKED_GCONNECT(G_OBJECT(discoverer_), "discovered", &StreamDiscovered, this); + discovery_finished_cb_id_ = CHECKED_GCONNECT(G_OBJECT(discoverer_), "finished", &StreamDiscoveryFinished, this); gst_discoverer_start(discoverer_); } @@ -1230,9 +1250,10 @@ void GstEnginePipeline::StreamDiscovered(GstDiscoverer *discoverer, GstDiscovere } void GstEnginePipeline::StreamDiscoveryFinished(GstDiscoverer *discoverer, gpointer self) { + Q_UNUSED(discoverer); Q_UNUSED(self); - //GstEnginePipeline *instance = reinterpret_cast(self); + } QString GstEnginePipeline::GSTdiscovererErrorMessage(GstDiscovererResult result) { diff --git a/src/engine/gstenginepipeline.h b/src/engine/gstenginepipeline.h index 938d16e0a..9a292c255 100644 --- a/src/engine/gstenginepipeline.h +++ b/src/engine/gstenginepipeline.h @@ -286,11 +286,17 @@ signals: GstElement *rglimiter_; GstDiscoverer *discoverer_; - uint bus_cb_id_; + int about_to_finish_cb_id_; + int pad_added_cb_id_; + int notify_source_cb_id_; + int bus_cb_id_; + int discovery_finished_cb_id_; + int discovery_discovered_cb_id_; QThreadPool set_state_threadpool_; GstSegment last_decodebin_segment_; + }; #endif // GSTENGINEPIPELINE_H