xref: /rockchip-linux_mpp/mpp/codec/dec/vp8/vp8d_parser.c (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 #define MODULE_TAG "vp8d_parser"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka #include <unistd.h>
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka #include "mpp_env.h"
23*437bfbebSnyanmisaka #include "mpp_mem.h"
24*437bfbebSnyanmisaka #include "mpp_debug.h"
25*437bfbebSnyanmisaka #include "mpp_frame.h"
26*437bfbebSnyanmisaka 
27*437bfbebSnyanmisaka #include "vp8d_parser.h"
28*437bfbebSnyanmisaka #include "vp8d_codec.h"
29*437bfbebSnyanmisaka 
30*437bfbebSnyanmisaka #define FUN_T(tag) \
31*437bfbebSnyanmisaka     do {\
32*437bfbebSnyanmisaka         if (VP8D_DBG_FUNCTION & vp8d_debug)\
33*437bfbebSnyanmisaka             { mpp_log("%s: line(%d), func(%s)", tag, __LINE__, __FUNCTION__); }\
34*437bfbebSnyanmisaka     } while (0)
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka static RK_U32 vp8d_debug = 0x0;
37*437bfbebSnyanmisaka 
vp8hwdBoolStart(vpBoolCoder_t * bit_ctx,RK_U8 * buffer,RK_U32 len)38*437bfbebSnyanmisaka static void vp8hwdBoolStart(vpBoolCoder_t *bit_ctx, RK_U8 *buffer, RK_U32 len)
39*437bfbebSnyanmisaka {
40*437bfbebSnyanmisaka     FUN_T("FUN_IN");
41*437bfbebSnyanmisaka     bit_ctx->lowvalue = 0;
42*437bfbebSnyanmisaka     bit_ctx->range = 255;
43*437bfbebSnyanmisaka     bit_ctx->count = 8;
44*437bfbebSnyanmisaka     bit_ctx->buffer = buffer;
45*437bfbebSnyanmisaka     bit_ctx->pos = 0;
46*437bfbebSnyanmisaka 
47*437bfbebSnyanmisaka     bit_ctx->value = (bit_ctx->buffer[0] << 24) + (bit_ctx->buffer[1] << 16)
48*437bfbebSnyanmisaka                      + (bit_ctx->buffer[2] << 8) + (bit_ctx->buffer[3]);
49*437bfbebSnyanmisaka 
50*437bfbebSnyanmisaka     bit_ctx->pos += 4;
51*437bfbebSnyanmisaka 
52*437bfbebSnyanmisaka     bit_ctx->streamEndPos = len;
53*437bfbebSnyanmisaka     bit_ctx->strmError = bit_ctx->pos > bit_ctx->streamEndPos;
54*437bfbebSnyanmisaka 
55*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
56*437bfbebSnyanmisaka }
57*437bfbebSnyanmisaka 
vp8hwdDecodeBool(vpBoolCoder_t * bit_ctx,RK_S32 probability)58*437bfbebSnyanmisaka static RK_U32 vp8hwdDecodeBool(vpBoolCoder_t *bit_ctx, RK_S32 probability)
59*437bfbebSnyanmisaka {
60*437bfbebSnyanmisaka     RK_U32  bit = 0;
61*437bfbebSnyanmisaka     RK_U32  split;
62*437bfbebSnyanmisaka     RK_U32  bigsplit;
63*437bfbebSnyanmisaka     RK_U32  count = bit_ctx->count;
64*437bfbebSnyanmisaka     RK_U32  range = bit_ctx->range;
65*437bfbebSnyanmisaka     RK_U32  value = bit_ctx->value;
66*437bfbebSnyanmisaka 
67*437bfbebSnyanmisaka     FUN_T("FUN_IN");
68*437bfbebSnyanmisaka     split = 1 + (((range - 1) * probability) >> 8);
69*437bfbebSnyanmisaka     bigsplit = (split << 24);
70*437bfbebSnyanmisaka     range = split;
71*437bfbebSnyanmisaka 
72*437bfbebSnyanmisaka     if (value >= bigsplit) {
73*437bfbebSnyanmisaka         range = bit_ctx->range - split;
74*437bfbebSnyanmisaka         value = value - bigsplit;
75*437bfbebSnyanmisaka         bit = 1;
76*437bfbebSnyanmisaka     }
77*437bfbebSnyanmisaka 
78*437bfbebSnyanmisaka     if (range >= 0x80) {
79*437bfbebSnyanmisaka         bit_ctx->value = value;
80*437bfbebSnyanmisaka         bit_ctx->range = range;
81*437bfbebSnyanmisaka         return bit;
82*437bfbebSnyanmisaka     } else {
83*437bfbebSnyanmisaka         do {
84*437bfbebSnyanmisaka             range += range;
85*437bfbebSnyanmisaka             value += value;
86*437bfbebSnyanmisaka 
87*437bfbebSnyanmisaka             if (!--count) {
88*437bfbebSnyanmisaka                 /* no more stream to read? */
89*437bfbebSnyanmisaka                 if (bit_ctx->pos >= bit_ctx->streamEndPos) {
90*437bfbebSnyanmisaka                     bit_ctx->strmError = 1;
91*437bfbebSnyanmisaka                     mpp_log("vp8hwdDecodeBool read end");
92*437bfbebSnyanmisaka                     break;
93*437bfbebSnyanmisaka                 }
94*437bfbebSnyanmisaka                 count = 8;
95*437bfbebSnyanmisaka                 value |=  bit_ctx->buffer[bit_ctx->pos];
96*437bfbebSnyanmisaka                 bit_ctx->pos++;
97*437bfbebSnyanmisaka             }
98*437bfbebSnyanmisaka         } while (range < 0x80);
99*437bfbebSnyanmisaka     }
100*437bfbebSnyanmisaka 
101*437bfbebSnyanmisaka 
102*437bfbebSnyanmisaka     bit_ctx->count = count;
103*437bfbebSnyanmisaka     bit_ctx->value = value;
104*437bfbebSnyanmisaka     bit_ctx->range = range;
105*437bfbebSnyanmisaka 
106*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
107*437bfbebSnyanmisaka     return bit;
108*437bfbebSnyanmisaka }
109*437bfbebSnyanmisaka 
vp8hwdDecodeBool128(vpBoolCoder_t * bit_ctx)110*437bfbebSnyanmisaka static RK_U32 vp8hwdDecodeBool128(vpBoolCoder_t *bit_ctx)
111*437bfbebSnyanmisaka {
112*437bfbebSnyanmisaka     RK_U32 bit = 0;
113*437bfbebSnyanmisaka     RK_U32 split;
114*437bfbebSnyanmisaka     RK_U32 bigsplit;
115*437bfbebSnyanmisaka     RK_U32 count =  bit_ctx->count;
116*437bfbebSnyanmisaka     RK_U32 range = bit_ctx->range;
117*437bfbebSnyanmisaka     RK_U32 value = bit_ctx->value;
118*437bfbebSnyanmisaka 
119*437bfbebSnyanmisaka     FUN_T("FUN_IN");
120*437bfbebSnyanmisaka     split = (range + 1) >> 1;
121*437bfbebSnyanmisaka     bigsplit = (split << 24);
122*437bfbebSnyanmisaka     range = split;
123*437bfbebSnyanmisaka 
124*437bfbebSnyanmisaka     if (value >= bigsplit) {
125*437bfbebSnyanmisaka         range = (bit_ctx->range - split);
126*437bfbebSnyanmisaka         value = (value - bigsplit);
127*437bfbebSnyanmisaka         bit = 1;
128*437bfbebSnyanmisaka     }
129*437bfbebSnyanmisaka 
130*437bfbebSnyanmisaka     if (range >= 0x80) {
131*437bfbebSnyanmisaka         bit_ctx->value = value;
132*437bfbebSnyanmisaka         bit_ctx->range = range;
133*437bfbebSnyanmisaka 
134*437bfbebSnyanmisaka         FUN_T("FUN_OUT");
135*437bfbebSnyanmisaka         return bit;
136*437bfbebSnyanmisaka     } else {
137*437bfbebSnyanmisaka         range <<= 1;
138*437bfbebSnyanmisaka         value <<= 1;
139*437bfbebSnyanmisaka 
140*437bfbebSnyanmisaka         if (!--count) {
141*437bfbebSnyanmisaka             /* no more stream to read? */
142*437bfbebSnyanmisaka             if (bit_ctx->pos >= bit_ctx->streamEndPos) {
143*437bfbebSnyanmisaka                 bit_ctx->strmError = 1;
144*437bfbebSnyanmisaka                 mpp_log("vp8hwdDecodeBool128 read end");
145*437bfbebSnyanmisaka                 return 0; /* any value, not valid */
146*437bfbebSnyanmisaka             }
147*437bfbebSnyanmisaka             count = 8;
148*437bfbebSnyanmisaka             value |= bit_ctx->buffer[bit_ctx->pos];
149*437bfbebSnyanmisaka             bit_ctx->pos++;
150*437bfbebSnyanmisaka         }
151*437bfbebSnyanmisaka     }
152*437bfbebSnyanmisaka 
153*437bfbebSnyanmisaka     bit_ctx->count = count;
154*437bfbebSnyanmisaka     bit_ctx->value = value;
155*437bfbebSnyanmisaka     bit_ctx->range = range;
156*437bfbebSnyanmisaka 
157*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
158*437bfbebSnyanmisaka     return bit;
159*437bfbebSnyanmisaka }
160*437bfbebSnyanmisaka 
vp8hwdReadBits(vpBoolCoder_t * bit_ctx,RK_S32 bits)161*437bfbebSnyanmisaka static RK_U32 vp8hwdReadBits(vpBoolCoder_t *bit_ctx, RK_S32 bits)
162*437bfbebSnyanmisaka {
163*437bfbebSnyanmisaka     RK_U32 z = 0;
164*437bfbebSnyanmisaka     RK_S32 bit;
165*437bfbebSnyanmisaka 
166*437bfbebSnyanmisaka     FUN_T("FUN_IN");
167*437bfbebSnyanmisaka     for (bit = bits - 1; bit >= 0; bit--) {
168*437bfbebSnyanmisaka         z |= (vp8hwdDecodeBool128(bit_ctx) << bit);
169*437bfbebSnyanmisaka     }
170*437bfbebSnyanmisaka 
171*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
172*437bfbebSnyanmisaka     return z;
173*437bfbebSnyanmisaka }
174*437bfbebSnyanmisaka 
ScaleDimension(RK_U32 orig,RK_U32 scale)175*437bfbebSnyanmisaka static RK_U32 ScaleDimension( RK_U32 orig, RK_U32 scale )
176*437bfbebSnyanmisaka {
177*437bfbebSnyanmisaka 
178*437bfbebSnyanmisaka     FUN_T("FUN_IN");
179*437bfbebSnyanmisaka     switch (scale) {
180*437bfbebSnyanmisaka     case 0:
181*437bfbebSnyanmisaka         return orig;
182*437bfbebSnyanmisaka         break;
183*437bfbebSnyanmisaka     case 1: /* 5/4 */
184*437bfbebSnyanmisaka         return (5 * orig) / 4;
185*437bfbebSnyanmisaka         break;
186*437bfbebSnyanmisaka     case 2: /* 5/3 */
187*437bfbebSnyanmisaka         return (5 * orig) / 3;
188*437bfbebSnyanmisaka         break;
189*437bfbebSnyanmisaka     case 3: /* 2 */
190*437bfbebSnyanmisaka         return 2 * orig;
191*437bfbebSnyanmisaka         break;
192*437bfbebSnyanmisaka     }
193*437bfbebSnyanmisaka 
194*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
195*437bfbebSnyanmisaka     return orig;
196*437bfbebSnyanmisaka }
197*437bfbebSnyanmisaka 
DecodeQuantizerDelta(vpBoolCoder_t * bit_ctx)198*437bfbebSnyanmisaka static RK_S32 DecodeQuantizerDelta(vpBoolCoder_t *bit_ctx)
199*437bfbebSnyanmisaka {
200*437bfbebSnyanmisaka     RK_S32  result = 0;
201*437bfbebSnyanmisaka 
202*437bfbebSnyanmisaka     FUN_T("FUN_IN");
203*437bfbebSnyanmisaka     if (vp8hwdDecodeBool128(bit_ctx)) {
204*437bfbebSnyanmisaka         result = vp8hwdReadBits(bit_ctx, 4);
205*437bfbebSnyanmisaka         if (vp8hwdDecodeBool128(bit_ctx))
206*437bfbebSnyanmisaka             result = -result;
207*437bfbebSnyanmisaka     }
208*437bfbebSnyanmisaka 
209*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
210*437bfbebSnyanmisaka     return result;
211*437bfbebSnyanmisaka }
212*437bfbebSnyanmisaka 
vp8d_parser_init(void * ctx,ParserCfg * parser_cfg)213*437bfbebSnyanmisaka MPP_RET vp8d_parser_init(void *ctx, ParserCfg *parser_cfg)
214*437bfbebSnyanmisaka {
215*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
216*437bfbebSnyanmisaka     VP8DContext *c = (VP8DContext *)ctx;
217*437bfbebSnyanmisaka     VP8DParserContext_t *p = (VP8DParserContext_t *)c->parse_ctx;
218*437bfbebSnyanmisaka 
219*437bfbebSnyanmisaka     mpp_env_get_u32("vp8d_debug", &vp8d_debug, 0);
220*437bfbebSnyanmisaka     FUN_T("FUN_IN");
221*437bfbebSnyanmisaka     if (p == NULL) {
222*437bfbebSnyanmisaka         p = (VP8DParserContext_t*)mpp_calloc(VP8DParserContext_t, 1);
223*437bfbebSnyanmisaka         if (NULL == p) {
224*437bfbebSnyanmisaka             mpp_err("vp8d malloc VP8DParserContext_t fail");
225*437bfbebSnyanmisaka             FUN_T("FUN_OUT");
226*437bfbebSnyanmisaka             return MPP_ERR_NOMEM;
227*437bfbebSnyanmisaka         }
228*437bfbebSnyanmisaka         c->parse_ctx = p;
229*437bfbebSnyanmisaka     }
230*437bfbebSnyanmisaka     p->packet_slots = parser_cfg->packet_slots;
231*437bfbebSnyanmisaka     p->frame_slots = parser_cfg->frame_slots;
232*437bfbebSnyanmisaka 
233*437bfbebSnyanmisaka     mpp_buf_slot_setup(p->frame_slots, 15);
234*437bfbebSnyanmisaka 
235*437bfbebSnyanmisaka     p->dxva_ctx = mpp_calloc(DXVA_PicParams_VP8, 1);
236*437bfbebSnyanmisaka 
237*437bfbebSnyanmisaka     if (NULL == p->dxva_ctx) {
238*437bfbebSnyanmisaka         mpp_err("vp8d malloc dxva_ctx fail");
239*437bfbebSnyanmisaka         FUN_T("FUN_OUT");
240*437bfbebSnyanmisaka         return MPP_ERR_NOMEM;
241*437bfbebSnyanmisaka     }
242*437bfbebSnyanmisaka     p->decMode = VP8HWD_VP8;
243*437bfbebSnyanmisaka     p->bitstream_sw_buf = mpp_malloc(RK_U8, VP8D_BUF_SIZE_BITMEM);
244*437bfbebSnyanmisaka     mpp_packet_init(&p->input_packet, p->bitstream_sw_buf,
245*437bfbebSnyanmisaka                     VP8D_BUF_SIZE_BITMEM);
246*437bfbebSnyanmisaka     p->max_stream_size = VP8D_BUF_SIZE_BITMEM;
247*437bfbebSnyanmisaka 
248*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
249*437bfbebSnyanmisaka     return ret;
250*437bfbebSnyanmisaka }
251*437bfbebSnyanmisaka 
vp8d_unref_frame(VP8DParserContext_t * p,VP8Frame * frame)252*437bfbebSnyanmisaka static void vp8d_unref_frame(VP8DParserContext_t *p, VP8Frame *frame)
253*437bfbebSnyanmisaka {
254*437bfbebSnyanmisaka 
255*437bfbebSnyanmisaka     FUN_T("FUN_IN");
256*437bfbebSnyanmisaka     if (NULL == frame || frame->ref_count <= 0
257*437bfbebSnyanmisaka         || frame->slot_index >= 0x7f) {
258*437bfbebSnyanmisaka         mpp_err("ref count alreay is zero");
259*437bfbebSnyanmisaka         FUN_T("FUN_OUT");
260*437bfbebSnyanmisaka         return;
261*437bfbebSnyanmisaka     }
262*437bfbebSnyanmisaka 
263*437bfbebSnyanmisaka     frame->ref_count--;
264*437bfbebSnyanmisaka     if (!frame->ref_count) {
265*437bfbebSnyanmisaka         if (frame->slot_index < 0x7f) {
266*437bfbebSnyanmisaka             MppBuffer framebuf = NULL;
267*437bfbebSnyanmisaka             if (frame->invisible) {
268*437bfbebSnyanmisaka                 mpp_buf_slot_get_prop(p->frame_slots, frame->slot_index, SLOT_BUFFER, &framebuf);
269*437bfbebSnyanmisaka                 mpp_buffer_put(framebuf);
270*437bfbebSnyanmisaka                 frame->invisible = 0;
271*437bfbebSnyanmisaka             }
272*437bfbebSnyanmisaka             mpp_buf_slot_clr_flag(p->frame_slots, frame->slot_index, SLOT_CODEC_USE);
273*437bfbebSnyanmisaka         }
274*437bfbebSnyanmisaka         frame->slot_index = 0xff;
275*437bfbebSnyanmisaka         mpp_frame_deinit(&frame->f);
276*437bfbebSnyanmisaka         mpp_free(frame);
277*437bfbebSnyanmisaka         frame = NULL;
278*437bfbebSnyanmisaka     }
279*437bfbebSnyanmisaka 
280*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
281*437bfbebSnyanmisaka     return;
282*437bfbebSnyanmisaka }
283*437bfbebSnyanmisaka 
vp8d_unref_allframe(VP8DParserContext_t * p)284*437bfbebSnyanmisaka static void vp8d_unref_allframe(VP8DParserContext_t *p)
285*437bfbebSnyanmisaka {
286*437bfbebSnyanmisaka 
287*437bfbebSnyanmisaka     FUN_T("FUN_IN");
288*437bfbebSnyanmisaka     if (NULL != p->frame_out) {
289*437bfbebSnyanmisaka         vp8d_unref_frame(p, p->frame_out);
290*437bfbebSnyanmisaka         p->frame_out = NULL;
291*437bfbebSnyanmisaka     }
292*437bfbebSnyanmisaka 
293*437bfbebSnyanmisaka     if (NULL != p->frame_ref) {
294*437bfbebSnyanmisaka         vp8d_unref_frame(p, p->frame_ref);
295*437bfbebSnyanmisaka         p->frame_ref = NULL;
296*437bfbebSnyanmisaka     }
297*437bfbebSnyanmisaka 
298*437bfbebSnyanmisaka     if (NULL != p->frame_golden) {
299*437bfbebSnyanmisaka         vp8d_unref_frame(p, p->frame_golden);
300*437bfbebSnyanmisaka         p->frame_golden = NULL;
301*437bfbebSnyanmisaka     }
302*437bfbebSnyanmisaka 
303*437bfbebSnyanmisaka     if (NULL != p->frame_alternate) {
304*437bfbebSnyanmisaka         vp8d_unref_frame(p, p->frame_alternate);
305*437bfbebSnyanmisaka         p->frame_alternate = NULL;
306*437bfbebSnyanmisaka     }
307*437bfbebSnyanmisaka 
308*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
309*437bfbebSnyanmisaka     return;
310*437bfbebSnyanmisaka }
311*437bfbebSnyanmisaka 
vp8d_parser_deinit(void * ctx)312*437bfbebSnyanmisaka MPP_RET vp8d_parser_deinit(void *ctx)
313*437bfbebSnyanmisaka {
314*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
315*437bfbebSnyanmisaka     VP8DContext *c = (VP8DContext *)ctx;
316*437bfbebSnyanmisaka     VP8DParserContext_t *p = (VP8DParserContext_t *)c->parse_ctx;
317*437bfbebSnyanmisaka 
318*437bfbebSnyanmisaka     FUN_T("FUN_IN");
319*437bfbebSnyanmisaka 
320*437bfbebSnyanmisaka     if (NULL != p->bitstream_sw_buf) {
321*437bfbebSnyanmisaka         mpp_free(p->bitstream_sw_buf);
322*437bfbebSnyanmisaka         p->bitstream_sw_buf = NULL;
323*437bfbebSnyanmisaka     }
324*437bfbebSnyanmisaka 
325*437bfbebSnyanmisaka     if (NULL != p->dxva_ctx) {
326*437bfbebSnyanmisaka         mpp_free(p->dxva_ctx);
327*437bfbebSnyanmisaka         p->dxva_ctx = NULL;
328*437bfbebSnyanmisaka     }
329*437bfbebSnyanmisaka 
330*437bfbebSnyanmisaka     vp8d_unref_allframe(p);
331*437bfbebSnyanmisaka 
332*437bfbebSnyanmisaka     if (p->input_packet) {
333*437bfbebSnyanmisaka         mpp_packet_deinit(&p->input_packet);
334*437bfbebSnyanmisaka         p->input_packet = NULL;
335*437bfbebSnyanmisaka     }
336*437bfbebSnyanmisaka 
337*437bfbebSnyanmisaka     if (p->stream_fp)
338*437bfbebSnyanmisaka         fclose(p->stream_fp);
339*437bfbebSnyanmisaka 
340*437bfbebSnyanmisaka     if ( NULL != p) {
341*437bfbebSnyanmisaka         mpp_free(p);
342*437bfbebSnyanmisaka     }
343*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
344*437bfbebSnyanmisaka     return ret;
345*437bfbebSnyanmisaka }
346*437bfbebSnyanmisaka /*!
347*437bfbebSnyanmisaka ***********************************************************************
348*437bfbebSnyanmisaka * \brief
349*437bfbebSnyanmisaka *   reset
350*437bfbebSnyanmisaka ***********************************************************************
351*437bfbebSnyanmisaka */
vp8d_parser_reset(void * ctx)352*437bfbebSnyanmisaka MPP_RET vp8d_parser_reset(void *ctx)
353*437bfbebSnyanmisaka {
354*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
355*437bfbebSnyanmisaka     VP8DContext *c = (VP8DContext *)ctx;
356*437bfbebSnyanmisaka     VP8DParserContext_t *p = (VP8DParserContext_t *)c->parse_ctx;
357*437bfbebSnyanmisaka 
358*437bfbebSnyanmisaka     FUN_T("FUN_IN");
359*437bfbebSnyanmisaka     vp8d_unref_allframe(p);
360*437bfbebSnyanmisaka     p->needKeyFrame = 0;
361*437bfbebSnyanmisaka     p->eos = 0;
362*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
363*437bfbebSnyanmisaka     return ret;
364*437bfbebSnyanmisaka }
365*437bfbebSnyanmisaka 
366*437bfbebSnyanmisaka /*!
367*437bfbebSnyanmisaka ***********************************************************************
368*437bfbebSnyanmisaka * \brief
369*437bfbebSnyanmisaka *   flush
370*437bfbebSnyanmisaka ***********************************************************************
371*437bfbebSnyanmisaka */
vp8d_parser_flush(void * ctx)372*437bfbebSnyanmisaka MPP_RET vp8d_parser_flush(void *ctx)
373*437bfbebSnyanmisaka {
374*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
375*437bfbebSnyanmisaka 
376*437bfbebSnyanmisaka     FUN_T("FUN_IN");
377*437bfbebSnyanmisaka     (void) ctx;
378*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
379*437bfbebSnyanmisaka     return ret;
380*437bfbebSnyanmisaka }
381*437bfbebSnyanmisaka 
382*437bfbebSnyanmisaka /*!
383*437bfbebSnyanmisaka ***********************************************************************
384*437bfbebSnyanmisaka * \brief
385*437bfbebSnyanmisaka *   control/perform
386*437bfbebSnyanmisaka ***********************************************************************
387*437bfbebSnyanmisaka */
vp8d_parser_control(void * ctx,MpiCmd cmd_type,void * param)388*437bfbebSnyanmisaka MPP_RET vp8d_parser_control(void *ctx, MpiCmd cmd_type, void *param)
389*437bfbebSnyanmisaka {
390*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
391*437bfbebSnyanmisaka 
392*437bfbebSnyanmisaka     FUN_T("FUN_IN");
393*437bfbebSnyanmisaka     (void)ctx;
394*437bfbebSnyanmisaka     (void)cmd_type;
395*437bfbebSnyanmisaka     (void)param;
396*437bfbebSnyanmisaka 
397*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
398*437bfbebSnyanmisaka     return ret;
399*437bfbebSnyanmisaka }
400*437bfbebSnyanmisaka 
401*437bfbebSnyanmisaka 
402*437bfbebSnyanmisaka /*!
403*437bfbebSnyanmisaka ***********************************************************************
404*437bfbebSnyanmisaka * \brief
405*437bfbebSnyanmisaka *   prepare
406*437bfbebSnyanmisaka ***********************************************************************
407*437bfbebSnyanmisaka */
408*437bfbebSnyanmisaka 
vp8d_parser_split_frame(RK_U8 * src,RK_U32 src_size,RK_U8 * dst,RK_U32 * dst_size)409*437bfbebSnyanmisaka static MPP_RET vp8d_parser_split_frame(RK_U8 *src, RK_U32 src_size,
410*437bfbebSnyanmisaka                                        RK_U8 *dst, RK_U32 *dst_size)
411*437bfbebSnyanmisaka {
412*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
413*437bfbebSnyanmisaka 
414*437bfbebSnyanmisaka     FUN_T("FUN_IN");
415*437bfbebSnyanmisaka     memcpy(dst, src, src_size);;
416*437bfbebSnyanmisaka     *dst_size = src_size;
417*437bfbebSnyanmisaka 
418*437bfbebSnyanmisaka     (void)dst;
419*437bfbebSnyanmisaka 
420*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
421*437bfbebSnyanmisaka     return ret;
422*437bfbebSnyanmisaka }
423*437bfbebSnyanmisaka 
424*437bfbebSnyanmisaka 
vp8d_parser_prepare(void * ctx,MppPacket pkt,HalDecTask * task)425*437bfbebSnyanmisaka MPP_RET vp8d_parser_prepare(void *ctx, MppPacket pkt, HalDecTask *task)
426*437bfbebSnyanmisaka {
427*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
428*437bfbebSnyanmisaka     RK_U32 out_size = 0, len_in = 0;
429*437bfbebSnyanmisaka     RK_U8 * pos = NULL;
430*437bfbebSnyanmisaka     RK_U8 *buf = NULL;
431*437bfbebSnyanmisaka     VP8DContext *c = (VP8DContext *)ctx;
432*437bfbebSnyanmisaka 
433*437bfbebSnyanmisaka     VP8DParserContext_t *p = (VP8DParserContext_t *)c->parse_ctx;
434*437bfbebSnyanmisaka     MppPacket input_packet = p->input_packet;
435*437bfbebSnyanmisaka 
436*437bfbebSnyanmisaka     FUN_T("FUN_IN");
437*437bfbebSnyanmisaka     task->valid = 0;
438*437bfbebSnyanmisaka 
439*437bfbebSnyanmisaka 
440*437bfbebSnyanmisaka     buf = pos = mpp_packet_get_pos(pkt);
441*437bfbebSnyanmisaka     p->pts = mpp_packet_get_pts(pkt);
442*437bfbebSnyanmisaka     p->dts = mpp_packet_get_dts(pkt);
443*437bfbebSnyanmisaka 
444*437bfbebSnyanmisaka     len_in = (RK_U32)mpp_packet_get_length(pkt),
445*437bfbebSnyanmisaka     p->eos = mpp_packet_get_eos(pkt);
446*437bfbebSnyanmisaka     // mpp_log("len_in = %d",len_in);
447*437bfbebSnyanmisaka     if (len_in > p->max_stream_size) {
448*437bfbebSnyanmisaka         mpp_free(p->bitstream_sw_buf);
449*437bfbebSnyanmisaka         p->bitstream_sw_buf = NULL;
450*437bfbebSnyanmisaka         p->bitstream_sw_buf = mpp_malloc(RK_U8, (len_in + 1024));
451*437bfbebSnyanmisaka         if (NULL == p->bitstream_sw_buf) {
452*437bfbebSnyanmisaka             mpp_err("vp8d_parser realloc fail");
453*437bfbebSnyanmisaka             return MPP_ERR_NOMEM;
454*437bfbebSnyanmisaka         }
455*437bfbebSnyanmisaka         p->max_stream_size = len_in + 1024;
456*437bfbebSnyanmisaka     }
457*437bfbebSnyanmisaka 
458*437bfbebSnyanmisaka     vp8d_parser_split_frame(buf,
459*437bfbebSnyanmisaka                             len_in,
460*437bfbebSnyanmisaka                             p->bitstream_sw_buf,
461*437bfbebSnyanmisaka                             &out_size);
462*437bfbebSnyanmisaka     pos += out_size;
463*437bfbebSnyanmisaka 
464*437bfbebSnyanmisaka     mpp_packet_set_pos(pkt, pos);
465*437bfbebSnyanmisaka 
466*437bfbebSnyanmisaka     if (out_size == 0 && p->eos) {
467*437bfbebSnyanmisaka         task->flags.eos = p->eos;
468*437bfbebSnyanmisaka         return ret;
469*437bfbebSnyanmisaka     }
470*437bfbebSnyanmisaka 
471*437bfbebSnyanmisaka 
472*437bfbebSnyanmisaka 
473*437bfbebSnyanmisaka     // mpp_log("p->bitstream_sw_buf = 0x%x", p->bitstream_sw_buf);
474*437bfbebSnyanmisaka     // mpp_log("out_size = 0x%x", out_size);
475*437bfbebSnyanmisaka     mpp_packet_set_data(input_packet, p->bitstream_sw_buf);
476*437bfbebSnyanmisaka     mpp_packet_set_size(input_packet, p->max_stream_size);
477*437bfbebSnyanmisaka     mpp_packet_set_length(input_packet, out_size);
478*437bfbebSnyanmisaka     p->stream_size = out_size;
479*437bfbebSnyanmisaka     task->input_packet = input_packet;
480*437bfbebSnyanmisaka     task->valid = 1;
481*437bfbebSnyanmisaka 
482*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
483*437bfbebSnyanmisaka     return ret;
484*437bfbebSnyanmisaka }
485*437bfbebSnyanmisaka 
486*437bfbebSnyanmisaka static MPP_RET
vp8d_convert_to_syntx(VP8DParserContext_t * p,HalDecTask * in_task)487*437bfbebSnyanmisaka vp8d_convert_to_syntx( VP8DParserContext_t *p, HalDecTask *in_task)
488*437bfbebSnyanmisaka {
489*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
490*437bfbebSnyanmisaka     RK_U32 i, tmp;
491*437bfbebSnyanmisaka     RK_U32 byteOffset = 0, extraBytesPacked = 0;
492*437bfbebSnyanmisaka     DXVA_PicParams_VP8 *pic_param = p->dxva_ctx;
493*437bfbebSnyanmisaka 
494*437bfbebSnyanmisaka     FUN_T("FUN_IN");
495*437bfbebSnyanmisaka     tmp = (p->bitstr.pos) * 8 + (8 - p->bitstr.count);
496*437bfbebSnyanmisaka 
497*437bfbebSnyanmisaka     if (p->frameTagSize == 4)
498*437bfbebSnyanmisaka         tmp += 8;
499*437bfbebSnyanmisaka 
500*437bfbebSnyanmisaka     if (p->decMode == VP8HWD_VP8 && p->keyFrame)
501*437bfbebSnyanmisaka         extraBytesPacked += 7;
502*437bfbebSnyanmisaka 
503*437bfbebSnyanmisaka     tmp += extraBytesPacked * 8;
504*437bfbebSnyanmisaka     byteOffset = tmp / 8;
505*437bfbebSnyanmisaka     pic_param->stream_start_bit = (byteOffset & 0x07U) * 8;
506*437bfbebSnyanmisaka     byteOffset &= (~0x07U);  /* align the base */
507*437bfbebSnyanmisaka     pic_param->stream_start_offset = byteOffset;
508*437bfbebSnyanmisaka 
509*437bfbebSnyanmisaka     pic_param->stream_start_bit += (tmp & 0x7);
510*437bfbebSnyanmisaka 
511*437bfbebSnyanmisaka     pic_param->frame_type = !p->keyFrame;
512*437bfbebSnyanmisaka     pic_param->stVP8Segments.segmentation_enabled = p->segmentationEnabled;
513*437bfbebSnyanmisaka     pic_param->stVP8Segments.update_mb_segmentation_map =
514*437bfbebSnyanmisaka         p->segmentationMapUpdate;
515*437bfbebSnyanmisaka     pic_param->mode_ref_lf_delta_enabled = p->modeRefLfEnabled;
516*437bfbebSnyanmisaka     pic_param->mb_no_coeff_skip = p->coeffSkipMode;
517*437bfbebSnyanmisaka     pic_param->width               = p->width;
518*437bfbebSnyanmisaka     pic_param->height              = p->height;
519*437bfbebSnyanmisaka     pic_param->decMode             = p->decMode;
520*437bfbebSnyanmisaka     pic_param->filter_type      = p->loopFilterType;
521*437bfbebSnyanmisaka     pic_param->sharpness    = p->loopFilterSharpness;
522*437bfbebSnyanmisaka     pic_param->filter_level     = p->loopFilterLevel;
523*437bfbebSnyanmisaka     pic_param->stVP8Segments.update_mb_segmentation_data =
524*437bfbebSnyanmisaka         p->segmentFeatureMode;
525*437bfbebSnyanmisaka     pic_param->version      = p->vpVersion;
526*437bfbebSnyanmisaka     pic_param->bool_value          = ((p->bitstr.value >> 24) & (0xFFU));
527*437bfbebSnyanmisaka     pic_param->bool_range          = (p->bitstr.range & (0xFFU));
528*437bfbebSnyanmisaka     pic_param->frameTagSize        = p->frameTagSize;
529*437bfbebSnyanmisaka     pic_param->streamEndPos        = p->bitstr.streamEndPos;
530*437bfbebSnyanmisaka     pic_param->log2_nbr_of_dct_partitions = p->nbrDctPartitions;
531*437bfbebSnyanmisaka     pic_param->offsetToDctParts    = p->offsetToDctParts;
532*437bfbebSnyanmisaka 
533*437bfbebSnyanmisaka     pic_param->y1ac_delta_q = p->qpYAc;
534*437bfbebSnyanmisaka     pic_param->y1dc_delta_q = p->qpYDc;
535*437bfbebSnyanmisaka     pic_param->y2ac_delta_q = p->qpY2Ac;
536*437bfbebSnyanmisaka     pic_param->y2dc_delta_q = p->qpY2Dc;
537*437bfbebSnyanmisaka     pic_param->uvac_delta_q = p->qpChAc;
538*437bfbebSnyanmisaka     pic_param->uvdc_delta_q = p->qpChDc;
539*437bfbebSnyanmisaka     pic_param->probe_skip_false = p->probMbSkipFalse;
540*437bfbebSnyanmisaka     pic_param->prob_intra = p->probIntra;
541*437bfbebSnyanmisaka     pic_param->prob_last = p->probRefLast;
542*437bfbebSnyanmisaka     pic_param->prob_golden = p->probRefGolden;
543*437bfbebSnyanmisaka 
544*437bfbebSnyanmisaka     memcpy(pic_param->vp8_coef_update_probs, p->entropy.probCoeffs,
545*437bfbebSnyanmisaka            sizeof(pic_param->vp8_coef_update_probs));
546*437bfbebSnyanmisaka     memcpy(pic_param->vp8_mv_update_probs, p->entropy.probMvContext,
547*437bfbebSnyanmisaka            sizeof(pic_param->vp8_mv_update_probs));
548*437bfbebSnyanmisaka 
549*437bfbebSnyanmisaka     for ( i = 0; i < 3; i++) {
550*437bfbebSnyanmisaka         pic_param->intra_chroma_prob[i] = p->entropy.probChromaPredMode[i];
551*437bfbebSnyanmisaka         pic_param->stVP8Segments.mb_segment_tree_probs[i] = p->probSegment[i];
552*437bfbebSnyanmisaka     }
553*437bfbebSnyanmisaka 
554*437bfbebSnyanmisaka     pic_param->ref_frame_sign_bias_golden = p->refFrameSignBias[0];
555*437bfbebSnyanmisaka     pic_param->ref_frame_sign_bias_altref = p->refFrameSignBias[1];
556*437bfbebSnyanmisaka 
557*437bfbebSnyanmisaka 
558*437bfbebSnyanmisaka     for (i = 0; i < 4; i++) {
559*437bfbebSnyanmisaka         pic_param->stVP8Segments.segment_feature_data[0][i] = p->segmentQp[i];
560*437bfbebSnyanmisaka         pic_param->ref_lf_deltas[i] = p->mbRefLfDelta[i];
561*437bfbebSnyanmisaka         pic_param->mode_lf_deltas[i] = p->mbModeLfDelta[i];
562*437bfbebSnyanmisaka         pic_param->stVP8Segments.segment_feature_data[1][i] =
563*437bfbebSnyanmisaka             p->segmentLoopfilter[i];
564*437bfbebSnyanmisaka         pic_param->intra_16x16_prob[i] = p->entropy.probLuma16x16PredMode[i];
565*437bfbebSnyanmisaka     }
566*437bfbebSnyanmisaka 
567*437bfbebSnyanmisaka     p->dxva_ctx->CurrPic.Index7Bits = p->frame_out->slot_index;
568*437bfbebSnyanmisaka     memset(in_task->refer, -1, sizeof(in_task->refer));
569*437bfbebSnyanmisaka 
570*437bfbebSnyanmisaka     if (p->frame_ref != NULL) {
571*437bfbebSnyanmisaka         pic_param->lst_fb_idx.Index7Bits = p->frame_ref->slot_index;
572*437bfbebSnyanmisaka         mpp_buf_slot_set_flag(p->frame_slots, p->frame_ref->slot_index,
573*437bfbebSnyanmisaka                               SLOT_HAL_INPUT);
574*437bfbebSnyanmisaka         in_task->refer[0] = p->frame_ref->slot_index;
575*437bfbebSnyanmisaka     } else {
576*437bfbebSnyanmisaka         pic_param->lst_fb_idx.Index7Bits = 0x7f;
577*437bfbebSnyanmisaka     }
578*437bfbebSnyanmisaka 
579*437bfbebSnyanmisaka     if (p->frame_golden != NULL) {
580*437bfbebSnyanmisaka         pic_param->gld_fb_idx.Index7Bits = p->frame_golden->slot_index;
581*437bfbebSnyanmisaka         mpp_buf_slot_set_flag(p->frame_slots, p->frame_golden->slot_index,
582*437bfbebSnyanmisaka                               SLOT_HAL_INPUT);
583*437bfbebSnyanmisaka         in_task->refer[1] = p->frame_golden->slot_index;
584*437bfbebSnyanmisaka     } else {
585*437bfbebSnyanmisaka         pic_param->gld_fb_idx.Index7Bits = 0x7f;
586*437bfbebSnyanmisaka     }
587*437bfbebSnyanmisaka 
588*437bfbebSnyanmisaka     if (p->frame_alternate != NULL) {
589*437bfbebSnyanmisaka         pic_param->alt_fb_idx.Index7Bits = p->frame_alternate->slot_index;
590*437bfbebSnyanmisaka         mpp_buf_slot_set_flag(p->frame_slots, p->frame_alternate->slot_index,
591*437bfbebSnyanmisaka                               SLOT_HAL_INPUT);
592*437bfbebSnyanmisaka         in_task->refer[2] = p->frame_alternate->slot_index;
593*437bfbebSnyanmisaka     } else {
594*437bfbebSnyanmisaka         pic_param->alt_fb_idx.Index7Bits = 0x7f;
595*437bfbebSnyanmisaka     }
596*437bfbebSnyanmisaka 
597*437bfbebSnyanmisaka     memcpy(pic_param->dctPartitionOffsets, p->dctPartitionOffsets,
598*437bfbebSnyanmisaka            sizeof(p->dctPartitionOffsets));
599*437bfbebSnyanmisaka 
600*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
601*437bfbebSnyanmisaka     return ret;
602*437bfbebSnyanmisaka }
603*437bfbebSnyanmisaka 
vp8d_alloc_frame(VP8DParserContext_t * p)604*437bfbebSnyanmisaka static MPP_RET vp8d_alloc_frame(VP8DParserContext_t *p)
605*437bfbebSnyanmisaka {
606*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
607*437bfbebSnyanmisaka 
608*437bfbebSnyanmisaka     FUN_T("FUN_IN");
609*437bfbebSnyanmisaka     if (NULL == p->frame_out) {
610*437bfbebSnyanmisaka         p->frame_out = mpp_calloc(VP8Frame, 1);
611*437bfbebSnyanmisaka         if (NULL == p->frame_out) {
612*437bfbebSnyanmisaka             mpp_err("alloc vp8 frame fail");
613*437bfbebSnyanmisaka             return MPP_ERR_NOMEM;
614*437bfbebSnyanmisaka         }
615*437bfbebSnyanmisaka 
616*437bfbebSnyanmisaka         if (NULL == p->frame_out->f) {
617*437bfbebSnyanmisaka             mpp_frame_init(&p->frame_out->f);
618*437bfbebSnyanmisaka             if (NULL == p->frame_out->f) {
619*437bfbebSnyanmisaka                 mpp_err("alloc vp8 mpp frame fail");
620*437bfbebSnyanmisaka                 return MPP_ERR_NOMEM;
621*437bfbebSnyanmisaka             }
622*437bfbebSnyanmisaka         }
623*437bfbebSnyanmisaka         p->frame_out->slot_index = 0xff;
624*437bfbebSnyanmisaka         p->frame_out->invisible = !p->showFrame;
625*437bfbebSnyanmisaka     }
626*437bfbebSnyanmisaka 
627*437bfbebSnyanmisaka     if (p->frame_out->slot_index == 0xff) {
628*437bfbebSnyanmisaka         mpp_frame_set_width(p->frame_out->f, p->width);
629*437bfbebSnyanmisaka         mpp_frame_set_height(p->frame_out->f, p->height);
630*437bfbebSnyanmisaka         mpp_frame_set_hor_stride(p->frame_out->f, 0);
631*437bfbebSnyanmisaka         mpp_frame_set_ver_stride(p->frame_out->f, 0);
632*437bfbebSnyanmisaka         mpp_frame_set_errinfo(p->frame_out->f, 0);
633*437bfbebSnyanmisaka         mpp_frame_set_pts(p->frame_out->f, p->pts);
634*437bfbebSnyanmisaka         mpp_frame_set_dts(p->frame_out->f, p->dts);
635*437bfbebSnyanmisaka         ret = mpp_buf_slot_get_unused(p->frame_slots,
636*437bfbebSnyanmisaka                                       &p->frame_out->slot_index);
637*437bfbebSnyanmisaka         if (MPP_OK != ret) {
638*437bfbebSnyanmisaka             mpp_err("vp8 buf_slot_get_unused get fail");
639*437bfbebSnyanmisaka             return ret;
640*437bfbebSnyanmisaka         }
641*437bfbebSnyanmisaka         mpp_buf_slot_set_prop(p->frame_slots, p->frame_out->slot_index,
642*437bfbebSnyanmisaka                               SLOT_FRAME, p->frame_out->f);
643*437bfbebSnyanmisaka         mpp_buf_slot_set_flag(p->frame_slots, p->frame_out->slot_index,
644*437bfbebSnyanmisaka                               SLOT_CODEC_USE);
645*437bfbebSnyanmisaka         mpp_buf_slot_set_flag(p->frame_slots, p->frame_out->slot_index,
646*437bfbebSnyanmisaka                               SLOT_HAL_OUTPUT);
647*437bfbebSnyanmisaka         mpp_frame_set_mode(p->frame_out->f, 0);
648*437bfbebSnyanmisaka 
649*437bfbebSnyanmisaka         if (p->showFrame) {
650*437bfbebSnyanmisaka             mpp_buf_slot_set_flag(p->frame_slots, p->frame_out->slot_index,
651*437bfbebSnyanmisaka                                   SLOT_QUEUE_USE);
652*437bfbebSnyanmisaka             mpp_buf_slot_enqueue(p->frame_slots, p->frame_out->slot_index,
653*437bfbebSnyanmisaka                                  QUEUE_DISPLAY);
654*437bfbebSnyanmisaka         }
655*437bfbebSnyanmisaka         p->frame_out->ref_count++;
656*437bfbebSnyanmisaka     }
657*437bfbebSnyanmisaka 
658*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
659*437bfbebSnyanmisaka     return ret;
660*437bfbebSnyanmisaka }
661*437bfbebSnyanmisaka 
vp8d_ref_frame(VP8Frame * frame)662*437bfbebSnyanmisaka static void vp8d_ref_frame(VP8Frame *frame)
663*437bfbebSnyanmisaka {
664*437bfbebSnyanmisaka 
665*437bfbebSnyanmisaka     FUN_T("FUN_IN");
666*437bfbebSnyanmisaka     if ((NULL == frame) || (frame->slot_index >= 0x7f)) {
667*437bfbebSnyanmisaka         mpp_err("frame is null or slot_index is no valid");
668*437bfbebSnyanmisaka         return;
669*437bfbebSnyanmisaka     }
670*437bfbebSnyanmisaka     frame->ref_count++;
671*437bfbebSnyanmisaka 
672*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
673*437bfbebSnyanmisaka }
674*437bfbebSnyanmisaka 
675*437bfbebSnyanmisaka 
vp8d_ref_update(VP8DParserContext_t * p)676*437bfbebSnyanmisaka static MPP_RET vp8d_ref_update(VP8DParserContext_t *p)
677*437bfbebSnyanmisaka {
678*437bfbebSnyanmisaka 
679*437bfbebSnyanmisaka     FUN_T("FUN_IN");
680*437bfbebSnyanmisaka     if (p->decMode != VP8HWD_WEBP) {
681*437bfbebSnyanmisaka         if (p->copyBufferToAlternate == 1) {
682*437bfbebSnyanmisaka             if (NULL != p->frame_alternate) {
683*437bfbebSnyanmisaka                 vp8d_unref_frame(p, p->frame_alternate);
684*437bfbebSnyanmisaka                 p->frame_alternate = NULL;
685*437bfbebSnyanmisaka             }
686*437bfbebSnyanmisaka             p->frame_alternate = p->frame_ref;
687*437bfbebSnyanmisaka             vp8d_ref_frame(p->frame_alternate);
688*437bfbebSnyanmisaka         } else if (p->copyBufferToAlternate == 2) {
689*437bfbebSnyanmisaka             if (NULL != p->frame_alternate) {
690*437bfbebSnyanmisaka                 vp8d_unref_frame(p, p->frame_alternate);
691*437bfbebSnyanmisaka                 p->frame_alternate = NULL;
692*437bfbebSnyanmisaka             }
693*437bfbebSnyanmisaka             p->frame_alternate = p->frame_golden;
694*437bfbebSnyanmisaka             vp8d_ref_frame(p->frame_alternate);
695*437bfbebSnyanmisaka         }
696*437bfbebSnyanmisaka 
697*437bfbebSnyanmisaka         if (p->copyBufferToGolden == 1) {
698*437bfbebSnyanmisaka             if (NULL != p->frame_golden) {
699*437bfbebSnyanmisaka                 vp8d_unref_frame(p, p->frame_golden);
700*437bfbebSnyanmisaka                 p->frame_golden = NULL;
701*437bfbebSnyanmisaka             }
702*437bfbebSnyanmisaka             p->frame_golden = p->frame_ref;
703*437bfbebSnyanmisaka             vp8d_ref_frame(p->frame_golden);
704*437bfbebSnyanmisaka         } else if (p->copyBufferToGolden == 2) {
705*437bfbebSnyanmisaka             if (NULL != p->frame_golden) {
706*437bfbebSnyanmisaka                 vp8d_unref_frame(p, p->frame_golden);
707*437bfbebSnyanmisaka                 p->frame_golden = NULL;
708*437bfbebSnyanmisaka             }
709*437bfbebSnyanmisaka             p->frame_golden = p->frame_alternate;
710*437bfbebSnyanmisaka             vp8d_ref_frame(p->frame_golden);
711*437bfbebSnyanmisaka         }
712*437bfbebSnyanmisaka 
713*437bfbebSnyanmisaka         if (p->refreshGolden) {
714*437bfbebSnyanmisaka             if (NULL != p->frame_golden) {
715*437bfbebSnyanmisaka                 vp8d_unref_frame(p, p->frame_golden);
716*437bfbebSnyanmisaka                 p->frame_golden = NULL;
717*437bfbebSnyanmisaka             }
718*437bfbebSnyanmisaka             p->frame_golden = p->frame_out;
719*437bfbebSnyanmisaka             vp8d_ref_frame(p->frame_golden);
720*437bfbebSnyanmisaka         }
721*437bfbebSnyanmisaka 
722*437bfbebSnyanmisaka         if (p->refreshAlternate) {
723*437bfbebSnyanmisaka             if (NULL != p->frame_alternate) {
724*437bfbebSnyanmisaka                 vp8d_unref_frame(p, p->frame_alternate);
725*437bfbebSnyanmisaka                 p->frame_alternate = NULL;
726*437bfbebSnyanmisaka             }
727*437bfbebSnyanmisaka             p->frame_alternate = p->frame_out;
728*437bfbebSnyanmisaka             vp8d_ref_frame(p->frame_out);
729*437bfbebSnyanmisaka         }
730*437bfbebSnyanmisaka 
731*437bfbebSnyanmisaka         if (p->refreshLast) {
732*437bfbebSnyanmisaka             if (NULL != p->frame_ref) {
733*437bfbebSnyanmisaka                 vp8d_unref_frame(p, p->frame_ref);
734*437bfbebSnyanmisaka                 p->frame_ref = NULL;
735*437bfbebSnyanmisaka             }
736*437bfbebSnyanmisaka             p->frame_ref = p->frame_out;
737*437bfbebSnyanmisaka             vp8d_ref_frame(p->frame_ref);
738*437bfbebSnyanmisaka         }
739*437bfbebSnyanmisaka         vp8d_unref_frame(p, p->frame_out);
740*437bfbebSnyanmisaka         p->frame_out = NULL;
741*437bfbebSnyanmisaka     }
742*437bfbebSnyanmisaka 
743*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
744*437bfbebSnyanmisaka     return 0;
745*437bfbebSnyanmisaka }
746*437bfbebSnyanmisaka 
vp8hwdResetProbs(VP8DParserContext_t * p)747*437bfbebSnyanmisaka static void vp8hwdResetProbs(VP8DParserContext_t *p)
748*437bfbebSnyanmisaka {
749*437bfbebSnyanmisaka     RK_U32 i, j, k, l;
750*437bfbebSnyanmisaka     static const RK_U32 Vp7DefaultScan[] = {
751*437bfbebSnyanmisaka         0,  1,  4,  8,  5,  2,  3,  6,
752*437bfbebSnyanmisaka         9, 12, 13, 10,  7, 11, 14, 15,
753*437bfbebSnyanmisaka     };
754*437bfbebSnyanmisaka 
755*437bfbebSnyanmisaka     FUN_T("FUN_IN");
756*437bfbebSnyanmisaka     for ( i = 0 ; i < 16 ; ++i )
757*437bfbebSnyanmisaka         p->vp7ScanOrder[i] = Vp7DefaultScan[i];
758*437bfbebSnyanmisaka 
759*437bfbebSnyanmisaka 
760*437bfbebSnyanmisaka     /* Intra-prediction modes */
761*437bfbebSnyanmisaka     p->entropy.probLuma16x16PredMode[0] = 112;
762*437bfbebSnyanmisaka     p->entropy.probLuma16x16PredMode[1] = 86;
763*437bfbebSnyanmisaka     p->entropy.probLuma16x16PredMode[2] = 140;
764*437bfbebSnyanmisaka     p->entropy.probLuma16x16PredMode[3] = 37;
765*437bfbebSnyanmisaka     p->entropy.probChromaPredMode[0] = 162;
766*437bfbebSnyanmisaka     p->entropy.probChromaPredMode[1] = 101;
767*437bfbebSnyanmisaka     p->entropy.probChromaPredMode[2] = 204;
768*437bfbebSnyanmisaka 
769*437bfbebSnyanmisaka     for (i = 0; i < MAX_NBR_OF_MB_REF_LF_DELTAS; i++)
770*437bfbebSnyanmisaka         p->mbRefLfDelta[i] = 0;
771*437bfbebSnyanmisaka 
772*437bfbebSnyanmisaka     for (i = 0; i < MAX_NBR_OF_MB_MODE_LF_DELTAS; i++)
773*437bfbebSnyanmisaka         p->mbModeLfDelta[i] = 0;
774*437bfbebSnyanmisaka 
775*437bfbebSnyanmisaka     /* MV context */
776*437bfbebSnyanmisaka     k = 0;
777*437bfbebSnyanmisaka     if (p->decMode == VP8HWD_VP8) {
778*437bfbebSnyanmisaka         for ( i = 0 ; i < 2 ; ++i )
779*437bfbebSnyanmisaka             for ( j = 0 ; j < VP8_MV_PROBS_PER_COMPONENT ; ++j, ++k )
780*437bfbebSnyanmisaka                 p->entropy.probMvContext[i][j] = Vp8DefaultMvProbs[i][j];
781*437bfbebSnyanmisaka     } else {
782*437bfbebSnyanmisaka         for ( i = 0 ; i < 2 ; ++i )
783*437bfbebSnyanmisaka             for ( j = 0 ; j < VP7_MV_PROBS_PER_COMPONENT ; ++j, ++k )
784*437bfbebSnyanmisaka                 p->entropy.probMvContext[i][j] = Vp7DefaultMvProbs[i][j];
785*437bfbebSnyanmisaka     }
786*437bfbebSnyanmisaka 
787*437bfbebSnyanmisaka     /* Coefficients */
788*437bfbebSnyanmisaka     for ( i = 0 ; i < 4 ; ++i )
789*437bfbebSnyanmisaka         for ( j = 0 ; j < 8 ; ++j )
790*437bfbebSnyanmisaka             for ( k = 0 ; k < 3 ; ++k )
791*437bfbebSnyanmisaka                 for ( l = 0 ; l < 11 ; ++l )
792*437bfbebSnyanmisaka                     p->entropy.probCoeffs[i][j][k][l] =
793*437bfbebSnyanmisaka                         DefaultCoeffProbs[i][j][k][l];
794*437bfbebSnyanmisaka 
795*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
796*437bfbebSnyanmisaka }
797*437bfbebSnyanmisaka 
vp8hwdDecodeCoeffUpdate(VP8DParserContext_t * p)798*437bfbebSnyanmisaka static void vp8hwdDecodeCoeffUpdate(VP8DParserContext_t *p)
799*437bfbebSnyanmisaka {
800*437bfbebSnyanmisaka     RK_U32 i, j, k, l;
801*437bfbebSnyanmisaka 
802*437bfbebSnyanmisaka     FUN_T("FUN_IN");
803*437bfbebSnyanmisaka     for ( i = 0; i < 4; i++ ) {
804*437bfbebSnyanmisaka         for ( j = 0; j < 8; j++ ) {
805*437bfbebSnyanmisaka             for ( k = 0; k < 3; k++ ) {
806*437bfbebSnyanmisaka                 for ( l = 0; l < 11; l++ ) {
807*437bfbebSnyanmisaka                     if (vp8hwdDecodeBool(&p->bitstr,
808*437bfbebSnyanmisaka                                          CoeffUpdateProbs[i][j][k][l]))
809*437bfbebSnyanmisaka                         p->entropy.probCoeffs[i][j][k][l] =
810*437bfbebSnyanmisaka                             vp8hwdReadBits(&p->bitstr, 8);
811*437bfbebSnyanmisaka                 }
812*437bfbebSnyanmisaka             }
813*437bfbebSnyanmisaka         }
814*437bfbebSnyanmisaka     }
815*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
816*437bfbebSnyanmisaka }
817*437bfbebSnyanmisaka 
vp8_header_parser(VP8DParserContext_t * p,RK_U8 * pbase,RK_U32 size)818*437bfbebSnyanmisaka static MPP_RET vp8_header_parser(VP8DParserContext_t *p, RK_U8 *pbase,
819*437bfbebSnyanmisaka                                  RK_U32 size)
820*437bfbebSnyanmisaka {
821*437bfbebSnyanmisaka     RK_U32  tmp;
822*437bfbebSnyanmisaka     int     i, j;
823*437bfbebSnyanmisaka     vpBoolCoder_t *bit_ctx = &p->bitstr;
824*437bfbebSnyanmisaka 
825*437bfbebSnyanmisaka     FUN_T("FUN_IN");
826*437bfbebSnyanmisaka     if (p->keyFrame) {
827*437bfbebSnyanmisaka         tmp = (pbase[0] << 16) | (pbase[1] << 8) | (pbase[2] << 0);
828*437bfbebSnyanmisaka         if (tmp != VP8_KEY_FRAME_START_CODE)
829*437bfbebSnyanmisaka             return MPP_ERR_PROTOL;
830*437bfbebSnyanmisaka         tmp = (pbase[3] << 0) | (pbase[4] << 8);
831*437bfbebSnyanmisaka         p->width = tmp & 0x3fff;
832*437bfbebSnyanmisaka         p->scaledWidth = ScaleDimension(p->width, tmp >> 14);
833*437bfbebSnyanmisaka         tmp = (pbase[5] << 0) | (pbase[6] << 8);
834*437bfbebSnyanmisaka         p->height = tmp & 0x3fff;
835*437bfbebSnyanmisaka         p->scaledHeight = ScaleDimension(p->height, tmp >> 14);
836*437bfbebSnyanmisaka         pbase += 7;
837*437bfbebSnyanmisaka         size -= 7;
838*437bfbebSnyanmisaka     }
839*437bfbebSnyanmisaka     vp8hwdBoolStart(bit_ctx, pbase, size);
840*437bfbebSnyanmisaka     if (p->keyFrame) {
841*437bfbebSnyanmisaka         p->colorSpace = (vpColorSpace_e)vp8hwdDecodeBool128(bit_ctx);
842*437bfbebSnyanmisaka         p->clamping = vp8hwdDecodeBool128(bit_ctx);
843*437bfbebSnyanmisaka     }
844*437bfbebSnyanmisaka     p->segmentationEnabled = vp8hwdDecodeBool128(bit_ctx);
845*437bfbebSnyanmisaka     p->segmentationMapUpdate = 0;
846*437bfbebSnyanmisaka     if (p->segmentationEnabled) {
847*437bfbebSnyanmisaka         p->segmentationMapUpdate = vp8hwdDecodeBool128(bit_ctx);
848*437bfbebSnyanmisaka         if (vp8hwdDecodeBool128(bit_ctx)) {    /* Segmentation map update */
849*437bfbebSnyanmisaka             p->segmentFeatureMode = vp8hwdDecodeBool128(bit_ctx);
850*437bfbebSnyanmisaka             memset(&p->segmentQp[0], 0, MAX_NBR_OF_SEGMENTS * sizeof(RK_S32));
851*437bfbebSnyanmisaka             memset(&p->segmentLoopfilter[0], 0,
852*437bfbebSnyanmisaka                    MAX_NBR_OF_SEGMENTS * sizeof(RK_S32));
853*437bfbebSnyanmisaka             for (i = 0; i < MAX_NBR_OF_SEGMENTS; i++) {
854*437bfbebSnyanmisaka                 if (vp8hwdDecodeBool128(bit_ctx)) {
855*437bfbebSnyanmisaka                     p->segmentQp[i] = vp8hwdReadBits(bit_ctx, 7);
856*437bfbebSnyanmisaka                     if (vp8hwdDecodeBool128(bit_ctx))
857*437bfbebSnyanmisaka                         p->segmentQp[i] = -p->segmentQp[i];
858*437bfbebSnyanmisaka                 }
859*437bfbebSnyanmisaka             }
860*437bfbebSnyanmisaka             for (i = 0; i < MAX_NBR_OF_SEGMENTS; i++) {
861*437bfbebSnyanmisaka                 if (vp8hwdDecodeBool128(bit_ctx)) {
862*437bfbebSnyanmisaka                     p->segmentLoopfilter[i] = vp8hwdReadBits(bit_ctx, 6);
863*437bfbebSnyanmisaka                     if (vp8hwdDecodeBool128(bit_ctx))
864*437bfbebSnyanmisaka                         p->segmentLoopfilter[i] = -p->segmentLoopfilter[i];
865*437bfbebSnyanmisaka                 }
866*437bfbebSnyanmisaka             }
867*437bfbebSnyanmisaka         }
868*437bfbebSnyanmisaka         if (p->segmentationMapUpdate) {
869*437bfbebSnyanmisaka             p->probSegment[0] = 255;
870*437bfbebSnyanmisaka             p->probSegment[1] = 255;
871*437bfbebSnyanmisaka             p->probSegment[2] = 255;
872*437bfbebSnyanmisaka             for (i = 0; i < 3; i++) {
873*437bfbebSnyanmisaka                 if (vp8hwdDecodeBool128(bit_ctx)) {
874*437bfbebSnyanmisaka                     p->probSegment[i] = vp8hwdReadBits(bit_ctx, 8);
875*437bfbebSnyanmisaka                 }
876*437bfbebSnyanmisaka             }
877*437bfbebSnyanmisaka         }
878*437bfbebSnyanmisaka         if (bit_ctx->strmError) {
879*437bfbebSnyanmisaka             mpp_err_f("paser header stream no enough");
880*437bfbebSnyanmisaka             FUN_T("FUN_OUT");
881*437bfbebSnyanmisaka             return MPP_ERR_STREAM;
882*437bfbebSnyanmisaka         }
883*437bfbebSnyanmisaka     }
884*437bfbebSnyanmisaka     p->loopFilterType = vp8hwdDecodeBool128(bit_ctx);
885*437bfbebSnyanmisaka     p->loopFilterLevel = vp8hwdReadBits(bit_ctx, 6);
886*437bfbebSnyanmisaka     p->loopFilterSharpness = vp8hwdReadBits(bit_ctx, 3);
887*437bfbebSnyanmisaka     p->modeRefLfEnabled = vp8hwdDecodeBool128(bit_ctx);
888*437bfbebSnyanmisaka     if (p->modeRefLfEnabled) {
889*437bfbebSnyanmisaka         if (vp8hwdDecodeBool128(bit_ctx)) {
890*437bfbebSnyanmisaka             for (i = 0; i < MAX_NBR_OF_MB_REF_LF_DELTAS; i++) {
891*437bfbebSnyanmisaka                 if (vp8hwdDecodeBool128(bit_ctx)) {
892*437bfbebSnyanmisaka                     p->mbRefLfDelta[i] = vp8hwdReadBits(bit_ctx, 6);
893*437bfbebSnyanmisaka                     if (vp8hwdDecodeBool128(bit_ctx))
894*437bfbebSnyanmisaka                         p->mbRefLfDelta[i] = -p->mbRefLfDelta[i];
895*437bfbebSnyanmisaka                 }
896*437bfbebSnyanmisaka             }
897*437bfbebSnyanmisaka             for (i = 0; i < MAX_NBR_OF_MB_MODE_LF_DELTAS; i++) {
898*437bfbebSnyanmisaka                 if (vp8hwdDecodeBool128(&p->bitstr)) {
899*437bfbebSnyanmisaka                     p->mbModeLfDelta[i] = vp8hwdReadBits(bit_ctx, 6);
900*437bfbebSnyanmisaka                     if (vp8hwdDecodeBool128(bit_ctx))
901*437bfbebSnyanmisaka                         p->mbModeLfDelta[i] = -p->mbModeLfDelta[i];
902*437bfbebSnyanmisaka                 }
903*437bfbebSnyanmisaka             }
904*437bfbebSnyanmisaka         }
905*437bfbebSnyanmisaka     }
906*437bfbebSnyanmisaka     if (bit_ctx->strmError) {
907*437bfbebSnyanmisaka         mpp_err_f("paser header stream no enough");
908*437bfbebSnyanmisaka         FUN_T("FUN_OUT");
909*437bfbebSnyanmisaka         return MPP_ERR_STREAM;
910*437bfbebSnyanmisaka     }
911*437bfbebSnyanmisaka     p->nbrDctPartitions = vp8hwdReadBits(bit_ctx, 2);
912*437bfbebSnyanmisaka     p->qpYAc = vp8hwdReadBits(bit_ctx, 7);
913*437bfbebSnyanmisaka     p->qpYDc = DecodeQuantizerDelta(bit_ctx);
914*437bfbebSnyanmisaka     p->qpY2Dc = DecodeQuantizerDelta(bit_ctx);
915*437bfbebSnyanmisaka     p->qpY2Ac = DecodeQuantizerDelta(bit_ctx);
916*437bfbebSnyanmisaka     p->qpChDc = DecodeQuantizerDelta(bit_ctx);
917*437bfbebSnyanmisaka     p->qpChAc = DecodeQuantizerDelta(bit_ctx);
918*437bfbebSnyanmisaka     if (p->keyFrame) {
919*437bfbebSnyanmisaka         p->refreshGolden          = 1;
920*437bfbebSnyanmisaka         p->refreshAlternate       = 1;
921*437bfbebSnyanmisaka         p->copyBufferToGolden     = 0;
922*437bfbebSnyanmisaka         p->copyBufferToAlternate  = 0;
923*437bfbebSnyanmisaka 
924*437bfbebSnyanmisaka         /* Refresh entropy probs */
925*437bfbebSnyanmisaka         p->refreshEntropyProbs = vp8hwdDecodeBool128(bit_ctx);
926*437bfbebSnyanmisaka 
927*437bfbebSnyanmisaka         p->refFrameSignBias[0] = 0;
928*437bfbebSnyanmisaka         p->refFrameSignBias[1] = 0;
929*437bfbebSnyanmisaka         p->refreshLast = 1;
930*437bfbebSnyanmisaka     } else {
931*437bfbebSnyanmisaka         /* Refresh golden */
932*437bfbebSnyanmisaka         p->refreshGolden = vp8hwdDecodeBool128(bit_ctx);
933*437bfbebSnyanmisaka         /* Refresh alternate */
934*437bfbebSnyanmisaka         p->refreshAlternate = vp8hwdDecodeBool128(bit_ctx);
935*437bfbebSnyanmisaka         if ( p->refreshGolden == 0 ) {
936*437bfbebSnyanmisaka             /* Copy to golden */
937*437bfbebSnyanmisaka             p->copyBufferToGolden = vp8hwdReadBits(bit_ctx, 2);
938*437bfbebSnyanmisaka         } else
939*437bfbebSnyanmisaka             p->copyBufferToGolden = 0;
940*437bfbebSnyanmisaka 
941*437bfbebSnyanmisaka         if ( p->refreshAlternate == 0 ) {
942*437bfbebSnyanmisaka             /* Copy to alternate */
943*437bfbebSnyanmisaka             p->copyBufferToAlternate = vp8hwdReadBits(bit_ctx, 2);
944*437bfbebSnyanmisaka         } else
945*437bfbebSnyanmisaka             p->copyBufferToAlternate = 0;
946*437bfbebSnyanmisaka 
947*437bfbebSnyanmisaka         /* Sign bias for golden frame */
948*437bfbebSnyanmisaka         p->refFrameSignBias[0] = vp8hwdDecodeBool128(bit_ctx);
949*437bfbebSnyanmisaka         /* Sign bias for alternate frame */
950*437bfbebSnyanmisaka         p->refFrameSignBias[1] = vp8hwdDecodeBool128(bit_ctx);
951*437bfbebSnyanmisaka         /* Refresh entropy probs */
952*437bfbebSnyanmisaka         p->refreshEntropyProbs = vp8hwdDecodeBool128(bit_ctx);
953*437bfbebSnyanmisaka         /* Refresh last */
954*437bfbebSnyanmisaka         p->refreshLast = vp8hwdDecodeBool128(bit_ctx);
955*437bfbebSnyanmisaka     }
956*437bfbebSnyanmisaka 
957*437bfbebSnyanmisaka     /* Make a "backup" of current entropy probabilities if refresh is not set */
958*437bfbebSnyanmisaka     if (p->refreshEntropyProbs == 0) {
959*437bfbebSnyanmisaka         memcpy((void*)&p->entropyLast, (void*)&p->entropy,
960*437bfbebSnyanmisaka                (unsigned long)sizeof(vp8EntropyProbs_t));
961*437bfbebSnyanmisaka         memcpy( (void*)p->vp7PrevScanOrder, (void*)p->vp7ScanOrder,
962*437bfbebSnyanmisaka                 (unsigned long)sizeof(p->vp7ScanOrder));
963*437bfbebSnyanmisaka     }
964*437bfbebSnyanmisaka 
965*437bfbebSnyanmisaka     vp8hwdDecodeCoeffUpdate(p);
966*437bfbebSnyanmisaka     p->coeffSkipMode =  vp8hwdDecodeBool128(bit_ctx);
967*437bfbebSnyanmisaka     if (!p->keyFrame) {
968*437bfbebSnyanmisaka         RK_U32  mvProbs;
969*437bfbebSnyanmisaka         if (p->coeffSkipMode)
970*437bfbebSnyanmisaka             p->probMbSkipFalse = vp8hwdReadBits(bit_ctx, 8);
971*437bfbebSnyanmisaka         p->probIntra = vp8hwdReadBits(bit_ctx, 8);
972*437bfbebSnyanmisaka         p->probRefLast = vp8hwdReadBits(bit_ctx, 8);
973*437bfbebSnyanmisaka         p->probRefGolden = vp8hwdReadBits(bit_ctx, 8);
974*437bfbebSnyanmisaka         if (vp8hwdDecodeBool128(bit_ctx)) {
975*437bfbebSnyanmisaka             for (i = 0; i < 4; i++)
976*437bfbebSnyanmisaka                 p->entropy.probLuma16x16PredMode[i] = vp8hwdReadBits(bit_ctx, 8);
977*437bfbebSnyanmisaka         }
978*437bfbebSnyanmisaka         if (vp8hwdDecodeBool128(bit_ctx)) {
979*437bfbebSnyanmisaka             for (i = 0; i < 3; i++)
980*437bfbebSnyanmisaka                 p->entropy.probChromaPredMode[i] = vp8hwdReadBits(bit_ctx, 8);
981*437bfbebSnyanmisaka         }
982*437bfbebSnyanmisaka         mvProbs = VP8_MV_PROBS_PER_COMPONENT;
983*437bfbebSnyanmisaka         for ( i = 0 ; i < 2 ; ++i ) {
984*437bfbebSnyanmisaka             for ( j = 0 ; j < (RK_S32)mvProbs ; ++j ) {
985*437bfbebSnyanmisaka                 if (vp8hwdDecodeBool(bit_ctx, MvUpdateProbs[i][j]) == 1) {
986*437bfbebSnyanmisaka                     tmp = vp8hwdReadBits(bit_ctx, 7);
987*437bfbebSnyanmisaka                     if ( tmp )
988*437bfbebSnyanmisaka                         tmp = tmp << 1;
989*437bfbebSnyanmisaka                     else
990*437bfbebSnyanmisaka                         tmp = 1;
991*437bfbebSnyanmisaka                     p->entropy.probMvContext[i][j] = tmp;
992*437bfbebSnyanmisaka                 }
993*437bfbebSnyanmisaka             }
994*437bfbebSnyanmisaka         }
995*437bfbebSnyanmisaka     } else {
996*437bfbebSnyanmisaka         if (p->coeffSkipMode)
997*437bfbebSnyanmisaka             p->probMbSkipFalse = vp8hwdReadBits(bit_ctx, 8);
998*437bfbebSnyanmisaka     }
999*437bfbebSnyanmisaka     if (bit_ctx->strmError) {
1000*437bfbebSnyanmisaka         mpp_err_f("paser header stream no enough");
1001*437bfbebSnyanmisaka         FUN_T("FUN_OUT");
1002*437bfbebSnyanmisaka         return MPP_ERR_STREAM;
1003*437bfbebSnyanmisaka     }
1004*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
1005*437bfbebSnyanmisaka     return MPP_OK;
1006*437bfbebSnyanmisaka }
1007*437bfbebSnyanmisaka 
1008*437bfbebSnyanmisaka static MPP_RET
vp7_header_parser(VP8DParserContext_t * p,RK_U8 * pbase,RK_U32 size)1009*437bfbebSnyanmisaka vp7_header_parser(VP8DParserContext_t *p, RK_U8 *pbase, RK_U32 size)
1010*437bfbebSnyanmisaka {
1011*437bfbebSnyanmisaka     RK_U32  tmp;
1012*437bfbebSnyanmisaka     int     i, j;
1013*437bfbebSnyanmisaka 
1014*437bfbebSnyanmisaka     FUN_T("FUN_IN");
1015*437bfbebSnyanmisaka     vpBoolCoder_t *bit_ctx = &p->bitstr;
1016*437bfbebSnyanmisaka     vp8hwdBoolStart(bit_ctx, pbase, size);
1017*437bfbebSnyanmisaka 
1018*437bfbebSnyanmisaka     if (p->keyFrame) {
1019*437bfbebSnyanmisaka         p->width = vp8hwdReadBits(bit_ctx, 12);
1020*437bfbebSnyanmisaka         p->height = vp8hwdReadBits(bit_ctx, 12);
1021*437bfbebSnyanmisaka         tmp = vp8hwdReadBits(bit_ctx, 2);
1022*437bfbebSnyanmisaka         p->scaledWidth = ScaleDimension(p->width, tmp);
1023*437bfbebSnyanmisaka         tmp = vp8hwdReadBits(bit_ctx, 2);
1024*437bfbebSnyanmisaka         p->scaledHeight = ScaleDimension(p->height, tmp);
1025*437bfbebSnyanmisaka     }
1026*437bfbebSnyanmisaka     {
1027*437bfbebSnyanmisaka         const RK_U32 vp70FeatureBits[4] = { 7, 6, 0, 8 };
1028*437bfbebSnyanmisaka         const RK_U32 vp71FeatureBits[4] = { 7, 6, 0, 5 };
1029*437bfbebSnyanmisaka         const RK_U32 *featureBits;
1030*437bfbebSnyanmisaka         if (p->vpVersion == 0)
1031*437bfbebSnyanmisaka             featureBits = vp70FeatureBits;
1032*437bfbebSnyanmisaka         else
1033*437bfbebSnyanmisaka             featureBits = vp71FeatureBits;
1034*437bfbebSnyanmisaka         for (i = 0; i < MAX_NBR_OF_VP7_MB_FEATURES; i++) {
1035*437bfbebSnyanmisaka             if (vp8hwdDecodeBool128(bit_ctx)) {
1036*437bfbebSnyanmisaka                 tmp = vp8hwdReadBits(bit_ctx, 8);
1037*437bfbebSnyanmisaka                 for (j = 0; j < 3; j++) {
1038*437bfbebSnyanmisaka                     if (vp8hwdDecodeBool128(bit_ctx))
1039*437bfbebSnyanmisaka                         tmp = vp8hwdReadBits(bit_ctx, 8);
1040*437bfbebSnyanmisaka                 }
1041*437bfbebSnyanmisaka                 if (featureBits[i]) {
1042*437bfbebSnyanmisaka                     for (j = 0; j < 4; j++) {
1043*437bfbebSnyanmisaka                         if (vp8hwdDecodeBool128(bit_ctx))
1044*437bfbebSnyanmisaka                             tmp = vp8hwdReadBits(bit_ctx, featureBits[i]);
1045*437bfbebSnyanmisaka                     }
1046*437bfbebSnyanmisaka                 }
1047*437bfbebSnyanmisaka                 FUN_T("FUN_OUT");
1048*437bfbebSnyanmisaka                 return MPP_ERR_PROTOL;
1049*437bfbebSnyanmisaka             }
1050*437bfbebSnyanmisaka 
1051*437bfbebSnyanmisaka         }
1052*437bfbebSnyanmisaka         p->nbrDctPartitions = 0;
1053*437bfbebSnyanmisaka     }
1054*437bfbebSnyanmisaka     p->qpYAc = (RK_S32)vp8hwdReadBits(bit_ctx, 7 );
1055*437bfbebSnyanmisaka     p->qpYDc  = vp8hwdReadBits(bit_ctx, 1 )
1056*437bfbebSnyanmisaka                 ? (RK_S32)vp8hwdReadBits(bit_ctx, 7 ) : p->qpYAc;
1057*437bfbebSnyanmisaka     p->qpY2Dc = vp8hwdReadBits(bit_ctx, 1 )
1058*437bfbebSnyanmisaka                 ? (RK_S32)vp8hwdReadBits(bit_ctx, 7 ) : p->qpYAc;
1059*437bfbebSnyanmisaka     p->qpY2Ac = vp8hwdReadBits(bit_ctx, 1 )
1060*437bfbebSnyanmisaka                 ? (RK_S32)vp8hwdReadBits(bit_ctx, 7 ) : p->qpYAc;
1061*437bfbebSnyanmisaka     p->qpChDc = vp8hwdReadBits(bit_ctx, 1 )
1062*437bfbebSnyanmisaka                 ? (RK_S32)vp8hwdReadBits(bit_ctx, 7 ) : p->qpYAc;
1063*437bfbebSnyanmisaka     p->qpChAc = vp8hwdReadBits(bit_ctx, 1 )
1064*437bfbebSnyanmisaka                 ? (RK_S32)vp8hwdReadBits(bit_ctx, 7 ) : p->qpYAc;
1065*437bfbebSnyanmisaka     if (!p->keyFrame) {
1066*437bfbebSnyanmisaka         p->refreshGolden = vp8hwdDecodeBool128(bit_ctx);
1067*437bfbebSnyanmisaka         if (p->vpVersion >= 1) {
1068*437bfbebSnyanmisaka             p->refreshEntropyProbs = vp8hwdDecodeBool128(bit_ctx);
1069*437bfbebSnyanmisaka             p->refreshLast = vp8hwdDecodeBool128(bit_ctx);
1070*437bfbebSnyanmisaka         } else {
1071*437bfbebSnyanmisaka             p->refreshEntropyProbs = 1;
1072*437bfbebSnyanmisaka             p->refreshLast = 1;
1073*437bfbebSnyanmisaka         }
1074*437bfbebSnyanmisaka     } else {
1075*437bfbebSnyanmisaka         p->refreshGolden = 1;
1076*437bfbebSnyanmisaka         p->refreshAlternate = 1;
1077*437bfbebSnyanmisaka         p->copyBufferToGolden = 0;
1078*437bfbebSnyanmisaka         p->copyBufferToAlternate = 0;
1079*437bfbebSnyanmisaka         if (p->vpVersion >= 1)
1080*437bfbebSnyanmisaka             p->refreshEntropyProbs = vp8hwdDecodeBool128(bit_ctx);
1081*437bfbebSnyanmisaka         else
1082*437bfbebSnyanmisaka             p->refreshEntropyProbs = 1;
1083*437bfbebSnyanmisaka         p->refFrameSignBias[0] = 0;
1084*437bfbebSnyanmisaka         p->refFrameSignBias[1] = 0;
1085*437bfbebSnyanmisaka         p->refreshLast = 1;
1086*437bfbebSnyanmisaka     }
1087*437bfbebSnyanmisaka 
1088*437bfbebSnyanmisaka     if (!p->refreshEntropyProbs) {
1089*437bfbebSnyanmisaka         memcpy(&p->entropyLast, &p->entropy,
1090*437bfbebSnyanmisaka                (unsigned long)sizeof(vp8EntropyProbs_t));
1091*437bfbebSnyanmisaka         memcpy(p->vp7PrevScanOrder, p->vp7ScanOrder,
1092*437bfbebSnyanmisaka                (unsigned long)sizeof(p->vp7ScanOrder));
1093*437bfbebSnyanmisaka     }
1094*437bfbebSnyanmisaka     if (p->refreshLast) {
1095*437bfbebSnyanmisaka         if (vp8hwdDecodeBool128(bit_ctx)) {
1096*437bfbebSnyanmisaka             tmp = vp8hwdReadBits(bit_ctx, 8);
1097*437bfbebSnyanmisaka             tmp = vp8hwdReadBits(bit_ctx, 8);
1098*437bfbebSnyanmisaka             FUN_T("FUN_OUT");
1099*437bfbebSnyanmisaka             return MPP_ERR_STREAM;
1100*437bfbebSnyanmisaka         }
1101*437bfbebSnyanmisaka     }
1102*437bfbebSnyanmisaka     if (p->vpVersion == 0) {
1103*437bfbebSnyanmisaka         p->loopFilterType = vp8hwdDecodeBool128(bit_ctx);
1104*437bfbebSnyanmisaka     }
1105*437bfbebSnyanmisaka     if (vp8hwdDecodeBool128(bit_ctx)) {
1106*437bfbebSnyanmisaka         static const RK_U32 Vp7DefaultScan[] = {
1107*437bfbebSnyanmisaka             0,  1,  4,  8,  5,  2,  3,  6,
1108*437bfbebSnyanmisaka             9, 12, 13, 10,  7, 11, 14, 15,
1109*437bfbebSnyanmisaka         };
1110*437bfbebSnyanmisaka         p->vp7ScanOrder[0] = 0;
1111*437bfbebSnyanmisaka         for (i = 1; i < 16; i++)
1112*437bfbebSnyanmisaka             p->vp7ScanOrder[i] = Vp7DefaultScan[vp8hwdReadBits(bit_ctx, 4)];
1113*437bfbebSnyanmisaka     }
1114*437bfbebSnyanmisaka     if (p->vpVersion >= 1)
1115*437bfbebSnyanmisaka         p->loopFilterType = vp8hwdDecodeBool128(bit_ctx);
1116*437bfbebSnyanmisaka     p->loopFilterLevel = vp8hwdReadBits(bit_ctx, 6);
1117*437bfbebSnyanmisaka     p->loopFilterSharpness = vp8hwdReadBits(bit_ctx, 3);
1118*437bfbebSnyanmisaka     vp8hwdDecodeCoeffUpdate(p);
1119*437bfbebSnyanmisaka     if (!p->keyFrame) {
1120*437bfbebSnyanmisaka         p->probIntra = vp8hwdReadBits(bit_ctx, 8);
1121*437bfbebSnyanmisaka         p->probRefLast = vp8hwdReadBits(bit_ctx, 8);
1122*437bfbebSnyanmisaka         if (vp8hwdDecodeBool128(bit_ctx)) {
1123*437bfbebSnyanmisaka             for (i = 0; i < 4; i++)
1124*437bfbebSnyanmisaka                 p->entropy.probLuma16x16PredMode[i] =
1125*437bfbebSnyanmisaka                     vp8hwdReadBits(bit_ctx, 8);
1126*437bfbebSnyanmisaka         }
1127*437bfbebSnyanmisaka         if (vp8hwdDecodeBool128(bit_ctx)) {
1128*437bfbebSnyanmisaka             for (i = 0; i < 3; i++)
1129*437bfbebSnyanmisaka                 p->entropy.probChromaPredMode[i] = vp8hwdReadBits(bit_ctx, 8);
1130*437bfbebSnyanmisaka         }
1131*437bfbebSnyanmisaka         for ( i = 0 ; i < 2 ; ++i ) {
1132*437bfbebSnyanmisaka             for ( j = 0 ; j < VP7_MV_PROBS_PER_COMPONENT ; ++j ) {
1133*437bfbebSnyanmisaka                 if (vp8hwdDecodeBool(bit_ctx, MvUpdateProbs[i][j])) {
1134*437bfbebSnyanmisaka                     tmp = vp8hwdReadBits(bit_ctx, 7);
1135*437bfbebSnyanmisaka                     if ( tmp )
1136*437bfbebSnyanmisaka                         tmp = tmp << 1;
1137*437bfbebSnyanmisaka                     else
1138*437bfbebSnyanmisaka                         tmp = 1;
1139*437bfbebSnyanmisaka                     p->entropy.probMvContext[i][j] = tmp;
1140*437bfbebSnyanmisaka                 }
1141*437bfbebSnyanmisaka             }
1142*437bfbebSnyanmisaka         }
1143*437bfbebSnyanmisaka     }
1144*437bfbebSnyanmisaka     if (bit_ctx->strmError) {
1145*437bfbebSnyanmisaka         FUN_T("FUN_OUT");
1146*437bfbebSnyanmisaka         return MPP_ERR_PROTOL;
1147*437bfbebSnyanmisaka     }
1148*437bfbebSnyanmisaka 
1149*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
1150*437bfbebSnyanmisaka     return MPP_OK;
1151*437bfbebSnyanmisaka }
1152*437bfbebSnyanmisaka 
1153*437bfbebSnyanmisaka static MPP_RET
vp8hwdSetPartitionOffsets(VP8DParserContext_t * p,RK_U8 * stream,RK_U32 len)1154*437bfbebSnyanmisaka vp8hwdSetPartitionOffsets(VP8DParserContext_t *p, RK_U8 *stream, RK_U32 len)
1155*437bfbebSnyanmisaka {
1156*437bfbebSnyanmisaka     RK_U32 i = 0;
1157*437bfbebSnyanmisaka     RK_U32 offset = 0;
1158*437bfbebSnyanmisaka     RK_U32 baseOffset;
1159*437bfbebSnyanmisaka     RK_U32 extraBytesPacked = 0;
1160*437bfbebSnyanmisaka 
1161*437bfbebSnyanmisaka     FUN_T("FUN_IN");
1162*437bfbebSnyanmisaka     if (p->decMode == VP8HWD_VP8 && p->keyFrame)
1163*437bfbebSnyanmisaka         extraBytesPacked += 7;
1164*437bfbebSnyanmisaka 
1165*437bfbebSnyanmisaka     stream += p->frameTagSize;
1166*437bfbebSnyanmisaka 
1167*437bfbebSnyanmisaka     baseOffset = p->frameTagSize + p->offsetToDctParts
1168*437bfbebSnyanmisaka                  + 3 * ( (1 << p->nbrDctPartitions) - 1);
1169*437bfbebSnyanmisaka 
1170*437bfbebSnyanmisaka     stream += p->offsetToDctParts + extraBytesPacked;
1171*437bfbebSnyanmisaka     for ( i = 0 ; i < (RK_U32)(1 << p->nbrDctPartitions) - 1 ; ++i ) {
1172*437bfbebSnyanmisaka         RK_U32  tmp;
1173*437bfbebSnyanmisaka 
1174*437bfbebSnyanmisaka         p->dctPartitionOffsets[i] = baseOffset + offset;
1175*437bfbebSnyanmisaka         tmp = stream[0] | (stream[1] << 8) | (stream[2] << 16);
1176*437bfbebSnyanmisaka         offset += tmp;
1177*437bfbebSnyanmisaka         stream += 3;
1178*437bfbebSnyanmisaka     }
1179*437bfbebSnyanmisaka     p->dctPartitionOffsets[i] = baseOffset + offset;
1180*437bfbebSnyanmisaka 
1181*437bfbebSnyanmisaka     return (p->dctPartitionOffsets[i] < len ? MPP_OK : MPP_ERR_STREAM);
1182*437bfbebSnyanmisaka }
1183*437bfbebSnyanmisaka 
1184*437bfbebSnyanmisaka static MPP_RET
decoder_frame_header(VP8DParserContext_t * p,RK_U8 * pbase,RK_U32 size)1185*437bfbebSnyanmisaka decoder_frame_header(VP8DParserContext_t *p, RK_U8 *pbase, RK_U32 size)
1186*437bfbebSnyanmisaka {
1187*437bfbebSnyanmisaka     MPP_RET ret;
1188*437bfbebSnyanmisaka 
1189*437bfbebSnyanmisaka     FUN_T("FUN_IN");
1190*437bfbebSnyanmisaka     p->keyFrame = !(pbase[0] & 1);
1191*437bfbebSnyanmisaka     p->vpVersion = (pbase[0] >> 1) & 7;
1192*437bfbebSnyanmisaka     p->showFrame = 1;
1193*437bfbebSnyanmisaka     if (p->keyFrame && !p->needKeyFrame) {
1194*437bfbebSnyanmisaka         p->needKeyFrame = 1;
1195*437bfbebSnyanmisaka     } else {
1196*437bfbebSnyanmisaka         if (!p->needKeyFrame) {
1197*437bfbebSnyanmisaka             mpp_err("no found key frame");
1198*437bfbebSnyanmisaka             return MPP_NOK;
1199*437bfbebSnyanmisaka         }
1200*437bfbebSnyanmisaka     }
1201*437bfbebSnyanmisaka     if (p->decMode == VP8HWD_VP7) {
1202*437bfbebSnyanmisaka         p->offsetToDctParts = (pbase[0] >> 4) | (pbase[1] << 4) | (pbase[2] << 12);
1203*437bfbebSnyanmisaka         p->frameTagSize = p->vpVersion >= 1 ? 3 : 4;
1204*437bfbebSnyanmisaka     } else {
1205*437bfbebSnyanmisaka         p->offsetToDctParts = (pbase[0] >> 5) | (pbase[1] << 3) | (pbase[2] << 11);
1206*437bfbebSnyanmisaka #if 0
1207*437bfbebSnyanmisaka         mpp_log("offsetToDctParts %d pbase[0] = 0x%x pbase[1] = 0x%x pbase[2] = 0x%x ",
1208*437bfbebSnyanmisaka                 p->offsetToDctParts, pbase[0], pbase[1], pbase[2]);
1209*437bfbebSnyanmisaka #endif
1210*437bfbebSnyanmisaka         p->showFrame = (pbase[0] >> 4) & 1;
1211*437bfbebSnyanmisaka         p->frameTagSize = 3;
1212*437bfbebSnyanmisaka     }
1213*437bfbebSnyanmisaka     pbase += p->frameTagSize;
1214*437bfbebSnyanmisaka     size -= p->frameTagSize;
1215*437bfbebSnyanmisaka     if (p->keyFrame)
1216*437bfbebSnyanmisaka         vp8hwdResetProbs(p);
1217*437bfbebSnyanmisaka     //mpp_log_f("p->decMode = %d", p->decMode);
1218*437bfbebSnyanmisaka     if (p->decMode == VP8HWD_VP8) {
1219*437bfbebSnyanmisaka         ret = vp8_header_parser(p, pbase, size);
1220*437bfbebSnyanmisaka     }  else {
1221*437bfbebSnyanmisaka         ret = vp7_header_parser(p, pbase, size);
1222*437bfbebSnyanmisaka     }
1223*437bfbebSnyanmisaka     if (ret != MPP_OK) {
1224*437bfbebSnyanmisaka         return ret;
1225*437bfbebSnyanmisaka     }
1226*437bfbebSnyanmisaka     return MPP_OK;
1227*437bfbebSnyanmisaka }
1228*437bfbebSnyanmisaka 
1229*437bfbebSnyanmisaka #define IVF_HDR_BYTES       32
1230*437bfbebSnyanmisaka #define IVF_FRM_BYTES       12
1231*437bfbebSnyanmisaka 
write_ivf_header(VP8DParserContext_t * ctx,FILE * fp)1232*437bfbebSnyanmisaka static void write_ivf_header(VP8DParserContext_t *ctx, FILE *fp)
1233*437bfbebSnyanmisaka {
1234*437bfbebSnyanmisaka     RK_U8 data[IVF_HDR_BYTES] = {0};
1235*437bfbebSnyanmisaka 
1236*437bfbebSnyanmisaka     data[0] = 'D';
1237*437bfbebSnyanmisaka     data[1] = 'K';
1238*437bfbebSnyanmisaka     data[2] = 'I';
1239*437bfbebSnyanmisaka     data[3] = 'F';
1240*437bfbebSnyanmisaka 
1241*437bfbebSnyanmisaka     data[6] = 32;
1242*437bfbebSnyanmisaka 
1243*437bfbebSnyanmisaka     data[8] = 'V';
1244*437bfbebSnyanmisaka     data[9] = 'P';
1245*437bfbebSnyanmisaka     data[10] = '8';
1246*437bfbebSnyanmisaka     data[11] = '0';
1247*437bfbebSnyanmisaka 
1248*437bfbebSnyanmisaka     data[12] = ctx->width & 0xff;
1249*437bfbebSnyanmisaka     data[13] = (ctx->width >> 8) & 0xff;
1250*437bfbebSnyanmisaka     data[14] = ctx->height & 0xff;
1251*437bfbebSnyanmisaka     data[15] = (ctx->height >> 8) & 0xff;
1252*437bfbebSnyanmisaka 
1253*437bfbebSnyanmisaka     data[16] = 30;
1254*437bfbebSnyanmisaka     data[17] = data[18] = data[19] = 0;
1255*437bfbebSnyanmisaka 
1256*437bfbebSnyanmisaka     data[20] = 1;
1257*437bfbebSnyanmisaka     data[21] = data[22] = data[23] = 0;
1258*437bfbebSnyanmisaka 
1259*437bfbebSnyanmisaka     data[24] = data[25] = data[26] = data[27] = 0xff;
1260*437bfbebSnyanmisaka 
1261*437bfbebSnyanmisaka     fwrite(data, IVF_HDR_BYTES, 1, fp);
1262*437bfbebSnyanmisaka }
1263*437bfbebSnyanmisaka 
write_ivf_frame(FILE * fp,RK_U32 frame_size,RK_U64 frame_cnt)1264*437bfbebSnyanmisaka static void write_ivf_frame(FILE *fp, RK_U32 frame_size, RK_U64 frame_cnt)
1265*437bfbebSnyanmisaka {
1266*437bfbebSnyanmisaka     RK_U8 data[IVF_FRM_BYTES];
1267*437bfbebSnyanmisaka 
1268*437bfbebSnyanmisaka     data[0] = frame_size & 0xff;
1269*437bfbebSnyanmisaka     data[1] = (frame_size >> 8) & 0xff;
1270*437bfbebSnyanmisaka     data[2] = (frame_size >> 16) & 0xff;
1271*437bfbebSnyanmisaka     data[3] = (frame_size >> 24) & 0xff;
1272*437bfbebSnyanmisaka 
1273*437bfbebSnyanmisaka     data[4]  = frame_cnt & 0xff;
1274*437bfbebSnyanmisaka     data[5]  = (frame_cnt >> 8) & 0xff;
1275*437bfbebSnyanmisaka     data[6]  = (frame_cnt >> 16) & 0xff;
1276*437bfbebSnyanmisaka     data[7]  = (frame_cnt >> 24) & 0xff;
1277*437bfbebSnyanmisaka     data[8]  = (frame_cnt >> 32) & 0xff;
1278*437bfbebSnyanmisaka     data[9]  = (frame_cnt >> 40) & 0xff;
1279*437bfbebSnyanmisaka     data[10] = (frame_cnt >> 48) & 0xff;
1280*437bfbebSnyanmisaka     data[11] = (frame_cnt >> 56) & 0xff;
1281*437bfbebSnyanmisaka 
1282*437bfbebSnyanmisaka     fwrite(data, IVF_FRM_BYTES, 1, fp);
1283*437bfbebSnyanmisaka }
1284*437bfbebSnyanmisaka 
vp8d_parser_parse(void * ctx,HalDecTask * in_task)1285*437bfbebSnyanmisaka MPP_RET vp8d_parser_parse(void *ctx, HalDecTask *in_task)
1286*437bfbebSnyanmisaka {
1287*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1288*437bfbebSnyanmisaka     VP8DContext *c = (VP8DContext *)ctx;
1289*437bfbebSnyanmisaka     VP8DParserContext_t *p = (VP8DParserContext_t *)c->parse_ctx;
1290*437bfbebSnyanmisaka     FUN_T("FUN_IN");
1291*437bfbebSnyanmisaka 
1292*437bfbebSnyanmisaka     ret = decoder_frame_header(p, p->bitstream_sw_buf, p->stream_size);
1293*437bfbebSnyanmisaka 
1294*437bfbebSnyanmisaka     if (MPP_OK != ret) {
1295*437bfbebSnyanmisaka         mpp_err("decoder_frame_header err ret %d", ret);
1296*437bfbebSnyanmisaka         FUN_T("FUN_OUT");
1297*437bfbebSnyanmisaka         return ret;
1298*437bfbebSnyanmisaka     }
1299*437bfbebSnyanmisaka 
1300*437bfbebSnyanmisaka     vp8hwdSetPartitionOffsets(p, p->bitstream_sw_buf, p->stream_size);
1301*437bfbebSnyanmisaka 
1302*437bfbebSnyanmisaka     ret = vp8d_alloc_frame(p);
1303*437bfbebSnyanmisaka     if (MPP_OK != ret) {
1304*437bfbebSnyanmisaka         mpp_err("vp8d_alloc_frame err ret %d", ret);
1305*437bfbebSnyanmisaka         FUN_T("FUN_OUT");
1306*437bfbebSnyanmisaka         return ret;
1307*437bfbebSnyanmisaka     }
1308*437bfbebSnyanmisaka 
1309*437bfbebSnyanmisaka     vp8d_convert_to_syntx(p, in_task);
1310*437bfbebSnyanmisaka     /* Rollback entropy probabilities if refresh is not set */
1311*437bfbebSnyanmisaka     if (p->refreshEntropyProbs == 0) {
1312*437bfbebSnyanmisaka         memcpy((void*)&p->entropy, (void*)&p->entropyLast,
1313*437bfbebSnyanmisaka                (unsigned long)sizeof(vp8EntropyProbs_t));
1314*437bfbebSnyanmisaka         memcpy((void*)p->vp7ScanOrder, (void*)p->vp7PrevScanOrder,
1315*437bfbebSnyanmisaka                (unsigned long)sizeof(p->vp7ScanOrder));
1316*437bfbebSnyanmisaka     }
1317*437bfbebSnyanmisaka     in_task->syntax.data = (void *)p->dxva_ctx;
1318*437bfbebSnyanmisaka     in_task->syntax.number = 1;
1319*437bfbebSnyanmisaka     in_task->output = p->frame_out->slot_index;
1320*437bfbebSnyanmisaka     in_task->valid = 1;
1321*437bfbebSnyanmisaka     if (p->eos) {
1322*437bfbebSnyanmisaka         in_task->flags.eos = p->eos;
1323*437bfbebSnyanmisaka     }
1324*437bfbebSnyanmisaka     vp8d_ref_update(p);
1325*437bfbebSnyanmisaka 
1326*437bfbebSnyanmisaka     if (vp8d_debug & VP8D_DBG_DUMP_STREAM) {
1327*437bfbebSnyanmisaka         if (!p->stream_fp) {
1328*437bfbebSnyanmisaka             char name[256];
1329*437bfbebSnyanmisaka 
1330*437bfbebSnyanmisaka             sprintf(name, "/data/video/mpp_dec_vp8_%d.bin", getpid());
1331*437bfbebSnyanmisaka             p->stream_fp = fopen(name, "wb");
1332*437bfbebSnyanmisaka         }
1333*437bfbebSnyanmisaka         if (p->stream_fp) {
1334*437bfbebSnyanmisaka             if (!p->ivf_header_flag) {
1335*437bfbebSnyanmisaka                 write_ivf_header(p, p->stream_fp);
1336*437bfbebSnyanmisaka                 p->ivf_header_flag = 1;
1337*437bfbebSnyanmisaka             }
1338*437bfbebSnyanmisaka             write_ivf_frame(p->stream_fp, p->stream_size, p->frame_cnt);
1339*437bfbebSnyanmisaka             fwrite(p->bitstream_sw_buf, 1, p->stream_size, p->stream_fp);
1340*437bfbebSnyanmisaka             fflush(p->stream_fp);
1341*437bfbebSnyanmisaka         }
1342*437bfbebSnyanmisaka     }
1343*437bfbebSnyanmisaka     p->frame_cnt++;
1344*437bfbebSnyanmisaka 
1345*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
1346*437bfbebSnyanmisaka     return ret;
1347*437bfbebSnyanmisaka }
1348*437bfbebSnyanmisaka 
vp8d_parser_callback(void * ctx,void * hal_info)1349*437bfbebSnyanmisaka MPP_RET vp8d_parser_callback(void *ctx, void *hal_info)
1350*437bfbebSnyanmisaka {
1351*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1352*437bfbebSnyanmisaka     FUN_T("FUN_IN");
1353*437bfbebSnyanmisaka     (void)ctx;
1354*437bfbebSnyanmisaka     (void)hal_info;
1355*437bfbebSnyanmisaka     FUN_T("FUN_OUT");
1356*437bfbebSnyanmisaka     return ret;
1357*437bfbebSnyanmisaka }
1358