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 __VP8D_PARSER_H__ 19*437bfbebSnyanmisaka #define __VP8D_PARSER_H__ 20*437bfbebSnyanmisaka 21*437bfbebSnyanmisaka #include <stdio.h> 22*437bfbebSnyanmisaka 23*437bfbebSnyanmisaka #include "parser_api.h" 24*437bfbebSnyanmisaka #include "vp8d_syntax.h" 25*437bfbebSnyanmisaka #include "vp8d_data.h" 26*437bfbebSnyanmisaka 27*437bfbebSnyanmisaka #define VP8HWD_VP7 1 28*437bfbebSnyanmisaka #define VP8HWD_VP8 2 29*437bfbebSnyanmisaka #define VP8HWD_WEBP 3 30*437bfbebSnyanmisaka 31*437bfbebSnyanmisaka #define DEC_MODE_VP7 9 32*437bfbebSnyanmisaka #define DEC_MODE_VP8 10 33*437bfbebSnyanmisaka 34*437bfbebSnyanmisaka #define MAX_NBR_OF_SEGMENTS (4) 35*437bfbebSnyanmisaka #define MAX_NBR_OF_MB_REF_LF_DELTAS (4) 36*437bfbebSnyanmisaka #define MAX_NBR_OF_MB_MODE_LF_DELTAS (4) 37*437bfbebSnyanmisaka 38*437bfbebSnyanmisaka #define MAX_NBR_OF_DCT_PARTITIONS (8) 39*437bfbebSnyanmisaka 40*437bfbebSnyanmisaka #define MAX_NBR_OF_VP7_MB_FEATURES (4) 41*437bfbebSnyanmisaka 42*437bfbebSnyanmisaka #define VP8D_BUF_SIZE_BITMEM (512 * 1024) 43*437bfbebSnyanmisaka #define VP8D_PROB_TABLE_SIZE (1<<16) /* TODO */ 44*437bfbebSnyanmisaka #define VP8D_MAX_SEGMAP_SIZE (2048 + 1024) //1920*1080 /* TODO */ 45*437bfbebSnyanmisaka #define VP8_KEY_FRAME_START_CODE 0x9d012a 46*437bfbebSnyanmisaka 47*437bfbebSnyanmisaka #define VP8D_DBG_FUNCTION (0x00000001) 48*437bfbebSnyanmisaka #define VP8D_DBG_WARNNING (0x00000004) 49*437bfbebSnyanmisaka #define VP8D_DBG_LOG (0x00000008) 50*437bfbebSnyanmisaka #define VP8D_DBG_SEC_HEADER (0x00000010) 51*437bfbebSnyanmisaka #define VP8D_DBG_DUMP_STREAM (0x00001000) 52*437bfbebSnyanmisaka 53*437bfbebSnyanmisaka 54*437bfbebSnyanmisaka typedef enum { 55*437bfbebSnyanmisaka VP8_YCbCr_BT601, 56*437bfbebSnyanmisaka VP8_CUSTOM 57*437bfbebSnyanmisaka } vpColorSpace_e; 58*437bfbebSnyanmisaka 59*437bfbebSnyanmisaka typedef struct { 60*437bfbebSnyanmisaka RK_U32 lowvalue; 61*437bfbebSnyanmisaka RK_U32 range; 62*437bfbebSnyanmisaka RK_U32 value; 63*437bfbebSnyanmisaka RK_S32 count; 64*437bfbebSnyanmisaka RK_U32 pos; 65*437bfbebSnyanmisaka RK_U8 *buffer; 66*437bfbebSnyanmisaka RK_U32 BitCounter; 67*437bfbebSnyanmisaka RK_U32 streamEndPos; 68*437bfbebSnyanmisaka RK_U32 strmError; 69*437bfbebSnyanmisaka } vpBoolCoder_t; 70*437bfbebSnyanmisaka 71*437bfbebSnyanmisaka typedef struct { 72*437bfbebSnyanmisaka RK_U8 probLuma16x16PredMode[4]; 73*437bfbebSnyanmisaka RK_U8 probChromaPredMode[3]; 74*437bfbebSnyanmisaka RK_U8 probMvContext[2][VP8_MV_PROBS_PER_COMPONENT]; 75*437bfbebSnyanmisaka RK_U8 probCoeffs[4][8][3][11]; 76*437bfbebSnyanmisaka } vp8EntropyProbs_t; 77*437bfbebSnyanmisaka 78*437bfbebSnyanmisaka typedef struct VP8Frame { 79*437bfbebSnyanmisaka MppFrame f; 80*437bfbebSnyanmisaka RK_S32 slot_index; 81*437bfbebSnyanmisaka RK_S8 ref_count; 82*437bfbebSnyanmisaka RK_U8 invisible; 83*437bfbebSnyanmisaka } VP8Frame; 84*437bfbebSnyanmisaka 85*437bfbebSnyanmisaka 86*437bfbebSnyanmisaka typedef struct VP8DParserContext { 87*437bfbebSnyanmisaka DXVA_PicParams_VP8 *dxva_ctx; 88*437bfbebSnyanmisaka RK_U8 *bitstream_sw_buf; 89*437bfbebSnyanmisaka RK_U32 max_stream_size; 90*437bfbebSnyanmisaka RK_U32 stream_size; 91*437bfbebSnyanmisaka 92*437bfbebSnyanmisaka VP8Frame *frame_out; 93*437bfbebSnyanmisaka VP8Frame *frame_ref; 94*437bfbebSnyanmisaka VP8Frame *frame_golden; 95*437bfbebSnyanmisaka VP8Frame *frame_alternate; 96*437bfbebSnyanmisaka 97*437bfbebSnyanmisaka vpBoolCoder_t bitstr; 98*437bfbebSnyanmisaka 99*437bfbebSnyanmisaka RK_U32 decMode; 100*437bfbebSnyanmisaka 101*437bfbebSnyanmisaka /* Current frame dimensions */ 102*437bfbebSnyanmisaka RK_U32 width; 103*437bfbebSnyanmisaka RK_U32 height; 104*437bfbebSnyanmisaka RK_U32 scaledWidth; 105*437bfbebSnyanmisaka RK_U32 scaledHeight; 106*437bfbebSnyanmisaka 107*437bfbebSnyanmisaka RK_U8 vpVersion; 108*437bfbebSnyanmisaka RK_U32 vpProfile; 109*437bfbebSnyanmisaka 110*437bfbebSnyanmisaka RK_U32 keyFrame; 111*437bfbebSnyanmisaka 112*437bfbebSnyanmisaka RK_U8 coeffSkipMode; 113*437bfbebSnyanmisaka 114*437bfbebSnyanmisaka /* DCT coefficient partitions */ 115*437bfbebSnyanmisaka RK_U32 offsetToDctParts; 116*437bfbebSnyanmisaka RK_U32 nbrDctPartitions; 117*437bfbebSnyanmisaka RK_U32 dctPartitionOffsets[MAX_NBR_OF_DCT_PARTITIONS]; 118*437bfbebSnyanmisaka 119*437bfbebSnyanmisaka vpColorSpace_e colorSpace; 120*437bfbebSnyanmisaka RK_U32 clamping; 121*437bfbebSnyanmisaka RK_U32 showFrame; 122*437bfbebSnyanmisaka 123*437bfbebSnyanmisaka 124*437bfbebSnyanmisaka RK_U32 refreshGolden; 125*437bfbebSnyanmisaka RK_U32 refreshAlternate; 126*437bfbebSnyanmisaka RK_U32 refreshLast; 127*437bfbebSnyanmisaka RK_U32 refreshEntropyProbs; 128*437bfbebSnyanmisaka RK_U32 copyBufferToGolden; 129*437bfbebSnyanmisaka RK_U32 copyBufferToAlternate; 130*437bfbebSnyanmisaka 131*437bfbebSnyanmisaka RK_U32 refFrameSignBias[2]; 132*437bfbebSnyanmisaka RK_U32 useAsReference; 133*437bfbebSnyanmisaka RK_U32 loopFilterType; 134*437bfbebSnyanmisaka RK_U32 loopFilterLevel; 135*437bfbebSnyanmisaka RK_U32 loopFilterSharpness; 136*437bfbebSnyanmisaka 137*437bfbebSnyanmisaka /* Quantization parameters */ 138*437bfbebSnyanmisaka RK_S8 qpYAc, qpYDc, qpY2Ac, qpY2Dc, qpChAc, qpChDc; 139*437bfbebSnyanmisaka 140*437bfbebSnyanmisaka /* From here down, frame-to-frame persisting stuff */ 141*437bfbebSnyanmisaka RK_U32 vp7ScanOrder[16]; 142*437bfbebSnyanmisaka RK_U32 vp7PrevScanOrder[16]; 143*437bfbebSnyanmisaka 144*437bfbebSnyanmisaka /* Probabilities */ 145*437bfbebSnyanmisaka RK_U32 probIntra; 146*437bfbebSnyanmisaka RK_U32 probRefLast; 147*437bfbebSnyanmisaka RK_U32 probRefGolden; 148*437bfbebSnyanmisaka RK_U32 probMbSkipFalse; 149*437bfbebSnyanmisaka RK_U32 probSegment[3]; 150*437bfbebSnyanmisaka vp8EntropyProbs_t entropy, entropyLast; 151*437bfbebSnyanmisaka 152*437bfbebSnyanmisaka /* Segment and macroblock specific values */ 153*437bfbebSnyanmisaka RK_U32 segmentationEnabled; 154*437bfbebSnyanmisaka RK_U32 segmentationMapUpdate; 155*437bfbebSnyanmisaka RK_U32 segmentFeatureMode; /* delta/abs */ 156*437bfbebSnyanmisaka RK_S32 segmentQp[MAX_NBR_OF_SEGMENTS]; 157*437bfbebSnyanmisaka RK_S32 segmentLoopfilter[MAX_NBR_OF_SEGMENTS]; 158*437bfbebSnyanmisaka RK_U32 modeRefLfEnabled; 159*437bfbebSnyanmisaka RK_S32 mbRefLfDelta[MAX_NBR_OF_MB_REF_LF_DELTAS]; 160*437bfbebSnyanmisaka RK_S32 mbModeLfDelta[MAX_NBR_OF_MB_MODE_LF_DELTAS]; 161*437bfbebSnyanmisaka 162*437bfbebSnyanmisaka RK_U32 frameTagSize; 163*437bfbebSnyanmisaka 164*437bfbebSnyanmisaka /* Value to remember last frames prediction for hits into most 165*437bfbebSnyanmisaka * probable reference frame */ 166*437bfbebSnyanmisaka RK_U32 refbuPredHits; 167*437bfbebSnyanmisaka 168*437bfbebSnyanmisaka 169*437bfbebSnyanmisaka RK_S32 dcPred[2]; 170*437bfbebSnyanmisaka RK_S32 dcMatch[2]; 171*437bfbebSnyanmisaka 172*437bfbebSnyanmisaka RK_U32 frame_cnt; 173*437bfbebSnyanmisaka RK_U64 pts; 174*437bfbebSnyanmisaka RK_U64 dts; 175*437bfbebSnyanmisaka 176*437bfbebSnyanmisaka RK_U32 needKeyFrame; 177*437bfbebSnyanmisaka MppPacket input_packet; 178*437bfbebSnyanmisaka RK_U32 eos; 179*437bfbebSnyanmisaka 180*437bfbebSnyanmisaka MppBufSlots packet_slots; 181*437bfbebSnyanmisaka MppBufSlots frame_slots; 182*437bfbebSnyanmisaka /* for debug */ 183*437bfbebSnyanmisaka FILE *stream_fp; 184*437bfbebSnyanmisaka RK_U32 ivf_header_flag; 185*437bfbebSnyanmisaka } VP8DParserContext_t; 186*437bfbebSnyanmisaka 187*437bfbebSnyanmisaka MPP_RET vp8d_parser_init (void *ctx, ParserCfg *cfg); 188*437bfbebSnyanmisaka MPP_RET vp8d_parser_deinit (void *ctx); 189*437bfbebSnyanmisaka MPP_RET vp8d_parser_reset (void *ctx); 190*437bfbebSnyanmisaka MPP_RET vp8d_parser_flush (void *ctx); 191*437bfbebSnyanmisaka MPP_RET vp8d_parser_control(void *ctx, MpiCmd cmd_type, void *param); 192*437bfbebSnyanmisaka MPP_RET vp8d_parser_prepare(void *ctx, MppPacket pkt, HalDecTask *task); 193*437bfbebSnyanmisaka MPP_RET vp8d_parser_parse (void *ctx, HalDecTask *task); 194*437bfbebSnyanmisaka MPP_RET vp8d_parser_callback(void *ctx, void *hal_info); 195*437bfbebSnyanmisaka 196*437bfbebSnyanmisaka #endif 197*437bfbebSnyanmisaka 198