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