gst/elements/gstfilesrc.*: send NEW_MEDIA events correctly
authorBenjamin Otte <otte@gnome.org>
Thu, 6 May 2004 21:40:55 +0000 (21:40 +0000)
committerBenjamin Otte <otte@gnome.org>
Thu, 6 May 2004 21:40:55 +0000 (21:40 +0000)
Original commit message from CVS:
* gst/elements/gstfilesrc.c: (gst_filesrc_get),
(gst_filesrc_change_state), (gst_filesrc_srcpad_event):
* gst/elements/gstfilesrc.h:
send NEW_MEDIA events correctly
* gst/elements/gsttypefindelement.c: (start_typefinding),
(gst_type_find_element_handle_event):
restart typefinding when we get a NEW_MEDIA event
* gst/gstbin.c: (gst_bin_remove_func), (gst_bin_change_state),
(gst_bin_dispose):
don't die when someone removes elements in callbacks
* gst/gstelement.c: (gst_element_change_state):
improve debugging
* gst/gstpad.c: (gst_pad_pull), (gst_pad_call_chain_function):
we need a NEW_MEDIA event to engage a link
* gst/gsttrace.c: (gst_trace_new), (gst_alloc_trace_set_flags_all):
don't g_print debugging stuff
* testsuite/caps/simplify.c: (check_caps):

ChangeLog
gst/elements/gstfilesrc.c
gst/elements/gstfilesrc.h
gst/elements/gsttypefindelement.c
gst/gstbin.c
gst/gstelement.c
gst/gstpad.c
gst/gsttrace.c
plugins/elements/gstfilesrc.c
plugins/elements/gstfilesrc.h
plugins/elements/gsttypefindelement.c

index ab61e00..b0e74d8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2004-05-06  Benjamin Otte  <in7y118@public.uni-hamburg.de>
+
+       * gst/elements/gstfilesrc.c: (gst_filesrc_get),
+       (gst_filesrc_change_state), (gst_filesrc_srcpad_event):
+       * gst/elements/gstfilesrc.h:
+         send NEW_MEDIA events correctly
+       * gst/elements/gsttypefindelement.c: (start_typefinding),
+       (gst_type_find_element_handle_event):
+         restart typefinding when we get a NEW_MEDIA event
+       * gst/gstbin.c: (gst_bin_remove_func), (gst_bin_change_state),
+       (gst_bin_dispose):
+         don't die when someone removes elements in callbacks
+       * gst/gstelement.c: (gst_element_change_state):
+         improve debugging
+       * gst/gstpad.c: (gst_pad_pull), (gst_pad_call_chain_function):
+         we need a NEW_MEDIA event to engage a link
+       * gst/gsttrace.c: (gst_trace_new), (gst_alloc_trace_set_flags_all):
+         don't g_print debugging stuff
+       * testsuite/caps/simplify.c: (check_caps):
+
 2004-05-04  Benjamin Otte  <otte@gnome.org>
 
        * gst/parse/grammar.y:
index b50e27d..5f6a4ce 100644 (file)
@@ -678,11 +678,11 @@ gst_filesrc_get (GstPad * pad)
   if (src->need_discont) {
     GstEvent *event;
 
-    src->need_discont = FALSE;
     GST_DEBUG_OBJECT (src, "sending discont");
     event =
-        gst_event_new_discontinuous (FALSE, GST_FORMAT_BYTES, src->curoffset,
-        NULL);
+        gst_event_new_discontinuous (src->need_discont > 1, GST_FORMAT_BYTES,
+        src->curoffset, NULL);
+    src->need_discont = 0;
     return GST_DATA (event);
   }
 
@@ -837,12 +837,11 @@ gst_filesrc_change_state (GstElement * element)
         if (!gst_filesrc_open_file (GST_FILESRC (element)))
           return GST_STATE_FAILURE;
       }
-      src->need_discont = TRUE;
+      src->need_discont = 2;
       break;
     case GST_STATE_PAUSED_TO_READY:
       if (GST_FLAG_IS_SET (element, GST_FILESRC_OPEN))
         gst_filesrc_close_file (GST_FILESRC (element));
-      src->need_discont = TRUE;
       break;
     default:
       break;
@@ -950,7 +949,7 @@ gst_filesrc_srcpad_event (GstPad * pad, GstEvent * event)
           goto error;
           break;
       }
-      src->need_discont = TRUE;
+      src->need_discont = 1;
       src->need_flush = GST_EVENT_SEEK_FLAGS (event) & GST_SEEK_FLAG_FLUSH;
       break;
     }
index 55b36ad..1723008 100644 (file)
@@ -72,7 +72,7 @@ struct _GstFileSrc {
   GstBuffer *mapbuf;
   size_t mapsize;
 
-  gboolean need_discont;
+  gint need_discont;
   gboolean need_flush;
 };
 
