1*437bfbebSnyanmisaka /* 2*437bfbebSnyanmisaka * 3*437bfbebSnyanmisaka * Copyright 2015 Rockchip Electronics Co. LTD 4*437bfbebSnyanmisaka * 5*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License"); 6*437bfbebSnyanmisaka * you may not use this file except in compliance with the License. 7*437bfbebSnyanmisaka * You may obtain a copy of the License at 8*437bfbebSnyanmisaka * 9*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0 10*437bfbebSnyanmisaka * 11*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software 12*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS, 13*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*437bfbebSnyanmisaka * See the License for the specific language governing permissions and 15*437bfbebSnyanmisaka * limitations under the License. 16*437bfbebSnyanmisaka */ 17*437bfbebSnyanmisaka 18*437bfbebSnyanmisaka #ifndef __JPEGD_SYNTAX__ 19*437bfbebSnyanmisaka #define __JPEGD_SYNTAX__ 20*437bfbebSnyanmisaka 21*437bfbebSnyanmisaka #include "mpp_frame.h" 22*437bfbebSnyanmisaka 23*437bfbebSnyanmisaka #define JPEGDEC_YUV400 (0) 24*437bfbebSnyanmisaka #define JPEGDEC_YUV420 (2) 25*437bfbebSnyanmisaka #define JPEGDEC_YUV422 (3) 26*437bfbebSnyanmisaka #define JPEGDEC_YUV444 (4) 27*437bfbebSnyanmisaka #define JPEGDEC_YUV440 (5) 28*437bfbebSnyanmisaka #define JPEGDEC_YUV411 (6) 29*437bfbebSnyanmisaka 30*437bfbebSnyanmisaka #define DCT_SAMPLE_PRECISION_8 (8) 31*437bfbebSnyanmisaka 32*437bfbebSnyanmisaka #define JPEGD_STREAM_BUFF_SIZE (512*1024) 33*437bfbebSnyanmisaka #define MAX_COMPONENTS (3) /* for JFIF: YCbCr */ 34*437bfbebSnyanmisaka #define DRI_MARKER_LENGTH (4) /* must be 4 bytes */ 35*437bfbebSnyanmisaka #define QUANTIZE_TABLE_LENGTH (64) 36*437bfbebSnyanmisaka #define MAX_AC_HUFFMAN_TABLE_LENGTH (162) /* for baseline */ 37*437bfbebSnyanmisaka #define MAX_DC_HUFFMAN_TABLE_LENGTH (12) /* for baseline */ 38*437bfbebSnyanmisaka #define MAX_HUFFMAN_CODE_BIT_LENGTH (16) /* The longest code word is 16 bits */ 39*437bfbebSnyanmisaka #define ZERO_PADDING_LENGTH (4) /* 4 Bytes */ 40*437bfbebSnyanmisaka #define JPEGD_BASELINE_TABLE_SIZE (QUANTIZE_TABLE_LENGTH * 3 \ 41*437bfbebSnyanmisaka + MAX_AC_HUFFMAN_TABLE_LENGTH * 2 \ 42*437bfbebSnyanmisaka + MAX_DC_HUFFMAN_TABLE_LENGTH * 2 \ 43*437bfbebSnyanmisaka + ZERO_PADDING_LENGTH) /* 544 Bytes */ 44*437bfbebSnyanmisaka 45*437bfbebSnyanmisaka #define JPEGD_DBG_FUNCTION (0x00000001) 46*437bfbebSnyanmisaka #define JPEGD_DBG_STARTCODE (0x00000002) 47*437bfbebSnyanmisaka #define JPEGD_DBG_TABLE (0x00000004) 48*437bfbebSnyanmisaka #define JPEGD_DBG_RESULT (0x00000008) 49*437bfbebSnyanmisaka #define JPEGD_DBG_IO (0x00000010) /* input and output write file */ 50*437bfbebSnyanmisaka #define JPEGD_DBG_PARSER_INFO (0x00000020) /* parser information */ 51*437bfbebSnyanmisaka #define JPEGD_DBG_SYNTAX_ERR (0x00000040) /* syntax error */ 52*437bfbebSnyanmisaka #define JPEGD_DBG_HAL_INFO (0x00000080) /* hal information */ 53*437bfbebSnyanmisaka #define JPEGD_DBG_HAL_TBL (0x00000100) /* hal information */ 54*437bfbebSnyanmisaka 55*437bfbebSnyanmisaka extern RK_U32 jpegd_debug; 56*437bfbebSnyanmisaka 57*437bfbebSnyanmisaka #define jpegd_dbg(flag, fmt, ...) _mpp_dbg(jpegd_debug, flag, fmt, ## __VA_ARGS__) 58*437bfbebSnyanmisaka #define jpegd_dbg_f(flag, fmt, ...) _mpp_dbg_f(jpegd_debug, flag, fmt, ## __VA_ARGS__) 59*437bfbebSnyanmisaka 60*437bfbebSnyanmisaka #define jpegd_dbg_func(fmt, ...) jpegd_dbg_f(JPEGD_DBG_FUNCTION, fmt, ## __VA_ARGS__) 61*437bfbebSnyanmisaka #define jpegd_dbg_marker(fmt, ...) jpegd_dbg(JPEGD_DBG_STARTCODE, fmt, ## __VA_ARGS__) 62*437bfbebSnyanmisaka #define jpegd_dbg_table(fmt, ...) jpegd_dbg(JPEGD_DBG_TABLE, fmt, ## __VA_ARGS__) 63*437bfbebSnyanmisaka #define jpegd_dbg_result(fmt, ...) jpegd_dbg(JPEGD_DBG_RESULT, fmt, ## __VA_ARGS__) 64*437bfbebSnyanmisaka #define jpegd_dbg_io(fmt, ...) jpegd_dbg(JPEGD_DBG_IO, fmt, ## __VA_ARGS__) 65*437bfbebSnyanmisaka #define jpegd_dbg_parser(fmt, ...) jpegd_dbg(JPEGD_DBG_PARSER_INFO, fmt, ## __VA_ARGS__) 66*437bfbebSnyanmisaka #define jpegd_dbg_syntax(fmt, ...) jpegd_dbg(JPEGD_DBG_SYNTAX_ERR, fmt, ## __VA_ARGS__) 67*437bfbebSnyanmisaka #define jpegd_dbg_hal(fmt, ...) jpegd_dbg(JPEGD_DBG_HAL_INFO, fmt, ## __VA_ARGS__) 68*437bfbebSnyanmisaka 69*437bfbebSnyanmisaka 70*437bfbebSnyanmisaka enum huffman_table_type { 71*437bfbebSnyanmisaka HUFFMAN_TABLE_TYPE_DC = 0, 72*437bfbebSnyanmisaka HUFFMAN_TABLE_TYPE_AC = 1, 73*437bfbebSnyanmisaka HUFFMAN_TABLE_TYPE_BUTT = 2, 74*437bfbebSnyanmisaka }; 75*437bfbebSnyanmisaka 76*437bfbebSnyanmisaka enum huffman_table_id { 77*437bfbebSnyanmisaka HUFFMAN_TABLE_ID_ZERO = 0, 78*437bfbebSnyanmisaka HUFFMAN_TABLE_ID_ONE = 1, 79*437bfbebSnyanmisaka HUFFMAN_TABLE_ID_TWO = 2, 80*437bfbebSnyanmisaka HUFFMAN_TABLE_ID_THREE = 3, 81*437bfbebSnyanmisaka HUFFMAN_TABLE_ID_BUTT = 4, 82*437bfbebSnyanmisaka }; 83*437bfbebSnyanmisaka 84*437bfbebSnyanmisaka enum quantize_table_id { 85*437bfbebSnyanmisaka QUANTIZE_TABLE_ID_ZERO = 0, 86*437bfbebSnyanmisaka QUANTIZE_TABLE_ID_ONE = 1, 87*437bfbebSnyanmisaka QUANTIZE_TABLE_ID_TWO = 2, 88*437bfbebSnyanmisaka QUANTIZE_TABLE_ID_THREE = 3, 89*437bfbebSnyanmisaka QUANTIZE_TABLE_ID_BUTT = 4, 90*437bfbebSnyanmisaka }; 91*437bfbebSnyanmisaka 92*437bfbebSnyanmisaka /* Alternating Current Table */ 93*437bfbebSnyanmisaka typedef struct { 94*437bfbebSnyanmisaka RK_U32 bits[MAX_HUFFMAN_CODE_BIT_LENGTH]; 95*437bfbebSnyanmisaka RK_U32 vals[MAX_AC_HUFFMAN_TABLE_LENGTH]; 96*437bfbebSnyanmisaka RK_U32 actual_length; /* calculate based on actual stream */ 97*437bfbebSnyanmisaka } AcTable; 98*437bfbebSnyanmisaka 99*437bfbebSnyanmisaka /* Direct Current Table */ 100*437bfbebSnyanmisaka typedef struct { 101*437bfbebSnyanmisaka RK_U32 bits[MAX_HUFFMAN_CODE_BIT_LENGTH]; 102*437bfbebSnyanmisaka RK_U32 vals[MAX_DC_HUFFMAN_TABLE_LENGTH]; 103*437bfbebSnyanmisaka RK_U32 actual_length; /* calculate based on actual stream */ 104*437bfbebSnyanmisaka } DcTable; 105*437bfbebSnyanmisaka 106*437bfbebSnyanmisaka typedef struct JpegdSyntax { 107*437bfbebSnyanmisaka /* just 16 bits because quantization parameters are much less than 2^16 */ 108*437bfbebSnyanmisaka RK_U16 quant_matrixes[4][QUANTIZE_TABLE_LENGTH]; 109*437bfbebSnyanmisaka 110*437bfbebSnyanmisaka /* only two ac table for baseline */ 111*437bfbebSnyanmisaka AcTable ac_table[2]; 112*437bfbebSnyanmisaka 113*437bfbebSnyanmisaka /* only two dc table for baseline */ 114*437bfbebSnyanmisaka DcTable dc_table[2]; 115*437bfbebSnyanmisaka 116*437bfbebSnyanmisaka /* quantizer scale calculated from quant_matrixes */ 117*437bfbebSnyanmisaka RK_U32 qscale[4]; 118*437bfbebSnyanmisaka 119*437bfbebSnyanmisaka /* output format */ 120*437bfbebSnyanmisaka MppFrameFormat output_fmt; 121*437bfbebSnyanmisaka 122*437bfbebSnyanmisaka /* especially for jpeg */ 123*437bfbebSnyanmisaka RK_U32 yuv_mode; 124*437bfbebSnyanmisaka RK_U8 fill_bottom; 125*437bfbebSnyanmisaka RK_U8 fill_right; 126*437bfbebSnyanmisaka 127*437bfbebSnyanmisaka /* syntax in SOS */ 128*437bfbebSnyanmisaka RK_U8 scan_start; 129*437bfbebSnyanmisaka RK_U8 scan_end; 130*437bfbebSnyanmisaka RK_U8 prev_shift; /* Ah */ 131*437bfbebSnyanmisaka RK_U8 point_transform; /* Al */ 132*437bfbebSnyanmisaka 133*437bfbebSnyanmisaka /* 0 - not found; 1 - found */ 134*437bfbebSnyanmisaka RK_U8 dht_found; 135*437bfbebSnyanmisaka RK_U8 eoi_found; 136*437bfbebSnyanmisaka RK_U8 sof0_found; 137*437bfbebSnyanmisaka 138*437bfbebSnyanmisaka /* amount of quantize tables: 1 or 3 */ 139*437bfbebSnyanmisaka RK_U8 qtable_cnt; 140*437bfbebSnyanmisaka 141*437bfbebSnyanmisaka /* length of sos segment */ 142*437bfbebSnyanmisaka RK_U32 sos_len; 143*437bfbebSnyanmisaka 144*437bfbebSnyanmisaka /* decoded bytes by software */ 145*437bfbebSnyanmisaka RK_U32 strm_offset; 146*437bfbebSnyanmisaka 147*437bfbebSnyanmisaka /* hardware decode start address */ 148*437bfbebSnyanmisaka RK_U8 *cur_pos; 149*437bfbebSnyanmisaka 150*437bfbebSnyanmisaka /* length of a jpeg packet */ 151*437bfbebSnyanmisaka RK_U32 pkt_len; 152*437bfbebSnyanmisaka 153*437bfbebSnyanmisaka /* Horizontal pixel density */ 154*437bfbebSnyanmisaka RK_U16 hor_density; 155*437bfbebSnyanmisaka 156*437bfbebSnyanmisaka /* Vertical pixel density */ 157*437bfbebSnyanmisaka RK_U16 ver_density; 158*437bfbebSnyanmisaka 159*437bfbebSnyanmisaka RK_U32 width, height; 160*437bfbebSnyanmisaka RK_U32 hor_stride, ver_stride; 161*437bfbebSnyanmisaka 162*437bfbebSnyanmisaka /* Number of components in frame */ 163*437bfbebSnyanmisaka RK_U32 nb_components; 164*437bfbebSnyanmisaka 165*437bfbebSnyanmisaka /* Component id */ 166*437bfbebSnyanmisaka RK_U32 component_id[MAX_COMPONENTS]; 167*437bfbebSnyanmisaka 168*437bfbebSnyanmisaka /* Horizontal sampling factor */ 169*437bfbebSnyanmisaka RK_U32 h_count[MAX_COMPONENTS]; 170*437bfbebSnyanmisaka 171*437bfbebSnyanmisaka /* Vertical sampling factor */ 172*437bfbebSnyanmisaka RK_U32 v_count[MAX_COMPONENTS]; 173*437bfbebSnyanmisaka 174*437bfbebSnyanmisaka /* Huffman Table ID used by DC */ 175*437bfbebSnyanmisaka RK_U32 dc_index[MAX_COMPONENTS]; 176*437bfbebSnyanmisaka 177*437bfbebSnyanmisaka /* Huffman Table ID used by AC */ 178*437bfbebSnyanmisaka RK_U32 ac_index[MAX_COMPONENTS]; 179*437bfbebSnyanmisaka 180*437bfbebSnyanmisaka /* maximum h and v counts */ 181*437bfbebSnyanmisaka RK_U32 h_max, v_max; 182*437bfbebSnyanmisaka 183*437bfbebSnyanmisaka /* quant table index for each component */ 184*437bfbebSnyanmisaka RK_U32 quant_index[MAX_COMPONENTS]; 185*437bfbebSnyanmisaka 186*437bfbebSnyanmisaka RK_U32 restart_interval; 187*437bfbebSnyanmisaka 188*437bfbebSnyanmisaka RK_U8 sample_precision; 189*437bfbebSnyanmisaka RK_U8 qtbl_entry; 190*437bfbebSnyanmisaka RK_U8 htbl_entry; 191*437bfbebSnyanmisaka } JpegdSyntax; 192*437bfbebSnyanmisaka 193*437bfbebSnyanmisaka #endif /*__JPEGD_SYNTAX__*/ 194