[media] gspca_pac7311: Properly set the compression balance
authorHans de Goede <hdegoede@redhat.com>
Fri, 27 Apr 2012 15:56:59 +0000 (12:56 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 7 May 2012 19:15:21 +0000 (16:15 -0300)
Before this patch sometimes the camera would run out of bandwidth when
running at 640x480@30.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/gspca/pac7311.c

index 54b4ab6..5ccf0b4 100644 (file)
  * 0x1b                Auto white balance related, bit 0 is AWB enable (inverted)
  *             bits 345 seem to toggle per color gains on/off (inverted)
  * 0x78                Global control, bit 6 controls the LED (inverted)
- * 0x80                JPEG compression ratio ? Best not touched
+ * 0x80                Compression balance, interesting settings:
+ *             0x01 Use this to allow the camera to switch to higher compr.
+ *                  on the fly. Needed to stay within bandwidth @ 640x480@30
+ *             0x1c From usb captures under Windows for 640x480
+ *             0x2a Values >= this switch the camera to a lower compression,
+ *                  using the same table for both luminance and chrominance.
+ *                  This gives a sharper picture. Usable only at 640x480@ <
+ *                  15 fps or 320x240 / 160x120. Note currently the driver
+ *                  does not use this as the quality gain is small and the
+ *                  generated JPG-s are only understood by v4l-utils >= 0.8.9
+ *             0x3f From usb captures under Windows for 320x240
+ *             0x69 From usb captures under Windows for 160x120
  *
  * Register page 4:
  *
@@ -408,12 +419,21 @@ static void setexposure(struct gspca_dev *gspca_dev)
         *  640x480 mode and page 4 reg 2 <= 3 then it must be 9
         */
        reg_w(gspca_dev, 0xff, 0x01);
-       if (gspca_dev->cam.cam_mode[(int)gspca_dev->curr_mode].priv &&
-                       sd->ctrls[EXPOSURE].val <= 3) {
+       if (gspca_dev->width != 640 && sd->ctrls[EXPOSURE].val <= 3)
                reg_w(gspca_dev, 0x08, 0x09);
-       } else {
+       else
                reg_w(gspca_dev, 0x08, 0x08);
-       }
+
+       /*
+        * Page1 register 80 sets the compression balance, normally we
+        * want / use 0x1c, but for 640x480@30fps we must allow the
+        * camera to use higher compression or we may run out of
+        * bandwidth.
+        */
+       if (gspca_dev->width == 640 && sd->ctrls[EXPOSURE].val == 2)
+               reg_w(gspca_dev, 0x80, 0x01);
+       else
+               reg_w(gspca_dev, 0x80, 0x1c);
 
        /* load registers to sensor (Bit 0, auto clear) */
        reg_w(gspca_dev, 0x11, 0x01);