summaryrefslogtreecommitdiffstats
path: root/ext/jpeg
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.net>2006-03-24 09:54:00 +0000
committerTim-Philipp Müller <tim@centricular.net>2006-03-24 09:54:00 +0000
commitf53ce6baa7e540d40761efed5a085d03b3b66f6d (patch)
tree6f6b423b04efd26599386eb8177e10ef1664e9a9 /ext/jpeg
parenta876898f35bc60218afb368ebcf0b93a79e32617 (diff)
ext/jpeg/gstjpegenc.c: Don't crash when encoding images where the number of rows isn't a multiple of 2*DCTSIZE. Add s...
Original commit message from CVS: * ext/jpeg/gstjpegenc.c: (gst_jpegenc_init), (gst_jpegenc_chain): Don't crash when encoding images where the number of rows isn't a multiple of 2*DCTSIZE. Add some GST_DEBUG_FUNCPTR.
Diffstat (limited to 'ext/jpeg')
-rw-r--r--ext/jpeg/gstjpegenc.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/ext/jpeg/gstjpegenc.c b/ext/jpeg/gstjpegenc.c
index 59fc1022..1f45531b 100644
--- a/ext/jpeg/gstjpegenc.c
+++ b/ext/jpeg/gstjpegenc.c
@@ -206,14 +206,18 @@ gst_jpegenc_init (GstJpegEnc * jpegenc)
/* create the sink and src pads */
jpegenc->sinkpad =
gst_pad_new_from_static_template (&gst_jpegenc_sink_pad_template, "sink");
- gst_pad_set_chain_function (jpegenc->sinkpad, gst_jpegenc_chain);
- gst_pad_set_getcaps_function (jpegenc->sinkpad, gst_jpegenc_getcaps);
- gst_pad_set_setcaps_function (jpegenc->sinkpad, gst_jpegenc_setcaps);
+ gst_pad_set_chain_function (jpegenc->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_jpegenc_chain));
+ gst_pad_set_getcaps_function (jpegenc->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_jpegenc_getcaps));
+ gst_pad_set_setcaps_function (jpegenc->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_jpegenc_setcaps));
gst_element_add_pad (GST_ELEMENT (jpegenc), jpegenc->sinkpad);
jpegenc->srcpad =
gst_pad_new_from_static_template (&gst_jpegenc_src_pad_template, "src");
- gst_pad_set_getcaps_function (jpegenc->sinkpad, gst_jpegenc_getcaps);
+ gst_pad_set_getcaps_function (jpegenc->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_jpegenc_getcaps));
/*gst_pad_set_setcaps_function (jpegenc->sinkpad, gst_jpegenc_setcaps); */
gst_pad_use_fixed_caps (jpegenc->sinkpad);
gst_element_add_pad (GST_ELEMENT (jpegenc), jpegenc->srcpad);
@@ -402,7 +406,7 @@ gst_jpegenc_chain (GstPad * pad, GstBuffer * buf)
gulong size;
GstBuffer *outbuf;
guint height, width;
- guchar *base[3];
+ guchar *base[3], *end[3];
gint i, j, k;
jpegenc = GST_JPEGENC (GST_OBJECT_PARENT (pad));
@@ -429,6 +433,10 @@ gst_jpegenc_chain (GstPad * pad, GstBuffer * buf)
base[1] = data + I420_U_OFFSET (width, height);
base[2] = data + I420_V_OFFSET (width, height);
+ end[0] = base[0] + height * I420_Y_ROWSTRIDE (width);
+ end[1] = base[1] + (height / 2) * I420_U_ROWSTRIDE (width);
+ end[2] = base[2] + (height / 2) * I420_V_ROWSTRIDE (width);
+
jpegenc->jdest.next_output_byte = GST_BUFFER_DATA (outbuf);
jpegenc->jdest.free_in_buffer = GST_BUFFER_SIZE (outbuf);
@@ -442,13 +450,17 @@ gst_jpegenc_chain (GstPad * pad, GstBuffer * buf)
/*g_print ("next scanline: %d\n", jpegenc->cinfo.next_scanline); */
for (j = 0, k = 0; j < (2 * DCTSIZE); j += 2, k++) {
jpegenc->line[0][j] = base[0];
- base[0] += I420_Y_ROWSTRIDE (width);
+ if (base[0] + I420_Y_ROWSTRIDE (width) < end[0])
+ base[0] += I420_Y_ROWSTRIDE (width);
jpegenc->line[0][j + 1] = base[0];
- base[0] += I420_Y_ROWSTRIDE (width);
+ if (base[0] + I420_Y_ROWSTRIDE (width) < end[0])
+ base[0] += I420_Y_ROWSTRIDE (width);
jpegenc->line[1][k] = base[1];
- base[1] += I420_U_ROWSTRIDE (width);
+ if (base[1] + I420_U_ROWSTRIDE (width) < end[1])
+ base[1] += I420_U_ROWSTRIDE (width);
jpegenc->line[2][k] = base[2];
- base[2] += I420_V_ROWSTRIDE (width);
+ if (base[2] + I420_V_ROWSTRIDE (width) < end[2])
+ base[2] += I420_V_ROWSTRIDE (width);
}
jpeg_write_raw_data (&jpegenc->cinfo, jpegenc->line, 2 * DCTSIZE);
}