mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +00:00
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:
parent
4e2a12368b
commit
2ea5c05241
6 changed files with 39 additions and 16 deletions
10
ChangeLog
10
ChangeLog
|
@ -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:
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue