4 * Insert a JPEG header at start of frame
6 * This module is used by the gspca subdrivers.
7 * A special case is done for Conexant webcams.
9 * Copyright (C) Jean-Francois Moine (http://moinejf.free.fr)
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 * CONEX_CAM Conexant if present
30 * QUANT_VAL quantization table (0..8)
35 * - start of jpeg frame
36 * - quantization table
40 static const u8 jpeg_head[] = {
41 0xff, 0xd8, /* jpeg */
42 0xff, 0xdb, 0x00, 0x84, /* DQT */
45 0, /* 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,
54 1, /* 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,
66 0x10, 0x0b, 0x0c, 0x0e, 0x0c, 0x0a, 0x10, 0x0e,
67 0x0d, 0x0e, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28,
68 0x1a, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25,
69 0x1d, 0x28, 0x3a, 0x33, 0x3d, 0x3c, 0x39, 0x33,
70 0x38, 0x37, 0x40, 0x48, 0x5c, 0x4e, 0x40, 0x44,
71 0x57, 0x45, 0x37, 0x38, 0x50, 0x6d, 0x51, 0x57,
72 0x5f, 0x62, 0x67, 0x68, 0x67, 0x3e, 0x4d, 0x71,
73 0x79, 0x70, 0x64, 0x78, 0x5c, 0x65, 0x67, 0x63,
75 0x11, 0x12, 0x12, 0x18, 0x15, 0x18, 0x2f, 0x1a,
76 0x1a, 0x2f, 0x63, 0x42, 0x38, 0x42, 0x63, 0x63,
77 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
78 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
79 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
80 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
81 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
82 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
224 #error "Invalid quantization table"
228 0xff, 0xc4, 0x01, 0xa2,
229 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01,
230 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
232 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x01, 0x00, 0x03,
233 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
234 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
235 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
236 0x0a, 0x0b, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03,
237 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00,
238 0x00, 0x01, 0x7d, 0x01, 0x02, 0x03, 0x00, 0x04,
239 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13,
240 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81,
241 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15,
242 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82,
243 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25,
244 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36,
245 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46,
246 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56,
247 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66,
248 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76,
249 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86,
250 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95,
251 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4,
252 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3,
253 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2,
254 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca,
255 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
256 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
257 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
258 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x11, 0x00, 0x02,
259 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05,
260 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01,
261 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06,
262 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22,
263 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1,
264 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62,
265 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25,
266 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28,
267 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a,
268 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
269 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
270 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
271 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
272 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
273 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
274 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
275 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
276 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
277 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
278 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3,
279 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2,
280 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa,
282 /* the Conexant frames start with SOF0 */
284 0xff, 0xc0, 0x00, 0x11, /* SOF0 (start of frame 0 */
285 0x08, /* data precision */
293 * 0x03, component number
301 0x02, 0x11, 0x01, /* samples CbCr - quant CbCr */
304 0xff, 0xda, 0x00, 0x0c, /* SOS (start of scan) */
305 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00
309 /* -- output the JPEG header -- */
310 static void jpeg_put_header(struct gspca_dev *gspca_dev,
311 struct gspca_frame *frame,
318 gspca_frame_add(gspca_dev, FIRST_PACKET, frame,
319 jpeg_head, sizeof jpeg_head);
321 tmpbuf[0] = gspca_dev->height >> 8;
322 tmpbuf[1] = gspca_dev->height & 0xff;
323 tmpbuf[2] = gspca_dev->width >> 8;
324 tmpbuf[3] = gspca_dev->width & 0xff;
325 tmpbuf[4] = 0x03; /* component number */
326 tmpbuf[5] = 0x01; /* first component */
327 tmpbuf[6] = samplesY;
328 gspca_frame_add(gspca_dev, INTER_PACKET, frame,
330 gspca_frame_add(gspca_dev, INTER_PACKET, frame,