gstclapper: Go into NULL state directly when stopped

Instead of waiting another 60 seconds for user, go into NULL state ASAP to free all resources and open devices.
This commit is contained in:
Rafostar
2022-01-09 13:20:29 +01:00
parent 3feaf225b5
commit 469c06d22b

View File

@@ -152,7 +152,7 @@ struct _GstClapper
GstBus *bus;
GstState target_state, current_state;
gboolean is_live;
GSource *tick_source, *ready_timeout_source;
GSource *tick_source;
GstClockTime cached_duration;
gdouble rate;
@@ -1138,44 +1138,6 @@ remove_tick_source (GstClapper * self)
self->tick_source = NULL;
}
static gboolean
ready_timeout_cb (gpointer user_data)
{
GstClapper *self = user_data;
if (self->target_state <= GST_STATE_READY) {
GST_DEBUG_OBJECT (self, "Setting pipeline to NULL state");
self->target_state = GST_STATE_NULL;
self->current_state = GST_STATE_NULL;
gst_element_set_state (self->playbin, GST_STATE_NULL);
}
return G_SOURCE_REMOVE;
}
static void
add_ready_timeout_source (GstClapper * self)
{
if (self->ready_timeout_source)
return;
self->ready_timeout_source = g_timeout_source_new_seconds (60);
g_source_set_callback (self->ready_timeout_source,
(GSourceFunc) ready_timeout_cb, self, NULL);
g_source_attach (self->ready_timeout_source, self->context);
}
static void
remove_ready_timeout_source (GstClapper * self)
{
if (!self->ready_timeout_source)
return;
g_source_destroy (self->ready_timeout_source);
g_source_unref (self->ready_timeout_source);
self->ready_timeout_source = NULL;
}
typedef struct
{
GstClapper *clapper;
@@ -1220,7 +1182,6 @@ emit_error (GstClapper * self, GError * err)
g_error_free (err);
remove_tick_source (self);
remove_ready_timeout_source (self);
self->target_state = GST_STATE_NULL;
self->current_state = GST_STATE_NULL;
@@ -3412,7 +3373,6 @@ gst_clapper_main (gpointer data)
gst_object_unref (bus);
remove_tick_source (self);
remove_ready_timeout_source (self);
g_mutex_lock (&self->lock);
if (self->media_info) {
@@ -3679,7 +3639,6 @@ gst_clapper_play_internal (gpointer user_data)
}
g_mutex_unlock (&self->lock);
remove_ready_timeout_source (self);
self->target_state = GST_STATE_PLAYING;
if (self->current_state < GST_STATE_PAUSED)
@@ -3747,7 +3706,6 @@ gst_clapper_pause_internal (gpointer user_data)
tick_cb (self);
remove_tick_source (self);
remove_ready_timeout_source (self);
self->target_state = GST_STATE_PAUSED;
@@ -3827,13 +3785,11 @@ gst_clapper_stop_internal (GstClapper * self, gboolean transient)
tick_cb (self);
remove_tick_source (self);
add_ready_timeout_source (self);
self->target_state = GST_STATE_NULL;
self->current_state = GST_STATE_READY;
self->current_state = GST_STATE_NULL;
self->is_live = FALSE;
gst_bus_set_flushing (self->bus, TRUE);
gst_element_set_state (self->playbin, GST_STATE_READY);
gst_element_set_state (self->playbin, GST_STATE_NULL);
gst_bus_set_flushing (self->bus, FALSE);
change_state (self, transient && self->app_state != GST_CLAPPER_STATE_STOPPED
? GST_CLAPPER_STATE_BUFFERING : GST_CLAPPER_STATE_STOPPED);