Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

V4L/DVB (11040): gspca - most jpeg subdrivers: Have the JPEG quality settable.

The JPEG quality of the images (quantization tables) is now settable by the
VIDIOC_S_JPEGCOMP ioctl.

Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Jean-Francois Moine and committed by
Mauro Carvalho Chehab
77ac0baf 71cb2764

+238 -7
+34 -1
drivers/media/video/gspca/conex.c
··· 37 37 unsigned char contrast; 38 38 unsigned char colors; 39 39 u8 quality; 40 + #define QUALITY_MIN 30 41 + #define QUALITY_MAX 60 42 + #define QUALITY_DEF 40 40 43 41 44 u8 *jpeg_hdr; 42 45 }; ··· 825 822 sd->brightness = BRIGHTNESS_DEF; 826 823 sd->contrast = CONTRAST_DEF; 827 824 sd->colors = COLOR_DEF; 828 - sd->quality = 40; 825 + sd->quality = QUALITY_DEF; 829 826 return 0; 830 827 } 831 828 ··· 1003 1000 return 0; 1004 1001 } 1005 1002 1003 + static int sd_set_jcomp(struct gspca_dev *gspca_dev, 1004 + struct v4l2_jpegcompression *jcomp) 1005 + { 1006 + struct sd *sd = (struct sd *) gspca_dev; 1007 + 1008 + if (jcomp->quality < QUALITY_MIN) 1009 + sd->quality = QUALITY_MIN; 1010 + else if (jcomp->quality > QUALITY_MAX) 1011 + sd->quality = QUALITY_MAX; 1012 + else 1013 + sd->quality = jcomp->quality; 1014 + if (gspca_dev->streaming) 1015 + jpeg_set_qual(sd->jpeg_hdr, sd->quality); 1016 + return 0; 1017 + } 1018 + 1019 + static int sd_get_jcomp(struct gspca_dev *gspca_dev, 1020 + struct v4l2_jpegcompression *jcomp) 1021 + { 1022 + struct sd *sd = (struct sd *) gspca_dev; 1023 + 1024 + memset(jcomp, 0, sizeof *jcomp); 1025 + jcomp->quality = sd->quality; 1026 + jcomp->jpeg_markers = V4L2_JPEG_MARKER_DHT 1027 + | V4L2_JPEG_MARKER_DQT; 1028 + return 0; 1029 + } 1030 + 1006 1031 /* sub-driver description */ 1007 1032 static struct sd_desc sd_desc = { 1008 1033 .name = MODULE_NAME, ··· 1041 1010 .start = sd_start, 1042 1011 .stop0 = sd_stop0, 1043 1012 .pkt_scan = sd_pkt_scan, 1013 + .get_jcomp = sd_get_jcomp, 1014 + .set_jcomp = sd_set_jcomp, 1044 1015 }; 1045 1016 1046 1017 /* -- module initialisation -- */
+34 -1
drivers/media/video/gspca/mars.c
··· 37 37 u8 gamma; 38 38 u8 sharpness; 39 39 u8 quality; 40 + #define QUALITY_MIN 40 41 + #define QUALITY_MAX 70 42 + #define QUALITY_DEF 50 40 43 41 44 u8 *jpeg_hdr; 42 45 }; ··· 181 178 sd->colors = COLOR_DEF; 182 179 sd->gamma = GAMMA_DEF; 183 180 sd->sharpness = SHARPNESS_DEF; 184 - sd->quality = 50; 181 + sd->quality = QUALITY_DEF; 185 182 gspca_dev->nbalt = 9; /* use the altsetting 08 */ 186 183 return 0; 187 184 } ··· 448 445 return 0; 449 446 } 450 447 448 + static int sd_set_jcomp(struct gspca_dev *gspca_dev, 449 + struct v4l2_jpegcompression *jcomp) 450 + { 451 + struct sd *sd = (struct sd *) gspca_dev; 452 + 453 + if (jcomp->quality < QUALITY_MIN) 454 + sd->quality = QUALITY_MIN; 455 + else if (jcomp->quality > QUALITY_MAX) 456 + sd->quality = QUALITY_MAX; 457 + else 458 + sd->quality = jcomp->quality; 459 + if (gspca_dev->streaming) 460 + jpeg_set_qual(sd->jpeg_hdr, sd->quality); 461 + return 0; 462 + } 463 + 464 + static int sd_get_jcomp(struct gspca_dev *gspca_dev, 465 + struct v4l2_jpegcompression *jcomp) 466 + { 467 + struct sd *sd = (struct sd *) gspca_dev; 468 + 469 + memset(jcomp, 0, sizeof *jcomp); 470 + jcomp->quality = sd->quality; 471 + jcomp->jpeg_markers = V4L2_JPEG_MARKER_DHT 472 + | V4L2_JPEG_MARKER_DQT; 473 + return 0; 474 + } 475 + 451 476 /* sub-driver description */ 452 477 static const struct sd_desc sd_desc = { 453 478 .name = MODULE_NAME, ··· 487 456 .stopN = sd_stopN, 488 457 .stop0 = sd_stop0, 489 458 .pkt_scan = sd_pkt_scan, 459 + .get_jcomp = sd_get_jcomp, 460 + .set_jcomp = sd_set_jcomp, 490 461 }; 491 462 492 463 /* -- module initialisation -- */
+34 -1
drivers/media/video/gspca/sonixj.c
··· 47 47 u8 vflip; /* ov7630/ov7648 only */ 48 48 u8 infrared; /* mt9v111 only */ 49 49 u8 quality; /* image quality */ 50 + #define QUALITY_MIN 60 51 + #define QUALITY_MAX 95 52 + #define QUALITY_DEF 80 50 53 u8 jpegqual; /* webcam quality */ 51 54 52 55 u8 reg18; ··· 1298 1295 else 1299 1296 sd->vflip = 1; 1300 1297 sd->infrared = INFRARED_DEF; 1301 - sd->quality = 80; 1298 + sd->quality = QUALITY_DEF; 1302 1299 sd->jpegqual = 80; 1303 1300 1304 1301 gspca_dev->ctrl_dis = ctrl_dis[sd->sensor]; ··· 2133 2130 return 0; 2134 2131 } 2135 2132 2133 + static int sd_set_jcomp(struct gspca_dev *gspca_dev, 2134 + struct v4l2_jpegcompression *jcomp) 2135 + { 2136 + struct sd *sd = (struct sd *) gspca_dev; 2137 + 2138 + if (jcomp->quality < QUALITY_MIN) 2139 + sd->quality = QUALITY_MIN; 2140 + else if (jcomp->quality > QUALITY_MAX) 2141 + sd->quality = QUALITY_MAX; 2142 + else 2143 + sd->quality = jcomp->quality; 2144 + if (gspca_dev->streaming) 2145 + jpeg_set_qual(sd->jpeg_hdr, sd->quality); 2146 + return 0; 2147 + } 2148 + 2149 + static int sd_get_jcomp(struct gspca_dev *gspca_dev, 2150 + struct v4l2_jpegcompression *jcomp) 2151 + { 2152 + struct sd *sd = (struct sd *) gspca_dev; 2153 + 2154 + memset(jcomp, 0, sizeof *jcomp); 2155 + jcomp->quality = sd->quality; 2156 + jcomp->jpeg_markers = V4L2_JPEG_MARKER_DHT 2157 + | V4L2_JPEG_MARKER_DQT; 2158 + return 0; 2159 + } 2160 + 2136 2161 /* sub-driver description */ 2137 2162 static const struct sd_desc sd_desc = { 2138 2163 .name = MODULE_NAME, ··· 2173 2142 .stop0 = sd_stop0, 2174 2143 .pkt_scan = sd_pkt_scan, 2175 2144 .dq_callback = do_autogain, 2145 + .get_jcomp = sd_get_jcomp, 2146 + .set_jcomp = sd_set_jcomp, 2176 2147 }; 2177 2148 2178 2149 /* -- module initialisation -- */
+34 -1
drivers/media/video/gspca/spca500.c
··· 39 39 unsigned char contrast; 40 40 unsigned char colors; 41 41 u8 quality; 42 + #define QUALITY_MIN 70 43 + #define QUALITY_MAX 95 44 + #define QUALITY_DEF 85 42 45 43 46 char subtype; 44 47 #define AgfaCl20 0 ··· 645 642 sd->brightness = BRIGHTNESS_DEF; 646 643 sd->contrast = CONTRAST_DEF; 647 644 sd->colors = COLOR_DEF; 648 - sd->quality = 85; 645 + sd->quality = QUALITY_DEF; 649 646 return 0; 650 647 } 651 648 ··· 1024 1021 return 0; 1025 1022 } 1026 1023 1024 + static int sd_set_jcomp(struct gspca_dev *gspca_dev, 1025 + struct v4l2_jpegcompression *jcomp) 1026 + { 1027 + struct sd *sd = (struct sd *) gspca_dev; 1028 + 1029 + if (jcomp->quality < QUALITY_MIN) 1030 + sd->quality = QUALITY_MIN; 1031 + else if (jcomp->quality > QUALITY_MAX) 1032 + sd->quality = QUALITY_MAX; 1033 + else 1034 + sd->quality = jcomp->quality; 1035 + if (gspca_dev->streaming) 1036 + jpeg_set_qual(sd->jpeg_hdr, sd->quality); 1037 + return 0; 1038 + } 1039 + 1040 + static int sd_get_jcomp(struct gspca_dev *gspca_dev, 1041 + struct v4l2_jpegcompression *jcomp) 1042 + { 1043 + struct sd *sd = (struct sd *) gspca_dev; 1044 + 1045 + memset(jcomp, 0, sizeof *jcomp); 1046 + jcomp->quality = sd->quality; 1047 + jcomp->jpeg_markers = V4L2_JPEG_MARKER_DHT 1048 + | V4L2_JPEG_MARKER_DQT; 1049 + return 0; 1050 + } 1051 + 1027 1052 /* sub-driver description */ 1028 1053 static struct sd_desc sd_desc = { 1029 1054 .name = MODULE_NAME, ··· 1063 1032 .stopN = sd_stopN, 1064 1033 .stop0 = sd_stop0, 1065 1034 .pkt_scan = sd_pkt_scan, 1035 + .get_jcomp = sd_get_jcomp, 1036 + .set_jcomp = sd_set_jcomp, 1066 1037 }; 1067 1038 1068 1039 /* -- module initialisation -- */
+34 -1
drivers/media/video/gspca/stk014.c
··· 36 36 unsigned char colors; 37 37 unsigned char lightfreq; 38 38 u8 quality; 39 + #define QUALITY_MIN 60 40 + #define QUALITY_MAX 95 41 + #define QUALITY_DEF 80 39 42 40 43 u8 *jpeg_hdr; 41 44 }; ··· 304 301 sd->contrast = CONTRAST_DEF; 305 302 sd->colors = COLOR_DEF; 306 303 sd->lightfreq = FREQ_DEF; 307 - sd->quality = 80; 304 + sd->quality = QUALITY_DEF; 308 305 return 0; 309 306 } 310 307 ··· 538 535 return -EINVAL; 539 536 } 540 537 538 + static int sd_set_jcomp(struct gspca_dev *gspca_dev, 539 + struct v4l2_jpegcompression *jcomp) 540 + { 541 + struct sd *sd = (struct sd *) gspca_dev; 542 + 543 + if (jcomp->quality < QUALITY_MIN) 544 + sd->quality = QUALITY_MIN; 545 + else if (jcomp->quality > QUALITY_MAX) 546 + sd->quality = QUALITY_MAX; 547 + else 548 + sd->quality = jcomp->quality; 549 + if (gspca_dev->streaming) 550 + jpeg_set_qual(sd->jpeg_hdr, sd->quality); 551 + return 0; 552 + } 553 + 554 + static int sd_get_jcomp(struct gspca_dev *gspca_dev, 555 + struct v4l2_jpegcompression *jcomp) 556 + { 557 + struct sd *sd = (struct sd *) gspca_dev; 558 + 559 + memset(jcomp, 0, sizeof *jcomp); 560 + jcomp->quality = sd->quality; 561 + jcomp->jpeg_markers = V4L2_JPEG_MARKER_DHT 562 + | V4L2_JPEG_MARKER_DQT; 563 + return 0; 564 + } 565 + 541 566 /* sub-driver description */ 542 567 static const struct sd_desc sd_desc = { 543 568 .name = MODULE_NAME, ··· 578 547 .stop0 = sd_stop0, 579 548 .pkt_scan = sd_pkt_scan, 580 549 .querymenu = sd_querymenu, 550 + .get_jcomp = sd_get_jcomp, 551 + .set_jcomp = sd_set_jcomp, 581 552 }; 582 553 583 554 /* -- module initialisation -- */
+34 -1
drivers/media/video/gspca/sunplus.c
··· 40 40 unsigned char colors; 41 41 unsigned char autogain; 42 42 u8 quality; 43 + #define QUALITY_MIN 70 44 + #define QUALITY_MAX 95 45 + #define QUALITY_DEF 85 43 46 44 47 char bridge; 45 48 #define BRIDGE_SPCA504 0 ··· 857 854 sd->brightness = sd_ctrls[SD_BRIGHTNESS].qctrl.default_value; 858 855 sd->contrast = sd_ctrls[SD_CONTRAST].qctrl.default_value; 859 856 sd->colors = sd_ctrls[SD_COLOR].qctrl.default_value; 860 - sd->quality = 85; 857 + sd->quality = QUALITY_DEF; 861 858 return 0; 862 859 } 863 860 ··· 1322 1319 return 0; 1323 1320 } 1324 1321 1322 + static int sd_set_jcomp(struct gspca_dev *gspca_dev, 1323 + struct v4l2_jpegcompression *jcomp) 1324 + { 1325 + struct sd *sd = (struct sd *) gspca_dev; 1326 + 1327 + if (jcomp->quality < QUALITY_MIN) 1328 + sd->quality = QUALITY_MIN; 1329 + else if (jcomp->quality > QUALITY_MAX) 1330 + sd->quality = QUALITY_MAX; 1331 + else 1332 + sd->quality = jcomp->quality; 1333 + if (gspca_dev->streaming) 1334 + jpeg_set_qual(sd->jpeg_hdr, sd->quality); 1335 + return 0; 1336 + } 1337 + 1338 + static int sd_get_jcomp(struct gspca_dev *gspca_dev, 1339 + struct v4l2_jpegcompression *jcomp) 1340 + { 1341 + struct sd *sd = (struct sd *) gspca_dev; 1342 + 1343 + memset(jcomp, 0, sizeof *jcomp); 1344 + jcomp->quality = sd->quality; 1345 + jcomp->jpeg_markers = V4L2_JPEG_MARKER_DHT 1346 + | V4L2_JPEG_MARKER_DQT; 1347 + return 0; 1348 + } 1349 + 1325 1350 /* sub-driver description */ 1326 1351 static const struct sd_desc sd_desc = { 1327 1352 .name = MODULE_NAME, ··· 1361 1330 .stopN = sd_stopN, 1362 1331 .stop0 = sd_stop0, 1363 1332 .pkt_scan = sd_pkt_scan, 1333 + .get_jcomp = sd_get_jcomp, 1334 + .set_jcomp = sd_set_jcomp, 1364 1335 }; 1365 1336 1366 1337 /* -- module initialisation -- */
+34 -1
drivers/media/video/gspca/zc3xx.c
··· 46 46 __u8 lightfreq; 47 47 __u8 sharpness; 48 48 u8 quality; /* image quality */ 49 + #define QUALITY_MIN 40 50 + #define QUALITY_MAX 60 51 + #define QUALITY_DEF 50 49 52 50 53 signed char sensor; /* Type of image sensor chip */ 51 54 /* !! values used in different tables */ ··· 7183 7180 sd->gamma = gamma[(int) sd->sensor]; 7184 7181 sd->autogain = sd_ctrls[SD_AUTOGAIN].qctrl.default_value; 7185 7182 sd->lightfreq = sd_ctrls[SD_FREQ].qctrl.default_value; 7186 - sd->quality = 50; 7183 + sd->quality = QUALITY_DEF; 7187 7184 7188 7185 switch (sd->sensor) { 7189 7186 case SENSOR_GC0305: ··· 7539 7536 return -EINVAL; 7540 7537 } 7541 7538 7539 + static int sd_set_jcomp(struct gspca_dev *gspca_dev, 7540 + struct v4l2_jpegcompression *jcomp) 7541 + { 7542 + struct sd *sd = (struct sd *) gspca_dev; 7543 + 7544 + if (jcomp->quality < QUALITY_MIN) 7545 + sd->quality = QUALITY_MIN; 7546 + else if (jcomp->quality > QUALITY_MAX) 7547 + sd->quality = QUALITY_MAX; 7548 + else 7549 + sd->quality = jcomp->quality; 7550 + if (gspca_dev->streaming) 7551 + jpeg_set_qual(sd->jpeg_hdr, sd->quality); 7552 + return 0; 7553 + } 7554 + 7555 + static int sd_get_jcomp(struct gspca_dev *gspca_dev, 7556 + struct v4l2_jpegcompression *jcomp) 7557 + { 7558 + struct sd *sd = (struct sd *) gspca_dev; 7559 + 7560 + memset(jcomp, 0, sizeof *jcomp); 7561 + jcomp->quality = sd->quality; 7562 + jcomp->jpeg_markers = V4L2_JPEG_MARKER_DHT 7563 + | V4L2_JPEG_MARKER_DQT; 7564 + return 0; 7565 + } 7566 + 7542 7567 static const struct sd_desc sd_desc = { 7543 7568 .name = MODULE_NAME, 7544 7569 .ctrls = sd_ctrls, ··· 7577 7546 .stop0 = sd_stop0, 7578 7547 .pkt_scan = sd_pkt_scan, 7579 7548 .querymenu = sd_querymenu, 7549 + .get_jcomp = sd_get_jcomp, 7550 + .set_jcomp = sd_set_jcomp, 7580 7551 }; 7581 7552 7582 7553 static const __devinitdata struct usb_device_id device_table[] = {