diff options
author | Stefan Kost <ensonic@users.sf.net> | 2009-09-28 16:29:45 +0300 |
---|---|---|
committer | Stefan Kost <ensonic@users.sf.net> | 2009-09-28 17:25:35 +0300 |
commit | 69c24fb991d5556e83e68d7a236e6526ea3dade5 (patch) | |
tree | d30df455ab9e7934a6ae5eb45c62feefbc3cb664 | |
parent | 0fac7b5347d1cd1f727b697d5be4782de1f56152 (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.c | 84 |
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; |