Lines Matching +full:len +full:- +full:or +full:- +full:define

1 // SPDX-License-Identifier: GPL-2.0-only
7 * For reference, see JPEG ITU-T.81 (ISO/IEC 10918-1) [1]
9 * [1] https://www.w3.org/Graphics/JPEG/itu-t81.pdf
17 #include <media/v4l2-jpeg.h>
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 */
56 * struct jpeg_stream - JPEG byte stream
65 /* returns a value that fits into u8, or negative error */
68 if (stream->curr >= stream->end) in jpeg_get_byte()
69 return -EINVAL; in jpeg_get_byte()
71 return *stream->curr++; in jpeg_get_byte()
74 /* returns a value that fits into u16, or negative error */
79 if (stream->curr + sizeof(__be16) > stream->end) in jpeg_get_word_be()
80 return -EINVAL; in jpeg_get_word_be()
82 word = get_unaligned_be16(stream->curr); in jpeg_get_word_be()
83 stream->curr += sizeof(__be16); in jpeg_get_word_be()
88 static int jpeg_skip(struct jpeg_stream *stream, size_t len) in jpeg_skip() argument
90 if (stream->curr + len > stream->end) in jpeg_skip()
91 return -EINVAL; in jpeg_skip()
93 stream->curr += len; in jpeg_skip()
117 u16 len; in jpeg_reference_segment() local
119 if (stream->curr + sizeof(__be16) > stream->end) in jpeg_reference_segment()
120 return -EINVAL; in jpeg_reference_segment()
122 len = get_unaligned_be16(stream->curr); in jpeg_reference_segment()
123 if (stream->curr + len > stream->end) in jpeg_reference_segment()
124 return -EINVAL; in jpeg_reference_segment()
126 segment->start = stream->curr; in jpeg_reference_segment()
127 segment->length = len; in jpeg_reference_segment()
137 /* no chroma subsampling for 4-component images */ in v4l2_jpeg_decode_subsampling()
139 return -EINVAL; in v4l2_jpeg_decode_subsampling()
151 return -EINVAL; in v4l2_jpeg_decode_subsampling()
158 int len = jpeg_get_word_be(stream); in jpeg_parse_frame_header() local
160 if (len < 0) in jpeg_parse_frame_header()
161 return len; in jpeg_parse_frame_header()
163 if (len < 8 + 3) in jpeg_parse_frame_header()
164 return -EINVAL; in jpeg_parse_frame_header()
167 /* Table B.2 - Frame header parameter sizes and values */ in jpeg_parse_frame_header()
175 * Baseline DCT only supports 8-bit precision. in jpeg_parse_frame_header()
176 * Extended sequential DCT also supports 12-bit precision. in jpeg_parse_frame_header()
179 return -EINVAL; in jpeg_parse_frame_header()
185 return -EINVAL; in jpeg_parse_frame_header()
191 return -EINVAL; in jpeg_parse_frame_header()
201 return -EINVAL; in jpeg_parse_frame_header()
202 if (len != 8 + 3 * nf) in jpeg_parse_frame_header()
203 return -EINVAL; in jpeg_parse_frame_header()
205 frame_header->precision = p; in jpeg_parse_frame_header()
206 frame_header->height = y; in jpeg_parse_frame_header()
207 frame_header->width = x; in jpeg_parse_frame_header()
208 frame_header->num_components = nf; in jpeg_parse_frame_header()
227 frame_header->subsampling = subs; in jpeg_parse_frame_header()
230 return -EINVAL; in jpeg_parse_frame_header()
237 component = &frame_header->component[i]; in jpeg_parse_frame_header()
238 component->component_identifier = c; in jpeg_parse_frame_header()
239 component->horizontal_sampling_factor = in jpeg_parse_frame_header()
241 component->vertical_sampling_factor = h_v & 0xf; in jpeg_parse_frame_header()
242 component->quantization_table_selector = tq; in jpeg_parse_frame_header()
245 return jpeg_skip(stream, len - 2); in jpeg_parse_frame_header()
255 int len = jpeg_get_word_be(stream); in jpeg_parse_scan_header() local
257 if (len < 0) in jpeg_parse_scan_header()
258 return len; in jpeg_parse_scan_header()
260 if (len < 6 + 2) in jpeg_parse_scan_header()
261 return -EINVAL; in jpeg_parse_scan_header()
270 if (ns < 1 || ns > 4 || len != 6 + 2 * ns) in jpeg_parse_scan_header()
271 return -EINVAL; in jpeg_parse_scan_header()
273 scan_header->num_components = ns; in jpeg_parse_scan_header()
287 component = &scan_header->component[i]; in jpeg_parse_scan_header()
288 component->component_selector = cs; in jpeg_parse_scan_header()
289 component->dc_entropy_coding_table_selector = in jpeg_parse_scan_header()
291 component->ac_entropy_coding_table_selector = in jpeg_parse_scan_header()
297 skip = len - 2; in jpeg_parse_scan_header()
303 /* B.2.4.1 Quantization table-specification syntax */
308 int len = jpeg_get_word_be(stream); in jpeg_parse_quantization_tables() local
310 if (len < 0) in jpeg_parse_quantization_tables()
311 return len; in jpeg_parse_quantization_tables()
313 if (len < 2 + 65) in jpeg_parse_quantization_tables()
314 return -EINVAL; in jpeg_parse_quantization_tables()
316 len -= 2; in jpeg_parse_quantization_tables()
317 while (len >= 65) { in jpeg_parse_quantization_tables()
328 * Only 8-bit Qk values for 8-bit sample precision. Extended in jpeg_parse_quantization_tables()
329 * sequential DCT with 12-bit sample precision also supports in jpeg_parse_quantization_tables()
330 * 16-bit Qk values. in jpeg_parse_quantization_tables()
333 return -EINVAL; in jpeg_parse_quantization_tables()
338 return -EINVAL; in jpeg_parse_quantization_tables()
341 qk = stream->curr; in jpeg_parse_quantization_tables()
344 return -EINVAL; in jpeg_parse_quantization_tables()
351 len -= pq ? 129 : 65; in jpeg_parse_quantization_tables()
357 /* B.2.4.2 Huffman table-specification syntax */
362 int len = jpeg_get_word_be(stream); in jpeg_parse_huffman_tables() local
364 if (len < 0) in jpeg_parse_huffman_tables()
365 return len; in jpeg_parse_huffman_tables()
366 /* Table B.5 - Huffman table specification parameter sizes and values */ in jpeg_parse_huffman_tables()
367 if (len < 2 + 17) in jpeg_parse_huffman_tables()
368 return -EINVAL; in jpeg_parse_huffman_tables()
370 for (len -= 2; len >= 17; len -= 17 + mt) { in jpeg_parse_huffman_tables()
378 /* table class - 0 = DC, 1 = AC */ in jpeg_parse_huffman_tables()
381 return -EINVAL; in jpeg_parse_huffman_tables()
387 return -EINVAL; in jpeg_parse_huffman_tables()
389 /* BITS - number of Huffman codes with length i */ in jpeg_parse_huffman_tables()
390 table = stream->curr; in jpeg_parse_huffman_tables()
401 /* HUFFVAL - values associated with each Huffman code */ in jpeg_parse_huffman_tables()
408 tables[(tc << 1) | th].length = stream->curr - table; in jpeg_parse_huffman_tables()
412 return jpeg_skip(stream, len - 2); in jpeg_parse_huffman_tables()
419 int len = jpeg_get_word_be(stream); in jpeg_parse_restart_interval() local
422 if (len < 0) in jpeg_parse_restart_interval()
423 return len; in jpeg_parse_restart_interval()
424 if (len != 4) in jpeg_parse_restart_interval()
425 return -EINVAL; in jpeg_parse_restart_interval()
438 int len = jpeg_get_word_be(stream); in jpeg_skip_segment() local
440 if (len < 0) in jpeg_skip_segment()
441 return len; in jpeg_skip_segment()
442 if (len < 2) in jpeg_skip_segment()
443 return -EINVAL; in jpeg_skip_segment()
445 return jpeg_skip(stream, len - 2); in jpeg_skip_segment()
448 /* Rec. ITU-T T.872 (06/2012) 6.5.3 */
461 if (stream->curr + 6 > stream->end || in jpeg_parse_app14_data()
462 strncmp(stream->curr, "Adobe\0", 6)) in jpeg_parse_app14_data()
463 return jpeg_skip(stream, lp - 2); in jpeg_parse_app14_data()
477 skip = lp - 2 - 11 - 1; in jpeg_parse_app14_data()
482 * v4l2_jpeg_parse_header - locate marker segments and optionally parse headers
484 * @len: length of the JPEG buffer
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
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) in v4l2_jpeg_parse_header() argument
501 stream.end = stream.curr + len; in v4l2_jpeg_parse_header()
503 out->num_dht = 0; in v4l2_jpeg_parse_header()
504 out->num_dqt = 0; in v4l2_jpeg_parse_header()
506 /* the first bytes must be SOI, B.2.1 High-level syntax */ in v4l2_jpeg_parse_header()
508 return -EINVAL; in v4l2_jpeg_parse_header()
511 out->app14_tf = V4L2_JPEG_APP14_TF_UNKNOWN; in v4l2_jpeg_parse_header()
518 ret = jpeg_reference_segment(&stream, &out->sof); in v4l2_jpeg_parse_header()
522 &out->frame); in v4l2_jpeg_parse_header()
533 return -EINVAL; in v4l2_jpeg_parse_header()
537 &out->dht[out->num_dht++ % 4]); in v4l2_jpeg_parse_header()
540 if (!out->huffman_tables) { in v4l2_jpeg_parse_header()
545 out->huffman_tables); in v4l2_jpeg_parse_header()
549 &out->dqt[out->num_dqt++ % 4]); in v4l2_jpeg_parse_header()
552 if (!out->quantization_tables) { in v4l2_jpeg_parse_header()
557 out->frame.precision, in v4l2_jpeg_parse_header()
558 out->quantization_tables); in v4l2_jpeg_parse_header()
562 &out->restart_interval); in v4l2_jpeg_parse_header()
566 &out->app14_tf); in v4l2_jpeg_parse_header()
569 ret = jpeg_reference_segment(&stream, &out->sos); in v4l2_jpeg_parse_header()
572 ret = jpeg_parse_scan_header(&stream, out->scan); in v4l2_jpeg_parse_header()
577 out->ecs_offset = stream.curr - (u8 *)buf; in v4l2_jpeg_parse_header()
586 /* skip unknown or unsupported marker segments */ in v4l2_jpeg_parse_header()
600 * v4l2_jpeg_parse_frame_header - parse frame header
602 * @len: length of the frame header
605 * Returns 0 or negative error if parsing failed.
607 int v4l2_jpeg_parse_frame_header(void *buf, size_t len, in v4l2_jpeg_parse_frame_header() argument
613 stream.end = stream.curr + len; in v4l2_jpeg_parse_frame_header()
619 * v4l2_jpeg_parse_scan_header - parse scan header
621 * @len: length of the scan header
624 * Returns 0 or negative error if parsing failed.
626 int v4l2_jpeg_parse_scan_header(void *buf, size_t len, in v4l2_jpeg_parse_scan_header() argument
632 stream.end = stream.curr + len; in v4l2_jpeg_parse_scan_header()
638 * v4l2_jpeg_parse_quantization_tables - parse quantization tables segment
640 * @len: length of the quantization table segment
645 * Returns 0 or negative error if parsing failed.
647 int v4l2_jpeg_parse_quantization_tables(void *buf, size_t len, u8 precision, in v4l2_jpeg_parse_quantization_tables() argument
653 stream.end = stream.curr + len; in v4l2_jpeg_parse_quantization_tables()
659 * v4l2_jpeg_parse_huffman_tables - parse huffman tables segment
661 * @len: length of the Huffman table segment
666 * Returns 0 or negative error if parsing failed.
668 int v4l2_jpeg_parse_huffman_tables(void *buf, size_t len, in v4l2_jpeg_parse_huffman_tables() argument
674 stream.end = stream.curr + len; in v4l2_jpeg_parse_huffman_tables()