nle: Handle sending SEEK event recursively to our children
authorThibault Saunier <tsaunier@gnome.org>
Wed, 22 Oct 2014 11:49:27 +0000 (13:49 +0200)
committerThibault Saunier <tsaunier@gnome.org>
Mon, 10 Nov 2014 15:22:40 +0000 (16:22 +0100)
Instead of relying on it being implemented in core (as it is currently
not!)

ges/nle/nlecomposition.c
ges/nle/nleobject.c
ges/nle/nleobject.h
ges/nle/nleoperation.c
ges/nle/nlesource.c
tests/check/Makefile.am

index 4ccc933..626149c 100644 (file)
@@ -1433,7 +1433,7 @@ _seek_current_stack (NleComposition * comp, GstEvent * event,
 
   if (flush_downstream) {
     priv->flush_seqnum = gst_event_get_seqnum (event);
-    GST_ERROR_OBJECT (comp, "sending flushes downstream with seqnum %d",
+    GST_INFO_OBJECT (comp, "sending flushes downstream with seqnum %d",
         priv->flush_seqnum);
   }
 
index c5be126..a267ec8 100644 (file)
@@ -642,6 +642,27 @@ nle_object_commit (NleObject * object, gboolean recurse)
 
 }
 
+static void
+_send_seek_event (const GValue * item, gpointer seek_event)
+{
+  GstElement *child = g_value_get_object (item);
+
+  gst_element_send_event (child, gst_event_ref (seek_event));
+}
+
+void
+nle_object_seek_all_children (NleObject * object, GstEvent * seek_event)
+{
+  GstIterator *it = gst_bin_iterate_recurse (GST_BIN (object));
+
+  while (gst_iterator_foreach (it, _send_seek_event,
+          seek_event) == GST_ITERATOR_RESYNC)
+    gst_iterator_resync (it);
+
+  gst_iterator_free (it);
+  gst_event_unref (seek_event);
+}
+
 void
 nle_object_reset (NleObject * object)
 {
index 02935b7..527deb6 100644 (file)
@@ -166,5 +166,7 @@ nle_object_reset (NleObject *object);
 GstStateChangeReturn
 nle_object_cleanup (NleObject * object);
 
+void nle_object_seek_all_children (NleObject *object, GstEvent *seek_event);
+
 G_END_DECLS
 #endif /* __NLE_OBJECT_H__ */
index 378cae5..fa59734 100644 (file)
@@ -93,6 +93,24 @@ static void nle_operation_release_pad (GstElement * element, GstPad * pad);
 static void synchronize_sinks (NleOperation * operation);
 static gboolean remove_sink_pad (NleOperation * operation, GstPad * sinkpad);
 
+
+static gboolean
+nle_operation_send_event (GstElement * element, GstEvent * event)
+{
+  gboolean res = TRUE;
+
+  switch (GST_EVENT_TYPE (event)) {
+    case GST_EVENT_SEEK:
+      nle_object_seek_all_children (NLE_OBJECT (element), event);
+      break;
+    default:
+      res = GST_ELEMENT_CLASS (parent_class)->send_event (element, event);
+      break;
+  }
+
+  return res;
+}
+
 static void
 nle_operation_class_init (NleOperationClass * klass)
 {
@@ -141,6 +159,7 @@ nle_operation_class_init (NleOperationClass * klass)
   gstelement_class->request_new_pad =
       GST_DEBUG_FUNCPTR (nle_operation_request_new_pad);
   gstelement_class->release_pad = GST_DEBUG_FUNCPTR (nle_operation_release_pad);
+  gstelement_class->send_event = GST_DEBUG_FUNCPTR (nle_operation_send_event);
 
   gstbin_class->add_element = GST_DEBUG_FUNCPTR (nle_operation_add_element);
   gstbin_class->remove_element =
index 1a8fda5..2ffcf4b 100644 (file)
@@ -406,7 +406,6 @@ nle_source_send_event (GstElement * element, GstEvent * event)
 
   switch (GST_EVENT_TYPE (event)) {
     case GST_EVENT_SEEK:
-      GST_ERROR ("saving seek now");
       source->priv->seek_event = event;
       break;
       /* Fall through that shit nigga */
index 0ee3181..cd0dd5a 100644 (file)
@@ -44,10 +44,12 @@ check_PROGRAMS = \
        ges/project\
        nle/simple      \
        nle/complex     \
-       nle/nlesource   \
        nle/nleoperation        \
        nle/nlecomposition
 
+# We do not support sources outside composition
+#      nle/nlesource
+
 noinst_LTLIBRARIES=$(testutils_noisnt_libraries)
 noinst_HEADERS=$(testutils_noinst_headers)