mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-22 14:06:23 +00:00
composition: Teach the composition to seek same stack
Co-Authored by: Thibault Saunier <tsaunier@gnome.org>
This commit is contained in:
parent
c05898a169
commit
0e663da588
2 changed files with 44 additions and 25 deletions
|
@ -169,6 +169,9 @@ struct _GnlCompositionPrivate
|
|||
GstState deactivated_elements_state;
|
||||
|
||||
GstElement *current_bin;
|
||||
|
||||
|
||||
gboolean seeking_itself;
|
||||
};
|
||||
|
||||
static guint _signals[LAST_SIGNAL] = { 0 };
|
||||
|
@ -1509,11 +1512,15 @@ gnl_composition_event_handler (GstPad * ghostpad, GstObject * parent,
|
|||
switch (GST_EVENT_TYPE (event)) {
|
||||
case GST_EVENT_SEEK:
|
||||
{
|
||||
_add_seek_gsource (comp, event);
|
||||
event = NULL;
|
||||
GST_FIXME_OBJECT (comp, "HANDLE seeking errors!");
|
||||
if (!priv->seeking_itself) {
|
||||
_add_seek_gsource (comp, event);
|
||||
event = NULL;
|
||||
GST_FIXME_OBJECT (comp, "HANDLE seeking errors!");
|
||||
|
||||
return TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case GST_EVENT_QOS:
|
||||
{
|
||||
|
@ -2712,14 +2719,26 @@ update_pipeline (GnlComposition * comp, GstClockTime currenttime,
|
|||
}
|
||||
|
||||
/* Activate stack */
|
||||
if (samestack && (startchanged || stopchanged)) {
|
||||
/* Update seek events need to be flushing if not in PLAYING,
|
||||
* else we will encounter deadlocks. */
|
||||
forcing_flush = (state == GST_STATE_PLAYING) ? FALSE : TRUE;
|
||||
}
|
||||
if (!samestack) {
|
||||
return _activate_new_stack (comp, initial);
|
||||
} else {
|
||||
gboolean res;
|
||||
GstEvent *toplevel_seek;
|
||||
GstPad *peer = gst_pad_get_peer (GNL_OBJECT_SRC (comp));
|
||||
|
||||
_activate_new_stack (comp, forcing_flush);
|
||||
return TRUE;
|
||||
if (samestack && (startchanged || stopchanged)) {
|
||||
/* Update seek events need to be flushing if not in PLAYING,
|
||||
* else we will encounter deadlocks. */
|
||||
forcing_flush = (state == GST_STATE_PLAYING) ? FALSE : TRUE;
|
||||
}
|
||||
toplevel_seek = get_new_seek_event (comp, TRUE, forcing_flush);
|
||||
|
||||
priv->seeking_itself = TRUE;
|
||||
res = gst_pad_push_event (peer, toplevel_seek);
|
||||
priv->seeking_itself = FALSE;
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
|
|
@ -188,14 +188,14 @@ GST_START_TEST (test_one_space_another)
|
|||
GST_ERROR ("doing one commit");
|
||||
commit_and_wait (comp, &ret);
|
||||
check_start_stop_duration (comp, 0, 1 * GST_SECOND, 1 * GST_SECOND);
|
||||
ASSERT_OBJECT_REFCOUNT (source1, "source1", 2);
|
||||
ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
|
||||
|
||||
/* Second source */
|
||||
|
||||
gnl_composition_add (GST_BIN (comp), source2);
|
||||
check_start_stop_duration (comp, 0, 1 * GST_SECOND, 1 * GST_SECOND);
|
||||
commit_and_wait (comp, &ret);
|
||||
ASSERT_OBJECT_REFCOUNT (source2, "source2", 2);
|
||||
ASSERT_OBJECT_REFCOUNT (source2, "source2", 1);
|
||||
|
||||
/* Remove first source */
|
||||
|
||||
|
@ -211,7 +211,7 @@ GST_START_TEST (test_one_space_another)
|
|||
commit_and_wait (comp, &ret);
|
||||
check_start_stop_duration (comp, 0, 3 * GST_SECOND, 3 * GST_SECOND);
|
||||
gst_object_unref (source1);
|
||||
ASSERT_OBJECT_REFCOUNT (source1, "source1", 2);
|
||||
ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
|
||||
|
||||
/* Expected segments */
|
||||
segments = g_list_append (segments,
|
||||
|
@ -294,7 +294,7 @@ GST_START_TEST (test_one_default_another)
|
|||
commit_and_wait (comp, &ret);
|
||||
check_start_stop_duration (comp, GST_SECOND, 2 * GST_SECOND, 1 * GST_SECOND);
|
||||
|
||||
ASSERT_OBJECT_REFCOUNT (source1, "source1", 2);
|
||||
ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
|
||||
|
||||
/* defaultsrc source */
|
||||
gnl_composition_add (GST_BIN (comp), defaultsrc);
|
||||
|
@ -302,7 +302,7 @@ GST_START_TEST (test_one_default_another)
|
|||
check_start_stop_duration (comp, 0, 2 * GST_SECOND, 2 * GST_SECOND);
|
||||
check_start_stop_duration (defaultsrc, 0, 2 * GST_SECOND, 2 * GST_SECOND);
|
||||
|
||||
ASSERT_OBJECT_REFCOUNT (defaultsrc, "defaultsrc", 2);
|
||||
ASSERT_OBJECT_REFCOUNT (defaultsrc, "defaultsrc", 1);
|
||||
|
||||
/* Second source */
|
||||
|
||||
|
@ -315,7 +315,7 @@ GST_START_TEST (test_one_default_another)
|
|||
check_start_stop_duration (comp, 0, 5 * GST_SECOND, 5 * GST_SECOND);
|
||||
check_start_stop_duration (defaultsrc, 0, 5 * GST_SECOND, 5 * GST_SECOND);
|
||||
|
||||
ASSERT_OBJECT_REFCOUNT (source3, "source3", 2);
|
||||
ASSERT_OBJECT_REFCOUNT (source3, "source3", 1);
|
||||
|
||||
/* Expected segments */
|
||||
segments = g_list_append (segments,
|
||||
|
@ -408,7 +408,7 @@ GST_START_TEST (test_one_expandable_another)
|
|||
commit_and_wait (comp, &ret);
|
||||
check_start_stop_duration (comp, GST_SECOND, 2 * GST_SECOND, 1 * GST_SECOND);
|
||||
|
||||
ASSERT_OBJECT_REFCOUNT (source1, "source1", 2);
|
||||
ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
|
||||
|
||||
/* defaultsrc source */
|
||||
|
||||
|
@ -417,7 +417,7 @@ GST_START_TEST (test_one_expandable_another)
|
|||
check_start_stop_duration (comp, 0, 2 * GST_SECOND, 2 * GST_SECOND);
|
||||
check_start_stop_duration (defaultsrc, 0, 2 * GST_SECOND, 2 * GST_SECOND);
|
||||
|
||||
ASSERT_OBJECT_REFCOUNT (defaultsrc, "defaultsrc", 2);
|
||||
ASSERT_OBJECT_REFCOUNT (defaultsrc, "defaultsrc", 1);
|
||||
|
||||
/* Second source */
|
||||
|
||||
|
@ -426,7 +426,7 @@ GST_START_TEST (test_one_expandable_another)
|
|||
check_start_stop_duration (comp, 0, 4 * GST_SECOND, 4 * GST_SECOND);
|
||||
check_start_stop_duration (defaultsrc, 0, 4 * GST_SECOND, 4 * GST_SECOND);
|
||||
|
||||
ASSERT_OBJECT_REFCOUNT (source2, "source2", 2);
|
||||
ASSERT_OBJECT_REFCOUNT (source2, "source2", 1);
|
||||
|
||||
|
||||
/* Third source */
|
||||
|
@ -436,7 +436,7 @@ GST_START_TEST (test_one_expandable_another)
|
|||
check_start_stop_duration (comp, 0, 5 * GST_SECOND, 5 * GST_SECOND);
|
||||
check_start_stop_duration (defaultsrc, 0, 5 * GST_SECOND, 5 * GST_SECOND);
|
||||
|
||||
ASSERT_OBJECT_REFCOUNT (source3, "source3", 2);
|
||||
ASSERT_OBJECT_REFCOUNT (source3, "source3", 1);
|
||||
|
||||
/* Expected segments */
|
||||
segments = g_list_append (segments,
|
||||
|
@ -518,7 +518,7 @@ GST_START_TEST (test_renegotiation)
|
|||
commit_and_wait (comp, &ret);
|
||||
check_start_stop_duration (comp, 0, 1 * GST_SECOND, 1 * GST_SECOND);
|
||||
|
||||
ASSERT_OBJECT_REFCOUNT (source1, "source1", 2);
|
||||
ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
|
||||
|
||||
/* Second source */
|
||||
|
||||
|
@ -526,7 +526,7 @@ GST_START_TEST (test_renegotiation)
|
|||
commit_and_wait (comp, &ret);
|
||||
check_start_stop_duration (comp, 0, 2 * GST_SECOND, 2 * GST_SECOND);
|
||||
|
||||
ASSERT_OBJECT_REFCOUNT (source2, "source2", 2);
|
||||
ASSERT_OBJECT_REFCOUNT (source2, "source2", 1);
|
||||
|
||||
|
||||
/* Third source */
|
||||
|
@ -535,7 +535,7 @@ GST_START_TEST (test_renegotiation)
|
|||
commit_and_wait (comp, &ret);
|
||||
check_start_stop_duration (comp, 0, 3 * GST_SECOND, 3 * GST_SECOND);
|
||||
|
||||
ASSERT_OBJECT_REFCOUNT (source3, "source3", 2);
|
||||
ASSERT_OBJECT_REFCOUNT (source3, "source3", 1);
|
||||
|
||||
|
||||
sink = gst_element_factory_make_or_warn ("fakesink", "sink");
|
||||
|
@ -570,7 +570,7 @@ GST_START_TEST (test_renegotiation)
|
|||
bus = gst_element_get_bus (GST_ELEMENT (pipeline));
|
||||
|
||||
GST_DEBUG ("Setting pipeline to PLAYING");
|
||||
ASSERT_OBJECT_REFCOUNT (source1, "source1", 2);
|
||||
ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
|
||||
|
||||
fail_if (gst_element_set_state (GST_ELEMENT (pipeline),
|
||||
GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE);
|
||||
|
|
Loading…
Reference in a new issue