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 | * Prefixes used to generate huffman table class and destination identifiers as |
19 | * described below: |
20 | * |
21 | * V4L2_JPEG_LUM_HT | V4L2_JPEG_DC_HT : Prefix for Luma DC coefficients |
22 | * huffman table |
23 | * V4L2_JPEG_LUM_HT | V4L2_JPEG_AC_HT : Prefix for Luma AC coefficients |
24 | * huffman table |
25 | * V4L2_JPEG_CHR_HT | V4L2_JPEG_DC_HT : Prefix for Chroma DC coefficients |
26 | * huffman table |
27 | * V4L2_JPEG_CHR_HT | V4L2_JPEG_AC_HT : Prefix for Chroma AC coefficients |
28 | * huffman table |
29 | */ |
30 | #define V4L2_JPEG_LUM_HT 0x00 |
31 | #define V4L2_JPEG_CHR_HT 0x01 |
32 | #define V4L2_JPEG_DC_HT 0x00 |
33 | #define V4L2_JPEG_AC_HT 0x10 |
34 | |
35 | /* Length of reference huffman tables as provided in Table K.3 of ITU-T.81 */ |
36 | #define V4L2_JPEG_REF_HT_AC_LEN 178 |
37 | #define V4L2_JPEG_REF_HT_DC_LEN 28 |
38 | |
39 | /* Array size for 8x8 block of samples or DCT coefficient */ |
40 | #define V4L2_JPEG_PIXELS_IN_BLOCK 64 |
41 | |
42 | /** |
43 | * struct v4l2_jpeg_reference - reference into the JPEG buffer |
44 | * @start: pointer to the start of the referenced segment or table |
45 | * @length: size of the referenced segment or table |
46 | * |
47 | * Wnen referencing marker segments, start points right after the marker code, |
48 | * and length is the size of the segment parameters, excluding the marker code. |
49 | */ |
50 | struct v4l2_jpeg_reference { |
51 | u8 *start; |
52 | size_t length; |
53 | }; |
54 | |
55 | /* B.2.2 Frame header syntax */ |
56 | |
57 | /** |
58 | * struct v4l2_jpeg_frame_component_spec - frame component-specification |
59 | * @component_identifier: C[i] |
60 | * @horizontal_sampling_factor: H[i] |
61 | * @vertical_sampling_factor: V[i] |
62 | * @quantization_table_selector: quantization table destination selector Tq[i] |
63 | */ |
64 | struct v4l2_jpeg_frame_component_spec { |
65 | u8 component_identifier; |
66 | u8 horizontal_sampling_factor; |
67 | u8 vertical_sampling_factor; |
68 | u8 quantization_table_selector; |
69 | }; |
70 | |
71 | /** |
72 | * struct v4l2_jpeg_frame_header - JPEG frame header |
73 | * @height: Y |
74 | * @width: X |
75 | * @precision: P |
76 | * @num_components: Nf |
77 | * @component: component-specification, see v4l2_jpeg_frame_component_spec |
78 | * @subsampling: decoded subsampling from component-specification |
79 | */ |
80 | struct { |
81 | u16 ; |
82 | u16 ; |
83 | u8 ; |
84 | u8 ; |
85 | struct v4l2_jpeg_frame_component_spec [V4L2_JPEG_MAX_COMPONENTS]; |
86 | enum v4l2_jpeg_chroma_subsampling ; |
87 | }; |
88 | |
89 | /* B.2.3 Scan header syntax */ |
90 | |
91 | /** |
92 | * struct v4l2_jpeg_scan_component_spec - scan component-specification |
93 | * @component_selector: Cs[j] |
94 | * @dc_entropy_coding_table_selector: Td[j] |
95 | * @ac_entropy_coding_table_selector: Ta[j] |
96 | */ |
97 | struct v4l2_jpeg_scan_component_spec { |
98 | u8 component_selector; |
99 | u8 dc_entropy_coding_table_selector; |
100 | u8 ac_entropy_coding_table_selector; |
101 | }; |
102 | |
103 | /** |
104 | * struct v4l2_jpeg_scan_header - JPEG scan header |
105 | * @num_components: Ns |
106 | * @component: component-specification, see v4l2_jpeg_scan_component_spec |
107 | */ |
108 | struct { |
109 | u8 ; /* Ns */ |
110 | struct v4l2_jpeg_scan_component_spec [V4L2_JPEG_MAX_COMPONENTS]; |
111 | /* Ss, Se, Ah, and Al are not used by any driver */ |
112 | }; |
113 | |
114 | /** |
115 | * enum v4l2_jpeg_app14_tf - APP14 transform flag |
116 | * According to Rec. ITU-T T.872 (06/2012) 6.5.3 |
117 | * APP14 segment is for color encoding, it contains a transform flag, |
118 | * which may have values of 0, 1 and 2 and are interpreted as follows: |
119 | * @V4L2_JPEG_APP14_TF_CMYK_RGB: CMYK for images encoded with four components |
120 | * RGB for images encoded with three components |
121 | * @V4L2_JPEG_APP14_TF_YCBCR: an image encoded with three components using YCbCr |
122 | * @V4L2_JPEG_APP14_TF_YCCK: an image encoded with four components using YCCK |
123 | * @V4L2_JPEG_APP14_TF_UNKNOWN: indicate app14 is not present |
124 | */ |
125 | enum v4l2_jpeg_app14_tf { |
126 | V4L2_JPEG_APP14_TF_CMYK_RGB = 0, |
127 | V4L2_JPEG_APP14_TF_YCBCR = 1, |
128 | V4L2_JPEG_APP14_TF_YCCK = 2, |
129 | V4L2_JPEG_APP14_TF_UNKNOWN = -1, |
130 | }; |
131 | |
132 | /** |
133 | * struct v4l2_jpeg_header - parsed JPEG header |
134 | * @sof: pointer to frame header and size |
135 | * @sos: pointer to scan header and size |
136 | * @num_dht: number of entries in @dht |
137 | * @dht: pointers to huffman tables and sizes |
138 | * @num_dqt: number of entries in @dqt |
139 | * @dqt: pointers to quantization tables and sizes |
140 | * @frame: parsed frame header |
141 | * @scan: pointer to parsed scan header, optional |
142 | * @quantization_tables: references to four quantization tables, optional |
143 | * @huffman_tables: references to four Huffman tables in DC0, DC1, AC0, AC1 |
144 | * order, optional |
145 | * @restart_interval: number of MCU per restart interval, Ri |
146 | * @ecs_offset: buffer offset in bytes to the entropy coded segment |
147 | * @app14_tf: transform flag from app14 data |
148 | * |
149 | * When this structure is passed to v4l2_jpeg_parse_header, the optional scan, |
150 | * quantization_tables, and huffman_tables pointers must be initialized to NULL |
151 | * or point at valid memory. |
152 | */ |
153 | struct { |
154 | struct v4l2_jpeg_reference ; |
155 | struct v4l2_jpeg_reference ; |
156 | unsigned int ; |
157 | struct v4l2_jpeg_reference [V4L2_JPEG_MAX_TABLES]; |
158 | unsigned int ; |
159 | struct v4l2_jpeg_reference [V4L2_JPEG_MAX_TABLES]; |
160 | |
161 | struct v4l2_jpeg_frame_header ; |
162 | struct v4l2_jpeg_scan_header *; |
163 | struct v4l2_jpeg_reference *; |
164 | struct v4l2_jpeg_reference *; |
165 | u16 ; |
166 | size_t ; |
167 | enum v4l2_jpeg_app14_tf ; |
168 | }; |
169 | |
170 | int (void *buf, size_t len, struct v4l2_jpeg_header *out); |
171 | |
172 | int (void *buf, size_t len, |
173 | struct v4l2_jpeg_frame_header *); |
174 | int (void *buf, size_t len, |
175 | struct v4l2_jpeg_scan_header *); |
176 | int v4l2_jpeg_parse_quantization_tables(void *buf, size_t len, u8 precision, |
177 | struct v4l2_jpeg_reference *q_tables); |
178 | int v4l2_jpeg_parse_huffman_tables(void *buf, size_t len, |
179 | struct v4l2_jpeg_reference *huffman_tables); |
180 | |
181 | extern const u8 v4l2_jpeg_zigzag_scan_index[V4L2_JPEG_PIXELS_IN_BLOCK]; |
182 | extern const u8 v4l2_jpeg_ref_table_luma_qt[V4L2_JPEG_PIXELS_IN_BLOCK]; |
183 | extern const u8 v4l2_jpeg_ref_table_chroma_qt[V4L2_JPEG_PIXELS_IN_BLOCK]; |
184 | extern const u8 v4l2_jpeg_ref_table_luma_dc_ht[V4L2_JPEG_REF_HT_DC_LEN]; |
185 | extern const u8 v4l2_jpeg_ref_table_luma_ac_ht[V4L2_JPEG_REF_HT_AC_LEN]; |
186 | extern const u8 v4l2_jpeg_ref_table_chroma_dc_ht[V4L2_JPEG_REF_HT_DC_LEN]; |
187 | extern const u8 v4l2_jpeg_ref_table_chroma_ac_ht[V4L2_JPEG_REF_HT_AC_LEN]; |
188 | |
189 | #endif |
190 | |