]> Git Repo - J-linux.git/blob - drivers/media/v4l2-core/v4l2-jpeg.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / drivers / media / v4l2-core / v4l2-jpeg.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * V4L2 JPEG header parser helpers.
4  *
5  * Copyright (C) 2019 Pengutronix, Philipp Zabel <[email protected]>
6  *
7  * For reference, see JPEG ITU-T.81 (ISO/IEC 10918-1) [1]
8  *
9  * [1] https://www.w3.org/Graphics/JPEG/itu-t81.pdf
10  */
11
12 #include <linux/unaligned.h>
13 #include <linux/errno.h>
14 #include <linux/kernel.h>
15 #include <linux/module.h>
16 #include <linux/types.h>
17 #include <media/v4l2-jpeg.h>
18
19 MODULE_DESCRIPTION("V4L2 JPEG header parser helpers");
20 MODULE_AUTHOR("Philipp Zabel <[email protected]>");
21 MODULE_LICENSE("GPL");
22
23 /* Table B.1 - Marker code assignments */
24 #define SOF0    0xffc0  /* start of frame */
25 #define SOF1    0xffc1
26 #define SOF2    0xffc2
27 #define SOF3    0xffc3
28 #define SOF5    0xffc5
29 #define SOF7    0xffc7
30 #define JPG     0xffc8  /* extensions */
31 #define SOF9    0xffc9
32 #define SOF11   0xffcb
33 #define SOF13   0xffcd
34 #define SOF15   0xffcf
35 #define DHT     0xffc4  /* huffman table */
36 #define DAC     0xffcc  /* arithmetic coding conditioning */
37 #define RST0    0xffd0  /* restart */
38 #define RST7    0xffd7
39 #define SOI     0xffd8  /* start of image */
40 #define EOI     0xffd9  /* end of image */
41 #define SOS     0xffda  /* start of stream */
42 #define DQT     0xffdb  /* quantization table */
43 #define DNL     0xffdc  /* number of lines */
44 #define DRI     0xffdd  /* restart interval */
45 #define DHP     0xffde  /* hierarchical progression */
46 #define EXP     0xffdf  /* expand reference */
47 #define APP0    0xffe0  /* application data */
48 #define APP14   0xffee  /* application data for colour encoding */
49 #define APP15   0xffef
50 #define JPG0    0xfff0  /* extensions */
51 #define JPG13   0xfffd
52 #define COM     0xfffe  /* comment */
53 #define TEM     0xff01  /* temporary */
54
55 /* Luma and chroma qp tables to achieve 50% compression quality
56  * This is as per example in Annex K.1 of ITU-T.81
57  */
58 const u8 v4l2_jpeg_ref_table_luma_qt[V4L2_JPEG_PIXELS_IN_BLOCK] = {
59         16, 11, 10, 16, 24, 40, 51, 61,
60         12, 12, 14, 19, 26, 58, 60, 55,
61         14, 13, 16, 24, 40, 57, 69, 56,
62         14, 17, 22, 29, 51, 87, 80, 62,
63         18, 22, 37, 56, 68, 109, 103, 77,
64         24, 35, 55, 64, 81, 104, 113, 92,
65         49, 64, 78, 87, 103, 121, 120, 101,
66         72, 92, 95, 98, 112, 100, 103, 99
67 };
68 EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_luma_qt);
69
70 const u8 v4l2_jpeg_ref_table_chroma_qt[V4L2_JPEG_PIXELS_IN_BLOCK] = {
71         17, 18, 24, 47, 99, 99, 99, 99,
72         18, 21, 26, 66, 99, 99, 99, 99,
73         24, 26, 56, 99, 99, 99, 99, 99,
74         47, 66, 99, 99, 99, 99, 99, 99,
75         99, 99, 99, 99, 99, 99, 99, 99,
76         99, 99, 99, 99, 99, 99, 99, 99,
77         99, 99, 99, 99, 99, 99, 99, 99,
78         99, 99, 99, 99, 99, 99, 99, 99
79 };
80 EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_chroma_qt);
81
82 /* Zigzag scan pattern indexes */
83 const u8 v4l2_jpeg_zigzag_scan_index[V4L2_JPEG_PIXELS_IN_BLOCK] = {
84         0,   1,  8, 16,  9,  2,  3, 10,
85         17, 24, 32, 25, 18, 11,  4,  5,
86         12, 19, 26, 33, 40, 48, 41, 34,
87         27, 20, 13,  6,  7, 14, 21, 28,
88         35, 42, 49, 56, 57, 50, 43, 36,
89         29, 22, 15, 23, 30, 37, 44, 51,
90         58, 59, 52, 45, 38, 31, 39, 46,
91         53, 60, 61, 54, 47, 55, 62, 63
92 };
93 EXPORT_SYMBOL_GPL(v4l2_jpeg_zigzag_scan_index);
94
95 /*
96  * Contains the data that needs to be sent in the marker segment of an
97  * interchange format JPEG stream or an abbreviated format table specification
98  * data stream. Specifies the huffman table used for encoding the luminance DC
99  * coefficient differences. The table represents Table K.3 of ITU-T.81
100  */
101 const u8 v4l2_jpeg_ref_table_luma_dc_ht[V4L2_JPEG_REF_HT_DC_LEN] = {
102         0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01,
103         0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
104         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B
105 };
106 EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_luma_dc_ht);
107
108 /*
109  * Contains the data that needs to be sent in the marker segment of an
110  * interchange format JPEG stream or an abbreviated format table specification
111  * data stream. Specifies the huffman table used for encoding the luminance AC
112  * coefficients. The table represents Table K.5 of ITU-T.81
113  */
114 const u8 v4l2_jpeg_ref_table_luma_ac_ht[V4L2_JPEG_REF_HT_AC_LEN] = {
115         0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04,
116         0x00, 0x00, 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
117         0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32,
118         0x81, 0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0,
119         0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A,
120         0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
121         0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55,
122         0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
123         0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85,
124         0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
125         0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2,
126         0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5,
127         0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8,
128         0xD9, 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA,
129         0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA
130 };
131 EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_luma_ac_ht);
132
133 /*
134  * Contains the data that needs to be sent in the marker segment of an interchange format JPEG
135  * stream or an abbreviated format table specification data stream.
136  * Specifies the huffman table used for encoding the chrominance DC coefficient differences.
137  * The table represents Table K.4 of ITU-T.81
138  */
139 const u8 v4l2_jpeg_ref_table_chroma_dc_ht[V4L2_JPEG_REF_HT_DC_LEN] = {
140         0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
141         0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
142         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B
143 };
144 EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_chroma_dc_ht);
145
146 /*
147  * Contains the data that needs to be sent in the marker segment of an
148  * interchange format JPEG stream or an abbreviated format table specification
149  * data stream. Specifies the huffman table used for encoding the chrominance
150  * AC coefficients. The table represents Table K.6 of ITU-T.81
151  */
152 const u8 v4l2_jpeg_ref_table_chroma_ac_ht[V4L2_JPEG_REF_HT_AC_LEN] = {
153         0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04,
154         0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
155         0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81,
156         0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0,
157         0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17,
158         0x18, 0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38,
159         0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54,
160         0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
161         0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83,
162         0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96,
163         0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9,
164         0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3,
165         0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
166         0xD7, 0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
167         0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA
168 };
169 EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_chroma_ac_ht);
170
171 /**
172  * struct jpeg_stream - JPEG byte stream
173  * @curr: current position in stream
174  * @end: end position, after last byte
175  */
176 struct jpeg_stream {
177         u8 *curr;
178         u8 *end;
179 };
180
181 /* returns a value that fits into u8, or negative error */
182 static int jpeg_get_byte(struct jpeg_stream *stream)
183 {
184         if (stream->curr >= stream->end)
185                 return -EINVAL;
186
187         return *stream->curr++;
188 }
189
190 /* returns a value that fits into u16, or negative error */
191 static int jpeg_get_word_be(struct jpeg_stream *stream)
192 {
193         u16 word;
194
195         if (stream->curr + sizeof(__be16) > stream->end)
196                 return -EINVAL;
197
198         word = get_unaligned_be16(stream->curr);
199         stream->curr += sizeof(__be16);
200
201         return word;
202 }
203
204 static int jpeg_skip(struct jpeg_stream *stream, size_t len)
205 {
206         if (stream->curr + len > stream->end)
207                 return -EINVAL;
208
209         stream->curr += len;
210
211         return 0;
212 }
213
214 static int jpeg_next_marker(struct jpeg_stream *stream)
215 {
216         int byte;
217         u16 marker = 0;
218
219         while ((byte = jpeg_get_byte(stream)) >= 0) {
220                 marker = (marker << 8) | byte;
221                 /* skip stuffing bytes and REServed markers */
222                 if (marker == TEM || (marker > 0xffbf && marker < 0xffff))
223                         return marker;
224         }
225
226         return byte;
227 }
228
229 /* this does not advance the current position in the stream */
230 static int jpeg_reference_segment(struct jpeg_stream *stream,
231                                   struct v4l2_jpeg_reference *segment)
232 {
233         u16 len;
234
235         if (stream->curr + sizeof(__be16) > stream->end)
236                 return -EINVAL;
237
238         len = get_unaligned_be16(stream->curr);
239         if (stream->curr + len > stream->end)
240                 return -EINVAL;
241
242         segment->start = stream->curr;
243         segment->length = len;
244
245         return 0;
246 }
247
248 static int v4l2_jpeg_decode_subsampling(u8 nf, u8 h_v)
249 {
250         if (nf == 1)
251                 return V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY;
252
253         /* no chroma subsampling for 4-component images */
254         if (nf == 4 && h_v != 0x11)
255                 return -EINVAL;
256
257         switch (h_v) {
258         case 0x11:
259                 return V4L2_JPEG_CHROMA_SUBSAMPLING_444;
260         case 0x21:
261                 return V4L2_JPEG_CHROMA_SUBSAMPLING_422;
262         case 0x22:
263                 return V4L2_JPEG_CHROMA_SUBSAMPLING_420;
264         case 0x41:
265                 return V4L2_JPEG_CHROMA_SUBSAMPLING_411;
266         default:
267                 return -EINVAL;
268         }
269 }
270
271 static int jpeg_parse_frame_header(struct jpeg_stream *stream, u16 sof_marker,
272                                    struct v4l2_jpeg_frame_header *frame_header)
273 {
274         int len = jpeg_get_word_be(stream);
275
276         if (len < 0)
277                 return len;
278         /* Lf = 8 + 3 * Nf, Nf >= 1 */
279         if (len < 8 + 3)
280                 return -EINVAL;
281
282         if (frame_header) {
283                 /* Table B.2 - Frame header parameter sizes and values */
284                 int p, y, x, nf;
285                 int i;
286
287                 p = jpeg_get_byte(stream);
288                 if (p < 0)
289                         return p;
290                 /*
291                  * Baseline DCT only supports 8-bit precision.
292                  * Extended sequential DCT also supports 12-bit precision.
293                  */
294                 if (p != 8 && (p != 12 || sof_marker != SOF1))
295                         return -EINVAL;
296
297                 y = jpeg_get_word_be(stream);
298                 if (y < 0)
299                         return y;
300                 if (y == 0)
301                         return -EINVAL;
302
303                 x = jpeg_get_word_be(stream);
304                 if (x < 0)
305                         return x;
306                 if (x == 0)
307                         return -EINVAL;
308
309                 nf = jpeg_get_byte(stream);
310                 if (nf < 0)
311                         return nf;
312                 /*
313                  * The spec allows 1 <= Nf <= 255, but we only support up to 4
314                  * components.
315                  */
316                 if (nf < 1 || nf > V4L2_JPEG_MAX_COMPONENTS)
317                         return -EINVAL;
318                 if (len != 8 + 3 * nf)
319                         return -EINVAL;
320
321                 frame_header->precision = p;
322                 frame_header->height = y;
323                 frame_header->width = x;
324                 frame_header->num_components = nf;
325
326                 for (i = 0; i < nf; i++) {
327                         struct v4l2_jpeg_frame_component_spec *component;
328                         int c, h_v, tq;
329
330                         c = jpeg_get_byte(stream);
331                         if (c < 0)
332                                 return c;
333
334                         h_v = jpeg_get_byte(stream);
335                         if (h_v < 0)
336                                 return h_v;
337                         if (i == 0) {
338                                 int subs;
339
340                                 subs = v4l2_jpeg_decode_subsampling(nf, h_v);
341                                 if (subs < 0)
342                                         return subs;
343                                 frame_header->subsampling = subs;
344                         } else if (h_v != 0x11) {
345                                 /* all chroma sampling factors must be 1 */
346                                 return -EINVAL;
347                         }
348
349                         tq = jpeg_get_byte(stream);
350                         if (tq < 0)
351                                 return tq;
352
353                         component = &frame_header->component[i];
354                         component->component_identifier = c;
355                         component->horizontal_sampling_factor =
356                                 (h_v >> 4) & 0xf;
357                         component->vertical_sampling_factor = h_v & 0xf;
358                         component->quantization_table_selector = tq;
359                 }
360         } else {
361                 return jpeg_skip(stream, len - 2);
362         }
363
364         return 0;
365 }
366
367 static int jpeg_parse_scan_header(struct jpeg_stream *stream,
368                                   struct v4l2_jpeg_scan_header *scan_header)
369 {
370         size_t skip;
371         int len = jpeg_get_word_be(stream);
372
373         if (len < 0)
374                 return len;
375         /* Ls = 8 + 3 * Ns, Ns >= 1 */
376         if (len < 6 + 2)
377                 return -EINVAL;
378
379         if (scan_header) {
380                 int ns;
381                 int i;
382
383                 ns = jpeg_get_byte(stream);
384                 if (ns < 0)
385                         return ns;
386                 if (ns < 1 || ns > 4 || len != 6 + 2 * ns)
387                         return -EINVAL;
388
389                 scan_header->num_components = ns;
390
391                 for (i = 0; i < ns; i++) {
392                         struct v4l2_jpeg_scan_component_spec *component;
393                         int cs, td_ta;
394
395                         cs = jpeg_get_byte(stream);
396                         if (cs < 0)
397                                 return cs;
398
399                         td_ta = jpeg_get_byte(stream);
400                         if (td_ta < 0)
401                                 return td_ta;
402
403                         component = &scan_header->component[i];
404                         component->component_selector = cs;
405                         component->dc_entropy_coding_table_selector =
406                                 (td_ta >> 4) & 0xf;
407                         component->ac_entropy_coding_table_selector =
408                                 td_ta & 0xf;
409                 }
410
411                 skip = 3; /* skip Ss, Se, Ah, and Al */
412         } else {
413                 skip = len - 2;
414         }
415
416         return jpeg_skip(stream, skip);
417 }
418
419 /* B.2.4.1 Quantization table-specification syntax */
420 static int jpeg_parse_quantization_tables(struct jpeg_stream *stream,
421                                           u8 precision,
422                                           struct v4l2_jpeg_reference *tables)
423 {
424         int len = jpeg_get_word_be(stream);
425
426         if (len < 0)
427                 return len;
428         /* Lq = 2 + n * 65 (for baseline DCT), n >= 1 */
429         if (len < 2 + 65)
430                 return -EINVAL;
431
432         len -= 2;
433         while (len >= 65) {
434                 u8 pq, tq, *qk;
435                 int ret;
436                 int pq_tq = jpeg_get_byte(stream);
437
438                 if (pq_tq < 0)
439                         return pq_tq;
440
441                 /* quantization table element precision */
442                 pq = (pq_tq >> 4) & 0xf;
443                 /*
444                  * Only 8-bit Qk values for 8-bit sample precision. Extended
445                  * sequential DCT with 12-bit sample precision also supports
446                  * 16-bit Qk values.
447                  */
448                 if (pq != 0 && (pq != 1 || precision != 12))
449                         return -EINVAL;
450
451                 /* quantization table destination identifier */
452                 tq = pq_tq & 0xf;
453                 if (tq > 3)
454                         return -EINVAL;
455
456                 /* quantization table element */
457                 qk = stream->curr;
458                 ret = jpeg_skip(stream, pq ? 128 : 64);
459                 if (ret < 0)
460                         return -EINVAL;
461
462                 if (tables) {
463                         tables[tq].start = qk;
464                         tables[tq].length = pq ? 128 : 64;
465                 }
466
467                 len -= pq ? 129 : 65;
468         }
469
470         return 0;
471 }
472
473 /* B.2.4.2 Huffman table-specification syntax */
474 static int jpeg_parse_huffman_tables(struct jpeg_stream *stream,
475                                      struct v4l2_jpeg_reference *tables)
476 {
477         int mt;
478         int len = jpeg_get_word_be(stream);
479
480         if (len < 0)
481                 return len;
482         /* Table B.5 - Huffman table specification parameter sizes and values */
483         if (len < 2 + 17)
484                 return -EINVAL;
485
486         for (len -= 2; len >= 17; len -= 17 + mt) {
487                 u8 tc, th, *table;
488                 int tc_th = jpeg_get_byte(stream);
489                 int i, ret;
490
491                 if (tc_th < 0)
492                         return tc_th;
493
494                 /* table class - 0 = DC, 1 = AC */
495                 tc = (tc_th >> 4) & 0xf;
496                 if (tc > 1)
497                         return -EINVAL;
498
499                 /* huffman table destination identifier */
500                 th = tc_th & 0xf;
501                 /* only two Huffman tables for baseline DCT */
502                 if (th > 1)
503                         return -EINVAL;
504
505                 /* BITS - number of Huffman codes with length i */
506                 table = stream->curr;
507                 mt = 0;
508                 for (i = 0; i < 16; i++) {
509                         int li;
510
511                         li = jpeg_get_byte(stream);
512                         if (li < 0)
513                                 return li;
514
515                         mt += li;
516                 }
517                 /* HUFFVAL - values associated with each Huffman code */
518                 ret = jpeg_skip(stream, mt);
519                 if (ret < 0)
520                         return ret;
521
522                 if (tables) {
523                         tables[(tc << 1) | th].start = table;
524                         tables[(tc << 1) | th].length = stream->curr - table;
525                 }
526         }
527
528         return jpeg_skip(stream, len - 2);
529 }
530
531 /* B.2.4.4 Restart interval definition syntax */
532 static int jpeg_parse_restart_interval(struct jpeg_stream *stream,
533                                        u16 *restart_interval)
534 {
535         int len = jpeg_get_word_be(stream);
536         int ri;
537
538         if (len < 0)
539                 return len;
540         if (len != 4)
541                 return -EINVAL;
542
543         ri = jpeg_get_word_be(stream);
544         if (ri < 0)
545                 return ri;
546
547         *restart_interval = ri;
548
549         return 0;
550 }
551
552 static int jpeg_skip_segment(struct jpeg_stream *stream)
553 {
554         int len = jpeg_get_word_be(stream);
555
556         if (len < 0)
557                 return len;
558         if (len < 2)
559                 return -EINVAL;
560
561         return jpeg_skip(stream, len - 2);
562 }
563
564 /* Rec. ITU-T T.872 (06/2012) 6.5.3 */
565 static int jpeg_parse_app14_data(struct jpeg_stream *stream,
566                                  enum v4l2_jpeg_app14_tf *tf)
567 {
568         int ret;
569         int lp;
570         int skip;
571
572         lp = jpeg_get_word_be(stream);
573         if (lp < 0)
574                 return lp;
575
576         /* Check for "Adobe\0" in Ap1..6 */
577         if (stream->curr + 6 > stream->end ||
578             strncmp(stream->curr, "Adobe\0", 6))
579                 return jpeg_skip(stream, lp - 2);
580
581         /* get to Ap12 */
582         ret = jpeg_skip(stream, 11);
583         if (ret < 0)
584                 return ret;
585
586         ret = jpeg_get_byte(stream);
587         if (ret < 0)
588                 return ret;
589
590         *tf = ret;
591
592         /* skip the rest of the segment, this ensures at least it is complete */
593         skip = lp - 2 - 11 - 1;
594         return jpeg_skip(stream, skip);
595 }
596
597 /**
598  * v4l2_jpeg_parse_header - locate marker segments and optionally parse headers
599  * @buf: address of the JPEG buffer, should start with a SOI marker
600  * @len: length of the JPEG buffer
601  * @out: returns marker segment positions and optionally parsed headers
602  *
603  * The out->scan_header pointer must be initialized to NULL or point to a valid
604  * v4l2_jpeg_scan_header structure. The out->huffman_tables and
605  * out->quantization_tables pointers must be initialized to NULL or point to a
606  * valid array of 4 v4l2_jpeg_reference structures each.
607  *
608  * Returns 0 or negative error if parsing failed.
609  */
610 int v4l2_jpeg_parse_header(void *buf, size_t len, struct v4l2_jpeg_header *out)
611 {
612         struct jpeg_stream stream;
613         int marker;
614         int ret = 0;
615
616         stream.curr = buf;
617         stream.end = stream.curr + len;
618
619         out->num_dht = 0;
620         out->num_dqt = 0;
621
622         /* the first bytes must be SOI, B.2.1 High-level syntax */
623         if (jpeg_get_word_be(&stream) != SOI)
624                 return -EINVAL;
625
626         /* init value to signal if this marker is not present */
627         out->app14_tf = V4L2_JPEG_APP14_TF_UNKNOWN;
628
629         /* loop through marker segments */
630         while ((marker = jpeg_next_marker(&stream)) >= 0) {
631                 switch (marker) {
632                 /* baseline DCT, extended sequential DCT */
633                 case SOF0 ... SOF1:
634                         ret = jpeg_reference_segment(&stream, &out->sof);
635                         if (ret < 0)
636                                 return ret;
637                         ret = jpeg_parse_frame_header(&stream, marker,
638                                                       &out->frame);
639                         break;
640                 /* progressive, lossless */
641                 case SOF2 ... SOF3:
642                 /* differential coding */
643                 case SOF5 ... SOF7:
644                 /* arithmetic coding */
645                 case SOF9 ... SOF11:
646                 case SOF13 ... SOF15:
647                 case DAC:
648                 case TEM:
649                         return -EINVAL;
650
651                 case DHT:
652                         ret = jpeg_reference_segment(&stream,
653                                         &out->dht[out->num_dht++ % 4]);
654                         if (ret < 0)
655                                 return ret;
656                         if (!out->huffman_tables) {
657                                 ret = jpeg_skip_segment(&stream);
658                                 break;
659                         }
660                         ret = jpeg_parse_huffman_tables(&stream,
661                                                         out->huffman_tables);
662                         break;
663                 case DQT:
664                         ret = jpeg_reference_segment(&stream,
665                                         &out->dqt[out->num_dqt++ % 4]);
666                         if (ret < 0)
667                                 return ret;
668                         if (!out->quantization_tables) {
669                                 ret = jpeg_skip_segment(&stream);
670                                 break;
671                         }
672                         ret = jpeg_parse_quantization_tables(&stream,
673                                         out->frame.precision,
674                                         out->quantization_tables);
675                         break;
676                 case DRI:
677                         ret = jpeg_parse_restart_interval(&stream,
678                                                         &out->restart_interval);
679                         break;
680                 case APP14:
681                         ret = jpeg_parse_app14_data(&stream,
682                                                     &out->app14_tf);
683                         break;
684                 case SOS:
685                         ret = jpeg_reference_segment(&stream, &out->sos);
686                         if (ret < 0)
687                                 return ret;
688                         ret = jpeg_parse_scan_header(&stream, out->scan);
689                         /*
690                          * stop parsing, the scan header marks the beginning of
691                          * the entropy coded segment
692                          */
693                         out->ecs_offset = stream.curr - (u8 *)buf;
694                         return ret;
695
696                 /* markers without parameters */
697                 case RST0 ... RST7: /* restart */
698                 case SOI: /* start of image */
699                 case EOI: /* end of image */
700                         break;
701
702                 /* skip unknown or unsupported marker segments */
703                 default:
704                         ret = jpeg_skip_segment(&stream);
705                         break;
706                 }
707                 if (ret < 0)
708                         return ret;
709         }
710
711         return marker;
712 }
713 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_header);
714
715 /**
716  * v4l2_jpeg_parse_frame_header - parse frame header
717  * @buf: address of the frame header, after the SOF0 marker
718  * @len: length of the frame header
719  * @frame_header: returns the parsed frame header
720  *
721  * Returns 0 or negative error if parsing failed.
722  */
723 int v4l2_jpeg_parse_frame_header(void *buf, size_t len,
724                                  struct v4l2_jpeg_frame_header *frame_header)
725 {
726         struct jpeg_stream stream;
727
728         stream.curr = buf;
729         stream.end = stream.curr + len;
730         return jpeg_parse_frame_header(&stream, SOF0, frame_header);
731 }
732 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_frame_header);
733
734 /**
735  * v4l2_jpeg_parse_scan_header - parse scan header
736  * @buf: address of the scan header, after the SOS marker
737  * @len: length of the scan header
738  * @scan_header: returns the parsed scan header
739  *
740  * Returns 0 or negative error if parsing failed.
741  */
742 int v4l2_jpeg_parse_scan_header(void *buf, size_t len,
743                                 struct v4l2_jpeg_scan_header *scan_header)
744 {
745         struct jpeg_stream stream;
746
747         stream.curr = buf;
748         stream.end = stream.curr + len;
749         return jpeg_parse_scan_header(&stream, scan_header);
750 }
751 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_scan_header);
752
753 /**
754  * v4l2_jpeg_parse_quantization_tables - parse quantization tables segment
755  * @buf: address of the quantization table segment, after the DQT marker
756  * @len: length of the quantization table segment
757  * @precision: sample precision (P) in bits per component
758  * @q_tables: returns four references into the buffer for the
759  *            four possible quantization table destinations
760  *
761  * Returns 0 or negative error if parsing failed.
762  */
763 int v4l2_jpeg_parse_quantization_tables(void *buf, size_t len, u8 precision,
764                                         struct v4l2_jpeg_reference *q_tables)
765 {
766         struct jpeg_stream stream;
767
768         stream.curr = buf;
769         stream.end = stream.curr + len;
770         return jpeg_parse_quantization_tables(&stream, precision, q_tables);
771 }
772 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_quantization_tables);
773
774 /**
775  * v4l2_jpeg_parse_huffman_tables - parse huffman tables segment
776  * @buf: address of the Huffman table segment, after the DHT marker
777  * @len: length of the Huffman table segment
778  * @huffman_tables: returns four references into the buffer for the
779  *                  four possible Huffman table destinations, in
780  *                  the order DC0, DC1, AC0, AC1
781  *
782  * Returns 0 or negative error if parsing failed.
783  */
784 int v4l2_jpeg_parse_huffman_tables(void *buf, size_t len,
785                                    struct v4l2_jpeg_reference *huffman_tables)
786 {
787         struct jpeg_stream stream;
788
789         stream.curr = buf;
790         stream.end = stream.curr + len;
791         return jpeg_parse_huffman_tables(&stream, huffman_tables);
792 }
793 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_huffman_tables);
This page took 0.074454 seconds and 4 git commands to generate.