summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Dufresne <nicolas.dufresne@collabora.com>2016-02-07 15:02:35 -0500
committerTim-Philipp Müller <tim@centricular.com>2016-04-06 10:58:40 +0100
commitccaecac370491cef50fc8680d68bed7cac57649f (patch)
tree2ca8c7e4a39c946181c2d798c155bcc0dde5dc37
parentc23733a88cdf64df5d14ba2c4ff8d4f9daa725b2 (diff)
jpegdec: Don't pass the same data over and over
We already pass the entire frame to the decoder. If the decoder ask for more data, don't pass the same data again as this leads to infinit loop. Instead, simply fail the fill function to signal the problem with that frame. It will then be skipped properly. https://bugzilla.gnome.org/show_bug.cgi?id=761670
-rw-r--r--ext/jpeg/gstjpegdec.c18
1 files changed, 6 insertions, 12 deletions
diff --git a/ext/jpeg/gstjpegdec.c b/ext/jpeg/gstjpegdec.c
index d67f1de77..8523e17ca 100644
--- a/ext/jpeg/gstjpegdec.c
+++ b/ext/jpeg/gstjpegdec.c
@@ -183,17 +183,9 @@ gst_jpeg_dec_class_init (GstJpegDecClass * klass)
static boolean
gst_jpeg_dec_fill_input_buffer (j_decompress_ptr cinfo)
{
- GstJpegDec *dec;
-
- dec = CINFO_GET_JPEGDEC (cinfo);
- g_return_val_if_fail (dec != NULL, FALSE);
- g_return_val_if_fail (dec->current_frame != NULL, FALSE);
- g_return_val_if_fail (dec->current_frame_map.data != NULL, FALSE);
-
- cinfo->src->next_input_byte = dec->current_frame_map.data;
- cinfo->src->bytes_in_buffer = dec->current_frame_map.size;
-
- return TRUE;
+ /* We pass in full frame initially, if this get called, the frame is most likely
+ * corrupted */
+ return FALSE;
}
static void
@@ -1002,7 +994,9 @@ gst_jpeg_dec_handle_frame (GstVideoDecoder * bdec, GstVideoCodecFrame * frame)
dec->current_frame = frame;
gst_buffer_map (frame->input_buffer, &dec->current_frame_map, GST_MAP_READ);
- gst_jpeg_dec_fill_input_buffer (&dec->cinfo);
+
+ dec->cinfo.src->next_input_byte = dec->current_frame_map.data;
+ dec->cinfo.src->bytes_in_buffer = dec->current_frame_map.size;
if (setjmp (dec->jerr.setjmp_buffer)) {
code = dec->jerr.pub.msg_code;