Don't leak references returned by gst_pad_get_parent()
authorChristophe Fergeau <teuf@gnome.org>
Tue, 7 Mar 2006 12:49:03 +0000 (12:49 +0000)
committerTim-Philipp Müller <tim@centricular.net>
Tue, 7 Mar 2006 12:49:03 +0000 (12:49 +0000)
Original commit message from CVS:
* ext/libvisual/visual.c: (gst_visual_getcaps),
(gst_visual_src_setcaps), (gst_visual_sink_setcaps):
* ext/ogg/gstoggmux.c: (gst_ogg_mux_sinkconnect):
* ext/vorbis/vorbisenc.c: (gst_vorbisenc_convert_src),
(gst_vorbisenc_convert_sink):
* gst-libs/gst/audio/audio.c: (gst_audio_frame_byte_size),
(gst_audio_duration_from_pad_buffer):
* gst-libs/gst/audio/gstaudiofilter.c: (gst_audio_filter_link),
(gst_audio_filter_chain):
* gst-libs/gst/rtp/gstbasertpdepayload.c:
(gst_base_rtp_depayload_setcaps):
* gst-libs/gst/video/video.c: (gst_video_frame_rate),
(gst_video_get_size):
* gst/audiorate/gstaudiorate.c: (gst_audio_rate_setcaps):
Don't leak references returned by gst_pad_get_parent()
(#333663, based on patch by: Christophe Fergeau).

ChangeLog
ext/libvisual/visual.c
ext/ogg/gstoggmux.c
ext/vorbis/vorbisenc.c
gst-libs/gst/audio/audio.c
gst-libs/gst/audio/gstaudiofilter.c
gst-libs/gst/rtp/gstbasertpdepayload.c
gst-libs/gst/video/video.c
gst/audiorate/gstaudiorate.c

index 0bc8a61ddce0e49b90170aea4eaa38e3ed97e0c9..13588ffe2c6483e246725bd89f62b6543364786b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2006-03-07  Tim-Philipp Müller  <tim at centricular dot net>
+
+       * ext/libvisual/visual.c: (gst_visual_getcaps),
+       (gst_visual_src_setcaps), (gst_visual_sink_setcaps):
+       * ext/ogg/gstoggmux.c: (gst_ogg_mux_sinkconnect):
+       * ext/vorbis/vorbisenc.c: (gst_vorbisenc_convert_src),
+       (gst_vorbisenc_convert_sink):
+       * gst-libs/gst/audio/audio.c: (gst_audio_frame_byte_size),
+       (gst_audio_duration_from_pad_buffer):
+       * gst-libs/gst/audio/gstaudiofilter.c: (gst_audio_filter_link),
+       (gst_audio_filter_chain):
+       * gst-libs/gst/rtp/gstbasertpdepayload.c:
+       (gst_base_rtp_depayload_setcaps):
+       * gst-libs/gst/video/video.c: (gst_video_frame_rate),
+       (gst_video_get_size):
+       * gst/audiorate/gstaudiorate.c: (gst_audio_rate_setcaps):
+         Don't leak references returned by gst_pad_get_parent()
+         (#333663, based on patch by: Christophe Fergeau).
+
 2006-03-06  Stefan Kost  <ensonic@users.sf.net>
 
        * ext/gnomevfs/gstgnomevfssink.c: (gst_gnome_vfs_sink_class_init):
index bc5ee2e04e1bea99b1f6edc648acc4597b66d795..701ba923a0ad5c60da0287d1581f67783b12fddc 100644 (file)
@@ -231,18 +231,20 @@ gst_visual_getcaps (GstPad * pad)
   GstVisual *visual = GST_VISUAL (gst_pad_get_parent (pad));
   int depths;
 
-  if (!visual->actor)
-    return gst_caps_copy (gst_pad_get_pad_template_caps (visual->srcpad));
+  if (!visual->actor) {
+    ret = gst_caps_copy (gst_pad_get_pad_template_caps (visual->srcpad));
+    goto beach;
+  }
 
   ret = gst_caps_new_empty ();
   depths = visual_actor_get_supported_depth (visual->actor);
   if (depths < 0) {
     /* FIXME: set an error */
-    return ret;
+    goto beach;
   }
   if (depths == VISUAL_VIDEO_DEPTH_GL) {
     /* We can't handle GL only plugins */
-    return ret;
+    goto beach;
   }
 
   GST_DEBUG_OBJECT (visual, "libvisual plugin supports depths %u (0x%04x)",
@@ -261,7 +263,10 @@ gst_visual_getcaps (GstPad * pad)
     gst_caps_append (ret, gst_caps_from_string (GST_VIDEO_CAPS_RGB_16));
   }
 
+beach:
+
   GST_DEBUG_OBJECT (visual, "returning caps %" GST_PTR_FORMAT, ret);
+  gst_object_unref (visual);
   return ret;
 }
 
@@ -277,21 +282,28 @@ gst_visual_src_setcaps (GstPad * pad, GstCaps * caps)
   GST_DEBUG_OBJECT (visual, "src pad got caps %" GST_PTR_FORMAT, caps);
 
   if (!gst_structure_get_int (structure, "width", &visual->width))
-    return FALSE;
+    goto error;
   if (!gst_structure_get_int (structure, "height", &visual->height))
-    return FALSE;
+    goto error;
   if (!gst_structure_get_int (structure, "bpp", &depth))
-    return FALSE;
+    goto error;
   if (!gst_structure_get_fraction (structure, "framerate", &visual->fps_n,
           &visual->fps_d))
-    return FALSE;
+    goto error;
 
   visual_video_set_depth (visual->video,
       visual_video_depth_enum_from_value (depth));
   visual_video_set_dimension (visual->video, visual->width, visual->height);
   visual_actor_video_negotiate (visual->actor, 0, FALSE, FALSE);
 
+  gst_object_unref (visual);
   return TRUE;
+
+error:
+  {
+    gst_object_unref (visual);
+    return FALSE;
+  }
 }
 
 static gboolean
