aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca/zc3xx.c
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2012-05-06 08:28:24 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-05-14 08:34:15 -0400
commit83fb2e2eaae5a3b4b3503f1e305451ed9d1a3761 (patch)
tree578c423b299b3a5c138402a3d090668b2f3ed7d0 /drivers/media/video/gspca/zc3xx.c
parentfba11fed8aad86c10cde062ba0b76e8f8551f256 (diff)
[media] gspca_zc3xx: Fix JPEG quality setting code
The current code is using bits 0-1 of register 8 of the zc3xx controller to set the JPEG quality, but the correct bits are bits 1-2. Bit 0 selects between truncation or rounding in the quantization phase of the compression, since rounding generally gives better results it should thus always be 1. This patch also corrects the quality percentages which belong to the 4 different settings. Last this patch removes the different reg 8 defaults depending on the sensor type. Some of them where going for a default quality setting of 50%, which generally is not necessary in any way and results in poor image quality. 75% is a good default to use for all scenarios. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/gspca/zc3xx.c')
-rw-r--r--drivers/media/video/gspca/zc3xx.c64
1 files changed, 22 insertions, 42 deletions
diff --git a/drivers/media/video/gspca/zc3xx.c b/drivers/media/video/gspca/zc3xx.c
index 33a2aab1dca1..3c6db02fe74b 100644
--- a/drivers/media/video/gspca/zc3xx.c
+++ b/drivers/media/video/gspca/zc3xx.c
@@ -32,7 +32,7 @@ MODULE_LICENSE("GPL");
32 32
33static int force_sensor = -1; 33static int force_sensor = -1;
34 34
35#define REG08_DEF 3 /* default JPEG compression (70%) */ 35#define REG08_DEF 3 /* default JPEG compression (75%) */
36#include "zc3xx-reg.h" 36#include "zc3xx-reg.h"
37 37
38/* controls */ 38/* controls */
@@ -193,10 +193,10 @@ static const struct ctrl sd_ctrls[NCTRLS] = {
193 .id = V4L2_CID_JPEG_COMPRESSION_QUALITY, 193 .id = V4L2_CID_JPEG_COMPRESSION_QUALITY,
194 .type = V4L2_CTRL_TYPE_INTEGER, 194 .type = V4L2_CTRL_TYPE_INTEGER,
195 .name = "Compression Quality", 195 .name = "Compression Quality",
196 .minimum = 40, 196 .minimum = 50,
197 .maximum = 70, 197 .maximum = 94,
198 .step = 1, 198 .step = 1,
199 .default_value = 70 /* updated in sd_init() */ 199 .default_value = 75,
200 }, 200 },
201 .set = sd_setquality 201 .set = sd_setquality
202 }, 202 },
@@ -241,8 +241,8 @@ static const struct v4l2_pix_format sif_mode[] = {
241 .priv = 0}, 241 .priv = 0},
242}; 242};
243 243
244/* bridge reg08 -> JPEG quality conversion table */ 244/* bridge reg08 bits 1-2 -> JPEG quality conversion table */
245static u8 jpeg_qual[] = {40, 50, 60, 70, /*80*/}; 245static u8 jpeg_qual[] = {50, 75, 87, 94};
246 246
247/* usb exchanges */ 247/* usb exchanges */
248struct usb_action { 248struct usb_action {
@@ -5923,7 +5923,7 @@ static void setquality(struct gspca_dev *gspca_dev)
5923 struct sd *sd = (struct sd *) gspca_dev; 5923 struct sd *sd = (struct sd *) gspca_dev;
5924 s8 reg07; 5924 s8 reg07;
5925 5925
5926 jpeg_set_qual(sd->jpeg_hdr, jpeg_qual[sd->reg08]); 5926 jpeg_set_qual(sd->jpeg_hdr, jpeg_qual[sd->reg08 >> 1]);
5927 5927
5928 reg07 = 0; 5928 reg07 = 0;
5929 switch (sd->sensor) { 5929 switch (sd->sensor) {
@@ -6079,11 +6079,12 @@ static void transfer_update(struct work_struct *work)
6079 struct sd *sd = container_of(work, struct sd, work); 6079 struct sd *sd = container_of(work, struct sd, work);
6080 struct gspca_dev *gspca_dev = &sd->gspca_dev; 6080 struct gspca_dev *gspca_dev = &sd->gspca_dev;
6081 int change, good; 6081 int change, good;
6082 u8 reg07, reg11; 6082 u8 reg07, qual, reg11;
6083 6083
6084 /* synchronize with the main driver and initialize the registers */ 6084 /* synchronize with the main driver and initialize the registers */
6085 mutex_lock(&gspca_dev->usb_lock); 6085 mutex_lock(&gspca_dev->usb_lock);
6086 reg07 = 0; /* max */ 6086 reg07 = 0; /* max */
6087 qual = sd->reg08 >> 1;
6087 reg_w(gspca_dev, reg07, 0x0007); 6088 reg_w(gspca_dev, reg07, 0x0007);
6088 reg_w(gspca_dev, sd->reg08, ZC3XX_R008_CLOCKSETTING); 6089 reg_w(gspca_dev, sd->reg08, ZC3XX_R008_CLOCKSETTING);
6089 mutex_unlock(&gspca_dev->usb_lock); 6090 mutex_unlock(&gspca_dev->usb_lock);
@@ -6109,9 +6110,9 @@ static void transfer_update(struct work_struct *work)
6109 case 0: /* max */ 6110 case 0: /* max */
6110 reg07 = sd->sensor == SENSOR_HV7131R 6111 reg07 = sd->sensor == SENSOR_HV7131R
6111 ? 0x30 : 0x32; 6112 ? 0x30 : 0x32;
6112 if (sd->reg08 != 0) { 6113 if (qual != 0) {
6113 change = 3; 6114 change = 3;
6114 sd->reg08--; 6115 qual--;
6115 } 6116 }
6116 break; 6117 break;
6117 case 0x32: 6118 case 0x32:
@@ -6144,10 +6145,10 @@ static void transfer_update(struct work_struct *work)
6144 } 6145 }
6145 } 6146 }
6146 } else { /* reg07 max */ 6147 } else { /* reg07 max */
6147 if (sd->reg08 < sizeof jpeg_qual - 1) { 6148 if (qual < sizeof jpeg_qual - 1) {
6148 good++; 6149 good++;
6149 if (good > 10) { 6150 if (good > 10) {
6150 sd->reg08++; 6151 qual++;
6151 change = 2; 6152 change = 2;
6152 } 6153 }
6153 } 6154 }
@@ -6162,15 +6163,16 @@ static void transfer_update(struct work_struct *work)
6162 goto err; 6163 goto err;
6163 } 6164 }
6164 if (change & 2) { 6165 if (change & 2) {
6166 sd->reg08 = (qual << 1) | 1;
6165 reg_w(gspca_dev, sd->reg08, 6167 reg_w(gspca_dev, sd->reg08,
6166 ZC3XX_R008_CLOCKSETTING); 6168 ZC3XX_R008_CLOCKSETTING);
6167 if (gspca_dev->usb_err < 0 6169 if (gspca_dev->usb_err < 0
6168 || !gspca_dev->present 6170 || !gspca_dev->present
6169 || !gspca_dev->streaming) 6171 || !gspca_dev->streaming)
6170 goto err; 6172 goto err;
6171 sd->ctrls[QUALITY].val = jpeg_qual[sd->reg08]; 6173 sd->ctrls[QUALITY].val = jpeg_qual[qual];
6172 jpeg_set_qual(sd->jpeg_hdr, 6174 jpeg_set_qual(sd->jpeg_hdr,
6173 jpeg_qual[sd->reg08]); 6175 jpeg_qual[qual]);
6174 } 6176 }
6175 } 6177 }
6176 mutex_unlock(&gspca_dev->usb_lock); 6178 mutex_unlock(&gspca_dev->usb_lock);
@@ -6562,27 +6564,6 @@ static int sd_init(struct gspca_dev *gspca_dev)
6562 [SENSOR_PO2030] = 1, 6564 [SENSOR_PO2030] = 1,
6563 [SENSOR_TAS5130C] = 1, 6565 [SENSOR_TAS5130C] = 1,
6564 }; 6566 };
6565 static const u8 reg08_tb[SENSOR_MAX] = {
6566 [SENSOR_ADCM2700] = 1,
6567 [SENSOR_CS2102] = 3,
6568 [SENSOR_CS2102K] = 3,
6569 [SENSOR_GC0303] = 2,
6570 [SENSOR_GC0305] = 3,
6571 [SENSOR_HDCS2020] = 1,
6572 [SENSOR_HV7131B] = 3,
6573 [SENSOR_HV7131R] = 3,
6574 [SENSOR_ICM105A] = 3,
6575 [SENSOR_MC501CB] = 3,
6576 [SENSOR_MT9V111_1] = 3,
6577 [SENSOR_MT9V111_3] = 3,
6578 [SENSOR_OV7620] = 1,
6579 [SENSOR_OV7630C] = 3,
6580 [SENSOR_PAS106] = 3,
6581 [SENSOR_PAS202B] = 3,
6582 [SENSOR_PB0330] = 3,
6583 [SENSOR_PO2030] = 2,
6584 [SENSOR_TAS5130C] = 3,
6585 };
6586 6567
6587 sensor = zcxx_probeSensor(gspca_dev); 6568 sensor = zcxx_probeSensor(gspca_dev);
6588 if (sensor >= 0) 6569 if (sensor >= 0)
@@ -6734,8 +6715,7 @@ static int sd_init(struct gspca_dev *gspca_dev)
6734 } 6715 }
6735 6716
6736 sd->ctrls[GAMMA].def = gamma[sd->sensor]; 6717 sd->ctrls[GAMMA].def = gamma[sd->sensor];
6737 sd->reg08 = reg08_tb[sd->sensor]; 6718 sd->ctrls[QUALITY].def = jpeg_qual[sd->reg08 >> 1];
6738 sd->ctrls[QUALITY].def = jpeg_qual[sd->reg08];
6739 sd->ctrls[QUALITY].min = jpeg_qual[0]; 6719 sd->ctrls[QUALITY].min = jpeg_qual[0];
6740 sd->ctrls[QUALITY].max = jpeg_qual[ARRAY_SIZE(jpeg_qual) - 1]; 6720 sd->ctrls[QUALITY].max = jpeg_qual[ARRAY_SIZE(jpeg_qual) - 1];
6741 6721
@@ -7030,17 +7010,17 @@ static int sd_querymenu(struct gspca_dev *gspca_dev,
7030static int sd_setquality(struct gspca_dev *gspca_dev, __s32 val) 7010static int sd_setquality(struct gspca_dev *gspca_dev, __s32 val)
7031{ 7011{
7032 struct sd *sd = (struct sd *) gspca_dev; 7012 struct sd *sd = (struct sd *) gspca_dev;
7033 int i; 7013 int i, qual = sd->reg08 >> 1;
7034 7014
7035 for (i = 0; i < ARRAY_SIZE(jpeg_qual) - 1; i++) { 7015 for (i = 0; i < ARRAY_SIZE(jpeg_qual); i++) {
7036 if (val <= jpeg_qual[i]) 7016 if (val <= jpeg_qual[i])
7037 break; 7017 break;
7038 } 7018 }
7039 if (i > 0 7019 if (i > 0
7040 && i == sd->reg08 7020 && i == qual
7041 && val < jpeg_qual[sd->reg08]) 7021 && val < jpeg_qual[i])
7042 i--; 7022 i--;
7043 sd->reg08 = i; 7023 sd->reg08 = (i << 1) | 1;
7044 sd->ctrls[QUALITY].val = jpeg_qual[i]; 7024 sd->ctrls[QUALITY].val = jpeg_qual[i];
7045 if (gspca_dev->streaming) 7025 if (gspca_dev->streaming)
7046 setquality(gspca_dev); 7026 setquality(gspca_dev);