Lines Matching +full:10918 +full:- +full:1
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 */
56 * struct jpeg_stream - JPEG byte stream
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()
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()
90 if (stream->curr + len > stream->end) in jpeg_skip()
91 return -EINVAL; in jpeg_skip()
93 stream->curr += len; in jpeg_skip()
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()
134 if (nf == 1) in v4l2_jpeg_decode_subsampling()
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()
162 /* Lf = 8 + 3 * Nf, Nf >= 1 */ 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()
197 * The spec allows 1 <= Nf <= 255, but we only support up to 4 in jpeg_parse_frame_header()
200 if (nf < 1 || nf > V4L2_JPEG_MAX_COMPONENTS) in jpeg_parse_frame_header()
201 return -EINVAL; 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()
229 /* all chroma sampling factors must be 1 */ 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()
259 /* Ls = 8 + 3 * Ns, Ns >= 1 */ 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 */
312 /* Lq = 2 + n * 65 (for baseline DCT), n >= 1 */ in jpeg_parse_quantization_tables()
314 return -EINVAL; in jpeg_parse_quantization_tables()
316 len -= 2; 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()
332 if (pq != 0 && (pq != 1 || precision != 12)) 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 */
366 /* Table B.5 - Huffman table specification parameter sizes and values */ 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()
380 if (tc > 1) in jpeg_parse_huffman_tables()
381 return -EINVAL; in jpeg_parse_huffman_tables()
386 if (th > 1) 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()
407 tables[(tc << 1) | th].start = table; 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()
425 return -EINVAL; in jpeg_parse_restart_interval()
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
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
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()
600 * v4l2_jpeg_parse_frame_header - parse frame header
619 * v4l2_jpeg_parse_scan_header - parse scan header
638 * v4l2_jpeg_parse_quantization_tables - parse quantization tables segment
659 * v4l2_jpeg_parse_huffman_tables - parse huffman tables segment