plugins/elements/gsttypefindelement.*: When typefinding is done in push mode, we...
authorTim-Philipp Müller <tim@centricular.net>
Wed, 29 Mar 2006 10:33:19 +0000 (10:33 +0000)
committerTim-Philipp Müller <tim@centricular.net>
Wed, 29 Mar 2006 10:33:19 +0000 (10:33 +0000)
Original commit message from CVS:
* plugins/elements/gsttypefindelement.c: (stop_typefinding),
(gst_type_find_element_handle_event),
(gst_type_find_element_send_cached_events),
(gst_type_find_element_change_state):
* plugins/elements/gsttypefindelement.h:
When typefinding is done in push mode, we should cache
events we receive during typefinding instead of just
dropping them (e.g. newsegment, custom events from
dvdreadsrc etc.) and then send them out once we've
determined the type of the stream (and decodebin
has had a chance to plug in a decoder/demuxer).

ChangeLog
plugins/elements/gsttypefindelement.c
plugins/elements/gsttypefindelement.h

index b63b39c000d82cfb663866f33dea6e78f9320dc2..30da970f3d66c005044ea32e0f4f05dbee18f54e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2006-03-29  Tim-Philipp Müller  <tim at centricular dot net>
+
+       * plugins/elements/gsttypefindelement.c: (stop_typefinding),
+       (gst_type_find_element_handle_event),
+       (gst_type_find_element_send_cached_events),
+       (gst_type_find_element_change_state):
+       * plugins/elements/gsttypefindelement.h:
+         When typefinding is done in push mode, we should cache
+         events we receive during typefinding instead of just
+         dropping them (e.g. newsegment, custom events from
+         dvdreadsrc etc.) and then send them out once we've
+         determined the type of the stream (and decodebin
+         has had a chance to plug in a decoder/demuxer).
+         
 2006-03-27  Wim Taymans  <wim@fluendo.com>
 
        * docs/design/part-qos.txt:
index efeec4012cb1410f91113dd9085f3e16d6d5a773..600dea59d15ba8a224721fc7efa6bd2451a23f68 100644 (file)
@@ -145,6 +145,8 @@ static gboolean
 gst_type_find_element_activate_src_pull (GstPad * pad, gboolean active);
 static GstFlowReturn
 gst_type_find_element_chain_do_typefinding (GstTypeFindElement * typefind);
+static void
+gst_type_find_element_send_cached_events (GstTypeFindElement * typefind);
 
 static guint gst_type_find_element_signals[LAST_SIGNAL] = { 0 };
 
@@ -440,6 +442,7 @@ stop_typefinding (GstTypeFindElement * typefind)
                 GST_DEBUG_PAD_NAME (peer)));
         typefind->mode = MODE_ERROR;    /* make the chain function error out */
       } else {
+        gst_type_find_element_send_cached_events (typefind);
         gst_pad_push (typefind->src, typefind->store);
       }
 
@@ -488,19 +491,16 @@ gst_type_find_element_handle_event (GstPad * pad, GstEvent * event)
           break;
         }
         default:
-          gst_event_unref (event);
+          GST_DEBUG_OBJECT (typefind, "Saving %s event to send later",
+              GST_EVENT_TYPE_NAME (event));
+          typefind->cached_events =
+              g_list_append (typefind->cached_events, event);
           res = TRUE;
           break;
       }
       break;
     case MODE_NORMAL:
-      if (FALSE) {              // GST_EVENT_TYPE (event) == GST_EVENT_DISCONTINUOUS) {
-        start_typefinding (typefind);
-        gst_event_unref (event);
-        res = TRUE;
-      } else {
-        res = gst_pad_event_default (pad, event);
-      }
+      res = gst_pad_event_default (pad, event);
       break;
     case MODE_ERROR:
       break;
@@ -510,6 +510,22 @@ gst_type_find_element_handle_event (GstPad * pad, GstEvent * event)
   return res;
 }
 
+static void
+gst_type_find_element_send_cached_events (GstTypeFindElement * typefind)
+{
+  GList *l;
+
+  for (l = typefind->cached_events; l != NULL; l = l->next) {
+    GstEvent *event = GST_EVENT (l->data);
+
+    GST_DEBUG_OBJECT (typefind, "sending cached %s event",
+        GST_EVENT_TYPE_NAME (event));
+    gst_pad_push_event (typefind->src, event);
+  }
+  g_list_free (typefind->cached_events);
+  typefind->cached_events = NULL;
+}
+
 static GstFlowReturn
 gst_type_find_element_chain (GstPad * pad, GstBuffer * buffer)
 {
@@ -726,6 +742,10 @@ gst_type_find_element_change_state (GstElement * element,
   switch (transition) {
     case GST_STATE_CHANGE_PAUSED_TO_READY:
       gst_caps_replace (&typefind->caps, NULL);
+      g_list_foreach (typefind->cached_events,
+          (GFunc) gst_mini_object_unref, NULL);
+      g_list_free (typefind->cached_events);
+      typefind->cached_events = NULL;
       break;
     default:
       break;
index f4dcec2e89490548c83426b1255c2b22162e18f4..528be000c3db48527bc106131e690974d841471f 100644 (file)
@@ -58,6 +58,8 @@ struct _GstTypeFindElement {
 
   guint                        mode;
   GstBuffer *          store;
+
+  GList *               cached_events;
 };
 
 struct _GstTypeFindElementClass {