1 // SPDX-License-Identifier: GPL-2.0-only
3 * V4L2 JPEG header parser helpers.
5 * Copyright (C) 2019 Pengutronix, Philipp Zabel <kernel@pengutronix.de>
7 * For reference, see JPEG ITU-T.81 (ISO/IEC 10918-1) [1]
9 * [1] https://www.w3.org/Graphics/JPEG/itu-t81.pdf
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>
19 MODULE_DESCRIPTION("V4L2 JPEG header parser helpers");
20 MODULE_AUTHOR("Philipp Zabel <kernel@pengutronix.de>");
21 MODULE_LICENSE("GPL");
23 /* Table B.1 - Marker code assignments */
24 #define SOF0 0xffc0 /* start of frame */
30 #define JPG 0xffc8 /* extensions */
35 #define DHT 0xffc4 /* huffman table */
36 #define DAC 0xffcc /* arithmetic coding conditioning */
37 #define RST0 0xffd0 /* restart */
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 */
50 #define JPG0 0xfff0 /* extensions */
52 #define COM 0xfffe /* comment */
53 #define TEM 0xff01 /* temporary */
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
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
68 EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_luma_qt
);
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
80 EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_chroma_qt
);
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
93 EXPORT_SYMBOL_GPL(v4l2_jpeg_zigzag_scan_index
);
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
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
106 EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_luma_dc_ht
);
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
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
131 EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_luma_ac_ht
);
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
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
144 EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_chroma_dc_ht
);
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
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
169 EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_chroma_ac_ht
);
172 * struct jpeg_stream - JPEG byte stream
173 * @curr: current position in stream
174 * @end: end position, after last byte
181 /* returns a value that fits into u8, or negative error */
182 static int jpeg_get_byte(struct jpeg_stream
*stream
)
184 if (stream
->curr
>= stream
->end
)
187 return *stream
->curr
++;
190 /* returns a value that fits into u16, or negative error */
191 static int jpeg_get_word_be(struct jpeg_stream
*stream
)
195 if (stream
->curr
+ sizeof(__be16
) > stream
->end
)
198 word
= get_unaligned_be16(stream
->curr
);
199 stream
->curr
+= sizeof(__be16
);
204 static int jpeg_skip(struct jpeg_stream
*stream
, size_t len
)
206 if (stream
->curr
+ len
> stream
->end
)
214 static int jpeg_next_marker(struct jpeg_stream
*stream
)
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))
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
)
235 if (stream
->curr
+ sizeof(__be16
) > stream
->end
)
238 len
= get_unaligned_be16(stream
->curr
);
239 if (stream
->curr
+ len
> stream
->end
)
242 segment
->start
= stream
->curr
;
243 segment
->length
= len
;
248 static int v4l2_jpeg_decode_subsampling(u8 nf
, u8 h_v
)
251 return V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY
;
253 /* no chroma subsampling for 4-component images */
254 if (nf
== 4 && h_v
!= 0x11)
259 return V4L2_JPEG_CHROMA_SUBSAMPLING_444
;
261 return V4L2_JPEG_CHROMA_SUBSAMPLING_422
;
263 return V4L2_JPEG_CHROMA_SUBSAMPLING_420
;
265 return V4L2_JPEG_CHROMA_SUBSAMPLING_411
;
271 static int jpeg_parse_frame_header(struct jpeg_stream
*stream
, u16 sof_marker
,
272 struct v4l2_jpeg_frame_header
*frame_header
)
274 int len
= jpeg_get_word_be(stream
);
278 /* Lf = 8 + 3 * Nf, Nf >= 1 */
283 /* Table B.2 - Frame header parameter sizes and values */
287 p
= jpeg_get_byte(stream
);
291 * Baseline DCT only supports 8-bit precision.
292 * Extended sequential DCT also supports 12-bit precision.
294 if (p
!= 8 && (p
!= 12 || sof_marker
!= SOF1
))
297 y
= jpeg_get_word_be(stream
);
303 x
= jpeg_get_word_be(stream
);
309 nf
= jpeg_get_byte(stream
);
313 * The spec allows 1 <= Nf <= 255, but we only support up to 4
316 if (nf
< 1 || nf
> V4L2_JPEG_MAX_COMPONENTS
)
318 if (len
!= 8 + 3 * nf
)
321 frame_header
->precision
= p
;
322 frame_header
->height
= y
;
323 frame_header
->width
= x
;
324 frame_header
->num_components
= nf
;
326 for (i
= 0; i
< nf
; i
++) {
327 struct v4l2_jpeg_frame_component_spec
*component
;
330 c
= jpeg_get_byte(stream
);
334 h_v
= jpeg_get_byte(stream
);
340 subs
= v4l2_jpeg_decode_subsampling(nf
, h_v
);
343 frame_header
->subsampling
= subs
;
344 } else if (h_v
!= 0x11) {
345 /* all chroma sampling factors must be 1 */
349 tq
= jpeg_get_byte(stream
);
353 component
= &frame_header
->component
[i
];
354 component
->component_identifier
= c
;
355 component
->horizontal_sampling_factor
=
357 component
->vertical_sampling_factor
= h_v
& 0xf;
358 component
->quantization_table_selector
= tq
;
361 return jpeg_skip(stream
, len
- 2);
367 static int jpeg_parse_scan_header(struct jpeg_stream
*stream
,
368 struct v4l2_jpeg_scan_header
*scan_header
)
371 int len
= jpeg_get_word_be(stream
);
375 /* Ls = 8 + 3 * Ns, Ns >= 1 */
383 ns
= jpeg_get_byte(stream
);
386 if (ns
< 1 || ns
> 4 || len
!= 6 + 2 * ns
)
389 scan_header
->num_components
= ns
;
391 for (i
= 0; i
< ns
; i
++) {
392 struct v4l2_jpeg_scan_component_spec
*component
;
395 cs
= jpeg_get_byte(stream
);
399 td_ta
= jpeg_get_byte(stream
);
403 component
= &scan_header
->component
[i
];
404 component
->component_selector
= cs
;
405 component
->dc_entropy_coding_table_selector
=
407 component
->ac_entropy_coding_table_selector
=
411 skip
= 3; /* skip Ss, Se, Ah, and Al */
416 return jpeg_skip(stream
, skip
);
419 /* B.2.4.1 Quantization table-specification syntax */
420 static int jpeg_parse_quantization_tables(struct jpeg_stream
*stream
,
422 struct v4l2_jpeg_reference
*tables
)
424 int len
= jpeg_get_word_be(stream
);
428 /* Lq = 2 + n * 65 (for baseline DCT), n >= 1 */
436 int pq_tq
= jpeg_get_byte(stream
);
441 /* quantization table element precision */
442 pq
= (pq_tq
>> 4) & 0xf;
444 * Only 8-bit Qk values for 8-bit sample precision. Extended
445 * sequential DCT with 12-bit sample precision also supports
448 if (pq
!= 0 && (pq
!= 1 || precision
!= 12))
451 /* quantization table destination identifier */
456 /* quantization table element */
458 ret
= jpeg_skip(stream
, pq
? 128 : 64);
463 tables
[tq
].start
= qk
;
464 tables
[tq
].length
= pq
? 128 : 64;
467 len
-= pq
? 129 : 65;
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
)
478 int len
= jpeg_get_word_be(stream
);
482 /* Table B.5 - Huffman table specification parameter sizes and values */
486 for (len
-= 2; len
>= 17; len
-= 17 + mt
) {
488 int tc_th
= jpeg_get_byte(stream
);
494 /* table class - 0 = DC, 1 = AC */
495 tc
= (tc_th
>> 4) & 0xf;
499 /* huffman table destination identifier */
501 /* only two Huffman tables for baseline DCT */
505 /* BITS - number of Huffman codes with length i */
506 table
= stream
->curr
;
508 for (i
= 0; i
< 16; i
++) {
511 li
= jpeg_get_byte(stream
);
517 /* HUFFVAL - values associated with each Huffman code */
518 ret
= jpeg_skip(stream
, mt
);
523 tables
[(tc
<< 1) | th
].start
= table
;
524 tables
[(tc
<< 1) | th
].length
= stream
->curr
- table
;
528 return jpeg_skip(stream
, len
- 2);
531 /* B.2.4.4 Restart interval definition syntax */
532 static int jpeg_parse_restart_interval(struct jpeg_stream
*stream
,
533 u16
*restart_interval
)
535 int len
= jpeg_get_word_be(stream
);
543 ri
= jpeg_get_word_be(stream
);
547 *restart_interval
= ri
;
552 static int jpeg_skip_segment(struct jpeg_stream
*stream
)
554 int len
= jpeg_get_word_be(stream
);
561 return jpeg_skip(stream
, len
- 2);
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
)
572 lp
= jpeg_get_word_be(stream
);
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);
582 ret
= jpeg_skip(stream
, 11);
586 ret
= jpeg_get_byte(stream
);
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
);
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
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.
608 * Returns 0 or negative error if parsing failed.
610 int v4l2_jpeg_parse_header(void *buf
, size_t len
, struct v4l2_jpeg_header
*out
)
612 struct jpeg_stream stream
;
617 stream
.end
= stream
.curr
+ len
;
622 /* the first bytes must be SOI, B.2.1 High-level syntax */
623 if (jpeg_get_word_be(&stream
) != SOI
)
626 /* init value to signal if this marker is not present */
627 out
->app14_tf
= V4L2_JPEG_APP14_TF_UNKNOWN
;
629 /* loop through marker segments */
630 while ((marker
= jpeg_next_marker(&stream
)) >= 0) {
632 /* baseline DCT, extended sequential DCT */
634 ret
= jpeg_reference_segment(&stream
, &out
->sof
);
637 ret
= jpeg_parse_frame_header(&stream
, marker
,
640 /* progressive, lossless */
642 /* differential coding */
644 /* arithmetic coding */
646 case SOF13
... SOF15
:
652 ret
= jpeg_reference_segment(&stream
,
653 &out
->dht
[out
->num_dht
++ % 4]);
656 if (!out
->huffman_tables
) {
657 ret
= jpeg_skip_segment(&stream
);
660 ret
= jpeg_parse_huffman_tables(&stream
,
661 out
->huffman_tables
);
664 ret
= jpeg_reference_segment(&stream
,
665 &out
->dqt
[out
->num_dqt
++ % 4]);
668 if (!out
->quantization_tables
) {
669 ret
= jpeg_skip_segment(&stream
);
672 ret
= jpeg_parse_quantization_tables(&stream
,
673 out
->frame
.precision
,
674 out
->quantization_tables
);
677 ret
= jpeg_parse_restart_interval(&stream
,
678 &out
->restart_interval
);
681 ret
= jpeg_parse_app14_data(&stream
,
685 ret
= jpeg_reference_segment(&stream
, &out
->sos
);
688 ret
= jpeg_parse_scan_header(&stream
, out
->scan
);
690 * stop parsing, the scan header marks the beginning of
691 * the entropy coded segment
693 out
->ecs_offset
= stream
.curr
- (u8
*)buf
;
696 /* markers without parameters */
697 case RST0
... RST7
: /* restart */
698 case SOI
: /* start of image */
699 case EOI
: /* end of image */
702 /* skip unknown or unsupported marker segments */
704 ret
= jpeg_skip_segment(&stream
);
713 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_header
);
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
721 * Returns 0 or negative error if parsing failed.
723 int v4l2_jpeg_parse_frame_header(void *buf
, size_t len
,
724 struct v4l2_jpeg_frame_header
*frame_header
)
726 struct jpeg_stream stream
;
729 stream
.end
= stream
.curr
+ len
;
730 return jpeg_parse_frame_header(&stream
, SOF0
, frame_header
);
732 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_frame_header
);
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
740 * Returns 0 or negative error if parsing failed.
742 int v4l2_jpeg_parse_scan_header(void *buf
, size_t len
,
743 struct v4l2_jpeg_scan_header
*scan_header
)
745 struct jpeg_stream stream
;
748 stream
.end
= stream
.curr
+ len
;
749 return jpeg_parse_scan_header(&stream
, scan_header
);
751 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_scan_header
);
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
761 * Returns 0 or negative error if parsing failed.
763 int v4l2_jpeg_parse_quantization_tables(void *buf
, size_t len
, u8 precision
,
764 struct v4l2_jpeg_reference
*q_tables
)
766 struct jpeg_stream stream
;
769 stream
.end
= stream
.curr
+ len
;
770 return jpeg_parse_quantization_tables(&stream
, precision
, q_tables
);
772 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_quantization_tables
);
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
782 * Returns 0 or negative error if parsing failed.
784 int v4l2_jpeg_parse_huffman_tables(void *buf
, size_t len
,
785 struct v4l2_jpeg_reference
*huffman_tables
)
787 struct jpeg_stream stream
;
790 stream
.end
= stream
.curr
+ len
;
791 return jpeg_parse_huffman_tables(&stream
, huffman_tables
);
793 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_huffman_tables
);