@@ -304,6 +316,7 @@ gst_visual_sink_setcaps (GstPad * pad, GstCaps * caps)
 
   gst_structure_get_int (structure, "rate", &visual->rate);
 
+  gst_object_unref (visual);
   return TRUE;
 }
 
index d88a89f547f8a28458ea1cf28aed0647034cc733..be0e01276f0535fa0f8975180b97961cc870d70d 100644 (file)
@@ -332,15 +332,12 @@ static GstPadLinkReturn
 gst_ogg_mux_sinkconnect (GstPad * pad, GstPad * peer)
 {
   GstOggMux *ogg_mux;
-  gchar *name;
 
   ogg_mux = GST_OGG_MUX (gst_pad_get_parent (pad));
 
-  name = gst_pad_get_name (pad);
+  GST_DEBUG_OBJECT (ogg_mux, "sinkconnect triggered on %s", GST_PAD_NAME (pad));
 
-  GST_DEBUG_OBJECT (ogg_mux, "sinkconnect triggered on %s", name);
-
-  g_free (name);
+  gst_object_unref (ogg_mux);
 
   return GST_PAD_LINK_OK;
 }
index f02439203fc77ceddef811b01e83446c8502eeba..a3cd1588c841ad0380d5a28036e84eabb8b021c9 100644 (file)
@@ -309,8 +309,10 @@ gst_vorbisenc_convert_src (GstPad * pad, GstFormat src_format, gint64 src_value,
   vorbisenc = GST_VORBISENC (gst_pad_get_parent (pad));
 
   if (vorbisenc->samples_in == 0 ||
-      vorbisenc->bytes_out == 0 || vorbisenc->frequency == 0)
+      vorbisenc->bytes_out == 0 || vorbisenc->frequency == 0) {
+    gst_object_unref (vorbisenc);
     return FALSE;
+  }
 
   avg = (vorbisenc->bytes_out * vorbisenc->frequency) / (vorbisenc->samples_in);
 
@@ -336,6 +338,7 @@ gst_vorbisenc_convert_src (GstPad * pad, GstFormat src_format, gint64 src_value,
     default:
       res = FALSE;
   }
+  gst_object_unref (vorbisenc);
   return res;
 }
 
@@ -407,6 +410,7 @@ gst_vorbisenc_convert_sink (GstPad * pad, GstFormat src_format,
     default:
       res = FALSE;
   }
+  gst_object_unref (vorbisenc);
   return res;
 }
 
index 3d67d11c18ffa8f7c13ace742134719f8fd1b992..b42ca760f2818c619b19009725a962439cf943ec 100644 (file)
@@ -47,7 +47,7 @@ gst_audio_frame_byte_size (GstPad * pad)
   if (caps == NULL) {
     /* ERROR: could not get caps of pad */
     g_warning ("gstaudio: could not get caps of pad %s:%s\n",
-        GST_ELEMENT_NAME (gst_pad_get_parent (pad)), GST_PAD_NAME (pad));
+        GST_DEBUG_PAD_NAME (pad));
     return 0;
   }
 
