gstreamer: disconnect callbacks, avoid gst_discoverer_stop

This commit is contained in:
Jonas Kvinge 2019-09-17 22:42:51 +02:00
parent bdc089290d
commit 4a9c9f8cd4
2 changed files with 46 additions and 19 deletions

View File

@ -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<GstEnginePipeline*>(self);
}
QString GstEnginePipeline::GSTdiscovererErrorMessage(GstDiscovererResult result) {

View File

@ -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