1 // SPDX-License-Identifier: GPL-2.0-only
3 * V4L2 JPEG header parser helpers.
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 <asm/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");
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 */
56 * struct jpeg_stream - JPEG byte stream
57 * @curr: current position in stream
58 * @end: end position, after last byte
65 /* returns a value that fits into u8, or negative error */
66 static int jpeg_get_byte(struct jpeg_stream *stream)
68 if (stream->curr >= stream->end)
71 return *stream->curr++;
74 /* returns a value that fits into u16, or negative error */
75 static int jpeg_get_word_be(struct jpeg_stream *stream)
79 if (stream->curr + sizeof(__be16) > stream->end)
82 word = get_unaligned_be16(stream->curr);
83 stream->curr += sizeof(__be16);
88 static int jpeg_skip(struct jpeg_stream *stream, size_t len)
90 if (stream->curr + len > stream->end)
98 static int jpeg_next_marker(struct jpeg_stream *stream)
103 while ((byte = jpeg_get_byte(stream)) >= 0) {
104 marker = (marker << 8) | byte;
105 /* skip stuffing bytes and REServed markers */
106 if (marker == TEM || (marker > 0xffbf && marker < 0xffff))
113 /* this does not advance the current position in the stream */
114 static int jpeg_reference_segment(struct jpeg_stream *stream,
115 struct v4l2_jpeg_reference *segment)
119 if (stream->curr + sizeof(__be16) > stream->end)
122 len = get_unaligned_be16(stream->curr);
123 if (stream->curr + len > stream->end)
126 segment->start = stream->curr;
127 segment->length = len;
132 static int v4l2_jpeg_decode_subsampling(u8 nf, u8 h_v)
135 return V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY;
137 /* no chroma subsampling for 4-component images */
138 if (nf == 4 && h_v != 0x11)
143 return V4L2_JPEG_CHROMA_SUBSAMPLING_444;
145 return V4L2_JPEG_CHROMA_SUBSAMPLING_422;
147 return V4L2_JPEG_CHROMA_SUBSAMPLING_420;
149 return V4L2_JPEG_CHROMA_SUBSAMPLING_411;
155 static int jpeg_parse_frame_header(struct jpeg_stream *stream, u16 sof_marker,
156 struct v4l2_jpeg_frame_header *frame_header)
158 int len = jpeg_get_word_be(stream);
162 /* Lf = 8 + 3 * Nf, Nf >= 1 */
167 /* Table B.2 - Frame header parameter sizes and values */
171 p = jpeg_get_byte(stream);
175 * Baseline DCT only supports 8-bit precision.
176 * Extended sequential DCT also supports 12-bit precision.
178 if (p != 8 && (p != 12 || sof_marker != SOF1))
181 y = jpeg_get_word_be(stream);
187 x = jpeg_get_word_be(stream);
193 nf = jpeg_get_byte(stream);
197 * The spec allows 1 <= Nf <= 255, but we only support up to 4
200 if (nf < 1 || nf > V4L2_JPEG_MAX_COMPONENTS)
202 if (len != 8 + 3 * nf)
205 frame_header->precision = p;
206 frame_header->height = y;
207 frame_header->width = x;
208 frame_header->num_components = nf;
210 for (i = 0; i < nf; i++) {
211 struct v4l2_jpeg_frame_component_spec *component;
214 c = jpeg_get_byte(stream);
218 h_v = jpeg_get_byte(stream);
224 subs = v4l2_jpeg_decode_subsampling(nf, h_v);
227 frame_header->subsampling = subs;
228 } else if (h_v != 0x11) {
229 /* all chroma sampling factors must be 1 */
233 tq = jpeg_get_byte(stream);
237 component = &frame_header->component[i];
238 component->component_identifier = c;
239 component->horizontal_sampling_factor =
241 component->vertical_sampling_factor = h_v & 0xf;
242 component->quantization_table_selector = tq;
245 return jpeg_skip(stream, len - 2);
251 static int jpeg_parse_scan_header(struct jpeg_stream *stream,
252 struct v4l2_jpeg_scan_header *scan_header)
255 int len = jpeg_get_word_be(stream);
259 /* Ls = 8 + 3 * Ns, Ns >= 1 */
267 ns = jpeg_get_byte(stream);
270 if (ns < 1 || ns > 4 || len != 6 + 2 * ns)
273 scan_header->num_components = ns;
275 for (i = 0; i < ns; i++) {
276 struct v4l2_jpeg_scan_component_spec *component;
279 cs = jpeg_get_byte(stream);
283 td_ta = jpeg_get_byte(stream);
287 component = &scan_header->component[i];
288 component->component_selector = cs;
289 component->dc_entropy_coding_table_selector =
291 component->ac_entropy_coding_table_selector =
295 skip = 3; /* skip Ss, Se, Ah, and Al */
300 return jpeg_skip(stream, skip);
303 /* B.2.4.1 Quantization table-specification syntax */
304 static int jpeg_parse_quantization_tables(struct jpeg_stream *stream,
306 struct v4l2_jpeg_reference *tables)
308 int len = jpeg_get_word_be(stream);
312 /* Lq = 2 + n * 65 (for baseline DCT), n >= 1 */
320 int pq_tq = jpeg_get_byte(stream);
325 /* quantization table element precision */
326 pq = (pq_tq >> 4) & 0xf;
328 * Only 8-bit Qk values for 8-bit sample precision. Extended
329 * sequential DCT with 12-bit sample precision also supports
332 if (pq != 0 && (pq != 1 || precision != 12))
335 /* quantization table destination identifier */
340 /* quantization table element */
342 ret = jpeg_skip(stream, pq ? 128 : 64);
347 tables[tq].start = qk;
348 tables[tq].length = pq ? 128 : 64;
351 len -= pq ? 129 : 65;
357 /* B.2.4.2 Huffman table-specification syntax */
358 static int jpeg_parse_huffman_tables(struct jpeg_stream *stream,
359 struct v4l2_jpeg_reference *tables)
362 int len = jpeg_get_word_be(stream);
366 /* Table B.5 - Huffman table specification parameter sizes and values */
370 for (len -= 2; len >= 17; len -= 17 + mt) {
372 int tc_th = jpeg_get_byte(stream);
378 /* table class - 0 = DC, 1 = AC */
379 tc = (tc_th >> 4) & 0xf;
383 /* huffman table destination identifier */
385 /* only two Huffman tables for baseline DCT */
389 /* BITS - number of Huffman codes with length i */
390 table = stream->curr;
392 for (i = 0; i < 16; i++) {
395 li = jpeg_get_byte(stream);
401 /* HUFFVAL - values associated with each Huffman code */
402 ret = jpeg_skip(stream, mt);
407 tables[(tc << 1) | th].start = table;
408 tables[(tc << 1) | th].length = stream->curr - table;
412 return jpeg_skip(stream, len - 2);
415 /* B.2.4.4 Restart interval definition syntax */
416 static int jpeg_parse_restart_interval(struct jpeg_stream *stream,
417 u16 *restart_interval)
419 int len = jpeg_get_word_be(stream);
427 ri = jpeg_get_word_be(stream);
431 *restart_interval = ri;
436 static int jpeg_skip_segment(struct jpeg_stream *stream)
438 int len = jpeg_get_word_be(stream);
445 return jpeg_skip(stream, len - 2);
448 /* Rec. ITU-T T.872 (06/2012) 6.5.3 */
449 static int jpeg_parse_app14_data(struct jpeg_stream *stream,
450 enum v4l2_jpeg_app14_tf *tf)
456 lp = jpeg_get_word_be(stream);
460 /* Check for "Adobe\0" in Ap1..6 */
461 if (stream->curr + 6 > stream->end ||
462 strncmp(stream->curr, "Adobe\0", 6))
466 ret = jpeg_skip(stream, 11);
470 ret = jpeg_get_byte(stream);
476 /* skip the rest of the segment, this ensures at least it is complete */
478 return jpeg_skip(stream, skip);
482 * v4l2_jpeg_parse_header - locate marker segments and optionally parse headers
483 * @buf: address of the JPEG buffer, should start with a SOI marker
484 * @len: length of the JPEG buffer
485 * @out: returns marker segment positions and optionally parsed headers
487 * The out->scan_header pointer must be initialized to NULL or point to a valid
488 * v4l2_jpeg_scan_header structure. The out->huffman_tables and
489 * out->quantization_tables pointers must be initialized to NULL or point to a
490 * valid array of 4 v4l2_jpeg_reference structures each.
492 * Returns 0 or negative error if parsing failed.
494 int v4l2_jpeg_parse_header(void *buf, size_t len, struct v4l2_jpeg_header *out)
496 struct jpeg_stream stream;
501 stream.end = stream.curr + len;
506 /* the first bytes must be SOI, B.2.1 High-level syntax */
507 if (jpeg_get_word_be(&stream) != SOI)
510 /* init value to signal if this marker is not present */
511 out->app14_tf = V4L2_JPEG_APP14_TF_UNKNOWN;
513 /* loop through marker segments */
514 while ((marker = jpeg_next_marker(&stream)) >= 0) {
516 /* baseline DCT, extended sequential DCT */
518 ret = jpeg_reference_segment(&stream, &out->sof);
521 ret = jpeg_parse_frame_header(&stream, marker,
524 /* progressive, lossless */
526 /* differential coding */
528 /* arithmetic coding */
530 case SOF13 ... SOF15:
536 ret = jpeg_reference_segment(&stream,
537 &out->dht[out->num_dht++ % 4]);
540 if (!out->huffman_tables) {
541 ret = jpeg_skip_segment(&stream);
544 ret = jpeg_parse_huffman_tables(&stream,
545 out->huffman_tables);
548 ret = jpeg_reference_segment(&stream,
549 &out->dqt[out->num_dqt++ % 4]);
552 if (!out->quantization_tables) {
553 ret = jpeg_skip_segment(&stream);
556 ret = jpeg_parse_quantization_tables(&stream,
557 out->frame.precision,
558 out->quantization_tables);
561 ret = jpeg_parse_restart_interval(&stream,
562 &out->restart_interval);
565 ret = jpeg_parse_app14_data(&stream,
569 ret = jpeg_reference_segment(&stream, &out->sos);
572 ret = jpeg_parse_scan_header(&stream, out->scan);
574 * stop parsing, the scan header marks the beginning of
575 * the entropy coded segment
577 out->ecs_offset = stream.curr - (u8 *)buf;
580 /* markers without parameters */
581 case RST0 ... RST7: /* restart */
582 case SOI: /* start of image */
583 case EOI: /* end of image */
586 /* skip unknown or unsupported marker segments */
588 ret = jpeg_skip_segment(&stream);
597 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_header);
600 * v4l2_jpeg_parse_frame_header - parse frame header
601 * @buf: address of the frame header, after the SOF0 marker
602 * @len: length of the frame header
603 * @frame_header: returns the parsed frame header
605 * Returns 0 or negative error if parsing failed.
607 int v4l2_jpeg_parse_frame_header(void *buf, size_t len,
608 struct v4l2_jpeg_frame_header *frame_header)
610 struct jpeg_stream stream;
613 stream.end = stream.curr + len;
614 return jpeg_parse_frame_header(&stream, SOF0, frame_header);
616 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_frame_header);
619 * v4l2_jpeg_parse_scan_header - parse scan header
620 * @buf: address of the scan header, after the SOS marker
621 * @len: length of the scan header
622 * @scan_header: returns the parsed scan header
624 * Returns 0 or negative error if parsing failed.
626 int v4l2_jpeg_parse_scan_header(void *buf, size_t len,
627 struct v4l2_jpeg_scan_header *scan_header)
629 struct jpeg_stream stream;
632 stream.end = stream.curr + len;
633 return jpeg_parse_scan_header(&stream, scan_header);
635 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_scan_header);
638 * v4l2_jpeg_parse_quantization_tables - parse quantization tables segment
639 * @buf: address of the quantization table segment, after the DQT marker
640 * @len: length of the quantization table segment
641 * @precision: sample precision (P) in bits per component
642 * @q_tables: returns four references into the buffer for the
643 * four possible quantization table destinations
645 * Returns 0 or negative error if parsing failed.
647 int v4l2_jpeg_parse_quantization_tables(void *buf, size_t len, u8 precision,
648 struct v4l2_jpeg_reference *q_tables)
650 struct jpeg_stream stream;
653 stream.end = stream.curr + len;
654 return jpeg_parse_quantization_tables(&stream, precision, q_tables);
656 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_quantization_tables);
659 * v4l2_jpeg_parse_huffman_tables - parse huffman tables segment
660 * @buf: address of the Huffman table segment, after the DHT marker
661 * @len: length of the Huffman table segment
662 * @huffman_tables: returns four references into the buffer for the
663 * four possible Huffman table destinations, in
664 * the order DC0, DC1, AC0, AC1
666 * Returns 0 or negative error if parsing failed.
668 int v4l2_jpeg_parse_huffman_tables(void *buf, size_t len,
669 struct v4l2_jpeg_reference *huffman_tables)
671 struct jpeg_stream stream;
674 stream.end = stream.curr + len;
675 return jpeg_parse_huffman_tables(&stream, huffman_tables);
677 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_huffman_tables);