Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: v4l2-jpeg: Export reference quantization and huffman tables

Export reference quantization and huffman tables as provided in ITU-T.81 so
that they can be re-used by other JPEG drivers.

These are example tables provided in ITU-T.81 as reference tables and the
JPEG encoders are free to use either these or their own proprietary tables.

Also add necessary prefixes to be used for huffman tables in global header
file.

Signed-off-by: Devarsh Thakkar <devarsht@ti.com>
Reviewed-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Sebastian Fricke <sebastian.fricke@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>

authored by

Devarsh Thakkar and committed by
Hans Verkuil
b5bad839 a1e29404

+148
+116
drivers/media/v4l2-core/v4l2-jpeg.c
··· 52 52 #define COM 0xfffe /* comment */ 53 53 #define TEM 0xff01 /* temporary */ 54 54 55 + /* Luma and chroma qp tables to achieve 50% compression quality 56 + * This is as per example in Annex K.1 of ITU-T.81 57 + */ 58 + const u8 v4l2_jpeg_ref_table_luma_qt[V4L2_JPEG_PIXELS_IN_BLOCK] = { 59 + 16, 11, 10, 16, 24, 40, 51, 61, 60 + 12, 12, 14, 19, 26, 58, 60, 55, 61 + 14, 13, 16, 24, 40, 57, 69, 56, 62 + 14, 17, 22, 29, 51, 87, 80, 62, 63 + 18, 22, 37, 56, 68, 109, 103, 77, 64 + 24, 35, 55, 64, 81, 104, 113, 92, 65 + 49, 64, 78, 87, 103, 121, 120, 101, 66 + 72, 92, 95, 98, 112, 100, 103, 99 67 + }; 68 + EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_luma_qt); 69 + 70 + const u8 v4l2_jpeg_ref_table_chroma_qt[V4L2_JPEG_PIXELS_IN_BLOCK] = { 71 + 17, 18, 24, 47, 99, 99, 99, 99, 72 + 18, 21, 26, 66, 99, 99, 99, 99, 73 + 24, 26, 56, 99, 99, 99, 99, 99, 74 + 47, 66, 99, 99, 99, 99, 99, 99, 75 + 99, 99, 99, 99, 99, 99, 99, 99, 76 + 99, 99, 99, 99, 99, 99, 99, 99, 77 + 99, 99, 99, 99, 99, 99, 99, 99, 78 + 99, 99, 99, 99, 99, 99, 99, 99 79 + }; 80 + EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_chroma_qt); 81 + 82 + /* Zigzag scan pattern indexes */ 83 + const u8 v4l2_jpeg_zigzag_scan_index[V4L2_JPEG_PIXELS_IN_BLOCK] = { 84 + 0, 1, 8, 16, 9, 2, 3, 10, 85 + 17, 24, 32, 25, 18, 11, 4, 5, 86 + 12, 19, 26, 33, 40, 48, 41, 34, 87 + 27, 20, 13, 6, 7, 14, 21, 28, 88 + 35, 42, 49, 56, 57, 50, 43, 36, 89 + 29, 22, 15, 23, 30, 37, 44, 51, 90 + 58, 59, 52, 45, 38, 31, 39, 46, 91 + 53, 60, 61, 54, 47, 55, 62, 63 92 + }; 93 + EXPORT_SYMBOL_GPL(v4l2_jpeg_zigzag_scan_index); 94 + 95 + /* 96 + * Contains the data that needs to be sent in the marker segment of an 97 + * interchange format JPEG stream or an abbreviated format table specification 98 + * data stream. Specifies the huffman table used for encoding the luminance DC 99 + * coefficient differences. The table represents Table K.3 of ITU-T.81 100 + */ 101 + const u8 v4l2_jpeg_ref_table_luma_dc_ht[V4L2_JPEG_REF_HT_DC_LEN] = { 102 + 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 103 + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 104 + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B 105 + }; 106 + EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_luma_dc_ht); 107 + 108 + /* 109 + * Contains the data that needs to be sent in the marker segment of an 110 + * interchange format JPEG stream or an abbreviated format table specification 111 + * data stream. Specifies the huffman table used for encoding the luminance AC 112 + * coefficients. The table represents Table K.5 of ITU-T.81 113 + */ 114 + const u8 v4l2_jpeg_ref_table_luma_ac_ht[V4L2_JPEG_REF_HT_AC_LEN] = { 115 + 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 116 + 0x00, 0x00, 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 117 + 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 118 + 0x81, 0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 119 + 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 120 + 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 121 + 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 122 + 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 123 + 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85, 124 + 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 125 + 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 126 + 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 127 + 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 128 + 0xD9, 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 129 + 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA 130 + }; 131 + EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_luma_ac_ht); 132 + 133 + /* 134 + * Contains the data that needs to be sent in the marker segment of an interchange format JPEG 135 + * stream or an abbreviated format table specification data stream. 136 + * Specifies the huffman table used for encoding the chrominance DC coefficient differences. 137 + * The table represents Table K.4 of ITU-T.81 138 + */ 139 + const u8 v4l2_jpeg_ref_table_chroma_dc_ht[V4L2_JPEG_REF_HT_DC_LEN] = { 140 + 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 141 + 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 142 + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B 143 + }; 144 + EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_chroma_dc_ht); 145 + 146 + /* 147 + * Contains the data that needs to be sent in the marker segment of an 148 + * interchange format JPEG stream or an abbreviated format table specification 149 + * data stream. Specifies the huffman table used for encoding the chrominance 150 + * AC coefficients. The table represents Table K.6 of ITU-T.81 151 + */ 152 + const u8 v4l2_jpeg_ref_table_chroma_ac_ht[V4L2_JPEG_REF_HT_AC_LEN] = { 153 + 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 154 + 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 155 + 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 156 + 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0, 157 + 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 158 + 0x18, 0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 159 + 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 160 + 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 161 + 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 162 + 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 163 + 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 164 + 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 165 + 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 166 + 0xD7, 0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 167 + 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA 168 + }; 169 + EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_chroma_ac_ht); 170 + 55 171 /** 56 172 * struct jpeg_stream - JPEG byte stream 57 173 * @curr: current position in stream
+32
include/media/v4l2-jpeg.h
··· 14 14 15 15 #define V4L2_JPEG_MAX_COMPONENTS 4 16 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 17 41 18 42 /** 19 43 * struct v4l2_jpeg_reference - reference into the JPEG buffer ··· 177 153 struct v4l2_jpeg_reference *q_tables); 178 154 int v4l2_jpeg_parse_huffman_tables(void *buf, size_t len, 179 155 struct v4l2_jpeg_reference *huffman_tables); 156 + 157 + extern const u8 v4l2_jpeg_zigzag_scan_index[V4L2_JPEG_PIXELS_IN_BLOCK]; 158 + extern const u8 v4l2_jpeg_ref_table_luma_qt[V4L2_JPEG_PIXELS_IN_BLOCK]; 159 + extern const u8 v4l2_jpeg_ref_table_chroma_qt[V4L2_JPEG_PIXELS_IN_BLOCK]; 160 + extern const u8 v4l2_jpeg_ref_table_luma_dc_ht[V4L2_JPEG_REF_HT_DC_LEN]; 161 + extern const u8 v4l2_jpeg_ref_table_luma_ac_ht[V4L2_JPEG_REF_HT_AC_LEN]; 162 + extern const u8 v4l2_jpeg_ref_table_chroma_dc_ht[V4L2_JPEG_REF_HT_DC_LEN]; 163 + extern const u8 v4l2_jpeg_ref_table_chroma_ac_ht[V4L2_JPEG_REF_HT_AC_LEN]; 180 164 181 165 #endif