xref: /rockchip-linux_mpp/mpp/codec/dec/vp9/vp9d_parser.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 #ifndef __VP9D_PARSER_H__
18*437bfbebSnyanmisaka #define __VP9D_PARSER_H__
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #include <stdlib.h>
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka #include "mpp_debug.h"
23*437bfbebSnyanmisaka #include "mpp_bitread.h"
24*437bfbebSnyanmisaka 
25*437bfbebSnyanmisaka #include "parser_api.h"
26*437bfbebSnyanmisaka #include "vpx_rac.h"
27*437bfbebSnyanmisaka #include "vp9.h"
28*437bfbebSnyanmisaka #include "vp9data.h"
29*437bfbebSnyanmisaka #include "vp9d_syntax.h"
30*437bfbebSnyanmisaka 
31*437bfbebSnyanmisaka extern RK_U32 vp9d_debug;
32*437bfbebSnyanmisaka 
33*437bfbebSnyanmisaka #define VP9D_DBG_FUNCTION (0x00000001)
34*437bfbebSnyanmisaka #define VP9D_DBG_HEADER   (0x00000002)
35*437bfbebSnyanmisaka #define VP9D_DBG_REF      (0x00000004)
36*437bfbebSnyanmisaka #define VP9D_DBG_PORBE    (0x00000008)
37*437bfbebSnyanmisaka #define VP9D_DBG_STRMIN   (0x00000010)
38*437bfbebSnyanmisaka 
39*437bfbebSnyanmisaka 
40*437bfbebSnyanmisaka 
41*437bfbebSnyanmisaka #define vp9d_dbg(flag, fmt, ...) _mpp_dbg(vp9d_debug, flag, fmt, ##__VA_ARGS__)
42*437bfbebSnyanmisaka 
43*437bfbebSnyanmisaka enum CompPredMode {
44*437bfbebSnyanmisaka     PRED_SINGLEREF,
45*437bfbebSnyanmisaka     PRED_COMPREF,
46*437bfbebSnyanmisaka     PRED_SWITCHABLE,
47*437bfbebSnyanmisaka };
48*437bfbebSnyanmisaka 
49*437bfbebSnyanmisaka enum BlockLevel {
50*437bfbebSnyanmisaka     BL_64X64,
51*437bfbebSnyanmisaka     BL_32X32,
52*437bfbebSnyanmisaka     BL_16X16,
53*437bfbebSnyanmisaka     BL_8X8,
54*437bfbebSnyanmisaka };
55*437bfbebSnyanmisaka 
56*437bfbebSnyanmisaka enum BlockSize {
57*437bfbebSnyanmisaka     BS_64x64,
58*437bfbebSnyanmisaka     BS_64x32,
59*437bfbebSnyanmisaka     BS_32x64,
60*437bfbebSnyanmisaka     BS_32x32,
61*437bfbebSnyanmisaka     BS_32x16,
62*437bfbebSnyanmisaka     BS_16x32,
63*437bfbebSnyanmisaka     BS_16x16,
64*437bfbebSnyanmisaka     BS_16x8,
65*437bfbebSnyanmisaka     BS_8x16,
66*437bfbebSnyanmisaka     BS_8x8,
67*437bfbebSnyanmisaka     BS_8x4,
68*437bfbebSnyanmisaka     BS_4x8,
69*437bfbebSnyanmisaka     BS_4x4,
70*437bfbebSnyanmisaka     N_BS_SIZES,
71*437bfbebSnyanmisaka };
72*437bfbebSnyanmisaka 
73*437bfbebSnyanmisaka typedef struct VP9Block {
74*437bfbebSnyanmisaka     RK_U8 seg_id, intra, comp, ref[2], mode[4], uvmode, skip;
75*437bfbebSnyanmisaka     enum FilterMode filter;
76*437bfbebSnyanmisaka     Vpxmv mv[4 /* b_idx */][2 /* ref */];
77*437bfbebSnyanmisaka     enum BlockSize bs;
78*437bfbebSnyanmisaka     enum TxfmMode tx, uvtx;
79*437bfbebSnyanmisaka     enum BlockLevel bl;
80*437bfbebSnyanmisaka     enum BlockPartition bp;
81*437bfbebSnyanmisaka } VP9Block;
82*437bfbebSnyanmisaka 
83*437bfbebSnyanmisaka struct VP9mvrefPair {
84*437bfbebSnyanmisaka     Vpxmv mv[2];
85*437bfbebSnyanmisaka     RK_S8 ref[2];
86*437bfbebSnyanmisaka };
87*437bfbebSnyanmisaka 
88*437bfbebSnyanmisaka typedef struct RefInfo {
89*437bfbebSnyanmisaka     RK_S32 ref_count;
90*437bfbebSnyanmisaka     RK_U32 invisible;
91*437bfbebSnyanmisaka     RK_U32 segMapIndex;
92*437bfbebSnyanmisaka     RK_U32 is_output;
93*437bfbebSnyanmisaka } RefInfo;
94*437bfbebSnyanmisaka 
95*437bfbebSnyanmisaka typedef struct VP9Frame {
96*437bfbebSnyanmisaka     MppFrame f;
97*437bfbebSnyanmisaka     RK_S32 slot_index;
98*437bfbebSnyanmisaka     RefInfo *ref;
99*437bfbebSnyanmisaka } VP9Frame;
100*437bfbebSnyanmisaka 
101*437bfbebSnyanmisaka struct VP9Filter {
102*437bfbebSnyanmisaka     uint8_t level[8 * 8];
103*437bfbebSnyanmisaka     uint8_t /* bit=col */ mask[2 /* 0=y, 1=uv */][2 /* 0=col, 1=row */]
104*437bfbebSnyanmisaka     [8 /* rows */][4 /* 0=16, 1=8, 2=4, 3=inner4 */];
105*437bfbebSnyanmisaka };
106*437bfbebSnyanmisaka #define CUR_FRAME 0
107*437bfbebSnyanmisaka #define REF_FRAME_MVPAIR 1
108*437bfbebSnyanmisaka #define REF_FRAME_SEGMAP 2
109*437bfbebSnyanmisaka 
110*437bfbebSnyanmisaka typedef struct VP9Context {
111*437bfbebSnyanmisaka     BitReadCtx_t gb;
112*437bfbebSnyanmisaka     VpxRangeCoder c;
113*437bfbebSnyanmisaka     VpxRangeCoder *c_b;
114*437bfbebSnyanmisaka     RK_U32 c_b_size;
115*437bfbebSnyanmisaka     VP9Block *b_base, *b;
116*437bfbebSnyanmisaka     RK_S32 pass;
117*437bfbebSnyanmisaka     RK_S32 row, row7, col, col7;
118*437bfbebSnyanmisaka     RK_U8 *dst[3];
119*437bfbebSnyanmisaka     RK_S32 y_stride, uv_stride;
120*437bfbebSnyanmisaka 
121*437bfbebSnyanmisaka     // bitstream header
122*437bfbebSnyanmisaka     RK_U8 show_existing_frame;
123*437bfbebSnyanmisaka     RK_U8 keyframe, last_keyframe;
124*437bfbebSnyanmisaka     RK_U8 last_bpp, bpp, bpp_index, bytesperpixel;
125*437bfbebSnyanmisaka     RK_U8 invisible;
126*437bfbebSnyanmisaka     RK_U8 use_last_frame_mvs;
127*437bfbebSnyanmisaka     RK_U8 errorres;
128*437bfbebSnyanmisaka     RK_U8 ss_h, ss_v;
129*437bfbebSnyanmisaka     RK_U8 extra_plane;
130*437bfbebSnyanmisaka     RK_U8 intraonly;
131*437bfbebSnyanmisaka     RK_U8 resetctx;
132*437bfbebSnyanmisaka     RK_U8 refreshrefmask;
133*437bfbebSnyanmisaka     RK_U8 highprecisionmvs;
134*437bfbebSnyanmisaka     enum FilterMode filtermode;
135*437bfbebSnyanmisaka     RK_U8 allowcompinter;
136*437bfbebSnyanmisaka     RK_U8 fixcompref;
137*437bfbebSnyanmisaka     RK_U8 refreshctx;
138*437bfbebSnyanmisaka     RK_U8 parallelmode;
139*437bfbebSnyanmisaka     RK_U8 framectxid;
140*437bfbebSnyanmisaka     RK_U8 refidx[3];
141*437bfbebSnyanmisaka     RK_U8 signbias[3];
142*437bfbebSnyanmisaka     RK_U8 varcompref[2];
143*437bfbebSnyanmisaka     VP9Frame frames[3];
144*437bfbebSnyanmisaka     VP9Frame refs[8];
145*437bfbebSnyanmisaka     RK_U32 got_keyframes;
146*437bfbebSnyanmisaka 
147*437bfbebSnyanmisaka     struct {
148*437bfbebSnyanmisaka         RK_U8 level;
149*437bfbebSnyanmisaka         RK_S8 sharpness;
150*437bfbebSnyanmisaka         RK_U8 lim_lut[64];
151*437bfbebSnyanmisaka         RK_U8 mblim_lut[64];
152*437bfbebSnyanmisaka     } filter;
153*437bfbebSnyanmisaka     struct {
154*437bfbebSnyanmisaka         RK_U8 enabled;
155*437bfbebSnyanmisaka         RK_U8 update;
156*437bfbebSnyanmisaka         RK_S8 mode[2];
157*437bfbebSnyanmisaka         RK_S8 ref[4];
158*437bfbebSnyanmisaka     } lf_delta;
159*437bfbebSnyanmisaka     RK_U8 yac_qi;
160*437bfbebSnyanmisaka     RK_S8 ydc_qdelta, uvdc_qdelta, uvac_qdelta;
161*437bfbebSnyanmisaka     RK_U8 lossless;
162*437bfbebSnyanmisaka #define MAX_SEGMENT 8
163*437bfbebSnyanmisaka     struct {
164*437bfbebSnyanmisaka         RK_U8 enabled;
165*437bfbebSnyanmisaka         RK_U8 temporal;
166*437bfbebSnyanmisaka         RK_U8 absolute_vals;
167*437bfbebSnyanmisaka         RK_U8 update_map;
168*437bfbebSnyanmisaka         RK_U8 ignore_refmap;
169*437bfbebSnyanmisaka         struct {
170*437bfbebSnyanmisaka             RK_U8 q_enabled;
171*437bfbebSnyanmisaka             RK_U8 lf_enabled;
172*437bfbebSnyanmisaka             RK_U8 ref_enabled;
173*437bfbebSnyanmisaka             RK_U8 skip_enabled;
174*437bfbebSnyanmisaka             RK_U8 ref_val;
175*437bfbebSnyanmisaka             RK_S16 q_val;
176*437bfbebSnyanmisaka             RK_S8 lf_val;
177*437bfbebSnyanmisaka             RK_S16 qmul[2][2];
178*437bfbebSnyanmisaka             RK_U8 lflvl[4][2];
179*437bfbebSnyanmisaka         } feat[MAX_SEGMENT];
180*437bfbebSnyanmisaka     } segmentation;
181*437bfbebSnyanmisaka     struct {
182*437bfbebSnyanmisaka         RK_U32 log2_tile_cols, log2_tile_rows;
183*437bfbebSnyanmisaka         RK_U32 tile_cols, tile_rows;
184*437bfbebSnyanmisaka         RK_U32 tile_row_start, tile_row_end, tile_col_start, tile_col_end;
185*437bfbebSnyanmisaka     } tiling;
186*437bfbebSnyanmisaka     RK_U32 sb_cols, sb_rows, rows, cols;
187*437bfbebSnyanmisaka     struct {
188*437bfbebSnyanmisaka         prob_context p;
189*437bfbebSnyanmisaka         RK_U8 coef[4][2][2][6][6][3];
190*437bfbebSnyanmisaka     } prob_ctx[4];
191*437bfbebSnyanmisaka     struct {
192*437bfbebSnyanmisaka         prob_context p;
193*437bfbebSnyanmisaka         RK_U8 coef[4][2][2][6][6][3];
194*437bfbebSnyanmisaka         RK_U8 seg[7];
195*437bfbebSnyanmisaka         RK_U8 segpred[3];
196*437bfbebSnyanmisaka     } prob;
197*437bfbebSnyanmisaka     struct {
198*437bfbebSnyanmisaka         prob_context p_flag;
199*437bfbebSnyanmisaka         prob_context p_delta;
200*437bfbebSnyanmisaka         RK_U8 coef_flag[4][2][2][6][6][3];
201*437bfbebSnyanmisaka         RK_U8 coef_delta[4][2][2][6][6][3];
202*437bfbebSnyanmisaka     } prob_flag_delta;
203*437bfbebSnyanmisaka     struct {
204*437bfbebSnyanmisaka         RK_U32 partition[4][4][4];
205*437bfbebSnyanmisaka         RK_U32 skip[3][2];
206*437bfbebSnyanmisaka         RK_U32 intra[4][2];
207*437bfbebSnyanmisaka         RK_U32 tx32p[2][4];
208*437bfbebSnyanmisaka         RK_U32 tx16p[2][4]; //orign tx16p
209*437bfbebSnyanmisaka         RK_U32 tx8p[2][2];
210*437bfbebSnyanmisaka         RK_U32 y_mode[4][10];
211*437bfbebSnyanmisaka         RK_U32 uv_mode[10][10];
212*437bfbebSnyanmisaka         RK_U32 comp[5][2];
213*437bfbebSnyanmisaka         RK_U32 comp_ref[5][2];
214*437bfbebSnyanmisaka         RK_U32 single_ref[5][2][2];
215*437bfbebSnyanmisaka         RK_U32 mv_mode[7][4];
216*437bfbebSnyanmisaka         RK_U32 filter[4][3];
217*437bfbebSnyanmisaka         RK_U32 mv_joint[4];
218*437bfbebSnyanmisaka         RK_U32 sign[2][2];
219*437bfbebSnyanmisaka         RK_U32 classes[2][12]; // orign classes[12]
220*437bfbebSnyanmisaka         RK_U32 class0[2][2];
221*437bfbebSnyanmisaka         RK_U32 bits[2][10][2];
222*437bfbebSnyanmisaka         RK_U32 class0_fp[2][2][4];
223*437bfbebSnyanmisaka         RK_U32 fp[2][4];
224*437bfbebSnyanmisaka         RK_U32 class0_hp[2][2];
225*437bfbebSnyanmisaka         RK_U32 hp[2][2];
226*437bfbebSnyanmisaka         RK_U32 coef[4][2][2][6][6][3];
227*437bfbebSnyanmisaka         RK_U32 eob[4][2][2][6][6][2];
228*437bfbebSnyanmisaka     } counts;
229*437bfbebSnyanmisaka     enum TxfmMode txfmmode;
230*437bfbebSnyanmisaka     enum CompPredMode comppredmode;
231*437bfbebSnyanmisaka 
232*437bfbebSnyanmisaka     // contextual (left/above) cache
233*437bfbebSnyanmisaka     RK_U8 left_y_nnz_ctx[16];
234*437bfbebSnyanmisaka     RK_U8 left_mode_ctx[16];
235*437bfbebSnyanmisaka     Vpxmv left_mv_ctx[16][2];
236*437bfbebSnyanmisaka     RK_U8 left_uv_nnz_ctx[2][16];
237*437bfbebSnyanmisaka     RK_U8 left_partition_ctx[8];
238*437bfbebSnyanmisaka     RK_U8 left_skip_ctx[8];
239*437bfbebSnyanmisaka     RK_U8 left_txfm_ctx[8];
240*437bfbebSnyanmisaka     RK_U8 left_segpred_ctx[8];
241*437bfbebSnyanmisaka     RK_U8 left_intra_ctx[8];
242*437bfbebSnyanmisaka     RK_U8 left_comp_ctx[8];
243*437bfbebSnyanmisaka     RK_U8 left_ref_ctx[8];
244*437bfbebSnyanmisaka     RK_U8 left_filter_ctx[8];
245*437bfbebSnyanmisaka 
246*437bfbebSnyanmisaka     // block reconstruction intermediates
247*437bfbebSnyanmisaka     RK_S32 block_alloc_using_2pass;
248*437bfbebSnyanmisaka     RK_S16  *block, *uvblock_base[2], *uvblock[2];
249*437bfbebSnyanmisaka     RK_U8 *eob_base, *uveob_base[2], *eob, *uveob[2];
250*437bfbebSnyanmisaka     struct { RK_S32 x, y; } min_mv, max_mv;
251*437bfbebSnyanmisaka     RK_U16 mvscale[3][2];
252*437bfbebSnyanmisaka     RK_U8 mvstep[3][2];
253*437bfbebSnyanmisaka 
254*437bfbebSnyanmisaka     RK_U32 uncompress_head_size_in_byte;
255*437bfbebSnyanmisaka     RK_S32 first_partition_size;
256*437bfbebSnyanmisaka     MppBufSlots slots;
257*437bfbebSnyanmisaka     MppBufSlots packet_slots;
258*437bfbebSnyanmisaka     MppDecCfgSet *cfg;
259*437bfbebSnyanmisaka     const MppDecHwCap *hw_info;
260*437bfbebSnyanmisaka     HalDecTask *task;
261*437bfbebSnyanmisaka     RK_S32 eos;       ///< current packet contains an EOS/EOB NAL
262*437bfbebSnyanmisaka     RK_S64 pts;
263*437bfbebSnyanmisaka     RK_S64 dts;
264*437bfbebSnyanmisaka     RK_S32 upprobe_num;
265*437bfbebSnyanmisaka     RK_S32 outframe_num;
266*437bfbebSnyanmisaka     RK_U32 cur_poc;
267*437bfbebSnyanmisaka } VP9Context;
268*437bfbebSnyanmisaka 
269*437bfbebSnyanmisaka #ifdef  __cplusplus
270*437bfbebSnyanmisaka extern "C" {
271*437bfbebSnyanmisaka #endif
272*437bfbebSnyanmisaka 
273*437bfbebSnyanmisaka MPP_RET vp9d_parser_init(Vp9CodecContext *vp9_ctx, ParserCfg *init);
274*437bfbebSnyanmisaka 
275*437bfbebSnyanmisaka MPP_RET vp9d_parser_deinit(Vp9CodecContext *vp9_ctx);
276*437bfbebSnyanmisaka 
277*437bfbebSnyanmisaka RK_S32 vp9_parser_frame(Vp9CodecContext *ctx, HalDecTask *in_task);
278*437bfbebSnyanmisaka 
279*437bfbebSnyanmisaka void vp9_parser_update(Vp9CodecContext *ctx, void *count_info);
280*437bfbebSnyanmisaka MPP_RET vp9d_paser_reset(Vp9CodecContext *ctx);
281*437bfbebSnyanmisaka RK_S32 vp9d_split_frame(SplitContext_t *ctx,
282*437bfbebSnyanmisaka                         RK_U8 **out_data, RK_S32 *out_size,
283*437bfbebSnyanmisaka                         RK_U8 *data, RK_S32 size);
284*437bfbebSnyanmisaka 
285*437bfbebSnyanmisaka MPP_RET vp9d_get_frame_stream(Vp9CodecContext *ctx, RK_U8 *buf, RK_S32 length);
286*437bfbebSnyanmisaka 
287*437bfbebSnyanmisaka MPP_RET vp9d_split_deinit(Vp9CodecContext *vp9_ctx);
288*437bfbebSnyanmisaka 
289*437bfbebSnyanmisaka MPP_RET vp9d_split_init(Vp9CodecContext *vp9_ctx);
290*437bfbebSnyanmisaka 
291*437bfbebSnyanmisaka RK_S32 vp9d_parser2_syntax(Vp9CodecContext *ctx);
292*437bfbebSnyanmisaka 
293*437bfbebSnyanmisaka #ifdef  __cplusplus
294*437bfbebSnyanmisaka }
295*437bfbebSnyanmisaka #endif
296*437bfbebSnyanmisaka 
297*437bfbebSnyanmisaka 
298*437bfbebSnyanmisaka #endif /* __VP9D_PARSER_H__ */
299