index 40587d6..c4ca7df 100644 (file)
@@ -317,10 +317,13 @@ free_entry (TypeFindEntry * entry)
 static void
 start_typefinding (GstTypeFindElement * typefind)
 {
-  g_assert (typefind->caps == NULL);
   g_assert (typefind->possibilities == NULL);
 
   GST_DEBUG_OBJECT (typefind, "starting typefinding");
+  gst_pad_unnegotiate (typefind->src);
+  if (typefind->caps) {
+    gst_caps_replace (&typefind->caps, NULL);
+  }
   typefind->mode = MODE_TYPEFIND;
   typefind->stream_length_available = TRUE;
   typefind->stream_length = 0;
@@ -429,7 +432,13 @@ gst_type_find_element_handle_event (GstPad * pad, GstEvent * event)
         break;
     }
   } else {
-    gst_pad_event_default (pad, event);
+    if (GST_EVENT_TYPE (event) == GST_EVENT_DISCONTINUOUS &&
+        GST_EVENT_DISCONT_NEW_MEDIA (event)) {
+      start_typefinding (typefind);
+      gst_event_unref (event);
+    } else {
+      gst_pad_event_default (pad, event);
+    }
   }
 }
 static guint8 *
index 2737efe..bb9f2c1 100644 (file)
@@ -739,10 +739,11 @@ gst_bin_change_state (GstElement * element)
     GstElementState old_child_state;
 
     child = GST_ELEMENT (children->data);
-    children = g_list_next (children);
 
-    if (GST_FLAG_IS_SET (child, GST_ELEMENT_LOCKED_STATE))
+    if (GST_FLAG_IS_SET (child, GST_ELEMENT_LOCKED_STATE)) {
+      children = g_list_next (children);
       continue;
+    }
 
     old_child_state = GST_STATE (child);
 
@@ -780,6 +781,10 @@ gst_bin_change_state (GstElement * element)
             gst_element_state_get_name (pending));
         break;
     }
+    /* we need to do this down here, because there might be elements removed 
+     * from this bin during state changes, so g_list_next (children) might
+     * change as well */
+    children = g_list_next (children);
   }
 
   GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
@@ -818,26 +823,17 @@ static void
 gst_bin_dispose (GObject * object)
 {
   GstBin *bin = GST_BIN (object);
-  GList *children, *orig;
-  GstElement *child;
 
   GST_CAT_DEBUG_OBJECT (GST_CAT_REFCOUNTING, object, "dispose");
 
   if (gst_element_get_state (GST_ELEMENT (object)) == GST_STATE_PLAYING)
     gst_element_set_state (GST_ELEMENT (object), GST_STATE_PAUSED);
 
-  if (bin->children) {
-    orig = children = g_list_copy (bin->children);
-    while (children) {
-      child = GST_ELEMENT (children->data);
-      gst_bin_remove (bin, child);
-      children = g_list_next (children);
-    }
-    g_list_free (bin->children);
-    g_list_free (orig);
+  while (bin->children) {
+    gst_bin_remove (bin, GST_ELEMENT (bin->children->data));
   }
-  bin->children = NULL;
-  bin->numchildren = 0;
+  g_assert (bin->children == NULL);
+  g_assert (bin->numchildren == 0);
 
   G_OBJECT_CLASS (parent_class)->dispose (object);
 }
index 8918427..70775c1 100644 (file)
@@ -2870,7 +2870,7 @@ gst_element_change_state (GstElement * element)
   }
 
   GST_CAT_LOG_OBJECT (GST_CAT_STATES, element,
-      "default handler sets state from %s to %s %04x",
+      "default handler tries setting state from %s to %s %04x",
       gst_element_state_get_name (old_state),
       gst_element_state_get_name (old_pending), old_transition);
 
@@ -2903,8 +2903,11 @@ gst_element_change_state (GstElement * element)
       /* if we are going to paused, we try to negotiate the pads */
     case GST_STATE_READY_TO_PAUSED:
       g_assert (element->base_time == 0);
-      if (!gst_element_negotiate_pads (element))
+      if (!gst_element_negotiate_pads (element)) {
+        GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+            "failed state change, could not negotiate pads");
         goto failure;
+      }
       break;
       /* going to the READY state clears all pad caps */
       /* FIXME: Why doesn't this happen on READY => NULL? -- Company */
index 0880fec..4960b3f 100644 (file)
@@ -3211,6 +3211,7 @@ gst_pad_pull (GstPad * pad)
         data = (peer->gethandler) (GST_PAD (peer));
         /* refetch - we might have been relinked */
         link = GST_RPAD_LINK (pad);
+        peer = GST_RPAD_PEER (pad);
       }
 
       if (data) {
@@ -3221,7 +3222,8 @@ gst_pad_pull (GstPad * pad)
             link->engaged = TRUE;
             data = _invent_event (pad, GST_BUFFER (data));
           } else if (GST_IS_EVENT (data) &&
-              GST_EVENT_TYPE (data) == GST_EVENT_DISCONTINUOUS) {
+              GST_EVENT_TYPE (data) == GST_EVENT_DISCONTINUOUS &&
+              GST_EVENT_DISCONT_NEW_MEDIA (data)) {
             link->engaged = TRUE;
             GST_CAT_LOG (GST_CAT_DATAFLOW,
                 "link engaged by discont event for pad %s:%s",
@@ -4307,7 +4309,8 @@ gst_pad_call_chain_function (GstPad * pad, GstData * data)
       g_assert (link->temp_store == data);
       link->temp_store = NULL;
     } else if (GST_IS_EVENT (data) &&
-        GST_EVENT_TYPE (data) == GST_EVENT_DISCONTINUOUS) {
+        GST_EVENT_TYPE (data) == GST_EVENT_DISCONTINUOUS &&
+        GST_EVENT_DISCONT_NEW_MEDIA (data)) {
       link->engaged = TRUE;
       GST_CAT_LOG (GST_CAT_DATAFLOW,
           "link engaged by discont event for pad %s:%s",
index 0379a05..76ede60 100644 (file)
@@ -69,7 +69,7 @@ gst_trace_new (gchar * filename, gint size)
 
   g_return_val_if_fail (trace != NULL, NULL);
   trace->filename = g_strdup (filename);
-  g_print ("opening '%s'\n", trace->filename);
+  GST_DEBUG ("opening '%s'\n", trace->filename);
 #ifndef S_IWUSR
 #define S_IWUSR S_IWRITE
 #endif
@@ -287,7 +287,7 @@ gst_alloc_trace_set_flags_all (GstAllocTraceFlags flags)
   while (walk) {
     GstAllocTrace *trace = (GstAllocTrace *) walk->data;
 
-    g_print ("set flags on %p\n", trace);
+    GST_DEBUG ("set flags on %p\n", trace);
     gst_alloc_trace_set_flags (trace, flags);
 
     walk = g_list_next (walk);
index b50e27d..5f6a4ce 100644 (file)
@@ -678,11 +678,11 @@ gst_filesrc_get (GstPad * pad)
   if (src->need_discont) {
     GstEvent *event;
 
-    src->need_discont = FALSE;
     GST_DEBUG_OBJECT (src, "sending discont");
     event =
-        gst_event_new_discontinuous (FALSE, GST_FORMAT_BYTES, src->curoffset,
-        NULL);
+        gst_event_new_discontinuous (src->need_discont > 1, GST_FORMAT_BYTES,
+        src->curoffset, NULL);
+    src->need_discont = 0;
     return GST_DATA (event);
   }
 
@@ -837,12 +837,11 @@ gst_filesrc_change_state (GstElement * element)
         if (!gst_filesrc_open_file (GST_FILESRC (element)))
           return GST_STATE_FAILURE;
       }
-      src->need_discont = TRUE;
+      src->need_discont = 2;
       break;
     case GST_STATE_PAUSED_TO_READY:
       if (GST_FLAG_IS_SET (element, GST_FILESRC_OPEN))
         gst_filesrc_close_file (GST_FILESRC (element));
-      src->need_discont = TRUE;
       break;
     default:
       break;
@@ -950,7 +949,7 @@ gst_filesrc_srcpad_event (GstPad * pad, GstEvent * event)
           goto error;
           break;
       }
-      src->need_discont = TRUE;
+      src->need_discont = 1;
       src->need_flush = GST_EVENT_SEEK_FLAGS (event) & GST_SEEK_FLAG_FLUSH;
       break;
     }
index 55b36ad..1723008 100644 (file)
@@ -72,7 +72,7 @@ struct _GstFileSrc {
   GstBuffer *mapbuf;
   size_t mapsize;
 
-  gboolean need_discont;
+  gint need_discont;
   gboolean need_flush;
 };
 
index 40587d6..c4ca7df 100644 (file)
@@ -317,10 +317,13 @@ free_entry (TypeFindEntry * entry)
 static void
 start_typefinding (GstTypeFindElement * typefind)
 {
-  g_assert (typefind->caps == NULL);
   g_assert (typefind->possibilities == NULL);
 
   GST_DEBUG_OBJECT (typefind, "starting typefinding");
+  gst_pad_unnegotiate (typefind->src);
+  if (typefind->caps) {
+    gst_caps_replace (&typefind->caps, NULL);
+  }
   typefind->mode = MODE_TYPEFIND;
   typefind->stream_length_available = TRUE;
   typefind->stream_length = 0;
@@ -429,7 +432,13 @@ gst_type_find_element_handle_event (GstPad * pad, GstEvent * event)
         break;
     }
   } else {
-    gst_pad_event_default (pad, event);
+    if (GST_EVENT_TYPE (event) == GST_EVENT_DISCONTINUOUS &&
+        GST_EVENT_DISCONT_NEW_MEDIA (event)) {
+      start_typefinding (typefind);
+      gst_event_unref (event);
+    } else {
+      gst_pad_event_default (pad, event);
+    }
   }
 }
 static guint8 *