summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim.muller@collabora.co.uk>2009-11-09 15:20:00 +0000
committerTim-Philipp Müller <tim.muller@collabora.co.uk>2009-11-09 15:20:00 +0000
commit7af7d93b273ae633121818ccefdee38c21696b2d (patch)
tree93c7ad2f95b7e28d44b6f2ba2770fcdc88499009
parent26e7fe27d7b4fb8faa1c88e13aca8cc799ff1dc1 (diff)
jpegdec: free temporary buffer when changing state to NULL
Free temporary allocations in the state change function and not only when the object is finalised.
-rw-r--r--ext/jpeg/gstjpegdec.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/ext/jpeg/gstjpegdec.c b/ext/jpeg/gstjpegdec.c
index ef94a5abc..61a051ce4 100644
--- a/ext/jpeg/gstjpegdec.c
+++ b/ext/jpeg/gstjpegdec.c
@@ -148,19 +148,12 @@ static void
gst_jpeg_dec_finalize (GObject * object)
{
GstJpegDec *dec = GST_JPEG_DEC (object);
- gint i;
jpeg_destroy_decompress (&dec->cinfo);
if (dec->tempbuf)
gst_buffer_unref (dec->tempbuf);
- for (i = 0; i < 16; i++) {
- g_free (dec->idr_y[i]);
- g_free (dec->idr_u[i]);
- g_free (dec->idr_v[i]);
- }
-
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -682,6 +675,23 @@ hresamplecpy1 (guint8 * dest, const guint8 * src, guint len)
}
}
+static void
+gst_jpeg_dec_free_buffers (GstJpegDec * dec)
+{
+ gint i;
+
+ for (i = 0; i < 16; i++) {
+ g_free (dec->idr_y[i]);
+ g_free (dec->idr_u[i]);
+ g_free (dec->idr_v[i]);
+ dec->idr_y[i] = NULL;
+ dec->idr_u[i] = NULL;
+ dec->idr_v[i] = NULL;
+ }
+
+ dec->idr_width_allocated = 0;
+}
+
static inline gboolean
gst_jpeg_dec_ensure_buffers (GstJpegDec * dec, guint maxrowbytes)
{
@@ -1430,6 +1440,7 @@ gst_jpeg_dec_change_state (GstElement * element, GstStateChange transition)
gst_buffer_unref (dec->tempbuf);
dec->tempbuf = NULL;
}
+ gst_jpeg_dec_free_buffers (dec);
break;
default:
break;