xref: /rockchip-linux_mpp/mpp/hal/vpu/vp8e/hal_vp8e_base.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2017 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #define MODULE_TAG "hal_vp8e_base"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #include "mpp_mem.h"
22*437bfbebSnyanmisaka #include "mpp_buffer.h"
23*437bfbebSnyanmisaka #include "mpp_common.h"
24*437bfbebSnyanmisaka 
25*437bfbebSnyanmisaka #include "hal_vp8e_base.h"
26*437bfbebSnyanmisaka #include "hal_vp8e_putbit.h"
27*437bfbebSnyanmisaka #include "hal_vp8e_table.h"
28*437bfbebSnyanmisaka #include "hal_vp8e_debug.h"
29*437bfbebSnyanmisaka 
set_frame_params(void * hal)30*437bfbebSnyanmisaka static MPP_RET set_frame_params(void *hal)
31*437bfbebSnyanmisaka {
32*437bfbebSnyanmisaka 
33*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
34*437bfbebSnyanmisaka     {
35*437bfbebSnyanmisaka         RK_S32 i;
36*437bfbebSnyanmisaka         Pps *pps = ctx->ppss.pps;
37*437bfbebSnyanmisaka         Vp8eSps *sps = &ctx->sps;
38*437bfbebSnyanmisaka 
39*437bfbebSnyanmisaka         for (i = 0; i < 4; i++) {
40*437bfbebSnyanmisaka             pps->qp_sgm[i] = ctx->rc->qp_hdr;
41*437bfbebSnyanmisaka             pps->level_sgm[i] = sps->filter_level;
42*437bfbebSnyanmisaka         }
43*437bfbebSnyanmisaka     }
44*437bfbebSnyanmisaka 
45*437bfbebSnyanmisaka     return MPP_OK;
46*437bfbebSnyanmisaka }
47*437bfbebSnyanmisaka 
set_filter(void * hal)48*437bfbebSnyanmisaka static MPP_RET set_filter(void *hal)
49*437bfbebSnyanmisaka {
50*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
51*437bfbebSnyanmisaka     Vp8eSps *sps = &ctx->sps;
52*437bfbebSnyanmisaka 
53*437bfbebSnyanmisaka     if (sps->auto_filter_level) {
54*437bfbebSnyanmisaka         RK_U32 qp = 36;
55*437bfbebSnyanmisaka         Pps *p_pps = ctx->ppss.pps;
56*437bfbebSnyanmisaka         if (ctx->frame_type == VP8E_FRM_KEY) {
57*437bfbebSnyanmisaka             RK_S32 tmp = (qp * 64) / 128 + 8;
58*437bfbebSnyanmisaka             sps->filter_level = MPP_CLIP3(0, 63, tmp);
59*437bfbebSnyanmisaka             p_pps->level_sgm[0] = MPP_CLIP3(0, 63, (p_pps->qp_sgm[0] * 64) / 128 + 8);
60*437bfbebSnyanmisaka             p_pps->level_sgm[1] = MPP_CLIP3(0, 63, (p_pps->qp_sgm[1] * 64) / 128 + 8);
61*437bfbebSnyanmisaka             p_pps->level_sgm[2] = MPP_CLIP3(0, 63, (p_pps->qp_sgm[2] * 64) / 128 + 8);
62*437bfbebSnyanmisaka             p_pps->level_sgm[3] = MPP_CLIP3(0, 63, (p_pps->qp_sgm[3] * 64) / 128 + 8);
63*437bfbebSnyanmisaka         } else {
64*437bfbebSnyanmisaka             sps->filter_level = inter_level_tbl[qp];
65*437bfbebSnyanmisaka             p_pps->level_sgm[0] = inter_level_tbl[p_pps->qp_sgm[0]];
66*437bfbebSnyanmisaka             p_pps->level_sgm[1] = inter_level_tbl[p_pps->qp_sgm[1]];
67*437bfbebSnyanmisaka             p_pps->level_sgm[2] = inter_level_tbl[p_pps->qp_sgm[2]];
68*437bfbebSnyanmisaka             p_pps->level_sgm[3] = inter_level_tbl[p_pps->qp_sgm[3]];
69*437bfbebSnyanmisaka         }
70*437bfbebSnyanmisaka     }
71*437bfbebSnyanmisaka 
72*437bfbebSnyanmisaka     if (sps->auto_filter_sharpness) {
73*437bfbebSnyanmisaka         sps->filter_sharpness = 0;
74*437bfbebSnyanmisaka     }
75*437bfbebSnyanmisaka 
76*437bfbebSnyanmisaka     if (!sps->filter_delta_enable)
77*437bfbebSnyanmisaka         return MPP_NOK;
78*437bfbebSnyanmisaka 
79*437bfbebSnyanmisaka     if (sps->filter_delta_enable == 2) {
80*437bfbebSnyanmisaka         sps->filter_delta_enable = 1;
81*437bfbebSnyanmisaka         return MPP_NOK;
82*437bfbebSnyanmisaka     }
83*437bfbebSnyanmisaka 
84*437bfbebSnyanmisaka     if (sps->filter_level == 0) {
85*437bfbebSnyanmisaka         sps->ref_delta[0] =  0;      /* Intra frame */
86*437bfbebSnyanmisaka         sps->ref_delta[1] =  0;      /* Last frame */
87*437bfbebSnyanmisaka         sps->ref_delta[2] =  0;      /* Golden frame */
88*437bfbebSnyanmisaka         sps->ref_delta[3] =  0;      /* Altref frame */
89*437bfbebSnyanmisaka         sps->mode_delta[0] = 0;      /* BPRED */
90*437bfbebSnyanmisaka         sps->mode_delta[1] = 0;      /* Zero */
91*437bfbebSnyanmisaka         sps->mode_delta[2] = 0;      /* New mv */
92*437bfbebSnyanmisaka         sps->mode_delta[3] = 0;      /* Split mv */
93*437bfbebSnyanmisaka         return MPP_NOK;
94*437bfbebSnyanmisaka     }
95*437bfbebSnyanmisaka 
96*437bfbebSnyanmisaka     if (!ctx->picbuf.cur_pic->ipf && !ctx->picbuf.cur_pic->grf &&
97*437bfbebSnyanmisaka         !ctx->picbuf.cur_pic->arf) {
98*437bfbebSnyanmisaka         memcpy(sps->ref_delta, sps->old_ref_delta, sizeof(sps->ref_delta));
99*437bfbebSnyanmisaka         memcpy(sps->mode_delta, sps->old_mode_delta, sizeof(sps->mode_delta));
100*437bfbebSnyanmisaka         return MPP_NOK;
101*437bfbebSnyanmisaka     }
102*437bfbebSnyanmisaka 
103*437bfbebSnyanmisaka     sps->ref_delta[0] =  2;      /* Intra frame */
104*437bfbebSnyanmisaka     sps->ref_delta[1] =  0;      /* Last frame */
105*437bfbebSnyanmisaka     sps->ref_delta[2] = -2;      /* Golden frame */
106*437bfbebSnyanmisaka     sps->ref_delta[3] = -2;      /* Altref frame */
107*437bfbebSnyanmisaka 
108*437bfbebSnyanmisaka     sps->mode_delta[0] =  4;     /* BPRED */
109*437bfbebSnyanmisaka     sps->mode_delta[1] = -2;     /* Zero */
110*437bfbebSnyanmisaka     sps->mode_delta[2] =  2;     /* New mv */
111*437bfbebSnyanmisaka     sps->mode_delta[3] =  4;     /* Split mv */
112*437bfbebSnyanmisaka 
113*437bfbebSnyanmisaka     {
114*437bfbebSnyanmisaka         RK_U32 i = 0;
115*437bfbebSnyanmisaka         for (i = 0; i < 4; i++) {
116*437bfbebSnyanmisaka             sps->ref_delta[i] = MPP_CLIP3(-0x3f, 0x3f, sps->ref_delta[i]);
117*437bfbebSnyanmisaka             sps->mode_delta[i] = MPP_CLIP3(-0x3f, 0x3f, sps->mode_delta[i]);
118*437bfbebSnyanmisaka         }
119*437bfbebSnyanmisaka     }
120*437bfbebSnyanmisaka     return MPP_OK;
121*437bfbebSnyanmisaka }
122*437bfbebSnyanmisaka 
set_segmentation(void * hal)123*437bfbebSnyanmisaka static MPP_RET set_segmentation(void *hal)
124*437bfbebSnyanmisaka {
125*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
126*437bfbebSnyanmisaka 
127*437bfbebSnyanmisaka     Vp8ePps *ppss = &ctx->ppss;
128*437bfbebSnyanmisaka     Pps *pps = ppss->pps;
129*437bfbebSnyanmisaka     Vp8eHwCfg *hw_cfg = &ctx->hw_cfg;
130*437bfbebSnyanmisaka     Vp8eVpuBuf *buffers = (Vp8eVpuBuf *)ctx->buffers;
131*437bfbebSnyanmisaka 
132*437bfbebSnyanmisaka     {
133*437bfbebSnyanmisaka         RK_S32 qp = ctx->rc->qp_hdr;
134*437bfbebSnyanmisaka 
135*437bfbebSnyanmisaka         if (hw_cfg->roi1_delta_qp)
136*437bfbebSnyanmisaka             pps->qp_sgm[1] = MPP_CLIP3(0, 127, qp - hw_cfg->roi1_delta_qp);
137*437bfbebSnyanmisaka 
138*437bfbebSnyanmisaka         if (hw_cfg->roi2_delta_qp)
139*437bfbebSnyanmisaka             pps->qp_sgm[2] = MPP_CLIP3(0, 127, qp - hw_cfg->roi2_delta_qp);
140*437bfbebSnyanmisaka     }
141*437bfbebSnyanmisaka 
142*437bfbebSnyanmisaka     {
143*437bfbebSnyanmisaka         RK_U32 x, y, mb, mask, id;
144*437bfbebSnyanmisaka         RK_U32 *map = mpp_buffer_get_ptr(buffers->hw_segment_map_buf);
145*437bfbebSnyanmisaka         RK_U32 *map_bck = map;
146*437bfbebSnyanmisaka         RK_U32 mapSize = (ctx->mb_per_frame + 15) / 16 * 8;
147*437bfbebSnyanmisaka 
148*437bfbebSnyanmisaka         mpp_buffer_sync_begin(buffers->hw_segment_map_buf);
149*437bfbebSnyanmisaka 
150*437bfbebSnyanmisaka         if (hw_cfg->roi1_delta_qp || hw_cfg->roi2_delta_qp) {
151*437bfbebSnyanmisaka             pps->segment_enabled = 1;
152*437bfbebSnyanmisaka 
153*437bfbebSnyanmisaka             memset(pps->sgm.id_cnt, 0, sizeof(pps->sgm.id_cnt));
154*437bfbebSnyanmisaka 
155*437bfbebSnyanmisaka             for (y = 0, mb = 0, mask = 0; y < ctx->mb_per_col; y++) {
156*437bfbebSnyanmisaka                 for (x = 0; x < ctx->mb_per_row; x++) {
157*437bfbebSnyanmisaka                     id = 0;
158*437bfbebSnyanmisaka                     if ((x >= hw_cfg->roi1_left) && (x <= hw_cfg->roi1_right) &&
159*437bfbebSnyanmisaka                         (y >= hw_cfg->roi1_top) && (y <= hw_cfg->roi1_bottom))
160*437bfbebSnyanmisaka                         id = 1;
161*437bfbebSnyanmisaka                     if ((x >= hw_cfg->roi1_left) && (x <= hw_cfg->roi2_right) &&
162*437bfbebSnyanmisaka                         (y >= hw_cfg->roi2_top) && (y <= hw_cfg->roi2_bottom))
163*437bfbebSnyanmisaka                         id = 2;
164*437bfbebSnyanmisaka 
165*437bfbebSnyanmisaka                     pps->sgm.id_cnt[id]++;
166*437bfbebSnyanmisaka 
167*437bfbebSnyanmisaka                     mask |= id << (28 - 4 * (mb % 8));
168*437bfbebSnyanmisaka                     if ((mb % 8) == 7) {
169*437bfbebSnyanmisaka                         *map++ = mask;
170*437bfbebSnyanmisaka                         mask = 0;
171*437bfbebSnyanmisaka                     }
172*437bfbebSnyanmisaka                     mb++;
173*437bfbebSnyanmisaka                 }
174*437bfbebSnyanmisaka             }
175*437bfbebSnyanmisaka             *map++ = mask;
176*437bfbebSnyanmisaka             vp8e_swap_endian(map_bck, mapSize);
177*437bfbebSnyanmisaka         } else if (pps->segment_enabled && pps->sgm.map_modified) {
178*437bfbebSnyanmisaka             memset(pps->sgm.id_cnt, 0, sizeof(pps->sgm.id_cnt));
179*437bfbebSnyanmisaka 
180*437bfbebSnyanmisaka             for (mb = 0, mask = 0; mb < mapSize / 4; mb++) {
181*437bfbebSnyanmisaka                 mask = map[mb];
182*437bfbebSnyanmisaka                 for (x = 0; x < 8; x++) {
183*437bfbebSnyanmisaka                     if (mb * 8 + x < ctx->mb_per_frame) {
184*437bfbebSnyanmisaka                         id = (mask >> (28 - 4 * x)) & 0xF;
185*437bfbebSnyanmisaka                         pps->sgm.id_cnt[id]++;
186*437bfbebSnyanmisaka                     }
187*437bfbebSnyanmisaka                 }
188*437bfbebSnyanmisaka             }
189*437bfbebSnyanmisaka             vp8e_swap_endian(map_bck, mapSize);
190*437bfbebSnyanmisaka         }
191*437bfbebSnyanmisaka 
192*437bfbebSnyanmisaka         mpp_buffer_sync_end(buffers->hw_segment_map_buf);
193*437bfbebSnyanmisaka     }
194*437bfbebSnyanmisaka     if (ctx->picbuf.cur_pic->i_frame || !pps->segment_enabled) {
195*437bfbebSnyanmisaka         memset(ppss->qp_sgm, 0xff, sizeof(ppss->qp_sgm));
196*437bfbebSnyanmisaka         memset(ppss->level_sgm, 0xff, sizeof(ppss->level_sgm));
197*437bfbebSnyanmisaka         ppss->prev_pps = NULL;
198*437bfbebSnyanmisaka     } else
199*437bfbebSnyanmisaka         ppss->prev_pps = ppss->pps;
200*437bfbebSnyanmisaka 
201*437bfbebSnyanmisaka     return MPP_OK;
202*437bfbebSnyanmisaka }
203*437bfbebSnyanmisaka 
set_intra_pred_penalties(Vp8eHwCfg * hw_cfg,RK_U32 qp)204*437bfbebSnyanmisaka static void set_intra_pred_penalties(Vp8eHwCfg *hw_cfg, RK_U32 qp)
205*437bfbebSnyanmisaka {
206*437bfbebSnyanmisaka     RK_S32 i, tmp;
207*437bfbebSnyanmisaka 
208*437bfbebSnyanmisaka     /* Intra 4x4 mode */
209*437bfbebSnyanmisaka     tmp = qp * 2 + 8;
210*437bfbebSnyanmisaka     for (i = 0; i < 10; i++) {
211*437bfbebSnyanmisaka         hw_cfg->intra_b_mode_penalty[i] = (intra4_mode_tree_penalty_tbl[i] * tmp) >> 8;
212*437bfbebSnyanmisaka     }
213*437bfbebSnyanmisaka 
214*437bfbebSnyanmisaka     /* Intra 16x16 mode */
215*437bfbebSnyanmisaka     tmp = qp * 2 + 64;
216*437bfbebSnyanmisaka     for (i = 0; i < 4; i++) {
217*437bfbebSnyanmisaka         hw_cfg->intra_mode_penalty[i] = (intra16_mode_tree_penalty_tbl[i] * tmp) >> 8;
218*437bfbebSnyanmisaka     }
219*437bfbebSnyanmisaka 
220*437bfbebSnyanmisaka     /* If favor has not been set earlier by testId use default */
221*437bfbebSnyanmisaka     if (hw_cfg->intra_16_favor == -1)
222*437bfbebSnyanmisaka         hw_cfg->intra_16_favor = qp * 1024 / 128;
223*437bfbebSnyanmisaka }
224*437bfbebSnyanmisaka 
set_hdr_segmentation(Vp8ePutBitBuf * bitbuf,Vp8ePps * ppss,Vp8eHalEntropy * entropy)225*437bfbebSnyanmisaka static void set_hdr_segmentation(Vp8ePutBitBuf *bitbuf, Vp8ePps *ppss,
226*437bfbebSnyanmisaka                                  Vp8eHalEntropy *entropy)
227*437bfbebSnyanmisaka {
228*437bfbebSnyanmisaka     RK_S32 i, tmp;
229*437bfbebSnyanmisaka     RK_U8 data_modified = 0;
230*437bfbebSnyanmisaka 
231*437bfbebSnyanmisaka     Pps  *pps = ppss->pps;
232*437bfbebSnyanmisaka     Sgm  *sgm = &ppss->pps->sgm;
233*437bfbebSnyanmisaka 
234*437bfbebSnyanmisaka     if (memcmp(ppss->qp_sgm, pps->qp_sgm, sizeof(ppss->qp_sgm)))
235*437bfbebSnyanmisaka         data_modified = 1;
236*437bfbebSnyanmisaka 
237*437bfbebSnyanmisaka     if (memcmp(ppss->level_sgm, pps->level_sgm, sizeof(ppss->level_sgm)))
238*437bfbebSnyanmisaka         data_modified = 1;
239*437bfbebSnyanmisaka 
240*437bfbebSnyanmisaka     if (!ppss->prev_pps) {
241*437bfbebSnyanmisaka         sgm->map_modified = 1;
242*437bfbebSnyanmisaka     }
243*437bfbebSnyanmisaka 
244*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, sgm->map_modified, 1);
245*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, data_modified, 1);
246*437bfbebSnyanmisaka 
247*437bfbebSnyanmisaka     if (data_modified) {
248*437bfbebSnyanmisaka         vp8e_put_lit(bitbuf, 1, 1);
249*437bfbebSnyanmisaka 
250*437bfbebSnyanmisaka         for (i = 0; i < SGM_CNT; i++) {
251*437bfbebSnyanmisaka             tmp = pps->qp_sgm[i];
252*437bfbebSnyanmisaka             vp8e_put_lit(bitbuf, 1, 1);
253*437bfbebSnyanmisaka             vp8e_put_lit(bitbuf, MPP_ABS(tmp), 7);
254*437bfbebSnyanmisaka             vp8e_put_lit(bitbuf, tmp < 0, 1);
255*437bfbebSnyanmisaka         }
256*437bfbebSnyanmisaka 
257*437bfbebSnyanmisaka         for (i = 0; i < SGM_CNT; i++) {
258*437bfbebSnyanmisaka             tmp = pps->level_sgm[i];
259*437bfbebSnyanmisaka             vp8e_put_lit(bitbuf, 1, 1);
260*437bfbebSnyanmisaka             vp8e_put_lit(bitbuf, MPP_ABS(tmp), 6);
261*437bfbebSnyanmisaka             vp8e_put_lit(bitbuf, tmp < 0, 1);
262*437bfbebSnyanmisaka         }
263*437bfbebSnyanmisaka     }
264*437bfbebSnyanmisaka 
265*437bfbebSnyanmisaka     if (sgm->map_modified) {
266*437bfbebSnyanmisaka         RK_S32 sum1 = sgm->id_cnt[0] + sgm->id_cnt[1];
267*437bfbebSnyanmisaka         RK_S32 sum2 = sgm->id_cnt[2] + sgm->id_cnt[3];
268*437bfbebSnyanmisaka 
269*437bfbebSnyanmisaka         tmp = 255 * sum1 / (sum1 + sum2);
270*437bfbebSnyanmisaka         entropy->segment_prob[0] = MPP_CLIP3(1, 255, tmp);
271*437bfbebSnyanmisaka 
272*437bfbebSnyanmisaka         tmp = sum1 ? 255 * sgm->id_cnt[0] / sum1 : 255;
273*437bfbebSnyanmisaka         entropy->segment_prob[1] = MPP_CLIP3(1, 255, tmp);
274*437bfbebSnyanmisaka 
275*437bfbebSnyanmisaka         tmp = sum2 ? 255 * sgm->id_cnt[2] / sum2 : 255;
276*437bfbebSnyanmisaka         entropy->segment_prob[2] = MPP_CLIP3(1, 255, tmp);
277*437bfbebSnyanmisaka 
278*437bfbebSnyanmisaka         for (i = 0; i < 3; i++) {
279*437bfbebSnyanmisaka             if (sgm->id_cnt[i] != 0) {
280*437bfbebSnyanmisaka                 vp8e_put_lit(bitbuf, 1, 1);
281*437bfbebSnyanmisaka                 vp8e_put_lit(bitbuf, entropy->segment_prob[i], 8);
282*437bfbebSnyanmisaka             } else {
283*437bfbebSnyanmisaka                 vp8e_put_lit(bitbuf, 0, 1);
284*437bfbebSnyanmisaka             }
285*437bfbebSnyanmisaka         }
286*437bfbebSnyanmisaka     }
287*437bfbebSnyanmisaka 
288*437bfbebSnyanmisaka     memcpy(ppss->qp_sgm, pps->qp_sgm, sizeof(ppss->qp_sgm));
289*437bfbebSnyanmisaka     memcpy(ppss->level_sgm, pps->level_sgm, sizeof(ppss->level_sgm));
290*437bfbebSnyanmisaka }
291*437bfbebSnyanmisaka 
set_filter_level_delta(Vp8ePutBitBuf * bitbuf,Vp8eSps * sps)292*437bfbebSnyanmisaka static void set_filter_level_delta(Vp8ePutBitBuf *bitbuf, Vp8eSps *sps)
293*437bfbebSnyanmisaka {
294*437bfbebSnyanmisaka     RK_S32 i, tmp;
295*437bfbebSnyanmisaka     RK_U8  update = 0;
296*437bfbebSnyanmisaka     RK_S32 mode_update[4];
297*437bfbebSnyanmisaka     RK_S32 ref_update[4];
298*437bfbebSnyanmisaka 
299*437bfbebSnyanmisaka     for (i = 0; i < 4; i++) {
300*437bfbebSnyanmisaka         mode_update[i] = sps->mode_delta[i] != sps->old_mode_delta[i];
301*437bfbebSnyanmisaka         ref_update[i] = sps->ref_delta[i] != sps->old_ref_delta[i];
302*437bfbebSnyanmisaka         if (mode_update[i] || ref_update[i])
303*437bfbebSnyanmisaka             update = 1;
304*437bfbebSnyanmisaka     }
305*437bfbebSnyanmisaka 
306*437bfbebSnyanmisaka     if (!sps->refresh_entropy)
307*437bfbebSnyanmisaka         update = 1;
308*437bfbebSnyanmisaka 
309*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, update, 1);
310*437bfbebSnyanmisaka     if (!update)
311*437bfbebSnyanmisaka         return;
312*437bfbebSnyanmisaka 
313*437bfbebSnyanmisaka     for (i = 0; i < 4; i++) {
314*437bfbebSnyanmisaka         vp8e_put_lit(bitbuf, ref_update[i], 1);
315*437bfbebSnyanmisaka         if (ref_update[i]) {
316*437bfbebSnyanmisaka             tmp = sps->ref_delta[i];
317*437bfbebSnyanmisaka             vp8e_put_lit(bitbuf, MPP_ABS(tmp), 6);
318*437bfbebSnyanmisaka             vp8e_put_lit(bitbuf, tmp < 0, 1);
319*437bfbebSnyanmisaka         }
320*437bfbebSnyanmisaka     }
321*437bfbebSnyanmisaka 
322*437bfbebSnyanmisaka     for (i = 0; i < 4; i++) {
323*437bfbebSnyanmisaka         vp8e_put_lit(bitbuf, mode_update[i], 1);
324*437bfbebSnyanmisaka         if (mode_update[i]) {
325*437bfbebSnyanmisaka             tmp = sps->mode_delta[i];
326*437bfbebSnyanmisaka             vp8e_put_lit(bitbuf, MPP_ABS(tmp), 6);
327*437bfbebSnyanmisaka             vp8e_put_lit(bitbuf, tmp < 0, 1);
328*437bfbebSnyanmisaka         }
329*437bfbebSnyanmisaka     }
330*437bfbebSnyanmisaka 
331*437bfbebSnyanmisaka     memcpy(sps->old_ref_delta, sps->ref_delta, sizeof(sps->ref_delta));
332*437bfbebSnyanmisaka     memcpy(sps->old_mode_delta, sps->mode_delta, sizeof(sps->mode_delta));
333*437bfbebSnyanmisaka }
334*437bfbebSnyanmisaka 
set_frame_header(void * hal)335*437bfbebSnyanmisaka static MPP_RET set_frame_header(void *hal)
336*437bfbebSnyanmisaka {
337*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
338*437bfbebSnyanmisaka 
339*437bfbebSnyanmisaka     Vp8eSps *sps = &ctx->sps;
340*437bfbebSnyanmisaka     Pps *pps = ctx->ppss.pps;
341*437bfbebSnyanmisaka 
342*437bfbebSnyanmisaka     Vp8ePutBitBuf *bitbuf = &ctx->bitbuf[1];
343*437bfbebSnyanmisaka     HalVp8eRefPic  *cur_pic = ctx->picbuf.cur_pic;
344*437bfbebSnyanmisaka     Vp8eHalEntropy *entropy = &ctx->entropy;
345*437bfbebSnyanmisaka 
346*437bfbebSnyanmisaka     if (cur_pic->i_frame) {
347*437bfbebSnyanmisaka         vp8e_put_lit(bitbuf, sps->color_type, 1);
348*437bfbebSnyanmisaka 
349*437bfbebSnyanmisaka         vp8e_put_lit(bitbuf, sps->clamp_type, 1);
350*437bfbebSnyanmisaka     }
351*437bfbebSnyanmisaka 
352*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, pps->segment_enabled, 1);
353*437bfbebSnyanmisaka     if (pps->segment_enabled)
354*437bfbebSnyanmisaka         set_hdr_segmentation(bitbuf, &ctx->ppss, entropy);
355*437bfbebSnyanmisaka 
356*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, sps->filter_type, 1);
357*437bfbebSnyanmisaka 
358*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, sps->filter_level, 6);
359*437bfbebSnyanmisaka 
360*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, sps->filter_sharpness, 3);
361*437bfbebSnyanmisaka 
362*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, sps->filter_delta_enable, 1);
363*437bfbebSnyanmisaka     if (sps->filter_delta_enable) {
364*437bfbebSnyanmisaka         /* Filter level delta references reset by key frame */
365*437bfbebSnyanmisaka         if (cur_pic->i_frame) {
366*437bfbebSnyanmisaka             memset(sps->old_ref_delta, 0, sizeof(sps->ref_delta));
367*437bfbebSnyanmisaka             memset(sps->old_mode_delta, 0, sizeof(sps->mode_delta));
368*437bfbebSnyanmisaka         }
369*437bfbebSnyanmisaka         set_filter_level_delta(bitbuf, sps);
370*437bfbebSnyanmisaka     }
371*437bfbebSnyanmisaka 
372*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, sps->dct_partitions, 2);
373*437bfbebSnyanmisaka 
374*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, ctx->rc->qp_hdr, 7);
375*437bfbebSnyanmisaka 
376*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, 0, 1);
377*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, 0, 1);
378*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, 0, 1);
379*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, 0, 1);
380*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, 0, 1);
381*437bfbebSnyanmisaka 
382*437bfbebSnyanmisaka     if (!cur_pic->i_frame) {
383*437bfbebSnyanmisaka         HalVp8eRefPic  *ref_pic_list = ctx->picbuf.ref_pic_list;
384*437bfbebSnyanmisaka 
385*437bfbebSnyanmisaka         vp8e_put_lit(bitbuf, cur_pic->grf, 1); /* Grf refresh */
386*437bfbebSnyanmisaka         vp8e_put_lit(bitbuf, cur_pic->arf, 1); /* Arf refresh */
387*437bfbebSnyanmisaka 
388*437bfbebSnyanmisaka         if (!cur_pic->grf) {
389*437bfbebSnyanmisaka             if (ref_pic_list[0].grf) {
390*437bfbebSnyanmisaka                 vp8e_put_lit(bitbuf, 1, 2);    /* Ipf -> grf */
391*437bfbebSnyanmisaka             } else if (ref_pic_list[2].grf) {
392*437bfbebSnyanmisaka                 vp8e_put_lit(bitbuf, 2, 2);    /* Arf -> grf */
393*437bfbebSnyanmisaka             } else {
394*437bfbebSnyanmisaka                 vp8e_put_lit(bitbuf, 0, 2);    /* Not updated */
395*437bfbebSnyanmisaka             }
396*437bfbebSnyanmisaka         }
397*437bfbebSnyanmisaka 
398*437bfbebSnyanmisaka         if (!cur_pic->arf) {
399*437bfbebSnyanmisaka             if (ref_pic_list[0].arf) {
400*437bfbebSnyanmisaka                 vp8e_put_lit(bitbuf, 1, 2);    /* Ipf -> arf */
401*437bfbebSnyanmisaka             } else if (ref_pic_list[1].arf) {
402*437bfbebSnyanmisaka                 vp8e_put_lit(bitbuf, 2, 2);    /* Grf -> arf */
403*437bfbebSnyanmisaka             } else {
404*437bfbebSnyanmisaka                 vp8e_put_lit(bitbuf, 0, 2);    /* Not updated */
405*437bfbebSnyanmisaka             }
406*437bfbebSnyanmisaka         }
407*437bfbebSnyanmisaka 
408*437bfbebSnyanmisaka         vp8e_put_lit(bitbuf, sps->sing_bias[1], 1); /* Grf */
409*437bfbebSnyanmisaka         vp8e_put_lit(bitbuf, sps->sing_bias[2], 1); /* Arf */
410*437bfbebSnyanmisaka     }
411*437bfbebSnyanmisaka 
412*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, sps->refresh_entropy, 1);
413*437bfbebSnyanmisaka     if (!cur_pic->i_frame) {
414*437bfbebSnyanmisaka         vp8e_put_lit(bitbuf, cur_pic->ipf, 1);
415*437bfbebSnyanmisaka     }
416*437bfbebSnyanmisaka     vp8e_calc_coeff_prob(bitbuf, &entropy->coeff_prob, &entropy->old_coeff_prob);
417*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, 1, 1);
418*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, entropy->skip_false_prob, 8);
419*437bfbebSnyanmisaka 
420*437bfbebSnyanmisaka     if (cur_pic->i_frame)
421*437bfbebSnyanmisaka         return MPP_OK;
422*437bfbebSnyanmisaka 
423*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, entropy->intra_prob, 8);
424*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, entropy->last_prob, 8);
425*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, entropy->gf_prob, 8);
426*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, 0, 1);
427*437bfbebSnyanmisaka     vp8e_put_lit(bitbuf, 0, 1);
428*437bfbebSnyanmisaka     vp8e_calc_mv_prob(bitbuf, &entropy->mv_prob, &entropy->old_mv_prob);
429*437bfbebSnyanmisaka 
430*437bfbebSnyanmisaka     return MPP_OK;
431*437bfbebSnyanmisaka }
432*437bfbebSnyanmisaka 
set_new_frame(void * hal)433*437bfbebSnyanmisaka static MPP_RET set_new_frame(void *hal)
434*437bfbebSnyanmisaka {
435*437bfbebSnyanmisaka     RK_S32 i;
436*437bfbebSnyanmisaka     RK_S32 qp;
437*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
438*437bfbebSnyanmisaka     Vp8eSps *sps = &ctx->sps;
439*437bfbebSnyanmisaka     Vp8eHwCfg *hw_cfg = &ctx->hw_cfg;
440*437bfbebSnyanmisaka     Vp8eVpuBuf *buffers = (Vp8eVpuBuf *)ctx->buffers;
441*437bfbebSnyanmisaka 
442*437bfbebSnyanmisaka     hw_cfg->output_strm_size /= 8;
443*437bfbebSnyanmisaka     hw_cfg->output_strm_size &= (~0x07);
444*437bfbebSnyanmisaka 
445*437bfbebSnyanmisaka     {
446*437bfbebSnyanmisaka         hw_cfg->output_strm_offset += ctx->bitbuf[1].byte_cnt;
447*437bfbebSnyanmisaka         hw_cfg->first_free_bit = (hw_cfg->output_strm_offset & 0x07) * 8;
448*437bfbebSnyanmisaka     }
449*437bfbebSnyanmisaka 
450*437bfbebSnyanmisaka     if (hw_cfg->first_free_bit != 0) {
451*437bfbebSnyanmisaka         RK_U32 val;
452*437bfbebSnyanmisaka         RK_U8 *pTmp = (RK_U8 *)((size_t)(ctx->bitbuf[1].data) & (~0x07));
453*437bfbebSnyanmisaka 
454*437bfbebSnyanmisaka         for (val = 6; val >= hw_cfg->first_free_bit / 8; val--) {
455*437bfbebSnyanmisaka             pTmp[val] = 0;
456*437bfbebSnyanmisaka         }
457*437bfbebSnyanmisaka 
458*437bfbebSnyanmisaka         val =  pTmp[0] << 24;
459*437bfbebSnyanmisaka         val |= pTmp[1] << 16;
460*437bfbebSnyanmisaka         val |= pTmp[2] << 8;
461*437bfbebSnyanmisaka         val |= pTmp[3];
462*437bfbebSnyanmisaka 
463*437bfbebSnyanmisaka         hw_cfg->strm_start_msb = val;
464*437bfbebSnyanmisaka 
465*437bfbebSnyanmisaka         if (hw_cfg->first_free_bit > 32) {
466*437bfbebSnyanmisaka             val = pTmp[4] << 24;
467*437bfbebSnyanmisaka             val |= pTmp[5] << 16;
468*437bfbebSnyanmisaka             val |= pTmp[6] << 8;
469*437bfbebSnyanmisaka 
470*437bfbebSnyanmisaka             hw_cfg->strm_start_lsb = val;
471*437bfbebSnyanmisaka         } else {
472*437bfbebSnyanmisaka             hw_cfg->strm_start_lsb = 0;
473*437bfbebSnyanmisaka         }
474*437bfbebSnyanmisaka     } else {
475*437bfbebSnyanmisaka         hw_cfg->strm_start_msb = hw_cfg->strm_start_lsb = 0;
476*437bfbebSnyanmisaka     }
477*437bfbebSnyanmisaka 
478*437bfbebSnyanmisaka     if (sps->quarter_pixel_mv == 0) {
479*437bfbebSnyanmisaka         hw_cfg->disable_qp_mv = 1;
480*437bfbebSnyanmisaka     } else if (sps->quarter_pixel_mv == 1) {
481*437bfbebSnyanmisaka         if (ctx->mb_per_frame > 8160)
482*437bfbebSnyanmisaka             hw_cfg->disable_qp_mv = 1;
483*437bfbebSnyanmisaka         else
484*437bfbebSnyanmisaka             hw_cfg->disable_qp_mv = 0;
485*437bfbebSnyanmisaka     } else {
486*437bfbebSnyanmisaka         hw_cfg->disable_qp_mv = 0;
487*437bfbebSnyanmisaka     }
488*437bfbebSnyanmisaka 
489*437bfbebSnyanmisaka     hw_cfg->enable_cabac = 1;
490*437bfbebSnyanmisaka 
491*437bfbebSnyanmisaka     if (sps->split_mv == 0)
492*437bfbebSnyanmisaka         hw_cfg->split_mv_mode = 0;
493*437bfbebSnyanmisaka     else if (sps->split_mv == 1) {
494*437bfbebSnyanmisaka         if (ctx->mb_per_frame > 1584)
495*437bfbebSnyanmisaka             hw_cfg->split_mv_mode = 0;
496*437bfbebSnyanmisaka         else
497*437bfbebSnyanmisaka             hw_cfg->split_mv_mode = 1;
498*437bfbebSnyanmisaka     } else
499*437bfbebSnyanmisaka         hw_cfg->split_mv_mode = 1;
500*437bfbebSnyanmisaka 
501*437bfbebSnyanmisaka     qp = ctx->rc->qp_hdr;
502*437bfbebSnyanmisaka     if (hw_cfg->inter_favor == -1) {
503*437bfbebSnyanmisaka         RK_S32 tmp = 128 - ctx->entropy.intra_prob;
504*437bfbebSnyanmisaka 
505*437bfbebSnyanmisaka         if (tmp < 0) {
506*437bfbebSnyanmisaka             hw_cfg->inter_favor = tmp & 0xFFFF;
507*437bfbebSnyanmisaka         } else {
508*437bfbebSnyanmisaka             tmp = qp * 2 - 40;
509*437bfbebSnyanmisaka             hw_cfg->inter_favor = MPP_MAX(0, tmp);
510*437bfbebSnyanmisaka         }
511*437bfbebSnyanmisaka     }
512*437bfbebSnyanmisaka 
513*437bfbebSnyanmisaka     if (hw_cfg->diff_mv_penalty[0] == -1)
514*437bfbebSnyanmisaka         hw_cfg->diff_mv_penalty[0] = 64 / 2;
515*437bfbebSnyanmisaka     if (hw_cfg->diff_mv_penalty[1] == -1)
516*437bfbebSnyanmisaka         hw_cfg->diff_mv_penalty[1] = 60 / 2 * 32;
517*437bfbebSnyanmisaka     if (hw_cfg->diff_mv_penalty[2] == -1)
518*437bfbebSnyanmisaka         hw_cfg->diff_mv_penalty[2] = 8;
519*437bfbebSnyanmisaka     if (hw_cfg->skip_penalty == -1)
520*437bfbebSnyanmisaka         hw_cfg->skip_penalty = (qp >= 100) ? (3 * qp / 4) : 0;    /* Zero/nearest/near */
521*437bfbebSnyanmisaka     if (hw_cfg->golden_penalty == -1)
522*437bfbebSnyanmisaka         hw_cfg->golden_penalty = MPP_MAX(0, 5 * qp / 4 - 10);
523*437bfbebSnyanmisaka     if (hw_cfg->split_penalty[0] == 0)
524*437bfbebSnyanmisaka         hw_cfg->split_penalty[0] = MPP_MIN(1023, vp8_split_penalty_tbl[qp] / 2);
525*437bfbebSnyanmisaka     if (hw_cfg->split_penalty[1] == 0)
526*437bfbebSnyanmisaka         hw_cfg->split_penalty[1] = MPP_MIN(1023, (2 * vp8_split_penalty_tbl[qp] + 40) / 4);
527*437bfbebSnyanmisaka     if (hw_cfg->split_penalty[3] == 0)
528*437bfbebSnyanmisaka         hw_cfg->split_penalty[3] = MPP_MIN(511, (8 * vp8_split_penalty_tbl[qp] + 500) / 16);
529*437bfbebSnyanmisaka 
530*437bfbebSnyanmisaka     for (i = 0; i < 128; i++) {
531*437bfbebSnyanmisaka         RK_S32 y, x;
532*437bfbebSnyanmisaka 
533*437bfbebSnyanmisaka         hw_cfg->dmv_penalty[i] = i * 2;
534*437bfbebSnyanmisaka         y = vp8e_calc_cost_mv(i * 2, ctx->entropy.mv_prob[0]); /* mv y */
535*437bfbebSnyanmisaka         x = vp8e_calc_cost_mv(i * 2, ctx->entropy.mv_prob[1]); /* mv x */
536*437bfbebSnyanmisaka         hw_cfg->dmv_qpel_penalty[i] = MPP_MIN(255, (y + x + 1) / 2 * weight_tbl[qp] >> 8);
537*437bfbebSnyanmisaka     }
538*437bfbebSnyanmisaka 
539*437bfbebSnyanmisaka     for (i = 0; i < 4; i++) {
540*437bfbebSnyanmisaka         qp = ctx->ppss.pps->qp_sgm[i];
541*437bfbebSnyanmisaka         hw_cfg->y1_quant_dc[i] = ctx->qp_y1[qp].quant[0];
542*437bfbebSnyanmisaka         hw_cfg->y1_quant_ac[i] = ctx->qp_y1[qp].quant[1];
543*437bfbebSnyanmisaka         hw_cfg->y2_quant_dc[i] = ctx->qp_y2[qp].quant[0];
544*437bfbebSnyanmisaka         hw_cfg->y2_quant_ac[i] = ctx->qp_y2[qp].quant[1];
545*437bfbebSnyanmisaka         hw_cfg->ch_quant_dc[i] = ctx->qp_ch[qp].quant[0];
546*437bfbebSnyanmisaka         hw_cfg->ch_quant_ac[i] = ctx->qp_ch[qp].quant[1];
547*437bfbebSnyanmisaka         hw_cfg->y1_zbin_dc[i] = ctx->qp_y1[qp].zbin[0];
548*437bfbebSnyanmisaka         hw_cfg->y1_zbin_ac[i] = ctx->qp_y1[qp].zbin[1];
549*437bfbebSnyanmisaka         hw_cfg->y2_zbin_dc[i] = ctx->qp_y2[qp].zbin[0];
550*437bfbebSnyanmisaka         hw_cfg->y2_zbin_ac[i] = ctx->qp_y2[qp].zbin[1];
551*437bfbebSnyanmisaka         hw_cfg->ch_zbin_dc[i] = ctx->qp_ch[qp].zbin[0];
552*437bfbebSnyanmisaka         hw_cfg->ch_zbin_ac[i] = ctx->qp_ch[qp].zbin[1];
553*437bfbebSnyanmisaka         hw_cfg->y1_round_dc[i] = ctx->qp_y1[qp].round[0];
554*437bfbebSnyanmisaka         hw_cfg->y1_round_ac[i] = ctx->qp_y1[qp].round[1];
555*437bfbebSnyanmisaka         hw_cfg->y2_round_dc[i] = ctx->qp_y2[qp].round[0];
556*437bfbebSnyanmisaka         hw_cfg->y2_round_ac[i] = ctx->qp_y2[qp].round[1];
557*437bfbebSnyanmisaka         hw_cfg->ch_round_dc[i] = ctx->qp_ch[qp].round[0];
558*437bfbebSnyanmisaka         hw_cfg->ch_round_ac[i] = ctx->qp_ch[qp].round[1];
559*437bfbebSnyanmisaka         hw_cfg->y1_dequant_dc[i] = ctx->qp_y1[qp].dequant[0];
560*437bfbebSnyanmisaka         hw_cfg->y1_dequant_ac[i] = ctx->qp_y1[qp].dequant[1];
561*437bfbebSnyanmisaka         hw_cfg->y2_dequant_dc[i] = ctx->qp_y2[qp].dequant[0];
562*437bfbebSnyanmisaka         hw_cfg->y2_dequant_ac[i] = ctx->qp_y2[qp].dequant[1];
563*437bfbebSnyanmisaka         hw_cfg->ch_dequant_dc[i] = ctx->qp_ch[qp].dequant[0];
564*437bfbebSnyanmisaka         hw_cfg->ch_dequant_ac[i] = ctx->qp_ch[qp].dequant[1];
565*437bfbebSnyanmisaka 
566*437bfbebSnyanmisaka         hw_cfg->filter_level[i] = ctx->ppss.pps->level_sgm[i];
567*437bfbebSnyanmisaka     }
568*437bfbebSnyanmisaka 
569*437bfbebSnyanmisaka     hw_cfg->bool_enc_value = ctx->bitbuf[1].bottom;
570*437bfbebSnyanmisaka     hw_cfg->bool_enc_value_bits = 24 - ctx->bitbuf[1].bits_left;
571*437bfbebSnyanmisaka     hw_cfg->bool_enc_range = ctx->bitbuf[1].range;
572*437bfbebSnyanmisaka 
573*437bfbebSnyanmisaka     if (ctx->picbuf.cur_pic->i_frame)
574*437bfbebSnyanmisaka         hw_cfg->frame_coding_type = 1;
575*437bfbebSnyanmisaka     else
576*437bfbebSnyanmisaka         hw_cfg->frame_coding_type = 0;
577*437bfbebSnyanmisaka 
578*437bfbebSnyanmisaka     hw_cfg->size_tbl_base = mpp_buffer_get_fd(buffers->hw_size_table_buf);
579*437bfbebSnyanmisaka 
580*437bfbebSnyanmisaka     hw_cfg->dct_partitions = sps->dct_partitions;
581*437bfbebSnyanmisaka     hw_cfg->filter_disable = sps->filter_type;
582*437bfbebSnyanmisaka     hw_cfg->filter_sharpness = sps->filter_sharpness;
583*437bfbebSnyanmisaka     hw_cfg->segment_enable = ctx->ppss.pps->segment_enabled;
584*437bfbebSnyanmisaka     hw_cfg->segment_map_update = ctx->ppss.pps->sgm.map_modified;
585*437bfbebSnyanmisaka 
586*437bfbebSnyanmisaka     ctx->ppss.pps->sgm.map_modified = 0;
587*437bfbebSnyanmisaka 
588*437bfbebSnyanmisaka     for (i = 0; i < 4; i++) {
589*437bfbebSnyanmisaka         hw_cfg->lf_ref_delta[i] = sps->ref_delta[i];
590*437bfbebSnyanmisaka         hw_cfg->lf_mode_delta[i] = sps->mode_delta[i];
591*437bfbebSnyanmisaka     }
592*437bfbebSnyanmisaka 
593*437bfbebSnyanmisaka     set_intra_pred_penalties(hw_cfg, qp);
594*437bfbebSnyanmisaka 
595*437bfbebSnyanmisaka     memset(mpp_buffer_get_ptr(buffers->hw_prob_count_buf),
596*437bfbebSnyanmisaka            0, VP8_PROB_COUNT_BUF_SIZE);
597*437bfbebSnyanmisaka     mpp_buffer_sync_end(buffers->hw_prob_count_buf);
598*437bfbebSnyanmisaka 
599*437bfbebSnyanmisaka     return MPP_OK;
600*437bfbebSnyanmisaka }
601*437bfbebSnyanmisaka 
set_code_frame(void * hal)602*437bfbebSnyanmisaka static MPP_RET set_code_frame(void *hal)
603*437bfbebSnyanmisaka {
604*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *) hal;
605*437bfbebSnyanmisaka 
606*437bfbebSnyanmisaka     vp8e_init_entropy(ctx);
607*437bfbebSnyanmisaka     set_segmentation(ctx);
608*437bfbebSnyanmisaka     set_filter(ctx);
609*437bfbebSnyanmisaka     set_frame_header(ctx);
610*437bfbebSnyanmisaka     set_new_frame(ctx);
611*437bfbebSnyanmisaka     vp8e_write_entropy_tables(ctx);
612*437bfbebSnyanmisaka 
613*437bfbebSnyanmisaka     return MPP_OK;
614*437bfbebSnyanmisaka }
615*437bfbebSnyanmisaka 
reset_refpic(HalVp8eRefPic * refPic)616*437bfbebSnyanmisaka static void reset_refpic(HalVp8eRefPic *refPic)
617*437bfbebSnyanmisaka {
618*437bfbebSnyanmisaka     refPic->poc = -1;
619*437bfbebSnyanmisaka     refPic->i_frame = 0;
620*437bfbebSnyanmisaka     refPic->p_frame = 0;
621*437bfbebSnyanmisaka     refPic->show = 0;
622*437bfbebSnyanmisaka     refPic->ipf = 0;
623*437bfbebSnyanmisaka     refPic->arf = 0;
624*437bfbebSnyanmisaka     refPic->grf = 0;
625*437bfbebSnyanmisaka     refPic->search = 0;
626*437bfbebSnyanmisaka }
627*437bfbebSnyanmisaka 
init_ref_pic_list(HalVp8ePicBuf * picbuf)628*437bfbebSnyanmisaka static void init_ref_pic_list(HalVp8ePicBuf *picbuf)
629*437bfbebSnyanmisaka {
630*437bfbebSnyanmisaka     RK_S32 i, j;
631*437bfbebSnyanmisaka 
632*437bfbebSnyanmisaka     HalVp8eRefPic *ref_pic = picbuf->ref_pic;
633*437bfbebSnyanmisaka     HalVp8eRefPic *cur_pic = picbuf->cur_pic;
634*437bfbebSnyanmisaka     HalVp8eRefPic *ref_pic_list = picbuf->ref_pic_list;
635*437bfbebSnyanmisaka 
636*437bfbebSnyanmisaka     j = 0;
637*437bfbebSnyanmisaka     for (i = 0; i < picbuf->size + 1; i++) {
638*437bfbebSnyanmisaka         if (ref_pic[i].ipf && (&ref_pic[i] != cur_pic)) {
639*437bfbebSnyanmisaka             ref_pic_list[j++] = ref_pic[i];
640*437bfbebSnyanmisaka             break;
641*437bfbebSnyanmisaka         }
642*437bfbebSnyanmisaka     }
643*437bfbebSnyanmisaka 
644*437bfbebSnyanmisaka     for (i = 0; i < picbuf->size + 1; i++) {
645*437bfbebSnyanmisaka         if (ref_pic[i].grf && (&ref_pic[i] != cur_pic)) {
646*437bfbebSnyanmisaka             ref_pic_list[j++] = ref_pic[i];
647*437bfbebSnyanmisaka             break;
648*437bfbebSnyanmisaka         }
649*437bfbebSnyanmisaka     }
650*437bfbebSnyanmisaka 
651*437bfbebSnyanmisaka     for (i = 0; i < picbuf->size + 1; i++) {
652*437bfbebSnyanmisaka         if (ref_pic[i].arf && (&ref_pic[i] != cur_pic)) {
653*437bfbebSnyanmisaka             ref_pic_list[j] = ref_pic[i];
654*437bfbebSnyanmisaka             break;
655*437bfbebSnyanmisaka         }
656*437bfbebSnyanmisaka     }
657*437bfbebSnyanmisaka 
658*437bfbebSnyanmisaka     for (i = 0; i < picbuf->size; i++) {
659*437bfbebSnyanmisaka         ref_pic_list[i].ipf = 0;
660*437bfbebSnyanmisaka         ref_pic_list[i].grf = 0;
661*437bfbebSnyanmisaka         ref_pic_list[i].arf = 0;
662*437bfbebSnyanmisaka     }
663*437bfbebSnyanmisaka }
664*437bfbebSnyanmisaka 
init_picbuf(void * hal)665*437bfbebSnyanmisaka static MPP_RET init_picbuf(void *hal)
666*437bfbebSnyanmisaka {
667*437bfbebSnyanmisaka     RK_S32 i = 0;
668*437bfbebSnyanmisaka 
669*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
670*437bfbebSnyanmisaka     HalVp8ePicBuf *buf = &ctx->picbuf;
671*437bfbebSnyanmisaka 
672*437bfbebSnyanmisaka     if (buf->cur_pic->i_frame) {
673*437bfbebSnyanmisaka         buf->cur_pic->p_frame = 0;
674*437bfbebSnyanmisaka         buf->cur_pic->ipf = 1;
675*437bfbebSnyanmisaka         buf->cur_pic->grf = 1;
676*437bfbebSnyanmisaka         buf->cur_pic->arf = 1;
677*437bfbebSnyanmisaka 
678*437bfbebSnyanmisaka         for (i = 0; i < 4; i++) {
679*437bfbebSnyanmisaka             if (&buf->ref_pic[i] != buf->cur_pic) {
680*437bfbebSnyanmisaka                 reset_refpic(&buf->ref_pic[i]);
681*437bfbebSnyanmisaka             }
682*437bfbebSnyanmisaka         }
683*437bfbebSnyanmisaka     }
684*437bfbebSnyanmisaka 
685*437bfbebSnyanmisaka     for (i = 0; i < 3; i++) {
686*437bfbebSnyanmisaka         reset_refpic(&buf->ref_pic_list[i]);
687*437bfbebSnyanmisaka     }
688*437bfbebSnyanmisaka 
689*437bfbebSnyanmisaka     init_ref_pic_list(buf);
690*437bfbebSnyanmisaka 
691*437bfbebSnyanmisaka     return MPP_OK;
692*437bfbebSnyanmisaka }
693*437bfbebSnyanmisaka 
set_picbuf_ref(void * hal)694*437bfbebSnyanmisaka static MPP_RET set_picbuf_ref(void *hal)
695*437bfbebSnyanmisaka {
696*437bfbebSnyanmisaka     RK_S32 i = 0;
697*437bfbebSnyanmisaka 
698*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
699*437bfbebSnyanmisaka     HalVp8ePicBuf *pic_buf = &ctx->picbuf;
700*437bfbebSnyanmisaka     Vp8eHwCfg *hw_cfg = &ctx->hw_cfg;
701*437bfbebSnyanmisaka     HalVp8eRefPic *ref_pic_list = pic_buf->ref_pic_list;
702*437bfbebSnyanmisaka 
703*437bfbebSnyanmisaka     {
704*437bfbebSnyanmisaka         RK_S32 no_grf = 0;
705*437bfbebSnyanmisaka         RK_S32 no_arf = 0;
706*437bfbebSnyanmisaka         if (pic_buf->size < 2) {
707*437bfbebSnyanmisaka             no_grf = 1;
708*437bfbebSnyanmisaka             pic_buf->cur_pic->grf = 0;
709*437bfbebSnyanmisaka         }
710*437bfbebSnyanmisaka         if (pic_buf->size < 3) {
711*437bfbebSnyanmisaka             no_arf = 1;
712*437bfbebSnyanmisaka             pic_buf->cur_pic->arf = 0;
713*437bfbebSnyanmisaka         }
714*437bfbebSnyanmisaka 
715*437bfbebSnyanmisaka         for (i = 0; i < pic_buf->size; i++) {
716*437bfbebSnyanmisaka             if (pic_buf->cur_pic->grf || no_grf)
717*437bfbebSnyanmisaka                 pic_buf->ref_pic_list[i].grf = 0;
718*437bfbebSnyanmisaka             if (pic_buf->cur_pic->arf || no_arf)
719*437bfbebSnyanmisaka                 pic_buf->ref_pic_list[i].arf = 0;
720*437bfbebSnyanmisaka         }
721*437bfbebSnyanmisaka     }
722*437bfbebSnyanmisaka     {
723*437bfbebSnyanmisaka         RK_S32 ref_idx = -1;
724*437bfbebSnyanmisaka         RK_S32 ref_idx2 = -1;
725*437bfbebSnyanmisaka 
726*437bfbebSnyanmisaka         for (i = 0; i < 3; i++) {
727*437bfbebSnyanmisaka             if ((i < pic_buf->size) && ref_pic_list[i].search) {
728*437bfbebSnyanmisaka                 if (ref_idx == -1)
729*437bfbebSnyanmisaka                     ref_idx = i;
730*437bfbebSnyanmisaka                 else if (ref_idx2 == -1)
731*437bfbebSnyanmisaka                     ref_idx2 = i;
732*437bfbebSnyanmisaka                 else
733*437bfbebSnyanmisaka                     ref_pic_list[i].search = 0;
734*437bfbebSnyanmisaka             } else {
735*437bfbebSnyanmisaka                 ref_pic_list[i].search = 0;
736*437bfbebSnyanmisaka             }
737*437bfbebSnyanmisaka         }
738*437bfbebSnyanmisaka 
739*437bfbebSnyanmisaka         if (ref_idx == -1)
740*437bfbebSnyanmisaka             ref_idx = 0;
741*437bfbebSnyanmisaka 
742*437bfbebSnyanmisaka         hw_cfg->mv_ref_idx[0] = hw_cfg->mv_ref_idx[1] = ref_idx;
743*437bfbebSnyanmisaka 
744*437bfbebSnyanmisaka         if (pic_buf->cur_pic->p_frame) {
745*437bfbebSnyanmisaka             pic_buf->ref_pic_list[ref_idx].search = 1;
746*437bfbebSnyanmisaka 
747*437bfbebSnyanmisaka             hw_cfg->internal_img_lum_base_r[0] = ref_pic_list[ref_idx].picture.lum;
748*437bfbebSnyanmisaka             hw_cfg->internal_img_chr_base_r[0] = ref_pic_list[ref_idx].picture.cb;
749*437bfbebSnyanmisaka             hw_cfg->internal_img_lum_base_r[1] = ref_pic_list[ref_idx].picture.lum;
750*437bfbebSnyanmisaka             hw_cfg->internal_img_chr_base_r[1] = ref_pic_list[ref_idx].picture.cb;
751*437bfbebSnyanmisaka             hw_cfg->mv_ref_idx[0] = hw_cfg->mv_ref_idx[1] = ref_idx;
752*437bfbebSnyanmisaka             hw_cfg->ref2_enable = 0;
753*437bfbebSnyanmisaka 
754*437bfbebSnyanmisaka             if (ref_idx2 != -1) {
755*437bfbebSnyanmisaka                 hw_cfg->internal_img_lum_base_r[1] = ref_pic_list[ref_idx2].picture.lum;
756*437bfbebSnyanmisaka                 hw_cfg->internal_img_chr_base_r[1] = ref_pic_list[ref_idx2].picture.cb;
757*437bfbebSnyanmisaka                 hw_cfg->mv_ref_idx[1] = ref_idx2;
758*437bfbebSnyanmisaka                 hw_cfg->ref2_enable = 1;
759*437bfbebSnyanmisaka             }
760*437bfbebSnyanmisaka         }
761*437bfbebSnyanmisaka     }
762*437bfbebSnyanmisaka     hw_cfg->rec_write_disable = 0;
763*437bfbebSnyanmisaka 
764*437bfbebSnyanmisaka     if (!pic_buf->cur_pic->picture.lum) {
765*437bfbebSnyanmisaka         HalVp8eRefPic *cur_pic = pic_buf->cur_pic;
766*437bfbebSnyanmisaka         HalVp8eRefPic *cand;
767*437bfbebSnyanmisaka         RK_S32 recIdx = -1;
768*437bfbebSnyanmisaka 
769*437bfbebSnyanmisaka         for (i = 0; i < pic_buf->size + 1; i++) {
770*437bfbebSnyanmisaka             cand = &pic_buf->ref_pic[i];
771*437bfbebSnyanmisaka             if (cand == cur_pic)
772*437bfbebSnyanmisaka                 continue;
773*437bfbebSnyanmisaka             if (((cur_pic->ipf | cand->ipf) == cur_pic->ipf) &&
774*437bfbebSnyanmisaka                 ((cur_pic->grf | cand->grf) == cur_pic->grf) &&
775*437bfbebSnyanmisaka                 ((cur_pic->arf | cand->arf) == cur_pic->arf))
776*437bfbebSnyanmisaka                 recIdx = i;
777*437bfbebSnyanmisaka         }
778*437bfbebSnyanmisaka 
779*437bfbebSnyanmisaka         if (recIdx >= 0) {
780*437bfbebSnyanmisaka             cur_pic->picture.lum = pic_buf->ref_pic[recIdx].picture.lum;
781*437bfbebSnyanmisaka             pic_buf->ref_pic[recIdx].picture.lum = 0;
782*437bfbebSnyanmisaka         } else {
783*437bfbebSnyanmisaka             hw_cfg->rec_write_disable = 1;
784*437bfbebSnyanmisaka         }
785*437bfbebSnyanmisaka     }
786*437bfbebSnyanmisaka 
787*437bfbebSnyanmisaka     hw_cfg->internal_img_lum_base_w = pic_buf->cur_pic->picture.lum;
788*437bfbebSnyanmisaka     hw_cfg->internal_img_chr_base_w = pic_buf->cur_pic->picture.cb;
789*437bfbebSnyanmisaka 
790*437bfbebSnyanmisaka     return MPP_OK;
791*437bfbebSnyanmisaka }
792*437bfbebSnyanmisaka 
write_ivf_header(void * hal,RK_U8 * dst)793*437bfbebSnyanmisaka void write_ivf_header(void *hal, RK_U8 *dst)
794*437bfbebSnyanmisaka {
795*437bfbebSnyanmisaka     RK_U8 data[IVF_HDR_BYTES] = {0};
796*437bfbebSnyanmisaka 
797*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
798*437bfbebSnyanmisaka 
799*437bfbebSnyanmisaka     MppEncPrepCfg *prep = &ctx->cfg->prep;
800*437bfbebSnyanmisaka     MppEncRcCfg *rc = &ctx->cfg->rc;
801*437bfbebSnyanmisaka 
802*437bfbebSnyanmisaka     data[0] = 'D';
803*437bfbebSnyanmisaka     data[1] = 'K';
804*437bfbebSnyanmisaka     data[2] = 'I';
805*437bfbebSnyanmisaka     data[3] = 'F';
806*437bfbebSnyanmisaka 
807*437bfbebSnyanmisaka     data[6] = 32;
808*437bfbebSnyanmisaka 
809*437bfbebSnyanmisaka     data[8] = 'V';
810*437bfbebSnyanmisaka     data[9] = 'P';
811*437bfbebSnyanmisaka     data[10] = '8';
812*437bfbebSnyanmisaka     data[11] = '0';
813*437bfbebSnyanmisaka 
814*437bfbebSnyanmisaka     data[12] = prep->width & 0xff;
815*437bfbebSnyanmisaka     data[13] = (prep->width >> 8) & 0xff;
816*437bfbebSnyanmisaka     data[14] = prep->height & 0xff;
817*437bfbebSnyanmisaka     data[15] = (prep->height >> 8) & 0xff;
818*437bfbebSnyanmisaka 
819*437bfbebSnyanmisaka     data[16] = rc->fps_out_num & 0xff;
820*437bfbebSnyanmisaka     data[17] = (rc->fps_out_num >> 8) & 0xff;
821*437bfbebSnyanmisaka     data[18] = (rc->fps_out_num >> 16) & 0xff;
822*437bfbebSnyanmisaka     data[19] = (rc->fps_out_num >> 24) & 0xff;
823*437bfbebSnyanmisaka 
824*437bfbebSnyanmisaka     data[20] = rc->fps_out_denom & 0xff;
825*437bfbebSnyanmisaka     data[21] = (rc->fps_out_denom >> 8) & 0xff;
826*437bfbebSnyanmisaka     data[22] = (rc->fps_out_denom >> 16) & 0xff;
827*437bfbebSnyanmisaka     data[23] = (rc->fps_out_denom >> 24) & 0xff;
828*437bfbebSnyanmisaka 
829*437bfbebSnyanmisaka     data[24] = ctx->frame_cnt & 0xff;
830*437bfbebSnyanmisaka     data[25] = (ctx->frame_cnt >> 8) & 0xff;
831*437bfbebSnyanmisaka     data[26] = (ctx->frame_cnt >> 16) & 0xff;
832*437bfbebSnyanmisaka     data[27] = (ctx->frame_cnt >> 24) & 0xff;
833*437bfbebSnyanmisaka 
834*437bfbebSnyanmisaka     memcpy(dst, data, IVF_HDR_BYTES);
835*437bfbebSnyanmisaka }
836*437bfbebSnyanmisaka 
write_ivf_frame(void * hal,RK_U8 * out)837*437bfbebSnyanmisaka static void write_ivf_frame(void *hal, RK_U8 *out)
838*437bfbebSnyanmisaka {
839*437bfbebSnyanmisaka     RK_U8 data[IVF_FRM_BYTES];
840*437bfbebSnyanmisaka 
841*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
842*437bfbebSnyanmisaka     RK_S32 byte_cnt = ctx->frame_size;
843*437bfbebSnyanmisaka 
844*437bfbebSnyanmisaka     data[0] = byte_cnt & 0xff;
845*437bfbebSnyanmisaka     data[1] = (byte_cnt >> 8) & 0xff;
846*437bfbebSnyanmisaka     data[2] = (byte_cnt >> 16) & 0xff;
847*437bfbebSnyanmisaka     data[3] = (byte_cnt >> 24) & 0xff;
848*437bfbebSnyanmisaka 
849*437bfbebSnyanmisaka     data[4]  = ctx->frame_cnt & 0xff;
850*437bfbebSnyanmisaka     data[5]  = (ctx->frame_cnt >> 8) & 0xff;
851*437bfbebSnyanmisaka     data[6]  = (ctx->frame_cnt >> 16) & 0xff;
852*437bfbebSnyanmisaka     data[7]  = (ctx->frame_cnt >> 24) & 0xff;
853*437bfbebSnyanmisaka     data[8]  = (ctx->frame_cnt >> 32) & 0xff;
854*437bfbebSnyanmisaka     data[9]  = (ctx->frame_cnt >> 40) & 0xff;
855*437bfbebSnyanmisaka     data[10] = (ctx->frame_cnt >> 48) & 0xff;
856*437bfbebSnyanmisaka     data[11] = (ctx->frame_cnt >> 56) & 0xff;
857*437bfbebSnyanmisaka 
858*437bfbebSnyanmisaka     memcpy(out, data, IVF_FRM_BYTES);
859*437bfbebSnyanmisaka }
860*437bfbebSnyanmisaka 
set_frame_tag(void * hal)861*437bfbebSnyanmisaka static MPP_RET set_frame_tag(void *hal)
862*437bfbebSnyanmisaka {
863*437bfbebSnyanmisaka     RK_S32 tmp = 0;
864*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
865*437bfbebSnyanmisaka 
866*437bfbebSnyanmisaka     HalVp8ePicBuf *pic_buf = &ctx->picbuf;
867*437bfbebSnyanmisaka     HalVp8eRefPic *cur_pic = pic_buf->cur_pic;
868*437bfbebSnyanmisaka     Vp8ePutBitBuf *bitbuf = &ctx->bitbuf[0];
869*437bfbebSnyanmisaka     RK_S32 pic_height_in_pixel;
870*437bfbebSnyanmisaka     RK_S32 pic_width_in_pixel;
871*437bfbebSnyanmisaka     RK_S32 h_scaling;
872*437bfbebSnyanmisaka     RK_S32 v_scaling;
873*437bfbebSnyanmisaka 
874*437bfbebSnyanmisaka     tmp = ((ctx->bitbuf[1].byte_cnt) << 5) |
875*437bfbebSnyanmisaka           ((cur_pic->show ? 1 : 0) << 4) |
876*437bfbebSnyanmisaka           (ctx->sps.profile << 1) |
877*437bfbebSnyanmisaka           (cur_pic->i_frame ? 0 : 1);
878*437bfbebSnyanmisaka 
879*437bfbebSnyanmisaka     vp8e_put_byte(bitbuf, tmp & 0xff);
880*437bfbebSnyanmisaka 
881*437bfbebSnyanmisaka     vp8e_put_byte(bitbuf, (tmp >> 8) & 0xff);
882*437bfbebSnyanmisaka 
883*437bfbebSnyanmisaka     vp8e_put_byte(bitbuf, (tmp >> 16) & 0xff);
884*437bfbebSnyanmisaka 
885*437bfbebSnyanmisaka     if (!cur_pic->i_frame)
886*437bfbebSnyanmisaka         return MPP_NOK;
887*437bfbebSnyanmisaka 
888*437bfbebSnyanmisaka     vp8e_put_byte(bitbuf, 0x9d);
889*437bfbebSnyanmisaka     vp8e_put_byte(bitbuf, 0x01);
890*437bfbebSnyanmisaka     vp8e_put_byte(bitbuf, 0x2a);
891*437bfbebSnyanmisaka 
892*437bfbebSnyanmisaka     if (ctx->hw_cfg.input_rotation) {
893*437bfbebSnyanmisaka         pic_height_in_pixel = ctx->sps.pic_width_in_pixel;
894*437bfbebSnyanmisaka         pic_width_in_pixel = ctx->sps.pic_height_in_pixel;
895*437bfbebSnyanmisaka         h_scaling = ctx->sps.vertical_scaling;
896*437bfbebSnyanmisaka         v_scaling = ctx->sps.horizontal_scaling;
897*437bfbebSnyanmisaka     } else {
898*437bfbebSnyanmisaka         pic_height_in_pixel = ctx->sps.pic_height_in_pixel;
899*437bfbebSnyanmisaka         pic_width_in_pixel = ctx->sps.pic_width_in_pixel;
900*437bfbebSnyanmisaka         h_scaling = ctx->sps.horizontal_scaling;
901*437bfbebSnyanmisaka         v_scaling = ctx->sps.vertical_scaling;
902*437bfbebSnyanmisaka     }
903*437bfbebSnyanmisaka 
904*437bfbebSnyanmisaka     tmp = pic_width_in_pixel | (h_scaling << 14);
905*437bfbebSnyanmisaka     vp8e_put_byte(bitbuf, tmp & 0xff);
906*437bfbebSnyanmisaka     vp8e_put_byte(bitbuf, tmp >> 8);
907*437bfbebSnyanmisaka 
908*437bfbebSnyanmisaka     tmp = pic_height_in_pixel | (v_scaling << 14);
909*437bfbebSnyanmisaka     vp8e_put_byte(bitbuf, tmp & 0xff);
910*437bfbebSnyanmisaka     vp8e_put_byte(bitbuf, tmp >> 8);
911*437bfbebSnyanmisaka 
912*437bfbebSnyanmisaka     return MPP_OK;
913*437bfbebSnyanmisaka }
914*437bfbebSnyanmisaka 
set_data_part_size(void * hal)915*437bfbebSnyanmisaka static MPP_RET set_data_part_size(void *hal)
916*437bfbebSnyanmisaka {
917*437bfbebSnyanmisaka     RK_S32 i = 0;
918*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
919*437bfbebSnyanmisaka 
920*437bfbebSnyanmisaka     if (!ctx->sps.dct_partitions)
921*437bfbebSnyanmisaka         return MPP_NOK;
922*437bfbebSnyanmisaka 
923*437bfbebSnyanmisaka     for (i = 2; i < ctx->sps.partition_cnt - 1; i++) {
924*437bfbebSnyanmisaka         Vp8ePutBitBuf *bitbuf = ctx->bitbuf;
925*437bfbebSnyanmisaka         RK_S32  tmp = bitbuf[i].data - bitbuf[i].p_data;
926*437bfbebSnyanmisaka         vp8e_put_byte(&bitbuf[1], tmp & 0xff);
927*437bfbebSnyanmisaka         vp8e_put_byte(&bitbuf[1], (tmp >> 8) & 0xff);
928*437bfbebSnyanmisaka         vp8e_put_byte(&bitbuf[1], (tmp >> 16) & 0xff);
929*437bfbebSnyanmisaka     }
930*437bfbebSnyanmisaka 
931*437bfbebSnyanmisaka     return MPP_OK;
932*437bfbebSnyanmisaka }
933*437bfbebSnyanmisaka 
update_picbuf(HalVp8ePicBuf * picbuf)934*437bfbebSnyanmisaka static MPP_RET update_picbuf(HalVp8ePicBuf *picbuf)
935*437bfbebSnyanmisaka {
936*437bfbebSnyanmisaka     RK_S32 i , j;
937*437bfbebSnyanmisaka 
938*437bfbebSnyanmisaka     HalVp8eRefPic *ref_pic_list = picbuf->ref_pic_list;
939*437bfbebSnyanmisaka     HalVp8eRefPic *ref_pic      = picbuf->ref_pic;
940*437bfbebSnyanmisaka     HalVp8eRefPic *cur_pic      = picbuf->cur_pic;
941*437bfbebSnyanmisaka 
942*437bfbebSnyanmisaka     picbuf->last_pic = picbuf->cur_pic;
943*437bfbebSnyanmisaka 
944*437bfbebSnyanmisaka     for (i = 0; i < picbuf->size + 1; i++) {
945*437bfbebSnyanmisaka         if (&ref_pic[i] == cur_pic)
946*437bfbebSnyanmisaka             continue;
947*437bfbebSnyanmisaka         if (cur_pic->ipf)
948*437bfbebSnyanmisaka             ref_pic[i].ipf = 0;
949*437bfbebSnyanmisaka         if (cur_pic->grf)
950*437bfbebSnyanmisaka             ref_pic[i].grf = 0;
951*437bfbebSnyanmisaka         if (cur_pic->arf)
952*437bfbebSnyanmisaka             ref_pic[i].arf = 0;
953*437bfbebSnyanmisaka     }
954*437bfbebSnyanmisaka 
955*437bfbebSnyanmisaka     for (i = 0; i < picbuf->size; i++) {
956*437bfbebSnyanmisaka         for (j = 0; j < picbuf->size + 1; j++) {
957*437bfbebSnyanmisaka             if (ref_pic_list[i].grf)
958*437bfbebSnyanmisaka                 ref_pic[j].grf = 0;
959*437bfbebSnyanmisaka             if (ref_pic_list[i].arf)
960*437bfbebSnyanmisaka                 ref_pic[j].arf = 0;
961*437bfbebSnyanmisaka         }
962*437bfbebSnyanmisaka     }
963*437bfbebSnyanmisaka 
964*437bfbebSnyanmisaka     for (i = 0; i < picbuf->size; i++) {
965*437bfbebSnyanmisaka         if (ref_pic_list[i].grf)
966*437bfbebSnyanmisaka             ref_pic_list[i].refPic->grf = 1;
967*437bfbebSnyanmisaka         if (ref_pic_list[i].arf)
968*437bfbebSnyanmisaka             ref_pic_list[i].refPic->arf = 1;
969*437bfbebSnyanmisaka     }
970*437bfbebSnyanmisaka 
971*437bfbebSnyanmisaka     for (i = 0; i < picbuf->size + 1; i++) {
972*437bfbebSnyanmisaka         HalVp8eRefPic *tmp = &ref_pic[i];
973*437bfbebSnyanmisaka         if (!tmp->ipf && !tmp->arf && !tmp->grf) {
974*437bfbebSnyanmisaka             picbuf->cur_pic = &ref_pic[i];
975*437bfbebSnyanmisaka             break;
976*437bfbebSnyanmisaka         }
977*437bfbebSnyanmisaka     }
978*437bfbebSnyanmisaka 
979*437bfbebSnyanmisaka     return MPP_OK;
980*437bfbebSnyanmisaka }
981*437bfbebSnyanmisaka 
set_parameter(void * hal)982*437bfbebSnyanmisaka static MPP_RET set_parameter(void *hal)
983*437bfbebSnyanmisaka {
984*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
985*437bfbebSnyanmisaka 
986*437bfbebSnyanmisaka     Vp8eSps *sps = &ctx->sps;
987*437bfbebSnyanmisaka     Vp8eHwCfg *hw_cfg = &ctx->hw_cfg;
988*437bfbebSnyanmisaka     MppEncPrepCfg *set = &ctx->cfg->prep;
989*437bfbebSnyanmisaka 
990*437bfbebSnyanmisaka     RK_S32 width  = set->width;
991*437bfbebSnyanmisaka     RK_S32 height = set->height;
992*437bfbebSnyanmisaka     RK_S32 width_align  = MPP_ALIGN(set->width, 16);
993*437bfbebSnyanmisaka     RK_S32 height_align = MPP_ALIGN(set->height, 16);
994*437bfbebSnyanmisaka     RK_U32 stride;
995*437bfbebSnyanmisaka     RK_U32 rotation = 0;
996*437bfbebSnyanmisaka 
997*437bfbebSnyanmisaka     // do not support mirroring
998*437bfbebSnyanmisaka     if (set->mirroring)
999*437bfbebSnyanmisaka         mpp_err_f("Warning: do not support mirroring\n");
1000*437bfbebSnyanmisaka 
1001*437bfbebSnyanmisaka     if (set->rotation == MPP_ENC_ROT_90)
1002*437bfbebSnyanmisaka         rotation = 1;
1003*437bfbebSnyanmisaka     else if (set->rotation == MPP_ENC_ROT_270)
1004*437bfbebSnyanmisaka         rotation = 2;
1005*437bfbebSnyanmisaka     else if (set->rotation != MPP_ENC_ROT_0)
1006*437bfbebSnyanmisaka         mpp_err_f("Warning: only support 90 or 270 degree rotate, request rotate %d", rotation);
1007*437bfbebSnyanmisaka 
1008*437bfbebSnyanmisaka     if (rotation) {
1009*437bfbebSnyanmisaka         MPP_SWAP(RK_S32, width, height);
1010*437bfbebSnyanmisaka         MPP_SWAP(RK_S32, width_align, height_align);
1011*437bfbebSnyanmisaka     }
1012*437bfbebSnyanmisaka 
1013*437bfbebSnyanmisaka     stride = get_vepu_pixel_stride(&ctx->stride_cfg, width,
1014*437bfbebSnyanmisaka                                    set->hor_stride, set->format);
1015*437bfbebSnyanmisaka 
1016*437bfbebSnyanmisaka     ctx->mb_per_frame = width_align / 16 * height_align / 16;
1017*437bfbebSnyanmisaka     ctx->mb_per_row = width_align / 16;
1018*437bfbebSnyanmisaka     ctx->mb_per_col = height_align / 16;
1019*437bfbebSnyanmisaka 
1020*437bfbebSnyanmisaka     sps->pic_width_in_pixel    = width_align;
1021*437bfbebSnyanmisaka     sps->pic_height_in_pixel   = height_align;
1022*437bfbebSnyanmisaka     sps->pic_width_in_mbs      = width_align / 16;
1023*437bfbebSnyanmisaka     sps->pic_height_in_mbs     = height_align / 16;
1024*437bfbebSnyanmisaka     sps->horizontal_scaling    = 0;
1025*437bfbebSnyanmisaka     sps->vertical_scaling      = 0;
1026*437bfbebSnyanmisaka     sps->color_type            = 0;
1027*437bfbebSnyanmisaka     sps->clamp_type            = 0;
1028*437bfbebSnyanmisaka     sps->dct_partitions        = 0;
1029*437bfbebSnyanmisaka     sps->partition_cnt         = 2 + (1 << sps->dct_partitions);
1030*437bfbebSnyanmisaka     sps->profile               = 1;
1031*437bfbebSnyanmisaka     sps->filter_type           = 0;
1032*437bfbebSnyanmisaka     sps->filter_level          = 0;
1033*437bfbebSnyanmisaka     sps->filter_sharpness      = 0;
1034*437bfbebSnyanmisaka     sps->auto_filter_level     = 1;
1035*437bfbebSnyanmisaka     sps->auto_filter_sharpness = 1;
1036*437bfbebSnyanmisaka     sps->quarter_pixel_mv      = 1;
1037*437bfbebSnyanmisaka     sps->split_mv              = 1;
1038*437bfbebSnyanmisaka     sps->refresh_entropy       = 1;
1039*437bfbebSnyanmisaka     memset(sps->sing_bias, 0, sizeof(sps->sing_bias));
1040*437bfbebSnyanmisaka 
1041*437bfbebSnyanmisaka     sps->filter_delta_enable = 1;
1042*437bfbebSnyanmisaka     memset(sps->ref_delta, 0, sizeof(sps->ref_delta));
1043*437bfbebSnyanmisaka     memset(sps->mode_delta, 0, sizeof(sps->mode_delta));
1044*437bfbebSnyanmisaka 
1045*437bfbebSnyanmisaka     hw_cfg->input_rotation = rotation;
1046*437bfbebSnyanmisaka 
1047*437bfbebSnyanmisaka     {
1048*437bfbebSnyanmisaka         RK_U32 tmp = 0;
1049*437bfbebSnyanmisaka         RK_U32 hor_offset_src = 0;
1050*437bfbebSnyanmisaka         RK_U32 ver_offset_src = 0;
1051*437bfbebSnyanmisaka         RK_U8 video_stab = 0;
1052*437bfbebSnyanmisaka 
1053*437bfbebSnyanmisaka         if (set->format == MPP_FMT_YUV420SP || set->format == MPP_FMT_YUV420P) {
1054*437bfbebSnyanmisaka             tmp = ver_offset_src;
1055*437bfbebSnyanmisaka             tmp *= stride;
1056*437bfbebSnyanmisaka             tmp += hor_offset_src;
1057*437bfbebSnyanmisaka             hw_cfg->input_lum_base += (tmp & (~7));
1058*437bfbebSnyanmisaka             hw_cfg->input_luma_base_offset = tmp & 7;
1059*437bfbebSnyanmisaka 
1060*437bfbebSnyanmisaka             if (video_stab)
1061*437bfbebSnyanmisaka                 hw_cfg->vs_next_luma_base += (tmp & (~7));
1062*437bfbebSnyanmisaka 
1063*437bfbebSnyanmisaka             if (set->format == MPP_FMT_YUV420P) {
1064*437bfbebSnyanmisaka                 tmp = ver_offset_src / 2;
1065*437bfbebSnyanmisaka                 tmp *= stride / 2;
1066*437bfbebSnyanmisaka                 tmp += hor_offset_src / 2;
1067*437bfbebSnyanmisaka 
1068*437bfbebSnyanmisaka                 hw_cfg->input_cb_base += (tmp & (~7));
1069*437bfbebSnyanmisaka                 hw_cfg->input_cr_base += (tmp & (~7));
1070*437bfbebSnyanmisaka                 hw_cfg->input_chroma_base_offset = tmp & 7;
1071*437bfbebSnyanmisaka             } else {
1072*437bfbebSnyanmisaka                 tmp = ver_offset_src / 2;
1073*437bfbebSnyanmisaka                 tmp *= stride / 2;
1074*437bfbebSnyanmisaka                 tmp += hor_offset_src / 2;
1075*437bfbebSnyanmisaka                 tmp *= 2;
1076*437bfbebSnyanmisaka 
1077*437bfbebSnyanmisaka                 hw_cfg->input_cb_base += (tmp & (~7));
1078*437bfbebSnyanmisaka                 hw_cfg->input_chroma_base_offset = tmp & 7;
1079*437bfbebSnyanmisaka             }
1080*437bfbebSnyanmisaka         } else if (set->format <= MPP_FMT_BGR444 && set->format >= MPP_FMT_RGB565) {
1081*437bfbebSnyanmisaka             tmp = ver_offset_src;
1082*437bfbebSnyanmisaka             tmp *= stride;
1083*437bfbebSnyanmisaka             tmp += hor_offset_src;
1084*437bfbebSnyanmisaka             tmp *= 2;
1085*437bfbebSnyanmisaka 
1086*437bfbebSnyanmisaka             hw_cfg->input_lum_base += (tmp & (~7));
1087*437bfbebSnyanmisaka             hw_cfg->input_luma_base_offset = tmp & 7;
1088*437bfbebSnyanmisaka             hw_cfg->input_chroma_base_offset = (hw_cfg->input_luma_base_offset / 4) * 4;
1089*437bfbebSnyanmisaka 
1090*437bfbebSnyanmisaka             if (video_stab)
1091*437bfbebSnyanmisaka                 hw_cfg->vs_next_luma_base += (tmp & (~7));
1092*437bfbebSnyanmisaka         } else {
1093*437bfbebSnyanmisaka             tmp = ver_offset_src;
1094*437bfbebSnyanmisaka             tmp *= stride;
1095*437bfbebSnyanmisaka             tmp += hor_offset_src;
1096*437bfbebSnyanmisaka             tmp *= 4;
1097*437bfbebSnyanmisaka 
1098*437bfbebSnyanmisaka             hw_cfg->input_lum_base += (tmp & (~7));
1099*437bfbebSnyanmisaka             hw_cfg->input_luma_base_offset = (tmp & 7) / 2;
1100*437bfbebSnyanmisaka 
1101*437bfbebSnyanmisaka             if (video_stab)
1102*437bfbebSnyanmisaka                 hw_cfg->vs_next_luma_base += (tmp & (~7));
1103*437bfbebSnyanmisaka         }
1104*437bfbebSnyanmisaka 
1105*437bfbebSnyanmisaka         hw_cfg->mbs_in_row = width_align / 16;
1106*437bfbebSnyanmisaka         hw_cfg->mbs_in_col = height_align / 16;
1107*437bfbebSnyanmisaka         hw_cfg->pixels_on_row = stride;
1108*437bfbebSnyanmisaka     }
1109*437bfbebSnyanmisaka     if (width & 0x0F)
1110*437bfbebSnyanmisaka         hw_cfg->x_fill = (16 - (width & 0x0F)) / 4;
1111*437bfbebSnyanmisaka     else
1112*437bfbebSnyanmisaka         hw_cfg->x_fill = 0;
1113*437bfbebSnyanmisaka 
1114*437bfbebSnyanmisaka     if (height & 0x0F)
1115*437bfbebSnyanmisaka         hw_cfg->y_fill = 16 - (height & 0x0F);
1116*437bfbebSnyanmisaka     else
1117*437bfbebSnyanmisaka         hw_cfg->y_fill = 0;
1118*437bfbebSnyanmisaka 
1119*437bfbebSnyanmisaka     hw_cfg->vs_mode = 0;
1120*437bfbebSnyanmisaka 
1121*437bfbebSnyanmisaka     switch (set->color) {
1122*437bfbebSnyanmisaka     case MPP_FRAME_SPC_RGB:     /* BT.601 */
1123*437bfbebSnyanmisaka     default:
1124*437bfbebSnyanmisaka         /* Y  = 0.2989 R + 0.5866 G + 0.1145 B
1125*437bfbebSnyanmisaka         * Cb = 0.5647 (B - Y) + 128
1126*437bfbebSnyanmisaka         * Cr = 0.7132 (R - Y) + 128
1127*437bfbebSnyanmisaka         */
1128*437bfbebSnyanmisaka         hw_cfg->rgb_coeff_a = 19589;
1129*437bfbebSnyanmisaka         hw_cfg->rgb_coeff_b = 38443;
1130*437bfbebSnyanmisaka         hw_cfg->rgb_coeff_c = 7504;
1131*437bfbebSnyanmisaka         hw_cfg->rgb_coeff_e = 37008;
1132*437bfbebSnyanmisaka         hw_cfg->rgb_coeff_f = 46740;
1133*437bfbebSnyanmisaka         break;
1134*437bfbebSnyanmisaka 
1135*437bfbebSnyanmisaka     case MPP_FRAME_SPC_BT709:         /* BT.709 */
1136*437bfbebSnyanmisaka         /* Y  = 0.2126 R + 0.7152 G + 0.0722 B
1137*437bfbebSnyanmisaka          * Cb = 0.5389 (B - Y) + 128
1138*437bfbebSnyanmisaka          * Cr = 0.6350 (R - Y) + 128
1139*437bfbebSnyanmisaka          */
1140*437bfbebSnyanmisaka         hw_cfg->rgb_coeff_a = 13933;
1141*437bfbebSnyanmisaka         hw_cfg->rgb_coeff_b = 46871;
1142*437bfbebSnyanmisaka         hw_cfg->rgb_coeff_c = 732;
1143*437bfbebSnyanmisaka         hw_cfg->rgb_coeff_e = 35317;
1144*437bfbebSnyanmisaka         hw_cfg->rgb_coeff_f = 41615;
1145*437bfbebSnyanmisaka         break;
1146*437bfbebSnyanmisaka     }
1147*437bfbebSnyanmisaka 
1148*437bfbebSnyanmisaka     hw_cfg->r_mask_msb = hw_cfg->g_mask_msb = hw_cfg->b_mask_msb = 0;
1149*437bfbebSnyanmisaka     VepuFormatCfg fmt_cfg;
1150*437bfbebSnyanmisaka     if (!get_vepu_fmt(&fmt_cfg, set->format)) {
1151*437bfbebSnyanmisaka         hw_cfg->input_format = fmt_cfg.format;
1152*437bfbebSnyanmisaka         hw_cfg->r_mask_msb = fmt_cfg.r_mask;
1153*437bfbebSnyanmisaka         hw_cfg->g_mask_msb = fmt_cfg.g_mask;
1154*437bfbebSnyanmisaka         hw_cfg->b_mask_msb = fmt_cfg.b_mask;
1155*437bfbebSnyanmisaka     } else
1156*437bfbebSnyanmisaka         return MPP_NOK;
1157*437bfbebSnyanmisaka 
1158*437bfbebSnyanmisaka     return MPP_OK;
1159*437bfbebSnyanmisaka }
1160*437bfbebSnyanmisaka 
set_picbuf(void * hal)1161*437bfbebSnyanmisaka static MPP_RET set_picbuf(void *hal)
1162*437bfbebSnyanmisaka {
1163*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
1164*437bfbebSnyanmisaka 
1165*437bfbebSnyanmisaka     // find one dpb for current picture
1166*437bfbebSnyanmisaka     {
1167*437bfbebSnyanmisaka         RK_U32 i = 0;
1168*437bfbebSnyanmisaka         RK_S32 width  = ctx->sps.pic_width_in_mbs * 16;
1169*437bfbebSnyanmisaka         RK_S32 height = ctx->sps.pic_height_in_mbs * 16;
1170*437bfbebSnyanmisaka         HalVp8ePicBuf *picbuf = &ctx->picbuf;
1171*437bfbebSnyanmisaka 
1172*437bfbebSnyanmisaka         memset(picbuf->ref_pic, 0, sizeof(picbuf->ref_pic));
1173*437bfbebSnyanmisaka         memset(picbuf->ref_pic_list, 0, sizeof(picbuf->ref_pic_list));
1174*437bfbebSnyanmisaka 
1175*437bfbebSnyanmisaka         for (i = 0; i < REF_FRAME_COUNT + 1; i++) {
1176*437bfbebSnyanmisaka             picbuf->ref_pic[i].picture.lum_width  = width;
1177*437bfbebSnyanmisaka             picbuf->ref_pic[i].picture.lum_height = height;
1178*437bfbebSnyanmisaka             picbuf->ref_pic[i].picture.ch_width   = width / 2;
1179*437bfbebSnyanmisaka             picbuf->ref_pic[i].picture.ch_height  = height / 2;
1180*437bfbebSnyanmisaka             picbuf->ref_pic[i].picture.lum = 0;
1181*437bfbebSnyanmisaka             picbuf->ref_pic[i].picture.cb  = 0;
1182*437bfbebSnyanmisaka         }
1183*437bfbebSnyanmisaka 
1184*437bfbebSnyanmisaka         picbuf->cur_pic = &picbuf->ref_pic[0];
1185*437bfbebSnyanmisaka     }
1186*437bfbebSnyanmisaka 
1187*437bfbebSnyanmisaka     ctx->ppss.size = 1;
1188*437bfbebSnyanmisaka     ctx->ppss.store = (Pps *)mpp_calloc(Pps, 1);
1189*437bfbebSnyanmisaka     if (ctx->ppss.store == NULL) {
1190*437bfbebSnyanmisaka         mpp_err("failed to malloc ppss store.\n");
1191*437bfbebSnyanmisaka         goto __ERR_RET;
1192*437bfbebSnyanmisaka     }
1193*437bfbebSnyanmisaka 
1194*437bfbebSnyanmisaka     ctx->ppss.pps = ctx->ppss.store;
1195*437bfbebSnyanmisaka     ctx->ppss.pps->segment_enabled  = 0;
1196*437bfbebSnyanmisaka     ctx->ppss.pps->sgm.map_modified = 0;
1197*437bfbebSnyanmisaka 
1198*437bfbebSnyanmisaka     return MPP_OK;
1199*437bfbebSnyanmisaka 
1200*437bfbebSnyanmisaka __ERR_RET:
1201*437bfbebSnyanmisaka     return MPP_NOK;
1202*437bfbebSnyanmisaka }
1203*437bfbebSnyanmisaka 
alloc_buffer(void * hal)1204*437bfbebSnyanmisaka static MPP_RET alloc_buffer(void *hal)
1205*437bfbebSnyanmisaka {
1206*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1207*437bfbebSnyanmisaka 
1208*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
1209*437bfbebSnyanmisaka 
1210*437bfbebSnyanmisaka     Vp8eHwCfg *hw_cfg = &ctx->hw_cfg;
1211*437bfbebSnyanmisaka     MppEncPrepCfg *pre = &ctx->cfg->prep;
1212*437bfbebSnyanmisaka     RK_U32 mb_total = ctx->mb_per_frame;
1213*437bfbebSnyanmisaka     Vp8eVpuBuf *buffers = (Vp8eVpuBuf *)ctx->buffers;
1214*437bfbebSnyanmisaka 
1215*437bfbebSnyanmisaka     //set coding format as VP8
1216*437bfbebSnyanmisaka     hw_cfg->coding_type = 1;
1217*437bfbebSnyanmisaka 
1218*437bfbebSnyanmisaka     ret = mpp_buffer_group_get_internal(&buffers->hw_buf_grp,
1219*437bfbebSnyanmisaka                                         MPP_BUFFER_TYPE_ION);
1220*437bfbebSnyanmisaka     if (ret) {
1221*437bfbebSnyanmisaka         mpp_err("buf group get failed ret %d\n", ret);
1222*437bfbebSnyanmisaka         goto __ERR_RET;
1223*437bfbebSnyanmisaka     }
1224*437bfbebSnyanmisaka 
1225*437bfbebSnyanmisaka     //add 128 bytes to avoid kernel crash
1226*437bfbebSnyanmisaka     ret = mpp_buffer_get(buffers->hw_buf_grp, &buffers->hw_luma_buf,
1227*437bfbebSnyanmisaka                          MPP_ALIGN(mb_total * (16 * 16), SZ_4K) + SZ_4K);
1228*437bfbebSnyanmisaka     if (ret) {
1229*437bfbebSnyanmisaka         mpp_err("hw_luma_buf get failed ret %d\n", ret);
1230*437bfbebSnyanmisaka         goto __ERR_RET;
1231*437bfbebSnyanmisaka     }
1232*437bfbebSnyanmisaka     {
1233*437bfbebSnyanmisaka         RK_U32 i = 0;
1234*437bfbebSnyanmisaka         for (i = 0; i < 2; i++) {
1235*437bfbebSnyanmisaka             //add 128 bytes to avoid kernel crash
1236*437bfbebSnyanmisaka             ret = mpp_buffer_get(buffers->hw_buf_grp, &buffers->hw_cbcr_buf[i],
1237*437bfbebSnyanmisaka                                  MPP_ALIGN(mb_total * (2 * 8 * 8), SZ_4K) + SZ_4K);
1238*437bfbebSnyanmisaka             if (ret) {
1239*437bfbebSnyanmisaka                 mpp_err("hw_cbcr_buf[%d] get failed ret %d\n", i, ret);
1240*437bfbebSnyanmisaka                 goto __ERR_RET;
1241*437bfbebSnyanmisaka             }
1242*437bfbebSnyanmisaka         }
1243*437bfbebSnyanmisaka     }
1244*437bfbebSnyanmisaka     hw_cfg->internal_img_lum_base_w = mpp_buffer_get_fd(buffers->hw_luma_buf);
1245*437bfbebSnyanmisaka     hw_cfg->internal_img_chr_base_w = mpp_buffer_get_fd(buffers->hw_cbcr_buf[0]);
1246*437bfbebSnyanmisaka 
1247*437bfbebSnyanmisaka     hw_cfg->internal_img_lum_base_r[0] = mpp_buffer_get_fd(buffers->hw_luma_buf);
1248*437bfbebSnyanmisaka     hw_cfg->internal_img_chr_base_r[0] = mpp_buffer_get_fd(buffers->hw_cbcr_buf[1]);
1249*437bfbebSnyanmisaka     {
1250*437bfbebSnyanmisaka         /* NAL size table, table size must be 64-bit multiple,
1251*437bfbebSnyanmisaka          * space for SEI, MVC prefix, filler and zero at the end of table.
1252*437bfbebSnyanmisaka          * At least 1 macroblock row in every slice.
1253*437bfbebSnyanmisaka          * Also used for VP8 partitions. */
1254*437bfbebSnyanmisaka         RK_U32 size_tbl = MPP_ALIGN(sizeof(RK_U32) * (pre->height + 4), 8);
1255*437bfbebSnyanmisaka         ret = mpp_buffer_get(buffers->hw_buf_grp, &buffers->hw_size_table_buf, size_tbl);
1256*437bfbebSnyanmisaka         if (ret) {
1257*437bfbebSnyanmisaka             mpp_err("hw_size_table_buf get failed ret %d\n", ret);
1258*437bfbebSnyanmisaka             goto __ERR_RET;
1259*437bfbebSnyanmisaka         }
1260*437bfbebSnyanmisaka     }
1261*437bfbebSnyanmisaka     {
1262*437bfbebSnyanmisaka         RK_U32  cabac_tbl_size = 8 * 55 + 8 * 96;
1263*437bfbebSnyanmisaka         ret = mpp_buffer_get(buffers->hw_buf_grp, &buffers->hw_cabac_table_buf,
1264*437bfbebSnyanmisaka                              cabac_tbl_size);
1265*437bfbebSnyanmisaka         if (ret) {
1266*437bfbebSnyanmisaka             mpp_err("hw_cabac_table_buf get failed\n");
1267*437bfbebSnyanmisaka             goto __ERR_RET;
1268*437bfbebSnyanmisaka         }
1269*437bfbebSnyanmisaka     }
1270*437bfbebSnyanmisaka     hw_cfg->cabac_tbl_base = mpp_buffer_get_fd(buffers->hw_cabac_table_buf);
1271*437bfbebSnyanmisaka 
1272*437bfbebSnyanmisaka     ret = mpp_buffer_get(buffers->hw_buf_grp, &buffers->hw_mv_output_buf,
1273*437bfbebSnyanmisaka                          mb_total * 4);
1274*437bfbebSnyanmisaka     if (ret) {
1275*437bfbebSnyanmisaka         mpp_err("hw_mv_output_buf get failed ret %d\n", ret);
1276*437bfbebSnyanmisaka         goto __ERR_RET;
1277*437bfbebSnyanmisaka     }
1278*437bfbebSnyanmisaka 
1279*437bfbebSnyanmisaka     hw_cfg->mv_output_base = mpp_buffer_get_fd(buffers->hw_mv_output_buf);
1280*437bfbebSnyanmisaka 
1281*437bfbebSnyanmisaka     memset(mpp_buffer_get_ptr(buffers->hw_mv_output_buf), 0, sizeof(RK_U32) * mb_total);
1282*437bfbebSnyanmisaka     mpp_buffer_sync_end(buffers->hw_mv_output_buf);
1283*437bfbebSnyanmisaka 
1284*437bfbebSnyanmisaka     ret = mpp_buffer_get(buffers->hw_buf_grp, &buffers->hw_prob_count_buf, VP8_PROB_COUNT_BUF_SIZE);
1285*437bfbebSnyanmisaka     if (ret) {
1286*437bfbebSnyanmisaka         mpp_err("hw_prob_count_buf get failed ret %d\n", ret);
1287*437bfbebSnyanmisaka         goto __ERR_RET;
1288*437bfbebSnyanmisaka     }
1289*437bfbebSnyanmisaka 
1290*437bfbebSnyanmisaka     hw_cfg->prob_count_base = mpp_buffer_get_fd(buffers->hw_prob_count_buf);
1291*437bfbebSnyanmisaka     {
1292*437bfbebSnyanmisaka         /* VP8: Segmentation map, 4 bits/mb, 64-bit multiple. */
1293*437bfbebSnyanmisaka         RK_U32 segment_map_size = (mb_total * 4 + 63) / 64 * 8;
1294*437bfbebSnyanmisaka 
1295*437bfbebSnyanmisaka         ret = mpp_buffer_get(buffers->hw_buf_grp, &buffers->hw_segment_map_buf, segment_map_size);
1296*437bfbebSnyanmisaka         if (ret) {
1297*437bfbebSnyanmisaka             mpp_err("hw_segment_map_buf get failed ret %d\n", ret);
1298*437bfbebSnyanmisaka             goto __ERR_RET;
1299*437bfbebSnyanmisaka         }
1300*437bfbebSnyanmisaka 
1301*437bfbebSnyanmisaka         hw_cfg->segment_map_base = mpp_buffer_get_fd(buffers->hw_segment_map_buf);
1302*437bfbebSnyanmisaka         memset(mpp_buffer_get_ptr(buffers->hw_segment_map_buf), 0, segment_map_size / 4);
1303*437bfbebSnyanmisaka         mpp_buffer_sync_end(buffers->hw_segment_map_buf);
1304*437bfbebSnyanmisaka     }
1305*437bfbebSnyanmisaka     {
1306*437bfbebSnyanmisaka         RK_U32 i = 0;
1307*437bfbebSnyanmisaka 
1308*437bfbebSnyanmisaka         ctx->picbuf.size = 1;
1309*437bfbebSnyanmisaka         for (i = 0; i < 1; i++)
1310*437bfbebSnyanmisaka             ctx->picbuf.ref_pic[i].picture.lum = mpp_buffer_get_fd(buffers->hw_luma_buf);
1311*437bfbebSnyanmisaka         for (i = 0; i < 2; i++)
1312*437bfbebSnyanmisaka             ctx->picbuf.ref_pic[i].picture.cb = mpp_buffer_get_fd(buffers->hw_cbcr_buf[i]);
1313*437bfbebSnyanmisaka     }
1314*437bfbebSnyanmisaka     {
1315*437bfbebSnyanmisaka         RK_U32 pic_size = MPP_ALIGN(pre->width, 16) * MPP_ALIGN(pre->height, 16) * 3 / 2;
1316*437bfbebSnyanmisaka         RK_U32 out_size = pic_size / 2;
1317*437bfbebSnyanmisaka 
1318*437bfbebSnyanmisaka         ret = mpp_buffer_get(buffers->hw_buf_grp, &buffers->hw_out_buf,  out_size);
1319*437bfbebSnyanmisaka         if (ret) {
1320*437bfbebSnyanmisaka             mpp_err("hw_out_buf get failed ret %d\n", ret);
1321*437bfbebSnyanmisaka             goto __ERR_RET;
1322*437bfbebSnyanmisaka         }
1323*437bfbebSnyanmisaka     }
1324*437bfbebSnyanmisaka     ctx->regs = mpp_calloc(RK_U32, ctx->reg_size);
1325*437bfbebSnyanmisaka     if (!ctx->regs) {
1326*437bfbebSnyanmisaka         mpp_err("failed to calloc regs.\n");
1327*437bfbebSnyanmisaka         goto __ERR_RET;
1328*437bfbebSnyanmisaka     }
1329*437bfbebSnyanmisaka 
1330*437bfbebSnyanmisaka     hw_cfg->intra_16_favor     = -1;
1331*437bfbebSnyanmisaka     hw_cfg->prev_mode_favor    = -1;
1332*437bfbebSnyanmisaka     hw_cfg->inter_favor        = -1;
1333*437bfbebSnyanmisaka     hw_cfg->skip_penalty       = -1;
1334*437bfbebSnyanmisaka     hw_cfg->diff_mv_penalty[0] = -1;
1335*437bfbebSnyanmisaka     hw_cfg->diff_mv_penalty[1] = -1;
1336*437bfbebSnyanmisaka     hw_cfg->diff_mv_penalty[2] = -1;
1337*437bfbebSnyanmisaka     hw_cfg->split_penalty[0]   = 0;
1338*437bfbebSnyanmisaka     hw_cfg->split_penalty[1]   = 0;
1339*437bfbebSnyanmisaka     hw_cfg->split_penalty[2]   = 0x3FF;
1340*437bfbebSnyanmisaka     hw_cfg->split_penalty[3]   = 0;
1341*437bfbebSnyanmisaka     hw_cfg->zero_mv_favor      = 0;
1342*437bfbebSnyanmisaka 
1343*437bfbebSnyanmisaka     hw_cfg->intra_area_top  = hw_cfg->intra_area_bottom = 255;
1344*437bfbebSnyanmisaka     hw_cfg->intra_area_left = hw_cfg->intra_area_right  = 255;
1345*437bfbebSnyanmisaka     hw_cfg->roi1_top  = hw_cfg->roi1_bottom = 255;
1346*437bfbebSnyanmisaka     hw_cfg->roi1_left = hw_cfg->roi1_right  = 255;
1347*437bfbebSnyanmisaka     hw_cfg->roi2_top  = hw_cfg->roi2_bottom = 255;
1348*437bfbebSnyanmisaka     hw_cfg->roi2_left = hw_cfg->roi2_right  = 255;
1349*437bfbebSnyanmisaka 
1350*437bfbebSnyanmisaka     return ret;
1351*437bfbebSnyanmisaka 
1352*437bfbebSnyanmisaka __ERR_RET:
1353*437bfbebSnyanmisaka     if (buffers)
1354*437bfbebSnyanmisaka         hal_vp8e_buf_free(hal);
1355*437bfbebSnyanmisaka 
1356*437bfbebSnyanmisaka     return ret;
1357*437bfbebSnyanmisaka }
1358*437bfbebSnyanmisaka 
hal_vp8e_enc_strm_code(void * hal,HalEncTask * task)1359*437bfbebSnyanmisaka MPP_RET hal_vp8e_enc_strm_code(void *hal, HalEncTask *task)
1360*437bfbebSnyanmisaka {
1361*437bfbebSnyanmisaka     HalVp8eCtx  *ctx  = (HalVp8eCtx *)hal;
1362*437bfbebSnyanmisaka     Vp8eHwCfg *hw_cfg = &ctx->hw_cfg;
1363*437bfbebSnyanmisaka     VepuOffsetCfg hw_offset;
1364*437bfbebSnyanmisaka 
1365*437bfbebSnyanmisaka     MppEncCfgSet  *cfg = ctx->cfg;
1366*437bfbebSnyanmisaka     MppEncPrepCfg *prep = &cfg->prep;
1367*437bfbebSnyanmisaka 
1368*437bfbebSnyanmisaka     {
1369*437bfbebSnyanmisaka         RK_U32 i = 0;
1370*437bfbebSnyanmisaka         for (i = 0; i < 9; i++) {
1371*437bfbebSnyanmisaka             ctx->p_out_buf[i] = NULL;
1372*437bfbebSnyanmisaka             ctx->stream_size[i] = 0;
1373*437bfbebSnyanmisaka         }
1374*437bfbebSnyanmisaka     }
1375*437bfbebSnyanmisaka 
1376*437bfbebSnyanmisaka     {
1377*437bfbebSnyanmisaka         hw_offset.fmt = prep->format;
1378*437bfbebSnyanmisaka 
1379*437bfbebSnyanmisaka         hw_offset.width = prep->width;
1380*437bfbebSnyanmisaka         hw_offset.height = prep->height;
1381*437bfbebSnyanmisaka         hw_offset.hor_stride = prep->hor_stride;
1382*437bfbebSnyanmisaka         hw_offset.ver_stride = prep->ver_stride;
1383*437bfbebSnyanmisaka         hw_offset.offset_x = mpp_frame_get_offset_x(task->frame);
1384*437bfbebSnyanmisaka         hw_offset.offset_y = mpp_frame_get_offset_y(task->frame);
1385*437bfbebSnyanmisaka 
1386*437bfbebSnyanmisaka         get_vepu_offset_cfg(&hw_offset);
1387*437bfbebSnyanmisaka     }
1388*437bfbebSnyanmisaka 
1389*437bfbebSnyanmisaka     {
1390*437bfbebSnyanmisaka         HalEncTask *enc_task = task;
1391*437bfbebSnyanmisaka 
1392*437bfbebSnyanmisaka         hw_cfg->input_lum_base = mpp_buffer_get_fd(enc_task->input);
1393*437bfbebSnyanmisaka         hw_cfg->input_cb_base  = hw_cfg->input_lum_base;
1394*437bfbebSnyanmisaka         hw_cfg->input_cr_base  = hw_cfg->input_cb_base;
1395*437bfbebSnyanmisaka         hw_cfg->input_lum_offset = hw_offset.offset_byte[0];
1396*437bfbebSnyanmisaka         hw_cfg->input_cb_offset = hw_offset.offset_byte[1];
1397*437bfbebSnyanmisaka         hw_cfg->input_cr_offset  = hw_offset.offset_byte[2];
1398*437bfbebSnyanmisaka     }
1399*437bfbebSnyanmisaka 
1400*437bfbebSnyanmisaka     // split memory for vp8 partition
1401*437bfbebSnyanmisaka     {
1402*437bfbebSnyanmisaka         RK_S32 offset = 0;
1403*437bfbebSnyanmisaka         Vp8eVpuBuf *buffers = (Vp8eVpuBuf *)ctx->buffers;
1404*437bfbebSnyanmisaka         RK_U8 *p_end = NULL;
1405*437bfbebSnyanmisaka         RK_U32 buf_size = mpp_buffer_get_size(buffers->hw_out_buf);
1406*437bfbebSnyanmisaka         RK_U32 bus_addr = mpp_buffer_get_fd(buffers->hw_out_buf);
1407*437bfbebSnyanmisaka         RK_U8 *p_start = mpp_buffer_get_ptr(buffers->hw_out_buf);
1408*437bfbebSnyanmisaka 
1409*437bfbebSnyanmisaka         p_end = p_start + 3;
1410*437bfbebSnyanmisaka         if (ctx->frame_type == VP8E_FRM_KEY)
1411*437bfbebSnyanmisaka             p_end += 7;// frame tag len:I frame 10 byte, P frmae 3 byte.
1412*437bfbebSnyanmisaka         vp8e_set_buffer(&ctx->bitbuf[0], p_start, p_end - p_start);
1413*437bfbebSnyanmisaka 
1414*437bfbebSnyanmisaka         offset = p_end - p_start;
1415*437bfbebSnyanmisaka         hw_cfg->output_strm_base = bus_addr;
1416*437bfbebSnyanmisaka         hw_cfg->output_strm_offset = offset;
1417*437bfbebSnyanmisaka 
1418*437bfbebSnyanmisaka         p_start = p_end;
1419*437bfbebSnyanmisaka         p_end = p_start + buf_size / 10;
1420*437bfbebSnyanmisaka         p_end = (RK_U8 *)((size_t)p_end & ~0x7);
1421*437bfbebSnyanmisaka         vp8e_set_buffer(&ctx->bitbuf[1], p_start, p_end - p_start);
1422*437bfbebSnyanmisaka 
1423*437bfbebSnyanmisaka         offset += p_end - p_start;
1424*437bfbebSnyanmisaka         hw_cfg->partition_Base[0] = bus_addr;
1425*437bfbebSnyanmisaka         hw_cfg->partition_offset[0] = offset;
1426*437bfbebSnyanmisaka 
1427*437bfbebSnyanmisaka         p_start = p_end;
1428*437bfbebSnyanmisaka         p_end = mpp_buffer_get_ptr(buffers->hw_out_buf) + buf_size;
1429*437bfbebSnyanmisaka         p_end = (RK_U8 *)((size_t)p_end & ~0x7);
1430*437bfbebSnyanmisaka         vp8e_set_buffer(&ctx->bitbuf[2], p_start, p_end - p_start);
1431*437bfbebSnyanmisaka 
1432*437bfbebSnyanmisaka         offset += p_end - p_start;
1433*437bfbebSnyanmisaka         hw_cfg->partition_Base[1] = bus_addr;
1434*437bfbebSnyanmisaka         hw_cfg->partition_offset[1] = offset;
1435*437bfbebSnyanmisaka         hw_cfg->output_strm_size = p_end - p_start;
1436*437bfbebSnyanmisaka 
1437*437bfbebSnyanmisaka         p_start = p_end;
1438*437bfbebSnyanmisaka     }
1439*437bfbebSnyanmisaka 
1440*437bfbebSnyanmisaka     {
1441*437bfbebSnyanmisaka         HalVp8ePicBuf *pic_buf = &ctx->picbuf;
1442*437bfbebSnyanmisaka 
1443*437bfbebSnyanmisaka         pic_buf->cur_pic->show = 1;
1444*437bfbebSnyanmisaka         pic_buf->cur_pic->poc = ctx->frame_cnt;
1445*437bfbebSnyanmisaka         pic_buf->cur_pic->i_frame = (ctx->frame_type == VP8E_FRM_KEY);
1446*437bfbebSnyanmisaka 
1447*437bfbebSnyanmisaka         init_picbuf(ctx);
1448*437bfbebSnyanmisaka 
1449*437bfbebSnyanmisaka         if (ctx->frame_type == VP8E_FRM_P) {
1450*437bfbebSnyanmisaka             pic_buf->cur_pic->p_frame = 1;
1451*437bfbebSnyanmisaka             pic_buf->cur_pic->arf = 1;
1452*437bfbebSnyanmisaka             pic_buf->cur_pic->grf = 1;
1453*437bfbebSnyanmisaka             pic_buf->cur_pic->ipf = 1;
1454*437bfbebSnyanmisaka             pic_buf->ref_pic_list[0].search = 1;
1455*437bfbebSnyanmisaka             pic_buf->ref_pic_list[1].search = 1;
1456*437bfbebSnyanmisaka             pic_buf->ref_pic_list[2].search = 1;
1457*437bfbebSnyanmisaka         }
1458*437bfbebSnyanmisaka 
1459*437bfbebSnyanmisaka         if (ctx->rc->frame_coded == 0)
1460*437bfbebSnyanmisaka             return MPP_OK;
1461*437bfbebSnyanmisaka 
1462*437bfbebSnyanmisaka         if (ctx->rc->golden_picture_rate) {
1463*437bfbebSnyanmisaka             pic_buf->cur_pic->grf = 1;
1464*437bfbebSnyanmisaka             if (!pic_buf->cur_pic->arf)
1465*437bfbebSnyanmisaka                 pic_buf->ref_pic_list[1].arf = 1;
1466*437bfbebSnyanmisaka         }
1467*437bfbebSnyanmisaka     }
1468*437bfbebSnyanmisaka     set_frame_params(ctx);
1469*437bfbebSnyanmisaka     set_picbuf_ref(ctx);
1470*437bfbebSnyanmisaka     set_code_frame(ctx);
1471*437bfbebSnyanmisaka 
1472*437bfbebSnyanmisaka     return MPP_OK;
1473*437bfbebSnyanmisaka }
1474*437bfbebSnyanmisaka 
hal_vp8e_init_qp_table(void * hal)1475*437bfbebSnyanmisaka MPP_RET hal_vp8e_init_qp_table(void *hal)
1476*437bfbebSnyanmisaka {
1477*437bfbebSnyanmisaka     RK_S32 i = 0, j = 0;
1478*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
1479*437bfbebSnyanmisaka 
1480*437bfbebSnyanmisaka     for (i = 0; i < QINDEX_RANGE; i++) {
1481*437bfbebSnyanmisaka         RK_S32 tmp = 0;
1482*437bfbebSnyanmisaka         Vp8eQp * qp = &ctx->qp_y1[i];
1483*437bfbebSnyanmisaka 
1484*437bfbebSnyanmisaka         for (j = 0; j < 2; j++) {
1485*437bfbebSnyanmisaka             if (j == 0) {
1486*437bfbebSnyanmisaka                 tmp = dc_q_lookup_tbl[MPP_CLIP3(0, QINDEX_RANGE - 1, i)];
1487*437bfbebSnyanmisaka             } else {
1488*437bfbebSnyanmisaka                 tmp = ac_q_lookup_tbl[MPP_CLIP3(0, QINDEX_RANGE - 1, i)];
1489*437bfbebSnyanmisaka             }
1490*437bfbebSnyanmisaka 
1491*437bfbebSnyanmisaka             qp->quant[j] = MPP_MIN((1 << 16) / tmp, 0x3FFF);
1492*437bfbebSnyanmisaka             qp->zbin[j]  = ((q_zbin_factors_tbl[i] * tmp) + 64) >> 7;
1493*437bfbebSnyanmisaka             qp->round[j]   = (q_rounding_factors_tbl[i] * tmp) >> 7;
1494*437bfbebSnyanmisaka             qp->dequant[j] = tmp;
1495*437bfbebSnyanmisaka         }
1496*437bfbebSnyanmisaka 
1497*437bfbebSnyanmisaka         qp = &ctx->qp_y2[i];
1498*437bfbebSnyanmisaka         for (j = 0; j < 2; j++) {
1499*437bfbebSnyanmisaka             if (j == 0) {
1500*437bfbebSnyanmisaka                 tmp = dc_q_lookup_tbl[MPP_CLIP3(0, QINDEX_RANGE - 1, i)];
1501*437bfbebSnyanmisaka                 tmp = tmp * 2;
1502*437bfbebSnyanmisaka             } else {
1503*437bfbebSnyanmisaka                 tmp = ac_q_lookup_tbl[MPP_CLIP3(0, QINDEX_RANGE - 1, i)];
1504*437bfbebSnyanmisaka                 tmp = (tmp * 155) / 100;
1505*437bfbebSnyanmisaka                 if (tmp < 8)
1506*437bfbebSnyanmisaka                     tmp = 8;
1507*437bfbebSnyanmisaka             }
1508*437bfbebSnyanmisaka             qp->quant[j]   = MPP_MIN((1 << 16) / tmp, 0x3FFF);
1509*437bfbebSnyanmisaka             qp->zbin[j]    = ((q_zbin_factors_tbl[i] * tmp) + 64) >> 7;
1510*437bfbebSnyanmisaka             qp->round[j]   = (q_rounding_factors_tbl[i] * tmp) >> 7;
1511*437bfbebSnyanmisaka             qp->dequant[j] = tmp;
1512*437bfbebSnyanmisaka         }
1513*437bfbebSnyanmisaka 
1514*437bfbebSnyanmisaka         qp = &ctx->qp_ch[i];
1515*437bfbebSnyanmisaka         for (j = 0; j < 2; j++) {
1516*437bfbebSnyanmisaka             if (j == 0) {
1517*437bfbebSnyanmisaka                 tmp = dc_q_lookup_tbl[MPP_CLIP3(0, QINDEX_RANGE - 1, i)];
1518*437bfbebSnyanmisaka                 if (tmp > 132)
1519*437bfbebSnyanmisaka                     tmp = 132;
1520*437bfbebSnyanmisaka             } else {
1521*437bfbebSnyanmisaka                 tmp = ac_q_lookup_tbl[MPP_CLIP3(0, QINDEX_RANGE - 1, i)];
1522*437bfbebSnyanmisaka             }
1523*437bfbebSnyanmisaka             qp->quant[j]   = MPP_MIN((1 << 16) / tmp, 0x3FFF);
1524*437bfbebSnyanmisaka             qp->zbin[j]    = ((q_zbin_factors_tbl[i] * tmp) + 64) >> 7;
1525*437bfbebSnyanmisaka             qp->round[j]   = (q_rounding_factors_tbl[i] * tmp) >> 7;
1526*437bfbebSnyanmisaka             qp->dequant[j] = tmp;
1527*437bfbebSnyanmisaka         }
1528*437bfbebSnyanmisaka     }
1529*437bfbebSnyanmisaka 
1530*437bfbebSnyanmisaka     return MPP_OK;
1531*437bfbebSnyanmisaka }
1532*437bfbebSnyanmisaka 
hal_vp8e_update_buffers(void * hal,HalEncTask * task)1533*437bfbebSnyanmisaka MPP_RET hal_vp8e_update_buffers(void *hal, HalEncTask *task)
1534*437bfbebSnyanmisaka {
1535*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
1536*437bfbebSnyanmisaka     Vp8eVpuBuf *buffers = (Vp8eVpuBuf *)ctx->buffers;
1537*437bfbebSnyanmisaka     const RK_U32 hw_offset = ctx->hw_cfg.first_free_bit / 8;
1538*437bfbebSnyanmisaka     RK_U32 *part = (RK_U32 *)mpp_buffer_get_ptr(buffers->hw_size_table_buf);
1539*437bfbebSnyanmisaka 
1540*437bfbebSnyanmisaka     mpp_buffer_sync_begin(buffers->hw_size_table_buf);
1541*437bfbebSnyanmisaka 
1542*437bfbebSnyanmisaka     ctx->bitbuf[1].byte_cnt += part[0] - hw_offset;
1543*437bfbebSnyanmisaka     ctx->bitbuf[1].data += part[0] - hw_offset;
1544*437bfbebSnyanmisaka 
1545*437bfbebSnyanmisaka     ctx->bitbuf[2].byte_cnt = part[1];
1546*437bfbebSnyanmisaka     ctx->bitbuf[2].data += part[1];
1547*437bfbebSnyanmisaka     ctx->bitbuf[3].byte_cnt = part[2];
1548*437bfbebSnyanmisaka     ctx->bitbuf[3].data += part[2];
1549*437bfbebSnyanmisaka 
1550*437bfbebSnyanmisaka     set_frame_tag(ctx);
1551*437bfbebSnyanmisaka 
1552*437bfbebSnyanmisaka     if (vp8e_buffer_gap(&ctx->bitbuf[1], 4) == MPP_OK) {
1553*437bfbebSnyanmisaka         set_data_part_size(ctx);
1554*437bfbebSnyanmisaka     }
1555*437bfbebSnyanmisaka 
1556*437bfbebSnyanmisaka     ctx->prev_frame_lost = 0;
1557*437bfbebSnyanmisaka 
1558*437bfbebSnyanmisaka     ctx->p_out_buf[0] = (RK_U32 *)ctx->bitbuf[0].p_data;
1559*437bfbebSnyanmisaka     ctx->p_out_buf[1] = (RK_U32 *)ctx->bitbuf[2].p_data;
1560*437bfbebSnyanmisaka     if (ctx->sps.dct_partitions)
1561*437bfbebSnyanmisaka         ctx->p_out_buf[2] = (RK_U32 *)ctx->bitbuf[3].p_data;
1562*437bfbebSnyanmisaka 
1563*437bfbebSnyanmisaka     ctx->stream_size[0] = ctx->bitbuf[0].byte_cnt +
1564*437bfbebSnyanmisaka                           ctx->bitbuf[1].byte_cnt;
1565*437bfbebSnyanmisaka     ctx->stream_size[1] = ctx->bitbuf[2].byte_cnt;
1566*437bfbebSnyanmisaka 
1567*437bfbebSnyanmisaka     if (ctx->sps.dct_partitions)
1568*437bfbebSnyanmisaka         ctx->stream_size[2] = ctx->bitbuf[3].byte_cnt;
1569*437bfbebSnyanmisaka 
1570*437bfbebSnyanmisaka     ctx->frame_size = ctx->stream_size[0] + ctx->stream_size[1] +
1571*437bfbebSnyanmisaka                       ctx->stream_size[2];
1572*437bfbebSnyanmisaka 
1573*437bfbebSnyanmisaka     update_picbuf(&ctx->picbuf);
1574*437bfbebSnyanmisaka     {
1575*437bfbebSnyanmisaka         HalEncTask *enc_task = task;
1576*437bfbebSnyanmisaka         RK_U8 *p_out = mpp_buffer_get_ptr(enc_task->output);
1577*437bfbebSnyanmisaka         RK_S32 disable_ivf = ctx->cfg->vp8.disable_ivf;
1578*437bfbebSnyanmisaka 
1579*437bfbebSnyanmisaka         mpp_buffer_sync_begin(buffers->hw_size_table_buf);
1580*437bfbebSnyanmisaka 
1581*437bfbebSnyanmisaka         if (!disable_ivf) {
1582*437bfbebSnyanmisaka             p_out += enc_task->length;
1583*437bfbebSnyanmisaka 
1584*437bfbebSnyanmisaka             if (ctx->frame_size) {
1585*437bfbebSnyanmisaka                 write_ivf_frame(ctx, p_out);
1586*437bfbebSnyanmisaka 
1587*437bfbebSnyanmisaka                 p_out += IVF_FRM_BYTES;
1588*437bfbebSnyanmisaka                 enc_task->length += IVF_FRM_BYTES;
1589*437bfbebSnyanmisaka             }
1590*437bfbebSnyanmisaka         }
1591*437bfbebSnyanmisaka 
1592*437bfbebSnyanmisaka         memcpy(p_out, ctx->p_out_buf[0], ctx->stream_size[0]);
1593*437bfbebSnyanmisaka         p_out += ctx->stream_size[0];
1594*437bfbebSnyanmisaka         enc_task->length += ctx->stream_size[0];
1595*437bfbebSnyanmisaka 
1596*437bfbebSnyanmisaka         memcpy(p_out, ctx->p_out_buf[1], ctx->stream_size[1]);
1597*437bfbebSnyanmisaka         p_out += ctx->stream_size[1];
1598*437bfbebSnyanmisaka         enc_task->length += ctx->stream_size[1];
1599*437bfbebSnyanmisaka 
1600*437bfbebSnyanmisaka         memcpy(p_out, ctx->p_out_buf[2], ctx->stream_size[2]);
1601*437bfbebSnyanmisaka         p_out += ctx->stream_size[2];
1602*437bfbebSnyanmisaka         enc_task->length += ctx->stream_size[2];
1603*437bfbebSnyanmisaka 
1604*437bfbebSnyanmisaka         mpp_buffer_sync_end(buffers->hw_size_table_buf);
1605*437bfbebSnyanmisaka     }
1606*437bfbebSnyanmisaka     return MPP_OK;
1607*437bfbebSnyanmisaka }
1608*437bfbebSnyanmisaka 
hal_vp8e_setup(void * hal)1609*437bfbebSnyanmisaka MPP_RET hal_vp8e_setup(void *hal)
1610*437bfbebSnyanmisaka {
1611*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1612*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
1613*437bfbebSnyanmisaka 
1614*437bfbebSnyanmisaka     if (set_parameter(ctx)) {
1615*437bfbebSnyanmisaka         mpp_err("set vp8e parameter failed");
1616*437bfbebSnyanmisaka         return MPP_NOK;
1617*437bfbebSnyanmisaka     }
1618*437bfbebSnyanmisaka 
1619*437bfbebSnyanmisaka     if (set_picbuf(ctx)) {
1620*437bfbebSnyanmisaka         mpp_err("set vp8e picbuf failed, no enough memory");
1621*437bfbebSnyanmisaka         return MPP_ERR_NOMEM;
1622*437bfbebSnyanmisaka     }
1623*437bfbebSnyanmisaka 
1624*437bfbebSnyanmisaka     ret = alloc_buffer(ctx);
1625*437bfbebSnyanmisaka 
1626*437bfbebSnyanmisaka     return ret;
1627*437bfbebSnyanmisaka }
1628*437bfbebSnyanmisaka 
hal_vp8e_buf_free(void * hal)1629*437bfbebSnyanmisaka MPP_RET hal_vp8e_buf_free(void *hal)
1630*437bfbebSnyanmisaka {
1631*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
1632*437bfbebSnyanmisaka     Vp8eVpuBuf *buffers = (Vp8eVpuBuf *)ctx->buffers;
1633*437bfbebSnyanmisaka 
1634*437bfbebSnyanmisaka     if (buffers->hw_luma_buf) {
1635*437bfbebSnyanmisaka         mpp_buffer_put(buffers->hw_luma_buf);
1636*437bfbebSnyanmisaka         buffers->hw_luma_buf = NULL;
1637*437bfbebSnyanmisaka     }
1638*437bfbebSnyanmisaka 
1639*437bfbebSnyanmisaka     {
1640*437bfbebSnyanmisaka         RK_U32 i = 0;
1641*437bfbebSnyanmisaka         for (i = 0; i < 2; i++) {
1642*437bfbebSnyanmisaka             if (buffers->hw_cbcr_buf[i]) {
1643*437bfbebSnyanmisaka                 mpp_buffer_put(buffers->hw_cbcr_buf[i]);
1644*437bfbebSnyanmisaka                 buffers->hw_cbcr_buf[i] = NULL;
1645*437bfbebSnyanmisaka             }
1646*437bfbebSnyanmisaka         }
1647*437bfbebSnyanmisaka     }
1648*437bfbebSnyanmisaka 
1649*437bfbebSnyanmisaka     if (buffers->hw_size_table_buf) {
1650*437bfbebSnyanmisaka         mpp_buffer_put(buffers->hw_size_table_buf);
1651*437bfbebSnyanmisaka         buffers->hw_size_table_buf = NULL;
1652*437bfbebSnyanmisaka     }
1653*437bfbebSnyanmisaka 
1654*437bfbebSnyanmisaka     if (buffers->hw_cabac_table_buf) {
1655*437bfbebSnyanmisaka         mpp_buffer_put(buffers->hw_cabac_table_buf);
1656*437bfbebSnyanmisaka         buffers->hw_cabac_table_buf = NULL;
1657*437bfbebSnyanmisaka     }
1658*437bfbebSnyanmisaka 
1659*437bfbebSnyanmisaka     if (buffers->hw_mv_output_buf) {
1660*437bfbebSnyanmisaka         mpp_buffer_put(buffers->hw_mv_output_buf);
1661*437bfbebSnyanmisaka         buffers->hw_mv_output_buf = NULL;
1662*437bfbebSnyanmisaka     }
1663*437bfbebSnyanmisaka 
1664*437bfbebSnyanmisaka     if (buffers->hw_prob_count_buf) {
1665*437bfbebSnyanmisaka         mpp_buffer_put(buffers->hw_prob_count_buf);
1666*437bfbebSnyanmisaka         buffers->hw_prob_count_buf = NULL;
1667*437bfbebSnyanmisaka     }
1668*437bfbebSnyanmisaka 
1669*437bfbebSnyanmisaka     if (buffers->hw_segment_map_buf) {
1670*437bfbebSnyanmisaka         mpp_buffer_put(buffers->hw_segment_map_buf);
1671*437bfbebSnyanmisaka         buffers->hw_segment_map_buf = NULL;
1672*437bfbebSnyanmisaka     }
1673*437bfbebSnyanmisaka 
1674*437bfbebSnyanmisaka     if (buffers->hw_out_buf) {
1675*437bfbebSnyanmisaka         mpp_buffer_put(buffers->hw_out_buf);
1676*437bfbebSnyanmisaka         buffers->hw_out_buf = NULL;
1677*437bfbebSnyanmisaka     }
1678*437bfbebSnyanmisaka 
1679*437bfbebSnyanmisaka     if (buffers->hw_buf_grp) {
1680*437bfbebSnyanmisaka         mpp_buffer_group_put(buffers->hw_buf_grp);
1681*437bfbebSnyanmisaka         buffers->hw_buf_grp = NULL;
1682*437bfbebSnyanmisaka     }
1683*437bfbebSnyanmisaka 
1684*437bfbebSnyanmisaka     return MPP_OK;
1685*437bfbebSnyanmisaka }
1686