@@ -102,7 +102,7 @@ gst_audio_duration_from_pad_buffer (GstPad * pad, GstBuffer * buf)
   if (caps == NULL) {
     /* ERROR: could not get caps of pad */
     g_warning ("gstaudio: could not get caps of pad %s:%s\n",
-        GST_ELEMENT_NAME (gst_pad_get_parent (pad)), GST_PAD_NAME (pad));
+        GST_DEBUG_PAD_NAME (pad));
     length = GST_CLOCK_TIME_NONE;
   } else {
     structure = gst_caps_get_structure (caps, 0);
index 1f8f1c2d77e2efc566af139171454e6db02a3e9e..75cf5ec905a7bb46f3d442054223789c3f909153 100644 (file)
@@ -136,6 +136,7 @@ gst_audio_filter_link (GstPad * pad, GstPad * peer)
   }
 
   if (GST_PAD_LINK_FAILED (link_ret)) {
+    gst_object_unref (audiofilter);
     return link_ret;
   }
 
@@ -153,8 +154,10 @@ gst_audio_filter_link (GstPad * pad, GstPad * peer)
   ret &= gst_structure_get_int (structure, "rate", &audiofilter->rate);
   ret &= gst_structure_get_int (structure, "channels", &audiofilter->channels);
 
-  if (!ret)
+  if (!ret) {
+    gst_object_unref (audiofilter);
     return GST_PAD_LINK_REFUSED;
+  }
 
   audiofilter->bytes_per_sample = (audiofilter->width / 8) *
       audiofilter->channels;
@@ -163,6 +166,7 @@ gst_audio_filter_link (GstPad * pad, GstPad * peer)
     (audio_filter_class->setup) (audiofilter);
 #endif
 
+  gst_object_unref (audiofilter);
   return GST_PAD_LINK_OK;
 }
 
@@ -209,7 +213,7 @@ gst_audio_filter_chain (GstPad * pad, GstBuffer * buffer)
   g_return_val_if_fail (inbuf != NULL, GST_FLOW_ERROR);
 
   audiofilter = GST_AUDIO_FILTER (gst_pad_get_parent (pad));
-  //g_return_if_fail (audiofilter->inited);
+  /* g_return_if_fail (audiofilter->inited); */
   audio_filter_class =
       GST_AUDIO_FILTER_CLASS (G_OBJECT_GET_CLASS (audiofilter));
 
@@ -218,6 +222,7 @@ gst_audio_filter_chain (GstPad * pad, GstBuffer * buffer)
 
   if (audiofilter->passthru) {
     gst_pad_push (audiofilter->srcpad, buffer);
+    gst_object_unref (audiofilter);
     return GST_FLOW_OK;
   }
 
@@ -253,6 +258,7 @@ gst_audio_filter_chain (GstPad * pad, GstBuffer * buffer)
 
   gst_pad_push (audiofilter->srcpad, outbuf);
 
+  gst_object_unref (audiofilter);
   return GST_FLOW_OK;
 }
 
index 0b78d6c491ad9ecbb83477fdc4ce152079c45dcc..26e338f252a908542234e321435200578dd91e0d 100644 (file)
@@ -175,6 +175,7 @@ gst_base_rtp_depayload_setcaps (GstPad * pad, GstCaps * caps)
 {
   GstBaseRTPDepayload *filter;
   GstBaseRTPDepayloadClass *bclass;
+  gboolean res;
 
   filter = GST_BASE_RTP_DEPAYLOAD (gst_pad_get_parent (pad));
   g_return_val_if_fail (filter != NULL, FALSE);
@@ -183,9 +184,12 @@ gst_base_rtp_depayload_setcaps (GstPad * pad, GstCaps * caps)
   bclass = GST_BASE_RTP_DEPAYLOAD_GET_CLASS (filter);
 
   if (bclass->set_caps)
-    return bclass->set_caps (filter, caps);
+    res = bclass->set_caps (filter, caps);
   else
-    return TRUE;
+    res = TRUE;
+
+  gst_object_unref (filter);
+  return res;
 }
 
 static GstFlowReturn
