diff -r 566aac58b414 v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h --- a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h Thu Aug 07 19:34:10 2008 +0200 +++ b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h Sun Aug 17 14:06:29 2008 +0200 @@ -43,6 +43,10 @@ #define V4L2_PIX_FMT_PAC207 v4l2_fourcc('P','2','0','7') #endif +#ifndef V4L2_PIX_FMT_PJPG +#define V4L2_PIX_FMT_PJPG v4l2_fourcc('P', 'J', 'P', 'G') +#endif + #ifndef V4L2_PIX_FMT_SGBRG8 #define V4L2_PIX_FMT_SGBRG8 v4l2_fourcc('G','B','R','G') #endif diff -r 566aac58b414 v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c --- a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c Thu Aug 07 19:34:10 2008 +0200 +++ b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c Sun Aug 17 14:06:29 2008 +0200 @@ -48,6 +48,7 @@ V4L2_PIX_FMT_SPCA561, V4L2_PIX_FMT_SN9C10X, V4L2_PIX_FMT_PAC207, + V4L2_PIX_FMT_PJPG, }; static const unsigned int supported_dst_pixfmts[] = { @@ -297,6 +298,51 @@ } switch (src_fmt->fmt.pix.pixelformat) { + case V4L2_PIX_FMT_PJPG: + { + unsigned char *in; + unsigned char *out, out_buf[src_size]; + int in_size = src_size, out_size, header_size = 0x646; + + if (src_size < header_size) + return needed; + + memcpy(out_buf, src, header_size); + + in = src + header_size; + out = out_buf + header_size; + in_size -= header_size; + out_size = header_size; + + while(in_size > 0) { + int chunk_size; + + if (in[0] != 0xff || in[1] != 0xff || in[2] != 0xff) { + fprintf(stderr, "Pixart JPEG format error, header: %02x %02x %02x\n", + (int)in[0], (int)in[1], (int)in[2]); + return needed; + } + if (in[3] == 0u) + chunk_size = in_size - 4; + else if (in[3] < 6u) + chunk_size = 1024 >> (in[3] - 1); + else { + fprintf(stderr, "Pixart JPEG format error: chunk_size = %d\n", + (int)in[3]); + return needed; + } + + memcpy(out, in + 4, chunk_size); + in += chunk_size + 4; + out += chunk_size; + in_size -= chunk_size + 4; + out_size += chunk_size; + } + + src = out_buf; + src_size = out_size; + /* fall through! */ + } case V4L2_PIX_FMT_MJPEG: case V4L2_PIX_FMT_JPEG: if (!data->jdec) { diff -r 566aac58b414 v4l2-apps/lib/libv4l/libv4lconvert/tinyjpeg.c --- a/v4l2-apps/lib/libv4l/libv4lconvert/tinyjpeg.c Thu Aug 07 19:34:10 2008 +0200 +++ b/v4l2-apps/lib/libv4l/libv4lconvert/tinyjpeg.c Sun Aug 17 14:06:29 2008 +0200 @@ -60,6 +60,9 @@ #define BLACK_Y 0 #define BLACK_U 127 #define BLACK_V 127 + +#define DEBUG 1 +#define LOG2FILE 1 #if DEBUG #if LOG2FILE @@ -2112,6 +2115,7 @@ for (x=0; x < priv->width; x+=xstride_by_mcu) { decode_MCU(priv); + skip_nbits(priv->reservoir, priv->nbits_in_reservoir, priv->stream, 8); convert_to_pixfmt(priv); priv->plane[0] += bytes_per_mcu[0]; priv->plane[1] += bytes_per_mcu[1];