mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-06 07:28:53 +00:00
composition: Post messages on the bus when it updates itself
And properly set the seqnums of those messages so that the application, parents have the exact information about what is going on and why.
This commit is contained in:
parent
9bd96f9770
commit
463626ceae
2 changed files with 142 additions and 64 deletions
|
@ -48,7 +48,6 @@ GST_DEBUG_CATEGORY_STATIC (gnlcomposition_debug);
|
||||||
G_DEFINE_TYPE_WITH_CODE (GnlComposition, gnl_composition, GNL_TYPE_OBJECT,
|
G_DEFINE_TYPE_WITH_CODE (GnlComposition, gnl_composition, GNL_TYPE_OBJECT,
|
||||||
_do_init);
|
_do_init);
|
||||||
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
|
@ -96,6 +95,14 @@ typedef struct
|
||||||
GnlObject *object;
|
GnlObject *object;
|
||||||
} ChildIOData;
|
} ChildIOData;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
GnlComposition *comp;
|
||||||
|
gint32 seqnum;
|
||||||
|
|
||||||
|
GnlUpdateStackReason reason;
|
||||||
|
} UpdateCompositionData;
|
||||||
|
|
||||||
struct _GnlCompositionPrivate
|
struct _GnlCompositionPrivate
|
||||||
{
|
{
|
||||||
gboolean dispose_has_run;
|
gboolean dispose_has_run;
|
||||||
|
@ -197,13 +204,15 @@ gnl_composition_change_state (GstElement * element, GstStateChange transition);
|
||||||
static inline void gnl_composition_reset_target_pad (GnlComposition * comp);
|
static inline void gnl_composition_reset_target_pad (GnlComposition * comp);
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
seek_handling (GnlComposition * comp, GnlUpdateStackReason update_stack_reason);
|
seek_handling (GnlComposition * comp, gint32 seqnum,
|
||||||
|
GnlUpdateStackReason update_stack_reason);
|
||||||
static gint objects_start_compare (GnlObject * a, GnlObject * b);
|
static gint objects_start_compare (GnlObject * a, GnlObject * b);
|
||||||
static gint objects_stop_compare (GnlObject * a, GnlObject * b);
|
static gint objects_stop_compare (GnlObject * a, GnlObject * b);
|
||||||
static GstClockTime get_current_position (GnlComposition * comp);
|
static GstClockTime get_current_position (GnlComposition * comp);
|
||||||
|
|
||||||
static gboolean update_pipeline (GnlComposition * comp,
|
static gboolean update_pipeline (GnlComposition * comp,
|
||||||
GstClockTime currenttime, GnlUpdateStackReason update_stack_reason);
|
GstClockTime currenttime, gint32 seqnum,
|
||||||
|
GnlUpdateStackReason update_stack_reason);
|
||||||
static gboolean gnl_composition_commit_func (GnlObject * object,
|
static gboolean gnl_composition_commit_func (GnlObject * object,
|
||||||
gboolean recurse);
|
gboolean recurse);
|
||||||
static void update_start_stop_duration (GnlComposition * comp);
|
static void update_start_stop_duration (GnlComposition * comp);
|
||||||
|
@ -213,8 +222,8 @@ gnl_composition_event_handler (GstPad * ghostpad, GstObject * parent,
|
||||||
GstEvent * event);
|
GstEvent * event);
|
||||||
static void _relink_single_node (GnlComposition * comp, GNode * node,
|
static void _relink_single_node (GnlComposition * comp, GNode * node,
|
||||||
GstEvent * toplevel_seek);
|
GstEvent * toplevel_seek);
|
||||||
static gboolean _update_pipeline_func (GnlComposition * comp);
|
static gboolean _update_pipeline_func (UpdateCompositionData * ucompo);
|
||||||
static gboolean _commit_func (GnlComposition * comp);
|
static gboolean _commit_func (UpdateCompositionData * ucompo);
|
||||||
static GstEvent *get_new_seek_event (GnlComposition * comp, gboolean initial,
|
static GstEvent *get_new_seek_event (GnlComposition * comp, gboolean initial,
|
||||||
gboolean updatestoponly);
|
gboolean updatestoponly);
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -226,7 +235,7 @@ static void _deactivate_stack (GnlComposition * comp,
|
||||||
static gboolean _set_real_eos_seqnum_from_seek (GnlComposition * comp,
|
static gboolean _set_real_eos_seqnum_from_seek (GnlComposition * comp,
|
||||||
GstEvent * event);
|
GstEvent * event);
|
||||||
static gboolean _emit_commited_signal_func (GnlComposition * comp);
|
static gboolean _emit_commited_signal_func (GnlComposition * comp);
|
||||||
static void _restart_task (GnlComposition * comp, gboolean emit_commit);
|
static void _restart_task (UpdateCompositionData * ucompo);
|
||||||
|
|
||||||
|
|
||||||
/* COMP_REAL_START: actual position to start current playback at. */
|
/* COMP_REAL_START: actual position to start current playback at. */
|
||||||
|
@ -391,6 +400,33 @@ join_failed:
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_post_start_composition_update (GnlComposition * comp,
|
||||||
|
gint32 seqnum, GnlUpdateStackReason reason)
|
||||||
|
{
|
||||||
|
GstMessage *msg;
|
||||||
|
|
||||||
|
msg = gst_message_new_element (GST_OBJECT (comp),
|
||||||
|
gst_structure_new ("GnlCompositionStartUpdate",
|
||||||
|
"reason", G_TYPE_STRING, UPDATE_PIPELINE_REASONS[reason], NULL));
|
||||||
|
|
||||||
|
gst_message_set_seqnum (msg, seqnum);
|
||||||
|
gst_element_post_message (GST_ELEMENT (comp), msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_post_start_composition_update_done (GnlComposition * comp,
|
||||||
|
gint32 seqnum, GnlUpdateStackReason reason)
|
||||||
|
{
|
||||||
|
GstMessage *msg = gst_message_new_element (GST_OBJECT (comp),
|
||||||
|
gst_structure_new ("GnlCompositionUpdateDone",
|
||||||
|
"reason", G_TYPE_STRING, UPDATE_PIPELINE_REASONS[reason],
|
||||||
|
NULL));
|
||||||
|
|
||||||
|
gst_message_set_seqnum (msg, seqnum);
|
||||||
|
gst_element_post_message (GST_ELEMENT (comp), msg);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_free_seek_data (SeekData * seekd)
|
_free_seek_data (SeekData * seekd)
|
||||||
{
|
{
|
||||||
|
@ -432,6 +468,9 @@ _seek_pipeline_func (SeekData * seekd)
|
||||||
goto beach;
|
goto beach;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_post_start_composition_update (seekd->comp,
|
||||||
|
gst_event_get_seqnum (seekd->event), COMP_UPDATE_STACK_ON_SEEK);
|
||||||
|
|
||||||
/* crop the segment start/stop values */
|
/* crop the segment start/stop values */
|
||||||
/* Only crop segment start value if we don't have a default object */
|
/* Only crop segment start value if we don't have a default object */
|
||||||
if (priv->expandables == NULL)
|
if (priv->expandables == NULL)
|
||||||
|
@ -442,7 +481,11 @@ _seek_pipeline_func (SeekData * seekd)
|
||||||
|
|
||||||
priv->next_base_time = 0;
|
priv->next_base_time = 0;
|
||||||
|
|
||||||
seek_handling (seekd->comp, COMP_UPDATE_STACK_ON_SEEK);
|
seek_handling (seekd->comp, gst_event_get_seqnum (seekd->event),
|
||||||
|
COMP_UPDATE_STACK_ON_SEEK);
|
||||||
|
|
||||||
|
_post_start_composition_update_done (seekd->comp,
|
||||||
|
gst_event_get_seqnum (seekd->event), COMP_UPDATE_STACK_ON_SEEK);
|
||||||
|
|
||||||
beach:
|
beach:
|
||||||
return G_SOURCE_REMOVE;
|
return G_SOURCE_REMOVE;
|
||||||
|
@ -490,17 +533,20 @@ _add_seek_gsource (GnlComposition * comp, GstEvent * event)
|
||||||
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
_initialize_stack_func (GnlComposition * comp)
|
_initialize_stack_func (UpdateCompositionData * ucompo)
|
||||||
{
|
{
|
||||||
|
GnlComposition *comp = ucompo->comp;
|
||||||
GnlCompositionPrivate *priv = comp->priv;
|
GnlCompositionPrivate *priv = comp->priv;
|
||||||
|
|
||||||
|
_post_start_composition_update (comp, ucompo->seqnum, ucompo->reason);
|
||||||
comp->priv->next_base_time = 0;
|
comp->priv->next_base_time = 0;
|
||||||
/* set ghostpad target */
|
/* set ghostpad target */
|
||||||
if (!(update_pipeline (comp, COMP_REAL_START (comp),
|
if (!(update_pipeline (comp, COMP_REAL_START (comp),
|
||||||
COMP_UPDATE_STACK_INITIALIZE))) {
|
ucompo->seqnum, COMP_UPDATE_STACK_INITIALIZE))) {
|
||||||
GST_FIXME_OBJECT (comp, "PLEASE signal state change failure ASYNC");
|
GST_FIXME_OBJECT (comp, "PLEASE signal state change failure ASYNC");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_post_start_composition_update_done (comp, ucompo->seqnum, ucompo->reason);
|
||||||
priv->initialized = TRUE;
|
priv->initialized = TRUE;
|
||||||
|
|
||||||
return G_SOURCE_REMOVE;
|
return G_SOURCE_REMOVE;
|
||||||
|
@ -608,6 +654,29 @@ _add_add_object_gsource (GnlComposition * comp, GnlObject * object)
|
||||||
_free_child_io_data, G_PRIORITY_DEFAULT);
|
_free_child_io_data, G_PRIORITY_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_free_update_compo_data (gpointer updatepipelinedata)
|
||||||
|
{
|
||||||
|
g_slice_free (UpdateCompositionData, updatepipelinedata);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_add_update_compo_gsource (GnlComposition * comp,
|
||||||
|
GSourceFunc func, GnlUpdateStackReason reason)
|
||||||
|
{
|
||||||
|
UpdateCompositionData *ucompo = g_slice_new0 (UpdateCompositionData);
|
||||||
|
|
||||||
|
ucompo->comp = comp;
|
||||||
|
ucompo->reason = reason;
|
||||||
|
ucompo->seqnum = gst_util_seqnum_next ();
|
||||||
|
|
||||||
|
GST_INFO_OBJECT (comp, "Updating because: %s -- Setting seqnum: %i",
|
||||||
|
UPDATE_PIPELINE_REASONS[reason], ucompo->seqnum);
|
||||||
|
|
||||||
|
_add_gsource (comp, (GSourceFunc) func, ucompo,
|
||||||
|
_free_update_compo_data, G_PRIORITY_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gnl_composition_class_init (GnlCompositionClass * klass)
|
gnl_composition_class_init (GnlCompositionClass * klass)
|
||||||
{
|
{
|
||||||
|
@ -750,7 +819,6 @@ gnl_composition_dispose (GObject * object)
|
||||||
|
|
||||||
iter = priv->expandables;
|
iter = priv->expandables;
|
||||||
|
|
||||||
g_print ("ITER IS: %p\n", iter);
|
|
||||||
while (iter) {
|
while (iter) {
|
||||||
GList *next = iter->next;
|
GList *next = iter->next;
|
||||||
|
|
||||||
|
@ -947,14 +1015,18 @@ ghost_event_probe_handler (GstPad * ghostpad G_GNUC_UNUSED,
|
||||||
"seq num is: %i", comp->priv->real_eos_seqnum, seqnum);
|
"seq num is: %i", comp->priv->real_eos_seqnum, seqnum);
|
||||||
|
|
||||||
if (priv->commited_probeid && comp->priv->awaited_caps_seqnum == 0) {
|
if (priv->commited_probeid && comp->priv->awaited_caps_seqnum == 0) {
|
||||||
|
UpdateCompositionData ucompo;
|
||||||
|
|
||||||
GST_INFO_OBJECT (comp, "We got an EOS right after seeing the right"
|
GST_INFO_OBJECT (comp, "We got an EOS right after seeing the right"
|
||||||
" segment, restarting task");
|
" segment, restarting task");
|
||||||
GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (comp),
|
|
||||||
GST_DEBUG_GRAPH_SHOW_ALL, "eos-after-segment");
|
ucompo.comp = comp;
|
||||||
gst_pad_remove_probe (GNL_OBJECT_SRC (comp), priv->commited_probeid);
|
|
||||||
GST_FIXME_OBJECT (comp, "Check it we need to emit or not!!");
|
GST_FIXME_OBJECT (comp, "Check it we need to emit or not!!");
|
||||||
_restart_task (comp, TRUE);
|
ucompo.reason = COMP_UPDATE_STACK_ON_COMMIT;
|
||||||
|
ucompo.seqnum = seqnum;
|
||||||
|
|
||||||
|
gst_pad_remove_probe (GNL_OBJECT_SRC (comp), priv->commited_probeid);
|
||||||
|
_restart_task (&ucompo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_atomic_int_compare_and_exchange (&comp->priv->real_eos_seqnum,
|
if (g_atomic_int_compare_and_exchange (&comp->priv->real_eos_seqnum,
|
||||||
|
@ -967,8 +1039,8 @@ ghost_event_probe_handler (GstPad * ghostpad G_GNUC_UNUSED,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (priv->next_eos_seqnum == seqnum)
|
if (priv->next_eos_seqnum == seqnum)
|
||||||
_add_gsource (comp, (GSourceFunc) _update_pipeline_func, comp,
|
_add_update_compo_gsource (comp, (GSourceFunc) _update_pipeline_func,
|
||||||
NULL, G_PRIORITY_DEFAULT);
|
COMP_UPDATE_STACK_ON_EOS);
|
||||||
else
|
else
|
||||||
GST_INFO_OBJECT (comp,
|
GST_INFO_OBJECT (comp,
|
||||||
"Got an EOS but it seqnum %i != next eos seqnum %i", seqnum,
|
"Got an EOS but it seqnum %i != next eos seqnum %i", seqnum,
|
||||||
|
@ -1024,8 +1096,8 @@ have_to_update_pipeline (GnlComposition * comp,
|
||||||
static gboolean
|
static gboolean
|
||||||
gnl_composition_commit_func (GnlObject * object, gboolean recurse)
|
gnl_composition_commit_func (GnlObject * object, gboolean recurse)
|
||||||
{
|
{
|
||||||
_add_gsource (GNL_COMPOSITION (object), (GSourceFunc) _commit_func,
|
_add_update_compo_gsource (GNL_COMPOSITION (object),
|
||||||
GNL_COMPOSITION (object), NULL, G_PRIORITY_DEFAULT);
|
(GSourceFunc) _commit_func, COMP_UPDATE_STACK_ON_COMMIT);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -1205,19 +1277,23 @@ _seek_current_stack (GnlComposition * comp, GstEvent * event,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
seek_handling (GnlComposition * comp, GnlUpdateStackReason update_stack_reason)
|
seek_handling (GnlComposition * comp, gint32 seqnum,
|
||||||
|
GnlUpdateStackReason update_stack_reason)
|
||||||
{
|
{
|
||||||
GST_DEBUG_OBJECT (comp, "Seek hnalding update pipeline reason: %s",
|
GST_DEBUG_OBJECT (comp, "Seek hanlding update pipeline reason: %s",
|
||||||
UPDATE_PIPELINE_REASONS[update_stack_reason]);
|
UPDATE_PIPELINE_REASONS[update_stack_reason]);
|
||||||
|
|
||||||
if (have_to_update_pipeline (comp, update_stack_reason)) {
|
if (have_to_update_pipeline (comp, update_stack_reason)) {
|
||||||
if (comp->priv->segment->rate >= 0.0)
|
if (comp->priv->segment->rate >= 0.0)
|
||||||
update_pipeline (comp, comp->priv->segment->start, update_stack_reason);
|
update_pipeline (comp, comp->priv->segment->start, seqnum,
|
||||||
|
update_stack_reason);
|
||||||
else
|
else
|
||||||
update_pipeline (comp, comp->priv->segment->stop, update_stack_reason);
|
update_pipeline (comp, comp->priv->segment->stop, seqnum,
|
||||||
|
update_stack_reason);
|
||||||
} else {
|
} else {
|
||||||
GstEvent *toplevel_seek = get_new_seek_event (comp, FALSE, FALSE);
|
GstEvent *toplevel_seek = get_new_seek_event (comp, FALSE, FALSE);
|
||||||
|
|
||||||
|
gst_event_set_seqnum (toplevel_seek, seqnum);
|
||||||
_set_real_eos_seqnum_from_seek (comp, toplevel_seek);
|
_set_real_eos_seqnum_from_seek (comp, toplevel_seek);
|
||||||
|
|
||||||
_seek_current_stack (comp, toplevel_seek,
|
_seek_current_stack (comp, toplevel_seek,
|
||||||
|
@ -1792,7 +1868,7 @@ _set_current_bin_to_ready (GnlComposition * comp, gboolean flush_downstream)
|
||||||
flush_event = gst_event_new_flush_start ();
|
flush_event = gst_event_new_flush_start ();
|
||||||
priv->flush_seqnum = gst_event_get_seqnum (flush_event);
|
priv->flush_seqnum = gst_event_get_seqnum (flush_event);
|
||||||
GST_INFO_OBJECT (comp, "sending flushes downstream with seqnum %d",
|
GST_INFO_OBJECT (comp, "sending flushes downstream with seqnum %d",
|
||||||
priv->flush_seqnum);
|
priv->flush_seqnum);
|
||||||
gst_pad_push_event (ptarget, flush_event);
|
gst_pad_push_event (ptarget, flush_event);
|
||||||
|
|
||||||
flush_event = gst_event_new_flush_stop (TRUE);
|
flush_event = gst_event_new_flush_stop (TRUE);
|
||||||
|
@ -1852,12 +1928,14 @@ _emit_commited_signal_func (GnlComposition * comp)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_restart_task (GnlComposition * comp, gboolean emit_commit)
|
_restart_task (UpdateCompositionData * ucompo)
|
||||||
{
|
{
|
||||||
GST_INFO_OBJECT (comp, "Restarting task! (%semiting commit done)",
|
GnlComposition *comp = ucompo->comp;
|
||||||
emit_commit ? "" : "NOT ");
|
|
||||||
|
|
||||||
if (emit_commit)
|
GST_INFO_OBJECT (comp, "Restarting task! after %s DONE",
|
||||||
|
UPDATE_PIPELINE_REASONS[ucompo->reason]);
|
||||||
|
|
||||||
|
if (ucompo->reason == COMP_UPDATE_STACK_ON_COMMIT)
|
||||||
_add_gsource (comp, (GSourceFunc) _emit_commited_signal_func, comp, NULL,
|
_add_gsource (comp, (GSourceFunc) _emit_commited_signal_func, comp, NULL,
|
||||||
G_PRIORITY_HIGH);
|
G_PRIORITY_HIGH);
|
||||||
|
|
||||||
|
@ -1868,8 +1946,10 @@ _restart_task (GnlComposition * comp, gboolean emit_commit)
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
_is_ready_to_restart_task (GnlComposition * comp, GstEvent * event)
|
_is_ready_to_restart_task (UpdateCompositionData * ucompo, GstEvent * event)
|
||||||
{
|
{
|
||||||
|
GnlComposition *comp = ucompo->comp;
|
||||||
|
|
||||||
if (GST_EVENT_TYPE (event) == GST_EVENT_CAPS ||
|
if (GST_EVENT_TYPE (event) == GST_EVENT_CAPS ||
|
||||||
GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
|
GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
|
||||||
gint seqnum = gst_event_get_seqnum (event);
|
gint seqnum = gst_event_get_seqnum (event);
|
||||||
|
@ -1879,6 +1959,7 @@ _is_ready_to_restart_task (GnlComposition * comp, GstEvent * event)
|
||||||
gchar *name = g_strdup_printf ("new-stack__%" GST_TIME_FORMAT "--%"
|
gchar *name = g_strdup_printf ("new-stack__%" GST_TIME_FORMAT "--%"
|
||||||
GST_TIME_FORMAT "", GST_TIME_ARGS (comp->priv->segment_start),
|
GST_TIME_FORMAT "", GST_TIME_ARGS (comp->priv->segment_start),
|
||||||
GST_TIME_ARGS (comp->priv->segment_stop));
|
GST_TIME_ARGS (comp->priv->segment_stop));
|
||||||
|
|
||||||
GST_INFO_OBJECT (comp, "Got %s with proper seqnum"
|
GST_INFO_OBJECT (comp, "Got %s with proper seqnum"
|
||||||
" done with stack reconfiguration %" GST_PTR_FORMAT,
|
" done with stack reconfiguration %" GST_PTR_FORMAT,
|
||||||
GST_EVENT_TYPE_NAME (event), event);
|
GST_EVENT_TYPE_NAME (event), event);
|
||||||
|
@ -1899,23 +1980,11 @@ _is_ready_to_restart_task (GnlComposition * comp, GstEvent * event)
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstPadProbeReturn
|
static GstPadProbeReturn
|
||||||
_commit_done_cb (GstPad * pad, GstPadProbeInfo * info, GnlComposition * comp)
|
_is_update_done_cb (GstPad * pad, GstPadProbeInfo * info,
|
||||||
|
UpdateCompositionData * ucompo)
|
||||||
{
|
{
|
||||||
if (_is_ready_to_restart_task (comp, info->data)) {
|
if (_is_ready_to_restart_task (ucompo, info->data)) {
|
||||||
_restart_task (comp, TRUE);
|
_restart_task (ucompo);
|
||||||
|
|
||||||
return GST_PAD_PROBE_REMOVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return GST_PAD_PROBE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstPadProbeReturn
|
|
||||||
_stack_setup_done_cb (GstPad * pad, GstPadProbeInfo * info,
|
|
||||||
GnlComposition * comp)
|
|
||||||
{
|
|
||||||
if (_is_ready_to_restart_task (comp, info->data)) {
|
|
||||||
_restart_task (comp, FALSE);
|
|
||||||
|
|
||||||
return GST_PAD_PROBE_REMOVE;
|
return GST_PAD_PROBE_REMOVE;
|
||||||
}
|
}
|
||||||
|
@ -1942,11 +2011,14 @@ _commit_values (GnlComposition * comp)
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
_commit_func (GnlComposition * comp)
|
_commit_func (UpdateCompositionData * ucompo)
|
||||||
{
|
{
|
||||||
GstClockTime curpos;
|
GstClockTime curpos;
|
||||||
|
GnlComposition *comp = ucompo->comp;
|
||||||
GnlCompositionPrivate *priv = comp->priv;
|
GnlCompositionPrivate *priv = comp->priv;
|
||||||
|
|
||||||
|
_post_start_composition_update (comp, ucompo->seqnum, ucompo->reason);
|
||||||
|
|
||||||
priv->next_base_time = 0;
|
priv->next_base_time = 0;
|
||||||
GST_INFO_OBJECT (comp, "Commiting state");
|
GST_INFO_OBJECT (comp, "Commiting state");
|
||||||
|
|
||||||
|
@ -1960,6 +2032,7 @@ _commit_func (GnlComposition * comp)
|
||||||
GST_INFO_OBJECT (comp, "Nothing to commit, leaving");
|
GST_INFO_OBJECT (comp, "Nothing to commit, leaving");
|
||||||
|
|
||||||
g_signal_emit (comp, _signals[COMMITED_SIGNAL], 0, FALSE);
|
g_signal_emit (comp, _signals[COMMITED_SIGNAL], 0, FALSE);
|
||||||
|
_post_start_composition_update_done (comp, ucompo->seqnum, ucompo->reason);
|
||||||
|
|
||||||
return G_SOURCE_REMOVE;
|
return G_SOURCE_REMOVE;
|
||||||
}
|
}
|
||||||
|
@ -1981,7 +2054,7 @@ _commit_func (GnlComposition * comp)
|
||||||
/* And update the pipeline at current position if needed */
|
/* And update the pipeline at current position if needed */
|
||||||
|
|
||||||
update_start_stop_duration (comp);
|
update_start_stop_duration (comp);
|
||||||
update_pipeline (comp, curpos, COMP_UPDATE_STACK_ON_COMMIT);
|
update_pipeline (comp, curpos, ucompo->seqnum, COMP_UPDATE_STACK_ON_COMMIT);
|
||||||
|
|
||||||
if (!priv->current) {
|
if (!priv->current) {
|
||||||
GST_INFO_OBJECT (comp, "No new stack set, we can go and keep acting on"
|
GST_INFO_OBJECT (comp, "No new stack set, we can go and keep acting on"
|
||||||
|
@ -1991,17 +2064,21 @@ _commit_func (GnlComposition * comp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_post_start_composition_update_done (comp, ucompo->seqnum, ucompo->reason);
|
||||||
|
|
||||||
return G_SOURCE_REMOVE;
|
return G_SOURCE_REMOVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
_update_pipeline_func (GnlComposition * comp)
|
_update_pipeline_func (UpdateCompositionData * ucompo)
|
||||||
{
|
{
|
||||||
GnlCompositionPrivate *priv;
|
|
||||||
gboolean reverse;
|
gboolean reverse;
|
||||||
|
GnlComposition *comp = ucompo->comp;
|
||||||
|
GnlCompositionPrivate *priv = comp->priv;
|
||||||
|
|
||||||
|
_post_start_composition_update (comp, ucompo->seqnum, ucompo->reason);
|
||||||
|
|
||||||
/* Set up a non-initial seek on segment_stop */
|
/* Set up a non-initial seek on segment_stop */
|
||||||
priv = comp->priv;
|
|
||||||
reverse = (priv->segment->rate < 0.0);
|
reverse = (priv->segment->rate < 0.0);
|
||||||
if (!reverse) {
|
if (!reverse) {
|
||||||
GST_DEBUG_OBJECT (comp,
|
GST_DEBUG_OBJECT (comp,
|
||||||
|
@ -2015,7 +2092,7 @@ _update_pipeline_func (GnlComposition * comp)
|
||||||
priv->segment->stop = priv->segment_start;
|
priv->segment->stop = priv->segment_start;
|
||||||
}
|
}
|
||||||
|
|
||||||
seek_handling (comp, COMP_UPDATE_STACK_ON_EOS);
|
seek_handling (comp, ucompo->seqnum, COMP_UPDATE_STACK_ON_EOS);
|
||||||
|
|
||||||
/* Post segment done if last seek was a segment seek */
|
/* Post segment done if last seek was a segment seek */
|
||||||
if (!priv->current && (priv->segment->flags & GST_SEEK_FLAG_SEGMENT)) {
|
if (!priv->current && (priv->segment->flags & GST_SEEK_FLAG_SEGMENT)) {
|
||||||
|
@ -2035,6 +2112,7 @@ _update_pipeline_func (GnlComposition * comp)
|
||||||
gst_event_new_segment_done (priv->segment->format, epos));
|
gst_event_new_segment_done (priv->segment->format, epos));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_post_start_composition_update_done (comp, ucompo->seqnum, ucompo->reason);
|
||||||
|
|
||||||
return G_SOURCE_REMOVE;
|
return G_SOURCE_REMOVE;
|
||||||
}
|
}
|
||||||
|
@ -2073,8 +2151,8 @@ gnl_composition_change_state (GstElement * element, GstStateChange transition)
|
||||||
GST_DEBUG_OBJECT (comp,
|
GST_DEBUG_OBJECT (comp,
|
||||||
"Setting all children to READY and locking their state");
|
"Setting all children to READY and locking their state");
|
||||||
|
|
||||||
_add_gsource (comp, (GSourceFunc) _initialize_stack_func, comp,
|
_add_update_compo_gsource (comp, (GSourceFunc) _initialize_stack_func,
|
||||||
NULL, G_PRIORITY_DEFAULT);
|
COMP_UPDATE_STACK_INITIALIZE);
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||||
_stop_task (comp);
|
_stop_task (comp);
|
||||||
|
@ -2562,7 +2640,7 @@ _set_real_eos_seqnum_from_seek (GnlComposition * comp, GstEvent * event)
|
||||||
* WITH OBJECTS LOCK TAKEN
|
* WITH OBJECTS LOCK TAKEN
|
||||||
*/
|
*/
|
||||||
static gboolean
|
static gboolean
|
||||||
update_pipeline (GnlComposition * comp, GstClockTime currenttime,
|
update_pipeline (GnlComposition * comp, GstClockTime currenttime, gint32 seqnum,
|
||||||
GnlUpdateStackReason update_reason)
|
GnlUpdateStackReason update_reason)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -2581,10 +2659,10 @@ update_pipeline (GnlComposition * comp, GstClockTime currenttime,
|
||||||
|
|
||||||
_assert_proper_thread (comp);
|
_assert_proper_thread (comp);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (comp,
|
GST_INFO_OBJECT (comp,
|
||||||
"currenttime:%" GST_TIME_FORMAT
|
"currenttime:%" GST_TIME_FORMAT
|
||||||
" Reason: %s", GST_TIME_ARGS (currenttime),
|
" Reason: %s, Seqnum: %i", GST_TIME_ARGS (currenttime),
|
||||||
UPDATE_PIPELINE_REASONS[update_reason]);
|
UPDATE_PIPELINE_REASONS[update_reason], seqnum);
|
||||||
|
|
||||||
if (!GST_CLOCK_TIME_IS_VALID (currenttime))
|
if (!GST_CLOCK_TIME_IS_VALID (currenttime))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -2637,6 +2715,7 @@ update_pipeline (GnlComposition * comp, GstClockTime currenttime,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
toplevel_seek = get_new_seek_event (comp, TRUE, updatestoponly);
|
toplevel_seek = get_new_seek_event (comp, TRUE, updatestoponly);
|
||||||
|
gst_event_set_seqnum (toplevel_seek, seqnum);
|
||||||
_set_real_eos_seqnum_from_seek (comp, toplevel_seek);
|
_set_real_eos_seqnum_from_seek (comp, toplevel_seek);
|
||||||
|
|
||||||
_remove_all_update_sources (comp);
|
_remove_all_update_sources (comp);
|
||||||
|
@ -2654,21 +2733,20 @@ update_pipeline (GnlComposition * comp, GstClockTime currenttime,
|
||||||
priv->current = stack;
|
priv->current = stack;
|
||||||
|
|
||||||
if (priv->current) {
|
if (priv->current) {
|
||||||
GstPadProbeCallback _stack_setup_done;
|
UpdateCompositionData *ucompo = g_slice_new0 (UpdateCompositionData);
|
||||||
|
|
||||||
GST_INFO_OBJECT (comp, "New stack set and ready to run, probing src pad"
|
GST_INFO_OBJECT (comp, "New stack set and ready to run, probing src pad"
|
||||||
" and stopping children thread until we are actually ready with"
|
" and stopping children thread until we are actually ready with"
|
||||||
" that new stack");
|
" that new stack");
|
||||||
|
|
||||||
if (update_reason == COMP_UPDATE_STACK_ON_COMMIT)
|
ucompo->comp = comp;
|
||||||
_stack_setup_done = (GstPadProbeCallback) _commit_done_cb;
|
ucompo->reason = update_reason;
|
||||||
else
|
ucompo->seqnum = seqnum;
|
||||||
_stack_setup_done = (GstPadProbeCallback) _stack_setup_done_cb;
|
|
||||||
|
|
||||||
comp->priv->awaited_caps_seqnum = priv->next_eos_seqnum;
|
comp->priv->awaited_caps_seqnum = priv->next_eos_seqnum;
|
||||||
priv->commited_probeid = gst_pad_add_probe (GNL_OBJECT_SRC (comp),
|
priv->commited_probeid = gst_pad_add_probe (GNL_OBJECT_SRC (comp),
|
||||||
GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM,
|
GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM,
|
||||||
(GstPadProbeCallback) _stack_setup_done, comp, NULL);
|
(GstPadProbeCallback) _is_update_done_cb, ucompo,
|
||||||
|
_free_update_compo_data);
|
||||||
|
|
||||||
gst_task_pause (comp->task);
|
gst_task_pause (comp->task);
|
||||||
}
|
}
|
||||||
|
|
|
@ -218,9 +218,9 @@ GST_START_TEST (test_dispose_on_commit)
|
||||||
fail_unless (gst_element_link (composition, fakesink) == TRUE);
|
fail_unless (gst_element_link (composition, fakesink) == TRUE);
|
||||||
|
|
||||||
|
|
||||||
|
ASSERT_OBJECT_REFCOUNT (composition, "composition", 1);
|
||||||
g_signal_emit_by_name (composition, "commit", TRUE, &ret);
|
g_signal_emit_by_name (composition, "commit", TRUE, &ret);
|
||||||
|
|
||||||
ASSERT_OBJECT_REFCOUNT (composition, "composition", 1);
|
|
||||||
gst_object_unref (pipeline);
|
gst_object_unref (pipeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue