ext/ogg/gstogmparse.c: Don't remove/re-add source pad if the new caps are the same...
authorTim-Philipp Müller <tim@centricular.net>
Thu, 2 Mar 2006 12:35:59 +0000 (12:35 +0000)
committerTim-Philipp Müller <tim@centricular.net>
Thu, 2 Mar 2006 12:35:59 +0000 (12:35 +0000)
Original commit message from CVS:
* ext/ogg/gstogmparse.c: (gst_ogm_audio_parse_init),
(gst_ogm_video_parse_init), (gst_ogm_text_parse_init),
(gst_ogm_parse_sink_convert), (gst_ogm_parse_sink_query),
(gst_ogm_parse_chain):
Don't remove/re-add source pad if the new caps are the same as
the old caps anyway (#333042). When removing source pad, don't
unref it afterwards - we didn't ref it when adding. Sprinkle some
GST_DEBUG_FUNCPTR goodness here and there. Don't leak references
after using gst_pad_get_parent(). Return downstream flow return
value in chain function.

ChangeLog
ext/ogg/gstogmparse.c

index 24f5945..79e6ae2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2006-03-02  Tim-Philipp Müller  <tim at centricular dot net>
+
+       * ext/ogg/gstogmparse.c: (gst_ogm_audio_parse_init),
+       (gst_ogm_video_parse_init), (gst_ogm_text_parse_init),
+       (gst_ogm_parse_sink_convert), (gst_ogm_parse_sink_query),
+       (gst_ogm_parse_chain):
+         Don't remove/re-add source pad if the new caps are the same as
+         the old caps anyway (#333042). When removing source pad, don't
+         unref it afterwards - we didn't ref it when adding. Sprinkle some
+         GST_DEBUG_FUNCPTR goodness here and there. Don't leak references
+         after using gst_pad_get_parent(). Return downstream flow return
+         value in chain function.
+
 2006-03-02  Wim Taymans  <wim@fluendo.com>
 
        * docs/plugins/gst-plugins-base-plugins-docs.sgml:
index 9bd03ca..7814b2f 100644 (file)
@@ -346,8 +346,10 @@ gst_ogm_audio_parse_init (GstOgmParse * ogm)
   ogm->sinkpad =
       gst_pad_new_from_static_template (&ogm_audio_parse_sink_template_factory,
       "sink");
-  gst_pad_set_query_function (ogm->sinkpad, gst_ogm_parse_sink_query);
-  gst_pad_set_chain_function (ogm->sinkpad, gst_ogm_parse_chain);
+  gst_pad_set_query_function (ogm->sinkpad,
+      GST_DEBUG_FUNCPTR (gst_ogm_parse_sink_query));
+  gst_pad_set_chain_function (ogm->sinkpad,
+      GST_DEBUG_FUNCPTR (gst_ogm_parse_chain));
   gst_element_add_pad (GST_ELEMENT (ogm), ogm->sinkpad);
 
 #if 0
@@ -366,8 +368,10 @@ gst_ogm_video_parse_init (GstOgmParse * ogm)
   ogm->sinkpad =
       gst_pad_new_from_static_template (&ogm_video_parse_sink_template_factory,
       "sink");
-  gst_pad_set_query_function (ogm->sinkpad, gst_ogm_parse_sink_query);
-  gst_pad_set_chain_function (ogm->sinkpad, gst_ogm_parse_chain);
+  gst_pad_set_query_function (ogm->sinkpad,
+      GST_DEBUG_FUNCPTR (gst_ogm_parse_sink_query));
+  gst_pad_set_chain_function (ogm->sinkpad,
+      GST_DEBUG_FUNCPTR (gst_ogm_parse_chain));
   gst_element_add_pad (GST_ELEMENT (ogm), ogm->sinkpad);
 
 #if 0
@@ -388,8 +392,10 @@ gst_ogm_text_parse_init (GstOgmParse * ogm)
       "sink");
   gst_pad_set_query_type_function (ogm->sinkpad,
       gst_ogm_parse_get_sink_querytypes);
-  gst_pad_set_query_function (ogm->sinkpad, gst_ogm_parse_sink_query);
-  gst_pad_set_chain_function (ogm->sinkpad, gst_ogm_parse_chain);
+  gst_pad_set_query_function (ogm->sinkpad,
+      GST_DEBUG_FUNCPTR (gst_ogm_parse_sink_query));
+  gst_pad_set_chain_function (ogm->sinkpad,
+      GST_DEBUG_FUNCPTR (gst_ogm_parse_chain));
   gst_element_add_pad (GST_ELEMENT (ogm), ogm->sinkpad);
 
 #if 0
@@ -483,15 +489,16 @@ gst_ogm_parse_sink_convert (GstPad * pad,
       break;
   }
 
+  gst_object_unref (ogm);
   return res;
 }
 
 static gboolean
 gst_ogm_parse_sink_query (GstPad * pad, GstQuery * query)
 {
-  GstOgmParse *ogm = GST_OGM_PARSE (GST_PAD_PARENT (pad));
+  GstOgmParse *ogm = GST_OGM_PARSE (gst_pad_get_parent (pad));
   GstFormat format;
-  gboolean res;
+  gboolean res = FALSE;
 
   switch (GST_QUERY_TYPE (query)) {
     case GST_QUERY_POSITION:
@@ -501,7 +508,7 @@ gst_ogm_parse_sink_query (GstPad * pad, GstQuery * query)
       gst_query_parse_position (query, &format, NULL);
 
       if (format != GST_FORMAT_DEFAULT && format != GST_FORMAT_TIME)
-        return FALSE;
+        break;
 
       if ((res = gst_ogm_parse_sink_convert (pad,
                   GST_FORMAT_DEFAULT, ogm->next_granulepos, &format, &val))) {
@@ -527,13 +534,16 @@ gst_ogm_parse_sink_query (GstPad * pad, GstQuery * query)
       res = gst_pad_query_default (pad, query);
       break;
   }
+
+  gst_object_unref (ogm);
   return res;
 }
 
 static GstFlowReturn
 gst_ogm_parse_chain (GstPad * pad, GstBuffer * buffer)
 {
-  GstOgmParse *ogm = GST_OGM_PARSE (gst_pad_get_parent (pad));
+  GstFlowReturn ret = GST_FLOW_OK;
+  GstOgmParse *ogm = GST_OGM_PARSE (GST_PAD_PARENT (pad));
   GstBuffer *buf = GST_BUFFER (buffer);
   guint8 *data = GST_BUFFER_DATA (buf);
   guint size = GST_BUFFER_SIZE (buf);
@@ -628,21 +638,28 @@ gst_ogm_parse_chain (GstPad * pad, GstBuffer * buffer)
       }
 
       if (ogm->srcpad) {
-        GST_WARNING_OBJECT (ogm, "Already an existing pad %s:%s",
-            GST_DEBUG_PAD_NAME (ogm->srcpad));
-        gst_element_remove_pad (GST_ELEMENT (ogm), ogm->srcpad);
-        gst_object_unref (ogm->srcpad);
-
+        GstCaps *current_caps = GST_PAD_CAPS (ogm->srcpad);
+
+        if (current_caps && !gst_caps_is_equal (current_caps, caps)) {
+          GST_WARNING_OBJECT (ogm, "Already an existing pad %s:%s",
+              GST_DEBUG_PAD_NAME (ogm->srcpad));
+          gst_element_remove_pad (GST_ELEMENT (ogm), ogm->srcpad);
+          ogm->srcpad = NULL;
+        } else {
+          GST_DEBUG_OBJECT (ogm, "Existing pad has the same caps, do nothing");
+        }
       }
-      if (caps) {
-        ogm->srcpad = gst_pad_new ("src", GST_PAD_SRC);
-        gst_pad_set_caps (ogm->srcpad, caps);
-      } else {
-        GST_WARNING_OBJECT (ogm,
-            "No fixed caps were found, carrying on with template");
-        ogm->srcpad = gst_pad_new_from_template (ogm->srcpadtempl, "src");
+      if (ogm->srcpad == NULL) {
+        if (caps) {
+          ogm->srcpad = gst_pad_new ("src", GST_PAD_SRC);
+          gst_pad_set_caps (ogm->srcpad, caps);
+        } else {
+          GST_WARNING_OBJECT (ogm,
+              "No fixed caps were found, carrying on with template");
+          ogm->srcpad = gst_pad_new_from_template (ogm->srcpadtempl, "src");
+        }
+        gst_element_add_pad (GST_ELEMENT (ogm), ogm->srcpad);
       }
-      gst_element_add_pad (GST_ELEMENT (ogm), ogm->srcpad);
       break;
     }
     case 0x03:
@@ -701,7 +718,10 @@ gst_ogm_parse_chain (GstPad * pad, GstBuffer * buffer)
             break;
         }
         gst_buffer_set_caps (sbuf, GST_PAD_CAPS (ogm->srcpad));
-        gst_pad_push (ogm->srcpad, sbuf);
+        ret = gst_pad_push (ogm->srcpad, sbuf);
+        if (ret != GST_FLOW_OK) {
+          GST_DEBUG_OBJECT (ogm, "Flow return: %s", gst_flow_get_name (ret));
+        }
       } else {
         GST_ELEMENT_ERROR (ogm, STREAM, WRONG_TYPE,
             ("Wrong packet startcode 0x%02x", data[0]), (NULL));
@@ -711,7 +731,7 @@ gst_ogm_parse_chain (GstPad * pad, GstBuffer * buffer)
 
   gst_buffer_unref (buf);
 
-  return GST_FLOW_OK;
+  return ret;
 }
 
 static GstStateChangeReturn