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