提交 71cb2764 编写于 作者: J Jean-Francois Moine 提交者: Mauro Carvalho Chehab

V4L/DVB (11039): gspca - most jpeg subdrivers: Change the JPEG header creation.

Signed-off-by: NJean-Francois Moine <moinejf@free.fr>
Signed-off-by: NMauro Carvalho Chehab <mchehab@redhat.com>
上级 c98afbfc
...@@ -157,3 +157,4 @@ ...@@ -157,3 +157,4 @@
156 -> IVCE-8784 [0000:f050,0001:f050,0002:f050,0003:f050] 156 -> IVCE-8784 [0000:f050,0001:f050,0002:f050,0003:f050]
157 -> Geovision GV-800(S) (master) [800a:763d] 157 -> Geovision GV-800(S) (master) [800a:763d]
158 -> Geovision GV-800(S) (slave) [800b:763d,800c:763d,800d:763d] 158 -> Geovision GV-800(S) (slave) [800b:763d,800c:763d,800d:763d]
159 -> ProVideo PV183 [1830:1540,1831:1540,1832:1540,1833:1540,1834:1540,1835:1540,1836:1540,1837:1540]
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
#include "gspca.h" #include "gspca.h"
#define CONEX_CAM 1 /* special JPEG header */ #define CONEX_CAM 1 /* special JPEG header */
#define QUANT_VAL 0 /* quantization table */
#include "jpeg.h" #include "jpeg.h"
MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>");
...@@ -37,6 +36,9 @@ struct sd { ...@@ -37,6 +36,9 @@ struct sd {
unsigned char brightness; unsigned char brightness;
unsigned char contrast; unsigned char contrast;
unsigned char colors; unsigned char colors;
u8 quality;
u8 *jpeg_hdr;
}; };
/* V4L2 controls supported by the driver */ /* V4L2 controls supported by the driver */
...@@ -820,6 +822,7 @@ static int sd_config(struct gspca_dev *gspca_dev, ...@@ -820,6 +822,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
sd->brightness = BRIGHTNESS_DEF; sd->brightness = BRIGHTNESS_DEF;
sd->contrast = CONTRAST_DEF; sd->contrast = CONTRAST_DEF;
sd->colors = COLOR_DEF; sd->colors = COLOR_DEF;
sd->quality = 40;
return 0; return 0;
} }
...@@ -836,6 +839,14 @@ static int sd_init(struct gspca_dev *gspca_dev) ...@@ -836,6 +839,14 @@ static int sd_init(struct gspca_dev *gspca_dev)
static int sd_start(struct gspca_dev *gspca_dev) static int sd_start(struct gspca_dev *gspca_dev)
{ {
struct sd *sd = (struct sd *) gspca_dev;
/* create the JPEG header */
sd->jpeg_hdr = kmalloc(JPEG_HDR_SZ, GFP_KERNEL);
jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
0x22); /* JPEG 411 */
jpeg_set_qual(sd->jpeg_hdr, sd->quality);
cx11646_initsize(gspca_dev); cx11646_initsize(gspca_dev);
cx11646_fw(gspca_dev); cx11646_fw(gspca_dev);
cx_sensor(gspca_dev); cx_sensor(gspca_dev);
...@@ -846,8 +857,11 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -846,8 +857,11 @@ static int sd_start(struct gspca_dev *gspca_dev)
/* called on streamoff with alt 0 and on disconnect */ /* called on streamoff with alt 0 and on disconnect */
static void sd_stop0(struct gspca_dev *gspca_dev) static void sd_stop0(struct gspca_dev *gspca_dev)
{ {
struct sd *sd = (struct sd *) gspca_dev;
int retry = 50; int retry = 50;
kfree(sd->jpeg_hdr);
if (!gspca_dev->present) if (!gspca_dev->present)
return; return;
reg_w_val(gspca_dev, 0x0000, 0x00); reg_w_val(gspca_dev, 0x0000, 0x00);
...@@ -873,6 +887,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -873,6 +887,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
__u8 *data, /* isoc packet */ __u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
struct sd *sd = (struct sd *) gspca_dev;
if (data[0] == 0xff && data[1] == 0xd8) { if (data[0] == 0xff && data[1] == 0xd8) {
/* start of frame */ /* start of frame */
...@@ -880,7 +896,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -880,7 +896,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
data, 0); data, 0);
/* put the JPEG header in the new frame */ /* put the JPEG header in the new frame */
jpeg_put_header(gspca_dev, frame, 0x22); gspca_frame_add(gspca_dev, FIRST_PACKET, frame,
sd->jpeg_hdr, JPEG_HDR_SZ);
data += 2; data += 2;
len -= 2; len -= 2;
} }
......
...@@ -27,42 +27,16 @@ ...@@ -27,42 +27,16 @@
/* /*
* generation options * generation options
* CONEX_CAM Conexant if present * CONEX_CAM Conexant if present
* QUANT_VAL quantization table (0..8)
*/ */
/* /* JPEG header */
* JPEG header:
* - start of jpeg frame
* - quantization table
* - huffman table
* - start of SOF0
*/
static const u8 jpeg_head[] = { static const u8 jpeg_head[] = {
0xff, 0xd8, /* jpeg */ 0xff, 0xd8, /* jpeg */
/* quantization table quality 50% */
0xff, 0xdb, 0x00, 0x84, /* DQT */ 0xff, 0xdb, 0x00, 0x84, /* DQT */
#if QUANT_VAL == 0
/* index 0 - Q40*/
0, /* quantization table part 1 */
0x14, 0x0e, 0x0f, 0x12, 0x0f, 0x0d, 0x14, 0x12,
0x10, 0x12, 0x17, 0x15, 0x14, 0x18, 0x1e, 0x32,
0x21, 0x1e, 0x1c, 0x1c, 0x1e, 0x3d, 0x2c, 0x2e,
0x24, 0x32, 0x49, 0x40, 0x4c, 0x4b, 0x47, 0x40,
0x46, 0x45, 0x50, 0x5a, 0x73, 0x62, 0x50, 0x55,
0x6d, 0x56, 0x45, 0x46, 0x64, 0x88, 0x65, 0x6d,
0x77, 0x7b, 0x81, 0x82, 0x81, 0x4e, 0x60, 0x8d,
0x97, 0x8c, 0x7d, 0x96, 0x73, 0x7e, 0x81, 0x7c,
1, /* quantization table part 2 */
0x15, 0x17, 0x17, 0x1e, 0x1a, 0x1e, 0x3b, 0x21,
0x21, 0x3b, 0x7c, 0x53, 0x46, 0x53, 0x7c, 0x0c,
0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c,
0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c,
0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c,
0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c,
0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c,
0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c,
#elif QUANT_VAL == 1
/* index 1 - Q50 */
0, 0,
#define JPEG_QT0_OFFSET 7
0x10, 0x0b, 0x0c, 0x0e, 0x0c, 0x0a, 0x10, 0x0e, 0x10, 0x0b, 0x0c, 0x0e, 0x0c, 0x0a, 0x10, 0x0e,
0x0d, 0x0e, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28, 0x0d, 0x0e, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28,
0x1a, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25, 0x1a, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25,
...@@ -72,6 +46,7 @@ static const u8 jpeg_head[] = { ...@@ -72,6 +46,7 @@ static const u8 jpeg_head[] = {
0x5f, 0x62, 0x67, 0x68, 0x67, 0x3e, 0x4d, 0x71, 0x5f, 0x62, 0x67, 0x68, 0x67, 0x3e, 0x4d, 0x71,
0x79, 0x70, 0x64, 0x78, 0x5c, 0x65, 0x67, 0x63, 0x79, 0x70, 0x64, 0x78, 0x5c, 0x65, 0x67, 0x63,
1, 1,
#define JPEG_QT1_OFFSET 72
0x11, 0x12, 0x12, 0x18, 0x15, 0x18, 0x2f, 0x1a, 0x11, 0x12, 0x12, 0x18, 0x15, 0x18, 0x2f, 0x1a,
0x1a, 0x2f, 0x63, 0x42, 0x38, 0x42, 0x63, 0x63, 0x1a, 0x2f, 0x63, 0x42, 0x38, 0x42, 0x63, 0x63,
0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
...@@ -80,149 +55,6 @@ static const u8 jpeg_head[] = { ...@@ -80,149 +55,6 @@ static const u8 jpeg_head[] = {
0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
#elif QUANT_VAL == 2
/* index 2 Q60 */
0,
0x0d, 0x09, 0x0a, 0x0b, 0x0a, 0x08, 0x0d, 0x0b,
0x0a, 0x0b, 0x0e, 0x0e, 0x0d, 0x0f, 0x13, 0x20,
0x15, 0x13, 0x12, 0x12, 0x13, 0x27, 0x1c, 0x1e,
0x17, 0x20, 0x2e, 0x29, 0x31, 0x30, 0x2e, 0x29,
0x2d, 0x2c, 0x33, 0x3a, 0x4a, 0x3e, 0x33, 0x36,
0x46, 0x37, 0x2c, 0x2d, 0x40, 0x57, 0x41, 0x46,
0x4c, 0x4e, 0x52, 0x53, 0x52, 0x32, 0x3e, 0x5a,
0x61, 0x5a, 0x50, 0x60, 0x4a, 0x51, 0x52, 0x4f,
1,
0x0e, 0x0e, 0x0e, 0x13, 0x11, 0x13, 0x26, 0x15,
0x15, 0x26, 0x4f, 0x35, 0x2d, 0x35, 0x4f, 0x4f,
0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
#elif QUANT_VAL == 3
/* index 3 - Q70 */
0,
0x0a, 0x07, 0x07, 0x08, 0x07, 0x06, 0x0a, 0x08,
0x08, 0x08, 0x0b, 0x0a, 0x0a, 0x0b, 0x0e, 0x18,
0x10, 0x0e, 0x0d, 0x0d, 0x0e, 0x1d, 0x15, 0x16,
0x11, 0x18, 0x23, 0x1f, 0x25, 0x24, 0x22, 0x1f,
0x22, 0x21, 0x26, 0x2b, 0x37, 0x2f, 0x26, 0x29,
0x34, 0x29, 0x21, 0x22, 0x30, 0x41, 0x31, 0x34,
0x39, 0x3b, 0x3e, 0x3e, 0x3e, 0x25, 0x2e, 0x44,
0x49, 0x43, 0x3c, 0x48, 0x37, 0x3d, 0x3e, 0x3b,
1,
0x0a, 0x0b, 0x0b, 0x0e, 0x0d, 0x0e, 0x1c, 0x10,
0x10, 0x1c, 0x3b, 0x28, 0x22, 0x28, 0x3b, 0x3b,
0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
#elif QUANT_VAL == 4
/* index 4 - Q80 */
0,
0x06, 0x04, 0x05, 0x06, 0x05, 0x04, 0x06, 0x06,
0x05, 0x06, 0x07, 0x07, 0x06, 0x08, 0x0a, 0x10,
0x0a, 0x0a, 0x09, 0x09, 0x0a, 0x14, 0x0e, 0x0f,
0x0c, 0x10, 0x17, 0x14, 0x18, 0x18, 0x17, 0x14,
0x16, 0x16, 0x1a, 0x1d, 0x25, 0x1f, 0x1a, 0x1b,
0x23, 0x1c, 0x16, 0x16, 0x20, 0x2c, 0x20, 0x23,
0x26, 0x27, 0x29, 0x2a, 0x29, 0x19, 0x1f, 0x2d,
0x30, 0x2d, 0x28, 0x30, 0x25, 0x28, 0x29, 0x28,
1,
0x07, 0x07, 0x07, 0x0a, 0x08, 0x0a, 0x13, 0x0a,
0x0a, 0x13, 0x28, 0x1a, 0x16, 0x1a, 0x28, 0x28,
0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
#elif QUANT_VAL == 5
/* index 5 - Q85 */
0,
0x05, 0x03, 0x04, 0x04, 0x04, 0x03, 0x05, 0x04,
0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x07, 0x0c,
0x08, 0x07, 0x07, 0x07, 0x07, 0x0f, 0x0b, 0x0b,
0x09, 0x0c, 0x11, 0x0f, 0x12, 0x12, 0x11, 0x0f,
0x11, 0x11, 0x13, 0x16, 0x1c, 0x17, 0x13, 0x14,
0x1a, 0x15, 0x11, 0x11, 0x18, 0x21, 0x18, 0x1a,
0x1d, 0x1d, 0x1f, 0x1f, 0x1f, 0x13, 0x17, 0x22,
0x24, 0x22, 0x1e, 0x24, 0x1c, 0x1e, 0x1f, 0x1e,
1,
0x05, 0x05, 0x05, 0x07, 0x06, 0x07, 0x0e, 0x08,
0x08, 0x0e, 0x1e, 0x14, 0x11, 0x14, 0x1e, 0x1e,
0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
#elif QUANT_VAL == 6
/* index 6 - 86 */
0,
0x04, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x04,
0x04, 0x04, 0x05, 0x05, 0x04, 0x05, 0x07, 0x0B,
0x07, 0x07, 0x06, 0x06, 0x07, 0x0e, 0x0a, 0x0a,
0x08, 0x0B, 0x10, 0x0e, 0x11, 0x11, 0x10, 0x0e,
0x10, 0x0f, 0x12, 0x14, 0x1a, 0x16, 0x12, 0x13,
0x18, 0x13, 0x0f, 0x10, 0x16, 0x1f, 0x17, 0x18,
0x1b, 0x1b, 0x1d, 0x1d, 0x1d, 0x11, 0x16, 0x20,
0x22, 0x1f, 0x1c, 0x22, 0x1a, 0x1c, 0x1d, 0x1c,
1,
0x05, 0x05, 0x05, 0x07, 0x06, 0x07, 0x0D, 0x07,
0x07, 0x0D, 0x1c, 0x12, 0x10, 0x12, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
#elif QUANT_VAL == 7
/* index 7 - 88 */
0,
0x04, 0x03, 0x03, 0x03, 0x03, 0x02, 0x04, 0x03,
0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x06, 0x0a,
0x06, 0x06, 0x05, 0x05, 0x06, 0x0C, 0x08, 0x09,
0x07, 0x0a, 0x0e, 0x0c, 0x0f, 0x0e, 0x0e, 0x0c,
0x0d, 0x0d, 0x0f, 0x11, 0x16, 0x13, 0x0f, 0x10,
0x15, 0x11, 0x0d, 0x0d, 0x13, 0x1a, 0x13, 0x15,
0x17, 0x18, 0x19, 0x19, 0x19, 0x0f, 0x12, 0x1b,
0x1d, 0x1b, 0x18, 0x1d, 0x16, 0x18, 0x19, 0x18,
1,
0x04, 0x04, 0x04, 0x06, 0x05, 0x06, 0x0B, 0x06,
0x06, 0x0B, 0x18, 0x10, 0x0d, 0x10, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
#elif QUANT_VAL == 8
/* index 8 - ?? */
0,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x05,
0x03, 0x03, 0x03, 0x03, 0x03, 0x06, 0x04, 0x05,
0x04, 0x05, 0x07, 0x06, 0x08, 0x08, 0x07, 0x06,
0x07, 0x07, 0x08, 0x09, 0x0c, 0x0a, 0x08, 0x09,
0x0B, 0x09, 0x07, 0x07, 0x0a, 0x0e, 0x0a, 0x0b,
0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x08, 0x0a, 0x0e,
0x0f, 0x0e, 0x0d, 0x0f, 0x0c, 0x0d, 0x0d, 0x0c,
1,
0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x06, 0x03,
0x03, 0x06, 0x0c, 0x08, 0x07, 0x08, 0x0c, 0x0c,
0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
#else
#error "Invalid quantization table"
#endif
/* huffman table */ /* huffman table */
0xff, 0xc4, 0x01, 0xa2, 0xff, 0xc4, 0x01, 0xa2,
...@@ -280,55 +112,57 @@ static const u8 jpeg_head[] = { ...@@ -280,55 +112,57 @@ static const u8 jpeg_head[] = {
0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa,
#ifdef CONEX_CAM #ifdef CONEX_CAM
/* the Conexant frames start with SOF0 */ /* the Conexant frames start with SOF0 */
#define JPEG_HDR_SZ 556
#else #else
0xff, 0xc0, 0x00, 0x11, /* SOF0 (start of frame 0 */ 0xff, 0xc0, 0x00, 0x11, /* SOF0 (start of frame 0 */
0x08, /* data precision */ 0x08, /* data precision */
#endif #define JPEG_HEIGHT_OFFSET 561
}; 0x01, 0xe0, /* height */
0x02, 0x80, /* width */
#ifndef CONEX_CAM 0x03, /* component number */
/* variable part: 0x01,
* 0x01, 0xe0, height 0x21, /* samples Y */
* 0x02, 0x80, width
* 0x03, component number
* 0x01,
* 0x21, samples Y
*/
/* end of header */
static u8 eoh[] = {
0x00, /* quant Y */ 0x00, /* quant Y */
0x02, 0x11, 0x01, /* samples CbCr - quant CbCr */ 0x02, 0x11, 0x01, /* samples CbCr - quant CbCr */
0x03, 0x11, 0x01, 0x03, 0x11, 0x01,
0xff, 0xda, 0x00, 0x0c, /* SOS (start of scan) */ 0xff, 0xda, 0x00, 0x0c, /* SOS (start of scan) */
0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00
}; #define JPEG_HDR_SZ 589
#endif #endif
};
/* -- output the JPEG header -- */ /* define the JPEG header */
static void jpeg_put_header(struct gspca_dev *gspca_dev, static void jpeg_define(u8 *jpeg_hdr,
struct gspca_frame *frame, int height,
int samplesY) int width,
int samplesY)
{ {
memcpy(jpeg_hdr, jpeg_head, sizeof jpeg_head);
#ifndef CONEX_CAM #ifndef CONEX_CAM
u8 tmpbuf[8]; jpeg_hdr[JPEG_HEIGHT_OFFSET + 0] = height >> 8;
jpeg_hdr[JPEG_HEIGHT_OFFSET + 1] = height & 0xff;
jpeg_hdr[JPEG_HEIGHT_OFFSET + 2] = width >> 8;
jpeg_hdr[JPEG_HEIGHT_OFFSET + 3] = width & 0xff;
jpeg_hdr[JPEG_HEIGHT_OFFSET + 6] = samplesY;
#endif #endif
}
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, /* set the JPEG quality */
jpeg_head, sizeof jpeg_head); static void jpeg_set_qual(u8 *jpeg_hdr,
#ifndef CONEX_CAM int quality)
tmpbuf[0] = gspca_dev->height >> 8; {
tmpbuf[1] = gspca_dev->height & 0xff; int i, sc;
tmpbuf[2] = gspca_dev->width >> 8;
tmpbuf[3] = gspca_dev->width & 0xff; if (quality < 50)
tmpbuf[4] = 0x03; /* component number */ sc = 5000 / quality;
tmpbuf[5] = 0x01; /* first component */ else
tmpbuf[6] = samplesY; sc = 200 - quality * 2;
gspca_frame_add(gspca_dev, INTER_PACKET, frame, for (i = 0; i < 64; i++) {
tmpbuf, 7); jpeg_hdr[JPEG_QT0_OFFSET + i] =
gspca_frame_add(gspca_dev, INTER_PACKET, frame, (jpeg_head[JPEG_QT0_OFFSET + i] * sc + 50) / 100;
eoh, sizeof eoh); jpeg_hdr[JPEG_QT1_OFFSET + i] =
#endif (jpeg_head[JPEG_QT1_OFFSET + i] * sc + 50) / 100;
}
} }
#endif #endif
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
#define MODULE_NAME "mars" #define MODULE_NAME "mars"
#include "gspca.h" #include "gspca.h"
#define QUANT_VAL 1 /* quantization table */
#include "jpeg.h" #include "jpeg.h"
MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>");
...@@ -37,6 +36,9 @@ struct sd { ...@@ -37,6 +36,9 @@ struct sd {
u8 colors; u8 colors;
u8 gamma; u8 gamma;
u8 sharpness; u8 sharpness;
u8 quality;
u8 *jpeg_hdr;
}; };
/* V4L2 controls supported by the driver */ /* V4L2 controls supported by the driver */
...@@ -176,6 +178,7 @@ static int sd_config(struct gspca_dev *gspca_dev, ...@@ -176,6 +178,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
sd->colors = COLOR_DEF; sd->colors = COLOR_DEF;
sd->gamma = GAMMA_DEF; sd->gamma = GAMMA_DEF;
sd->sharpness = SHARPNESS_DEF; sd->sharpness = SHARPNESS_DEF;
sd->quality = 50;
gspca_dev->nbalt = 9; /* use the altsetting 08 */ gspca_dev->nbalt = 9; /* use the altsetting 08 */
return 0; return 0;
} }
...@@ -193,6 +196,12 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -193,6 +196,12 @@ static int sd_start(struct gspca_dev *gspca_dev)
u8 *data; u8 *data;
int i; int i;
/* create the JPEG header */
sd->jpeg_hdr = kmalloc(JPEG_HDR_SZ, GFP_KERNEL);
jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
0x21); /* JPEG 422 */
jpeg_set_qual(sd->jpeg_hdr, sd->quality);
data = gspca_dev->usb_buf; data = gspca_dev->usb_buf;
data[0] = 0x01; /* address */ data[0] = 0x01; /* address */
...@@ -303,11 +312,19 @@ static void sd_stopN(struct gspca_dev *gspca_dev) ...@@ -303,11 +312,19 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
PDEBUG(D_ERR, "Camera Stop failed"); PDEBUG(D_ERR, "Camera Stop failed");
} }
static void sd_stop0(struct gspca_dev *gspca_dev)
{
struct sd *sd = (struct sd *) gspca_dev;
kfree(sd->jpeg_hdr);
}
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ struct gspca_frame *frame, /* target */
__u8 *data, /* isoc packet */ __u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
struct sd *sd = (struct sd *) gspca_dev;
int p; int p;
if (len < 6) { if (len < 6) {
...@@ -330,7 +347,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -330,7 +347,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
frame, data, p); frame, data, p);
/* put the JPEG header */ /* put the JPEG header */
jpeg_put_header(gspca_dev, frame, 0x21); gspca_frame_add(gspca_dev, FIRST_PACKET, frame,
sd->jpeg_hdr, JPEG_HDR_SZ);
data += p + 16; data += p + 16;
len -= p + 16; len -= p + 16;
break; break;
...@@ -436,6 +454,7 @@ static const struct sd_desc sd_desc = { ...@@ -436,6 +454,7 @@ static const struct sd_desc sd_desc = {
.init = sd_init, .init = sd_init,
.start = sd_start, .start = sd_start,
.stopN = sd_stopN, .stopN = sd_stopN,
.stop0 = sd_stop0,
.pkt_scan = sd_pkt_scan, .pkt_scan = sd_pkt_scan,
}; };
......
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
#define MODULE_NAME "sonixj" #define MODULE_NAME "sonixj"
#include "gspca.h" #include "gspca.h"
#define QUANT_VAL 4 /* quantization table */
#include "jpeg.h" #include "jpeg.h"
#define V4L2_CID_INFRARED (V4L2_CID_PRIVATE_BASE + 0) #define V4L2_CID_INFRARED (V4L2_CID_PRIVATE_BASE + 0)
...@@ -47,6 +46,10 @@ struct sd { ...@@ -47,6 +46,10 @@ struct sd {
u8 gamma; u8 gamma;
u8 vflip; /* ov7630/ov7648 only */ u8 vflip; /* ov7630/ov7648 only */
u8 infrared; /* mt9v111 only */ u8 infrared; /* mt9v111 only */
u8 quality; /* image quality */
u8 jpegqual; /* webcam quality */
u8 reg18;
s8 ag_cnt; s8 ag_cnt;
#define AG_CNT_START 13 #define AG_CNT_START 13
...@@ -68,6 +71,8 @@ struct sd { ...@@ -68,6 +71,8 @@ struct sd {
#define SENSOR_OV7660 7 #define SENSOR_OV7660 7
#define SENSOR_SP80708 8 #define SENSOR_SP80708 8
u8 i2c_base; u8 i2c_base;
u8 *jpeg_hdr;
}; };
/* V4L2 controls supported by the driver */ /* V4L2 controls supported by the driver */
...@@ -859,25 +864,6 @@ static const u8 sp80708_sensor_init[][8] = { ...@@ -859,25 +864,6 @@ static const u8 sp80708_sensor_init[][8] = {
{} {}
}; };
static const u8 qtable4[] = {
0x06, 0x04, 0x04, 0x06, 0x04, 0x04, 0x06, 0x06,
0x06, 0x06, 0x08, 0x06, 0x06, 0x08, 0x0a, 0x11,
0x0a, 0x0a, 0x08, 0x08, 0x0a, 0x15, 0x0f, 0x0f,
0x0c, 0x11, 0x19, 0x15, 0x19, 0x19, 0x17, 0x15,
0x17, 0x17, 0x1b, 0x1d, 0x25, 0x21, 0x1b, 0x1d,
0x23, 0x1d, 0x17, 0x17, 0x21, 0x2e, 0x21, 0x23,
0x27, 0x29, 0x2c, 0x2c, 0x2c, 0x19, 0x1f, 0x30,
0x32, 0x2e, 0x29, 0x32, 0x25, 0x29, 0x2c, 0x29,
0x06, 0x08, 0x08, 0x0a, 0x08, 0x0a, 0x13, 0x0a,
0x0a, 0x13, 0x29, 0x1b, 0x17, 0x1b, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29
};
/* read <len> bytes to gspca_dev->usb_buf */ /* read <len> bytes to gspca_dev->usb_buf */
static void reg_r(struct gspca_dev *gspca_dev, static void reg_r(struct gspca_dev *gspca_dev,
u16 value, int len) u16 value, int len)
...@@ -1309,6 +1295,8 @@ static int sd_config(struct gspca_dev *gspca_dev, ...@@ -1309,6 +1295,8 @@ static int sd_config(struct gspca_dev *gspca_dev,
else else
sd->vflip = 1; sd->vflip = 1;
sd->infrared = INFRARED_DEF; sd->infrared = INFRARED_DEF;
sd->quality = 80;
sd->jpegqual = 80;
gspca_dev->ctrl_dis = ctrl_dis[sd->sensor]; gspca_dev->ctrl_dis = ctrl_dis[sd->sensor];
return 0; return 0;
...@@ -1610,12 +1598,49 @@ static void setinfrared(struct sd *sd) ...@@ -1610,12 +1598,49 @@ static void setinfrared(struct sd *sd)
sd->infrared ? 0x66 : 0x64); sd->infrared ? 0x66 : 0x64);
} }
static void setjpegqual(struct gspca_dev *gspca_dev)
{
struct sd *sd = (struct sd *) gspca_dev;
int i, sc;
if (sd->jpegqual < 50)
sc = 5000 / sd->jpegqual;
else
sc = 200 - sd->jpegqual * 2;
#if USB_BUF_SZ < 64
#error "No room enough in usb_buf for quantization table"
#endif
for (i = 0; i < 64; i++)
gspca_dev->usb_buf[i] =
(jpeg_head[JPEG_QT0_OFFSET + i] * sc + 50) / 100;
usb_control_msg(gspca_dev->dev,
usb_sndctrlpipe(gspca_dev->dev, 0),
0x08,
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
0x0100, 0,
gspca_dev->usb_buf, 64,
500);
for (i = 0; i < 64; i++)
gspca_dev->usb_buf[i] =
(jpeg_head[JPEG_QT1_OFFSET + i] * sc + 50) / 100;
usb_control_msg(gspca_dev->dev,
usb_sndctrlpipe(gspca_dev->dev, 0),
0x08,
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
0x0140, 0,
gspca_dev->usb_buf, 64,
500);
sd->reg18 ^= 0x40;
reg_w1(gspca_dev, 0x18, sd->reg18);
}
/* -- start the camera -- */ /* -- start the camera -- */
static int sd_start(struct gspca_dev *gspca_dev) static int sd_start(struct gspca_dev *gspca_dev)
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
int i; int i;
u8 reg1, reg17, reg18; u8 reg1, reg17;
const u8 *sn9c1xx; const u8 *sn9c1xx;
int mode; int mode;
static const u8 C0[] = { 0x2d, 0x2d, 0x3a, 0x05, 0x04, 0x3f }; static const u8 C0[] = { 0x2d, 0x2d, 0x3a, 0x05, 0x04, 0x3f };
...@@ -1624,6 +1649,12 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -1624,6 +1649,12 @@ static int sd_start(struct gspca_dev *gspca_dev)
static const u8 CE_ov76xx[] = static const u8 CE_ov76xx[] =
{ 0x32, 0xdd, 0x32, 0xdd }; { 0x32, 0xdd, 0x32, 0xdd };
/* create the JPEG header */
sd->jpeg_hdr = kmalloc(JPEG_HDR_SZ, GFP_KERNEL);
jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
0x21); /* JPEG 422 */
jpeg_set_qual(sd->jpeg_hdr, sd->quality);
sn9c1xx = sn_tb[(int) sd->sensor]; sn9c1xx = sn_tb[(int) sd->sensor];
configure_gpio(gspca_dev, sn9c1xx); configure_gpio(gspca_dev, sn9c1xx);
...@@ -1782,13 +1813,9 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -1782,13 +1813,9 @@ static int sd_start(struct gspca_dev *gspca_dev)
} }
/* here change size mode 0 -> VGA; 1 -> CIF */ /* here change size mode 0 -> VGA; 1 -> CIF */
reg18 = sn9c1xx[0x18] | (mode << 4); sd->reg18 = sn9c1xx[0x18] | (mode << 4) | 0x40;
reg_w1(gspca_dev, 0x18, reg18 | 0x40); reg_w1(gspca_dev, 0x18, sd->reg18);
setjpegqual(gspca_dev);
reg_w(gspca_dev, 0x0100, qtable4, 0x40);
reg_w(gspca_dev, 0x0140, qtable4 + 0x40, 0x40);
reg_w1(gspca_dev, 0x18, reg18);
reg_w1(gspca_dev, 0x17, reg17); reg_w1(gspca_dev, 0x17, reg17);
reg_w1(gspca_dev, 0x01, reg1); reg_w1(gspca_dev, 0x01, reg1);
...@@ -1845,6 +1872,13 @@ static void sd_stopN(struct gspca_dev *gspca_dev) ...@@ -1845,6 +1872,13 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
reg_w1(gspca_dev, 0xf1, 0x00); reg_w1(gspca_dev, 0xf1, 0x00);
} }
static void sd_stop0(struct gspca_dev *gspca_dev)
{
struct sd *sd = (struct sd *) gspca_dev;
kfree(sd->jpeg_hdr);
}
static void do_autogain(struct gspca_dev *gspca_dev) static void do_autogain(struct gspca_dev *gspca_dev)
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -1928,7 +1962,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -1928,7 +1962,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
if (gspca_dev->last_packet_type == LAST_PACKET) { if (gspca_dev->last_packet_type == LAST_PACKET) {
/* put the JPEG 422 header */ /* put the JPEG 422 header */
jpeg_put_header(gspca_dev, frame, 0x21); gspca_frame_add(gspca_dev, FIRST_PACKET, frame,
sd->jpeg_hdr, JPEG_HDR_SZ);
} }
gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len); gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len);
} }
...@@ -2104,6 +2139,7 @@ static const struct sd_desc sd_desc = { ...@@ -2104,6 +2139,7 @@ static const struct sd_desc sd_desc = {
.init = sd_init, .init = sd_init,
.start = sd_start, .start = sd_start,
.stopN = sd_stopN, .stopN = sd_stopN,
.stop0 = sd_stop0,
.pkt_scan = sd_pkt_scan, .pkt_scan = sd_pkt_scan,
.dq_callback = do_autogain, .dq_callback = do_autogain,
}; };
......
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
#define MODULE_NAME "spca500" #define MODULE_NAME "spca500"
#include "gspca.h" #include "gspca.h"
#define QUANT_VAL 5 /* quantization table */
#include "jpeg.h" #include "jpeg.h"
MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>");
...@@ -39,6 +38,7 @@ struct sd { ...@@ -39,6 +38,7 @@ struct sd {
unsigned char brightness; unsigned char brightness;
unsigned char contrast; unsigned char contrast;
unsigned char colors; unsigned char colors;
u8 quality;
char subtype; char subtype;
#define AgfaCl20 0 #define AgfaCl20 0
...@@ -56,6 +56,8 @@ struct sd { ...@@ -56,6 +56,8 @@ struct sd {
#define Optimedia 12 #define Optimedia 12
#define PalmPixDC85 13 #define PalmPixDC85 13
#define ToptroIndus 14 #define ToptroIndus 14
u8 *jpeg_hdr;
}; };
/* V4L2 controls supported by the driver */ /* V4L2 controls supported by the driver */
...@@ -640,6 +642,7 @@ static int sd_config(struct gspca_dev *gspca_dev, ...@@ -640,6 +642,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
sd->brightness = BRIGHTNESS_DEF; sd->brightness = BRIGHTNESS_DEF;
sd->contrast = CONTRAST_DEF; sd->contrast = CONTRAST_DEF;
sd->colors = COLOR_DEF; sd->colors = COLOR_DEF;
sd->quality = 85;
return 0; return 0;
} }
...@@ -665,6 +668,12 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -665,6 +668,12 @@ static int sd_start(struct gspca_dev *gspca_dev)
__u8 Data; __u8 Data;
__u8 xmult, ymult; __u8 xmult, ymult;
/* create the JPEG header */
sd->jpeg_hdr = kmalloc(JPEG_HDR_SZ, GFP_KERNEL);
jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
0x22); /* JPEG 411 */
jpeg_set_qual(sd->jpeg_hdr, sd->quality);
if (sd->subtype == LogitechClickSmart310) { if (sd->subtype == LogitechClickSmart310) {
xmult = 0x16; xmult = 0x16;
ymult = 0x12; ymult = 0x12;
...@@ -880,6 +889,13 @@ static void sd_stopN(struct gspca_dev *gspca_dev) ...@@ -880,6 +889,13 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
gspca_dev->usb_buf[0]); gspca_dev->usb_buf[0]);
} }
static void sd_stop0(struct gspca_dev *gspca_dev)
{
struct sd *sd = (struct sd *) gspca_dev;
kfree(sd->jpeg_hdr);
}
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ struct gspca_frame *frame, /* target */
__u8 *data, /* isoc packet */ __u8 *data, /* isoc packet */
...@@ -900,7 +916,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -900,7 +916,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
ffd9, 2); ffd9, 2);
/* put the JPEG header in the new frame */ /* put the JPEG header in the new frame */
jpeg_put_header(gspca_dev, frame, 0x22); gspca_frame_add(gspca_dev, FIRST_PACKET, frame,
sd->jpeg_hdr, JPEG_HDR_SZ);
data += SPCA500_OFFSET_DATA; data += SPCA500_OFFSET_DATA;
len -= SPCA500_OFFSET_DATA; len -= SPCA500_OFFSET_DATA;
...@@ -1013,6 +1030,7 @@ static struct sd_desc sd_desc = { ...@@ -1013,6 +1030,7 @@ static struct sd_desc sd_desc = {
.init = sd_init, .init = sd_init,
.start = sd_start, .start = sd_start,
.stopN = sd_stopN, .stopN = sd_stopN,
.stop0 = sd_stop0,
.pkt_scan = sd_pkt_scan, .pkt_scan = sd_pkt_scan,
}; };
......
...@@ -21,8 +21,6 @@ ...@@ -21,8 +21,6 @@
#define MODULE_NAME "stk014" #define MODULE_NAME "stk014"
#include "gspca.h" #include "gspca.h"
#define QUANT_VAL 7 /* quantization table */
/* <= 4 KO - 7: good (enough!) */
#include "jpeg.h" #include "jpeg.h"
MODULE_AUTHOR("Jean-Francois Moine <http://moinejf.free.fr>"); MODULE_AUTHOR("Jean-Francois Moine <http://moinejf.free.fr>");
...@@ -37,6 +35,9 @@ struct sd { ...@@ -37,6 +35,9 @@ struct sd {
unsigned char contrast; unsigned char contrast;
unsigned char colors; unsigned char colors;
unsigned char lightfreq; unsigned char lightfreq;
u8 quality;
u8 *jpeg_hdr;
}; };
/* V4L2 controls supported by the driver */ /* V4L2 controls supported by the driver */
...@@ -300,6 +301,7 @@ static int sd_config(struct gspca_dev *gspca_dev, ...@@ -300,6 +301,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
sd->contrast = CONTRAST_DEF; sd->contrast = CONTRAST_DEF;
sd->colors = COLOR_DEF; sd->colors = COLOR_DEF;
sd->lightfreq = FREQ_DEF; sd->lightfreq = FREQ_DEF;
sd->quality = 80;
return 0; return 0;
} }
...@@ -323,8 +325,15 @@ static int sd_init(struct gspca_dev *gspca_dev) ...@@ -323,8 +325,15 @@ static int sd_init(struct gspca_dev *gspca_dev)
/* -- start the camera -- */ /* -- start the camera -- */
static int sd_start(struct gspca_dev *gspca_dev) static int sd_start(struct gspca_dev *gspca_dev)
{ {
struct sd *sd = (struct sd *) gspca_dev;
int ret, value; int ret, value;
/* create the JPEG header */
sd->jpeg_hdr = kmalloc(JPEG_HDR_SZ, GFP_KERNEL);
jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
0x22); /* JPEG 411 */
jpeg_set_qual(sd->jpeg_hdr, sd->quality);
/* work on alternate 1 */ /* work on alternate 1 */
usb_set_interface(gspca_dev->dev, gspca_dev->iface, 1); usb_set_interface(gspca_dev->dev, gspca_dev->iface, 1);
...@@ -396,11 +405,19 @@ static void sd_stopN(struct gspca_dev *gspca_dev) ...@@ -396,11 +405,19 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
PDEBUG(D_STREAM, "camera stopped"); PDEBUG(D_STREAM, "camera stopped");
} }
static void sd_stop0(struct gspca_dev *gspca_dev)
{
struct sd *sd = (struct sd *) gspca_dev;
kfree(sd->jpeg_hdr);
}
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ struct gspca_frame *frame, /* target */
__u8 *data, /* isoc packet */ __u8 *data, /* isoc packet */
int len) /* iso packet length */ int len) /* iso packet length */
{ {
struct sd *sd = (struct sd *) gspca_dev;
static unsigned char ffd9[] = {0xff, 0xd9}; static unsigned char ffd9[] = {0xff, 0xd9};
/* a frame starts with: /* a frame starts with:
...@@ -417,7 +434,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -417,7 +434,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
ffd9, 2); ffd9, 2);
/* put the JPEG 411 header */ /* put the JPEG 411 header */
jpeg_put_header(gspca_dev, frame, 0x22); gspca_frame_add(gspca_dev, FIRST_PACKET, frame,
sd->jpeg_hdr, JPEG_HDR_SZ);
/* beginning of the frame */ /* beginning of the frame */
#define STKHDRSZ 12 #define STKHDRSZ 12
...@@ -526,6 +544,7 @@ static const struct sd_desc sd_desc = { ...@@ -526,6 +544,7 @@ static const struct sd_desc sd_desc = {
.init = sd_init, .init = sd_init,
.start = sd_start, .start = sd_start,
.stopN = sd_stopN, .stopN = sd_stopN,
.stop0 = sd_stop0,
.pkt_scan = sd_pkt_scan, .pkt_scan = sd_pkt_scan,
.querymenu = sd_querymenu, .querymenu = sd_querymenu,
}; };
......
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
#define MODULE_NAME "sunplus" #define MODULE_NAME "sunplus"
#include "gspca.h" #include "gspca.h"
#define QUANT_VAL 5 /* quantization table */
#include "jpeg.h" #include "jpeg.h"
MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>");
...@@ -40,6 +39,7 @@ struct sd { ...@@ -40,6 +39,7 @@ struct sd {
unsigned char contrast; unsigned char contrast;
unsigned char colors; unsigned char colors;
unsigned char autogain; unsigned char autogain;
u8 quality;
char bridge; char bridge;
#define BRIDGE_SPCA504 0 #define BRIDGE_SPCA504 0
...@@ -52,6 +52,8 @@ struct sd { ...@@ -52,6 +52,8 @@ struct sd {
#define LogitechClickSmart420 2 #define LogitechClickSmart420 2
#define LogitechClickSmart820 3 #define LogitechClickSmart820 3
#define MegapixV4 4 #define MegapixV4 4
u8 *jpeg_hdr;
}; };
/* V4L2 controls supported by the driver */ /* V4L2 controls supported by the driver */
...@@ -852,6 +854,7 @@ static int sd_config(struct gspca_dev *gspca_dev, ...@@ -852,6 +854,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
sd->brightness = sd_ctrls[SD_BRIGHTNESS].qctrl.default_value; sd->brightness = sd_ctrls[SD_BRIGHTNESS].qctrl.default_value;
sd->contrast = sd_ctrls[SD_CONTRAST].qctrl.default_value; sd->contrast = sd_ctrls[SD_CONTRAST].qctrl.default_value;
sd->colors = sd_ctrls[SD_COLOR].qctrl.default_value; sd->colors = sd_ctrls[SD_COLOR].qctrl.default_value;
sd->quality = 85;
return 0; return 0;
} }
...@@ -968,6 +971,12 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -968,6 +971,12 @@ static int sd_start(struct gspca_dev *gspca_dev)
__u8 i; __u8 i;
__u8 info[6]; __u8 info[6];
/* create the JPEG header */
sd->jpeg_hdr = kmalloc(JPEG_HDR_SZ, GFP_KERNEL);
jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
0x22); /* JPEG 411 */
jpeg_set_qual(sd->jpeg_hdr, sd->quality);
if (sd->bridge == BRIDGE_SPCA504B) if (sd->bridge == BRIDGE_SPCA504B)
spca504B_setQtable(gspca_dev); spca504B_setQtable(gspca_dev);
spca504B_SetSizeType(gspca_dev); spca504B_SetSizeType(gspca_dev);
...@@ -1077,6 +1086,13 @@ static void sd_stopN(struct gspca_dev *gspca_dev) ...@@ -1077,6 +1086,13 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
} }
} }
static void sd_stop0(struct gspca_dev *gspca_dev)
{
struct sd *sd = (struct sd *) gspca_dev;
kfree(sd->jpeg_hdr);
}
static void sd_pkt_scan(struct gspca_dev *gspca_dev, static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, /* target */ struct gspca_frame *frame, /* target */
__u8 *data, /* isoc packet */ __u8 *data, /* isoc packet */
...@@ -1153,7 +1169,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -1153,7 +1169,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
ffd9, 2); ffd9, 2);
/* put the JPEG header in the new frame */ /* put the JPEG header in the new frame */
jpeg_put_header(gspca_dev, frame, 0x22); gspca_frame_add(gspca_dev, FIRST_PACKET, frame,
sd->jpeg_hdr, JPEG_HDR_SZ);
} }
/* add 0x00 after 0xff */ /* add 0x00 after 0xff */
...@@ -1311,6 +1328,7 @@ static const struct sd_desc sd_desc = { ...@@ -1311,6 +1328,7 @@ static const struct sd_desc sd_desc = {
.init = sd_init, .init = sd_init,
.start = sd_start, .start = sd_start,
.stopN = sd_stopN, .stopN = sd_stopN,
.stop0 = sd_stop0,
.pkt_scan = sd_pkt_scan, .pkt_scan = sd_pkt_scan,
}; };
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#define MODULE_NAME "zc3xx" #define MODULE_NAME "zc3xx"
#include "gspca.h" #include "gspca.h"
#include "jpeg.h"
MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>, " MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>, "
"Serge A. Suchkov <Serge.A.S@tochka.ru>"); "Serge A. Suchkov <Serge.A.S@tochka.ru>");
...@@ -32,7 +33,6 @@ MODULE_LICENSE("GPL"); ...@@ -32,7 +33,6 @@ MODULE_LICENSE("GPL");
static int force_sensor = -1; static int force_sensor = -1;
#define QUANT_VAL 1 /* quantization table */ #define QUANT_VAL 1 /* quantization table */
#include "jpeg.h"
#include "zc3xx-reg.h" #include "zc3xx-reg.h"
/* specific webcam descriptor */ /* specific webcam descriptor */
...@@ -45,6 +45,7 @@ struct sd { ...@@ -45,6 +45,7 @@ struct sd {
__u8 autogain; __u8 autogain;
__u8 lightfreq; __u8 lightfreq;
__u8 sharpness; __u8 sharpness;
u8 quality; /* image quality */
signed char sensor; /* Type of image sensor chip */ signed char sensor; /* Type of image sensor chip */
/* !! values used in different tables */ /* !! values used in different tables */
...@@ -69,6 +70,8 @@ struct sd { ...@@ -69,6 +70,8 @@ struct sd {
#define SENSOR_TAS5130C_VF0250 17 #define SENSOR_TAS5130C_VF0250 17
#define SENSOR_MAX 18 #define SENSOR_MAX 18
unsigned short chip_revision; unsigned short chip_revision;
u8 *jpeg_hdr;
}; };
/* V4L2 controls supported by the driver */ /* V4L2 controls supported by the driver */
...@@ -7177,6 +7180,7 @@ static int sd_config(struct gspca_dev *gspca_dev, ...@@ -7177,6 +7180,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
sd->gamma = gamma[(int) sd->sensor]; sd->gamma = gamma[(int) sd->sensor];
sd->autogain = sd_ctrls[SD_AUTOGAIN].qctrl.default_value; sd->autogain = sd_ctrls[SD_AUTOGAIN].qctrl.default_value;
sd->lightfreq = sd_ctrls[SD_FREQ].qctrl.default_value; sd->lightfreq = sd_ctrls[SD_FREQ].qctrl.default_value;
sd->quality = 50;
switch (sd->sensor) { switch (sd->sensor) {
case SENSOR_GC0305: case SENSOR_GC0305:
...@@ -7232,6 +7236,12 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -7232,6 +7236,12 @@ static int sd_start(struct gspca_dev *gspca_dev)
/* 17 */ /* 17 */
}; };
/* create the JPEG header */
sd->jpeg_hdr = kmalloc(JPEG_HDR_SZ, GFP_KERNEL);
jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
0x21); /* JPEG 422 */
jpeg_set_qual(sd->jpeg_hdr, sd->quality);
mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv; mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
zc3_init = init_tb[(int) sd->sensor][mode]; zc3_init = init_tb[(int) sd->sensor][mode];
switch (sd->sensor) { switch (sd->sensor) {
...@@ -7365,6 +7375,7 @@ static void sd_stop0(struct gspca_dev *gspca_dev) ...@@ -7365,6 +7375,7 @@ static void sd_stop0(struct gspca_dev *gspca_dev)
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
kfree(sd->jpeg_hdr);
if (!gspca_dev->present) if (!gspca_dev->present)
return; return;
send_unknown(gspca_dev->dev, sd->sensor); send_unknown(gspca_dev->dev, sd->sensor);
...@@ -7375,12 +7386,15 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -7375,12 +7386,15 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
__u8 *data, __u8 *data,
int len) int len)
{ {
struct sd *sd = (struct sd *) gspca_dev;
if (data[0] == 0xff && data[1] == 0xd8) { /* start of frame */ if (data[0] == 0xff && data[1] == 0xd8) { /* start of frame */
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame,
data, 0); data, 0);
/* put the JPEG header in the new frame */ /* put the JPEG header in the new frame */
jpeg_put_header(gspca_dev, frame, 0x21); gspca_frame_add(gspca_dev, FIRST_PACKET, frame,
sd->jpeg_hdr, JPEG_HDR_SZ);
/* remove the webcam's header: /* remove the webcam's header:
* ff d8 ff fe 00 0e 00 00 ss ss 00 01 ww ww hh hh pp pp * ff d8 ff fe 00 0e 00 00 ss ss 00 01 ww ww hh hh pp pp
* - 'ss ss' is the frame sequence number (BE) * - 'ss ss' is the frame sequence number (BE)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册