libv4l: Improve jl2005bcd conversion code error reporting and handling
authorHans de Goede <hdegoede@redhat.com>
Thu, 29 Dec 2011 20:42:27 +0000 (21:42 +0100)
committerHans de Goede <hdegoede@redhat.com>
Thu, 29 Dec 2011 20:42:27 +0000 (21:42 +0100)
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
lib/libv4lconvert/jl2005bcd.c
lib/libv4lconvert/libv4lconvert.c

index f3dbf20..0e48cca 100644 (file)
@@ -34,8 +34,8 @@
 #define JPEG_HEADER_SIZE       338\r
 #define JPEG_HEIGHT_OFFSET      94\r
 \r
-static int\r
-find_eoi(const unsigned char *jpeg_data, int jpeg_data_idx, int jpeg_data_size)\r
+static int find_eoi(struct v4lconvert_data *data,\r
+        const unsigned char *jpeg_data, int jpeg_data_idx, int jpeg_data_size)\r
 {\r
        int i;\r
 \r
@@ -44,7 +44,7 @@ find_eoi(const unsigned char *jpeg_data, int jpeg_data_idx, int jpeg_data_size)
                        break;\r
 \r
        if (i >= (jpeg_data_size - 1)) {\r
-               printf("AAI\n");\r
+               V4LCONVERT_ERR("incomplete jl2005bcd frame\n");
                return -1;\r
        }\r
 \r
@@ -73,16 +73,15 @@ int v4lconvert_decode_jl2005bcd(struct v4lconvert_data *data,
        q = src[13] & 0x7f;\r
 \r
        if (height != src[4] << 3) {\r
-               printf("Height is %d, not %d\n", src[4] << 3, height);\r
+               V4LCONVERT_ERR("Height is %d, not %d\n", src[4] << 3, height);\r
                return 1;\r
        }\r
 \r
        if (width != src[5] << 3) {\r
-               printf("Width is %d, not %d\n", src[5] << 3, width);\r
+               V4LCONVERT_ERR("Width is %d, not %d\n", src[5] << 3, width);\r
                return 1;\r
        }\r
-       printf("quality is %d\n", q);\r
-       printf("size: %dx%d\n", width, height);\r
+\r
        /*\r
         * And the fun begins, first of all create a dummy jpeg, which we use\r
         * to get the headers from to feed to libjpeg when decompressing the\r
@@ -163,13 +162,15 @@ int v4lconvert_decode_jl2005bcd(struct v4lconvert_data *data,
        dinfo.err = jpeg_std_error (&jderr);\r
        jpeg_create_decompress (&dinfo);\r
        for (x = 0; x < width; x += 16) {\r
-               eoi = find_eoi(src, jpeg_data_idx, jpeg_data_size);\r
+               eoi = find_eoi(data, src, jpeg_data_idx, jpeg_data_size);\r
                if (eoi < 0)\r
                        return eoi;\r
 \r
                size = eoi - jpeg_data_idx;\r
                if ((JPEG_HEADER_SIZE + size) > sizeof(jpeg_stripe)) {\r
-                       printf("AAAIIIIII\n");\r
+                       V4LCONVERT_ERR("stripe size too big %d > %ld\n",\r
+                                      JPEG_HEADER_SIZE + size,\r
+                                      sizeof(jpeg_stripe));\r
                        return 1;\r
                }\r
                memcpy (jpeg_stripe + JPEG_HEADER_SIZE, \r
index 5e31d82..da146bc 100644 (file)
@@ -829,8 +829,13 @@ static int v4lconvert_convert_pixfmt(struct v4lconvert_data *data,
                        tmpfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_SBGGR8;
                        break;
                case V4L2_PIX_FMT_JL2005BCD:
-                       v4lconvert_decode_jl2005bcd(data, src, src_size,
-                                       tmpbuf, width, height);
+                       if (v4lconvert_decode_jl2005bcd(data, src, src_size,
+                                                       tmpbuf,
+                                                       width, height)) {
+                               /* Corrupt frame, better get another one */
+                               errno = EAGAIN;
+                               return -1;
+                       }
                        tmpfmt.fmt.pix.pixelformat = V4L2_PIX_FMT_SRGGB8;
                        break;
                case V4L2_PIX_FMT_SN9C2028: