xref: /rockchip-linux_mpp/mpp/codec/dec/vp8/vp8d_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 
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