mirror of
https://github.com/Rafostar/clapper.git
synced 2025-08-29 23:32:04 +02:00
API: simplify EOS handling
Do not try to play smart with EOS by seeking to beginning. This leads to various errors or crashes. Just signal it and stop afterwards.
This commit is contained in:
44
lib/gst/clapper/gstclapper.c
vendored
44
lib/gst/clapper/gstclapper.c
vendored
@@ -139,7 +139,7 @@ struct _GstClapper
|
||||
GstElement *playbin;
|
||||
GstBus *bus;
|
||||
GstState target_state, current_state;
|
||||
gboolean is_live, is_eos;
|
||||
gboolean is_live;
|
||||
GSource *tick_source, *ready_timeout_source;
|
||||
GstClockTime cached_duration;
|
||||
|
||||
@@ -1129,7 +1129,6 @@ emit_error (GstClapper * self, GError * err)
|
||||
self->target_state = GST_STATE_NULL;
|
||||
self->current_state = GST_STATE_NULL;
|
||||
self->is_live = FALSE;
|
||||
self->is_eos = FALSE;
|
||||
gst_element_set_state (self->playbin, GST_STATE_NULL);
|
||||
change_state (self, GST_CLAPPER_STATE_STOPPED);
|
||||
self->buffering = 100;
|
||||
@@ -1316,9 +1315,9 @@ eos_cb (G_GNUC_UNUSED GstBus * bus, G_GNUC_UNUSED GstMessage * msg,
|
||||
gst_clapper_signal_dispatcher_dispatch (self->signal_dispatcher, self,
|
||||
eos_dispatch, g_object_ref (self), (GDestroyNotify) g_object_unref);
|
||||
}
|
||||
change_state (self, GST_CLAPPER_STATE_STOPPED);
|
||||
self->buffering = 100;
|
||||
self->is_eos = TRUE;
|
||||
|
||||
/* TODO: repeat instead of stop */
|
||||
gst_clapper_stop_internal (self, FALSE);
|
||||
}
|
||||
|
||||
typedef struct
|
||||
@@ -2946,7 +2945,6 @@ gst_clapper_main (gpointer data)
|
||||
self->current_state = GST_STATE_NULL;
|
||||
change_state (self, GST_CLAPPER_STATE_STOPPED);
|
||||
self->buffering = 100;
|
||||
self->is_eos = FALSE;
|
||||
self->is_live = FALSE;
|
||||
self->rate = 1.0;
|
||||
self->seek_mode = DEFAULT_SEEK_MODE;
|
||||
@@ -3040,7 +3038,7 @@ gst_clapper_play_internal (gpointer user_data)
|
||||
if (self->current_state < GST_STATE_PAUSED)
|
||||
change_state (self, GST_CLAPPER_STATE_BUFFERING);
|
||||
|
||||
if (self->current_state >= GST_STATE_PAUSED && !self->is_eos
|
||||
if (self->current_state >= GST_STATE_PAUSED
|
||||
&& self->buffering >= 100 && !(self->seek_position != GST_CLOCK_TIME_NONE
|
||||
|| self->seek_pending)) {
|
||||
state_ret = gst_element_set_state (self->playbin, GST_STATE_PLAYING);
|
||||
@@ -3057,21 +3055,6 @@ gst_clapper_play_internal (gpointer user_data)
|
||||
GST_DEBUG_OBJECT (self, "Pipeline is live");
|
||||
}
|
||||
|
||||
if (self->is_eos) {
|
||||
gboolean ret;
|
||||
|
||||
GST_DEBUG_OBJECT (self, "Was EOS, seeking to beginning");
|
||||
self->is_eos = FALSE;
|
||||
ret =
|
||||
gst_element_seek_simple (self->playbin, GST_FORMAT_TIME,
|
||||
GST_SEEK_FLAG_FLUSH, 0);
|
||||
if (!ret) {
|
||||
GST_ERROR_OBJECT (self, "Seek to beginning failed");
|
||||
gst_clapper_stop_internal (self, TRUE);
|
||||
gst_clapper_play_internal (self);
|
||||
}
|
||||
}
|
||||
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
@@ -3133,21 +3116,6 @@ gst_clapper_pause_internal (gpointer user_data)
|
||||
GST_DEBUG_OBJECT (self, "Pipeline is live");
|
||||
}
|
||||
|
||||
if (self->is_eos) {
|
||||
gboolean ret;
|
||||
|
||||
GST_DEBUG_OBJECT (self, "Was EOS, seeking to beginning");
|
||||
self->is_eos = FALSE;
|
||||
ret =
|
||||
gst_element_seek_simple (self->playbin, GST_FORMAT_TIME,
|
||||
GST_SEEK_FLAG_FLUSH, 0);
|
||||
if (!ret) {
|
||||
GST_ERROR_OBJECT (self, "Seek to beginning failed");
|
||||
gst_clapper_stop_internal (self, TRUE);
|
||||
gst_clapper_pause_internal (self);
|
||||
}
|
||||
}
|
||||
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
@@ -3216,7 +3184,6 @@ gst_clapper_stop_internal (GstClapper * self, gboolean transient)
|
||||
self->target_state = GST_STATE_NULL;
|
||||
self->current_state = GST_STATE_READY;
|
||||
self->is_live = FALSE;
|
||||
self->is_eos = FALSE;
|
||||
gst_bus_set_flushing (self->bus, TRUE);
|
||||
gst_element_set_state (self->playbin, GST_STATE_READY);
|
||||
gst_bus_set_flushing (self->bus, FALSE);
|
||||
@@ -3325,7 +3292,6 @@ gst_clapper_seek_internal_locked (GstClapper * self)
|
||||
g_mutex_unlock (&self->lock);
|
||||
|
||||
remove_tick_source (self);
|
||||
self->is_eos = FALSE;
|
||||
|
||||
flags |= GST_SEEK_FLAG_FLUSH;
|
||||
|
||||
|
Reference in New Issue
Block a user