xref: /rockchip-linux_mpp/mpp/common/jpegd_syntax.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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