sys/v4l2/: Fix memory leaks. Small code cleanups : No need for empty _init(). No need to memset instance structures. ...

Original commit message from CVS:
* 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.
This commit is contained in:
Stefan Kost 2008-08-26 12:27:11 +00:00
parent 4e2a12368b
commit 2ea5c05241
6 changed files with 39 additions and 16 deletions

View file

@ -1,3 +1,13 @@
2008-08-26 Stefan Kost <ensonic@users.sf.net>
* 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 <ensonic@users.sf.net> 2008-08-26 Stefan Kost <ensonic@users.sf.net>
* tests/icles/.cvsignore: * tests/icles/.cvsignore:

View file

@ -290,6 +290,12 @@ gst_v4l2_object_destroy (GstV4l2Object * v4l2object)
if (v4l2object->videodev) if (v4l2object->videodev)
g_free (v4l2object->videodev); g_free (v4l2object->videodev);
if (v4l2object->channel)
g_free (v4l2object->channel);
if (v4l2object->norm)
g_free (v4l2object->norm);
g_free (v4l2object); g_free (v4l2object);
} }

View file

@ -354,6 +354,11 @@ gst_v4l2src_dispose (GObject * object)
gst_v4l2src_clear_format_list (v4l2src); gst_v4l2src_clear_format_list (v4l2src);
} }
if (v4l2src->probed_caps) {
gst_caps_unref (v4l2src->probed_caps);
}
G_OBJECT_CLASS (parent_class)->dispose (object); G_OBJECT_CLASS (parent_class)->dispose (object);
} }

View file

@ -70,6 +70,7 @@ struct _GstV4l2Buffer {
struct v4l2_buffer vbuffer; struct v4l2_buffer vbuffer;
/* FIXME: have GstV4l2Src* instead, as this has GstV4l2BufferPool* */
GstV4l2BufferPool *pool; GstV4l2BufferPool *pool;
}; };

View file

@ -313,8 +313,9 @@ gst_v4l2_fill_lists (GstV4l2Object * v4l2object)
channel->label = g_strdup ((const gchar *) control.name); channel->label = g_strdup ((const gchar *) control.name);
v4l2channel->id = n; v4l2channel->id = n;
#if 0 /* FIXME: it will be need just when handling private controls #if 0
(currently none of base controls are of this type) */ /* 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) { if (control.type == V4L2_CTRL_TYPE_MENU) {
struct v4l2_querymenu menu, *mptr; struct v4l2_querymenu menu, *mptr;

View file

@ -67,6 +67,7 @@ static GstBufferClass *v4l2buffer_parent_class = NULL;
static gboolean static gboolean
gst_v4l2src_get_nearest_size (GstV4l2Src * v4l2src, guint32 pixelformat, gst_v4l2src_get_nearest_size (GstV4l2Src * v4l2src, guint32 pixelformat,
gint * width, gint * height); gint * width, gint * height);
static void gst_v4l2_buffer_pool_destroy (GstV4l2BufferPool * pool);
static void static void
gst_v4l2_buffer_finalize (GstV4l2Buffer * buffer) 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 static void
gst_v4l2_buffer_class_init (gpointer g_class, gpointer class_data) gst_v4l2_buffer_class_init (gpointer g_class, gpointer class_data)
{ {
@ -144,7 +139,7 @@ gst_v4l2_buffer_get_type (void)
NULL, NULL,
sizeof (GstV4l2Buffer), sizeof (GstV4l2Buffer),
0, 0,
(GInstanceInitFunc) gst_v4l2_buffer_init, NULL,
NULL NULL
}; };
_gst_v4l2_buffer_type = g_type_register_static (GST_TYPE_BUFFER, _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); GST_LOG ("creating buffer %u, %p in pool %p", index, ret, pool);
ret->pool = pool; ret->pool =
gst_mini_object_ref (GST_MINI_OBJECT (pool)); (GstV4l2BufferPool *) gst_mini_object_ref (GST_MINI_OBJECT (pool));
memset (&ret->vbuffer, 0x00, sizeof (ret->vbuffer));
ret->vbuffer.index = index; ret->vbuffer.index = index;
ret->vbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ret->vbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
@ -237,9 +231,11 @@ gst_v4l2_buffer_pool_finalize (GstV4l2BufferPool * pool)
if (pool->video_fd >= 0) if (pool->video_fd >= 0)
close (pool->video_fd); close (pool->video_fd);
if (pool->buffers) if (pool->buffers) {
g_free (pool->buffers); g_free (pool->buffers);
pool->buffers = NULL; pool->buffers = NULL;
}
GST_MINI_OBJECT_CLASS (buffer_pool_parent_class)->finalize (GST_MINI_OBJECT GST_MINI_OBJECT_CLASS (buffer_pool_parent_class)->finalize (GST_MINI_OBJECT
(pool)); (pool));
} }
@ -326,7 +322,7 @@ buffer_new_failed:
{ {
gint errnosave = errno; gint errnosave = errno;
gst_mini_object_unref (GST_MINI_OBJECT (pool)); gst_v4l2_buffer_pool_destroy (pool);
errno = errnosave; errno = errnosave;
@ -379,10 +375,14 @@ gst_v4l2_buffer_pool_destroy (GstV4l2BufferPool * pool)
pool->running = FALSE; pool->running = FALSE;
g_mutex_unlock (pool->lock); g_mutex_unlock (pool->lock);
GST_DEBUG ("destroy pool");
/* after this point, no more buffers will be queued or dequeued; no buffer /* 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 * from pool->buffers that is NULL will be set to a buffer, and no buffer that
* is not NULL will be pushed out. */ * 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++) { for (n = 0; n < pool->buffer_count; n++) {
GstBuffer *buf; GstBuffer *buf;
@ -956,7 +956,7 @@ default_frame_sizes:
/****************************************************** /******************************************************
* gst_v4l2src_grab_frame (): * gst_v4l2src_grab_frame ():
* grab a frame for capturing * 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 GstFlowReturn
gst_v4l2src_grab_frame (GstV4l2Src * v4l2src, GstBuffer ** buf) gst_v4l2src_grab_frame (GstV4l2Src * v4l2src, GstBuffer ** buf)