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