xref: /rockchip-linux_mpp/mpp/hal/vpu/vp8e/hal_vp8e_entropy.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2017 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #define MODULE_TAG "hal_vp8e_entropy"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include <string.h>
9*437bfbebSnyanmisaka 
10*437bfbebSnyanmisaka #include "mpp_common.h"
11*437bfbebSnyanmisaka 
12*437bfbebSnyanmisaka #include "hal_vp8e_base.h"
13*437bfbebSnyanmisaka #include "hal_vp8e_entropy.h"
14*437bfbebSnyanmisaka #include "hal_vp8e_putbit.h"
15*437bfbebSnyanmisaka #include "hal_vp8e_table.h"
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #define COST_BOOL(prob, bin)\
18*437bfbebSnyanmisaka         ((bin) ? vp8_prob_cost_tbl[255 - (prob)] : vp8_prob_cost_tbl[prob])
19*437bfbebSnyanmisaka 
calc_mvprob(RK_U32 left,RK_U32 right,RK_U32 prob)20*437bfbebSnyanmisaka static RK_U32 calc_mvprob(RK_U32 left, RK_U32 right, RK_U32 prob)
21*437bfbebSnyanmisaka {
22*437bfbebSnyanmisaka     RK_U32 p;
23*437bfbebSnyanmisaka 
24*437bfbebSnyanmisaka     if (left + right) {
25*437bfbebSnyanmisaka         p = (left * 255) / (left + right);
26*437bfbebSnyanmisaka         p &= -2;
27*437bfbebSnyanmisaka         if (!p)
28*437bfbebSnyanmisaka             p = 1;
29*437bfbebSnyanmisaka     } else
30*437bfbebSnyanmisaka         p = prob;
31*437bfbebSnyanmisaka 
32*437bfbebSnyanmisaka     return p;
33*437bfbebSnyanmisaka }
34*437bfbebSnyanmisaka 
update_prob(RK_U32 prob,RK_U32 left,RK_U32 right,RK_U32 old_prob,RK_U32 new_prob,RK_U32 fixed)35*437bfbebSnyanmisaka static RK_U32 update_prob(RK_U32 prob, RK_U32 left, RK_U32 right,
36*437bfbebSnyanmisaka                           RK_U32 old_prob, RK_U32 new_prob, RK_U32 fixed)
37*437bfbebSnyanmisaka {
38*437bfbebSnyanmisaka     RK_S32 u, s;
39*437bfbebSnyanmisaka 
40*437bfbebSnyanmisaka     u = (RK_S32)fixed + ((vp8_prob_cost_tbl[255 - prob] - vp8_prob_cost_tbl[prob]) >> 8);
41*437bfbebSnyanmisaka     s = ((RK_S32)left * (vp8_prob_cost_tbl[old_prob] - vp8_prob_cost_tbl[new_prob]) +
42*437bfbebSnyanmisaka          (RK_S32)right * (vp8_prob_cost_tbl[255 - old_prob] - vp8_prob_cost_tbl[255 - new_prob])) >> 8;
43*437bfbebSnyanmisaka 
44*437bfbebSnyanmisaka     return (s > u);
45*437bfbebSnyanmisaka }
46*437bfbebSnyanmisaka 
get_cost_tree(Vp8eTree const * tree,RK_S32 * prob)47*437bfbebSnyanmisaka static RK_S32 get_cost_tree(Vp8eTree const *tree, RK_S32 *prob)
48*437bfbebSnyanmisaka {
49*437bfbebSnyanmisaka     RK_S32 bit_cost = 0;
50*437bfbebSnyanmisaka     RK_S32 value = tree->value;
51*437bfbebSnyanmisaka     RK_S32 number = tree->number;
52*437bfbebSnyanmisaka     RK_S32 const *index = tree->index;
53*437bfbebSnyanmisaka 
54*437bfbebSnyanmisaka     while (number--) {
55*437bfbebSnyanmisaka         bit_cost += COST_BOOL(prob[*index++], (value >> number) & 1);
56*437bfbebSnyanmisaka     }
57*437bfbebSnyanmisaka 
58*437bfbebSnyanmisaka     return bit_cost;
59*437bfbebSnyanmisaka }
60*437bfbebSnyanmisaka 
vp8e_init_entropy(void * hal)61*437bfbebSnyanmisaka MPP_RET vp8e_init_entropy(void *hal)
62*437bfbebSnyanmisaka {
63*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
64*437bfbebSnyanmisaka 
65*437bfbebSnyanmisaka     Vp8eVpuBuf *buffers = (Vp8eVpuBuf *)ctx->buffers;
66*437bfbebSnyanmisaka     Vp8eHalEntropy *entropy = &ctx->entropy;
67*437bfbebSnyanmisaka 
68*437bfbebSnyanmisaka     entropy->update_coeff_prob_flag = 0;
69*437bfbebSnyanmisaka     if (!ctx->sps.refresh_entropy || ctx->picbuf.cur_pic->i_frame) {
70*437bfbebSnyanmisaka         if (!entropy->default_coeff_prob_flag) {
71*437bfbebSnyanmisaka             memcpy(entropy->coeff_prob, default_prob_coeff_tbl, sizeof(default_prob_coeff_tbl));
72*437bfbebSnyanmisaka             entropy->update_coeff_prob_flag = 1;
73*437bfbebSnyanmisaka         }
74*437bfbebSnyanmisaka         memcpy(entropy->mv_prob, default_prob_mv_tbl, sizeof(default_prob_mv_tbl));
75*437bfbebSnyanmisaka         entropy->default_coeff_prob_flag = 1;
76*437bfbebSnyanmisaka     }
77*437bfbebSnyanmisaka 
78*437bfbebSnyanmisaka     memcpy(entropy->old_coeff_prob, entropy->coeff_prob, sizeof(entropy->coeff_prob));
79*437bfbebSnyanmisaka     if (ctx->frame_cnt == 0 || !ctx->last_frm_intra)
80*437bfbebSnyanmisaka         memcpy(entropy->old_mv_prob, entropy->mv_prob, sizeof(entropy->mv_prob));
81*437bfbebSnyanmisaka 
82*437bfbebSnyanmisaka     entropy->skip_false_prob = default_skip_false_prob_tbl[ctx->rc->qp_hdr];
83*437bfbebSnyanmisaka 
84*437bfbebSnyanmisaka     if (ctx->frame_cnt == 0)
85*437bfbebSnyanmisaka         return MPP_OK;
86*437bfbebSnyanmisaka 
87*437bfbebSnyanmisaka     if ((!ctx->picbuf.cur_pic->ipf) && (!ctx->picbuf.cur_pic->grf) &&
88*437bfbebSnyanmisaka         (!ctx->picbuf.cur_pic->arf))
89*437bfbebSnyanmisaka         return MPP_OK;
90*437bfbebSnyanmisaka 
91*437bfbebSnyanmisaka     if (ctx->prev_frame_lost)
92*437bfbebSnyanmisaka         return MPP_OK;
93*437bfbebSnyanmisaka     {
94*437bfbebSnyanmisaka         RK_S32 i, j, k, l;
95*437bfbebSnyanmisaka 
96*437bfbebSnyanmisaka         RK_U32 p, left, right;
97*437bfbebSnyanmisaka         RK_U32 old_p, upd_p = 0;
98*437bfbebSnyanmisaka 
99*437bfbebSnyanmisaka         RK_U32 type;
100*437bfbebSnyanmisaka         RK_U32 branch_cnt[2];
101*437bfbebSnyanmisaka         RK_U16 *p_tmp = NULL;
102*437bfbebSnyanmisaka 
103*437bfbebSnyanmisaka         RK_U16 *p_cnt = (RK_U16 *)mpp_buffer_get_ptr(buffers->hw_prob_count_buf);
104*437bfbebSnyanmisaka 
105*437bfbebSnyanmisaka         mpp_buffer_sync_end(buffers->hw_prob_count_buf);
106*437bfbebSnyanmisaka 
107*437bfbebSnyanmisaka         for (i = 0; i < 4; i++) {
108*437bfbebSnyanmisaka             for (j = 0; j < 7; j++) {
109*437bfbebSnyanmisaka                 for (k = 0; k < 3; k++) {
110*437bfbebSnyanmisaka                     RK_S32 tmp, ii;
111*437bfbebSnyanmisaka 
112*437bfbebSnyanmisaka                     tmp = i * 7 * 3 + j * 3 + k;
113*437bfbebSnyanmisaka                     tmp += 2 * 4 * 7 * 3;
114*437bfbebSnyanmisaka                     ii = offset_tbl[tmp];
115*437bfbebSnyanmisaka 
116*437bfbebSnyanmisaka                     right = ii >= 0 ? p_cnt[ii] : 0;
117*437bfbebSnyanmisaka 
118*437bfbebSnyanmisaka                     for (l = 2; l--;) {
119*437bfbebSnyanmisaka                         old_p = entropy->coeff_prob[i][j][k][l];
120*437bfbebSnyanmisaka                         upd_p = coeff_update_prob_tbl[i][j][k][l];
121*437bfbebSnyanmisaka 
122*437bfbebSnyanmisaka                         tmp -= 4 * 7 * 3;
123*437bfbebSnyanmisaka                         ii = offset_tbl[tmp];
124*437bfbebSnyanmisaka                         left = ii >= 0 ? p_cnt[ii] : 0;
125*437bfbebSnyanmisaka                         if (left + right) {
126*437bfbebSnyanmisaka                             p = ((left * 256) + ((left + right) >> 1)) / (left + right);
127*437bfbebSnyanmisaka                             if (p > 255) p = 255;
128*437bfbebSnyanmisaka                         } else
129*437bfbebSnyanmisaka                             p = old_p;
130*437bfbebSnyanmisaka 
131*437bfbebSnyanmisaka                         if (update_prob(upd_p, left, right, old_p, p, 8)) {
132*437bfbebSnyanmisaka                             entropy->coeff_prob[i][j][k][l] = p;
133*437bfbebSnyanmisaka                             entropy->update_coeff_prob_flag = 1;
134*437bfbebSnyanmisaka                         }
135*437bfbebSnyanmisaka                         right += left;
136*437bfbebSnyanmisaka                     }
137*437bfbebSnyanmisaka                 }
138*437bfbebSnyanmisaka             }
139*437bfbebSnyanmisaka         }
140*437bfbebSnyanmisaka 
141*437bfbebSnyanmisaka         if (entropy->update_coeff_prob_flag)
142*437bfbebSnyanmisaka             entropy->default_coeff_prob_flag = 0;
143*437bfbebSnyanmisaka 
144*437bfbebSnyanmisaka         p_tmp = p_cnt + VP8_PROB_COUNT_MV_OFFSET;
145*437bfbebSnyanmisaka         for (i = 0; i < 2; i++) {
146*437bfbebSnyanmisaka             left  = *p_tmp++;
147*437bfbebSnyanmisaka             right = *p_tmp++;
148*437bfbebSnyanmisaka 
149*437bfbebSnyanmisaka             p = calc_mvprob(left, right, entropy->old_mv_prob[i][0]);
150*437bfbebSnyanmisaka 
151*437bfbebSnyanmisaka             if (update_prob(mv_update_prob_tbl[i][0], left, right,
152*437bfbebSnyanmisaka                             entropy->old_mv_prob[i][0], p, 6))
153*437bfbebSnyanmisaka                 entropy->mv_prob[i][0] = p;
154*437bfbebSnyanmisaka 
155*437bfbebSnyanmisaka             right += left;
156*437bfbebSnyanmisaka             left = *p_tmp++;
157*437bfbebSnyanmisaka             right -= left - p_tmp[0];
158*437bfbebSnyanmisaka 
159*437bfbebSnyanmisaka             p = calc_mvprob(left, right, entropy->old_mv_prob[i][1]);
160*437bfbebSnyanmisaka             if (update_prob(mv_update_prob_tbl[i][1], left, right,
161*437bfbebSnyanmisaka                             entropy->old_mv_prob[i][1], p, 6))
162*437bfbebSnyanmisaka                 entropy->mv_prob[i][1] = p;
163*437bfbebSnyanmisaka 
164*437bfbebSnyanmisaka             for (j = 0; j < 2; j++) {
165*437bfbebSnyanmisaka                 left = *p_tmp++;
166*437bfbebSnyanmisaka                 right = *p_tmp++;
167*437bfbebSnyanmisaka                 p = calc_mvprob(left, right, entropy->old_mv_prob[i][4 + j]);
168*437bfbebSnyanmisaka                 if (update_prob(mv_update_prob_tbl[i][4 + j], left, right,
169*437bfbebSnyanmisaka                                 entropy->old_mv_prob[i][4 + j], p, 6))
170*437bfbebSnyanmisaka                     entropy->mv_prob[i][4 + j] = p;
171*437bfbebSnyanmisaka                 branch_cnt[j] = left + right;
172*437bfbebSnyanmisaka             }
173*437bfbebSnyanmisaka 
174*437bfbebSnyanmisaka             p = calc_mvprob(branch_cnt[0], branch_cnt[1], entropy->old_mv_prob[i][3]);
175*437bfbebSnyanmisaka             if (update_prob(mv_update_prob_tbl[i][3], branch_cnt[0], branch_cnt[1],
176*437bfbebSnyanmisaka                             entropy->old_mv_prob[i][3], p, 6))
177*437bfbebSnyanmisaka                 entropy->mv_prob[i][3] = p;
178*437bfbebSnyanmisaka 
179*437bfbebSnyanmisaka             type = branch_cnt[0] + branch_cnt[1];
180*437bfbebSnyanmisaka 
181*437bfbebSnyanmisaka             for (j = 0; j < 2; j++) {
182*437bfbebSnyanmisaka                 left = *p_tmp++;
183*437bfbebSnyanmisaka                 right = *p_tmp++;
184*437bfbebSnyanmisaka                 p = calc_mvprob(left, right, entropy->old_mv_prob[i][7 + j]);
185*437bfbebSnyanmisaka                 if (update_prob(mv_update_prob_tbl[i][7 + j], left, right,
186*437bfbebSnyanmisaka                                 entropy->old_mv_prob[i][7 + j], p, 6))
187*437bfbebSnyanmisaka                     entropy->mv_prob[i][7 + j] = p;
188*437bfbebSnyanmisaka                 branch_cnt[j] = left + right;
189*437bfbebSnyanmisaka             }
190*437bfbebSnyanmisaka 
191*437bfbebSnyanmisaka             p = calc_mvprob(branch_cnt[0], branch_cnt[1], entropy->old_mv_prob[i][6]);
192*437bfbebSnyanmisaka             if (update_prob(mv_update_prob_tbl[i][6], branch_cnt[0], branch_cnt[1],
193*437bfbebSnyanmisaka                             entropy->old_mv_prob[i][6], p, 6))
194*437bfbebSnyanmisaka                 entropy->mv_prob[i][6] = p;
195*437bfbebSnyanmisaka 
196*437bfbebSnyanmisaka             p = calc_mvprob(type, branch_cnt[0] + branch_cnt[1],
197*437bfbebSnyanmisaka                             entropy->old_mv_prob[i][2]);
198*437bfbebSnyanmisaka             if (update_prob(mv_update_prob_tbl[i][2], type, branch_cnt[0] + branch_cnt[1],
199*437bfbebSnyanmisaka                             entropy->old_mv_prob[i][2], p, 6))
200*437bfbebSnyanmisaka                 entropy->mv_prob[i][2] = p;
201*437bfbebSnyanmisaka         }
202*437bfbebSnyanmisaka     }
203*437bfbebSnyanmisaka     {
204*437bfbebSnyanmisaka         entropy->last_prob = 255;
205*437bfbebSnyanmisaka         entropy->gf_prob = 128;
206*437bfbebSnyanmisaka         memcpy(entropy->y_mode_prob, y_mode_prob_tbl, sizeof(y_mode_prob_tbl));
207*437bfbebSnyanmisaka         memcpy(entropy->uv_mode_prob, uv_mode_prob_tbl, sizeof(uv_mode_prob_tbl));
208*437bfbebSnyanmisaka     }
209*437bfbebSnyanmisaka     return MPP_OK;
210*437bfbebSnyanmisaka }
211*437bfbebSnyanmisaka 
vp8e_swap_endian(RK_U32 * buf,RK_U32 bytes)212*437bfbebSnyanmisaka MPP_RET vp8e_swap_endian(RK_U32 *buf, RK_U32 bytes)
213*437bfbebSnyanmisaka {
214*437bfbebSnyanmisaka     RK_U32 i = 0;
215*437bfbebSnyanmisaka     RK_S32 words = bytes / 4;
216*437bfbebSnyanmisaka 
217*437bfbebSnyanmisaka     while (words > 0) {
218*437bfbebSnyanmisaka         RK_U32 val = buf[i];
219*437bfbebSnyanmisaka         RK_U32 tmp = 0;
220*437bfbebSnyanmisaka 
221*437bfbebSnyanmisaka         tmp |= (val & 0xFF) << 24;
222*437bfbebSnyanmisaka         tmp |= (val & 0xFF00) << 8;
223*437bfbebSnyanmisaka         tmp |= (val & 0xFF0000) >> 8;
224*437bfbebSnyanmisaka         tmp |= (val & 0xFF000000) >> 24;
225*437bfbebSnyanmisaka 
226*437bfbebSnyanmisaka         {
227*437bfbebSnyanmisaka             RK_U32 val2 = buf[i + 1];
228*437bfbebSnyanmisaka             RK_U32 tmp2 = 0;
229*437bfbebSnyanmisaka 
230*437bfbebSnyanmisaka             tmp2 |= (val2 & 0xFF) << 24;
231*437bfbebSnyanmisaka             tmp2 |= (val2 & 0xFF00) << 8;
232*437bfbebSnyanmisaka             tmp2 |= (val2 & 0xFF0000) >> 8;
233*437bfbebSnyanmisaka             tmp2 |= (val2 & 0xFF000000) >> 24;
234*437bfbebSnyanmisaka 
235*437bfbebSnyanmisaka             buf[i] = tmp2;
236*437bfbebSnyanmisaka             words--;
237*437bfbebSnyanmisaka             i++;
238*437bfbebSnyanmisaka         }
239*437bfbebSnyanmisaka 
240*437bfbebSnyanmisaka         buf[i] = tmp;
241*437bfbebSnyanmisaka         words--;
242*437bfbebSnyanmisaka         i++;
243*437bfbebSnyanmisaka     }
244*437bfbebSnyanmisaka     return MPP_OK;
245*437bfbebSnyanmisaka }
246*437bfbebSnyanmisaka 
247*437bfbebSnyanmisaka 
vp8e_write_entropy_tables(void * hal)248*437bfbebSnyanmisaka MPP_RET vp8e_write_entropy_tables(void *hal)
249*437bfbebSnyanmisaka {
250*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
251*437bfbebSnyanmisaka 
252*437bfbebSnyanmisaka     Vp8eVpuBuf *buffers = (Vp8eVpuBuf *)ctx->buffers;
253*437bfbebSnyanmisaka     Vp8eHalEntropy *entropy = &ctx->entropy;
254*437bfbebSnyanmisaka 
255*437bfbebSnyanmisaka     RK_U8 *table = (RK_U8 *)mpp_buffer_get_ptr(buffers->hw_cabac_table_buf);
256*437bfbebSnyanmisaka     /* Write probability tables to ASIC linear memory, reg + mem */
257*437bfbebSnyanmisaka     memset(table, 0, 56);  // use 56 bytes
258*437bfbebSnyanmisaka     table[0] = entropy->skip_false_prob;
259*437bfbebSnyanmisaka     table[1] = entropy->intra_prob;
260*437bfbebSnyanmisaka     table[2] = entropy->last_prob;
261*437bfbebSnyanmisaka     table[3] = entropy->gf_prob;
262*437bfbebSnyanmisaka     table[4] = entropy->segment_prob[0];
263*437bfbebSnyanmisaka     table[5] = entropy->segment_prob[1];
264*437bfbebSnyanmisaka     table[6] = entropy->segment_prob[2];
265*437bfbebSnyanmisaka 
266*437bfbebSnyanmisaka     table[8]  = entropy->y_mode_prob[0];
267*437bfbebSnyanmisaka     table[9]  = entropy->y_mode_prob[1];
268*437bfbebSnyanmisaka     table[10] = entropy->y_mode_prob[2];
269*437bfbebSnyanmisaka     table[11] = entropy->y_mode_prob[3];
270*437bfbebSnyanmisaka     table[12] = entropy->uv_mode_prob[0];
271*437bfbebSnyanmisaka     table[13] = entropy->uv_mode_prob[1];
272*437bfbebSnyanmisaka     table[14] = entropy->uv_mode_prob[2];
273*437bfbebSnyanmisaka 
274*437bfbebSnyanmisaka     /* MV probabilities x+y: short, sign, size 8-9 */
275*437bfbebSnyanmisaka     table[16] = entropy->mv_prob[1][0];
276*437bfbebSnyanmisaka     table[17] = entropy->mv_prob[0][0];
277*437bfbebSnyanmisaka     table[18] = entropy->mv_prob[1][1];
278*437bfbebSnyanmisaka     table[19] = entropy->mv_prob[0][1];
279*437bfbebSnyanmisaka     table[20] = entropy->mv_prob[1][17];
280*437bfbebSnyanmisaka     table[21] = entropy->mv_prob[1][18];
281*437bfbebSnyanmisaka     table[22] = entropy->mv_prob[0][17];
282*437bfbebSnyanmisaka     table[23] = entropy->mv_prob[0][18];
283*437bfbebSnyanmisaka     {
284*437bfbebSnyanmisaka         RK_S32 i, j, k, l;
285*437bfbebSnyanmisaka         /* MV X size */
286*437bfbebSnyanmisaka         for (i = 0; i < 8; i++)
287*437bfbebSnyanmisaka             table[24 + i] = entropy->mv_prob[1][9 + i];
288*437bfbebSnyanmisaka 
289*437bfbebSnyanmisaka         /* MV Y size */
290*437bfbebSnyanmisaka         for (i = 0; i < 8; i++)
291*437bfbebSnyanmisaka             table[32 + i] = entropy->mv_prob[0][9 + i];
292*437bfbebSnyanmisaka 
293*437bfbebSnyanmisaka         /* MV X short tree */
294*437bfbebSnyanmisaka         for (i = 0; i < 7; i++)
295*437bfbebSnyanmisaka             table[40 + i] = entropy->mv_prob[1][2 + i];
296*437bfbebSnyanmisaka 
297*437bfbebSnyanmisaka         /* MV Y short tree */
298*437bfbebSnyanmisaka         for (i = 0; i < 7; i++)
299*437bfbebSnyanmisaka             table[48 + i] = entropy->mv_prob[0][2 + i];
300*437bfbebSnyanmisaka 
301*437bfbebSnyanmisaka         /* Update the ASIC table when needed. */
302*437bfbebSnyanmisaka         if (entropy->update_coeff_prob_flag) {
303*437bfbebSnyanmisaka             table += 56;
304*437bfbebSnyanmisaka             /* DCT coeff probabilities 0-2, two fields per line. */
305*437bfbebSnyanmisaka             for (i = 0; i < 4; i++)
306*437bfbebSnyanmisaka                 for (j = 0; j < 8; j++)
307*437bfbebSnyanmisaka                     for (k = 0; k < 3; k++) {
308*437bfbebSnyanmisaka                         for (l = 0; l < 3; l++) {
309*437bfbebSnyanmisaka                             *table++ = entropy->coeff_prob[i][j][k][l];
310*437bfbebSnyanmisaka                         }
311*437bfbebSnyanmisaka                         *table++ = 0;
312*437bfbebSnyanmisaka                     }
313*437bfbebSnyanmisaka 
314*437bfbebSnyanmisaka             /* ASIC second probability table in ext mem.
315*437bfbebSnyanmisaka              * DCT coeff probabilities 4 5 6 7 8 9 10 3 on each line.
316*437bfbebSnyanmisaka              * coeff 3 was moved from first table to second so it is last. */
317*437bfbebSnyanmisaka             for (i = 0; i < 4; i++)
318*437bfbebSnyanmisaka                 for (j = 0; j < 8; j++)
319*437bfbebSnyanmisaka                     for (k = 0; k < 3; k++) {
320*437bfbebSnyanmisaka                         for (l = 4; l < 11; l++) {
321*437bfbebSnyanmisaka                             *table++ = entropy->coeff_prob[i][j][k][l];
322*437bfbebSnyanmisaka                         }
323*437bfbebSnyanmisaka                         *table++ = entropy->coeff_prob[i][j][k][3];
324*437bfbebSnyanmisaka                     }
325*437bfbebSnyanmisaka         }
326*437bfbebSnyanmisaka     }
327*437bfbebSnyanmisaka     table = mpp_buffer_get_ptr(buffers->hw_cabac_table_buf);
328*437bfbebSnyanmisaka     if (entropy->update_coeff_prob_flag)
329*437bfbebSnyanmisaka         vp8e_swap_endian((RK_U32 *) table, 56 + 8 * 48 + 8 * 96);
330*437bfbebSnyanmisaka     else
331*437bfbebSnyanmisaka         vp8e_swap_endian((RK_U32 *) table, 56);
332*437bfbebSnyanmisaka 
333*437bfbebSnyanmisaka     mpp_buffer_sync_end(buffers->hw_cabac_table_buf);
334*437bfbebSnyanmisaka 
335*437bfbebSnyanmisaka     return MPP_OK;
336*437bfbebSnyanmisaka }
337*437bfbebSnyanmisaka 
vp8e_calc_cost_mv(RK_S32 mvd,RK_S32 * mv_prob)338*437bfbebSnyanmisaka RK_S32 vp8e_calc_cost_mv(RK_S32 mvd, RK_S32 *mv_prob)
339*437bfbebSnyanmisaka {
340*437bfbebSnyanmisaka     RK_S32 i = 0;
341*437bfbebSnyanmisaka     RK_S32 bit_cost = 0;
342*437bfbebSnyanmisaka 
343*437bfbebSnyanmisaka     RK_S32 tmp = MPP_ABS(mvd >> 1);
344*437bfbebSnyanmisaka 
345*437bfbebSnyanmisaka     if (tmp < 8) {
346*437bfbebSnyanmisaka         bit_cost += COST_BOOL(mv_prob[0], 0);
347*437bfbebSnyanmisaka         bit_cost += get_cost_tree(&mv_tree_tbl[tmp], mv_prob + 2);
348*437bfbebSnyanmisaka         if (!tmp)
349*437bfbebSnyanmisaka             return bit_cost;
350*437bfbebSnyanmisaka 
351*437bfbebSnyanmisaka         /* Sign */
352*437bfbebSnyanmisaka         bit_cost += COST_BOOL(mv_prob[1], mvd < 0);
353*437bfbebSnyanmisaka         return bit_cost;
354*437bfbebSnyanmisaka     }
355*437bfbebSnyanmisaka 
356*437bfbebSnyanmisaka     bit_cost += COST_BOOL(mv_prob[0], 1);
357*437bfbebSnyanmisaka 
358*437bfbebSnyanmisaka     for (i = 0; i < 3; i++) {
359*437bfbebSnyanmisaka         bit_cost += COST_BOOL(mv_prob[9 + i], (tmp >> i) & 1);
360*437bfbebSnyanmisaka     }
361*437bfbebSnyanmisaka 
362*437bfbebSnyanmisaka     for (i = 9; i > 3; i--) {
363*437bfbebSnyanmisaka         bit_cost += COST_BOOL(mv_prob[9 + i], (tmp >> i) & 1);
364*437bfbebSnyanmisaka     }
365*437bfbebSnyanmisaka 
366*437bfbebSnyanmisaka     if (tmp > 15) {
367*437bfbebSnyanmisaka         bit_cost += COST_BOOL(mv_prob[9 + 3], (tmp >> 3) & 1);
368*437bfbebSnyanmisaka     }
369*437bfbebSnyanmisaka 
370*437bfbebSnyanmisaka     bit_cost += COST_BOOL(mv_prob[1], mvd < 0);
371*437bfbebSnyanmisaka 
372*437bfbebSnyanmisaka     return bit_cost;
373*437bfbebSnyanmisaka }
374*437bfbebSnyanmisaka 
vp8e_calc_coeff_prob(Vp8ePutBitBuf * bitbuf,RK_S32 (* curr)[4][8][3][11],RK_S32 (* prev)[4][8][3][11])375*437bfbebSnyanmisaka MPP_RET vp8e_calc_coeff_prob(Vp8ePutBitBuf *bitbuf, RK_S32 (*curr)[4][8][3][11],
376*437bfbebSnyanmisaka                              RK_S32 (*prev)[4][8][3][11])
377*437bfbebSnyanmisaka {
378*437bfbebSnyanmisaka     RK_S32 i, j, k, l;
379*437bfbebSnyanmisaka     RK_S32 prob, new, old;
380*437bfbebSnyanmisaka 
381*437bfbebSnyanmisaka     for (i = 0; i < 4; i++) {
382*437bfbebSnyanmisaka         for (j = 0; j < 8; j++) {
383*437bfbebSnyanmisaka             for (k = 0; k < 3; k++) {
384*437bfbebSnyanmisaka                 for (l = 0; l < 11; l++) {
385*437bfbebSnyanmisaka                     prob = coeff_update_prob_tbl[i][j][k][l];
386*437bfbebSnyanmisaka                     old = (RK_S32) (*prev)[i][j][k][l];
387*437bfbebSnyanmisaka                     new = (RK_S32) (*curr)[i][j][k][l];
388*437bfbebSnyanmisaka 
389*437bfbebSnyanmisaka                     if (new == old) {
390*437bfbebSnyanmisaka                         vp8e_put_bool(bitbuf, prob, 0);
391*437bfbebSnyanmisaka                     } else {
392*437bfbebSnyanmisaka                         vp8e_put_bool(bitbuf, prob, 1);
393*437bfbebSnyanmisaka                         vp8e_put_lit(bitbuf, new, 8);
394*437bfbebSnyanmisaka                     }
395*437bfbebSnyanmisaka                 }
396*437bfbebSnyanmisaka             }
397*437bfbebSnyanmisaka         }
398*437bfbebSnyanmisaka     }
399*437bfbebSnyanmisaka     return MPP_OK;
400*437bfbebSnyanmisaka }
401*437bfbebSnyanmisaka 
vp8e_calc_mv_prob(Vp8ePutBitBuf * bitbuf,RK_S32 (* curr)[2][19],RK_S32 (* prev)[2][19])402*437bfbebSnyanmisaka MPP_RET vp8e_calc_mv_prob(Vp8ePutBitBuf *bitbuf, RK_S32 (*curr)[2][19],
403*437bfbebSnyanmisaka                           RK_S32 (*prev)[2][19])
404*437bfbebSnyanmisaka {
405*437bfbebSnyanmisaka     RK_S32 i, j;
406*437bfbebSnyanmisaka     RK_S32 prob, new, old;
407*437bfbebSnyanmisaka 
408*437bfbebSnyanmisaka     for (i = 0; i < 2; i++) {
409*437bfbebSnyanmisaka         for (j = 0; j < 19; j++) {
410*437bfbebSnyanmisaka             prob = mv_update_prob_tbl[i][j];
411*437bfbebSnyanmisaka             old = (RK_S32) (*prev)[i][j];
412*437bfbebSnyanmisaka             new = (RK_S32) (*curr)[i][j];
413*437bfbebSnyanmisaka 
414*437bfbebSnyanmisaka             if (new == old) {
415*437bfbebSnyanmisaka                 vp8e_put_bool(bitbuf, prob, 0);
416*437bfbebSnyanmisaka             } else {
417*437bfbebSnyanmisaka                 vp8e_put_bool(bitbuf, prob, 1);
418*437bfbebSnyanmisaka                 vp8e_put_lit(bitbuf, new >> 1, 7);
419*437bfbebSnyanmisaka             }
420*437bfbebSnyanmisaka         }
421*437bfbebSnyanmisaka     }
422*437bfbebSnyanmisaka     return MPP_OK;
423*437bfbebSnyanmisaka }
424