summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Kost <ensonic@users.sf.net>2009-09-28 16:29:45 +0300
committerStefan Kost <ensonic@users.sf.net>2009-09-28 17:25:35 +0300
commit69c24fb991d5556e83e68d7a236e6526ea3dade5 (patch)
treed30df455ab9e7934a6ae5eb45c62feefbc3cb664
parent0fac7b5347d1cd1f727b697d5be4782de1f56152 (diff)
jpeg: handle more libjpeg return values, add some more branch hints
Also remove unused size variable in _chain().
-rw-r--r--ext/jpeg/gstjpegdec.c84
1 files changed, 50 insertions, 34 deletions
diff --git a/ext/jpeg/gstjpegdec.c b/ext/jpeg/gstjpegdec.c
index f9cc68e74..0f12be765 100644
--- a/ext/jpeg/gstjpegdec.c
+++ b/ext/jpeg/gstjpegdec.c
@@ -520,2 +520,4 @@ add_huff_table (j_decompress_ptr dinfo,
+ g_assert (*htblptr);
+
/* Copy the number-of-symbols-of-each-code-length counts */
@@ -689,2 +691,3 @@ gst_jpeg_dec_decode_indirect (GstJpegDec * dec, guchar * base[3],
gint i, j, k;
+ gint lines;
@@ -694,28 +697,32 @@ gst_jpeg_dec_decode_indirect (GstJpegDec * dec, guchar * base[3],
for (i = 0; i < height; i += r_v * DCTSIZE) {
- jpeg_read_raw_data (&dec->cinfo, scanarray, r_v * DCTSIZE);
- for (j = 0, k = 0; j < (r_v * DCTSIZE); j += r_v, k++) {
- memcpy (base[0], y_rows[j], I420_Y_ROWSTRIDE (width));
- if (base[0] < last[0])
- base[0] += I420_Y_ROWSTRIDE (width);
- if (r_v == 2) {
- memcpy (base[0], y_rows[j + 1], I420_Y_ROWSTRIDE (width));
+ lines = jpeg_read_raw_data (&dec->cinfo, scanarray, r_v * DCTSIZE);
+ if (G_LIKELY (lines)) {
+ for (j = 0, k = 0; j < (r_v * DCTSIZE); j += r_v, k++) {
+ memcpy (base[0], y_rows[j], I420_Y_ROWSTRIDE (width));
if (base[0] < last[0])
base[0] += I420_Y_ROWSTRIDE (width);
- }
- if (G_LIKELY (r_h == 2)) {
- memcpy (base[1], u_rows[k], I420_U_ROWSTRIDE (width));
- memcpy (base[2], v_rows[k], I420_V_ROWSTRIDE (width));
- } else if (G_UNLIKELY (r_h == 1)) {
- hresamplecpy1 (base[1], u_rows[k], I420_U_ROWSTRIDE (width));
- hresamplecpy1 (base[2], v_rows[k], I420_V_ROWSTRIDE (width));
- } else {
- /* FIXME: implement (at least we avoid crashing by doing nothing) */
- }
+ if (G_LIKELY (r_h == 2)) {
+ memcpy (base[0], y_rows[j + 1], I420_Y_ROWSTRIDE (width));
+ if (base[0] < last[0])
+ base[0] += I420_Y_ROWSTRIDE (width);
+ }
+ if (G_LIKELY (r_h == 2)) {
+ memcpy (base[1], u_rows[k], I420_U_ROWSTRIDE (width));
+ memcpy (base[2], v_rows[k], I420_V_ROWSTRIDE (width));
+ } else if (G_UNLIKELY (r_h == 1)) {
+ hresamplecpy1 (base[1], u_rows[k], I420_U_ROWSTRIDE (width));
+ hresamplecpy1 (base[2], v_rows[k], I420_V_ROWSTRIDE (width));
+ } else {
+ /* FIXME: implement (at least we avoid crashing by doing nothing) */
+ }
- if (r_v == 2 || (k & 1) != 0) {
- if (base[1] < last[1] && base[2] < last[2]) {
- base[1] += I420_U_ROWSTRIDE (width);
- base[2] += I420_V_ROWSTRIDE (width);
+ if (r_v == 2 || (k & 1) != 0) {
+ if (base[1] < last[1] && base[2] < last[2]) {
+ base[1] += I420_U_ROWSTRIDE (width);
+ base[2] += I420_V_ROWSTRIDE (width);
+ }
}
}
+ } else {
+ GST_INFO_OBJECT (dec, "jpeg_read_raw_data() returned 0");
}
@@ -733,2 +740,3 @@ gst_jpeg_dec_decode_direct (GstJpegDec * dec, guchar * base[3],
gint i, j, k;
+ gint lines;
@@ -759,3 +767,6 @@ gst_jpeg_dec_decode_direct (GstJpegDec * dec, guchar * base[3],
}
- jpeg_read_raw_data (&dec->cinfo, line, r_v * DCTSIZE);
+ lines = jpeg_read_raw_data (&dec->cinfo, line, r_v * DCTSIZE);
+ if (G_UNLIKELY (!lines)) {
+ GST_INFO_OBJECT (dec, "jpeg_read_raw_data() returned 0");
+ }
}
@@ -842,3 +853,2 @@ gst_jpeg_dec_chain (GstPad * pad, GstBuffer * buf)
GstBuffer *outbuf;
- gulong size;
guchar *data, *outdata;
@@ -849,3 +859,3 @@ gst_jpeg_dec_chain (GstPad * pad, GstBuffer * buf)
gint i;
- guint code;
+ guint code, hdr_ok;
GstClockTime timestamp, duration;
@@ -911,3 +921,2 @@ gst_jpeg_dec_chain (GstPad * pad, GstBuffer * buf)
data = (guchar *) GST_BUFFER_DATA (dec->tempbuf);
- size = img_len;
GST_LOG_OBJECT (dec, "image size = %u", img_len);
@@ -915,3 +924,3 @@ gst_jpeg_dec_chain (GstPad * pad, GstBuffer * buf)
dec->jsrc.pub.next_input_byte = data;
- dec->jsrc.pub.bytes_in_buffer = size;
+ dec->jsrc.pub.bytes_in_buffer = img_len;
@@ -931,3 +940,6 @@ gst_jpeg_dec_chain (GstPad * pad, GstBuffer * buf)
/* read header */
- jpeg_read_header (&dec->cinfo, TRUE);
+ hdr_ok = jpeg_read_header (&dec->cinfo, TRUE);
+ if (G_UNLIKELY (hdr_ok != JPEG_HEADER_OK)) {
+ GST_WARNING_OBJECT (dec, "reading the header failed, %d", hdr_ok);
+ }
@@ -940,2 +952,3 @@ gst_jpeg_dec_chain (GstPad * pad, GstBuffer * buf)
+#ifndef GST_DISABLE_GST_DEBUG
for (i = 0; i < dec->cinfo.comps_in_scan; ++i) {
@@ -945,2 +958,3 @@ gst_jpeg_dec_chain (GstPad * pad, GstBuffer * buf)
}
+#endif
@@ -955,3 +969,5 @@ gst_jpeg_dec_chain (GstPad * pad, GstBuffer * buf)
guarantee_huff_tables (&dec->cinfo);
- jpeg_start_decompress (&dec->cinfo);
+ if (!jpeg_start_decompress (&dec->cinfo)) {
+ GST_WARNING_OBJECT (dec, "failed to start decompression cycle");
+ }
@@ -960,9 +976,9 @@ gst_jpeg_dec_chain (GstPad * pad, GstBuffer * buf)
- if (width < MIN_WIDTH || width > MAX_WIDTH ||
- height < MIN_HEIGHT || height > MAX_HEIGHT)
+ if (G_UNLIKELY (width < MIN_WIDTH || width > MAX_WIDTH ||
+ height < MIN_HEIGHT || height > MAX_HEIGHT))
goto wrong_size;
- if (width != dec->caps_width || height != dec->caps_height ||
- dec->framerate_numerator != dec->caps_framerate_numerator ||
- dec->framerate_denominator != dec->caps_framerate_denominator) {
+ if (G_UNLIKELY (width != dec->caps_width || height != dec->caps_height ||
+ dec->framerate_numerator != dec->caps_framerate_numerator ||
+ dec->framerate_denominator != dec->caps_framerate_denominator)) {
GstCaps *caps;
@@ -1009,3 +1025,3 @@ gst_jpeg_dec_chain (GstPad * pad, GstBuffer * buf)
dec->outsize, GST_PAD_CAPS (dec->srcpad), &outbuf);
- if (ret != GST_FLOW_OK)
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
goto alloc_failed;