Commit | Line | Data |
---|---|---|
50733b5b PZ |
1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* | |
3 | * V4L2 JPEG helpers header | |
4 | * | |
5 | * Copyright (C) 2019 Pengutronix, Philipp Zabel <kernel@pengutronix.de> | |
6 | * | |
7 | * For reference, see JPEG ITU-T.81 (ISO/IEC 10918-1) | |
8 | */ | |
9 | ||
10 | #ifndef _V4L2_JPEG_H | |
11 | #define _V4L2_JPEG_H | |
12 | ||
13 | #include <linux/v4l2-controls.h> | |
14 | ||
15 | #define V4L2_JPEG_MAX_COMPONENTS 4 | |
16 | #define V4L2_JPEG_MAX_TABLES 4 | |
17 | ||
18 | /** | |
19 | * struct v4l2_jpeg_reference - reference into the JPEG buffer | |
20 | * @start: pointer to the start of the referenced segment or table | |
21 | * @length: size of the referenced segment or table | |
22 | * | |
23 | * Wnen referencing marker segments, start points right after the marker code, | |
24 | * and length is the size of the segment parameters, excluding the marker code. | |
25 | */ | |
26 | struct v4l2_jpeg_reference { | |
27 | u8 *start; | |
28 | size_t length; | |
29 | }; | |
30 | ||
31 | /* B.2.2 Frame header syntax */ | |
32 | ||
33 | /** | |
34 | * struct v4l2_jpeg_frame_component_spec - frame component-specification | |
35 | * @component_identifier: C[i] | |
36 | * @horizontal_sampling_factor: H[i] | |
37 | * @vertical_sampling_factor: V[i] | |
38 | * @quantization_table_selector: quantization table destination selector Tq[i] | |
39 | */ | |
40 | struct v4l2_jpeg_frame_component_spec { | |
41 | u8 component_identifier; | |
42 | u8 horizontal_sampling_factor; | |
43 | u8 vertical_sampling_factor; | |
44 | u8 quantization_table_selector; | |
45 | }; | |
46 | ||
47 | /** | |
48 | * struct v4l2_jpeg_frame_header - JPEG frame header | |
49 | * @height: Y | |
50 | * @width: X | |
51 | * @precision: P | |
52 | * @num_components: Nf | |
53 | * @component: component-specification, see v4l2_jpeg_frame_component_spec | |
54 | * @subsampling: decoded subsampling from component-specification | |
55 | */ | |
56 | struct v4l2_jpeg_frame_header { | |
57 | u16 height; | |
58 | u16 width; | |
59 | u8 precision; | |
60 | u8 num_components; | |
61 | struct v4l2_jpeg_frame_component_spec component[V4L2_JPEG_MAX_COMPONENTS]; | |
62 | enum v4l2_jpeg_chroma_subsampling subsampling; | |
63 | }; | |
64 | ||
65 | /* B.2.3 Scan header syntax */ | |
66 | ||
67 | /** | |
68 | * struct v4l2_jpeg_scan_component_spec - scan component-specification | |
69 | * @component_selector: Cs[j] | |
70 | * @dc_entropy_coding_table_selector: Td[j] | |
71 | * @ac_entropy_coding_table_selector: Ta[j] | |
72 | */ | |
73 | struct v4l2_jpeg_scan_component_spec { | |
74 | u8 component_selector; | |
75 | u8 dc_entropy_coding_table_selector; | |
76 | u8 ac_entropy_coding_table_selector; | |
77 | }; | |
78 | ||
79 | /** | |
80 | * struct v4l2_jpeg_scan_header - JPEG scan header | |
81 | * @num_components: Ns | |
82 | * @component: component-specification, see v4l2_jpeg_scan_component_spec | |
83 | */ | |
84 | struct v4l2_jpeg_scan_header { | |
85 | u8 num_components; /* Ns */ | |
86 | struct v4l2_jpeg_scan_component_spec component[V4L2_JPEG_MAX_COMPONENTS]; | |
87 | /* Ss, Se, Ah, and Al are not used by any driver */ | |
88 | }; | |
89 | ||
b8035f79 MR |
90 | /** |
91 | * enum v4l2_jpeg_app14_tf - APP14 transform flag | |
92 | * According to Rec. ITU-T T.872 (06/2012) 6.5.3 | |
93 | * APP14 segment is for color encoding, it contains a transform flag, | |
94 | * which may have values of 0, 1 and 2 and are interpreted as follows: | |
95 | * @V4L2_JPEG_APP14_TF_CMYK_RGB: CMYK for images encoded with four components | |
96 | * RGB for images encoded with three components | |
97 | * @V4L2_JPEG_APP14_TF_YCBCR: an image encoded with three components using YCbCr | |
98 | * @V4L2_JPEG_APP14_TF_YCCK: an image encoded with four components using YCCK | |
99 | * @V4L2_JPEG_APP14_TF_UNKNOWN: indicate app14 is not present | |
100 | */ | |
101 | enum v4l2_jpeg_app14_tf { | |
102 | V4L2_JPEG_APP14_TF_CMYK_RGB = 0, | |
103 | V4L2_JPEG_APP14_TF_YCBCR = 1, | |
104 | V4L2_JPEG_APP14_TF_YCCK = 2, | |
105 | V4L2_JPEG_APP14_TF_UNKNOWN = -1, | |
106 | }; | |
107 | ||
50733b5b PZ |
108 | /** |
109 | * struct v4l2_jpeg_header - parsed JPEG header | |
110 | * @sof: pointer to frame header and size | |
111 | * @sos: pointer to scan header and size | |
f12b81e4 | 112 | * @num_dht: number of entries in @dht |
50733b5b | 113 | * @dht: pointers to huffman tables and sizes |
f12b81e4 | 114 | * @num_dqt: number of entries in @dqt |
50733b5b PZ |
115 | * @dqt: pointers to quantization tables and sizes |
116 | * @frame: parsed frame header | |
117 | * @scan: pointer to parsed scan header, optional | |
118 | * @quantization_tables: references to four quantization tables, optional | |
119 | * @huffman_tables: references to four Huffman tables in DC0, DC1, AC0, AC1 | |
120 | * order, optional | |
121 | * @restart_interval: number of MCU per restart interval, Ri | |
122 | * @ecs_offset: buffer offset in bytes to the entropy coded segment | |
b8035f79 | 123 | * @app14_tf: transform flag from app14 data |
50733b5b PZ |
124 | * |
125 | * When this structure is passed to v4l2_jpeg_parse_header, the optional scan, | |
126 | * quantization_tables, and huffman_tables pointers must be initialized to NULL | |
127 | * or point at valid memory. | |
128 | */ | |
129 | struct v4l2_jpeg_header { | |
130 | struct v4l2_jpeg_reference sof; | |
131 | struct v4l2_jpeg_reference sos; | |
132 | unsigned int num_dht; | |
133 | struct v4l2_jpeg_reference dht[V4L2_JPEG_MAX_TABLES]; | |
134 | unsigned int num_dqt; | |
135 | struct v4l2_jpeg_reference dqt[V4L2_JPEG_MAX_TABLES]; | |
136 | ||
137 | struct v4l2_jpeg_frame_header frame; | |
138 | struct v4l2_jpeg_scan_header *scan; | |
139 | struct v4l2_jpeg_reference *quantization_tables; | |
140 | struct v4l2_jpeg_reference *huffman_tables; | |
141 | u16 restart_interval; | |
142 | size_t ecs_offset; | |
b8035f79 | 143 | enum v4l2_jpeg_app14_tf app14_tf; |
50733b5b PZ |
144 | }; |
145 | ||
146 | int v4l2_jpeg_parse_header(void *buf, size_t len, struct v4l2_jpeg_header *out); | |
147 | ||
148 | int v4l2_jpeg_parse_frame_header(void *buf, size_t len, | |
149 | struct v4l2_jpeg_frame_header *frame_header); | |
150 | int v4l2_jpeg_parse_scan_header(void *buf, size_t len, | |
151 | struct v4l2_jpeg_scan_header *scan_header); | |
152 | int v4l2_jpeg_parse_quantization_tables(void *buf, size_t len, u8 precision, | |
153 | struct v4l2_jpeg_reference *q_tables); | |
154 | int v4l2_jpeg_parse_huffman_tables(void *buf, size_t len, | |
155 | struct v4l2_jpeg_reference *huffman_tables); | |
156 | ||
157 | #endif |