xref: /rockchip-linux_mpp/mpp/codec/dec/vp9/vp9d_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 #include <stdlib.h>
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #include "mpp_env.h"
22*437bfbebSnyanmisaka #include "mpp_mem.h"
23*437bfbebSnyanmisaka #include "mpp_debug.h"
24*437bfbebSnyanmisaka #include "mpp_common.h"
25*437bfbebSnyanmisaka #include "mpp_bitread.h"
26*437bfbebSnyanmisaka #include "mpp_packet_impl.h"
27*437bfbebSnyanmisaka #include "mpp_compat_impl.h"
28*437bfbebSnyanmisaka 
29*437bfbebSnyanmisaka #include "vp9data.h"
30*437bfbebSnyanmisaka #include "vp9d_codec.h"
31*437bfbebSnyanmisaka #include "vp9d_parser.h"
32*437bfbebSnyanmisaka #include "mpp_frame_impl.h"
33*437bfbebSnyanmisaka 
34*437bfbebSnyanmisaka /**
35*437bfbebSnyanmisaka  * Clip a signed integer into the -(2^p),(2^p-1) range.
36*437bfbebSnyanmisaka  * @param  a value to clip
37*437bfbebSnyanmisaka  * @param  p bit position to clip at
38*437bfbebSnyanmisaka  * @return clipped value
39*437bfbebSnyanmisaka  */
av_clip_uintp2(RK_S32 a,RK_S32 p)40*437bfbebSnyanmisaka static   RK_U32 av_clip_uintp2(RK_S32 a, RK_S32 p)
41*437bfbebSnyanmisaka {
42*437bfbebSnyanmisaka     if (a & ~((1 << p) - 1)) return -a >> 31 & ((1 << p) - 1);
43*437bfbebSnyanmisaka     else                   return  a;
44*437bfbebSnyanmisaka }
45*437bfbebSnyanmisaka 
46*437bfbebSnyanmisaka RK_U32 vp9d_debug = 0;
47*437bfbebSnyanmisaka 
48*437bfbebSnyanmisaka #define VP9_SYNCCODE 0x498342
49*437bfbebSnyanmisaka //#define dump
50*437bfbebSnyanmisaka #ifdef dump
51*437bfbebSnyanmisaka static FILE *vp9_p_fp = NULL;
52*437bfbebSnyanmisaka static FILE *vp9_p_fp1 = NULL;
53*437bfbebSnyanmisaka static FILE *vp9_p_fp2 = NULL;
54*437bfbebSnyanmisaka static RK_S32 dec_num = 0;
55*437bfbebSnyanmisaka static RK_S32 count = 0;
56*437bfbebSnyanmisaka #endif
57*437bfbebSnyanmisaka 
58*437bfbebSnyanmisaka #ifndef FASTDIV
59*437bfbebSnyanmisaka #   define FASTDIV(a,b) ((RK_U32)((((RK_U64)a) * vpx_inverse[b]) >> 32))
60*437bfbebSnyanmisaka #endif /* FASTDIV */
61*437bfbebSnyanmisaka 
62*437bfbebSnyanmisaka /* a*inverse[b]>>32 == a/b for all 0<=a<=16909558 && 2<=b<=256
63*437bfbebSnyanmisaka  * for a>16909558, is an overestimate by less than 1 part in 1<<24 */
64*437bfbebSnyanmisaka const RK_U32 vpx_inverse[257] = {
65*437bfbebSnyanmisaka     0, 4294967295U, 2147483648U, 1431655766, 1073741824,  858993460,  715827883,  613566757,
66*437bfbebSnyanmisaka     536870912,  477218589,  429496730,  390451573,  357913942,  330382100,  306783379,  286331154,
67*437bfbebSnyanmisaka     268435456,  252645136,  238609295,  226050911,  214748365,  204522253,  195225787,  186737709,
68*437bfbebSnyanmisaka     178956971,  171798692,  165191050,  159072863,  153391690,  148102321,  143165577,  138547333,
69*437bfbebSnyanmisaka     134217728,  130150525,  126322568,  122713352,  119304648,  116080198,  113025456,  110127367,
70*437bfbebSnyanmisaka     107374183,  104755300,  102261127,   99882961,   97612894,   95443718,   93368855,   91382283,
71*437bfbebSnyanmisaka     89478486,   87652394,   85899346,   84215046,   82595525,   81037119,   79536432,   78090315,
72*437bfbebSnyanmisaka     76695845,   75350304,   74051161,   72796056,   71582789,   70409300,   69273667,   68174085,
73*437bfbebSnyanmisaka     67108864,   66076420,   65075263,   64103990,   63161284,   62245903,   61356676,   60492498,
74*437bfbebSnyanmisaka     59652324,   58835169,   58040099,   57266231,   56512728,   55778797,   55063684,   54366675,
75*437bfbebSnyanmisaka     53687092,   53024288,   52377650,   51746594,   51130564,   50529028,   49941481,   49367441,
76*437bfbebSnyanmisaka     48806447,   48258060,   47721859,   47197443,   46684428,   46182445,   45691142,   45210183,
77*437bfbebSnyanmisaka     44739243,   44278014,   43826197,   43383509,   42949673,   42524429,   42107523,   41698712,
78*437bfbebSnyanmisaka     41297763,   40904451,   40518560,   40139882,   39768216,   39403370,   39045158,   38693400,
79*437bfbebSnyanmisaka     38347923,   38008561,   37675152,   37347542,   37025581,   36709123,   36398028,   36092163,
80*437bfbebSnyanmisaka     35791395,   35495598,   35204650,   34918434,   34636834,   34359739,   34087043,   33818641,
81*437bfbebSnyanmisaka     33554432,   33294321,   33038210,   32786010,   32537632,   32292988,   32051995,   31814573,
82*437bfbebSnyanmisaka     31580642,   31350127,   31122952,   30899046,   30678338,   30460761,   30246249,   30034737,
83*437bfbebSnyanmisaka     29826162,   29620465,   29417585,   29217465,   29020050,   28825284,   28633116,   28443493,
84*437bfbebSnyanmisaka     28256364,   28071682,   27889399,   27709467,   27531842,   27356480,   27183338,   27012373,
85*437bfbebSnyanmisaka     26843546,   26676816,   26512144,   26349493,   26188825,   26030105,   25873297,   25718368,
86*437bfbebSnyanmisaka     25565282,   25414008,   25264514,   25116768,   24970741,   24826401,   24683721,   24542671,
87*437bfbebSnyanmisaka     24403224,   24265352,   24129030,   23994231,   23860930,   23729102,   23598722,   23469767,
88*437bfbebSnyanmisaka     23342214,   23216040,   23091223,   22967740,   22845571,   22724695,   22605092,   22486740,
89*437bfbebSnyanmisaka     22369622,   22253717,   22139007,   22025474,   21913099,   21801865,   21691755,   21582751,
90*437bfbebSnyanmisaka     21474837,   21367997,   21262215,   21157475,   21053762,   20951060,   20849356,   20748635,
91*437bfbebSnyanmisaka     20648882,   20550083,   20452226,   20355296,   20259280,   20164166,   20069941,   19976593,
92*437bfbebSnyanmisaka     19884108,   19792477,   19701685,   19611723,   19522579,   19434242,   19346700,   19259944,
93*437bfbebSnyanmisaka     19173962,   19088744,   19004281,   18920561,   18837576,   18755316,   18673771,   18592933,
94*437bfbebSnyanmisaka     18512791,   18433337,   18354562,   18276457,   18199014,   18122225,   18046082,   17970575,
95*437bfbebSnyanmisaka     17895698,   17821442,   17747799,   17674763,   17602325,   17530479,   17459217,   17388532,
96*437bfbebSnyanmisaka     17318417,   17248865,   17179870,   17111424,   17043522,   16976156,   16909321,   16843010,
97*437bfbebSnyanmisaka     16777216
98*437bfbebSnyanmisaka };
99*437bfbebSnyanmisaka 
split_parse_frame(SplitContext_t * ctx,RK_U8 * buf,RK_S32 size)100*437bfbebSnyanmisaka static void split_parse_frame(SplitContext_t *ctx, RK_U8 *buf, RK_S32 size)
101*437bfbebSnyanmisaka {
102*437bfbebSnyanmisaka     VP9ParseContext *s = (VP9ParseContext *)ctx->priv_data;
103*437bfbebSnyanmisaka 
104*437bfbebSnyanmisaka     if (buf[0] & 0x4) {
105*437bfbebSnyanmisaka         ctx->key_frame = 0;
106*437bfbebSnyanmisaka     } else {
107*437bfbebSnyanmisaka         ctx->key_frame = 1;
108*437bfbebSnyanmisaka     }
109*437bfbebSnyanmisaka 
110*437bfbebSnyanmisaka     if (buf[0] & 0x2) {
111*437bfbebSnyanmisaka         if (ctx->pts == -1)
112*437bfbebSnyanmisaka             ctx->pts = s->pts;
113*437bfbebSnyanmisaka         s->pts = -1;
114*437bfbebSnyanmisaka     } else {
115*437bfbebSnyanmisaka         s->pts = ctx->pts;
116*437bfbebSnyanmisaka         ctx->pts = -1;
117*437bfbebSnyanmisaka     }
118*437bfbebSnyanmisaka 
119*437bfbebSnyanmisaka     (void)size;
120*437bfbebSnyanmisaka }
121*437bfbebSnyanmisaka 
vp9d_split_frame(SplitContext_t * ctx,RK_U8 ** out_data,RK_S32 * out_size,RK_U8 * data,RK_S32 size)122*437bfbebSnyanmisaka RK_S32 vp9d_split_frame(SplitContext_t *ctx,
123*437bfbebSnyanmisaka                         RK_U8 **out_data, RK_S32 *out_size,
124*437bfbebSnyanmisaka                         RK_U8 *data, RK_S32 size)
125*437bfbebSnyanmisaka {
126*437bfbebSnyanmisaka     VP9ParseContext *s = (VP9ParseContext *)ctx->priv_data;
127*437bfbebSnyanmisaka     RK_S32 full_size = size;
128*437bfbebSnyanmisaka     RK_S32 marker;
129*437bfbebSnyanmisaka 
130*437bfbebSnyanmisaka     if (size <= 0) {
131*437bfbebSnyanmisaka         *out_size = 0;
132*437bfbebSnyanmisaka         *out_data = data;
133*437bfbebSnyanmisaka 
134*437bfbebSnyanmisaka         return 0;
135*437bfbebSnyanmisaka     }
136*437bfbebSnyanmisaka 
137*437bfbebSnyanmisaka     if (s->n_frames > 0) {
138*437bfbebSnyanmisaka         *out_data = data;
139*437bfbebSnyanmisaka         *out_size = s->size[--s->n_frames];
140*437bfbebSnyanmisaka         split_parse_frame(ctx, *out_data, *out_size);
141*437bfbebSnyanmisaka 
142*437bfbebSnyanmisaka         return s->n_frames > 0 ? *out_size : size /* i.e. include idx tail */;
143*437bfbebSnyanmisaka     }
144*437bfbebSnyanmisaka 
145*437bfbebSnyanmisaka     marker = data[size - 1];
146*437bfbebSnyanmisaka     if ((marker & 0xe0) == 0xc0) {
147*437bfbebSnyanmisaka         RK_S32 nbytes = 1 + ((marker >> 3) & 0x3);
148*437bfbebSnyanmisaka         RK_S32 n_frames = 1 + (marker & 0x7), idx_sz = 2 + n_frames * nbytes;
149*437bfbebSnyanmisaka 
150*437bfbebSnyanmisaka         if (size >= idx_sz && data[size - idx_sz] == marker) {
151*437bfbebSnyanmisaka             RK_U8 *idx = data + size + 1 - idx_sz;
152*437bfbebSnyanmisaka             RK_S32 first = 1;
153*437bfbebSnyanmisaka 
154*437bfbebSnyanmisaka             switch (nbytes) {
155*437bfbebSnyanmisaka #define case_n(a, rd) \
156*437bfbebSnyanmisaka             case a: \
157*437bfbebSnyanmisaka                 while (n_frames--) { \
158*437bfbebSnyanmisaka                     RK_U32 sz = rd; \
159*437bfbebSnyanmisaka                     idx += a; \
160*437bfbebSnyanmisaka                     if (sz == 0 || sz > (RK_U32)size) { \
161*437bfbebSnyanmisaka                         s->n_frames = 0; \
162*437bfbebSnyanmisaka                         *out_size = size > full_size ? full_size : size; \
163*437bfbebSnyanmisaka                         *out_data = data; \
164*437bfbebSnyanmisaka                         mpp_err("Superframe packet size too big: %u > %d\n", \
165*437bfbebSnyanmisaka                                sz, size); \
166*437bfbebSnyanmisaka                         return full_size; \
167*437bfbebSnyanmisaka                     } \
168*437bfbebSnyanmisaka                     if (first) { \
169*437bfbebSnyanmisaka                         first = 0; \
170*437bfbebSnyanmisaka                         *out_data = data; \
171*437bfbebSnyanmisaka                         *out_size = sz; \
172*437bfbebSnyanmisaka                         s->n_frames = n_frames; \
173*437bfbebSnyanmisaka                     } else { \
174*437bfbebSnyanmisaka                         s->size[n_frames] = sz; \
175*437bfbebSnyanmisaka                     } \
176*437bfbebSnyanmisaka                     data += sz; \
177*437bfbebSnyanmisaka                     size -= sz; \
178*437bfbebSnyanmisaka                 } \
179*437bfbebSnyanmisaka                 split_parse_frame(ctx, *out_data, *out_size); \
180*437bfbebSnyanmisaka                 return *out_size
181*437bfbebSnyanmisaka 
182*437bfbebSnyanmisaka                 case_n(1, *idx);
183*437bfbebSnyanmisaka                 case_n(2, MPP_RL16(idx));
184*437bfbebSnyanmisaka                 case_n(3, MPP_RL24(idx));
185*437bfbebSnyanmisaka                 case_n(4, MPP_RL32(idx));
186*437bfbebSnyanmisaka             }
187*437bfbebSnyanmisaka         }
188*437bfbebSnyanmisaka     }
189*437bfbebSnyanmisaka 
190*437bfbebSnyanmisaka     *out_data = data;
191*437bfbebSnyanmisaka     *out_size = size;
192*437bfbebSnyanmisaka     split_parse_frame(ctx, data, size);
193*437bfbebSnyanmisaka     return size;
194*437bfbebSnyanmisaka }
195*437bfbebSnyanmisaka 
vp9d_get_frame_stream(Vp9CodecContext * ctx,RK_U8 * buf,RK_S32 length)196*437bfbebSnyanmisaka MPP_RET vp9d_get_frame_stream(Vp9CodecContext *ctx, RK_U8 *buf, RK_S32 length)
197*437bfbebSnyanmisaka {
198*437bfbebSnyanmisaka     RK_S32 buff_size = 0;
199*437bfbebSnyanmisaka     RK_U8 *data = NULL;
200*437bfbebSnyanmisaka     RK_S32 size = 0;
201*437bfbebSnyanmisaka 
202*437bfbebSnyanmisaka     data = (RK_U8 *)mpp_packet_get_data(ctx->pkt);
203*437bfbebSnyanmisaka     size = (RK_S32)mpp_packet_get_size(ctx->pkt);
204*437bfbebSnyanmisaka 
205*437bfbebSnyanmisaka     if (length > size) {
206*437bfbebSnyanmisaka         mpp_free(data);
207*437bfbebSnyanmisaka         mpp_packet_deinit(&ctx->pkt);
208*437bfbebSnyanmisaka         buff_size = length + 10 * 1024;
209*437bfbebSnyanmisaka         data = mpp_malloc(RK_U8, buff_size);
210*437bfbebSnyanmisaka         mpp_packet_init(&ctx->pkt, (void *)data, length);
211*437bfbebSnyanmisaka         mpp_packet_set_size(ctx->pkt, buff_size);
212*437bfbebSnyanmisaka     }
213*437bfbebSnyanmisaka 
214*437bfbebSnyanmisaka     memcpy(data, buf, length);
215*437bfbebSnyanmisaka     mpp_packet_set_length(ctx->pkt, length);
216*437bfbebSnyanmisaka 
217*437bfbebSnyanmisaka     return MPP_OK;
218*437bfbebSnyanmisaka }
219*437bfbebSnyanmisaka 
vp9d_split_init(Vp9CodecContext * vp9_ctx)220*437bfbebSnyanmisaka MPP_RET vp9d_split_init(Vp9CodecContext *vp9_ctx)
221*437bfbebSnyanmisaka {
222*437bfbebSnyanmisaka     SplitContext_t *ps;
223*437bfbebSnyanmisaka     VP9ParseContext *sc;
224*437bfbebSnyanmisaka 
225*437bfbebSnyanmisaka     ps = (SplitContext_t *)mpp_calloc(SplitContext_t, 1);
226*437bfbebSnyanmisaka     if (!ps) {
227*437bfbebSnyanmisaka         mpp_err("vp9 parser malloc fail");
228*437bfbebSnyanmisaka         return MPP_ERR_NOMEM;
229*437bfbebSnyanmisaka     }
230*437bfbebSnyanmisaka 
231*437bfbebSnyanmisaka     sc = (VP9ParseContext *)mpp_calloc(VP9ParseContext, 1);
232*437bfbebSnyanmisaka     if (!sc) {
233*437bfbebSnyanmisaka         mpp_err("vp9 parser context malloc fail");
234*437bfbebSnyanmisaka         mpp_free(ps);
235*437bfbebSnyanmisaka         return MPP_ERR_NOMEM;
236*437bfbebSnyanmisaka     }
237*437bfbebSnyanmisaka 
238*437bfbebSnyanmisaka     ps->priv_data = (void*)sc;
239*437bfbebSnyanmisaka     vp9_ctx->priv_data2 = (void*)ps;
240*437bfbebSnyanmisaka 
241*437bfbebSnyanmisaka     return MPP_OK;
242*437bfbebSnyanmisaka }
243*437bfbebSnyanmisaka 
vp9d_split_deinit(Vp9CodecContext * vp9_ctx)244*437bfbebSnyanmisaka MPP_RET vp9d_split_deinit(Vp9CodecContext *vp9_ctx)
245*437bfbebSnyanmisaka {
246*437bfbebSnyanmisaka     SplitContext_t *ps = (SplitContext_t *)vp9_ctx->priv_data2;
247*437bfbebSnyanmisaka 
248*437bfbebSnyanmisaka     if (ps)
249*437bfbebSnyanmisaka         MPP_FREE(ps->priv_data);
250*437bfbebSnyanmisaka     MPP_FREE(vp9_ctx->priv_data2);
251*437bfbebSnyanmisaka 
252*437bfbebSnyanmisaka     return MPP_OK;
253*437bfbebSnyanmisaka }
254*437bfbebSnyanmisaka 
vp9_ref_frame(Vp9CodecContext * ctx,VP9Frame * dst,VP9Frame * src)255*437bfbebSnyanmisaka static RK_S32 vp9_ref_frame(Vp9CodecContext *ctx, VP9Frame *dst, VP9Frame *src)
256*437bfbebSnyanmisaka {
257*437bfbebSnyanmisaka     VP9Context *s = ctx->priv_data;
258*437bfbebSnyanmisaka     MppFrameImpl *impl_frm = (MppFrameImpl *)dst->f;
259*437bfbebSnyanmisaka 
260*437bfbebSnyanmisaka     if (src->ref == NULL || src->slot_index >= 0x7f) {
261*437bfbebSnyanmisaka         mpp_err("vp9_ref_frame is vaild");
262*437bfbebSnyanmisaka         return -1;
263*437bfbebSnyanmisaka     }
264*437bfbebSnyanmisaka     dst->slot_index = src->slot_index;
265*437bfbebSnyanmisaka     dst->ref = src->ref;
266*437bfbebSnyanmisaka     dst->ref->invisible = src->ref->invisible;
267*437bfbebSnyanmisaka     dst->ref->ref_count++;
268*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_REF, "get prop slot frame %p  count %d", dst->f, dst->ref->ref_count);
269*437bfbebSnyanmisaka     mpp_buf_slot_get_prop(s->slots, src->slot_index, SLOT_FRAME, &dst->f);
270*437bfbebSnyanmisaka     impl_frm->buffer = NULL; //parser no need process hal buf
271*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_REF, "get prop slot frame after %p", dst->f);
272*437bfbebSnyanmisaka     return 0;
273*437bfbebSnyanmisaka }
274*437bfbebSnyanmisaka 
vp9_unref_frame(VP9Context * s,VP9Frame * f)275*437bfbebSnyanmisaka static void vp9_unref_frame( VP9Context *s, VP9Frame *f)
276*437bfbebSnyanmisaka {
277*437bfbebSnyanmisaka     if (f->ref->ref_count <= 0 || f->slot_index >= 0x7f) {
278*437bfbebSnyanmisaka         mpp_err("ref count alreay is zero");
279*437bfbebSnyanmisaka         return;
280*437bfbebSnyanmisaka     }
281*437bfbebSnyanmisaka     f->ref->ref_count--;
282*437bfbebSnyanmisaka     if (!f->ref->ref_count) {
283*437bfbebSnyanmisaka         if (f->slot_index <= 0x7f) {
284*437bfbebSnyanmisaka             if (f->ref->invisible && !f->ref->is_output) {
285*437bfbebSnyanmisaka                 MppBuffer framebuf = NULL;
286*437bfbebSnyanmisaka 
287*437bfbebSnyanmisaka                 mpp_buf_slot_get_prop(s->slots, f->slot_index, SLOT_BUFFER, &framebuf);
288*437bfbebSnyanmisaka                 mpp_buffer_put(framebuf);
289*437bfbebSnyanmisaka                 f->ref->invisible = 0;
290*437bfbebSnyanmisaka             }
291*437bfbebSnyanmisaka             mpp_buf_slot_clr_flag(s->slots, f->slot_index, SLOT_CODEC_USE);
292*437bfbebSnyanmisaka         }
293*437bfbebSnyanmisaka         mpp_free(f->ref);
294*437bfbebSnyanmisaka         f->slot_index = 0xff;
295*437bfbebSnyanmisaka         f->ref = NULL;
296*437bfbebSnyanmisaka     }
297*437bfbebSnyanmisaka     f->ref = NULL;
298*437bfbebSnyanmisaka     return;
299*437bfbebSnyanmisaka }
300*437bfbebSnyanmisaka 
301*437bfbebSnyanmisaka 
vp9_frame_free(VP9Context * s)302*437bfbebSnyanmisaka static  RK_S32 vp9_frame_free(VP9Context *s)
303*437bfbebSnyanmisaka {
304*437bfbebSnyanmisaka     RK_S32 i;
305*437bfbebSnyanmisaka     for (i = 0; i < 3; i++) {
306*437bfbebSnyanmisaka         if (s->frames[i].ref) {
307*437bfbebSnyanmisaka             vp9_unref_frame(s, &s->frames[i]);
308*437bfbebSnyanmisaka         }
309*437bfbebSnyanmisaka         mpp_frame_deinit(&s->frames[i].f);
310*437bfbebSnyanmisaka     }
311*437bfbebSnyanmisaka     for (i = 0; i < 8; i++) {
312*437bfbebSnyanmisaka         if (s->refs[i].ref) {
313*437bfbebSnyanmisaka             vp9_unref_frame(s, &s->refs[i]);
314*437bfbebSnyanmisaka         }
315*437bfbebSnyanmisaka         mpp_frame_deinit(&s->refs[i].f);
316*437bfbebSnyanmisaka     }
317*437bfbebSnyanmisaka     return 0;
318*437bfbebSnyanmisaka }
319*437bfbebSnyanmisaka 
vp9_frame_init(VP9Context * s)320*437bfbebSnyanmisaka static RK_S32 vp9_frame_init(VP9Context *s)
321*437bfbebSnyanmisaka {
322*437bfbebSnyanmisaka     RK_S32 i;
323*437bfbebSnyanmisaka     for (i = 0; i < 3; i++) {
324*437bfbebSnyanmisaka         mpp_frame_init(&s->frames[i].f);
325*437bfbebSnyanmisaka         if (!s->frames[i].f) {
326*437bfbebSnyanmisaka             vp9_frame_free(s);
327*437bfbebSnyanmisaka             mpp_err("Failed to allocate frame buffer %d\n", i);
328*437bfbebSnyanmisaka             return MPP_ERR_NOMEM;
329*437bfbebSnyanmisaka         }
330*437bfbebSnyanmisaka         s->frames[i].slot_index = 0x7f;
331*437bfbebSnyanmisaka         s->frames[i].ref = NULL;
332*437bfbebSnyanmisaka     }
333*437bfbebSnyanmisaka 
334*437bfbebSnyanmisaka     for (i = 0; i < 8; i++) {
335*437bfbebSnyanmisaka         mpp_frame_init(&(s->refs[i].f));
336*437bfbebSnyanmisaka         if (!s->refs[i].f) {
337*437bfbebSnyanmisaka             vp9_frame_free(s);
338*437bfbebSnyanmisaka             mpp_err("Failed to allocate frame buffer %d\n", i);
339*437bfbebSnyanmisaka             return MPP_ERR_NOMEM;
340*437bfbebSnyanmisaka         }
341*437bfbebSnyanmisaka         s->refs[i].slot_index = 0x7f;
342*437bfbebSnyanmisaka         s->refs[i].ref = NULL;
343*437bfbebSnyanmisaka     }
344*437bfbebSnyanmisaka     return MPP_OK;
345*437bfbebSnyanmisaka }
346*437bfbebSnyanmisaka 
vp9d_parser_init(Vp9CodecContext * vp9_ctx,ParserCfg * init)347*437bfbebSnyanmisaka MPP_RET vp9d_parser_init(Vp9CodecContext *vp9_ctx, ParserCfg *init)
348*437bfbebSnyanmisaka {
349*437bfbebSnyanmisaka     VP9Context *s = mpp_calloc(VP9Context, 1);
350*437bfbebSnyanmisaka     vp9_ctx->priv_data = (void*)s;
351*437bfbebSnyanmisaka     if (!vp9_ctx->priv_data) {
352*437bfbebSnyanmisaka         mpp_err("vp9 codec context malloc fail");
353*437bfbebSnyanmisaka         return MPP_ERR_NOMEM;
354*437bfbebSnyanmisaka     }
355*437bfbebSnyanmisaka     vp9_frame_init(s);
356*437bfbebSnyanmisaka     s->last_bpp = 0;
357*437bfbebSnyanmisaka     s->filter.sharpness = -1;
358*437bfbebSnyanmisaka 
359*437bfbebSnyanmisaka #ifdef dump
360*437bfbebSnyanmisaka     count = 0;
361*437bfbebSnyanmisaka #endif
362*437bfbebSnyanmisaka 
363*437bfbebSnyanmisaka     s->packet_slots = init->packet_slots;
364*437bfbebSnyanmisaka     s->slots = init->frame_slots;
365*437bfbebSnyanmisaka     s->cfg = init->cfg;
366*437bfbebSnyanmisaka     s->hw_info = init->hw_info;
367*437bfbebSnyanmisaka     mpp_buf_slot_setup(s->slots, 25);
368*437bfbebSnyanmisaka 
369*437bfbebSnyanmisaka     mpp_env_get_u32("vp9d_debug", &vp9d_debug, 0);
370*437bfbebSnyanmisaka 
371*437bfbebSnyanmisaka     return MPP_OK;
372*437bfbebSnyanmisaka }
373*437bfbebSnyanmisaka 
vp9d_parser_deinit(Vp9CodecContext * vp9_ctx)374*437bfbebSnyanmisaka MPP_RET vp9d_parser_deinit(Vp9CodecContext *vp9_ctx)
375*437bfbebSnyanmisaka {
376*437bfbebSnyanmisaka     VP9Context *s = vp9_ctx->priv_data;
377*437bfbebSnyanmisaka     vp9_frame_free(s);
378*437bfbebSnyanmisaka     mpp_free(s->c_b);
379*437bfbebSnyanmisaka     s->c_b_size = 0;
380*437bfbebSnyanmisaka     MPP_FREE(vp9_ctx->priv_data);
381*437bfbebSnyanmisaka     return MPP_OK;
382*437bfbebSnyanmisaka }
383*437bfbebSnyanmisaka 
vp9_alloc_frame(Vp9CodecContext * ctx,VP9Frame * frame)384*437bfbebSnyanmisaka static RK_S32 vp9_alloc_frame(Vp9CodecContext *ctx, VP9Frame *frame)
385*437bfbebSnyanmisaka {
386*437bfbebSnyanmisaka     VP9Context *s = ctx->priv_data;
387*437bfbebSnyanmisaka     mpp_frame_set_width(frame->f, ctx->width);
388*437bfbebSnyanmisaka     mpp_frame_set_height(frame->f, ctx->height);
389*437bfbebSnyanmisaka 
390*437bfbebSnyanmisaka     mpp_frame_set_hor_stride(frame->f, 0);
391*437bfbebSnyanmisaka     mpp_frame_set_ver_stride(frame->f, 0);
392*437bfbebSnyanmisaka     mpp_frame_set_errinfo(frame->f, 0);
393*437bfbebSnyanmisaka     mpp_frame_set_discard(frame->f, 0);
394*437bfbebSnyanmisaka     mpp_frame_set_pts(frame->f, s->pts);
395*437bfbebSnyanmisaka     mpp_frame_set_dts(frame->f, s->dts);
396*437bfbebSnyanmisaka     // set current poc
397*437bfbebSnyanmisaka     s->cur_poc++;
398*437bfbebSnyanmisaka     mpp_frame_set_poc(frame->f, s->cur_poc);
399*437bfbebSnyanmisaka 
400*437bfbebSnyanmisaka     if (MPP_FRAME_FMT_IS_FBC(s->cfg->base.out_fmt)) {
401*437bfbebSnyanmisaka         RK_U32 fbc_hdr_stride = mpp_align_64(ctx->width);
402*437bfbebSnyanmisaka 
403*437bfbebSnyanmisaka         mpp_slots_set_prop(s->slots, SLOTS_HOR_ALIGN, mpp_align_64);
404*437bfbebSnyanmisaka         mpp_frame_set_fmt(frame->f, ctx->pix_fmt | ((s->cfg->base.out_fmt & (MPP_FRAME_FBC_MASK))));
405*437bfbebSnyanmisaka 
406*437bfbebSnyanmisaka         if (*compat_ext_fbc_hdr_256_odd)
407*437bfbebSnyanmisaka             fbc_hdr_stride = mpp_align_256_odd(ctx->width);
408*437bfbebSnyanmisaka 
409*437bfbebSnyanmisaka         mpp_frame_set_fbc_hdr_stride(frame->f, fbc_hdr_stride);
410*437bfbebSnyanmisaka     } else {
411*437bfbebSnyanmisaka         if (mpp_get_soc_type() == ROCKCHIP_SOC_RK3576)
412*437bfbebSnyanmisaka             mpp_slots_set_prop(s->slots, SLOTS_HOR_ALIGN, mpp_align_128_odd_plus_64);
413*437bfbebSnyanmisaka         else
414*437bfbebSnyanmisaka             mpp_slots_set_prop(s->slots, SLOTS_HOR_ALIGN, mpp_align_256_odd);
415*437bfbebSnyanmisaka         mpp_slots_set_prop(s->slots, SLOTS_VER_ALIGN, mpp_align_64);
416*437bfbebSnyanmisaka         if (MPP_FRAME_FMT_IS_TILE(s->cfg->base.out_fmt))
417*437bfbebSnyanmisaka             mpp_frame_set_fmt(frame->f, ctx->pix_fmt | ((s->cfg->base.out_fmt & (MPP_FRAME_TILE_FLAG))));
418*437bfbebSnyanmisaka         else
419*437bfbebSnyanmisaka             mpp_frame_set_fmt(frame->f, ctx->pix_fmt);
420*437bfbebSnyanmisaka     }
421*437bfbebSnyanmisaka 
422*437bfbebSnyanmisaka     if (s->cfg->base.enable_thumbnail && s->hw_info->cap_down_scale)
423*437bfbebSnyanmisaka         mpp_frame_set_thumbnail_en(frame->f, s->cfg->base.enable_thumbnail);
424*437bfbebSnyanmisaka     else
425*437bfbebSnyanmisaka         mpp_frame_set_thumbnail_en(frame->f, 0);
426*437bfbebSnyanmisaka 
427*437bfbebSnyanmisaka     mpp_buf_slot_get_unused(s->slots, &frame->slot_index);
428*437bfbebSnyanmisaka     mpp_buf_slot_set_prop(s->slots, frame->slot_index, SLOT_FRAME, frame->f);
429*437bfbebSnyanmisaka     mpp_buf_slot_set_flag(s->slots, frame->slot_index, SLOT_CODEC_USE);
430*437bfbebSnyanmisaka     mpp_buf_slot_set_flag(s->slots, frame->slot_index, SLOT_HAL_OUTPUT);
431*437bfbebSnyanmisaka     frame->ref = mpp_calloc(RefInfo, 1);
432*437bfbebSnyanmisaka     frame->ref->ref_count++;
433*437bfbebSnyanmisaka     frame->ref->invisible = s->invisible;
434*437bfbebSnyanmisaka     frame->ref->is_output = 0;
435*437bfbebSnyanmisaka 
436*437bfbebSnyanmisaka     return 0;
437*437bfbebSnyanmisaka }
438*437bfbebSnyanmisaka 
439*437bfbebSnyanmisaka 
440*437bfbebSnyanmisaka 
441*437bfbebSnyanmisaka // for some reason the sign bit is at the end, not the start, of a bit sequence
get_sbits_inv(BitReadCtx_t * gb,RK_S32 n)442*437bfbebSnyanmisaka static RK_S32 get_sbits_inv(BitReadCtx_t *gb, RK_S32 n)
443*437bfbebSnyanmisaka {
444*437bfbebSnyanmisaka     RK_S32 value;
445*437bfbebSnyanmisaka     RK_S32 v;
446*437bfbebSnyanmisaka     READ_BITS(gb, n, &v);
447*437bfbebSnyanmisaka     READ_ONEBIT(gb, &value);
448*437bfbebSnyanmisaka     return value ? -v : v;
449*437bfbebSnyanmisaka __BITREAD_ERR:
450*437bfbebSnyanmisaka     return MPP_ERR_STREAM;
451*437bfbebSnyanmisaka }
452*437bfbebSnyanmisaka 
update_size(Vp9CodecContext * ctx,RK_S32 w,RK_S32 h,RK_S32 fmt)453*437bfbebSnyanmisaka static RK_S32 update_size(Vp9CodecContext *ctx, RK_S32 w, RK_S32 h, RK_S32 fmt)
454*437bfbebSnyanmisaka {
455*437bfbebSnyanmisaka     VP9Context *s = ctx->priv_data;
456*437bfbebSnyanmisaka 
457*437bfbebSnyanmisaka     if (w == ctx->width && h == ctx->height && ctx->pix_fmt == fmt)
458*437bfbebSnyanmisaka         return 0;
459*437bfbebSnyanmisaka 
460*437bfbebSnyanmisaka     ctx->width   = w;
461*437bfbebSnyanmisaka     ctx->height  = h;
462*437bfbebSnyanmisaka     ctx->pix_fmt = fmt;
463*437bfbebSnyanmisaka     s->sb_cols   = (w + 63) >> 6;
464*437bfbebSnyanmisaka     s->sb_rows   = (h + 63) >> 6;
465*437bfbebSnyanmisaka     s->cols      = (w + 7) >> 3;
466*437bfbebSnyanmisaka     s->rows      = (h + 7) >> 3;
467*437bfbebSnyanmisaka 
468*437bfbebSnyanmisaka     // these will be re-allocated a little later
469*437bfbebSnyanmisaka     if (s->bpp != s->last_bpp) {
470*437bfbebSnyanmisaka         s->last_bpp = s->bpp;
471*437bfbebSnyanmisaka     }
472*437bfbebSnyanmisaka 
473*437bfbebSnyanmisaka     return 0;
474*437bfbebSnyanmisaka }
475*437bfbebSnyanmisaka 
inv_recenter_nonneg(RK_S32 v,RK_S32 m)476*437bfbebSnyanmisaka static RK_S32 inv_recenter_nonneg(RK_S32 v, RK_S32 m)
477*437bfbebSnyanmisaka {
478*437bfbebSnyanmisaka     return v > 2 * m ? v : v & 1 ? m - ((v + 1) >> 1) : m + (v >> 1);
479*437bfbebSnyanmisaka }
480*437bfbebSnyanmisaka 
481*437bfbebSnyanmisaka // differential forward probability updates
update_prob(VpxRangeCoder * c,RK_S32 p,RK_U8 * delta)482*437bfbebSnyanmisaka static RK_S32 update_prob(VpxRangeCoder *c, RK_S32 p, RK_U8 *delta)
483*437bfbebSnyanmisaka {
484*437bfbebSnyanmisaka     static const RK_S32 inv_map_table[255] = {
485*437bfbebSnyanmisaka         7,  20,  33,  46,  59,  72,  85,  98, 111, 124, 137, 150, 163, 176,
486*437bfbebSnyanmisaka         189, 202, 215, 228, 241, 254,   1,   2,   3,   4,   5,   6,   8,   9,
487*437bfbebSnyanmisaka         10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  21,  22,  23,  24,
488*437bfbebSnyanmisaka         25,  26,  27,  28,  29,  30,  31,  32,  34,  35,  36,  37,  38,  39,
489*437bfbebSnyanmisaka         40,  41,  42,  43,  44,  45,  47,  48,  49,  50,  51,  52,  53,  54,
490*437bfbebSnyanmisaka         55,  56,  57,  58,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,
491*437bfbebSnyanmisaka         70,  71,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,
492*437bfbebSnyanmisaka         86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,  99, 100,
493*437bfbebSnyanmisaka         101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115,
494*437bfbebSnyanmisaka         116, 117, 118, 119, 120, 121, 122, 123, 125, 126, 127, 128, 129, 130,
495*437bfbebSnyanmisaka         131, 132, 133, 134, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145,
496*437bfbebSnyanmisaka         146, 147, 148, 149, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160,
497*437bfbebSnyanmisaka         161, 162, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
498*437bfbebSnyanmisaka         177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 190, 191,
499*437bfbebSnyanmisaka         192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 204, 205, 206,
500*437bfbebSnyanmisaka         207, 208, 209, 210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221,
501*437bfbebSnyanmisaka         222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 233, 234, 235, 236,
502*437bfbebSnyanmisaka         237, 238, 239, 240, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251,
503*437bfbebSnyanmisaka         252, 253, 253,
504*437bfbebSnyanmisaka     };
505*437bfbebSnyanmisaka     RK_S32 d;
506*437bfbebSnyanmisaka 
507*437bfbebSnyanmisaka     /* This code is trying to do a differential probability update. For a
508*437bfbebSnyanmisaka      * current probability A in the range [1, 255], the difference to a new
509*437bfbebSnyanmisaka      * probability of any value can be expressed differentially as 1-A,255-A
510*437bfbebSnyanmisaka      * where some part of this (absolute range) exists both in positive as
511*437bfbebSnyanmisaka      * well as the negative part, whereas another part only exists in one
512*437bfbebSnyanmisaka      * half. We're trying to code this shared part differentially, i.e.
513*437bfbebSnyanmisaka      * times two where the value of the lowest bit specifies the sign, and
514*437bfbebSnyanmisaka      * the single part is then coded on top of this. This absolute difference
515*437bfbebSnyanmisaka      * then again has a value of [0,254], but a bigger value in this range
516*437bfbebSnyanmisaka      * indicates that we're further away from the original value A, so we
517*437bfbebSnyanmisaka      * can code this as a VLC code, since higher values are increasingly
518*437bfbebSnyanmisaka      * unlikely. The first 20 values in inv_map_table[] allow 'cheap, rough'
519*437bfbebSnyanmisaka      * updates vs. the 'fine, exact' updates further down the range, which
520*437bfbebSnyanmisaka      * adds one extra dimension to this differential update model. */
521*437bfbebSnyanmisaka 
522*437bfbebSnyanmisaka     if (!vpx_rac_get(c)) {
523*437bfbebSnyanmisaka         d = vpx_rac_get_uint(c, 4) + 0;
524*437bfbebSnyanmisaka     } else if (!vpx_rac_get(c)) {
525*437bfbebSnyanmisaka         d = vpx_rac_get_uint(c, 4) + 16;
526*437bfbebSnyanmisaka     } else if (!vpx_rac_get(c)) {
527*437bfbebSnyanmisaka         d = vpx_rac_get_uint(c, 5) + 32;
528*437bfbebSnyanmisaka     } else {
529*437bfbebSnyanmisaka         d = vpx_rac_get_uint(c, 7);
530*437bfbebSnyanmisaka         if (d >= 65)
531*437bfbebSnyanmisaka             d = (d << 1) - 65 + vpx_rac_get(c);
532*437bfbebSnyanmisaka         d += 64;
533*437bfbebSnyanmisaka         //av_assert2(d < FF_ARRAY_ELEMS(inv_map_table));
534*437bfbebSnyanmisaka     }
535*437bfbebSnyanmisaka     *delta = d;
536*437bfbebSnyanmisaka     return p <= 128 ? 1 + inv_recenter_nonneg(inv_map_table[d], p - 1) :
537*437bfbebSnyanmisaka            255 - inv_recenter_nonneg(inv_map_table[d], 255 - p);
538*437bfbebSnyanmisaka }
539*437bfbebSnyanmisaka 
mpp_get_bit1(BitReadCtx_t * gb)540*437bfbebSnyanmisaka static RK_S32 mpp_get_bit1(BitReadCtx_t *gb)
541*437bfbebSnyanmisaka {
542*437bfbebSnyanmisaka     RK_S32 value;
543*437bfbebSnyanmisaka     READ_ONEBIT(gb, &value);
544*437bfbebSnyanmisaka     return value;
545*437bfbebSnyanmisaka __BITREAD_ERR:
546*437bfbebSnyanmisaka     return 0;
547*437bfbebSnyanmisaka }
548*437bfbebSnyanmisaka 
mpp_get_bits(BitReadCtx_t * gb,RK_S32 num_bit)549*437bfbebSnyanmisaka static RK_S32 mpp_get_bits(BitReadCtx_t *gb, RK_S32 num_bit)
550*437bfbebSnyanmisaka {
551*437bfbebSnyanmisaka     RK_S32 value;
552*437bfbebSnyanmisaka     READ_BITS(gb, num_bit, &value);
553*437bfbebSnyanmisaka     return value;
554*437bfbebSnyanmisaka __BITREAD_ERR:
555*437bfbebSnyanmisaka     return 0;
556*437bfbebSnyanmisaka }
557*437bfbebSnyanmisaka 
read_colorspace_details(Vp9CodecContext * ctx)558*437bfbebSnyanmisaka static RK_S32 read_colorspace_details(Vp9CodecContext *ctx)
559*437bfbebSnyanmisaka {
560*437bfbebSnyanmisaka     static const MppFrameColorSpace colorspaces[8] = {
561*437bfbebSnyanmisaka         MPP_FRAME_SPC_UNSPECIFIED, MPP_FRAME_SPC_BT470BG, MPP_FRAME_SPC_BT709, MPP_FRAME_SPC_SMPTE170M,
562*437bfbebSnyanmisaka         MPP_FRAME_SPC_SMPTE240M, MPP_FRAME_SPC_BT2020_NCL, MPP_FRAME_SPC_RESERVED, MPP_FRAME_SPC_RGB,
563*437bfbebSnyanmisaka     };
564*437bfbebSnyanmisaka     VP9Context *s = ctx->priv_data;
565*437bfbebSnyanmisaka     RK_S32 res;
566*437bfbebSnyanmisaka     RK_S32 bits = ctx->profile <= 1 ? 0 : 1 + mpp_get_bit1(&s->gb); // 0:8, 1:10, 2:12
567*437bfbebSnyanmisaka 
568*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "bit_depth %d", 8 + bits * 2);
569*437bfbebSnyanmisaka     s->bpp_index = bits;
570*437bfbebSnyanmisaka     s->bpp = 8 + bits * 2;
571*437bfbebSnyanmisaka     s->bytesperpixel = (7 + s->bpp) >> 3;
572*437bfbebSnyanmisaka     ctx->colorspace = colorspaces[mpp_get_bits(&s->gb, 3)];
573*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "color_space %d", ctx->colorspace);
574*437bfbebSnyanmisaka     if (ctx->colorspace == MPP_FRAME_SPC_RGB) { // RGB = profile 1
575*437bfbebSnyanmisaka 
576*437bfbebSnyanmisaka         {
577*437bfbebSnyanmisaka             mpp_err("RGB not supported in profile %d\n", ctx->profile);
578*437bfbebSnyanmisaka             return MPP_ERR_STREAM;
579*437bfbebSnyanmisaka         }
580*437bfbebSnyanmisaka     } else {
581*437bfbebSnyanmisaka         static const RK_S32 pix_fmt_for_ss[3][2 /* v */][2 /* h */] = {
582*437bfbebSnyanmisaka             {   { -1, MPP_FMT_YUV422SP },
583*437bfbebSnyanmisaka                 { -1, MPP_FMT_YUV420SP }
584*437bfbebSnyanmisaka             },
585*437bfbebSnyanmisaka             {   { -1, MPP_FMT_YUV422SP_10BIT},
586*437bfbebSnyanmisaka                 { -1, MPP_FMT_YUV420SP_10BIT}
587*437bfbebSnyanmisaka             },
588*437bfbebSnyanmisaka             {   { -1, -1 },
589*437bfbebSnyanmisaka                 { -1, -1 }
590*437bfbebSnyanmisaka             }
591*437bfbebSnyanmisaka         };
592*437bfbebSnyanmisaka         ctx->color_range = mpp_get_bit1(&s->gb) ? MPP_FRAME_RANGE_JPEG : MPP_FRAME_RANGE_MPEG;
593*437bfbebSnyanmisaka         vp9d_dbg(VP9D_DBG_HEADER, "color_range %d", ctx->color_range);
594*437bfbebSnyanmisaka         if (ctx->profile & 1) {
595*437bfbebSnyanmisaka             s->ss_h = mpp_get_bit1(&s->gb);
596*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "subsampling_x %d", s->ss_h);
597*437bfbebSnyanmisaka             s->ss_v = mpp_get_bit1(&s->gb);
598*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "subsampling_y %d", s->ss_v);
599*437bfbebSnyanmisaka             s->extra_plane = 0;
600*437bfbebSnyanmisaka             res = pix_fmt_for_ss[bits][s->ss_v][s->ss_h];
601*437bfbebSnyanmisaka             if (res == MPP_FMT_YUV420SP || res < 0) {
602*437bfbebSnyanmisaka                 mpp_err("YUV FMT %d not supported in profile %d\n", res, ctx->profile);
603*437bfbebSnyanmisaka                 return MPP_ERR_STREAM;
604*437bfbebSnyanmisaka             } else if (mpp_get_bit1(&s->gb)) {
605*437bfbebSnyanmisaka                 s->extra_plane = 1;
606*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "has_extra_plane 1");
607*437bfbebSnyanmisaka                 mpp_err("Profile %d color details reserved bit set\n", ctx->profile);
608*437bfbebSnyanmisaka                 return  MPP_ERR_STREAM;
609*437bfbebSnyanmisaka             }
610*437bfbebSnyanmisaka         } else {
611*437bfbebSnyanmisaka             s->extra_plane = 0;
612*437bfbebSnyanmisaka             s->ss_h = s->ss_v = 1;
613*437bfbebSnyanmisaka             res = pix_fmt_for_ss[bits][1][1];
614*437bfbebSnyanmisaka         }
615*437bfbebSnyanmisaka     }
616*437bfbebSnyanmisaka 
617*437bfbebSnyanmisaka     return res;
618*437bfbebSnyanmisaka }
619*437bfbebSnyanmisaka 
decode012(BitReadCtx_t * gb)620*437bfbebSnyanmisaka static RK_S32 decode012(BitReadCtx_t *gb)
621*437bfbebSnyanmisaka {
622*437bfbebSnyanmisaka     RK_S32 n;
623*437bfbebSnyanmisaka     n = mpp_get_bit1(gb);
624*437bfbebSnyanmisaka     if (n == 0)
625*437bfbebSnyanmisaka         return 0;
626*437bfbebSnyanmisaka     else
627*437bfbebSnyanmisaka         return mpp_get_bit1(gb) + 1;
628*437bfbebSnyanmisaka }
629*437bfbebSnyanmisaka 
decode_parser_header(Vp9CodecContext * ctx,const RK_U8 * data,RK_S32 size,RK_S32 * refo)630*437bfbebSnyanmisaka static RK_S32 decode_parser_header(Vp9CodecContext *ctx,
631*437bfbebSnyanmisaka                                    const RK_U8 *data, RK_S32 size, RK_S32 *refo)
632*437bfbebSnyanmisaka {
633*437bfbebSnyanmisaka     VP9Context *s = ctx->priv_data;
634*437bfbebSnyanmisaka     RK_S32 c, i, j, k, l, m, n, max, size2, res, sharp;
635*437bfbebSnyanmisaka     RK_U32 w, h;
636*437bfbebSnyanmisaka     RK_S32 fmt = ctx->pix_fmt;
637*437bfbebSnyanmisaka     RK_S32 last_invisible;
638*437bfbebSnyanmisaka     const RK_U8 *data2;
639*437bfbebSnyanmisaka 
640*437bfbebSnyanmisaka #ifdef dump
641*437bfbebSnyanmisaka     char filename[20] = "data/acoef";
642*437bfbebSnyanmisaka     if (vp9_p_fp2 != NULL) {
643*437bfbebSnyanmisaka         fclose(vp9_p_fp2);
644*437bfbebSnyanmisaka 
645*437bfbebSnyanmisaka     }
646*437bfbebSnyanmisaka     sprintf(&filename[10], "%d.bin", dec_num);
647*437bfbebSnyanmisaka     vp9_p_fp2 = fopen(filename, "wb");
648*437bfbebSnyanmisaka #endif
649*437bfbebSnyanmisaka 
650*437bfbebSnyanmisaka     /* general header */
651*437bfbebSnyanmisaka     mpp_set_bitread_ctx(&s->gb, (RK_U8*)data, size);
652*437bfbebSnyanmisaka     if (mpp_get_bits(&s->gb, 2) != 0x2) { // frame marker
653*437bfbebSnyanmisaka         mpp_err("Invalid frame marker\n");
654*437bfbebSnyanmisaka         return MPP_ERR_STREAM;
655*437bfbebSnyanmisaka     }
656*437bfbebSnyanmisaka 
657*437bfbebSnyanmisaka     ctx->profile  = mpp_get_bit1(&s->gb);
658*437bfbebSnyanmisaka     ctx->profile |= mpp_get_bit1(&s->gb) << 1;
659*437bfbebSnyanmisaka 
660*437bfbebSnyanmisaka     if (ctx->profile == 3) ctx->profile += mpp_get_bit1(&s->gb);
661*437bfbebSnyanmisaka     if (ctx->profile > 3) {
662*437bfbebSnyanmisaka         mpp_err("Profile %d is not yet supported\n", ctx->profile);
663*437bfbebSnyanmisaka         return MPP_ERR_STREAM;
664*437bfbebSnyanmisaka     }
665*437bfbebSnyanmisaka 
666*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "profile %d", ctx->profile);
667*437bfbebSnyanmisaka     s->show_existing_frame = mpp_get_bit1(&s->gb);
668*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "show_existing_frame %d", s->show_existing_frame);
669*437bfbebSnyanmisaka 
670*437bfbebSnyanmisaka     if (s->show_existing_frame) {
671*437bfbebSnyanmisaka         *refo = mpp_get_bits(&s->gb, 3);
672*437bfbebSnyanmisaka         vp9d_dbg(VP9D_DBG_HEADER, "frame_to_show %d", *refo);
673*437bfbebSnyanmisaka         return 0;
674*437bfbebSnyanmisaka     }
675*437bfbebSnyanmisaka 
676*437bfbebSnyanmisaka     s->last_keyframe  = s->keyframe;
677*437bfbebSnyanmisaka     s->keyframe       = !mpp_get_bit1(&s->gb);
678*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "frame_type %d", s->keyframe);
679*437bfbebSnyanmisaka     last_invisible    = s->invisible;
680*437bfbebSnyanmisaka     s->invisible      = !mpp_get_bit1(&s->gb);
681*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "show_frame_flag %d", s->invisible);
682*437bfbebSnyanmisaka     s->errorres       = mpp_get_bit1(&s->gb);
683*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "error_resilient_mode %d", s->errorres);
684*437bfbebSnyanmisaka     s->use_last_frame_mvs = !s->errorres && !last_invisible;
685*437bfbebSnyanmisaka     s->got_keyframes += s->keyframe ? 1 : 0;
686*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "keyframe=%d, intraonly=%d, got_keyframes=%d\n",
687*437bfbebSnyanmisaka              s->keyframe, s->intraonly, s->got_keyframes);
688*437bfbebSnyanmisaka 
689*437bfbebSnyanmisaka     if (!s->got_keyframes) {
690*437bfbebSnyanmisaka         mpp_err_f("have not got keyframe.\n");
691*437bfbebSnyanmisaka         return MPP_ERR_STREAM;
692*437bfbebSnyanmisaka     }
693*437bfbebSnyanmisaka 
694*437bfbebSnyanmisaka     /* set mvscale=16 default */
695*437bfbebSnyanmisaka     for (i = 0; i < 3; i++) {
696*437bfbebSnyanmisaka         s->mvscale[i][0] = 16;
697*437bfbebSnyanmisaka         s->mvscale[i][1] = 16;
698*437bfbebSnyanmisaka     }
699*437bfbebSnyanmisaka 
700*437bfbebSnyanmisaka     if (s->keyframe) {
701*437bfbebSnyanmisaka         if (mpp_get_bits(&s->gb, 24) != VP9_SYNCCODE) { // synccode
702*437bfbebSnyanmisaka             mpp_err("Invalid sync code\n");
703*437bfbebSnyanmisaka             return MPP_ERR_STREAM;
704*437bfbebSnyanmisaka         }
705*437bfbebSnyanmisaka 
706*437bfbebSnyanmisaka         if ((fmt = read_colorspace_details(ctx)) < 0)
707*437bfbebSnyanmisaka             return fmt;
708*437bfbebSnyanmisaka         // for profile 1, here follows the subsampling bits
709*437bfbebSnyanmisaka         s->refreshrefmask = 0xff;
710*437bfbebSnyanmisaka         w = mpp_get_bits(&s->gb, 16) + 1;
711*437bfbebSnyanmisaka         vp9d_dbg(VP9D_DBG_HEADER, "frame_size_width %d", w);
712*437bfbebSnyanmisaka         h = mpp_get_bits(&s->gb, 16) + 1;
713*437bfbebSnyanmisaka         vp9d_dbg(VP9D_DBG_HEADER, "frame_size_height %d", h);
714*437bfbebSnyanmisaka         if (mpp_get_bit1(&s->gb)) {// display size
715*437bfbebSnyanmisaka             RK_S32 dw, dh;
716*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "display_info_flag %d", 1);
717*437bfbebSnyanmisaka             dw = mpp_get_bits(&s->gb, 16) + 1;
718*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "display_size_width %d", dw);
719*437bfbebSnyanmisaka             dh = mpp_get_bits(&s->gb, 16) + 1;
720*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "display_size_width %d", dh);
721*437bfbebSnyanmisaka         } else
722*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "display_info_flag %d", 0);
723*437bfbebSnyanmisaka     } else {
724*437bfbebSnyanmisaka         s->intraonly  = s->invisible ? mpp_get_bit1(&s->gb) : 0;
725*437bfbebSnyanmisaka         vp9d_dbg(VP9D_DBG_HEADER, "intra_only %d", s->intraonly);
726*437bfbebSnyanmisaka         s->resetctx   = s->errorres ? 0 : mpp_get_bits(&s->gb, 2);
727*437bfbebSnyanmisaka         vp9d_dbg(VP9D_DBG_HEADER, "reset_frame_context_value %d", s->resetctx);
728*437bfbebSnyanmisaka         if (s->intraonly) {
729*437bfbebSnyanmisaka             if (mpp_get_bits(&s->gb, 24) != VP9_SYNCCODE) { // synccode
730*437bfbebSnyanmisaka                 mpp_err("Invalid sync code\n");
731*437bfbebSnyanmisaka                 return MPP_ERR_STREAM;
732*437bfbebSnyanmisaka             }
733*437bfbebSnyanmisaka             if (ctx->profile == 1) {
734*437bfbebSnyanmisaka                 if ((fmt = read_colorspace_details(ctx)) < 0)
735*437bfbebSnyanmisaka                     return fmt;
736*437bfbebSnyanmisaka             } else {
737*437bfbebSnyanmisaka                 s->ss_h = s->ss_v = 1;
738*437bfbebSnyanmisaka                 s->bpp = 8;
739*437bfbebSnyanmisaka                 s->bpp_index = 0;
740*437bfbebSnyanmisaka                 s->bytesperpixel = 1;
741*437bfbebSnyanmisaka                 fmt = MPP_FMT_YUV420SP;
742*437bfbebSnyanmisaka                 ctx->colorspace = MPP_FRAME_SPC_BT470BG;
743*437bfbebSnyanmisaka                 ctx->color_range = MPP_FRAME_RANGE_JPEG;
744*437bfbebSnyanmisaka             }
745*437bfbebSnyanmisaka             s->refreshrefmask = mpp_get_bits(&s->gb, 8);
746*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "refresh_frame_flags %d", s->refreshrefmask);
747*437bfbebSnyanmisaka             w = mpp_get_bits(&s->gb, 16) + 1;
748*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "frame_size_width %d", w);
749*437bfbebSnyanmisaka             h = mpp_get_bits(&s->gb, 16) + 1;
750*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "frame_size_height %d", h);
751*437bfbebSnyanmisaka             if (mpp_get_bit1(&s->gb)) {// display size
752*437bfbebSnyanmisaka                 RK_S32 dw, dh;
753*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "display_info_flag %d", 1);
754*437bfbebSnyanmisaka                 dw = mpp_get_bits(&s->gb, 16) + 1;
755*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "display_size_width %d", dw);
756*437bfbebSnyanmisaka                 dh = mpp_get_bits(&s->gb, 16) + 1;
757*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "display_size_width %d", dh);
758*437bfbebSnyanmisaka             } else
759*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "display_info_flag %d", 0);
760*437bfbebSnyanmisaka         } else {
761*437bfbebSnyanmisaka             s->refreshrefmask = mpp_get_bits(&s->gb, 8);
762*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "refresh_frame_flags %d", s->refreshrefmask);
763*437bfbebSnyanmisaka             s->refidx[0]      = mpp_get_bits(&s->gb, 3);
764*437bfbebSnyanmisaka             s->signbias[0]    = mpp_get_bit1(&s->gb) && !s->errorres;
765*437bfbebSnyanmisaka             s->refidx[1]      = mpp_get_bits(&s->gb, 3);
766*437bfbebSnyanmisaka             s->signbias[1]    = mpp_get_bit1(&s->gb) && !s->errorres;
767*437bfbebSnyanmisaka             s->refidx[2]      = mpp_get_bits(&s->gb, 3);
768*437bfbebSnyanmisaka             s->signbias[2]    = mpp_get_bit1(&s->gb) && !s->errorres;
769*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "ref_idx %d %d %d",
770*437bfbebSnyanmisaka                      s->refidx[0], s->refidx[1], s->refidx[2]);
771*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "ref_idx_ref_frame_sign_bias %d %d %d",
772*437bfbebSnyanmisaka                      s->signbias[0], s->signbias[1], s->signbias[2]);
773*437bfbebSnyanmisaka             if (!s->refs[s->refidx[0]].ref ||
774*437bfbebSnyanmisaka                 !s->refs[s->refidx[1]].ref ||
775*437bfbebSnyanmisaka                 !s->refs[s->refidx[2]].ref ) {
776*437bfbebSnyanmisaka                 mpp_err("Not all references are available\n");
777*437bfbebSnyanmisaka                 //return -1;//AVERROR_INVALIDDATA;
778*437bfbebSnyanmisaka             }
779*437bfbebSnyanmisaka             if (mpp_get_bit1(&s->gb)) {
780*437bfbebSnyanmisaka 
781*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "ref_flag 0");
782*437bfbebSnyanmisaka                 w = mpp_frame_get_width(s->refs[s->refidx[0]].f);
783*437bfbebSnyanmisaka                 h = mpp_frame_get_height(s->refs[s->refidx[0]].f);
784*437bfbebSnyanmisaka             } else if (mpp_get_bit1(&s->gb)) {
785*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "ref_flag 2");
786*437bfbebSnyanmisaka                 w = mpp_frame_get_width(s->refs[s->refidx[1]].f);
787*437bfbebSnyanmisaka                 h = mpp_frame_get_height(s->refs[s->refidx[1]].f);
788*437bfbebSnyanmisaka             } else if (mpp_get_bit1(&s->gb)) {
789*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "ref_flag 1");
790*437bfbebSnyanmisaka                 w = mpp_frame_get_width(s->refs[s->refidx[2]].f);
791*437bfbebSnyanmisaka                 h = mpp_frame_get_height(s->refs[s->refidx[2]].f);
792*437bfbebSnyanmisaka             } else {
793*437bfbebSnyanmisaka                 w = mpp_get_bits(&s->gb, 16) + 1;
794*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "frame_size_width %d", w);
795*437bfbebSnyanmisaka                 h = mpp_get_bits(&s->gb, 16) + 1;
796*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "frame_size_height %d", h);
797*437bfbebSnyanmisaka             }
798*437bfbebSnyanmisaka             if (w == 0 || h == 0) {
799*437bfbebSnyanmisaka                 mpp_err("ref frame w:%d h:%d\n", w, h);
800*437bfbebSnyanmisaka                 return -1;
801*437bfbebSnyanmisaka             }
802*437bfbebSnyanmisaka             // Note that in this code, "CUR_FRAME" is actually before we
803*437bfbebSnyanmisaka             // have formally allocated a frame, and thus actually represents
804*437bfbebSnyanmisaka             // the _last_ frame
805*437bfbebSnyanmisaka             s->use_last_frame_mvs &= mpp_frame_get_width(s->frames[CUR_FRAME].f) == w &&
806*437bfbebSnyanmisaka                                      mpp_frame_get_height(s->frames[CUR_FRAME].f) == h;
807*437bfbebSnyanmisaka             if (mpp_get_bit1(&s->gb)) {// display size
808*437bfbebSnyanmisaka                 RK_S32 dw, dh;
809*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "display_info_flag %d", 1);
810*437bfbebSnyanmisaka                 dw = mpp_get_bits(&s->gb, 16) + 1;
811*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "display_size_width %d", dw);
812*437bfbebSnyanmisaka                 dh = mpp_get_bits(&s->gb, 16) + 1;
813*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "display_size_width %d", dh);
814*437bfbebSnyanmisaka             } else
815*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "display_info_flag %d", 0);
816*437bfbebSnyanmisaka             s->highprecisionmvs = mpp_get_bit1(&s->gb);
817*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "allow_high_precision_mv %d", s->highprecisionmvs);
818*437bfbebSnyanmisaka             s->filtermode = mpp_get_bit1(&s->gb) ? FILTER_SWITCHABLE :
819*437bfbebSnyanmisaka                             mpp_get_bits(&s->gb, 2);
820*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "filtermode %d", s->filtermode);
821*437bfbebSnyanmisaka             s->allowcompinter = (s->signbias[0] != s->signbias[1] ||
822*437bfbebSnyanmisaka                                  s->signbias[0] != s->signbias[2]);
823*437bfbebSnyanmisaka             if (s->allowcompinter) {
824*437bfbebSnyanmisaka                 if (s->signbias[0] == s->signbias[1]) {
825*437bfbebSnyanmisaka                     s->fixcompref    = 2;
826*437bfbebSnyanmisaka                     s->varcompref[0] = 0;
827*437bfbebSnyanmisaka                     s->varcompref[1] = 1;
828*437bfbebSnyanmisaka                 } else if (s->signbias[0] == s->signbias[2]) {
829*437bfbebSnyanmisaka                     s->fixcompref    = 1;
830*437bfbebSnyanmisaka                     s->varcompref[0] = 0;
831*437bfbebSnyanmisaka                     s->varcompref[1] = 2;
832*437bfbebSnyanmisaka                 } else {
833*437bfbebSnyanmisaka                     s->fixcompref    = 0;
834*437bfbebSnyanmisaka                     s->varcompref[0] = 1;
835*437bfbebSnyanmisaka                     s->varcompref[1] = 2;
836*437bfbebSnyanmisaka                 }
837*437bfbebSnyanmisaka             }
838*437bfbebSnyanmisaka 
839*437bfbebSnyanmisaka             for (i = 0; i < 3; i++) {
840*437bfbebSnyanmisaka                 RK_U32 refw = mpp_frame_get_width(s->refs[s->refidx[i]].f);
841*437bfbebSnyanmisaka                 RK_U32 refh = mpp_frame_get_height(s->refs[s->refidx[i]].f);
842*437bfbebSnyanmisaka                 RK_S32 reffmt = mpp_frame_get_fmt(s->refs[s->refidx[i]].f) & MPP_FRAME_FMT_MASK;
843*437bfbebSnyanmisaka 
844*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_REF, "ref get width frame slot %p", s->refs[s->refidx[i]].f);
845*437bfbebSnyanmisaka                 if (reffmt != fmt) {
846*437bfbebSnyanmisaka                     /* mpp_err("Ref pixfmt (%s) did not match current frame (%s)",
847*437bfbebSnyanmisaka                            av_get_pix_fmt_name(ref->format),
848*437bfbebSnyanmisaka                            av_get_pix_fmt_name(fmt)); */
849*437bfbebSnyanmisaka                     //return -1;//AVERROR_INVALIDDATA;
850*437bfbebSnyanmisaka                 } else if (refw == w && refh == h) {
851*437bfbebSnyanmisaka                     s->mvscale[i][0] = (refw << 14) / w;
852*437bfbebSnyanmisaka                     s->mvscale[i][1] = (refh << 14) / h;
853*437bfbebSnyanmisaka                 } else {
854*437bfbebSnyanmisaka                     if (w * 2 < refw || h * 2 < refh || w > 16 * refw || h > 16 * refh) {
855*437bfbebSnyanmisaka                         mpp_err("Invalid ref frame dimensions %dx%d for frame size %dx%d\n",
856*437bfbebSnyanmisaka                                 refw, refh, w, h);
857*437bfbebSnyanmisaka                         return MPP_ERR_VALUE;
858*437bfbebSnyanmisaka                     }
859*437bfbebSnyanmisaka                     s->mvscale[i][0] = (refw << 14) / w;
860*437bfbebSnyanmisaka                     s->mvscale[i][1] = (refh << 14) / h;
861*437bfbebSnyanmisaka                     s->mvstep[i][0] = 16 * s->mvscale[i][0] >> 14;
862*437bfbebSnyanmisaka                     s->mvstep[i][1] = 16 * s->mvscale[i][1] >> 14;
863*437bfbebSnyanmisaka                 }
864*437bfbebSnyanmisaka             }
865*437bfbebSnyanmisaka         }
866*437bfbebSnyanmisaka     }
867*437bfbebSnyanmisaka 
868*437bfbebSnyanmisaka     s->refreshctx   = s->errorres ? 0 : mpp_get_bit1(&s->gb);
869*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "refresh_frame_context_flag %d", s->refreshctx);
870*437bfbebSnyanmisaka     s->parallelmode = s->errorres ? 1 : mpp_get_bit1(&s->gb);
871*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "frame_parallel_decoding_mode %d", s->parallelmode);
872*437bfbebSnyanmisaka     s->framectxid   = c = mpp_get_bits(&s->gb, 2);
873*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "frame_context_idx %d", s->framectxid);
874*437bfbebSnyanmisaka 
875*437bfbebSnyanmisaka     /* loopfilter header data */
876*437bfbebSnyanmisaka     if (s->keyframe || s->errorres || s->intraonly) {
877*437bfbebSnyanmisaka         // reset loopfilter defaults
878*437bfbebSnyanmisaka         s->lf_delta.ref[0] = 1;
879*437bfbebSnyanmisaka         s->lf_delta.ref[1] = 0;
880*437bfbebSnyanmisaka         s->lf_delta.ref[2] = -1;
881*437bfbebSnyanmisaka         s->lf_delta.ref[3] = -1;
882*437bfbebSnyanmisaka         s->lf_delta.mode[0] = 0;
883*437bfbebSnyanmisaka         s->lf_delta.mode[1] = 0;
884*437bfbebSnyanmisaka     }
885*437bfbebSnyanmisaka     s->filter.level = mpp_get_bits(&s->gb, 6);
886*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "filter_level %d", s->filter.level);
887*437bfbebSnyanmisaka     sharp = mpp_get_bits(&s->gb, 3);
888*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "sharpness_level %d", sharp);
889*437bfbebSnyanmisaka     // if sharpness changed, reinit lim/mblim LUTs. if it didn't change, keep
890*437bfbebSnyanmisaka     // the old cache values since they are still valid
891*437bfbebSnyanmisaka     if (s->filter.sharpness != sharp)
892*437bfbebSnyanmisaka         memset(s->filter.lim_lut, 0, sizeof(s->filter.lim_lut));
893*437bfbebSnyanmisaka     s->filter.sharpness = sharp;
894*437bfbebSnyanmisaka 
895*437bfbebSnyanmisaka     if ((s->lf_delta.enabled = mpp_get_bit1(&s->gb))) {
896*437bfbebSnyanmisaka         vp9d_dbg(VP9D_DBG_HEADER, "mode_ref_delta_enabled 1");
897*437bfbebSnyanmisaka         if ((s->lf_delta.update = mpp_get_bit1(&s->gb))) {
898*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "mode_ref_delta_update 1");
899*437bfbebSnyanmisaka             for (i = 0; i < 4; i++) {
900*437bfbebSnyanmisaka                 if (mpp_get_bit1(&s->gb))
901*437bfbebSnyanmisaka                     s->lf_delta.ref[i] = get_sbits_inv(&s->gb, 6);
902*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "ref_deltas %d", s->lf_delta.ref[i]);
903*437bfbebSnyanmisaka             }
904*437bfbebSnyanmisaka             for (i = 0; i < 2; i++) {
905*437bfbebSnyanmisaka                 if (mpp_get_bit1(&s->gb))
906*437bfbebSnyanmisaka                     s->lf_delta.mode[i] = get_sbits_inv(&s->gb, 6);
907*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "mode_deltas %d", s->lf_delta.mode[i]);
908*437bfbebSnyanmisaka             }
909*437bfbebSnyanmisaka         }
910*437bfbebSnyanmisaka     }
911*437bfbebSnyanmisaka 
912*437bfbebSnyanmisaka     /* quantization header data */
913*437bfbebSnyanmisaka     s->yac_qi      = mpp_get_bits(&s->gb, 8);
914*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "base_qindex %d", s->yac_qi);
915*437bfbebSnyanmisaka     s->ydc_qdelta  = mpp_get_bit1(&s->gb) ? get_sbits_inv(&s->gb, 4) : 0;
916*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "ydc_qdelta %d", s->ydc_qdelta);
917*437bfbebSnyanmisaka     s->uvdc_qdelta = mpp_get_bit1(&s->gb) ? get_sbits_inv(&s->gb, 4) : 0;
918*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "uvdc_qdelta %d", s->uvdc_qdelta);
919*437bfbebSnyanmisaka     s->uvac_qdelta = mpp_get_bit1(&s->gb) ? get_sbits_inv(&s->gb, 4) : 0;
920*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "uvac_qdelta %d", s->uvac_qdelta);
921*437bfbebSnyanmisaka     s->lossless    = s->yac_qi == 0 && s->ydc_qdelta == 0 &&
922*437bfbebSnyanmisaka                      s->uvdc_qdelta == 0 && s->uvac_qdelta == 0;
923*437bfbebSnyanmisaka 
924*437bfbebSnyanmisaka     /* segmentation header info */
925*437bfbebSnyanmisaka     s->segmentation.update_map = 0;
926*437bfbebSnyanmisaka     s->segmentation.ignore_refmap = 0;
927*437bfbebSnyanmisaka     if ((s->segmentation.enabled = mpp_get_bit1(&s->gb))) {
928*437bfbebSnyanmisaka         vp9d_dbg(VP9D_DBG_HEADER, "segmentation_enabled 1");
929*437bfbebSnyanmisaka         if ((s->segmentation.update_map = mpp_get_bit1(&s->gb))) {
930*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "update_map 1");
931*437bfbebSnyanmisaka             for (i = 0; i < 7; i++) {
932*437bfbebSnyanmisaka                 s->prob.seg[i] = mpp_get_bit1(&s->gb) ?
933*437bfbebSnyanmisaka                                  mpp_get_bits(&s->gb, 8) : 255;
934*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "tree_probs %d value 0x%x", i, s->prob.seg[i]);
935*437bfbebSnyanmisaka             }
936*437bfbebSnyanmisaka             s->segmentation.temporal = mpp_get_bit1(&s->gb);
937*437bfbebSnyanmisaka             if (s->segmentation.temporal) {
938*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "tempora_update 1");
939*437bfbebSnyanmisaka                 for (i = 0; i < 3; i++) {
940*437bfbebSnyanmisaka                     s->prob.segpred[i] = mpp_get_bit1(&s->gb) ?
941*437bfbebSnyanmisaka                                          mpp_get_bits(&s->gb, 8) : 255;
942*437bfbebSnyanmisaka                     vp9d_dbg(VP9D_DBG_HEADER, "pred_probs %d", i, s->prob.segpred[i]);
943*437bfbebSnyanmisaka                 }
944*437bfbebSnyanmisaka             } else {
945*437bfbebSnyanmisaka                 for (i = 0; i < 3; i++)
946*437bfbebSnyanmisaka                     s->prob.segpred[i] = 0xff;
947*437bfbebSnyanmisaka             }
948*437bfbebSnyanmisaka         }
949*437bfbebSnyanmisaka         if ((!s->segmentation.update_map || s->segmentation.temporal) &&
950*437bfbebSnyanmisaka             (w !=  mpp_frame_get_width(s->frames[CUR_FRAME].f) ||
951*437bfbebSnyanmisaka              h !=  mpp_frame_get_height(s->frames[CUR_FRAME].f))) {
952*437bfbebSnyanmisaka             /* av_log(ctx, AV_LOG_WARNING,
953*437bfbebSnyanmisaka                    "Reference segmap (temp=%d,update=%d) enabled on size-change!\n",
954*437bfbebSnyanmisaka                    s->segmentation.temporal, s->segmentation.update_map);
955*437bfbebSnyanmisaka                 s->segmentation.ignore_refmap = 1; */
956*437bfbebSnyanmisaka             //return -1;//AVERROR_INVALIDDATA;
957*437bfbebSnyanmisaka         }
958*437bfbebSnyanmisaka 
959*437bfbebSnyanmisaka         if (mpp_get_bit1(&s->gb)) {
960*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "update_data 1");
961*437bfbebSnyanmisaka             s->segmentation.absolute_vals = mpp_get_bit1(&s->gb);
962*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "abs_delta %d", s->segmentation.absolute_vals);
963*437bfbebSnyanmisaka             for (i = 0; i < 8; i++) {
964*437bfbebSnyanmisaka                 if ((s->segmentation.feat[i].q_enabled = mpp_get_bit1(&s->gb)))
965*437bfbebSnyanmisaka                     s->segmentation.feat[i].q_val = get_sbits_inv(&s->gb, 8);
966*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "frame_qp_delta %d", s->segmentation.feat[i].q_val);
967*437bfbebSnyanmisaka                 if ((s->segmentation.feat[i].lf_enabled = mpp_get_bit1(&s->gb)))
968*437bfbebSnyanmisaka                     s->segmentation.feat[i].lf_val = get_sbits_inv(&s->gb, 6);
969*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "frame_loopfilter_value %d", i, s->segmentation.feat[i].lf_val);
970*437bfbebSnyanmisaka                 if ((s->segmentation.feat[i].ref_enabled = mpp_get_bit1(&s->gb)))
971*437bfbebSnyanmisaka                     s->segmentation.feat[i].ref_val = mpp_get_bits(&s->gb, 2);
972*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "frame_reference_info %d", i, s->segmentation.feat[i].ref_val);
973*437bfbebSnyanmisaka                 s->segmentation.feat[i].skip_enabled = mpp_get_bit1(&s->gb);
974*437bfbebSnyanmisaka                 vp9d_dbg(VP9D_DBG_HEADER, "frame_skip %d", i, s->segmentation.feat[i].skip_enabled);
975*437bfbebSnyanmisaka             }
976*437bfbebSnyanmisaka         }
977*437bfbebSnyanmisaka     } else {
978*437bfbebSnyanmisaka         vp9d_dbg(VP9D_DBG_HEADER, "segmentation_enabled 0");
979*437bfbebSnyanmisaka         s->segmentation.feat[0].q_enabled    = 0;
980*437bfbebSnyanmisaka         s->segmentation.feat[0].lf_enabled   = 0;
981*437bfbebSnyanmisaka         s->segmentation.feat[0].skip_enabled = 0;
982*437bfbebSnyanmisaka         s->segmentation.feat[0].ref_enabled  = 0;
983*437bfbebSnyanmisaka     }
984*437bfbebSnyanmisaka 
985*437bfbebSnyanmisaka     // set qmul[] based on Y/UV, AC/DC and segmentation Q idx deltas
986*437bfbebSnyanmisaka     for (i = 0; i < (s->segmentation.enabled ? 8 : 1); i++) {
987*437bfbebSnyanmisaka         RK_S32 qyac, qydc, quvac, quvdc, lflvl, sh;
988*437bfbebSnyanmisaka 
989*437bfbebSnyanmisaka         if (s->segmentation.feat[i].q_enabled) {
990*437bfbebSnyanmisaka             if (s->segmentation.absolute_vals)
991*437bfbebSnyanmisaka                 qyac = s->segmentation.feat[i].q_val;
992*437bfbebSnyanmisaka             else
993*437bfbebSnyanmisaka                 qyac = s->yac_qi + s->segmentation.feat[i].q_val;
994*437bfbebSnyanmisaka         } else {
995*437bfbebSnyanmisaka             qyac  = s->yac_qi;
996*437bfbebSnyanmisaka         }
997*437bfbebSnyanmisaka         qydc  = av_clip_uintp2(qyac + s->ydc_qdelta, 8);
998*437bfbebSnyanmisaka         quvdc = av_clip_uintp2(qyac + s->uvdc_qdelta, 8);
999*437bfbebSnyanmisaka         quvac = av_clip_uintp2(qyac + s->uvac_qdelta, 8);
1000*437bfbebSnyanmisaka         qyac  = av_clip_uintp2(qyac, 8);
1001*437bfbebSnyanmisaka 
1002*437bfbebSnyanmisaka         s->segmentation.feat[i].qmul[0][0] = vp9_dc_qlookup[s->bpp_index][qydc];
1003*437bfbebSnyanmisaka         s->segmentation.feat[i].qmul[0][1] = vp9_ac_qlookup[s->bpp_index][qyac];
1004*437bfbebSnyanmisaka         s->segmentation.feat[i].qmul[1][0] = vp9_dc_qlookup[s->bpp_index][quvdc];
1005*437bfbebSnyanmisaka         s->segmentation.feat[i].qmul[1][1] = vp9_ac_qlookup[s->bpp_index][quvac];
1006*437bfbebSnyanmisaka 
1007*437bfbebSnyanmisaka         sh = s->filter.level >= 32;
1008*437bfbebSnyanmisaka         if (s->segmentation.feat[i].lf_enabled) {
1009*437bfbebSnyanmisaka             if (s->segmentation.absolute_vals)
1010*437bfbebSnyanmisaka                 lflvl = av_clip_uintp2(s->segmentation.feat[i].lf_val, 6);
1011*437bfbebSnyanmisaka             else
1012*437bfbebSnyanmisaka                 lflvl = av_clip_uintp2(s->filter.level + s->segmentation.feat[i].lf_val, 6);
1013*437bfbebSnyanmisaka         } else {
1014*437bfbebSnyanmisaka             lflvl  = s->filter.level;
1015*437bfbebSnyanmisaka         }
1016*437bfbebSnyanmisaka         if (s->lf_delta.enabled) {
1017*437bfbebSnyanmisaka             s->segmentation.feat[i].lflvl[0][0] =
1018*437bfbebSnyanmisaka                 s->segmentation.feat[i].lflvl[0][1] =
1019*437bfbebSnyanmisaka                     av_clip_uintp2(lflvl + (s->lf_delta.ref[0] << sh), 6);
1020*437bfbebSnyanmisaka             for (j = 1; j < 4; j++) {
1021*437bfbebSnyanmisaka                 s->segmentation.feat[i].lflvl[j][0] =
1022*437bfbebSnyanmisaka                     av_clip_uintp2(lflvl + ((s->lf_delta.ref[j] +
1023*437bfbebSnyanmisaka                                              s->lf_delta.mode[0]) * (1 << sh)), 6);
1024*437bfbebSnyanmisaka                 s->segmentation.feat[i].lflvl[j][1] =
1025*437bfbebSnyanmisaka                     av_clip_uintp2(lflvl + ((s->lf_delta.ref[j] +
1026*437bfbebSnyanmisaka                                              s->lf_delta.mode[1]) * (1 << sh)), 6);
1027*437bfbebSnyanmisaka             }
1028*437bfbebSnyanmisaka         } else {
1029*437bfbebSnyanmisaka             memset(s->segmentation.feat[i].lflvl, lflvl,
1030*437bfbebSnyanmisaka                    sizeof(s->segmentation.feat[i].lflvl));
1031*437bfbebSnyanmisaka         }
1032*437bfbebSnyanmisaka     }
1033*437bfbebSnyanmisaka 
1034*437bfbebSnyanmisaka     /* tiling info */
1035*437bfbebSnyanmisaka     if ((res = update_size(ctx, w, h, fmt)) < 0) {
1036*437bfbebSnyanmisaka         mpp_err("Failed to initialize decoder for %dx%d @ %d\n", w, h, fmt);
1037*437bfbebSnyanmisaka         return res;
1038*437bfbebSnyanmisaka     }
1039*437bfbebSnyanmisaka 
1040*437bfbebSnyanmisaka     for (s->tiling.log2_tile_cols = 0;
1041*437bfbebSnyanmisaka          (s->sb_cols >> s->tiling.log2_tile_cols) > 64;
1042*437bfbebSnyanmisaka          s->tiling.log2_tile_cols++) ;
1043*437bfbebSnyanmisaka     for (max = 0; (s->sb_cols >> max) >= 4; max++) ;
1044*437bfbebSnyanmisaka     max = MPP_MAX(0, max - 1);
1045*437bfbebSnyanmisaka     while ((RK_U32)max > s->tiling.log2_tile_cols) {
1046*437bfbebSnyanmisaka         if (mpp_get_bit1(&s->gb)) {
1047*437bfbebSnyanmisaka             s->tiling.log2_tile_cols++;
1048*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "log2_tile_col_end_flag 1");
1049*437bfbebSnyanmisaka         } else {
1050*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_HEADER, "log2_tile_col_end_flag 0");
1051*437bfbebSnyanmisaka             break;
1052*437bfbebSnyanmisaka         }
1053*437bfbebSnyanmisaka     }
1054*437bfbebSnyanmisaka     s->tiling.log2_tile_rows = decode012(&s->gb);
1055*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "log2_tile_rows %d", s->tiling.log2_tile_rows);
1056*437bfbebSnyanmisaka     s->tiling.tile_rows = 1 << s->tiling.log2_tile_rows;
1057*437bfbebSnyanmisaka     if (s->tiling.tile_cols != (1U << s->tiling.log2_tile_cols)) {
1058*437bfbebSnyanmisaka         s->tiling.tile_cols = 1 << s->tiling.log2_tile_cols;
1059*437bfbebSnyanmisaka         {
1060*437bfbebSnyanmisaka             RK_U32 min_size = sizeof(VpxRangeCoder) * s->tiling.tile_cols;
1061*437bfbebSnyanmisaka             if (min_size > s->c_b_size) {
1062*437bfbebSnyanmisaka                 s->c_b = (VpxRangeCoder *)mpp_malloc(RK_U8, min_size);
1063*437bfbebSnyanmisaka                 s->c_b_size = min_size;
1064*437bfbebSnyanmisaka             }
1065*437bfbebSnyanmisaka         }
1066*437bfbebSnyanmisaka         if (!s->c_b) {
1067*437bfbebSnyanmisaka             mpp_err("Ran out of memory during range coder init\n");
1068*437bfbebSnyanmisaka             return MPP_ERR_NOMEM;
1069*437bfbebSnyanmisaka         }
1070*437bfbebSnyanmisaka     }
1071*437bfbebSnyanmisaka 
1072*437bfbebSnyanmisaka     if (s->keyframe || s->errorres ||
1073*437bfbebSnyanmisaka         (s->intraonly && s->resetctx == 3)) {
1074*437bfbebSnyanmisaka         s->prob_ctx[0].p = s->prob_ctx[1].p = s->prob_ctx[2].p =
1075*437bfbebSnyanmisaka                                                   s->prob_ctx[3].p = vp9_default_probs;
1076*437bfbebSnyanmisaka         memcpy(s->prob_ctx[0].coef, vp9_default_coef_probs,
1077*437bfbebSnyanmisaka                sizeof(vp9_default_coef_probs));
1078*437bfbebSnyanmisaka         memcpy(s->prob_ctx[1].coef, vp9_default_coef_probs,
1079*437bfbebSnyanmisaka                sizeof(vp9_default_coef_probs));
1080*437bfbebSnyanmisaka         memcpy(s->prob_ctx[2].coef, vp9_default_coef_probs,
1081*437bfbebSnyanmisaka                sizeof(vp9_default_coef_probs));
1082*437bfbebSnyanmisaka         memcpy(s->prob_ctx[3].coef, vp9_default_coef_probs,
1083*437bfbebSnyanmisaka                sizeof(vp9_default_coef_probs));
1084*437bfbebSnyanmisaka     } else if (s->intraonly && s->resetctx == 2) {
1085*437bfbebSnyanmisaka         s->prob_ctx[c].p = vp9_default_probs;
1086*437bfbebSnyanmisaka         memcpy(s->prob_ctx[c].coef, vp9_default_coef_probs,
1087*437bfbebSnyanmisaka                sizeof(vp9_default_coef_probs));
1088*437bfbebSnyanmisaka     }
1089*437bfbebSnyanmisaka     if (s->keyframe || s->errorres || s->intraonly)
1090*437bfbebSnyanmisaka         s->framectxid = c = 0;
1091*437bfbebSnyanmisaka 
1092*437bfbebSnyanmisaka     // next 16 bits is size of the rest of the header (arith-coded)
1093*437bfbebSnyanmisaka     size2 = mpp_get_bits(&s->gb, 16);
1094*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "first_partition_size %d", size2);
1095*437bfbebSnyanmisaka     s->first_partition_size = size2;
1096*437bfbebSnyanmisaka     data2 = mpp_align_get_bits(&s->gb);
1097*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "offset %d", data2 - data);
1098*437bfbebSnyanmisaka     s->uncompress_head_size_in_byte = data2 - data;
1099*437bfbebSnyanmisaka     if (size2 > size - (data2 - data)) {
1100*437bfbebSnyanmisaka         mpp_err("Invalid compressed header size\n");
1101*437bfbebSnyanmisaka         return MPP_ERR_STREAM;
1102*437bfbebSnyanmisaka     }
1103*437bfbebSnyanmisaka     vpx_init_range_decoder(&s->c, data2, size2);
1104*437bfbebSnyanmisaka     if (vpx_rac_get_prob_branchy(&s->c, 128)) { // marker bit
1105*437bfbebSnyanmisaka         mpp_err("Marker bit was set\n");
1106*437bfbebSnyanmisaka         return MPP_ERR_STREAM;
1107*437bfbebSnyanmisaka     }
1108*437bfbebSnyanmisaka 
1109*437bfbebSnyanmisaka     if (s->keyframe || s->intraonly) {
1110*437bfbebSnyanmisaka         memset(s->counts.coef, 0, sizeof(s->counts.coef));
1111*437bfbebSnyanmisaka         memset(s->counts.eob,  0, sizeof(s->counts.eob));
1112*437bfbebSnyanmisaka     } else {
1113*437bfbebSnyanmisaka         memset(&s->counts, 0, sizeof(s->counts));
1114*437bfbebSnyanmisaka     }
1115*437bfbebSnyanmisaka     // FIXME is it faster to not copy here, but do it down in the fw updates
1116*437bfbebSnyanmisaka     // as explicit copies if the fw update is missing (and skip the copy upon
1117*437bfbebSnyanmisaka     // fw update)?
1118*437bfbebSnyanmisaka     s->prob.p = s->prob_ctx[c].p;
1119*437bfbebSnyanmisaka     memset(&s->prob_flag_delta, 0, sizeof(s->prob_flag_delta));
1120*437bfbebSnyanmisaka     // txfm updates
1121*437bfbebSnyanmisaka     if (s->lossless) {
1122*437bfbebSnyanmisaka         s->txfmmode = TX_4X4;
1123*437bfbebSnyanmisaka     } else {
1124*437bfbebSnyanmisaka         s->txfmmode = vpx_rac_get_uint(&s->c, 2);
1125*437bfbebSnyanmisaka         if (s->txfmmode == 3)
1126*437bfbebSnyanmisaka             s->txfmmode += vpx_rac_get(&s->c);
1127*437bfbebSnyanmisaka 
1128*437bfbebSnyanmisaka         if (s->txfmmode == TX_SWITCHABLE) {
1129*437bfbebSnyanmisaka             for (i = 0; i < 2; i++) {
1130*437bfbebSnyanmisaka 
1131*437bfbebSnyanmisaka                 if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1132*437bfbebSnyanmisaka                     s->prob_flag_delta.p_flag.tx8p[i] = 1;
1133*437bfbebSnyanmisaka                     s->prob.p.tx8p[i] = update_prob(&s->c, s->prob.p.tx8p[i],
1134*437bfbebSnyanmisaka                                                     &s->prob_flag_delta.p_delta.tx8p[i]);
1135*437bfbebSnyanmisaka                 }
1136*437bfbebSnyanmisaka 
1137*437bfbebSnyanmisaka             }
1138*437bfbebSnyanmisaka             for (i = 0; i < 2; i++)
1139*437bfbebSnyanmisaka                 for (j = 0; j < 2; j++) {
1140*437bfbebSnyanmisaka 
1141*437bfbebSnyanmisaka                     if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1142*437bfbebSnyanmisaka                         s->prob_flag_delta.p_flag.tx16p[i][j] = 1;
1143*437bfbebSnyanmisaka                         s->prob.p.tx16p[i][j] =
1144*437bfbebSnyanmisaka                             update_prob(&s->c, s->prob.p.tx16p[i][j],
1145*437bfbebSnyanmisaka                                         &s->prob_flag_delta.p_delta.tx16p[i][j]);
1146*437bfbebSnyanmisaka                     }
1147*437bfbebSnyanmisaka                 }
1148*437bfbebSnyanmisaka             for (i = 0; i < 2; i++)
1149*437bfbebSnyanmisaka                 for (j = 0; j < 3; j++) {
1150*437bfbebSnyanmisaka 
1151*437bfbebSnyanmisaka                     if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1152*437bfbebSnyanmisaka                         s->prob_flag_delta.p_flag.tx32p[i][j] = 1;
1153*437bfbebSnyanmisaka                         s->prob.p.tx32p[i][j] =
1154*437bfbebSnyanmisaka                             update_prob(&s->c, s->prob.p.tx32p[i][j],
1155*437bfbebSnyanmisaka                                         &s->prob_flag_delta.p_delta.tx32p[i][j]);
1156*437bfbebSnyanmisaka                     }
1157*437bfbebSnyanmisaka                 }
1158*437bfbebSnyanmisaka         }
1159*437bfbebSnyanmisaka     }
1160*437bfbebSnyanmisaka 
1161*437bfbebSnyanmisaka     // coef updates
1162*437bfbebSnyanmisaka     for (i = 0; i < 4; i++) {
1163*437bfbebSnyanmisaka         RK_U8 (*ref)[2][6][6][3] = s->prob_ctx[c].coef[i];
1164*437bfbebSnyanmisaka         if (vpx_rac_get(&s->c)) {
1165*437bfbebSnyanmisaka             for (j = 0; j < 2; j++)
1166*437bfbebSnyanmisaka                 for (k = 0; k < 2; k++)
1167*437bfbebSnyanmisaka                     for (l = 0; l < 6; l++)
1168*437bfbebSnyanmisaka                         for (m = 0; m < 6; m++) {
1169*437bfbebSnyanmisaka                             RK_U8 *p = s->prob.coef[i][j][k][l][m];
1170*437bfbebSnyanmisaka                             RK_U8 *p_flag = s->prob_flag_delta.coef_flag[i][j][k][l][m];
1171*437bfbebSnyanmisaka                             RK_U8 *p_delta = s->prob_flag_delta.coef_delta[i][j][k][l][m];
1172*437bfbebSnyanmisaka                             RK_U8 *r = ref[j][k][l][m];
1173*437bfbebSnyanmisaka                             if (l == 0 && m >= 3) // dc only has 3 pt
1174*437bfbebSnyanmisaka                                 break;
1175*437bfbebSnyanmisaka                             for (n = 0; n < 3; n++) {
1176*437bfbebSnyanmisaka                                 if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1177*437bfbebSnyanmisaka                                     p_flag[n] = 1;
1178*437bfbebSnyanmisaka                                     p[n] = update_prob(&s->c, r[n], &p_delta[n]);
1179*437bfbebSnyanmisaka                                 } else {
1180*437bfbebSnyanmisaka                                     p_flag[n] = 0;
1181*437bfbebSnyanmisaka                                     p[n] = r[n];
1182*437bfbebSnyanmisaka                                 }
1183*437bfbebSnyanmisaka                             }
1184*437bfbebSnyanmisaka                         }
1185*437bfbebSnyanmisaka         } else {
1186*437bfbebSnyanmisaka             for (j = 0; j < 2; j++)
1187*437bfbebSnyanmisaka                 for (k = 0; k < 2; k++)
1188*437bfbebSnyanmisaka                     for (l = 0; l < 6; l++)
1189*437bfbebSnyanmisaka                         for (m = 0; m < 6; m++) {
1190*437bfbebSnyanmisaka                             RK_U8 *p = s->prob.coef[i][j][k][l][m];
1191*437bfbebSnyanmisaka                             RK_U8 *r = ref[j][k][l][m];
1192*437bfbebSnyanmisaka                             if (m >= 3 && l == 0) // dc only has 3 pt
1193*437bfbebSnyanmisaka                                 break;
1194*437bfbebSnyanmisaka                             memcpy(p, r, 3);
1195*437bfbebSnyanmisaka                         }
1196*437bfbebSnyanmisaka         }
1197*437bfbebSnyanmisaka         if (s->txfmmode == (RK_U32)i)
1198*437bfbebSnyanmisaka             break;
1199*437bfbebSnyanmisaka     }
1200*437bfbebSnyanmisaka 
1201*437bfbebSnyanmisaka     // mode updates
1202*437bfbebSnyanmisaka     for (i = 0; i < 3; i++) {
1203*437bfbebSnyanmisaka 
1204*437bfbebSnyanmisaka         if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1205*437bfbebSnyanmisaka             s->prob_flag_delta.p_flag.skip[i] = 1;
1206*437bfbebSnyanmisaka             s->prob.p.skip[i] = update_prob(&s->c, s->prob.p.skip[i],
1207*437bfbebSnyanmisaka                                             &s->prob_flag_delta.p_delta.skip[i]);
1208*437bfbebSnyanmisaka         }
1209*437bfbebSnyanmisaka     }
1210*437bfbebSnyanmisaka 
1211*437bfbebSnyanmisaka     if (!s->keyframe && !s->intraonly) {
1212*437bfbebSnyanmisaka         for (i = 0; i < 7; i++)
1213*437bfbebSnyanmisaka             for (j = 0; j < 3; j++) {
1214*437bfbebSnyanmisaka                 if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1215*437bfbebSnyanmisaka                     s->prob_flag_delta.p_flag.mv_mode[i][j] = 1;
1216*437bfbebSnyanmisaka                     s->prob.p.mv_mode[i][j] =
1217*437bfbebSnyanmisaka                         update_prob(&s->c, s->prob.p.mv_mode[i][j],
1218*437bfbebSnyanmisaka                                     &s->prob_flag_delta.p_delta.mv_mode[i][j]);
1219*437bfbebSnyanmisaka                 }
1220*437bfbebSnyanmisaka             }
1221*437bfbebSnyanmisaka 
1222*437bfbebSnyanmisaka         if (s->filtermode == FILTER_SWITCHABLE)
1223*437bfbebSnyanmisaka             for (i = 0; i < 4; i++)
1224*437bfbebSnyanmisaka                 for (j = 0; j < 2; j++) {
1225*437bfbebSnyanmisaka                     if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1226*437bfbebSnyanmisaka                         s->prob_flag_delta.p_flag.filter[i][j] = 1;
1227*437bfbebSnyanmisaka                         s->prob.p.filter[i][j] =
1228*437bfbebSnyanmisaka                             update_prob(&s->c, s->prob.p.filter[i][j],
1229*437bfbebSnyanmisaka                                         &s->prob_flag_delta.p_delta.filter[i][j]);
1230*437bfbebSnyanmisaka                     }
1231*437bfbebSnyanmisaka                 }
1232*437bfbebSnyanmisaka 
1233*437bfbebSnyanmisaka         for (i = 0; i < 4; i++) {
1234*437bfbebSnyanmisaka 
1235*437bfbebSnyanmisaka             if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1236*437bfbebSnyanmisaka                 s->prob_flag_delta.p_flag.intra[i] = 1;
1237*437bfbebSnyanmisaka                 s->prob.p.intra[i] = update_prob(&s->c, s->prob.p.intra[i],
1238*437bfbebSnyanmisaka                                                  &s->prob_flag_delta.p_delta.intra[i]);
1239*437bfbebSnyanmisaka             }
1240*437bfbebSnyanmisaka 
1241*437bfbebSnyanmisaka         }
1242*437bfbebSnyanmisaka 
1243*437bfbebSnyanmisaka         if (s->allowcompinter) {
1244*437bfbebSnyanmisaka             s->comppredmode = vpx_rac_get(&s->c);
1245*437bfbebSnyanmisaka             if (s->comppredmode)
1246*437bfbebSnyanmisaka                 s->comppredmode += vpx_rac_get(&s->c);
1247*437bfbebSnyanmisaka             if (s->comppredmode == PRED_SWITCHABLE)
1248*437bfbebSnyanmisaka                 for (i = 0; i < 5; i++) {
1249*437bfbebSnyanmisaka                     if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1250*437bfbebSnyanmisaka                         s->prob_flag_delta.p_flag.comp[i] = 1;
1251*437bfbebSnyanmisaka                         s->prob.p.comp[i] =
1252*437bfbebSnyanmisaka                             update_prob(&s->c, s->prob.p.comp[i],
1253*437bfbebSnyanmisaka                                         &s->prob_flag_delta.p_delta.comp[i]);
1254*437bfbebSnyanmisaka                     }
1255*437bfbebSnyanmisaka                 }
1256*437bfbebSnyanmisaka         } else {
1257*437bfbebSnyanmisaka             s->comppredmode = PRED_SINGLEREF;
1258*437bfbebSnyanmisaka         }
1259*437bfbebSnyanmisaka 
1260*437bfbebSnyanmisaka         if (s->comppredmode != PRED_COMPREF) {
1261*437bfbebSnyanmisaka             for (i = 0; i < 5; i++) {
1262*437bfbebSnyanmisaka                 if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1263*437bfbebSnyanmisaka                     s->prob_flag_delta.p_flag.single_ref[i][0] = 1;
1264*437bfbebSnyanmisaka                     s->prob.p.single_ref[i][0] =
1265*437bfbebSnyanmisaka                         update_prob(&s->c, s->prob.p.single_ref[i][0],
1266*437bfbebSnyanmisaka                                     &s->prob_flag_delta.p_delta.single_ref[i][0]);
1267*437bfbebSnyanmisaka                 }
1268*437bfbebSnyanmisaka                 if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1269*437bfbebSnyanmisaka                     s->prob_flag_delta.p_flag.single_ref[i][1] = 1;
1270*437bfbebSnyanmisaka                     s->prob.p.single_ref[i][1] =
1271*437bfbebSnyanmisaka                         update_prob(&s->c, s->prob.p.single_ref[i][1],
1272*437bfbebSnyanmisaka                                     &s->prob_flag_delta.p_delta.single_ref[i][1]);
1273*437bfbebSnyanmisaka                 }
1274*437bfbebSnyanmisaka             }
1275*437bfbebSnyanmisaka         }
1276*437bfbebSnyanmisaka 
1277*437bfbebSnyanmisaka         if (s->comppredmode != PRED_SINGLEREF) {
1278*437bfbebSnyanmisaka             for (i = 0; i < 5; i++) {
1279*437bfbebSnyanmisaka                 if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1280*437bfbebSnyanmisaka                     s->prob_flag_delta.p_flag.comp_ref[i] = 1;
1281*437bfbebSnyanmisaka                     s->prob.p.comp_ref[i] =
1282*437bfbebSnyanmisaka                         update_prob(&s->c, s->prob.p.comp_ref[i],
1283*437bfbebSnyanmisaka                                     &s->prob_flag_delta.p_delta.comp_ref[i]);
1284*437bfbebSnyanmisaka                 }
1285*437bfbebSnyanmisaka             }
1286*437bfbebSnyanmisaka         }
1287*437bfbebSnyanmisaka 
1288*437bfbebSnyanmisaka         for (i = 0; i < 4; i++)
1289*437bfbebSnyanmisaka             for (j = 0; j < 9; j++) {
1290*437bfbebSnyanmisaka                 if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1291*437bfbebSnyanmisaka                     s->prob_flag_delta.p_flag.y_mode[i][j] = 1;
1292*437bfbebSnyanmisaka                     s->prob.p.y_mode[i][j] =
1293*437bfbebSnyanmisaka                         update_prob(&s->c, s->prob.p.y_mode[i][j],
1294*437bfbebSnyanmisaka                                     &s->prob_flag_delta.p_delta.y_mode[i][j]);
1295*437bfbebSnyanmisaka                 }
1296*437bfbebSnyanmisaka             }
1297*437bfbebSnyanmisaka 
1298*437bfbebSnyanmisaka         for (i = 0; i < 4; i++)
1299*437bfbebSnyanmisaka             for (j = 0; j < 4; j++)
1300*437bfbebSnyanmisaka                 for (k = 0; k < 3; k++) {
1301*437bfbebSnyanmisaka                     if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1302*437bfbebSnyanmisaka                         s->prob_flag_delta.p_flag.partition[3 - i][j][k] = 1;
1303*437bfbebSnyanmisaka                         s->prob.p.partition[3 - i][j][k] =
1304*437bfbebSnyanmisaka                             update_prob(&s->c, s->prob.p.partition[3 - i][j][k],
1305*437bfbebSnyanmisaka                                         &s->prob_flag_delta.p_delta.partition[3 - i][j][k]);
1306*437bfbebSnyanmisaka                     }
1307*437bfbebSnyanmisaka                 }
1308*437bfbebSnyanmisaka 
1309*437bfbebSnyanmisaka         // mv fields don't use the update_prob subexp model for some reason
1310*437bfbebSnyanmisaka         for (i = 0; i < 3; i++) {
1311*437bfbebSnyanmisaka             if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1312*437bfbebSnyanmisaka                 s->prob_flag_delta.p_flag.mv_joint[i]   = 1;
1313*437bfbebSnyanmisaka                 s->prob_flag_delta.p_delta.mv_joint[i]  =
1314*437bfbebSnyanmisaka                     s->prob.p.mv_joint[i]   = (vpx_rac_get_uint(&s->c, 7) << 1) | 1;
1315*437bfbebSnyanmisaka             }
1316*437bfbebSnyanmisaka         }
1317*437bfbebSnyanmisaka 
1318*437bfbebSnyanmisaka         for (i = 0; i < 2; i++) {
1319*437bfbebSnyanmisaka             if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1320*437bfbebSnyanmisaka                 s->prob_flag_delta.p_flag.mv_comp[i].sign   = 1;
1321*437bfbebSnyanmisaka                 s->prob_flag_delta.p_delta.mv_comp[i].sign  =
1322*437bfbebSnyanmisaka                     s->prob.p.mv_comp[i].sign   = (vpx_rac_get_uint(&s->c, 7) << 1) | 1;
1323*437bfbebSnyanmisaka             }
1324*437bfbebSnyanmisaka 
1325*437bfbebSnyanmisaka             for (j = 0; j < 10; j++)
1326*437bfbebSnyanmisaka                 if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1327*437bfbebSnyanmisaka                     s->prob_flag_delta.p_flag.mv_comp[i].classes[j]  = 1;
1328*437bfbebSnyanmisaka                     s->prob_flag_delta.p_delta.mv_comp[i].classes[j] =
1329*437bfbebSnyanmisaka                         s->prob.p.mv_comp[i].classes[j]  = (vpx_rac_get_uint(&s->c, 7) << 1) | 1;
1330*437bfbebSnyanmisaka                 }
1331*437bfbebSnyanmisaka 
1332*437bfbebSnyanmisaka             if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1333*437bfbebSnyanmisaka                 s->prob_flag_delta.p_flag.mv_comp[i].class0  = 1;
1334*437bfbebSnyanmisaka                 s->prob_flag_delta.p_delta.mv_comp[i].class0 =
1335*437bfbebSnyanmisaka                     s->prob.p.mv_comp[i].class0  = (vpx_rac_get_uint(&s->c, 7) << 1) | 1;
1336*437bfbebSnyanmisaka             }
1337*437bfbebSnyanmisaka 
1338*437bfbebSnyanmisaka             for (j = 0; j < 10; j++)
1339*437bfbebSnyanmisaka                 if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1340*437bfbebSnyanmisaka                     s->prob_flag_delta.p_flag.mv_comp[i].bits[j]  = 1;
1341*437bfbebSnyanmisaka                     s->prob_flag_delta.p_delta.mv_comp[i].bits[j] =
1342*437bfbebSnyanmisaka                         s->prob.p.mv_comp[i].bits[j]  = (vpx_rac_get_uint(&s->c, 7) << 1) | 1;
1343*437bfbebSnyanmisaka                 }
1344*437bfbebSnyanmisaka         }
1345*437bfbebSnyanmisaka 
1346*437bfbebSnyanmisaka         for (i = 0; i < 2; i++) {
1347*437bfbebSnyanmisaka             for (j = 0; j < 2; j++)
1348*437bfbebSnyanmisaka                 for (k = 0; k < 3; k++)
1349*437bfbebSnyanmisaka                     if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1350*437bfbebSnyanmisaka                         s->prob_flag_delta.p_flag.mv_comp[i].class0_fp[j][k]  = 1;
1351*437bfbebSnyanmisaka                         s->prob_flag_delta.p_delta.mv_comp[i].class0_fp[j][k] =
1352*437bfbebSnyanmisaka                             s->prob.p.mv_comp[i].class0_fp[j][k]  = (vpx_rac_get_uint(&s->c, 7) << 1) | 1;
1353*437bfbebSnyanmisaka                     }
1354*437bfbebSnyanmisaka 
1355*437bfbebSnyanmisaka             for (j = 0; j < 3; j++)
1356*437bfbebSnyanmisaka                 if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1357*437bfbebSnyanmisaka                     s->prob_flag_delta.p_flag.mv_comp[i].fp[j]  = 1;
1358*437bfbebSnyanmisaka                     s->prob_flag_delta.p_delta.mv_comp[i].fp[j] =
1359*437bfbebSnyanmisaka                         s->prob.p.mv_comp[i].fp[j]  =
1360*437bfbebSnyanmisaka                             (vpx_rac_get_uint(&s->c, 7) << 1) | 1;
1361*437bfbebSnyanmisaka                 }
1362*437bfbebSnyanmisaka         }
1363*437bfbebSnyanmisaka 
1364*437bfbebSnyanmisaka         if (s->highprecisionmvs) {
1365*437bfbebSnyanmisaka             for (i = 0; i < 2; i++) {
1366*437bfbebSnyanmisaka                 if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1367*437bfbebSnyanmisaka                     s->prob_flag_delta.p_flag.mv_comp[i].class0_hp  = 1;
1368*437bfbebSnyanmisaka                     s->prob_flag_delta.p_delta.mv_comp[i].class0_hp =
1369*437bfbebSnyanmisaka                         s->prob.p.mv_comp[i].class0_hp  = (vpx_rac_get_uint(&s->c, 7) << 1) | 1;
1370*437bfbebSnyanmisaka                 }
1371*437bfbebSnyanmisaka 
1372*437bfbebSnyanmisaka                 if (vpx_rac_get_prob_branchy(&s->c, 252)) {
1373*437bfbebSnyanmisaka                     s->prob_flag_delta.p_flag.mv_comp[i].hp  = 1;
1374*437bfbebSnyanmisaka                     s->prob_flag_delta.p_delta.mv_comp[i].hp =
1375*437bfbebSnyanmisaka                         s->prob.p.mv_comp[i].hp  = (vpx_rac_get_uint(&s->c, 7) << 1) | 1;
1376*437bfbebSnyanmisaka                 }
1377*437bfbebSnyanmisaka             }
1378*437bfbebSnyanmisaka         }
1379*437bfbebSnyanmisaka     }
1380*437bfbebSnyanmisaka 
1381*437bfbebSnyanmisaka     return (RK_S32)((data2 - data) + size2);
1382*437bfbebSnyanmisaka }
1383*437bfbebSnyanmisaka 
adapt_prob(RK_U8 * p,RK_U32 ct0,RK_U32 ct1,RK_S32 max_count,RK_S32 update_factor)1384*437bfbebSnyanmisaka static void adapt_prob(RK_U8 *p, RK_U32 ct0, RK_U32 ct1,
1385*437bfbebSnyanmisaka                        RK_S32 max_count, RK_S32 update_factor)
1386*437bfbebSnyanmisaka {
1387*437bfbebSnyanmisaka     RK_U32 ct = ct0 + ct1, p2, p1;
1388*437bfbebSnyanmisaka 
1389*437bfbebSnyanmisaka     if (!ct)
1390*437bfbebSnyanmisaka         return;
1391*437bfbebSnyanmisaka 
1392*437bfbebSnyanmisaka     p1 = *p;
1393*437bfbebSnyanmisaka     p2 = ((ct0 << 8) + (ct >> 1)) / ct;
1394*437bfbebSnyanmisaka     p2 = mpp_clip(p2, 1, 255);
1395*437bfbebSnyanmisaka     ct = MPP_MIN(ct, (RK_U32)max_count);
1396*437bfbebSnyanmisaka     update_factor = FASTDIV(update_factor * ct, max_count);
1397*437bfbebSnyanmisaka 
1398*437bfbebSnyanmisaka     // (p1 * (256 - update_factor) + p2 * update_factor + 128) >> 8
1399*437bfbebSnyanmisaka     *p = p1 + (((p2 - p1) * update_factor + 128) >> 8);
1400*437bfbebSnyanmisaka }
1401*437bfbebSnyanmisaka 
adapt_probs(VP9Context * s)1402*437bfbebSnyanmisaka static void adapt_probs(VP9Context *s)
1403*437bfbebSnyanmisaka {
1404*437bfbebSnyanmisaka     RK_S32 i, j, k, l, m;
1405*437bfbebSnyanmisaka     prob_context *p = &s->prob_ctx[s->framectxid].p;
1406*437bfbebSnyanmisaka     RK_S32 uf = (s->keyframe || s->intraonly || !s->last_keyframe) ? 112 : 128;
1407*437bfbebSnyanmisaka 
1408*437bfbebSnyanmisaka     // coefficients
1409*437bfbebSnyanmisaka     for (i = 0; i < 4; i++)
1410*437bfbebSnyanmisaka         for (j = 0; j < 2; j++)
1411*437bfbebSnyanmisaka             for (k = 0; k < 2; k++)
1412*437bfbebSnyanmisaka                 for (l = 0; l < 6; l++)
1413*437bfbebSnyanmisaka                     for (m = 0; m < 6; m++) {
1414*437bfbebSnyanmisaka                         RK_U8 *pp = s->prob_ctx[s->framectxid].coef[i][j][k][l][m];
1415*437bfbebSnyanmisaka                         RK_U32 *e = s->counts.eob[i][j][k][l][m];
1416*437bfbebSnyanmisaka                         RK_U32 *c = s->counts.coef[i][j][k][l][m];
1417*437bfbebSnyanmisaka 
1418*437bfbebSnyanmisaka                         if (l == 0 && m >= 3) // dc only has 3 pt
1419*437bfbebSnyanmisaka                             break;
1420*437bfbebSnyanmisaka                         /*  if(i == 0 && j == 0 && k== 1 && l == 0){
1421*437bfbebSnyanmisaka                              mpp_log("e[0] = 0x%x e[1] = 0x%x c[0] = 0x%x c[1] = 0x%x c[2] = 0x%x \n",
1422*437bfbebSnyanmisaka                              e[0],e[1],c[0],c[1],c[2]);
1423*437bfbebSnyanmisaka                              mpp_log("pp[0] = 0x%x pp[1] = 0x%x pp[2] = 0x%x",pp[0],pp[1],pp[2]);
1424*437bfbebSnyanmisaka                           }*/
1425*437bfbebSnyanmisaka                         adapt_prob(&pp[0], e[0], e[1], 24, uf);
1426*437bfbebSnyanmisaka                         adapt_prob(&pp[1], c[0], c[1] + c[2], 24, uf);
1427*437bfbebSnyanmisaka                         adapt_prob(&pp[2], c[1], c[2], 24, uf);
1428*437bfbebSnyanmisaka                         /* if(i == 0 && j == 0 && k== 1 && l == 0){
1429*437bfbebSnyanmisaka                             mpp_log("after pp[0] = 0x%x pp[1] = 0x%x pp[2] = 0x%x",pp[0],pp[1],pp[2]);
1430*437bfbebSnyanmisaka                          }*/
1431*437bfbebSnyanmisaka                     }
1432*437bfbebSnyanmisaka #ifdef dump
1433*437bfbebSnyanmisaka     fwrite(&s->counts, 1, sizeof(s->counts), vp9_p_fp);
1434*437bfbebSnyanmisaka     fflush(vp9_p_fp);
1435*437bfbebSnyanmisaka #endif
1436*437bfbebSnyanmisaka 
1437*437bfbebSnyanmisaka     if (s->keyframe || s->intraonly) {
1438*437bfbebSnyanmisaka         memcpy(p->skip,  s->prob.p.skip,  sizeof(p->skip));
1439*437bfbebSnyanmisaka         memcpy(p->tx32p, s->prob.p.tx32p, sizeof(p->tx32p));
1440*437bfbebSnyanmisaka         memcpy(p->tx16p, s->prob.p.tx16p, sizeof(p->tx16p));
1441*437bfbebSnyanmisaka         memcpy(p->tx8p,  s->prob.p.tx8p,  sizeof(p->tx8p));
1442*437bfbebSnyanmisaka         return;
1443*437bfbebSnyanmisaka     }
1444*437bfbebSnyanmisaka 
1445*437bfbebSnyanmisaka     // skip flag
1446*437bfbebSnyanmisaka     for (i = 0; i < 3; i++)
1447*437bfbebSnyanmisaka         adapt_prob(&p->skip[i], s->counts.skip[i][0], s->counts.skip[i][1], 20, 128);
1448*437bfbebSnyanmisaka 
1449*437bfbebSnyanmisaka     // intra/inter flag
1450*437bfbebSnyanmisaka     for (i = 0; i < 4; i++)
1451*437bfbebSnyanmisaka         adapt_prob(&p->intra[i], s->counts.intra[i][0], s->counts.intra[i][1], 20, 128);
1452*437bfbebSnyanmisaka 
1453*437bfbebSnyanmisaka     // comppred flag
1454*437bfbebSnyanmisaka     if (s->comppredmode == PRED_SWITCHABLE) {
1455*437bfbebSnyanmisaka         for (i = 0; i < 5; i++)
1456*437bfbebSnyanmisaka             adapt_prob(&p->comp[i], s->counts.comp[i][0], s->counts.comp[i][1], 20, 128);
1457*437bfbebSnyanmisaka     }
1458*437bfbebSnyanmisaka 
1459*437bfbebSnyanmisaka     // reference frames
1460*437bfbebSnyanmisaka     if (s->comppredmode != PRED_SINGLEREF) {
1461*437bfbebSnyanmisaka         for (i = 0; i < 5; i++)
1462*437bfbebSnyanmisaka             adapt_prob(&p->comp_ref[i], s->counts.comp_ref[i][0],
1463*437bfbebSnyanmisaka                        s->counts.comp_ref[i][1], 20, 128);
1464*437bfbebSnyanmisaka     }
1465*437bfbebSnyanmisaka 
1466*437bfbebSnyanmisaka     if (s->comppredmode != PRED_COMPREF) {
1467*437bfbebSnyanmisaka         for (i = 0; i < 5; i++) {
1468*437bfbebSnyanmisaka             RK_U8 *pp = p->single_ref[i];
1469*437bfbebSnyanmisaka             RK_U32 (*c)[2] = s->counts.single_ref[i];
1470*437bfbebSnyanmisaka 
1471*437bfbebSnyanmisaka             adapt_prob(&pp[0], c[0][0], c[0][1], 20, 128);
1472*437bfbebSnyanmisaka             adapt_prob(&pp[1], c[1][0], c[1][1], 20, 128);
1473*437bfbebSnyanmisaka         }
1474*437bfbebSnyanmisaka     }
1475*437bfbebSnyanmisaka 
1476*437bfbebSnyanmisaka     // block partitioning
1477*437bfbebSnyanmisaka     for (i = 0; i < 4; i++)
1478*437bfbebSnyanmisaka         for (j = 0; j < 4; j++) {
1479*437bfbebSnyanmisaka             RK_U8 *pp = p->partition[i][j];
1480*437bfbebSnyanmisaka             RK_U32 *c = s->counts.partition[i][j];
1481*437bfbebSnyanmisaka             // mpp_log("befor pp[0] = 0x%x pp[1] = 0x%x pp[2] = 0x%x",pp[0],pp[1],pp[2]);
1482*437bfbebSnyanmisaka             // mpp_log("befor c[0] = 0x%x c[1] = 0x%x c[2] = 0x%x",c[0],c[1],c[2]);
1483*437bfbebSnyanmisaka             adapt_prob(&pp[0], c[0], c[1] + c[2] + c[3], 20, 128);
1484*437bfbebSnyanmisaka             adapt_prob(&pp[1], c[1], c[2] + c[3], 20, 128);
1485*437bfbebSnyanmisaka             adapt_prob(&pp[2], c[2], c[3], 20, 128);
1486*437bfbebSnyanmisaka             // mpp_log(" after pp[0] = 0x%x pp[1] = 0x%x pp[2] = 0x%x",pp[0],pp[1],pp[2]);
1487*437bfbebSnyanmisaka         }
1488*437bfbebSnyanmisaka 
1489*437bfbebSnyanmisaka     // tx size
1490*437bfbebSnyanmisaka     if (s->txfmmode == TX_SWITCHABLE) {
1491*437bfbebSnyanmisaka         for (i = 0; i < 2; i++) {
1492*437bfbebSnyanmisaka             RK_U32 *c16 = s->counts.tx16p[i], *c32 = s->counts.tx32p[i];
1493*437bfbebSnyanmisaka 
1494*437bfbebSnyanmisaka             adapt_prob(&p->tx8p[i], s->counts.tx8p[i][0], s->counts.tx8p[i][1], 20, 128);
1495*437bfbebSnyanmisaka             adapt_prob(&p->tx16p[i][0], c16[0], c16[1] + c16[2], 20, 128);
1496*437bfbebSnyanmisaka             adapt_prob(&p->tx16p[i][1], c16[1], c16[2], 20, 128);
1497*437bfbebSnyanmisaka             adapt_prob(&p->tx32p[i][0], c32[0], c32[1] + c32[2] + c32[3], 20, 128);
1498*437bfbebSnyanmisaka             adapt_prob(&p->tx32p[i][1], c32[1], c32[2] + c32[3], 20, 128);
1499*437bfbebSnyanmisaka             adapt_prob(&p->tx32p[i][2], c32[2], c32[3], 20, 128);
1500*437bfbebSnyanmisaka         }
1501*437bfbebSnyanmisaka     }
1502*437bfbebSnyanmisaka 
1503*437bfbebSnyanmisaka     // interpolation filter
1504*437bfbebSnyanmisaka     if (s->filtermode == FILTER_SWITCHABLE) {
1505*437bfbebSnyanmisaka         for (i = 0; i < 4; i++) {
1506*437bfbebSnyanmisaka             RK_U8 *pp = p->filter[i];
1507*437bfbebSnyanmisaka             RK_U32 *c = s->counts.filter[i];
1508*437bfbebSnyanmisaka 
1509*437bfbebSnyanmisaka             adapt_prob(&pp[0], c[0], c[1] + c[2], 20, 128);
1510*437bfbebSnyanmisaka             adapt_prob(&pp[1], c[1], c[2], 20, 128);
1511*437bfbebSnyanmisaka         }
1512*437bfbebSnyanmisaka     }
1513*437bfbebSnyanmisaka 
1514*437bfbebSnyanmisaka     // inter modes
1515*437bfbebSnyanmisaka     for (i = 0; i < 7; i++) {
1516*437bfbebSnyanmisaka         RK_U8 *pp = p->mv_mode[i];
1517*437bfbebSnyanmisaka         RK_U32 *c = s->counts.mv_mode[i];
1518*437bfbebSnyanmisaka 
1519*437bfbebSnyanmisaka         adapt_prob(&pp[0], c[2], c[1] + c[0] + c[3], 20, 128);
1520*437bfbebSnyanmisaka         adapt_prob(&pp[1], c[0], c[1] + c[3], 20, 128);
1521*437bfbebSnyanmisaka         adapt_prob(&pp[2], c[1], c[3], 20, 128);
1522*437bfbebSnyanmisaka     }
1523*437bfbebSnyanmisaka 
1524*437bfbebSnyanmisaka     // mv joints
1525*437bfbebSnyanmisaka     {
1526*437bfbebSnyanmisaka         RK_U8 *pp = p->mv_joint;
1527*437bfbebSnyanmisaka         RK_U32 *c = s->counts.mv_joint;
1528*437bfbebSnyanmisaka 
1529*437bfbebSnyanmisaka         adapt_prob(&pp[0], c[0], c[1] + c[2] + c[3], 20, 128);
1530*437bfbebSnyanmisaka         adapt_prob(&pp[1], c[1], c[2] + c[3], 20, 128);
1531*437bfbebSnyanmisaka         adapt_prob(&pp[2], c[2], c[3], 20, 128);
1532*437bfbebSnyanmisaka     }
1533*437bfbebSnyanmisaka 
1534*437bfbebSnyanmisaka     // mv components
1535*437bfbebSnyanmisaka     for (i = 0; i < 2; i++) {
1536*437bfbebSnyanmisaka         RK_U8 *pp;
1537*437bfbebSnyanmisaka         RK_U32 *c, (*c2)[2], sum;
1538*437bfbebSnyanmisaka 
1539*437bfbebSnyanmisaka         adapt_prob(&p->mv_comp[i].sign, s->counts.sign[i][0],
1540*437bfbebSnyanmisaka                    s->counts.sign[i][1], 20, 128);
1541*437bfbebSnyanmisaka 
1542*437bfbebSnyanmisaka         pp = p->mv_comp[i].classes;
1543*437bfbebSnyanmisaka         c = s->counts.classes[i];
1544*437bfbebSnyanmisaka         sum = c[1] + c[2] + c[3] + c[4] + c[5] + c[6] + c[7] + c[8] + c[9] + c[10];
1545*437bfbebSnyanmisaka         adapt_prob(&pp[0], c[0], sum, 20, 128);
1546*437bfbebSnyanmisaka         sum -= c[1];
1547*437bfbebSnyanmisaka         adapt_prob(&pp[1], c[1], sum, 20, 128);
1548*437bfbebSnyanmisaka         sum -= c[2] + c[3];
1549*437bfbebSnyanmisaka         adapt_prob(&pp[2], c[2] + c[3], sum, 20, 128);
1550*437bfbebSnyanmisaka         adapt_prob(&pp[3], c[2], c[3], 20, 128);
1551*437bfbebSnyanmisaka         sum -= c[4] + c[5];
1552*437bfbebSnyanmisaka         adapt_prob(&pp[4], c[4] + c[5], sum, 20, 128);
1553*437bfbebSnyanmisaka         adapt_prob(&pp[5], c[4], c[5], 20, 128);
1554*437bfbebSnyanmisaka         sum -= c[6];
1555*437bfbebSnyanmisaka         adapt_prob(&pp[6], c[6], sum, 20, 128);
1556*437bfbebSnyanmisaka         adapt_prob(&pp[7], c[7] + c[8], c[9] + c[10], 20, 128);
1557*437bfbebSnyanmisaka         adapt_prob(&pp[8], c[7], c[8], 20, 128);
1558*437bfbebSnyanmisaka         adapt_prob(&pp[9], c[9], c[10], 20, 128);
1559*437bfbebSnyanmisaka 
1560*437bfbebSnyanmisaka         adapt_prob(&p->mv_comp[i].class0, s->counts.class0[i][0],
1561*437bfbebSnyanmisaka                    s->counts.class0[i][1], 20, 128);
1562*437bfbebSnyanmisaka         pp = p->mv_comp[i].bits;
1563*437bfbebSnyanmisaka         c2 = s->counts.bits[i];
1564*437bfbebSnyanmisaka         for (j = 0; j < 10; j++)
1565*437bfbebSnyanmisaka             adapt_prob(&pp[j], c2[j][0], c2[j][1], 20, 128);
1566*437bfbebSnyanmisaka 
1567*437bfbebSnyanmisaka         for (j = 0; j < 2; j++) {
1568*437bfbebSnyanmisaka             pp = p->mv_comp[i].class0_fp[j];
1569*437bfbebSnyanmisaka             c = s->counts.class0_fp[i][j];
1570*437bfbebSnyanmisaka             adapt_prob(&pp[0], c[0], c[1] + c[2] + c[3], 20, 128);
1571*437bfbebSnyanmisaka             adapt_prob(&pp[1], c[1], c[2] + c[3], 20, 128);
1572*437bfbebSnyanmisaka             adapt_prob(&pp[2], c[2], c[3], 20, 128);
1573*437bfbebSnyanmisaka         }
1574*437bfbebSnyanmisaka         pp = p->mv_comp[i].fp;
1575*437bfbebSnyanmisaka         c = s->counts.fp[i];
1576*437bfbebSnyanmisaka         adapt_prob(&pp[0], c[0], c[1] + c[2] + c[3], 20, 128);
1577*437bfbebSnyanmisaka         adapt_prob(&pp[1], c[1], c[2] + c[3], 20, 128);
1578*437bfbebSnyanmisaka         adapt_prob(&pp[2], c[2], c[3], 20, 128);
1579*437bfbebSnyanmisaka 
1580*437bfbebSnyanmisaka         if (s->highprecisionmvs) {
1581*437bfbebSnyanmisaka             adapt_prob(&p->mv_comp[i].class0_hp, s->counts.class0_hp[i][0],
1582*437bfbebSnyanmisaka                        s->counts.class0_hp[i][1], 20, 128);
1583*437bfbebSnyanmisaka             adapt_prob(&p->mv_comp[i].hp, s->counts.hp[i][0],
1584*437bfbebSnyanmisaka                        s->counts.hp[i][1], 20, 128);
1585*437bfbebSnyanmisaka         }
1586*437bfbebSnyanmisaka     }
1587*437bfbebSnyanmisaka 
1588*437bfbebSnyanmisaka     // y intra modes
1589*437bfbebSnyanmisaka     for (i = 0; i < 4; i++) {
1590*437bfbebSnyanmisaka         RK_U8 *pp = p->y_mode[i];
1591*437bfbebSnyanmisaka         RK_U32 *c = s->counts.y_mode[i], sum, s2;
1592*437bfbebSnyanmisaka 
1593*437bfbebSnyanmisaka         sum = c[0] + c[1] + c[3] + c[4] + c[5] + c[6] + c[7] + c[8] + c[9];
1594*437bfbebSnyanmisaka         adapt_prob(&pp[0], c[DC_PRED], sum, 20, 128);
1595*437bfbebSnyanmisaka         sum -= c[TM_VP8_PRED];
1596*437bfbebSnyanmisaka         adapt_prob(&pp[1], c[TM_VP8_PRED], sum, 20, 128);
1597*437bfbebSnyanmisaka         sum -= c[VERT_PRED];
1598*437bfbebSnyanmisaka         adapt_prob(&pp[2], c[VERT_PRED], sum, 20, 128);
1599*437bfbebSnyanmisaka         s2 = c[HOR_PRED] + c[DIAG_DOWN_RIGHT_PRED] + c[VERT_RIGHT_PRED];
1600*437bfbebSnyanmisaka         sum -= s2;
1601*437bfbebSnyanmisaka         adapt_prob(&pp[3], s2, sum, 20, 128);
1602*437bfbebSnyanmisaka         s2 -= c[HOR_PRED];
1603*437bfbebSnyanmisaka         adapt_prob(&pp[4], c[HOR_PRED], s2, 20, 128);
1604*437bfbebSnyanmisaka         adapt_prob(&pp[5], c[DIAG_DOWN_RIGHT_PRED], c[VERT_RIGHT_PRED], 20, 128);
1605*437bfbebSnyanmisaka         sum -= c[DIAG_DOWN_LEFT_PRED];
1606*437bfbebSnyanmisaka         adapt_prob(&pp[6], c[DIAG_DOWN_LEFT_PRED], sum, 20, 128);
1607*437bfbebSnyanmisaka         sum -= c[VERT_LEFT_PRED];
1608*437bfbebSnyanmisaka         adapt_prob(&pp[7], c[VERT_LEFT_PRED], sum, 20, 128);
1609*437bfbebSnyanmisaka         adapt_prob(&pp[8], c[HOR_DOWN_PRED], c[HOR_UP_PRED], 20, 128);
1610*437bfbebSnyanmisaka     }
1611*437bfbebSnyanmisaka 
1612*437bfbebSnyanmisaka     // uv intra modes
1613*437bfbebSnyanmisaka     for (i = 0; i < 10; i++) {
1614*437bfbebSnyanmisaka         RK_U8 *pp = p->uv_mode[i];
1615*437bfbebSnyanmisaka         RK_U32 *c = s->counts.uv_mode[i], sum, s2;
1616*437bfbebSnyanmisaka 
1617*437bfbebSnyanmisaka         sum = c[0] + c[1] + c[3] + c[4] + c[5] + c[6] + c[7] + c[8] + c[9];
1618*437bfbebSnyanmisaka         adapt_prob(&pp[0], c[DC_PRED], sum, 20, 128);
1619*437bfbebSnyanmisaka         sum -= c[TM_VP8_PRED];
1620*437bfbebSnyanmisaka         adapt_prob(&pp[1], c[TM_VP8_PRED], sum, 20, 128);
1621*437bfbebSnyanmisaka         sum -= c[VERT_PRED];
1622*437bfbebSnyanmisaka         adapt_prob(&pp[2], c[VERT_PRED], sum, 20, 128);
1623*437bfbebSnyanmisaka         s2 = c[HOR_PRED] + c[DIAG_DOWN_RIGHT_PRED] + c[VERT_RIGHT_PRED];
1624*437bfbebSnyanmisaka         sum -= s2;
1625*437bfbebSnyanmisaka         adapt_prob(&pp[3], s2, sum, 20, 128);
1626*437bfbebSnyanmisaka         s2 -= c[HOR_PRED];
1627*437bfbebSnyanmisaka         adapt_prob(&pp[4], c[HOR_PRED], s2, 20, 128);
1628*437bfbebSnyanmisaka         adapt_prob(&pp[5], c[DIAG_DOWN_RIGHT_PRED], c[VERT_RIGHT_PRED], 20, 128);
1629*437bfbebSnyanmisaka         sum -= c[DIAG_DOWN_LEFT_PRED];
1630*437bfbebSnyanmisaka         adapt_prob(&pp[6], c[DIAG_DOWN_LEFT_PRED], sum, 20, 128);
1631*437bfbebSnyanmisaka         sum -= c[VERT_LEFT_PRED];
1632*437bfbebSnyanmisaka         adapt_prob(&pp[7], c[VERT_LEFT_PRED], sum, 20, 128);
1633*437bfbebSnyanmisaka         adapt_prob(&pp[8], c[HOR_DOWN_PRED], c[HOR_UP_PRED], 20, 128);
1634*437bfbebSnyanmisaka     }
1635*437bfbebSnyanmisaka #if 0 //def dump
1636*437bfbebSnyanmisaka     fwrite(s->counts.y_mode, 1, sizeof(s->counts.y_mode), vp9_p_fp1);
1637*437bfbebSnyanmisaka     fwrite(s->counts.uv_mode, 1, sizeof(s->counts.uv_mode), vp9_p_fp1);
1638*437bfbebSnyanmisaka     fflush(vp9_p_fp1);
1639*437bfbebSnyanmisaka #endif
1640*437bfbebSnyanmisaka }
1641*437bfbebSnyanmisaka 
1642*437bfbebSnyanmisaka 
vp9_parser_frame(Vp9CodecContext * ctx,HalDecTask * task)1643*437bfbebSnyanmisaka RK_S32 vp9_parser_frame(Vp9CodecContext *ctx, HalDecTask *task)
1644*437bfbebSnyanmisaka {
1645*437bfbebSnyanmisaka 
1646*437bfbebSnyanmisaka     const RK_U8 *data = NULL;
1647*437bfbebSnyanmisaka     RK_S32 size = 0;
1648*437bfbebSnyanmisaka     VP9Context *s = (VP9Context *)ctx->priv_data;
1649*437bfbebSnyanmisaka     RK_S32 res, i, ref = 0;
1650*437bfbebSnyanmisaka 
1651*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_FUNCTION, "%s", __FUNCTION__);
1652*437bfbebSnyanmisaka     task->valid = -1;
1653*437bfbebSnyanmisaka #ifdef dump
1654*437bfbebSnyanmisaka     dec_num++;
1655*437bfbebSnyanmisaka #endif
1656*437bfbebSnyanmisaka     data = (const RK_U8 *)mpp_packet_get_pos(ctx->pkt);
1657*437bfbebSnyanmisaka     size = (RK_S32)mpp_packet_get_length(ctx->pkt);
1658*437bfbebSnyanmisaka 
1659*437bfbebSnyanmisaka     s->pts = mpp_packet_get_pts(ctx->pkt);
1660*437bfbebSnyanmisaka     s->dts = mpp_packet_get_dts(ctx->pkt);
1661*437bfbebSnyanmisaka 
1662*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_HEADER, "data size %d", size);
1663*437bfbebSnyanmisaka     if (size <= 0) {
1664*437bfbebSnyanmisaka         return MPP_OK;
1665*437bfbebSnyanmisaka     }
1666*437bfbebSnyanmisaka     if ((res = decode_parser_header(ctx, data, size, &ref)) < 0) {
1667*437bfbebSnyanmisaka         return res;
1668*437bfbebSnyanmisaka     } else if (res == 0) {
1669*437bfbebSnyanmisaka         if (!s->refs[ref].ref) {
1670*437bfbebSnyanmisaka             //mpp_err("Requested reference %d not available\n", ref);
1671*437bfbebSnyanmisaka             return -1;//AVERROR_INVALIDDATA;
1672*437bfbebSnyanmisaka         }
1673*437bfbebSnyanmisaka         {
1674*437bfbebSnyanmisaka             MppFrame frame = NULL;
1675*437bfbebSnyanmisaka 
1676*437bfbebSnyanmisaka             mpp_buf_slot_get_prop(s->slots, s->refs[ref].slot_index, SLOT_FRAME_PTR, &frame);
1677*437bfbebSnyanmisaka             mpp_frame_set_pts(frame, s->pts);
1678*437bfbebSnyanmisaka             mpp_frame_set_dts(frame, s->dts);
1679*437bfbebSnyanmisaka             mpp_buf_slot_set_flag(s->slots, s->refs[ref].slot_index, SLOT_QUEUE_USE);
1680*437bfbebSnyanmisaka             mpp_buf_slot_enqueue(s->slots, s->refs[ref].slot_index, QUEUE_DISPLAY);
1681*437bfbebSnyanmisaka             s->refs[ref].ref->is_output = 1;
1682*437bfbebSnyanmisaka         }
1683*437bfbebSnyanmisaka 
1684*437bfbebSnyanmisaka         mpp_log("out repeat num %d", s->outframe_num++);
1685*437bfbebSnyanmisaka         return size;
1686*437bfbebSnyanmisaka     }
1687*437bfbebSnyanmisaka     data += res;
1688*437bfbebSnyanmisaka     size -= res;
1689*437bfbebSnyanmisaka 
1690*437bfbebSnyanmisaka     if (s->frames[REF_FRAME_MVPAIR].ref)
1691*437bfbebSnyanmisaka         vp9_unref_frame(s, &s->frames[REF_FRAME_MVPAIR]);
1692*437bfbebSnyanmisaka 
1693*437bfbebSnyanmisaka     if (!s->intraonly && !s->keyframe && !s->errorres && s->frames[CUR_FRAME].ref) {
1694*437bfbebSnyanmisaka         if ((res = vp9_ref_frame(ctx, &s->frames[REF_FRAME_MVPAIR], &s->frames[CUR_FRAME])) < 0)
1695*437bfbebSnyanmisaka             return res;
1696*437bfbebSnyanmisaka     }
1697*437bfbebSnyanmisaka 
1698*437bfbebSnyanmisaka     if (s->frames[CUR_FRAME].ref)
1699*437bfbebSnyanmisaka         vp9_unref_frame(s, &s->frames[CUR_FRAME]);
1700*437bfbebSnyanmisaka 
1701*437bfbebSnyanmisaka     if ((res = vp9_alloc_frame(ctx, &s->frames[CUR_FRAME])) < 0)
1702*437bfbebSnyanmisaka         return res;
1703*437bfbebSnyanmisaka 
1704*437bfbebSnyanmisaka     if (s->refreshctx && s->parallelmode) {
1705*437bfbebSnyanmisaka         RK_S32 j, k, l, m;
1706*437bfbebSnyanmisaka 
1707*437bfbebSnyanmisaka         for (i = 0; i < 4; i++) {
1708*437bfbebSnyanmisaka             for (j = 0; j < 2; j++)
1709*437bfbebSnyanmisaka                 for (k = 0; k < 2; k++)
1710*437bfbebSnyanmisaka                     for (l = 0; l < 6; l++)
1711*437bfbebSnyanmisaka                         for (m = 0; m < 6; m++)
1712*437bfbebSnyanmisaka                             memcpy(s->prob_ctx[s->framectxid].coef[i][j][k][l][m],
1713*437bfbebSnyanmisaka                                    s->prob.coef[i][j][k][l][m], 3);
1714*437bfbebSnyanmisaka             if ((RK_S32)s->txfmmode == i)
1715*437bfbebSnyanmisaka                 break;
1716*437bfbebSnyanmisaka         }
1717*437bfbebSnyanmisaka         s->prob_ctx[s->framectxid].p = s->prob.p;
1718*437bfbebSnyanmisaka     }
1719*437bfbebSnyanmisaka 
1720*437bfbebSnyanmisaka     vp9d_parser2_syntax(ctx);
1721*437bfbebSnyanmisaka 
1722*437bfbebSnyanmisaka     task->syntax.data = (void*)&ctx->pic_params;
1723*437bfbebSnyanmisaka     task->syntax.number = 1;
1724*437bfbebSnyanmisaka     task->valid = 1;
1725*437bfbebSnyanmisaka     task->output = s->frames[CUR_FRAME].slot_index;
1726*437bfbebSnyanmisaka     task->input_packet = ctx->pkt;
1727*437bfbebSnyanmisaka 
1728*437bfbebSnyanmisaka     for (i = 0; i < 3; i++) {
1729*437bfbebSnyanmisaka         if (s->refs[s->refidx[i]].slot_index < 0x7f) {
1730*437bfbebSnyanmisaka             MppFrame mframe = NULL;
1731*437bfbebSnyanmisaka             mpp_buf_slot_set_flag(s->slots, s->refs[s->refidx[i]].slot_index, SLOT_HAL_INPUT);
1732*437bfbebSnyanmisaka             task->refer[i] = s->refs[s->refidx[i]].slot_index;
1733*437bfbebSnyanmisaka             mpp_buf_slot_get_prop(s->slots, task->refer[i], SLOT_FRAME_PTR, &mframe);
1734*437bfbebSnyanmisaka             if (mframe && !s->keyframe && !s->intraonly)
1735*437bfbebSnyanmisaka                 task->flags.ref_err |= mpp_frame_get_errinfo(mframe);
1736*437bfbebSnyanmisaka         } else {
1737*437bfbebSnyanmisaka             task->refer[i] = -1;
1738*437bfbebSnyanmisaka         }
1739*437bfbebSnyanmisaka     }
1740*437bfbebSnyanmisaka 
1741*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_REF, "ref_errinfo=%d\n", task->flags.ref_err);
1742*437bfbebSnyanmisaka     if (s->eos) {
1743*437bfbebSnyanmisaka         task->flags.eos = 1;
1744*437bfbebSnyanmisaka     }
1745*437bfbebSnyanmisaka 
1746*437bfbebSnyanmisaka     if (!s->invisible) {
1747*437bfbebSnyanmisaka         mpp_buf_slot_set_flag(s->slots,  s->frames[CUR_FRAME].slot_index, SLOT_QUEUE_USE);
1748*437bfbebSnyanmisaka         mpp_buf_slot_enqueue(s->slots, s->frames[CUR_FRAME].slot_index, QUEUE_DISPLAY);
1749*437bfbebSnyanmisaka     }
1750*437bfbebSnyanmisaka     vp9d_dbg(VP9D_DBG_REF, "s->refreshrefmask = %d s->frames[CUR_FRAME] = %d",
1751*437bfbebSnyanmisaka              s->refreshrefmask, s->frames[CUR_FRAME].slot_index);
1752*437bfbebSnyanmisaka     for (i = 0; i < 3; i++) {
1753*437bfbebSnyanmisaka         if (s->refs[s->refidx[i]].ref != NULL) {
1754*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_REF, "ref buf select %d", s->refs[s->refidx[i]].slot_index);
1755*437bfbebSnyanmisaka         }
1756*437bfbebSnyanmisaka     }
1757*437bfbebSnyanmisaka     // ref frame setup
1758*437bfbebSnyanmisaka     for (i = 0; i < 8; i++) {
1759*437bfbebSnyanmisaka         vp9d_dbg(VP9D_DBG_REF, "s->refreshrefmask = 0x%x", s->refreshrefmask);
1760*437bfbebSnyanmisaka         res = 0;
1761*437bfbebSnyanmisaka         if (s->refreshrefmask & (1 << i)) {
1762*437bfbebSnyanmisaka             if (s->refs[i].ref)
1763*437bfbebSnyanmisaka                 vp9_unref_frame(s, &s->refs[i]);
1764*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_REF, "update ref index in %d", i);
1765*437bfbebSnyanmisaka             res = vp9_ref_frame(ctx, &s->refs[i], &s->frames[CUR_FRAME]);
1766*437bfbebSnyanmisaka         }
1767*437bfbebSnyanmisaka 
1768*437bfbebSnyanmisaka         if (s->refs[i].ref)
1769*437bfbebSnyanmisaka             vp9d_dbg(VP9D_DBG_REF, "s->refs[%d] = %d", i, s->refs[i].slot_index);
1770*437bfbebSnyanmisaka         if (res < 0)
1771*437bfbebSnyanmisaka             return 0;
1772*437bfbebSnyanmisaka     }
1773*437bfbebSnyanmisaka     return 0;
1774*437bfbebSnyanmisaka }
1775*437bfbebSnyanmisaka 
vp9d_paser_reset(Vp9CodecContext * ctx)1776*437bfbebSnyanmisaka MPP_RET vp9d_paser_reset(Vp9CodecContext *ctx)
1777*437bfbebSnyanmisaka {
1778*437bfbebSnyanmisaka     RK_S32 i;
1779*437bfbebSnyanmisaka     VP9Context *s = ctx->priv_data;
1780*437bfbebSnyanmisaka     SplitContext_t *ps = (SplitContext_t *)ctx->priv_data2;
1781*437bfbebSnyanmisaka     VP9ParseContext *pc = (VP9ParseContext *)ps->priv_data;
1782*437bfbebSnyanmisaka 
1783*437bfbebSnyanmisaka     s->got_keyframes = 0;
1784*437bfbebSnyanmisaka     s->cur_poc = 0;
1785*437bfbebSnyanmisaka     for (i = 0; i < 3; i++) {
1786*437bfbebSnyanmisaka         if (s->frames[i].ref) {
1787*437bfbebSnyanmisaka             vp9_unref_frame(s, &s->frames[i]);
1788*437bfbebSnyanmisaka         }
1789*437bfbebSnyanmisaka     }
1790*437bfbebSnyanmisaka     for (i = 0; i < 8; i++) {
1791*437bfbebSnyanmisaka         if (s->refs[i].ref) {
1792*437bfbebSnyanmisaka             vp9_unref_frame(s, &s->refs[i]);
1793*437bfbebSnyanmisaka         }
1794*437bfbebSnyanmisaka     }
1795*437bfbebSnyanmisaka     memset(pc, 0, sizeof(VP9ParseContext));
1796*437bfbebSnyanmisaka 
1797*437bfbebSnyanmisaka     s->eos = 0;
1798*437bfbebSnyanmisaka     if (ps) {
1799*437bfbebSnyanmisaka         ps->eos = 0;
1800*437bfbebSnyanmisaka     }
1801*437bfbebSnyanmisaka     return MPP_OK;
1802*437bfbebSnyanmisaka }
inv_count_data(VP9Context * s)1803*437bfbebSnyanmisaka static void inv_count_data(VP9Context *s)
1804*437bfbebSnyanmisaka {
1805*437bfbebSnyanmisaka     RK_U32 partition_probs[4][4][4];
1806*437bfbebSnyanmisaka     RK_U32 count_uv[10][10];
1807*437bfbebSnyanmisaka     RK_U32 count_y_mode[4][10];
1808*437bfbebSnyanmisaka     RK_U32 *dst_uv = NULL;
1809*437bfbebSnyanmisaka     RK_S32 i, j;
1810*437bfbebSnyanmisaka 
1811*437bfbebSnyanmisaka     /*
1812*437bfbebSnyanmisaka                  syntax              hardware
1813*437bfbebSnyanmisaka              *+++++64x64+++++*   *++++8x8++++*
1814*437bfbebSnyanmisaka              *+++++32x32+++*     *++++16x16++++*
1815*437bfbebSnyanmisaka              *+++++16x16+++*     *++++32x32++++*
1816*437bfbebSnyanmisaka              *+++++8x8+++*       *++++64x64++++++*
1817*437bfbebSnyanmisaka      */
1818*437bfbebSnyanmisaka 
1819*437bfbebSnyanmisaka     memcpy(&partition_probs, s->counts.partition, sizeof(s->counts.partition));
1820*437bfbebSnyanmisaka     j = 0;
1821*437bfbebSnyanmisaka     for (i = 3; i >= 0; i--) {
1822*437bfbebSnyanmisaka         memcpy(&s->counts.partition[j], &partition_probs[i], 64);
1823*437bfbebSnyanmisaka         j++;
1824*437bfbebSnyanmisaka     }
1825*437bfbebSnyanmisaka     if (!(s->keyframe || s->intraonly)) {
1826*437bfbebSnyanmisaka         memcpy(count_y_mode, s->counts.y_mode, sizeof(s->counts.y_mode));
1827*437bfbebSnyanmisaka         for (i = 0; i < 4; i++) {
1828*437bfbebSnyanmisaka             RK_U32 value = 0;
1829*437bfbebSnyanmisaka             for (j = 0; j < 10; j++) {
1830*437bfbebSnyanmisaka                 value = count_y_mode[i][j];
1831*437bfbebSnyanmisaka                 if (j == 0)
1832*437bfbebSnyanmisaka                     s->counts.y_mode[i][2] = value;
1833*437bfbebSnyanmisaka                 else if (j == 1)
1834*437bfbebSnyanmisaka                     s->counts.y_mode[i][0] = value;
1835*437bfbebSnyanmisaka                 else if (j == 2)
1836*437bfbebSnyanmisaka                     s->counts.y_mode[i][1] = value;
1837*437bfbebSnyanmisaka                 else if (j == 7)
1838*437bfbebSnyanmisaka                     s->counts.y_mode[i][8] = value;
1839*437bfbebSnyanmisaka                 else if (j == 8)
1840*437bfbebSnyanmisaka                     s->counts.y_mode[i][7] = value;
1841*437bfbebSnyanmisaka                 else
1842*437bfbebSnyanmisaka                     s->counts.y_mode[i][j] = value;
1843*437bfbebSnyanmisaka 
1844*437bfbebSnyanmisaka             }
1845*437bfbebSnyanmisaka         }
1846*437bfbebSnyanmisaka 
1847*437bfbebSnyanmisaka 
1848*437bfbebSnyanmisaka         memcpy(count_uv, s->counts.uv_mode, sizeof(s->counts.uv_mode));
1849*437bfbebSnyanmisaka 
1850*437bfbebSnyanmisaka         /*change uv_mode to hardware need style*/
1851*437bfbebSnyanmisaka         /*
1852*437bfbebSnyanmisaka               syntax              hardware
1853*437bfbebSnyanmisaka          *+++++ v   ++++*     *++++ dc   ++++*
1854*437bfbebSnyanmisaka          *+++++ h   ++++*     *++++ v   ++++*
1855*437bfbebSnyanmisaka          *+++++ dc  ++++*     *++++ h  ++++*
1856*437bfbebSnyanmisaka          *+++++ d45 ++++*     *++++ d45 ++++*
1857*437bfbebSnyanmisaka          *+++++ d135++++*     *++++ d135++++*
1858*437bfbebSnyanmisaka          *+++++ d117++++*     *++++ d117++++*
1859*437bfbebSnyanmisaka          *+++++ d153++++*     *++++ d153++++*
1860*437bfbebSnyanmisaka          *+++++ d63 ++++*     *++++ d207++++*
1861*437bfbebSnyanmisaka          *+++++ d207 ++++*    *++++ d63 ++++*
1862*437bfbebSnyanmisaka          *+++++ tm  ++++*     *++++ tm  ++++*
1863*437bfbebSnyanmisaka         */
1864*437bfbebSnyanmisaka         for (i = 0; i < 10; i++) {
1865*437bfbebSnyanmisaka             RK_U32 *src_uv = (RK_U32 *)(count_uv[i]);
1866*437bfbebSnyanmisaka             RK_U32 value = 0;
1867*437bfbebSnyanmisaka             if (i == 0) {
1868*437bfbebSnyanmisaka                 dst_uv = s->counts.uv_mode[2]; //dc
1869*437bfbebSnyanmisaka             } else if ( i == 1) {
1870*437bfbebSnyanmisaka                 dst_uv = s->counts.uv_mode[0]; //h
1871*437bfbebSnyanmisaka             }  else if ( i == 2) {
1872*437bfbebSnyanmisaka                 dst_uv = s->counts.uv_mode[1]; //h
1873*437bfbebSnyanmisaka             }  else if ( i == 7) {
1874*437bfbebSnyanmisaka                 dst_uv = s->counts.uv_mode[8]; //d207
1875*437bfbebSnyanmisaka             } else if (i == 8) {
1876*437bfbebSnyanmisaka                 dst_uv = s->counts.uv_mode[7]; //d63
1877*437bfbebSnyanmisaka             } else {
1878*437bfbebSnyanmisaka                 dst_uv = s->counts.uv_mode[i];
1879*437bfbebSnyanmisaka             }
1880*437bfbebSnyanmisaka             for (j = 0; j < 10; j++) {
1881*437bfbebSnyanmisaka                 value = src_uv[j];
1882*437bfbebSnyanmisaka                 if (j == 0)
1883*437bfbebSnyanmisaka                     dst_uv[2] = value;
1884*437bfbebSnyanmisaka                 else if (j == 1)
1885*437bfbebSnyanmisaka                     dst_uv[0] = value;
1886*437bfbebSnyanmisaka                 else if (j == 2)
1887*437bfbebSnyanmisaka                     dst_uv[1] = value;
1888*437bfbebSnyanmisaka                 else if (j == 7)
1889*437bfbebSnyanmisaka                     dst_uv[8] = value;
1890*437bfbebSnyanmisaka                 else if (j == 8)
1891*437bfbebSnyanmisaka                     dst_uv[7] = value;
1892*437bfbebSnyanmisaka                 else
1893*437bfbebSnyanmisaka                     dst_uv[j] = value;
1894*437bfbebSnyanmisaka             }
1895*437bfbebSnyanmisaka 
1896*437bfbebSnyanmisaka         }
1897*437bfbebSnyanmisaka     }
1898*437bfbebSnyanmisaka }
1899*437bfbebSnyanmisaka 
vp9_parser_update(Vp9CodecContext * ctx,void * count_info)1900*437bfbebSnyanmisaka void vp9_parser_update(Vp9CodecContext *ctx, void *count_info)
1901*437bfbebSnyanmisaka {
1902*437bfbebSnyanmisaka     VP9Context *s = ctx->priv_data;
1903*437bfbebSnyanmisaka 
1904*437bfbebSnyanmisaka #ifdef dump
1905*437bfbebSnyanmisaka     char filename[20] = "data/pcout";
1906*437bfbebSnyanmisaka     char filename1[20] = "data/uppor";
1907*437bfbebSnyanmisaka     if (vp9_p_fp != NULL) {
1908*437bfbebSnyanmisaka         fclose(vp9_p_fp);
1909*437bfbebSnyanmisaka 
1910*437bfbebSnyanmisaka     }
1911*437bfbebSnyanmisaka     if (vp9_p_fp1 != NULL) {
1912*437bfbebSnyanmisaka         fclose(vp9_p_fp1);
1913*437bfbebSnyanmisaka 
1914*437bfbebSnyanmisaka     }
1915*437bfbebSnyanmisaka     sprintf(&filename[10], "%d.bin", count);
1916*437bfbebSnyanmisaka     sprintf(&filename1[10], "%d.bin", count);
1917*437bfbebSnyanmisaka     mpp_log("filename %s", filename);
1918*437bfbebSnyanmisaka     vp9_p_fp = fopen(filename, "wb");
1919*437bfbebSnyanmisaka     vp9_p_fp1 = fopen(filename1, "wb");
1920*437bfbebSnyanmisaka #endif
1921*437bfbebSnyanmisaka     //update count from hardware
1922*437bfbebSnyanmisaka     if (count_info != NULL) {
1923*437bfbebSnyanmisaka 
1924*437bfbebSnyanmisaka         memcpy((void *)&s->counts, count_info, sizeof(s->counts));
1925*437bfbebSnyanmisaka 
1926*437bfbebSnyanmisaka         if (s->refreshctx && !s->parallelmode) {
1927*437bfbebSnyanmisaka #ifdef dump
1928*437bfbebSnyanmisaka             count++;
1929*437bfbebSnyanmisaka #endif
1930*437bfbebSnyanmisaka             inv_count_data(s);
1931*437bfbebSnyanmisaka             adapt_probs(s);
1932*437bfbebSnyanmisaka 
1933*437bfbebSnyanmisaka         }
1934*437bfbebSnyanmisaka     }
1935*437bfbebSnyanmisaka 
1936*437bfbebSnyanmisaka     return;
1937*437bfbebSnyanmisaka }
1938