V4L/DVB (9850): gspca: Bad color control in sonixj.
[linux-2.6] / drivers / media / video / gspca / jpeg.h
1 #ifndef JPEG_H
2 #define JPEG_H 1
3 /*
4  * Insert a JPEG header at start of frame
5  *
6  * This module is used by the gspca subdrivers.
7  * A special case is done for Conexant webcams.
8  *
9  * Copyright (C) Jean-Francois Moine (http://moinejf.free.fr)
10  *
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
14  * any later version.
15  *
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.
20  *
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
24  *
25  */
26
27 /* start of jpeg frame + quantization table */
28 static const unsigned char quant[][0x88] = {
29 /* index 0 - Q40*/
30     {
31         0xff, 0xd8,                     /* jpeg */
32         0xff, 0xdb, 0x00, 0x84,         /* DQT */
33 0,                                      /* quantization table part 1 */
34      20, 14, 15, 18, 15, 13, 20, 18, 16, 18, 23, 21, 20, 24, 30, 50,
35      33, 30, 28, 28, 30, 61, 44, 46, 36, 50, 73, 64, 76, 75, 71, 64,
36      70, 69, 80, 90, 115, 98, 80, 85, 109, 86, 69, 70, 100, 136, 101,
37      109,
38      119, 123, 129, 130, 129, 78, 96, 141, 151, 140, 125, 150, 115,
39      126, 129, 124,
40 1,                                      /* quantization table part 2 */
41      21, 23, 23, 30, 26, 30, 59, 33, 33, 59, 124, 83, 70, 83, 124, 124,
42      124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
43      124, 124, 124,
44      124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
45      124, 124, 124,
46      124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
47      124, 124, 124},
48 /* index 1 - Q50 */
49     {
50         0xff, 0xd8,
51         0xff, 0xdb, 0x00, 0x84,         /* DQT */
52 0,
53      16, 11, 12, 14, 12, 10, 16, 14, 13, 14, 18, 17, 16, 19, 24, 40,
54      26, 24, 22, 22, 24, 49, 35, 37, 29, 40, 58, 51, 61, 60, 57, 51,
55      56, 55, 64, 72, 92, 78, 64, 68, 87, 69, 55, 56, 80, 109, 81, 87,
56      95, 98, 103, 104, 103, 62, 77, 113, 121, 112, 100, 120, 92, 101,
57      103, 99,
58 1,
59     17, 18, 18, 24, 21, 24, 47, 26, 26, 47, 99, 66, 56, 66, 99, 99,
60      99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
61      99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
62      99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99},
63 /* index 2 Q60 */
64     {
65         0xff, 0xd8,
66         0xff, 0xdb, 0x00, 0x84,         /* DQT */
67 0,
68      13, 9, 10, 11, 10, 8, 13, 11, 10, 11, 14, 14, 13, 15, 19, 32,
69      21, 19, 18, 18, 19, 39, 28, 30, 23, 32, 46, 41, 49, 48, 46, 41,
70      45, 44, 51, 58, 74, 62, 51, 54, 70, 55, 44, 45, 64, 87, 65, 70,
71      76, 78, 82, 83, 82, 50, 62, 90, 97, 90, 80, 96, 74, 81, 82, 79,
72 1,
73      14, 14, 14, 19, 17, 19, 38, 21, 21, 38, 79, 53, 45, 53, 79, 79,
74      79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
75      79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
76      79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79},
77 /* index 3 - Q70 */
78     {
79         0xff, 0xd8,
80         0xff, 0xdb, 0x00, 0x84,         /* DQT */
81 0,
82      10, 7, 7, 8, 7, 6, 10, 8, 8, 8, 11, 10, 10, 11, 14, 24,
83      16, 14, 13, 13, 14, 29, 21, 22, 17, 24, 35, 31, 37, 36, 34, 31,
84      34, 33, 38, 43, 55, 47, 38, 41, 52, 41, 33, 34, 48, 65, 49, 52,
85      57, 59, 62, 62, 62, 37, 46, 68, 73, 67, 60, 72, 55, 61, 62, 59,
86 1,
87      10, 11, 11, 14, 13, 14, 28, 16, 16, 28, 59, 40, 34, 40, 59, 59,
88      59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
89      59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
90      59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59},
91 /* index 4 - Q80 */
92     {
93         0xff, 0xd8,
94         0xff, 0xdb, 0x00, 0x84,         /* DQT */
95 0,
96       6, 4, 5, 6, 5, 4, 6, 6, 5, 6, 7, 7, 6, 8, 10, 16,
97      10, 10, 9, 9, 10, 20, 14, 15, 12, 16, 23, 20, 24, 24, 23, 20,
98      22, 22, 26, 29, 37, 31, 26, 27, 35, 28, 22, 22, 32, 44, 32, 35,
99      38, 39, 41, 42, 41, 25, 31, 45, 48, 45, 40, 48, 37, 40, 41, 40,
100 1,
101       7, 7, 7, 10, 8, 10, 19, 10, 10, 19, 40, 26, 22, 26, 40, 40,
102      40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
103      40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
104      40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40},
105 /* index 5 - Q85 */
106     {
107         0xff, 0xd8,
108         0xff, 0xdb, 0x00, 0x84,         /* DQT */
109 0,
110      5, 3, 4, 4, 4, 3, 5, 4, 4, 4, 5, 5, 5, 6, 7, 12,
111      8, 7, 7, 7, 7, 15, 11, 11, 9, 12, 17, 15, 18, 18, 17, 15,
112      17, 17, 19, 22, 28, 23, 19, 20, 26, 21, 17, 17, 24, 33, 24, 26,
113      29, 29, 31, 31, 31, 19, 23, 34, 36, 34, 30, 36, 28, 30, 31, 30,
114 1,
115      5, 5, 5, 7, 6, 7, 14, 8, 8, 14, 30, 20, 17, 20, 30, 30,
116      30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
117      30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
118      30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30},
119 /* index 6 - 86 */
120 {
121         0xff, 0xd8,
122         0xff, 0xdb, 0x00, 0x84,         /* DQT */
123 0,
124         0x04, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x04,
125         0x04, 0x04, 0x05, 0x05, 0x04, 0x05, 0x07, 0x0B,
126         0x07, 0x07, 0x06, 0x06, 0x07, 0x0E, 0x0A, 0x0A,
127         0x08, 0x0B, 0x10, 0x0E, 0x11, 0x11, 0x10, 0x0E,
128         0x10, 0x0F, 0x12, 0x14, 0x1A, 0x16, 0x12, 0x13,
129         0x18, 0x13, 0x0F, 0x10, 0x16, 0x1F, 0x17, 0x18,
130         0x1B, 0x1B, 0x1D, 0x1D, 0x1D, 0x11, 0x16, 0x20,
131         0x22, 0x1F, 0x1C, 0x22, 0x1A, 0x1C, 0x1D, 0x1C,
132 1,
133         0x05, 0x05, 0x05, 0x07, 0x06, 0x07, 0x0D, 0x07,
134         0x07, 0x0D, 0x1C, 0x12, 0x10, 0x12, 0x1C, 0x1C,
135         0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
136         0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
137         0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
138         0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
139         0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
140         0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
141  },
142 /* index 7 - 88 */
143 {
144         0xff, 0xd8,
145         0xff, 0xdb, 0x00, 0x84,         /* DQT */
146 0,
147         0x04, 0x03, 0x03, 0x03, 0x03, 0x02, 0x04, 0x03,
148         0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x06, 0x0A,
149         0x06, 0x06, 0x05, 0x05, 0x06, 0x0C, 0x08, 0x09,
150         0x07, 0x0A, 0x0E, 0x0C, 0x0F, 0x0E, 0x0E, 0x0C,
151         0x0D, 0x0D, 0x0F, 0x11, 0x16, 0x13, 0x0F, 0x10,
152         0x15, 0x11, 0x0D, 0x0D, 0x13, 0x1A, 0x13, 0x15,
153         0x17, 0x18, 0x19, 0x19, 0x19, 0x0F, 0x12, 0x1B,
154         0x1D, 0x1B, 0x18, 0x1D, 0x16, 0x18, 0x19, 0x18,
155 1,
156         0x04, 0x04, 0x04, 0x06, 0x05, 0x06, 0x0B, 0x06,
157         0x06, 0x0B, 0x18, 0x10, 0x0D, 0x10, 0x18, 0x18,
158         0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
159         0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
160         0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
161         0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
162         0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
163         0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
164 },
165 /* index 8 - ?? */
166 {
167         0xff, 0xd8,
168         0xff, 0xdb, 0x00, 0x84,         /* DQT */
169 0,
170         0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
171         0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x05,
172         0x03, 0x03, 0x03, 0x03, 0x03, 0x06, 0x04, 0x05,
173         0x04, 0x05, 0x07, 0x06, 0x08, 0x08, 0x07, 0x06,
174         0x07, 0x07, 0x08, 0x09, 0x0C, 0x0A, 0x08, 0x09,
175         0x0B, 0x09, 0x07, 0x07, 0x0A, 0x0E, 0x0A, 0x0B,
176         0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x08, 0x0A, 0x0E,
177         0x0F, 0x0E, 0x0D, 0x0F, 0x0C, 0x0D, 0x0D, 0x0C,
178 1,
179         0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x06, 0x03,
180         0x03, 0x06, 0x0C, 0x08, 0x07, 0x08, 0x0C, 0x0C,
181         0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
182         0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
183         0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
184         0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
185         0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
186         0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C
187 }
188 };
189
190 /* huffman table + start of SOF0 */
191 static unsigned char huffman[] = {
192         0xff, 0xc4, 0x01, 0xa2,
193         0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01,
194         0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
195         0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
196         0x07, 0x08, 0x09, 0x0a, 0x0b, 0x01, 0x00, 0x03,
197         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
198         0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
199         0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
200         0x0a, 0x0b, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03,
201         0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00,
202         0x00, 0x01, 0x7d, 0x01, 0x02, 0x03, 0x00, 0x04,
203         0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13,
204         0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81,
205         0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15,
206         0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82,
207         0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25,
208         0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36,
209         0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46,
210         0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56,
211         0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66,
212         0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76,
213         0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86,
214         0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95,
215         0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4,
216         0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3,
217         0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2,
218         0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca,
219         0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
220         0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
221         0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
222         0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x11, 0x00, 0x02,
223         0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05,
224         0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01,
225         0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06,
226         0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22,
227         0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1,
228         0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62,
229         0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25,
230         0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28,
231         0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a,
232         0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
233         0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
234         0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
235         0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
236         0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
237         0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
238         0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
239         0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
240         0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
241         0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
242         0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3,
243         0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2,
244         0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa,
245 #ifdef CONEX_CAM
246 /* the Conexant frames start with SOF0 */
247 #else
248         0xff, 0xc0, 0x00, 0x11,         /* SOF0 (start of frame 0 */
249         0x08,                           /* data precision */
250 #endif
251 };
252
253 #ifndef CONEX_CAM
254 /* variable part:
255  *      0x01, 0xe0,                      height
256  *      0x02, 0x80,                      width
257  *      0x03,                            component number
258  *              0x01,
259  *                      0x21,                   samples Y
260  */
261
262 /* end of header */
263 static unsigned char eoh[] = {
264                         0x00,           /* quant Y */
265                 0x02, 0x11, 0x01,       /* samples CbCr - quant CbCr */
266                 0x03, 0x11, 0x01,
267
268         0xff, 0xda, 0x00, 0x0c,         /* SOS (start of scan) */
269         0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00
270 };
271 #endif
272
273 /* -- output the JPEG header -- */
274 static void jpeg_put_header(struct gspca_dev *gspca_dev,
275                             struct gspca_frame *frame,
276                             int qindex,
277                             int samplesY)
278 {
279 #ifndef CONEX_CAM
280         unsigned char tmpbuf[8];
281 #endif
282
283         gspca_frame_add(gspca_dev, FIRST_PACKET, frame,
284                         (unsigned char *) quant[qindex], sizeof quant[0]);
285         gspca_frame_add(gspca_dev, INTER_PACKET, frame,
286                         (unsigned char *) huffman, sizeof huffman);
287 #ifndef CONEX_CAM
288         tmpbuf[0] = gspca_dev->height >> 8;
289         tmpbuf[1] = gspca_dev->height & 0xff;
290         tmpbuf[2] = gspca_dev->width >> 8;
291         tmpbuf[3] = gspca_dev->width & 0xff;
292         tmpbuf[4] = 0x03;               /* component number */
293         tmpbuf[5] = 0x01;               /* first component */
294         tmpbuf[6] = samplesY;
295         gspca_frame_add(gspca_dev, INTER_PACKET, frame,
296                         tmpbuf, 7);
297         gspca_frame_add(gspca_dev, INTER_PACKET, frame,
298                         eoh, sizeof eoh);
299 #endif
300 }
301 #endif