| 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 | extern const u8 v4l2_jpeg_zigzag_scan_index[V4L2_JPEG_PIXELS_IN_BLOCK]; |
| 173 | extern const u8 v4l2_jpeg_ref_table_luma_qt[V4L2_JPEG_PIXELS_IN_BLOCK]; |
| 174 | extern const u8 v4l2_jpeg_ref_table_chroma_qt[V4L2_JPEG_PIXELS_IN_BLOCK]; |
| 175 | extern const u8 v4l2_jpeg_ref_table_luma_dc_ht[V4L2_JPEG_REF_HT_DC_LEN]; |
| 176 | extern const u8 v4l2_jpeg_ref_table_luma_ac_ht[V4L2_JPEG_REF_HT_AC_LEN]; |
| 177 | extern const u8 v4l2_jpeg_ref_table_chroma_dc_ht[V4L2_JPEG_REF_HT_DC_LEN]; |
| 178 | extern const u8 v4l2_jpeg_ref_table_chroma_ac_ht[V4L2_JPEG_REF_HT_AC_LEN]; |
| 179 | |
| 180 | #endif |
| 181 | |