index 3dad3d00a0ac9c30b3a0c5dc4c68214c63a33cb4..52a969eccb95ce99bb8c4811caf8a062c7132b06 100644 (file)
@@ -38,27 +38,26 @@ gst_video_frame_rate (GstPad * pad)
   caps = GST_PAD_CAPS (pad);
   if (caps == NULL) {
     g_warning ("gstvideo: failed to get caps of pad %s:%s",
-        GST_ELEMENT_NAME (gst_pad_get_parent (pad)), GST_PAD_NAME (pad));
+        GST_DEBUG_PAD_NAME (pad));
     return NULL;
   }
 
   structure = gst_caps_get_structure (caps, 0);
   if ((fps = gst_structure_get_value (structure, "framerate")) == NULL) {
     g_warning ("gstvideo: failed to get framerate property of pad %s:%s",
-        GST_ELEMENT_NAME (gst_pad_get_parent (pad)), GST_PAD_NAME (pad));
+        GST_DEBUG_PAD_NAME (pad));
     return NULL;
   }
   if (!GST_VALUE_HOLDS_FRACTION (fps)) {
     g_warning
         ("gstvideo: framerate property of pad %s:%s is not of type Fraction",
-        GST_ELEMENT_NAME (gst_pad_get_parent (pad)), GST_PAD_NAME (pad));
+        GST_DEBUG_PAD_NAME (pad));
     return NULL;
   }
 
   fps_string = gst_value_serialize (fps);
   GST_DEBUG ("Framerate request on pad %s:%s: %s",
-      GST_ELEMENT_NAME (gst_pad_get_parent (pad)), GST_PAD_NAME (pad),
-      fps_string);
+      GST_DEBUG_PAD_NAME (pad), fps_string);
   g_free (fps_string);
 
   return fps;
@@ -79,7 +78,7 @@ gst_video_get_size (GstPad * pad, gint * width, gint * height)
 
   if (caps == NULL) {
     g_warning ("gstvideo: failed to get caps of pad %s:%s",
-        GST_ELEMENT_NAME (gst_pad_get_parent (pad)), GST_PAD_NAME (pad));
+        GST_DEBUG_PAD_NAME (pad));
     return FALSE;
   }
 
@@ -89,13 +88,12 @@ gst_video_get_size (GstPad * pad, gint * width, gint * height)
 
   if (!ret) {
     g_warning ("gstvideo: failed to get size properties on pad %s:%s",
-        GST_ELEMENT_NAME (gst_pad_get_parent (pad)), GST_PAD_NAME (pad));
+        GST_DEBUG_PAD_NAME (pad));
     return FALSE;
   }
 
   GST_DEBUG ("size request on pad %s:%s: %dx%d",
-      GST_ELEMENT_NAME (gst_pad_get_parent (pad)),
-      GST_PAD_NAME (pad), width ? *width : -1, height ? *height : -1);
+      GST_DEBUG_PAD_NAME (pad), width ? *width : -1, height ? *height : -1);
 
   return TRUE;
 }
index f45ae68dba84bcad0327c7a234b48a52cb9abba6..11e73a6e688527870866b45b6ef27ab67ebc7b96 100644 (file)
@@ -197,7 +197,8 @@ gst_audio_rate_setcaps (GstPad * pad, GstCaps * caps)
   GstAudioRate *audiorate;
   GstStructure *structure;
   GstPad *otherpad;
-  gint ret, channels, width;
+  gboolean ret = FALSE;
+  gint channels, width;
 
   audiorate = GST_AUDIO_RATE (gst_pad_get_parent (pad));
 
@@ -205,21 +206,23 @@ gst_audio_rate_setcaps (GstPad * pad, GstCaps * caps)
       audiorate->srcpad;
 
   if (!gst_pad_set_caps (otherpad, caps))
-    return FALSE;
+    goto beach;
 
   structure = gst_caps_get_structure (caps, 0);
 
-  ret = gst_structure_get_int (structure, "channels", &channels);
-  ret &= gst_structure_get_int (structure, "width", &width);
-
-  if (!ret)
-    return FALSE;
+  if (!gst_structure_get_int (structure, "channels", &channels) ||
+      !gst_structure_get_int (structure, "width", &width)) {
+    goto beach;
+  }
 
   audiorate->bytes_per_sample = channels * (width / 8);
   if (audiorate->bytes_per_sample == 0)
     audiorate->bytes_per_sample = 1;
+  ret = TRUE;
 
-  return TRUE;
+beach:
+  gst_object_unref (audiorate);
+  return ret;
 }
 
 static void