aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca/jpeg.h
diff options
context:
space:
mode:
authorJean-Francois Moine <moinejf@free.fr>2009-03-03 03:33:41 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-03-30 11:43:22 -0400
commit71cb2764fcc51bd9e1b95be5b0f2da6f026634c7 (patch)
treecad0450231d5b4e7db071396ea5a33dabd3e314e /drivers/media/video/gspca/jpeg.h
parentc98afbfc20355dd04a7b817b232e06a4c3e73bac (diff)
V4L/DVB (11039): gspca - most jpeg subdrivers: Change the JPEG header creation.
Signed-off-by: Jean-Francois Moine <moinejf@free.fr> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/gspca/jpeg.h')
-rw-r--r--drivers/media/video/gspca/jpeg.h250
1 files changed, 42 insertions, 208 deletions
diff --git a/drivers/media/video/gspca/jpeg.h b/drivers/media/video/gspca/jpeg.h
index 7d2df9720025..de63c36806c0 100644
--- a/drivers/media/video/gspca/jpeg.h
+++ b/drivers/media/video/gspca/jpeg.h
@@ -27,42 +27,16 @@
27/* 27/*
28 * generation options 28 * generation options
29 * CONEX_CAM Conexant if present 29 * CONEX_CAM Conexant if present
30 * QUANT_VAL quantization table (0..8)
31 */ 30 */
32 31
33/* 32/* JPEG header */
34 * JPEG header:
35 * - start of jpeg frame
36 * - quantization table
37 * - huffman table
38 * - start of SOF0
39 */
40static const u8 jpeg_head[] = { 33static const u8 jpeg_head[] = {
41 0xff, 0xd8, /* jpeg */ 34 0xff, 0xd8, /* jpeg */
35
36/* quantization table quality 50% */
42 0xff, 0xdb, 0x00, 0x84, /* DQT */ 37 0xff, 0xdb, 0x00, 0x84, /* DQT */
43#if QUANT_VAL == 0
44/* index 0 - Q40*/
450, /* quantization table part 1 */
46 0x14, 0x0e, 0x0f, 0x12, 0x0f, 0x0d, 0x14, 0x12,
47 0x10, 0x12, 0x17, 0x15, 0x14, 0x18, 0x1e, 0x32,
48 0x21, 0x1e, 0x1c, 0x1c, 0x1e, 0x3d, 0x2c, 0x2e,
49 0x24, 0x32, 0x49, 0x40, 0x4c, 0x4b, 0x47, 0x40,
50 0x46, 0x45, 0x50, 0x5a, 0x73, 0x62, 0x50, 0x55,
51 0x6d, 0x56, 0x45, 0x46, 0x64, 0x88, 0x65, 0x6d,
52 0x77, 0x7b, 0x81, 0x82, 0x81, 0x4e, 0x60, 0x8d,
53 0x97, 0x8c, 0x7d, 0x96, 0x73, 0x7e, 0x81, 0x7c,
541, /* quantization table part 2 */
55 0x15, 0x17, 0x17, 0x1e, 0x1a, 0x1e, 0x3b, 0x21,
56 0x21, 0x3b, 0x7c, 0x53, 0x46, 0x53, 0x7c, 0x0c,
57 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c,
58 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c,
59 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c,
60 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c,
61 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c,
62 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c,
63#elif QUANT_VAL == 1
64/* index 1 - Q50 */
650, 380,
39#define JPEG_QT0_OFFSET 7
66 0x10, 0x0b, 0x0c, 0x0e, 0x0c, 0x0a, 0x10, 0x0e, 40 0x10, 0x0b, 0x0c, 0x0e, 0x0c, 0x0a, 0x10, 0x0e,
67 0x0d, 0x0e, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28, 41 0x0d, 0x0e, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28,
68 0x1a, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25, 42 0x1a, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25,
@@ -72,6 +46,7 @@ static const u8 jpeg_head[] = {
72 0x5f, 0x62, 0x67, 0x68, 0x67, 0x3e, 0x4d, 0x71, 46 0x5f, 0x62, 0x67, 0x68, 0x67, 0x3e, 0x4d, 0x71,
73 0x79, 0x70, 0x64, 0x78, 0x5c, 0x65, 0x67, 0x63, 47 0x79, 0x70, 0x64, 0x78, 0x5c, 0x65, 0x67, 0x63,
741, 481,
49#define JPEG_QT1_OFFSET 72
75 0x11, 0x12, 0x12, 0x18, 0x15, 0x18, 0x2f, 0x1a, 50 0x11, 0x12, 0x12, 0x18, 0x15, 0x18, 0x2f, 0x1a,
76 0x1a, 0x2f, 0x63, 0x42, 0x38, 0x42, 0x63, 0x63, 51 0x1a, 0x2f, 0x63, 0x42, 0x38, 0x42, 0x63, 0x63,
77 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 52 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
@@ -80,149 +55,6 @@ static const u8 jpeg_head[] = {
80 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 55 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
81 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 56 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
82 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 57 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
83#elif QUANT_VAL == 2
84/* index 2 Q60 */
850,
86 0x0d, 0x09, 0x0a, 0x0b, 0x0a, 0x08, 0x0d, 0x0b,
87 0x0a, 0x0b, 0x0e, 0x0e, 0x0d, 0x0f, 0x13, 0x20,
88 0x15, 0x13, 0x12, 0x12, 0x13, 0x27, 0x1c, 0x1e,
89 0x17, 0x20, 0x2e, 0x29, 0x31, 0x30, 0x2e, 0x29,
90 0x2d, 0x2c, 0x33, 0x3a, 0x4a, 0x3e, 0x33, 0x36,
91 0x46, 0x37, 0x2c, 0x2d, 0x40, 0x57, 0x41, 0x46,
92 0x4c, 0x4e, 0x52, 0x53, 0x52, 0x32, 0x3e, 0x5a,
93 0x61, 0x5a, 0x50, 0x60, 0x4a, 0x51, 0x52, 0x4f,
941,
95 0x0e, 0x0e, 0x0e, 0x13, 0x11, 0x13, 0x26, 0x15,
96 0x15, 0x26, 0x4f, 0x35, 0x2d, 0x35, 0x4f, 0x4f,
97 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
98 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
99 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
100 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
101 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
102 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
103#elif QUANT_VAL == 3
104/* index 3 - Q70 */
1050,
106 0x0a, 0x07, 0x07, 0x08, 0x07, 0x06, 0x0a, 0x08,
107 0x08, 0x08, 0x0b, 0x0a, 0x0a, 0x0b, 0x0e, 0x18,
108 0x10, 0x0e, 0x0d, 0x0d, 0x0e, 0x1d, 0x15, 0x16,
109 0x11, 0x18, 0x23, 0x1f, 0x25, 0x24, 0x22, 0x1f,
110 0x22, 0x21, 0x26, 0x2b, 0x37, 0x2f, 0x26, 0x29,
111 0x34, 0x29, 0x21, 0x22, 0x30, 0x41, 0x31, 0x34,
112 0x39, 0x3b, 0x3e, 0x3e, 0x3e, 0x25, 0x2e, 0x44,
113 0x49, 0x43, 0x3c, 0x48, 0x37, 0x3d, 0x3e, 0x3b,
1141,
115 0x0a, 0x0b, 0x0b, 0x0e, 0x0d, 0x0e, 0x1c, 0x10,
116 0x10, 0x1c, 0x3b, 0x28, 0x22, 0x28, 0x3b, 0x3b,
117 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
118 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
119 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
120 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
121 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
122 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
123#elif QUANT_VAL == 4
124/* index 4 - Q80 */
1250,
126 0x06, 0x04, 0x05, 0x06, 0x05, 0x04, 0x06, 0x06,
127 0x05, 0x06, 0x07, 0x07, 0x06, 0x08, 0x0a, 0x10,
128 0x0a, 0x0a, 0x09, 0x09, 0x0a, 0x14, 0x0e, 0x0f,
129 0x0c, 0x10, 0x17, 0x14, 0x18, 0x18, 0x17, 0x14,
130 0x16, 0x16, 0x1a, 0x1d, 0x25, 0x1f, 0x1a, 0x1b,
131 0x23, 0x1c, 0x16, 0x16, 0x20, 0x2c, 0x20, 0x23,
132 0x26, 0x27, 0x29, 0x2a, 0x29, 0x19, 0x1f, 0x2d,
133 0x30, 0x2d, 0x28, 0x30, 0x25, 0x28, 0x29, 0x28,
1341,
135 0x07, 0x07, 0x07, 0x0a, 0x08, 0x0a, 0x13, 0x0a,
136 0x0a, 0x13, 0x28, 0x1a, 0x16, 0x1a, 0x28, 0x28,
137 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
138 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
139 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
140 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
141 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
142 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
143#elif QUANT_VAL == 5
144/* index 5 - Q85 */
1450,
146 0x05, 0x03, 0x04, 0x04, 0x04, 0x03, 0x05, 0x04,
147 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x07, 0x0c,
148 0x08, 0x07, 0x07, 0x07, 0x07, 0x0f, 0x0b, 0x0b,
149 0x09, 0x0c, 0x11, 0x0f, 0x12, 0x12, 0x11, 0x0f,
150 0x11, 0x11, 0x13, 0x16, 0x1c, 0x17, 0x13, 0x14,
151 0x1a, 0x15, 0x11, 0x11, 0x18, 0x21, 0x18, 0x1a,
152 0x1d, 0x1d, 0x1f, 0x1f, 0x1f, 0x13, 0x17, 0x22,
153 0x24, 0x22, 0x1e, 0x24, 0x1c, 0x1e, 0x1f, 0x1e,
1541,
155 0x05, 0x05, 0x05, 0x07, 0x06, 0x07, 0x0e, 0x08,
156 0x08, 0x0e, 0x1e, 0x14, 0x11, 0x14, 0x1e, 0x1e,
157 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
158 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
159 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
160 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
161 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
162 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
163#elif QUANT_VAL == 6
164/* index 6 - 86 */
1650,
166 0x04, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x04,
167 0x04, 0x04, 0x05, 0x05, 0x04, 0x05, 0x07, 0x0B,
168 0x07, 0x07, 0x06, 0x06, 0x07, 0x0e, 0x0a, 0x0a,
169 0x08, 0x0B, 0x10, 0x0e, 0x11, 0x11, 0x10, 0x0e,
170 0x10, 0x0f, 0x12, 0x14, 0x1a, 0x16, 0x12, 0x13,
171 0x18, 0x13, 0x0f, 0x10, 0x16, 0x1f, 0x17, 0x18,
172 0x1b, 0x1b, 0x1d, 0x1d, 0x1d, 0x11, 0x16, 0x20,
173 0x22, 0x1f, 0x1c, 0x22, 0x1a, 0x1c, 0x1d, 0x1c,
1741,
175 0x05, 0x05, 0x05, 0x07, 0x06, 0x07, 0x0D, 0x07,
176 0x07, 0x0D, 0x1c, 0x12, 0x10, 0x12, 0x1c, 0x1c,
177 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
178 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
179 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
180 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
181 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
182 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
183#elif QUANT_VAL == 7
184/* index 7 - 88 */
1850,
186 0x04, 0x03, 0x03, 0x03, 0x03, 0x02, 0x04, 0x03,
187 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x06, 0x0a,
188 0x06, 0x06, 0x05, 0x05, 0x06, 0x0C, 0x08, 0x09,
189 0x07, 0x0a, 0x0e, 0x0c, 0x0f, 0x0e, 0x0e, 0x0c,
190 0x0d, 0x0d, 0x0f, 0x11, 0x16, 0x13, 0x0f, 0x10,
191 0x15, 0x11, 0x0d, 0x0d, 0x13, 0x1a, 0x13, 0x15,
192 0x17, 0x18, 0x19, 0x19, 0x19, 0x0f, 0x12, 0x1b,
193 0x1d, 0x1b, 0x18, 0x1d, 0x16, 0x18, 0x19, 0x18,
1941,
195 0x04, 0x04, 0x04, 0x06, 0x05, 0x06, 0x0B, 0x06,
196 0x06, 0x0B, 0x18, 0x10, 0x0d, 0x10, 0x18, 0x18,
197 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
198 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
199 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
200 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
201 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
202 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
203#elif QUANT_VAL == 8
204/* index 8 - ?? */
2050,
206 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
207 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x05,
208 0x03, 0x03, 0x03, 0x03, 0x03, 0x06, 0x04, 0x05,
209 0x04, 0x05, 0x07, 0x06, 0x08, 0x08, 0x07, 0x06,
210 0x07, 0x07, 0x08, 0x09, 0x0c, 0x0a, 0x08, 0x09,
211 0x0B, 0x09, 0x07, 0x07, 0x0a, 0x0e, 0x0a, 0x0b,
212 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x08, 0x0a, 0x0e,
213 0x0f, 0x0e, 0x0d, 0x0f, 0x0c, 0x0d, 0x0d, 0x0c,
2141,
215 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x06, 0x03,
216 0x03, 0x06, 0x0c, 0x08, 0x07, 0x08, 0x0c, 0x0c,
217 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
218 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
219 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
220 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
221 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
222 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
223#else
224#error "Invalid quantization table"
225#endif
226 58
227/* huffman table */ 59/* huffman table */
228 0xff, 0xc4, 0x01, 0xa2, 60 0xff, 0xc4, 0x01, 0xa2,
@@ -280,55 +112,57 @@ static const u8 jpeg_head[] = {
280 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 112 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa,
281#ifdef CONEX_CAM 113#ifdef CONEX_CAM
282/* the Conexant frames start with SOF0 */ 114/* the Conexant frames start with SOF0 */
115#define JPEG_HDR_SZ 556
283#else 116#else
284 0xff, 0xc0, 0x00, 0x11, /* SOF0 (start of frame 0 */ 117 0xff, 0xc0, 0x00, 0x11, /* SOF0 (start of frame 0 */
285 0x08, /* data precision */ 118 0x08, /* data precision */
286#endif 119#define JPEG_HEIGHT_OFFSET 561
287}; 120 0x01, 0xe0, /* height */
288 121 0x02, 0x80, /* width */
289#ifndef CONEX_CAM 122 0x03, /* component number */
290/* variable part: 123 0x01,
291 * 0x01, 0xe0, height 124 0x21, /* samples Y */
292 * 0x02, 0x80, width
293 * 0x03, component number
294 * 0x01,
295 * 0x21, samples Y
296 */
297
298/* end of header */
299static u8 eoh[] = {
300 0x00, /* quant Y */ 125 0x00, /* quant Y */
301 0x02, 0x11, 0x01, /* samples CbCr - quant CbCr */ 126 0x02, 0x11, 0x01, /* samples CbCr - quant CbCr */
302 0x03, 0x11, 0x01, 127 0x03, 0x11, 0x01,
303 128
304 0xff, 0xda, 0x00, 0x0c, /* SOS (start of scan) */ 129 0xff, 0xda, 0x00, 0x0c, /* SOS (start of scan) */
305 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00 130 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00
306}; 131#define JPEG_HDR_SZ 589
307#endif 132#endif
133};
308 134
309/* -- output the JPEG header -- */ 135/* define the JPEG header */
310static void jpeg_put_header(struct gspca_dev *gspca_dev, 136static void jpeg_define(u8 *jpeg_hdr,
311 struct gspca_frame *frame, 137 int height,
312 int samplesY) 138 int width,
139 int samplesY)
313{ 140{
141 memcpy(jpeg_hdr, jpeg_head, sizeof jpeg_head);
314#ifndef CONEX_CAM 142#ifndef CONEX_CAM
315 u8 tmpbuf[8]; 143 jpeg_hdr[JPEG_HEIGHT_OFFSET + 0] = height >> 8;
144 jpeg_hdr[JPEG_HEIGHT_OFFSET + 1] = height & 0xff;
145 jpeg_hdr[JPEG_HEIGHT_OFFSET + 2] = width >> 8;
146 jpeg_hdr[JPEG_HEIGHT_OFFSET + 3] = width & 0xff;
147 jpeg_hdr[JPEG_HEIGHT_OFFSET + 6] = samplesY;
316#endif 148#endif
149}
317 150
318 gspca_frame_add(gspca_dev, FIRST_PACKET, frame, 151/* set the JPEG quality */
319 jpeg_head, sizeof jpeg_head); 152static void jpeg_set_qual(u8 *jpeg_hdr,
320#ifndef CONEX_CAM 153 int quality)
321 tmpbuf[0] = gspca_dev->height >> 8; 154{
322 tmpbuf[1] = gspca_dev->height & 0xff; 155 int i, sc;
323 tmpbuf[2] = gspca_dev->width >> 8; 156
324 tmpbuf[3] = gspca_dev->width & 0xff; 157 if (quality < 50)
325 tmpbuf[4] = 0x03; /* component number */ 158 sc = 5000 / quality;
326 tmpbuf[5] = 0x01; /* first component */ 159 else
327 tmpbuf[6] = samplesY; 160 sc = 200 - quality * 2;
328 gspca_frame_add(gspca_dev, INTER_PACKET, frame, 161 for (i = 0; i < 64; i++) {
329 tmpbuf, 7); 162 jpeg_hdr[JPEG_QT0_OFFSET + i] =
330 gspca_frame_add(gspca_dev, INTER_PACKET, frame, 163 (jpeg_head[JPEG_QT0_OFFSET + i] * sc + 50) / 100;
331 eoh, sizeof eoh); 164 jpeg_hdr[JPEG_QT1_OFFSET + i] =
332#endif 165 (jpeg_head[JPEG_QT1_OFFSET + i] * sc + 50) / 100;
166 }
333} 167}
334#endif 168#endif