2626/* COMPONENT DEFINITION RELEASE */
2727/* */
2828/* gx_image_reader.h PORTABLE C */
29- /* 6.2.0 */
29+ /* 6.x */
3030/* AUTHOR */
3131/* */
3232/* Kenneth Maxwell, Microsoft Corporation */
5252/* added definitions for fixed */
5353/* size table dimensions, */
5454/* resulting in version 6.2.0 */
55+ /* xx-xx-xxxx Ting Zhu Modified comment(s), added */
56+ /* support for ARM Helium, */
57+ /* resulting in version 6.x */
5558/* */
5659/**************************************************************************/
5760#if defined(GX_SOFTWARE_DECODER_SUPPORT )
5861#ifndef GX_IMAGE_READER_H
5962#define GX_IMAGE_READER_H
6063
64+ #if defined(GX_ENABLE_ARM_HELIUM )
65+ #include <arm_mve.h>
66+ #endif
67+
6168#define GX_IMAGE_FORMAT_1BPP 0xf0
6269#define GX_IMAGE_FORMAT_2BPP 0xf1
6370#define GX_IMAGE_FORMAT_4BPP 0xf2
8390 GX_PNG_HUFFMAN_LIT_CODE_LEN_TABLE_SIZE + \
8491 GX_PNG_HUFFMAN_DIST_CODE_LEN_TABLE_SIZE + \
8592 GX_PNG_PALETTE_TABLE_SIZE)
86- #define JPG_MAX_COMPONENTS 3
87- #define HUFF_TABLE_DIMENSION 2
88- #define JPG_QUANT_TABLE_DIMENSION 4
93+ #define JPG_MAX_COMPONENTS 3
94+ #define HUFF_TABLE_DIMENSION 2
95+ #define JPG_QUANT_TABLE_DIMENSION 4
8996
9097/* Control block used internally for jpeg reader. */
98+ typedef struct GX_HUFFCODE_INFO_STRUCT
99+ {
100+ USHORT start ;
101+ USHORT end ;
102+ USHORT index ;
103+ GX_UBYTE bits ;
104+ } GX_HUFFCODE_INFO ;
91105
92106typedef struct GX_JPEG_INFO_STRUCT
93107{
94- UINT (* gx_jpeg_mcu_draw )(struct GX_JPEG_INFO_STRUCT * , INT , INT );
95108 USHORT gx_jpeg_width ;
96109 USHORT gx_jpeg_height ;
97110 INT gx_jpeg_num_of_components ;
@@ -101,22 +114,35 @@ typedef struct GX_JPEG_INFO_STRUCT
101114 GX_UBYTE gx_jpeg_dc_table_index [JPG_MAX_COMPONENTS ];
102115 GX_UBYTE gx_jpeg_ac_table_index [JPG_MAX_COMPONENTS ];
103116 INT gx_jpeg_quantization_table [JPG_QUANT_TABLE_DIMENSION ][64 ];
104- INT * gx_jpeg_huffman_table [HUFF_TABLE_DIMENSION ][HUFF_TABLE_DIMENSION ];
105- GX_VALUE gx_jpeg_huffman_bits_count [HUFF_TABLE_DIMENSION ][HUFF_TABLE_DIMENSION ][16 ];
117+ GX_UBYTE * gx_jpeg_huffman_table [HUFF_TABLE_DIMENSION ][HUFF_TABLE_DIMENSION ];
118+ GX_HUFFCODE_INFO gx_jpeg_huffman_code_info [HUFF_TABLE_DIMENSION ][HUFF_TABLE_DIMENSION ][16 ];
106119 INT gx_jpeg_restart_interval ;
107- GX_UBYTE gx_jpeg_Y_block [256 ];
108- GX_UBYTE gx_jpeg_Cr_block [64 ];
109- GX_UBYTE gx_jpeg_Cb_block [64 ];
120+ GX_BYTE gx_jpeg_Y_block [256 ];
121+ GX_BYTE gx_jpeg_Cr_block [64 ];
122+ GX_BYTE gx_jpeg_Cb_block [64 ];
110123 INT gx_jpeg_pre_dc [JPG_MAX_COMPONENTS ];
111124 INT gx_jpeg_vecter [64 ];
112125 GX_UBYTE * gx_jpeg_data ;
113126 INT gx_jpeg_data_size ;
114127 INT gx_jpeg_data_index ;
115- GX_UBYTE * gx_jpeg_decoded_data ;
116- UINT gx_jpeg_decoded_data_size ;
117- GX_DRAW_CONTEXT * gx_jpeg_draw_context ;
118- INT gx_jpeg_draw_xpos ;
119- INT gx_jpeg_draw_ypos ;
128+ UINT gx_jpeg_bit_buffer ;
129+ UINT gx_jpeg_bit_count ;
130+ #if defined(GX_ENABLE_ARM_HELIUM )
131+ VOID (* gx_jpeg_pixel_write_helium )(struct GX_JPEG_INFO_STRUCT * jpeg_info , uint8x16_t vred , uint8x16_t vgreen , uint8x16_t vblue , INT size );
132+ #else
133+ VOID (* gx_jpeg_pixel_write )(struct GX_JPEG_INFO_STRUCT * jpeg_info , GX_UBYTE red , GX_UBYTE green , GX_UBYTE blue );
134+ #endif
135+ GX_UBYTE * gx_jpeg_output_buffer ;
136+ USHORT gx_jpeg_output_width ;
137+ USHORT gx_jpeg_output_height ;
138+ INT gx_jpeg_output_stride ;
139+ GX_RECTANGLE gx_jpeg_output_clip ;
140+ INT gx_jpeg_output_xpos ;
141+ INT gx_jpeg_output_ypos ;
142+ GX_UBYTE gx_jpeg_output_bpp ;
143+ GX_UBYTE gx_jpeg_output_color_format ;
144+ USHORT gx_jpeg_output_rotation_angle ;
145+ GX_UBYTE * gx_jpeg_putdata ;
120146} GX_JPEG_INFO ;
121147
122148/* control block used internally for png reader */
@@ -165,11 +191,9 @@ UINT _gx_image_reader_create(GX_IMAGE_READER *image_reader,
165191
166192/* Define internal function prototypes. */
167193UINT _gx_image_reader_png_decode (GX_CONST GX_UBYTE * read_data , ULONG read_data_size , GX_PIXELMAP * outmap );
168- UINT _gx_image_reader_jpeg_decode (GX_CONST GX_UBYTE * read_data , ULONG data_size , GX_PIXELMAP * outmap );
169- UINT _gx_image_reader_jpeg_mcu_decode (GX_CONST GX_UBYTE * read_data , ULONG data_size ,
170- GX_DRAW_CONTEXT * context , INT xpos , INT ypos ,
171- UINT (draw_function )(GX_JPEG_INFO * , INT , INT ));
172-
194+ UINT _gx_image_reader_jpeg_decode (GX_IMAGE_READER * image_reader , GX_PIXELMAP * outmap );
195+ UINT _gx_image_reader_jpeg_mcu_decode (GX_CONST GX_UBYTE * read_data , ULONG data_size ,
196+ GX_DRAW_CONTEXT * context , INT xpos , INT ypos );
173197
174198UINT _gx_image_reader_pixel_read_callback_set (GX_IMAGE_READER * image_reader , GX_PIXELMAP * outmap );
175199UINT _gx_image_reader_pixel_write_callback_set (GX_IMAGE_READER * image_reader , GX_PIXELMAP * outmap );
@@ -194,6 +218,90 @@ UINT _gxe_image_reader_palette_set(GX_IMAGE_READER *image_reader, GX_COLOR *pal,
194218UINT _gxe_image_reader_start (GX_IMAGE_READER * image_reader , GX_PIXELMAP * outmap );
195219
196220
197- #endif
198- #endif
221+ #define GX_JPEG_DECODE_YCBCR2RGB (red , green , blue , y , cb , cr ) \
222+ red = y + cr + (cr >> 2) + (cr >> 3) + 128; \
223+ green = y - ((cb >> 2) + (cb >> 4) + (cb >> 5)) - ((cr >> 1) + (cr >> 3) + (cr >> 4) + (cr >> 5)) + 128; \
224+ blue = y + cb + (cb >> 1) + (cb >> 2) + (cb >> 6) + 128;
225+
226+ #if defined(GX_ENABLE_ARM_HELIUM )
227+
228+ /* This offset table contains four offset vectors that used to gather load 16 cb/cr values to a 8x16 vector.
229+ The table index represents the subsampling factor in horizontal. */
230+ static uint8x16_t _gx_jpeg_cbcr_offset_table [7 ] = {
231+ {0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, /* h = 1 */
232+ {0 , 0 , 1 , 1 , 2 , 2 , 3 , 3 , 4 , 4 , 5 , 5 , 6 , 6 , 7 , 7 }, /* h = 2 */
233+ {0 , 1 , 1 , 2 , 2 , 3 , 3 , 4 , 4 , 5 , 5 , 6 , 6 , 7 , 7 , 7 }, /* h = 2 */
234+ {0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 }, /* h = 4 */
235+ {0 , 0 , 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 4 }, /* h = 4 */
236+ {0 , 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 }, /* h = 4 */
237+ {0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 }, /* h = 4 */
238+ };
239+
240+ static uint8x16_t _gx_jpeg_cbcr_offset_rotated_table_cw [3 ] = {
241+ {0 , 8 , 16 , 24 , 32 , 40 , 48 , 56 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, /* cw, v = 1 */
242+ {0 , 0 , 8 , 8 , 16 , 16 , 24 , 24 , 32 , 32 , 40 , 40 , 48 , 48 , 56 , 56 }, /* cw, v = 2 */
243+ {0 , 8 , 8 , 16 , 16 , 24 , 24 , 32 , 32 , 40 , 40 , 48 , 48 , 56 , 56 , 56 } /* cw, v = 2 */
244+ };
245+
246+ static uint8x16_t _gx_jpeg_cbcr_offset_rotated_table_ccw [2 ] = {
247+ {56 , 48 , 40 , 32 , 24 , 16 , 8 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, /* ccw, v = 1 */
248+ {56 , 56 , 48 , 48 , 40 , 40 , 32 , 32 , 24 , 24 , 16 , 16 , 8 , 8 , 0 , 0 }, /* ccw, v = 2 */
249+ };
250+
251+ static uint8x16_t _gx_jpeg_y_offset_rotated_table_cw [3 ] = {
252+ {0 , 8 , 16 , 24 , 32 , 40 , 48 , 56 , 64 , 72 , 80 , 88 , 96 , 104 , 112 , 120 }, /* cw, h = 1, v = 1 */
253+ {0 , 16 , 32 , 48 , 64 , 80 , 96 , 112 , 128 , 144 , 160 , 176 , 192 , 208 , 224 , 240 }, /* cw, h = 2, v = 1 or v = 2 */
254+ {0 , 32 , 64 , 96 , 128 , 160 , 192 , 224 , 224 , 224 , 224 , 224 , 224 , 224 , 224 , 224 } /* cw, h = 4, v = 1 */
255+ };
256+
257+ static uint8x16_t _gx_jpeg_y_offset_rotated_table_ccw [4 ] = {
258+ {56 , 48 , 40 , 32 , 24 , 16 , 8 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, /* ccw, h = 1, v = 1 */
259+ {112 , 96 , 80 , 64 , 48 , 32 , 16 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, /* ccw, h = 2, v = 1 */
260+ {240 , 224 , 208 , 192 , 176 , 160 , 144 , 128 , 112 , 96 , 80 , 64 , 48 , 32 , 16 , 0 }, /* ccw, h = 2, v = 2 */
261+ {224 , 192 , 160 , 128 , 96 , 64 , 32 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } /* ccw, h = 4, v = 1 */
262+ };
263+
264+
265+ #define GX_JPEG_DECODE_YCBCR2RGB_HELIUM (vred , vgreen , vblue , y , cb , cr ) \
266+ { \
267+ int8x16_t vt; \
268+ vred = (uint8x16_t)vqaddq_s8(y, cr); \
269+ vt = vshrq_n_s8(cr, 2); \
270+ vred = (uint8x16_t)vqaddq_s8((int8x16_t)vred, vt); \
271+ vt = vshrq_n_s8(cr, 3); \
272+ vred = (uint8x16_t)vqaddq_s8((int8x16_t)vred, vt); \
273+ vred = vaddq_n_u8(vred, 128); \
274+ \
275+ vt = vshrq_n_s8(cb, 2); \
276+ vgreen = (uint8x16_t)vshrq_n_s8(cb, 4); \
277+ vgreen = (uint8x16_t)vqaddq_s8((int8x16_t)vgreen, vt); \
278+ vt = vshrq_n_s8(cb, 5); \
279+ vgreen = (uint8x16_t)vqaddq_s8((int8x16_t)vgreen, vt); \
280+ vt = vshrq_n_s8(cr, 1); \
281+ vgreen = (uint8x16_t)vqaddq_s8((int8x16_t)vgreen, vt); \
282+ vt = vshrq_n_s8(cr, 3); \
283+ vgreen = (uint8x16_t)vqaddq_s8((int8x16_t)vgreen, vt); \
284+ vt = vshrq_n_s8(cr, 4); \
285+ vgreen = (uint8x16_t)vqaddq_s8((int8x16_t)vgreen, vt); \
286+ vt = vshrq_n_s8(cr, 5); \
287+ vgreen = (uint8x16_t)vqaddq_s8((int8x16_t)vgreen, vt); \
288+ vgreen = (uint8x16_t)vqsubq_s8(y, (int8x16_t)vgreen); \
289+ vgreen = vaddq_n_u8(vgreen, 128); \
290+ \
291+ vblue = (uint8x16_t)vqaddq_s8(y, cb); \
292+ vt = vshrq_n_s8(cb, 1); \
293+ vblue = (uint8x16_t)vqaddq_s8((int8x16_t)vblue, vt); \
294+ vt = vshrq_n_s8(cb, 2); \
295+ vblue = (uint8x16_t)vqaddq_s8((int8x16_t)vblue, vt); \
296+ vt = vshrq_n_s8(cb, 6); \
297+ vblue = (uint8x16_t)vqaddq_s8((int8x16_t)vblue, vt); \
298+ vblue = vaddq_n_u8(vblue, 128); \
299+ }
300+
301+
302+ #endif /* GX_ENABLE_ARM_HELIUM */
303+
304+ #endif /* GX_IMAGE_READER_H */
305+
306+ #endif /* GX_SOFTWARE_DECODER_SUPPORT */
199307
0 commit comments