• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 -- */
jpeg_put_header(struct gspca_dev * gspca_dev,struct gspca_frame * frame,int qindex,int samplesY)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
302