diff --git a/ChangeLog b/ChangeLog index 6e26623787..75c7634d47 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-08-26 Stefan Kost + + * sys/v4l2/gstv4l2object.c: + * sys/v4l2/gstv4l2src.c: + * sys/v4l2/gstv4l2src.h: + * sys/v4l2/v4l2_calls.c: + * sys/v4l2/v4l2src_calls.c: + Fix memory leaks. Small code cleanups : No need for empty _init(). No + need to memset instance structures. Some more FIXME's and comments. + 2008-08-26 Stefan Kost * tests/icles/.cvsignore: diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c index aff6736444..ffc1046d86 100644 --- a/sys/v4l2/gstv4l2object.c +++ b/sys/v4l2/gstv4l2object.c @@ -290,6 +290,12 @@ gst_v4l2_object_destroy (GstV4l2Object * v4l2object) if (v4l2object->videodev) g_free (v4l2object->videodev); + if (v4l2object->channel) + g_free (v4l2object->channel); + + if (v4l2object->norm) + g_free (v4l2object->norm); + g_free (v4l2object); } diff --git a/sys/v4l2/gstv4l2src.c b/sys/v4l2/gstv4l2src.c index ce93ee73c0..7aed289bba 100644 --- a/sys/v4l2/gstv4l2src.c +++ b/sys/v4l2/gstv4l2src.c @@ -354,6 +354,11 @@ gst_v4l2src_dispose (GObject * object) gst_v4l2src_clear_format_list (v4l2src); } + if (v4l2src->probed_caps) { + gst_caps_unref (v4l2src->probed_caps); + } + + G_OBJECT_CLASS (parent_class)->dispose (object); } diff --git a/sys/v4l2/gstv4l2src.h b/sys/v4l2/gstv4l2src.h index ae7aa74eb0..7c54d944e8 100644 --- a/sys/v4l2/gstv4l2src.h +++ b/sys/v4l2/gstv4l2src.h @@ -70,6 +70,7 @@ struct _GstV4l2Buffer { struct v4l2_buffer vbuffer; + /* FIXME: have GstV4l2Src* instead, as this has GstV4l2BufferPool* */ GstV4l2BufferPool *pool; }; diff --git a/sys/v4l2/v4l2_calls.c b/sys/v4l2/v4l2_calls.c index f7cc2bd3cc..f318fc5b01 100644 --- a/sys/v4l2/v4l2_calls.c +++ b/sys/v4l2/v4l2_calls.c @@ -313,8 +313,9 @@ gst_v4l2_fill_lists (GstV4l2Object * v4l2object) channel->label = g_strdup ((const gchar *) control.name); v4l2channel->id = n; -#if 0 /* FIXME: it will be need just when handling private controls - (currently none of base controls are of this type) */ +#if 0 + /* FIXME: it will be need just when handling private controls + *(currently none of base controls are of this type) */ if (control.type == V4L2_CTRL_TYPE_MENU) { struct v4l2_querymenu menu, *mptr; diff --git a/sys/v4l2/v4l2src_calls.c b/sys/v4l2/v4l2src_calls.c index f7e170598e..b556cba721 100644 --- a/sys/v4l2/v4l2src_calls.c +++ b/sys/v4l2/v4l2src_calls.c @@ -67,6 +67,7 @@ static GstBufferClass *v4l2buffer_parent_class = NULL; static gboolean gst_v4l2src_get_nearest_size (GstV4l2Src * v4l2src, guint32 pixelformat, gint * width, gint * height); +static void gst_v4l2_buffer_pool_destroy (GstV4l2BufferPool * pool); static void gst_v4l2_buffer_finalize (GstV4l2Buffer * buffer) @@ -112,12 +113,6 @@ gst_v4l2_buffer_finalize (GstV4l2Buffer * buffer) } } -static void -gst_v4l2_buffer_init (GstV4l2Buffer * xvimage, gpointer g_class) -{ - /* NOP */ -} - static void gst_v4l2_buffer_class_init (gpointer g_class, gpointer class_data) { @@ -144,7 +139,7 @@ gst_v4l2_buffer_get_type (void) NULL, sizeof (GstV4l2Buffer), 0, - (GInstanceInitFunc) gst_v4l2_buffer_init, + NULL, NULL }; _gst_v4l2_buffer_type = g_type_register_static (GST_TYPE_BUFFER, @@ -163,9 +158,8 @@ gst_v4l2_buffer_new (GstV4l2BufferPool * pool, guint index, GstCaps * caps) GST_LOG ("creating buffer %u, %p in pool %p", index, ret, pool); - ret->pool = pool; - gst_mini_object_ref (GST_MINI_OBJECT (pool)); - memset (&ret->vbuffer, 0x00, sizeof (ret->vbuffer)); + ret->pool = + (GstV4l2BufferPool *) gst_mini_object_ref (GST_MINI_OBJECT (pool)); ret->vbuffer.index = index; ret->vbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; @@ -237,9 +231,11 @@ gst_v4l2_buffer_pool_finalize (GstV4l2BufferPool * pool) if (pool->video_fd >= 0) close (pool->video_fd); - if (pool->buffers) + if (pool->buffers) { g_free (pool->buffers); - pool->buffers = NULL; + pool->buffers = NULL; + } + GST_MINI_OBJECT_CLASS (buffer_pool_parent_class)->finalize (GST_MINI_OBJECT (pool)); } @@ -326,7 +322,7 @@ buffer_new_failed: { gint errnosave = errno; - gst_mini_object_unref (GST_MINI_OBJECT (pool)); + gst_v4l2_buffer_pool_destroy (pool); errno = errnosave; @@ -379,10 +375,14 @@ gst_v4l2_buffer_pool_destroy (GstV4l2BufferPool * pool) pool->running = FALSE; g_mutex_unlock (pool->lock); + GST_DEBUG ("destroy pool"); + /* after this point, no more buffers will be queued or dequeued; no buffer * from pool->buffers that is NULL will be set to a buffer, and no buffer that * is not NULL will be pushed out. */ + /* miniobjects have no dispose, so they can't break ref-cycles, as buffers ref + * the pool, we need to unref the buffer to properly finalize te pool */ for (n = 0; n < pool->buffer_count; n++) { GstBuffer *buf; @@ -956,7 +956,7 @@ default_frame_sizes: /****************************************************** * gst_v4l2src_grab_frame (): * grab a frame for capturing - * return value: The captured frame number or -1 on error. + * return value: GST_FLOW_OK or GST_FLOW_ERROR ******************************************************/ GstFlowReturn gst_v4l2src_grab_frame (GstV4l2Src * v4l2src, GstBuffer ** buf)