/* * * 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 __VP9D_PARSER_H__ #define __VP9D_PARSER_H__ #include #include "mpp_debug.h" #include "mpp_bitread.h" #include "parser_api.h" #include "vpx_rac.h" #include "vp9.h" #include "vp9data.h" #include "vp9d_syntax.h" extern RK_U32 vp9d_debug; #define VP9D_DBG_FUNCTION (0x00000001) #define VP9D_DBG_HEADER (0x00000002) #define VP9D_DBG_REF (0x00000004) #define VP9D_DBG_PORBE (0x00000008) #define VP9D_DBG_STRMIN (0x00000010) #define vp9d_dbg(flag, fmt, ...) _mpp_dbg(vp9d_debug, flag, fmt, ##__VA_ARGS__) enum CompPredMode { PRED_SINGLEREF, PRED_COMPREF, PRED_SWITCHABLE, }; enum BlockLevel { BL_64X64, BL_32X32, BL_16X16, BL_8X8, }; enum BlockSize { BS_64x64, BS_64x32, BS_32x64, BS_32x32, BS_32x16, BS_16x32, BS_16x16, BS_16x8, BS_8x16, BS_8x8, BS_8x4, BS_4x8, BS_4x4, N_BS_SIZES, }; typedef struct VP9Block { RK_U8 seg_id, intra, comp, ref[2], mode[4], uvmode, skip; enum FilterMode filter; Vpxmv mv[4 /* b_idx */][2 /* ref */]; enum BlockSize bs; enum TxfmMode tx, uvtx; enum BlockLevel bl; enum BlockPartition bp; } VP9Block; struct VP9mvrefPair { Vpxmv mv[2]; RK_S8 ref[2]; }; typedef struct RefInfo { RK_S32 ref_count; RK_U32 invisible; RK_U32 segMapIndex; RK_U32 is_output; } RefInfo; typedef struct VP9Frame { MppFrame f; RK_S32 slot_index; RefInfo *ref; } VP9Frame; struct VP9Filter { uint8_t level[8 * 8]; uint8_t /* bit=col */ mask[2 /* 0=y, 1=uv */][2 /* 0=col, 1=row */] [8 /* rows */][4 /* 0=16, 1=8, 2=4, 3=inner4 */]; }; #define CUR_FRAME 0 #define REF_FRAME_MVPAIR 1 #define REF_FRAME_SEGMAP 2 typedef struct VP9Context { BitReadCtx_t gb; VpxRangeCoder c; VpxRangeCoder *c_b; RK_U32 c_b_size; VP9Block *b_base, *b; RK_S32 pass; RK_S32 row, row7, col, col7; RK_U8 *dst[3]; RK_S32 y_stride, uv_stride; // bitstream header RK_U8 show_existing_frame; RK_U8 keyframe, last_keyframe; RK_U8 last_bpp, bpp, bpp_index, bytesperpixel; RK_U8 invisible; RK_U8 use_last_frame_mvs; RK_U8 errorres; RK_U8 ss_h, ss_v; RK_U8 extra_plane; RK_U8 intraonly; RK_U8 resetctx; RK_U8 refreshrefmask; RK_U8 highprecisionmvs; enum FilterMode filtermode; RK_U8 allowcompinter; RK_U8 fixcompref; RK_U8 refreshctx; RK_U8 parallelmode; RK_U8 framectxid; RK_U8 refidx[3]; RK_U8 signbias[3]; RK_U8 varcompref[2]; VP9Frame frames[3]; VP9Frame refs[8]; RK_U32 got_keyframes; struct { RK_U8 level; RK_S8 sharpness; RK_U8 lim_lut[64]; RK_U8 mblim_lut[64]; } filter; struct { RK_U8 enabled; RK_U8 update; RK_S8 mode[2]; RK_S8 ref[4]; } lf_delta; RK_U8 yac_qi; RK_S8 ydc_qdelta, uvdc_qdelta, uvac_qdelta; RK_U8 lossless; #define MAX_SEGMENT 8 struct { RK_U8 enabled; RK_U8 temporal; RK_U8 absolute_vals; RK_U8 update_map; RK_U8 ignore_refmap; struct { RK_U8 q_enabled; RK_U8 lf_enabled; RK_U8 ref_enabled; RK_U8 skip_enabled; RK_U8 ref_val; RK_S16 q_val; RK_S8 lf_val; RK_S16 qmul[2][2]; RK_U8 lflvl[4][2]; } feat[MAX_SEGMENT]; } segmentation; struct { RK_U32 log2_tile_cols, log2_tile_rows; RK_U32 tile_cols, tile_rows; RK_U32 tile_row_start, tile_row_end, tile_col_start, tile_col_end; } tiling; RK_U32 sb_cols, sb_rows, rows, cols; struct { prob_context p; RK_U8 coef[4][2][2][6][6][3]; } prob_ctx[4]; struct { prob_context p; RK_U8 coef[4][2][2][6][6][3]; RK_U8 seg[7]; RK_U8 segpred[3]; } prob; struct { prob_context p_flag; prob_context p_delta; RK_U8 coef_flag[4][2][2][6][6][3]; RK_U8 coef_delta[4][2][2][6][6][3]; } prob_flag_delta; struct { RK_U32 partition[4][4][4]; RK_U32 skip[3][2]; RK_U32 intra[4][2]; RK_U32 tx32p[2][4]; RK_U32 tx16p[2][4]; //orign tx16p RK_U32 tx8p[2][2]; RK_U32 y_mode[4][10]; RK_U32 uv_mode[10][10]; RK_U32 comp[5][2]; RK_U32 comp_ref[5][2]; RK_U32 single_ref[5][2][2]; RK_U32 mv_mode[7][4]; RK_U32 filter[4][3]; RK_U32 mv_joint[4]; RK_U32 sign[2][2]; RK_U32 classes[2][12]; // orign classes[12] RK_U32 class0[2][2]; RK_U32 bits[2][10][2]; RK_U32 class0_fp[2][2][4]; RK_U32 fp[2][4]; RK_U32 class0_hp[2][2]; RK_U32 hp[2][2]; RK_U32 coef[4][2][2][6][6][3]; RK_U32 eob[4][2][2][6][6][2]; } counts; enum TxfmMode txfmmode; enum CompPredMode comppredmode; // contextual (left/above) cache RK_U8 left_y_nnz_ctx[16]; RK_U8 left_mode_ctx[16]; Vpxmv left_mv_ctx[16][2]; RK_U8 left_uv_nnz_ctx[2][16]; RK_U8 left_partition_ctx[8]; RK_U8 left_skip_ctx[8]; RK_U8 left_txfm_ctx[8]; RK_U8 left_segpred_ctx[8]; RK_U8 left_intra_ctx[8]; RK_U8 left_comp_ctx[8]; RK_U8 left_ref_ctx[8]; RK_U8 left_filter_ctx[8]; // block reconstruction intermediates RK_S32 block_alloc_using_2pass; RK_S16 *block, *uvblock_base[2], *uvblock[2]; RK_U8 *eob_base, *uveob_base[2], *eob, *uveob[2]; struct { RK_S32 x, y; } min_mv, max_mv; RK_U16 mvscale[3][2]; RK_U8 mvstep[3][2]; RK_S32 first_partition_size; MppBufSlots slots; MppBufSlots packet_slots; MppDecCfgSet *cfg; HalDecTask *task; RK_S32 eos; ///< current packet contains an EOS/EOB NAL RK_S64 pts; RK_S32 upprobe_num; RK_S32 outframe_num; RK_U32 cur_poc; } VP9Context; #ifdef __cplusplus extern "C" { #endif MPP_RET vp9d_parser_init(Vp9CodecContext *vp9_ctx, ParserCfg *init); MPP_RET vp9d_parser_deinit(Vp9CodecContext *vp9_ctx); RK_S32 vp9_parser_frame(Vp9CodecContext *ctx, HalDecTask *in_task); void vp9_parser_update(Vp9CodecContext *ctx, void *count_info); MPP_RET vp9d_paser_reset(Vp9CodecContext *ctx); RK_S32 vp9d_split_frame(SplitContext_t *ctx, RK_U8 **out_data, RK_S32 *out_size, RK_U8 *data, RK_S32 size); MPP_RET vp9d_get_frame_stream(Vp9CodecContext *ctx, RK_U8 *buf, RK_S32 length); MPP_RET vp9d_split_deinit(Vp9CodecContext *vp9_ctx); MPP_RET vp9d_split_init(Vp9CodecContext *vp9_ctx); RK_S32 vp9d_parser2_syntax(Vp9CodecContext *ctx); #ifdef __cplusplus } #endif #endif /* __VP9D_PARSER_H__ */