/* * * Copyright 2015 Rockchip Electronics Co. LTD * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __JPEGD_SYNTAX__ #define __JPEGD_SYNTAX__ #include "mpp_frame.h" #define JPEGDEC_YUV400 (0) #define JPEGDEC_YUV420 (2) #define JPEGDEC_YUV422 (3) #define JPEGDEC_YUV444 (4) #define JPEGDEC_YUV440 (5) #define JPEGDEC_YUV411 (6) #define DCT_SAMPLE_PRECISION_8 (8) #define JPEGD_STREAM_BUFF_SIZE (512*1024) #define MAX_COMPONENTS (3) /* for JFIF: YCbCr */ #define DRI_MARKER_LENGTH (4) /* must be 4 bytes */ #define QUANTIZE_TABLE_LENGTH (64) #define MAX_AC_HUFFMAN_TABLE_LENGTH (162) /* for baseline */ #define MAX_DC_HUFFMAN_TABLE_LENGTH (12) /* for baseline */ #define MAX_HUFFMAN_CODE_BIT_LENGTH (16) /* The longest code word is 16 bits */ #define ZERO_PADDING_LENGTH (4) /* 4 Bytes */ #define JPEGD_BASELINE_TABLE_SIZE (QUANTIZE_TABLE_LENGTH * 3 \ + MAX_AC_HUFFMAN_TABLE_LENGTH * 2 \ + MAX_DC_HUFFMAN_TABLE_LENGTH * 2 \ + ZERO_PADDING_LENGTH) /* 544 Bytes */ #define JPEGD_DBG_FUNCTION (0x00000001) #define JPEGD_DBG_STARTCODE (0x00000002) #define JPEGD_DBG_TABLE (0x00000004) #define JPEGD_DBG_RESULT (0x00000008) #define JPEGD_DBG_IO (0x00000010) /* input and output write file */ #define JPEGD_DBG_PARSER_INFO (0x00000020) /* parser information */ #define JPEGD_DBG_SYNTAX_ERR (0x00000040) /* syntax error */ #define JPEGD_DBG_HAL_INFO (0x00000080) /* hal information */ #define JPEGD_DBG_HAL_TBL (0x00000100) /* hal information */ extern RK_U32 jpegd_debug; #define jpegd_dbg(flag, fmt, ...) _mpp_dbg(jpegd_debug, flag, fmt, ## __VA_ARGS__) #define jpegd_dbg_f(flag, fmt, ...) _mpp_dbg_f(jpegd_debug, flag, fmt, ## __VA_ARGS__) #define jpegd_dbg_func(fmt, ...) jpegd_dbg_f(JPEGD_DBG_FUNCTION, fmt, ## __VA_ARGS__) #define jpegd_dbg_marker(fmt, ...) jpegd_dbg(JPEGD_DBG_STARTCODE, fmt, ## __VA_ARGS__) #define jpegd_dbg_table(fmt, ...) jpegd_dbg(JPEGD_DBG_TABLE, fmt, ## __VA_ARGS__) #define jpegd_dbg_result(fmt, ...) jpegd_dbg(JPEGD_DBG_RESULT, fmt, ## __VA_ARGS__) #define jpegd_dbg_io(fmt, ...) jpegd_dbg(JPEGD_DBG_IO, fmt, ## __VA_ARGS__) #define jpegd_dbg_parser(fmt, ...) jpegd_dbg(JPEGD_DBG_PARSER_INFO, fmt, ## __VA_ARGS__) #define jpegd_dbg_syntax(fmt, ...) jpegd_dbg(JPEGD_DBG_SYNTAX_ERR, fmt, ## __VA_ARGS__) #define jpegd_dbg_hal(fmt, ...) jpegd_dbg(JPEGD_DBG_HAL_INFO, fmt, ## __VA_ARGS__) enum huffman_table_type { HUFFMAN_TABLE_TYPE_DC = 0, HUFFMAN_TABLE_TYPE_AC = 1, HUFFMAN_TABLE_TYPE_BUTT = 2, }; enum huffman_table_id { HUFFMAN_TABLE_ID_ZERO = 0, HUFFMAN_TABLE_ID_ONE = 1, HUFFMAN_TABLE_ID_TWO = 2, HUFFMAN_TABLE_ID_THREE = 3, HUFFMAN_TABLE_ID_BUTT = 4, }; enum quantize_table_id { QUANTIZE_TABLE_ID_ZERO = 0, QUANTIZE_TABLE_ID_ONE = 1, QUANTIZE_TABLE_ID_TWO = 2, QUANTIZE_TABLE_ID_THREE = 3, QUANTIZE_TABLE_ID_BUTT = 4, }; /* Alternating Current Table */ typedef struct { RK_U32 bits[MAX_HUFFMAN_CODE_BIT_LENGTH]; RK_U32 vals[MAX_AC_HUFFMAN_TABLE_LENGTH]; RK_U32 actual_length; /* calculate based on actual stream */ } AcTable; /* Direct Current Table */ typedef struct { RK_U32 bits[MAX_HUFFMAN_CODE_BIT_LENGTH]; RK_U32 vals[MAX_DC_HUFFMAN_TABLE_LENGTH]; RK_U32 actual_length; /* calculate based on actual stream */ } DcTable; typedef struct JpegdSyntax { /* just 16 bits because quantization parameters are much less than 2^16 */ RK_U16 quant_matrixes[4][QUANTIZE_TABLE_LENGTH]; /* only two ac table for baseline */ AcTable ac_table[2]; /* only two dc table for baseline */ DcTable dc_table[2]; /* quantizer scale calculated from quant_matrixes */ RK_U32 qscale[4]; /* output format */ MppFrameFormat output_fmt; /* especially for jpeg */ RK_U32 yuv_mode; RK_U8 fill_bottom; RK_U8 fill_right; /* syntax in SOS */ RK_U8 scan_start; RK_U8 scan_end; RK_U8 prev_shift; /* Ah */ RK_U8 point_transform; /* Al */ /* 0 - not found; 1 - found */ RK_U8 dht_found; RK_U8 eoi_found; /* amount of quantize tables: 1 or 3 */ RK_U8 qtable_cnt; /* length of sos segment */ RK_U32 sos_len; /* decoded bytes by software */ RK_U32 strm_offset; /* hardware decode start address */ RK_U8 *cur_pos; /* length of a jpeg packet */ RK_U32 pkt_len; /* Horizontal pixel density */ RK_U16 hor_density; /* Vertical pixel density */ RK_U16 ver_density; RK_U32 width, height; RK_U32 hor_stride, ver_stride; /* Number of components in frame */ RK_U32 nb_components; /* Component id */ RK_U32 component_id[MAX_COMPONENTS]; /* Horizontal sampling factor */ RK_U32 h_count[MAX_COMPONENTS]; /* Vertical sampling factor */ RK_U32 v_count[MAX_COMPONENTS]; /* Huffman Table ID used by DC */ RK_U32 dc_index[MAX_COMPONENTS]; /* Huffman Table ID used by AC */ RK_U32 ac_index[MAX_COMPONENTS]; /* maximum h and v counts */ RK_U32 h_max, v_max; /* quant table index for each component */ RK_U32 quant_index[MAX_COMPONENTS]; RK_U32 restart_interval; RK_U8 sample_precision; RK_U8 qtbl_entry; RK_U8 htbl_entry; } JpegdSyntax; #endif /*__JPEGD_SYNTAX__*/