[v4l-utils] New upstream release 0.8.7
Hans de Goede
jwrdegoede at fedoraproject.org
Mon Apr 9 10:43:30 UTC 2012
commit 4a6018593591fd232b99adff8ad275edd1f38305
Author: Hans de Goede <hdegoede at redhat.com>
Date: Mon Apr 9 12:45:35 2012 +0200
New upstream release 0.8.7
- Fixes rhbz#807656
.gitignore | 1 +
...er-tinyjpeg-Fix-out-of-bounds-array-usage.patch | 26 +
...tter-luminance-quantization-table-for-Pix.patch | 51 ++
...r-Add-06f8-301b-pac7302-based-cam-to-the-.patch | 28 +
...convert-Use-bytesperline-instead-of-width.patch | 542 ++++++++++++++++++++
0005-Documentation-spelling-fixes.patch | 66 +++
sources | 2 +-
v4l-utils.spec | 20 +-
8 files changed, 733 insertions(+), 3 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 9106b07..a9a1727 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
/v4l-utils-0.8.3.tar.bz2
/v4l-utils-0.8.4.tar.bz2
/v4l-utils-0.8.5.tar.bz2
+/v4l-utils-0.8.7.tar.bz2
diff --git a/0001-libv4lconver-tinyjpeg-Fix-out-of-bounds-array-usage.patch b/0001-libv4lconver-tinyjpeg-Fix-out-of-bounds-array-usage.patch
new file mode 100644
index 0000000..7ead163
--- /dev/null
+++ b/0001-libv4lconver-tinyjpeg-Fix-out-of-bounds-array-usage.patch
@@ -0,0 +1,26 @@
+From 3df030fe82a31556695dc147e2a28288bbe12cf8 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Sat, 7 Apr 2012 16:31:12 +0200
+Subject: [PATCH 1/5] libv4lconver/tinyjpeg: Fix out of bounds array usage
+
+Signed-off-by: Hans de Goede <hdegoede at redhat.com>
+---
+ lib/libv4lconvert/tinyjpeg.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/libv4lconvert/tinyjpeg.c b/lib/libv4lconvert/tinyjpeg.c
+index e308f63..967e0be 100644
+--- a/lib/libv4lconvert/tinyjpeg.c
++++ b/lib/libv4lconvert/tinyjpeg.c
+@@ -2556,7 +2556,7 @@ int tinyjpeg_get_components(struct jdec_private *priv, unsigned char **component
+ {
+ int i;
+
+- for (i = 0; priv->components[i] && i < COMPONENTS; i++)
++ for (i = 0; i < COMPONENTS && priv->components[i]; i++)
+ components[i] = priv->components[i];
+ return 0;
+ }
+--
+1.7.9.3
+
diff --git a/0002-tinyjpeg-Better-luminance-quantization-table-for-Pix.patch b/0002-tinyjpeg-Better-luminance-quantization-table-for-Pix.patch
new file mode 100644
index 0000000..c44d678
--- /dev/null
+++ b/0002-tinyjpeg-Better-luminance-quantization-table-for-Pix.patch
@@ -0,0 +1,51 @@
+From e186777daeaa717b7d919e932f7d3be10156d572 Mon Sep 17 00:00:00 2001
+From: Jean-Francois Moine <moinejf at free.fr>
+Date: Fri, 23 Mar 2012 20:19:45 +0100
+Subject: [PATCH 2/5] tinyjpeg: Better luminance quantization table for Pixart
+ JPEG
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+An other luminance quantization table gives a better quality to the
+Pixart images created by the webcams handled by the gspca drivers
+pac7302 and pac7311 (pixel format 'PJPG').
+
+Tests have been done with 5 different pac7302 webcams. The marker was
+always 0x44.
+
+Signed-off-by: Jean-François Moine <moinejf at free.fr>
+---
+ lib/libv4lconvert/tinyjpeg.c | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/lib/libv4lconvert/tinyjpeg.c b/lib/libv4lconvert/tinyjpeg.c
+index 967e0be..2c2d4af 100644
+--- a/lib/libv4lconvert/tinyjpeg.c
++++ b/lib/libv4lconvert/tinyjpeg.c
+@@ -206,14 +206,14 @@ static const unsigned char val_ac_chrominance[] = {
+ };
+
+ const unsigned char pixart_quantization[][64] = { {
+- 0x07, 0x07, 0x08, 0x0a, 0x09, 0x07, 0x0d, 0x0b,
+- 0x0c, 0x0d, 0x11, 0x10, 0x0f, 0x12, 0x17, 0x27,
+- 0x1a, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25,
+- 0x1d, 0x28, 0x3a, 0x33, 0x3d, 0x3c, 0x39, 0x33,
+- 0x38, 0x37, 0x40, 0x48, 0x5c, 0x4e, 0x40, 0x44,
+- 0x57, 0x45, 0x37, 0x38, 0x50, 0x6d, 0x51, 0x57,
+- 0x5f, 0x62, 0x67, 0x68, 0x67, 0x3e, 0x4d, 0x71,
+- 0x79, 0x70, 0x64, 0x78, 0x5c, 0x65, 0x67, 0x63,
++ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
++ 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
++ 0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40,
++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+ },
+ {
+ 0x11, 0x12, 0x12, 0x18, 0x15, 0x18, 0x2f, 0x1a,
+--
+1.7.9.3
+
diff --git a/0003-libv4lconver-Add-06f8-301b-pac7302-based-cam-to-the-.patch b/0003-libv4lconver-Add-06f8-301b-pac7302-based-cam-to-the-.patch
new file mode 100644
index 0000000..cfa274b
--- /dev/null
+++ b/0003-libv4lconver-Add-06f8-301b-pac7302-based-cam-to-the-.patch
@@ -0,0 +1,28 @@
+From e681916636373959c39b3f13a44e145106119b68 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Sun, 8 Apr 2012 11:27:52 +0200
+Subject: [PATCH 3/5] libv4lconver: Add 06f8:301b pac7302 based cam to the
+ quirk table
+
+Reported-by: Jean-Francois Moine <moinejf at free.fr>
+Signed-off-by: Hans de Goede <hdegoede at redhat.com>
+---
+ lib/libv4lconvert/control/libv4lcontrol.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/lib/libv4lconvert/control/libv4lcontrol.c b/lib/libv4lconvert/control/libv4lcontrol.c
+index 701483b..25b502a 100644
+--- a/lib/libv4lconvert/control/libv4lcontrol.c
++++ b/lib/libv4lconvert/control/libv4lcontrol.c
+@@ -203,6 +203,8 @@ static const struct v4lcontrol_flags_info v4lcontrol_flags[] = {
+ V4LCONTROL_ROTATED_90_JPEG | V4LCONTROL_WANTS_WB, 1500 },
+ { 0x06f8, 0x3009, 0, NULL, NULL,
+ V4LCONTROL_ROTATED_90_JPEG | V4LCONTROL_WANTS_WB, 1500 },
++ { 0x06f8, 0x301b, 0, NULL, NULL,
++ V4LCONTROL_ROTATED_90_JPEG | V4LCONTROL_WANTS_WB, 1500 },
+ { 0x145f, 0x013c, 0, NULL, NULL,
+ V4LCONTROL_ROTATED_90_JPEG | V4LCONTROL_WANTS_WB, 1500 },
+ /* Pac7311 based devices */
+--
+1.7.9.3
+
diff --git a/0004-libv4lconvert-Use-bytesperline-instead-of-width.patch b/0004-libv4lconvert-Use-bytesperline-instead-of-width.patch
new file mode 100644
index 0000000..645ba85
--- /dev/null
+++ b/0004-libv4lconvert-Use-bytesperline-instead-of-width.patch
@@ -0,0 +1,542 @@
+From 31d2b0b0e40c6c92984d5077bb1a324729c71e7d Mon Sep 17 00:00:00 2001
+From: Robert Abel <abel at uni-bielefeld.de>
+Date: Sat, 25 Feb 2012 18:12:38 +0100
+Subject: [PATCH 4/5] libv4lconvert: Use bytesperline instead of width
+
+Basically, I found that libv4l and its conversion functions usually
+choose to ignore v4l2_pix_format.bytesperline, which seems to work out
+most of the time.
+
+I'm currently working with the mt9v032 camera on a Gumstix Overo board.
+The mt9v032's driver pads output lines to 768 pixels, giving 0x900 bytes
+per line. All code in bayer.c (the camera uses raw bayer pattern) is
+written to assume bytesperline = width and thus everything goes horribly
+wrong.
+
+Anyway, the patch for bayer => rgb as well as bayer => yuv is attached.
+Basically, every time where width was assumed to be the offset to the
+neighboring pixel below, now step is used.
+
+Signed-off-by: Gregor Jasny <gjasny at googlemail.com>
+---
+ lib/libv4lconvert/bayer.c | 219 ++++++++++++++++----------------
+ lib/libv4lconvert/libv4lconvert-priv.h | 6 +-
+ lib/libv4lconvert/libv4lconvert.c | 9 +-
+ 3 files changed, 119 insertions(+), 115 deletions(-)
+
+diff --git a/lib/libv4lconvert/bayer.c b/lib/libv4lconvert/bayer.c
+index 924b8d4..d22db68 100644
+--- a/lib/libv4lconvert/bayer.c
++++ b/lib/libv4lconvert/bayer.c
+@@ -44,7 +44,7 @@
+ /* inspired by OpenCV's Bayer decoding */
+ static void v4lconvert_border_bayer_line_to_bgr24(
+ const unsigned char *bayer, const unsigned char *adjacent_bayer,
+- unsigned char *bgr, int width, int start_with_green, int blue_line)
++ unsigned char *bgr, int width, const int start_with_green, const int blue_line)
+ {
+ int t0, t1;
+
+@@ -164,11 +164,11 @@ static void v4lconvert_border_bayer_line_to_bgr24(
+
+ /* From libdc1394, which on turn was based on OpenCV's Bayer decoding */
+ static void bayer_to_rgbbgr24(const unsigned char *bayer,
+- unsigned char *bgr, int width, int height, unsigned int pixfmt,
++ unsigned char *bgr, int width, int height, const unsigned int stride, unsigned int pixfmt,
+ int start_with_green, int blue_line)
+ {
+ /* render the first line */
+- v4lconvert_border_bayer_line_to_bgr24(bayer, bayer + width, bgr, width,
++ v4lconvert_border_bayer_line_to_bgr24(bayer, bayer + stride, bgr, width,
+ start_with_green, blue_line);
+ bgr += width * 3;
+
+@@ -179,139 +179,141 @@ static void bayer_to_rgbbgr24(const unsigned char *bayer,
+ const unsigned char *bayer_end = bayer + (width - 2);
+
+ if (start_with_green) {
+- /* OpenCV has a bug in the next line, which was
+- t0 = (bayer[0] + bayer[width * 2] + 1) >> 1; */
+- t0 = (bayer[1] + bayer[width * 2 + 1] + 1) >> 1;
++
++ t0 = (bayer[1] + bayer[stride * 2 + 1] + 1) >> 1;
+ /* Write first pixel */
+- t1 = (bayer[0] + bayer[width * 2] + bayer[width + 1] + 1) / 3;
++ t1 = (bayer[0] + bayer[stride * 2] + bayer[stride + 1] + 1) / 3;
+ if (blue_line) {
+ *bgr++ = t0;
+ *bgr++ = t1;
+- *bgr++ = bayer[width];
++ *bgr++ = bayer[stride];
+ } else {
+- *bgr++ = bayer[width];
++ *bgr++ = bayer[stride];
+ *bgr++ = t1;
+ *bgr++ = t0;
+ }
+
+ /* Write second pixel */
+- t1 = (bayer[width] + bayer[width + 2] + 1) >> 1;
++ t1 = (bayer[stride] + bayer[stride + 2] + 1) >> 1;
+ if (blue_line) {
+ *bgr++ = t0;
+- *bgr++ = bayer[width + 1];
++ *bgr++ = bayer[stride + 1];
+ *bgr++ = t1;
+ } else {
+ *bgr++ = t1;
+- *bgr++ = bayer[width + 1];
++ *bgr++ = bayer[stride + 1];
+ *bgr++ = t0;
+ }
+ bayer++;
+ } else {
+ /* Write first pixel */
+- t0 = (bayer[0] + bayer[width * 2] + 1) >> 1;
++ t0 = (bayer[0] + bayer[stride * 2] + 1) >> 1;
+ if (blue_line) {
+ *bgr++ = t0;
+- *bgr++ = bayer[width];
+- *bgr++ = bayer[width + 1];
++ *bgr++ = bayer[stride];
++ *bgr++ = bayer[stride + 1];
+ } else {
+- *bgr++ = bayer[width + 1];
+- *bgr++ = bayer[width];
++ *bgr++ = bayer[stride + 1];
++ *bgr++ = bayer[stride];
+ *bgr++ = t0;
+ }
+ }
+
+ if (blue_line) {
+ for (; bayer <= bayer_end - 2; bayer += 2) {
+- t0 = (bayer[0] + bayer[2] + bayer[width * 2] +
+- bayer[width * 2 + 2] + 2) >> 2;
+- t1 = (bayer[1] + bayer[width] + bayer[width + 2] +
+- bayer[width * 2 + 1] + 2) >> 2;
++ t0 = (bayer[0] + bayer[2] + bayer[stride * 2] +
++ bayer[stride * 2 + 2] + 2) >> 2;
++ t1 = (bayer[1] + bayer[stride] + bayer[stride + 2] +
++ bayer[stride * 2 + 1] + 2) >> 2;
+ *bgr++ = t0;
+ *bgr++ = t1;
+- *bgr++ = bayer[width + 1];
++ *bgr++ = bayer[stride + 1];
+
+- t0 = (bayer[2] + bayer[width * 2 + 2] + 1) >> 1;
+- t1 = (bayer[width + 1] + bayer[width + 3] + 1) >> 1;
++ t0 = (bayer[2] + bayer[stride * 2 + 2] + 1) >> 1;
++ t1 = (bayer[stride + 1] + bayer[stride + 3] + 1) >> 1;
+ *bgr++ = t0;
+- *bgr++ = bayer[width + 2];
++ *bgr++ = bayer[stride + 2];
+ *bgr++ = t1;
+ }
+ } else {
+ for (; bayer <= bayer_end - 2; bayer += 2) {
+- t0 = (bayer[0] + bayer[2] + bayer[width * 2] +
+- bayer[width * 2 + 2] + 2) >> 2;
+- t1 = (bayer[1] + bayer[width] + bayer[width + 2] +
+- bayer[width * 2 + 1] + 2) >> 2;
+- *bgr++ = bayer[width + 1];
++ t0 = (bayer[0] + bayer[2] + bayer[stride * 2] +
++ bayer[stride * 2 + 2] + 2) >> 2;
++ t1 = (bayer[1] + bayer[stride] + bayer[stride + 2] +
++ bayer[stride * 2 + 1] + 2) >> 2;
++ *bgr++ = bayer[stride + 1];
+ *bgr++ = t1;
+ *bgr++ = t0;
+
+- t0 = (bayer[2] + bayer[width * 2 + 2] + 1) >> 1;
+- t1 = (bayer[width + 1] + bayer[width + 3] + 1) >> 1;
++ t0 = (bayer[2] + bayer[stride * 2 + 2] + 1) >> 1;
++ t1 = (bayer[stride + 1] + bayer[stride + 3] + 1) >> 1;
+ *bgr++ = t1;
+- *bgr++ = bayer[width + 2];
++ *bgr++ = bayer[stride + 2];
+ *bgr++ = t0;
+ }
+ }
+
+ if (bayer < bayer_end) {
+ /* write second to last pixel */
+- t0 = (bayer[0] + bayer[2] + bayer[width * 2] +
+- bayer[width * 2 + 2] + 2) >> 2;
+- t1 = (bayer[1] + bayer[width] + bayer[width + 2] +
+- bayer[width * 2 + 1] + 2) >> 2;
++ t0 = (bayer[0] + bayer[2] + bayer[stride * 2] +
++ bayer[stride * 2 + 2] + 2) >> 2;
++ t1 = (bayer[1] + bayer[stride] + bayer[stride + 2] +
++ bayer[stride * 2 + 1] + 2) >> 2;
+ if (blue_line) {
+ *bgr++ = t0;
+ *bgr++ = t1;
+- *bgr++ = bayer[width + 1];
++ *bgr++ = bayer[stride + 1];
+ } else {
+- *bgr++ = bayer[width + 1];
++ *bgr++ = bayer[stride + 1];
+ *bgr++ = t1;
+ *bgr++ = t0;
+ }
+ /* write last pixel */
+- t0 = (bayer[2] + bayer[width * 2 + 2] + 1) >> 1;
++ t0 = (bayer[2] + bayer[stride * 2 + 2] + 1) >> 1;
+ if (blue_line) {
+ *bgr++ = t0;
+- *bgr++ = bayer[width + 2];
+- *bgr++ = bayer[width + 1];
++ *bgr++ = bayer[stride + 2];
++ *bgr++ = bayer[stride + 1];
+ } else {
+- *bgr++ = bayer[width + 1];
+- *bgr++ = bayer[width + 2];
++ *bgr++ = bayer[stride + 1];
++ *bgr++ = bayer[stride + 2];
+ *bgr++ = t0;
+ }
++
+ bayer++;
++
+ } else {
+ /* write last pixel */
+- t0 = (bayer[0] + bayer[width * 2] + 1) >> 1;
+- t1 = (bayer[1] + bayer[width * 2 + 1] + bayer[width] + 1) / 3;
++ t0 = (bayer[0] + bayer[stride * 2] + 1) >> 1;
++ t1 = (bayer[1] + bayer[stride * 2 + 1] + bayer[stride] + 1) / 3;
+ if (blue_line) {
+ *bgr++ = t0;
+ *bgr++ = t1;
+- *bgr++ = bayer[width + 1];
++ *bgr++ = bayer[stride + 1];
+ } else {
+- *bgr++ = bayer[width + 1];
++ *bgr++ = bayer[stride + 1];
+ *bgr++ = t1;
+ *bgr++ = t0;
+ }
++
+ }
+
+- /* skip 2 border pixels */
+- bayer += 2;
++ /* skip 2 border pixels and padding */
++ bayer += (stride - width) + 2;
+
+ blue_line = !blue_line;
+ start_with_green = !start_with_green;
+ }
+
+ /* render the last line */
+- v4lconvert_border_bayer_line_to_bgr24(bayer + width, bayer, bgr, width,
++ v4lconvert_border_bayer_line_to_bgr24(bayer + stride, bayer, bgr, width,
+ !start_with_green, !blue_line);
+ }
+
+ void v4lconvert_bayer_to_rgb24(const unsigned char *bayer,
+- unsigned char *bgr, int width, int height, unsigned int pixfmt)
++ unsigned char *bgr, int width, int height, const unsigned int stride, unsigned int pixfmt)
+ {
+- bayer_to_rgbbgr24(bayer, bgr, width, height, pixfmt,
++ bayer_to_rgbbgr24(bayer, bgr, width, height, stride, pixfmt,
+ pixfmt == V4L2_PIX_FMT_SGBRG8 /* start with green */
+ || pixfmt == V4L2_PIX_FMT_SGRBG8,
+ pixfmt != V4L2_PIX_FMT_SBGGR8 /* blue line */
+@@ -319,9 +321,9 @@ void v4lconvert_bayer_to_rgb24(const unsigned char *bayer,
+ }
+
+ void v4lconvert_bayer_to_bgr24(const unsigned char *bayer,
+- unsigned char *bgr, int width, int height, unsigned int pixfmt)
++ unsigned char *bgr, int width, int height, const unsigned int stride, unsigned int pixfmt)
+ {
+- bayer_to_rgbbgr24(bayer, bgr, width, height, pixfmt,
++ bayer_to_rgbbgr24(bayer, bgr, width, height, stride, pixfmt,
+ pixfmt == V4L2_PIX_FMT_SGBRG8 /* start with green */
+ || pixfmt == V4L2_PIX_FMT_SGRBG8,
+ pixfmt == V4L2_PIX_FMT_SBGGR8 /* blue line */
+@@ -428,7 +430,7 @@ static void v4lconvert_border_bayer_line_to_y(
+ }
+
+ void v4lconvert_bayer_to_yuv420(const unsigned char *bayer, unsigned char *yuv,
+- int width, int height, unsigned int src_pixfmt, int yvu)
++ int width, int height, const unsigned int stride, unsigned int src_pixfmt, int yvu)
+ {
+ int blue_line = 0, start_with_green = 0, x, y;
+ unsigned char *ydst = yuv;
+@@ -451,12 +453,12 @@ void v4lconvert_bayer_to_yuv420(const unsigned char *bayer, unsigned char *yuv,
+
+ b = bayer[x];
+ g = bayer[x + 1];
+- g += bayer[x + width];
+- r = bayer[x + width + 1];
++ g += bayer[x + stride];
++ r = bayer[x + stride + 1];
+ *udst++ = (-4878 * r - 4789 * g + 14456 * b + 4210688) >> 15;
+ *vdst++ = (14456 * r - 6052 * g - 2351 * b + 4210688) >> 15;
+ }
+- bayer += 2 * width;
++ bayer += 2 * stride;
+ }
+ blue_line = 1;
+ break;
+@@ -468,12 +470,12 @@ void v4lconvert_bayer_to_yuv420(const unsigned char *bayer, unsigned char *yuv,
+
+ r = bayer[x];
+ g = bayer[x + 1];
+- g += bayer[x + width];
+- b = bayer[x + width + 1];
++ g += bayer[x + stride];
++ b = bayer[x + stride + 1];
+ *udst++ = (-4878 * r - 4789 * g + 14456 * b + 4210688) >> 15;
+ *vdst++ = (14456 * r - 6052 * g - 2351 * b + 4210688) >> 15;
+ }
+- bayer += 2 * width;
++ bayer += 2 * stride;
+ }
+ break;
+
+@@ -484,12 +486,12 @@ void v4lconvert_bayer_to_yuv420(const unsigned char *bayer, unsigned char *yuv,
+
+ g = bayer[x];
+ b = bayer[x + 1];
+- r = bayer[x + width];
+- g += bayer[x + width + 1];
++ r = bayer[x + stride];
++ g += bayer[x + stride + 1];
+ *udst++ = (-4878 * r - 4789 * g + 14456 * b + 4210688) >> 15;
+ *vdst++ = (14456 * r - 6052 * g - 2351 * b + 4210688) >> 15;
+ }
+- bayer += 2 * width;
++ bayer += 2 * stride;
+ }
+ blue_line = 1;
+ start_with_green = 1;
+@@ -502,21 +504,22 @@ void v4lconvert_bayer_to_yuv420(const unsigned char *bayer, unsigned char *yuv,
+
+ g = bayer[x];
+ r = bayer[x + 1];
+- b = bayer[x + width];
+- g += bayer[x + width + 1];
++ b = bayer[x + stride];
++ g += bayer[x + stride + 1];
+ *udst++ = (-4878 * r - 4789 * g + 14456 * b + 4210688) >> 15;
+ *vdst++ = (14456 * r - 6052 * g - 2351 * b + 4210688) >> 15;
+ }
+- bayer += 2 * width;
++ bayer += 2 * stride;
+ }
+ start_with_green = 1;
+ break;
+ }
+
+- bayer -= width * height;
++ /* Point bayer back to start of frame */
++ bayer -= stride * height;
+
+ /* render the first line */
+- v4lconvert_border_bayer_line_to_y(bayer, bayer + width, ydst, width,
++ v4lconvert_border_bayer_line_to_y(bayer, bayer + stride, ydst, width,
+ start_with_green, blue_line);
+ ydst += width;
+
+@@ -527,104 +530,104 @@ void v4lconvert_bayer_to_yuv420(const unsigned char *bayer, unsigned char *yuv,
+ const unsigned char *bayer_end = bayer + (width - 2);
+
+ if (start_with_green) {
+- t0 = bayer[1] + bayer[width * 2 + 1];
++ t0 = bayer[1] + bayer[stride * 2 + 1];
+ /* Write first pixel */
+- t1 = bayer[0] + bayer[width * 2] + bayer[width + 1];
++ t1 = bayer[0] + bayer[stride * 2] + bayer[stride + 1];
+ if (blue_line)
+- *ydst++ = (8453 * bayer[width] + 5516 * t1 +
++ *ydst++ = (8453 * bayer[stride] + 5516 * t1 +
+ 1661 * t0 + 524288) >> 15;
+ else
+ *ydst++ = (4226 * t0 + 5516 * t1 +
+- 3223 * bayer[width] + 524288) >> 15;
++ 3223 * bayer[stride] + 524288) >> 15;
+
+ /* Write second pixel */
+- t1 = bayer[width] + bayer[width + 2];
++ t1 = bayer[stride] + bayer[stride + 2];
+ if (blue_line)
+- *ydst++ = (4226 * t1 + 16594 * bayer[width + 1] +
++ *ydst++ = (4226 * t1 + 16594 * bayer[stride + 1] +
+ 1611 * t0 + 524288) >> 15;
+ else
+- *ydst++ = (4226 * t0 + 16594 * bayer[width + 1] +
++ *ydst++ = (4226 * t0 + 16594 * bayer[stride + 1] +
+ 1611 * t1 + 524288) >> 15;
+ bayer++;
+ } else {
+ /* Write first pixel */
+- t0 = bayer[0] + bayer[width * 2];
++ t0 = bayer[0] + bayer[stride * 2];
+ if (blue_line) {
+- *ydst++ = (8453 * bayer[width + 1] + 16594 * bayer[width] +
++ *ydst++ = (8453 * bayer[stride + 1] + 16594 * bayer[stride] +
+ 1661 * t0 + 524288) >> 15;
+ } else {
+- *ydst++ = (4226 * t0 + 16594 * bayer[width] +
+- 3223 * bayer[width + 1] + 524288) >> 15;
++ *ydst++ = (4226 * t0 + 16594 * bayer[stride] +
++ 3223 * bayer[stride + 1] + 524288) >> 15;
+ }
+ }
+
+ if (blue_line) {
+ for (; bayer <= bayer_end - 2; bayer += 2) {
+- t0 = bayer[0] + bayer[2] + bayer[width * 2] + bayer[width * 2 + 2];
+- t1 = bayer[1] + bayer[width] + bayer[width + 2] + bayer[width * 2 + 1];
+- *ydst++ = (8453 * bayer[width + 1] + 4148 * t1 +
++ t0 = bayer[0] + bayer[2] + bayer[stride * 2] + bayer[stride * 2 + 2];
++ t1 = bayer[1] + bayer[stride] + bayer[stride + 2] + bayer[stride * 2 + 1];
++ *ydst++ = (8453 * bayer[stride + 1] + 4148 * t1 +
+ 806 * t0 + 524288) >> 15;
+
+- t0 = bayer[2] + bayer[width * 2 + 2];
+- t1 = bayer[width + 1] + bayer[width + 3];
+- *ydst++ = (4226 * t1 + 16594 * bayer[width + 2] +
++ t0 = bayer[2] + bayer[stride * 2 + 2];
++ t1 = bayer[stride + 1] + bayer[stride + 3];
++ *ydst++ = (4226 * t1 + 16594 * bayer[stride + 2] +
+ 1611 * t0 + 524288) >> 15;
+ }
+ } else {
+ for (; bayer <= bayer_end - 2; bayer += 2) {
+- t0 = bayer[0] + bayer[2] + bayer[width * 2] + bayer[width * 2 + 2];
+- t1 = bayer[1] + bayer[width] + bayer[width + 2] + bayer[width * 2 + 1];
++ t0 = bayer[0] + bayer[2] + bayer[stride * 2] + bayer[stride * 2 + 2];
++ t1 = bayer[1] + bayer[stride] + bayer[stride + 2] + bayer[stride * 2 + 1];
+ *ydst++ = (2113 * t0 + 4148 * t1 +
+- 3223 * bayer[width + 1] + 524288) >> 15;
++ 3223 * bayer[stride + 1] + 524288) >> 15;
+
+- t0 = bayer[2] + bayer[width * 2 + 2];
+- t1 = bayer[width + 1] + bayer[width + 3];
+- *ydst++ = (4226 * t0 + 16594 * bayer[width + 2] +
++ t0 = bayer[2] + bayer[stride * 2 + 2];
++ t1 = bayer[stride + 1] + bayer[stride + 3];
++ *ydst++ = (4226 * t0 + 16594 * bayer[stride + 2] +
+ 1611 * t1 + 524288) >> 15;
+ }
+ }
+
+ if (bayer < bayer_end) {
+ /* Write second to last pixel */
+- t0 = bayer[0] + bayer[2] + bayer[width * 2] + bayer[width * 2 + 2];
+- t1 = bayer[1] + bayer[width] + bayer[width + 2] + bayer[width * 2 + 1];
++ t0 = bayer[0] + bayer[2] + bayer[stride * 2] + bayer[stride * 2 + 2];
++ t1 = bayer[1] + bayer[stride] + bayer[stride + 2] + bayer[stride * 2 + 1];
+ if (blue_line)
+- *ydst++ = (8453 * bayer[width + 1] + 4148 * t1 +
++ *ydst++ = (8453 * bayer[stride + 1] + 4148 * t1 +
+ 806 * t0 + 524288) >> 15;
+ else
+ *ydst++ = (2113 * t0 + 4148 * t1 +
+- 3223 * bayer[width + 1] + 524288) >> 15;
++ 3223 * bayer[stride + 1] + 524288) >> 15;
+
+ /* write last pixel */
+- t0 = bayer[2] + bayer[width * 2 + 2];
++ t0 = bayer[2] + bayer[stride * 2 + 2];
+ if (blue_line) {
+- *ydst++ = (8453 * bayer[width + 1] + 16594 * bayer[width + 2] +
++ *ydst++ = (8453 * bayer[stride + 1] + 16594 * bayer[stride + 2] +
+ 1661 * t0 + 524288) >> 15;
+ } else {
+- *ydst++ = (4226 * t0 + 16594 * bayer[width + 2] +
+- 3223 * bayer[width + 1] + 524288) >> 15;
++ *ydst++ = (4226 * t0 + 16594 * bayer[stride + 2] +
++ 3223 * bayer[stride + 1] + 524288) >> 15;
+ }
+ bayer++;
+ } else {
+ /* write last pixel */
+- t0 = bayer[0] + bayer[width * 2];
+- t1 = bayer[1] + bayer[width * 2 + 1] + bayer[width];
++ t0 = bayer[0] + bayer[stride * 2];
++ t1 = bayer[1] + bayer[stride * 2 + 1] + bayer[stride];
+ if (blue_line)
+- *ydst++ = (8453 * bayer[width + 1] + 5516 * t1 +
++ *ydst++ = (8453 * bayer[stride + 1] + 5516 * t1 +
+ 1661 * t0 + 524288) >> 15;
+ else
+ *ydst++ = (4226 * t0 + 5516 * t1 +
+- 3223 * bayer[width + 1] + 524288) >> 15;
++ 3223 * bayer[stride + 1] + 524288) >> 15;
+ }
+
+- /* skip 2 border pixels */
+- bayer += 2;
++ /* skip 2 border pixels and padding */
++ bayer += (stride - width) + 2;
+
+ blue_line = !blue_line;
+ start_with_green = !start_with_green;
+ }
+
+ /* render the last line */
+- v4lconvert_border_bayer_line_to_y(bayer + width, bayer, ydst, width,
++ v4lconvert_border_bayer_line_to_y(bayer + stride, bayer, ydst, width,
+ !start_with_green, !blue_line);
+ }
+diff --git a/lib/libv4lconvert/libv4lconvert-priv.h b/lib/libv4lconvert/libv4lconvert-priv.h
+index 705a26d..5b76767 100644
+--- a/lib/libv4lconvert/libv4lconvert-priv.h
++++ b/lib/libv4lconvert/libv4lconvert-priv.h
+@@ -230,13 +230,13 @@ void v4lconvert_decode_stv0680(const unsigned char *src, unsigned char *dst,
+ int width, int height);
+
+ void v4lconvert_bayer_to_rgb24(const unsigned char *bayer,
+- unsigned char *rgb, int width, int height, unsigned int pixfmt);
++ unsigned char *rgb, int width, int height, const unsigned int stride, unsigned int pixfmt);
+
+ void v4lconvert_bayer_to_bgr24(const unsigned char *bayer,
+- unsigned char *rgb, int width, int height, unsigned int pixfmt);
++ unsigned char *rgb, int width, int height, const unsigned int stride, unsigned int pixfmt);
+
+ void v4lconvert_bayer_to_yuv420(const unsigned char *bayer, unsigned char *yuv,
+- int width, int height, unsigned int src_pixfmt, int yvu);
++ int width, int height, const unsigned int stride, unsigned int src_pixfmt, int yvu);
+
+ void v4lconvert_hm12_to_rgb24(const unsigned char *src,
+ unsigned char *dst, int width, int height);
+diff --git a/lib/libv4lconvert/libv4lconvert.c b/lib/libv4lconvert/libv4lconvert.c
+index 246e2c9..f44f9ff 100644
+--- a/lib/libv4lconvert/libv4lconvert.c
++++ b/lib/libv4lconvert/libv4lconvert.c
+@@ -629,6 +629,7 @@ static int v4lconvert_convert_pixfmt(struct v4lconvert_data *data,
+ unsigned int src_pix_fmt = fmt->fmt.pix.pixelformat;
+ unsigned int width = fmt->fmt.pix.width;
+ unsigned int height = fmt->fmt.pix.height;
++ unsigned int bytesperline = fmt->fmt.pix.bytesperline;
+
+ switch (src_pix_fmt) {
+ /* JPG and variants */
+@@ -858,16 +859,16 @@ static int v4lconvert_convert_pixfmt(struct v4lconvert_data *data,
+ case V4L2_PIX_FMT_SRGGB8:
+ switch (dest_pix_fmt) {
+ case V4L2_PIX_FMT_RGB24:
+- v4lconvert_bayer_to_rgb24(src, dest, width, height, src_pix_fmt);
++ v4lconvert_bayer_to_rgb24(src, dest, width, height, bytesperline, src_pix_fmt);
+ break;
+ case V4L2_PIX_FMT_BGR24:
+- v4lconvert_bayer_to_bgr24(src, dest, width, height, src_pix_fmt);
++ v4lconvert_bayer_to_bgr24(src, dest, width, height, bytesperline, src_pix_fmt);
+ break;
+ case V4L2_PIX_FMT_YUV420:
+- v4lconvert_bayer_to_yuv420(src, dest, width, height, src_pix_fmt, 0);
++ v4lconvert_bayer_to_yuv420(src, dest, width, height, bytesperline, src_pix_fmt, 0);
+ break;
+ case V4L2_PIX_FMT_YVU420:
+- v4lconvert_bayer_to_yuv420(src, dest, width, height, src_pix_fmt, 1);
++ v4lconvert_bayer_to_yuv420(src, dest, width, height, bytesperline, src_pix_fmt, 1);
+ break;
+ }
+ if (src_size < (width * height)) {
+--
+1.7.9.3
+
diff --git a/0005-Documentation-spelling-fixes.patch b/0005-Documentation-spelling-fixes.patch
new file mode 100644
index 0000000..a1b94d8
--- /dev/null
+++ b/0005-Documentation-spelling-fixes.patch
@@ -0,0 +1,66 @@
+From 34da390c9b260fc94a1bf6a5dc9a574d09f6e6d1 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ville=20Skytt=C3=A4?= <ville.skytta at iki.fi>
+Date: Mon, 9 Apr 2012 09:03:53 +0200
+Subject: [PATCH 5/5] Documentation spelling fixes
+
+Signed-off-by: Hans de Goede <hdegoede at redhat.com>
+---
+ README.lib | 8 ++++----
+ README.lib-multi-threading | 2 +-
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/README.lib b/README.lib
+index 09638d4..bdafd6d 100644
+--- a/README.lib
++++ b/README.lib
+@@ -4,7 +4,7 @@ Introduction
+ libv4l is a collection of libraries which adds a thin abstraction layer on
+ top of video4linux2 devices. The purpose of this (thin) layer is to make it
+ easy for application writers to support a wide variety of devices without
+-having to write seperate code for different devices in the same class.
++having to write separate code for different devices in the same class.
+
+ All libv4l components are licensed under the GNU Lesser General Public
+ License version 2 or (at your option) any later version.
+@@ -121,7 +121,7 @@ would need to be extended with many more often chip dependent formats, like
+ the bayer compression used by the spca561 and the (different) compression used
+ by the pac207 and the (again different) compression used by the sn9c102. Adding
+ support for all these formats should not be done at the application level, as
+-then it needs to be written for each application seperately. Licensing issues
++then it needs to be written for each application separately. Licensing issues
+ with the decompressors will then also become a problem as just cut and pasting
+ from one application to another is bound to hit license incompatibilities.
+
+@@ -156,14 +156,14 @@ Q: Why should I use libv4l2 in my app instead of direct device access
+ combined with libv4lconvert?
+ A: libv4l2 is mainly meant for quickly and easily adding support for more
+ pixelformats to existing v4l2 applications. So if you feel better directly
+-accessing the device in combination with libv4lconvert thats fine too.
++accessing the device in combination with libv4lconvert that's fine too.
+
+ Notice that libv4l2 also does emulation of the read() call on devices which
+ do not support it in the driver. In the background this uses mmap buffers
+ (even on devices which do support the read call). This mmap gives libv4lconvert
+ zero-copy access to the captured frame, and then it can write the converted
+ data directly to the buffer the application provided to v4l2_read(). Thus
+-another reason to use liv4l2 is to get the no memcpy advantage of the mmap
++another reason to use libv4l2 is to get the no memcpy advantage of the mmap
+ capture method combined with the simplicity of making a simple read() call.
+
+
+diff --git a/README.lib-multi-threading b/README.lib-multi-threading
+index 93b393c..e444dd4 100644
+--- a/README.lib-multi-threading
++++ b/README.lib-multi-threading
+@@ -1,7 +1,7 @@
+ libv4lconvert is not safe for using one convert instance as returned by
+ v4lconvert_create from multiple threads, if you want to use one v4lconvert
+ instance from multiple threads you must provide your own locking and make
+-sure no simultanious calls are made.
++sure no simultaneous calls are made.
+
+ libv4l1 and libv4l2 are safe for multithread use *under* *the* *following*
+ *conditions* :
+--
+1.7.9.3
+
diff --git a/sources b/sources
index 0e541f8..c67f8f4 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-037bec9f68cfb0b84bcccb00d30e429b v4l-utils-0.8.5.tar.bz2
+d3506785ae022b6a37b986c66015bea3 v4l-utils-0.8.7.tar.bz2
diff --git a/v4l-utils.spec b/v4l-utils.spec
index 2a2ff19..285383f 100644
--- a/v4l-utils.spec
+++ b/v4l-utils.spec
@@ -1,12 +1,18 @@
Name: v4l-utils
-Version: 0.8.5
-Release: 2%{?dist}
+Version: 0.8.7
+Release: 1%{?dist}
Summary: Utilities for video4linux and DVB devices
Group: Applications/System
# ir-keytable and v4l2-sysfs-path are GPLv2 only
License: GPLv2+ and GPLv2
URL: http://www.linuxtv.org/downloads/v4l-utils/
Source0: http://linuxtv.org/downloads/v4l-utils/v4l-utils-%{version}.tar.bz2
+# Bugfixes from upstream git, these can all be dropped with the next release
+Patch1: 0001-libv4lconver-tinyjpeg-Fix-out-of-bounds-array-usage.patch
+Patch2: 0002-tinyjpeg-Better-luminance-quantization-table-for-Pix.patch
+Patch3: 0003-libv4lconver-Add-06f8-301b-pac7302-based-cam-to-the-.patch
+Patch4: 0004-libv4lconvert-Use-bytesperline-instead-of-width.patch
+Patch5: 0005-Documentation-spelling-fixes.patch
BuildRequires: libjpeg-devel qt4-devel kernel-headers desktop-file-utils
# For /lib/udev/rules.d ownership
Requires: udev
@@ -77,6 +83,11 @@ developing applications that use libv4l.
%prep
%setup -q
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
+%patch4 -p1
+%patch5 -p1
%build
@@ -114,6 +125,7 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
%config(noreplace) %{_sysconfdir}/rc_maps.cfg
/lib/udev/rules.d/70-infrared.rules
%{_bindir}/cx18-ctl
+%{_bindir}/dvb*
%{_bindir}/ir-keytable
%{_bindir}/ivtv-ctl
%{_bindir}/v4l2-ctl
@@ -149,6 +161,10 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
%changelog
+* Mon Apr 9 2012 Hans de Goede <hdegoede at redhat.com> - 0.8.7-1
+- New upstream release 0.8.7
+- Fixes rhbz#807656
+
* Sat Jan 14 2012 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 0.8.5-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
More information about the scm-commits
mailing list