1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka * Copyright 2021 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 #include "vepu580_tune.h"
18*437bfbebSnyanmisaka
19*437bfbebSnyanmisaka #define HAL_H264E_DBG_CONTENT (0x00000200)
20*437bfbebSnyanmisaka #define hal_h264e_dbg_content(fmt, ...) hal_h264e_dbg_f(HAL_H264E_DBG_CONTENT, fmt, ## __VA_ARGS__)
21*437bfbebSnyanmisaka
22*437bfbebSnyanmisaka /*
23*437bfbebSnyanmisaka * Please follow the configuration below:
24*437bfbebSnyanmisaka *
25*437bfbebSnyanmisaka * FRAME_CONTENT_ANALYSIS_NUM >= 5
26*437bfbebSnyanmisaka * MD_WIN_LEN >= 3
27*437bfbebSnyanmisaka * MD_SHOW_LEN == 4
28*437bfbebSnyanmisaka */
29*437bfbebSnyanmisaka
30*437bfbebSnyanmisaka typedef struct HalH264eVepu580Tune_t {
31*437bfbebSnyanmisaka HalH264eVepu580Ctx *ctx;
32*437bfbebSnyanmisaka
33*437bfbebSnyanmisaka /* motion and texture statistic of previous frames */
34*437bfbebSnyanmisaka RK_S32 curr_scene_motion_flag;
35*437bfbebSnyanmisaka /* motion and texture statistic of previous frames */
36*437bfbebSnyanmisaka RK_S32 ap_motion_flag;
37*437bfbebSnyanmisaka // level: 0~2: 0 <--> static, 1 <-->medium motion, 2 <--> large motion
38*437bfbebSnyanmisaka RK_S32 md_madp[MD_WIN_LEN];
39*437bfbebSnyanmisaka // level: 0~2: 0 <--> simple texture, 1 <--> medium texture, 2 <--> complex texture
40*437bfbebSnyanmisaka RK_S32 txtr_madi[FRAME_CONTENT_ANALYSIS_NUM];
41*437bfbebSnyanmisaka RK_S32 scene_motion_flag_matrix[FRAME_MOTION_ANALYSIS_NUM];
42*437bfbebSnyanmisaka RK_S32 md_flag_matrix[MD_SHOW_LEN];
43*437bfbebSnyanmisaka
44*437bfbebSnyanmisaka RK_S32 pre_madp[2];
45*437bfbebSnyanmisaka RK_S32 pre_madi[2];
46*437bfbebSnyanmisaka } HalH264eVepu580Tune;
47*437bfbebSnyanmisaka
48*437bfbebSnyanmisaka static RK_S32 mb_avg_madp_thd[6] = {192, 128, 64, 192, 128, 64};
49*437bfbebSnyanmisaka
50*437bfbebSnyanmisaka static RK_S32 atr_wgt[4][9] = {
51*437bfbebSnyanmisaka {22, 19, 16, 22, 19, 18, 22, 19, 16},
52*437bfbebSnyanmisaka {19, 19, 19, 19, 19, 19, 19, 19, 19},
53*437bfbebSnyanmisaka {22, 19, 16, 22, 19, 18, 22, 19, 16},
54*437bfbebSnyanmisaka {20, 20, 20, 20, 20, 20, 20, 20, 20},
55*437bfbebSnyanmisaka };
56*437bfbebSnyanmisaka
57*437bfbebSnyanmisaka static RK_S32 skip_atf_wgt[4][13] = {
58*437bfbebSnyanmisaka {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
59*437bfbebSnyanmisaka {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
60*437bfbebSnyanmisaka {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
61*437bfbebSnyanmisaka {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
62*437bfbebSnyanmisaka };
63*437bfbebSnyanmisaka
64*437bfbebSnyanmisaka static RK_S32 intra_atf_wgt[4][12] = {
65*437bfbebSnyanmisaka {24, 22, 21, 22, 21, 20, 20, 19, 18, 16, 16, 16},
66*437bfbebSnyanmisaka {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
67*437bfbebSnyanmisaka {22, 21, 20, 21, 20, 19, 20, 19, 18, 16, 16, 16},
68*437bfbebSnyanmisaka {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
69*437bfbebSnyanmisaka };
70*437bfbebSnyanmisaka
71*437bfbebSnyanmisaka static RK_S32 cime_multi[4][4] = {
72*437bfbebSnyanmisaka {4, 8, 24, 24},
73*437bfbebSnyanmisaka {4, 7, 20, 20},
74*437bfbebSnyanmisaka {4, 7, 20, 20},
75*437bfbebSnyanmisaka {4, 4, 4, 4},
76*437bfbebSnyanmisaka };
77*437bfbebSnyanmisaka
78*437bfbebSnyanmisaka static RK_S32 rime_multi[4][3] = {
79*437bfbebSnyanmisaka {4, 32, 128},
80*437bfbebSnyanmisaka {4, 16, 64},
81*437bfbebSnyanmisaka {4, 16, 64},
82*437bfbebSnyanmisaka {4, 4, 4},
83*437bfbebSnyanmisaka };
84*437bfbebSnyanmisaka
vepu580_h264e_tune_init(HalH264eVepu580Ctx * ctx)85*437bfbebSnyanmisaka static HalH264eVepu580Tune *vepu580_h264e_tune_init(HalH264eVepu580Ctx *ctx)
86*437bfbebSnyanmisaka {
87*437bfbebSnyanmisaka HalH264eVepu580Tune *tune = mpp_malloc(HalH264eVepu580Tune, 1);
88*437bfbebSnyanmisaka RK_S32 scene_mode = ctx->cfg->tune.scene_mode == MPP_ENC_SCENE_MODE_IPC ? 0 : 1;
89*437bfbebSnyanmisaka
90*437bfbebSnyanmisaka if (NULL == tune)
91*437bfbebSnyanmisaka return tune;
92*437bfbebSnyanmisaka
93*437bfbebSnyanmisaka tune->ctx = ctx;
94*437bfbebSnyanmisaka tune->curr_scene_motion_flag = 0;
95*437bfbebSnyanmisaka tune->ap_motion_flag = scene_mode;
96*437bfbebSnyanmisaka memset(tune->md_madp, 0, sizeof(tune->md_madp));
97*437bfbebSnyanmisaka memset(tune->txtr_madi, 0, sizeof(tune->txtr_madi));
98*437bfbebSnyanmisaka memset(tune->md_flag_matrix, 0, sizeof(tune->md_flag_matrix));
99*437bfbebSnyanmisaka memset(tune->scene_motion_flag_matrix, 0, sizeof(tune->scene_motion_flag_matrix));
100*437bfbebSnyanmisaka tune->pre_madi[0] = tune->pre_madi[1] = -1;
101*437bfbebSnyanmisaka tune->pre_madp[0] = tune->pre_madp[1] = -1;
102*437bfbebSnyanmisaka
103*437bfbebSnyanmisaka return tune;
104*437bfbebSnyanmisaka }
105*437bfbebSnyanmisaka
vepu580_h264e_tune_deinit(void * tune)106*437bfbebSnyanmisaka static void vepu580_h264e_tune_deinit(void *tune)
107*437bfbebSnyanmisaka {
108*437bfbebSnyanmisaka MPP_FREE(tune);
109*437bfbebSnyanmisaka }
110*437bfbebSnyanmisaka
vepu580_h264e_tune_reg_patch(void * p)111*437bfbebSnyanmisaka static void vepu580_h264e_tune_reg_patch(void *p)
112*437bfbebSnyanmisaka {
113*437bfbebSnyanmisaka HalH264eVepu580Tune *tune = (HalH264eVepu580Tune *)p;
114*437bfbebSnyanmisaka HalH264eVepu580Ctx *ctx = NULL;
115*437bfbebSnyanmisaka RK_S32 scene_mode = 0;
116*437bfbebSnyanmisaka
117*437bfbebSnyanmisaka if (NULL == tune)
118*437bfbebSnyanmisaka return;
119*437bfbebSnyanmisaka
120*437bfbebSnyanmisaka ctx = tune->ctx;
121*437bfbebSnyanmisaka scene_mode = ctx->cfg->tune.scene_mode == MPP_ENC_SCENE_MODE_IPC ? 0 : 1;
122*437bfbebSnyanmisaka
123*437bfbebSnyanmisaka H264eSlice *slice = ctx->slice;
124*437bfbebSnyanmisaka HalVepu580RegSet *regs = ctx->regs_set;
125*437bfbebSnyanmisaka tune->ap_motion_flag = scene_mode;
126*437bfbebSnyanmisaka RK_U32 scene_motion_flag = tune->ap_motion_flag * 2 + tune->curr_scene_motion_flag;
127*437bfbebSnyanmisaka MppEncHwCfg *hw = &ctx->cfg->hw;
128*437bfbebSnyanmisaka
129*437bfbebSnyanmisaka if (scene_motion_flag > 3) {
130*437bfbebSnyanmisaka mpp_err_f("scene_motion_flag is a wrong value %d\n", scene_motion_flag);
131*437bfbebSnyanmisaka return;
132*437bfbebSnyanmisaka }
133*437bfbebSnyanmisaka
134*437bfbebSnyanmisaka /* modify register here */
135*437bfbebSnyanmisaka if (slice->slice_type != H264_I_SLICE) {
136*437bfbebSnyanmisaka RK_U32 *src = (tune->curr_scene_motion_flag ||
137*437bfbebSnyanmisaka ctx->cfg->rc.rc_mode == MPP_ENC_RC_MODE_SMTRC) ?
138*437bfbebSnyanmisaka &h264e_klut_weight[0] : &h264e_klut_weight[4];
139*437bfbebSnyanmisaka memcpy(®s->reg_rc_klut.klut_wgt0, src, CHROMA_KLUT_TAB_SIZE);
140*437bfbebSnyanmisaka }
141*437bfbebSnyanmisaka
142*437bfbebSnyanmisaka regs->reg_rc_klut.md_sad_thd.md_sad_thd0 = 4;
143*437bfbebSnyanmisaka regs->reg_rc_klut.md_sad_thd.md_sad_thd1 = 9;
144*437bfbebSnyanmisaka regs->reg_rc_klut.md_sad_thd.md_sad_thd2 = 15;
145*437bfbebSnyanmisaka regs->reg_rc_klut.madi_thd.madi_thd0 = 4;
146*437bfbebSnyanmisaka regs->reg_rc_klut.madi_thd.madi_thd1 = 9;
147*437bfbebSnyanmisaka regs->reg_rc_klut.madi_thd.madi_thd2 = 15;
148*437bfbebSnyanmisaka
149*437bfbebSnyanmisaka if (tune->curr_scene_motion_flag) {
150*437bfbebSnyanmisaka regs->reg_s3.lvl16_intra_UL_CST_THD.lvl16_intra_ul_cst_thld = 2501;
151*437bfbebSnyanmisaka regs->reg_s3.RDO_QUANT.quant_f_bias_P = 341;
152*437bfbebSnyanmisaka regs->reg_base.iprd_csts.vthd_y = 0;
153*437bfbebSnyanmisaka regs->reg_base.iprd_csts.vthd_c = 0;
154*437bfbebSnyanmisaka regs->reg_rc_klut.klut_ofst.chrm_klut_ofst = 0;
155*437bfbebSnyanmisaka regs->reg_base.rdo_cfg.atf_intra_e = 0;
156*437bfbebSnyanmisaka regs->reg_rdo.rdo_sqi_cfg.atf_pskip_en = 0;
157*437bfbebSnyanmisaka regs->reg_s3.ATR_THD1.atr_thdqp = 51;
158*437bfbebSnyanmisaka regs->reg_s3.cime_sqi_cfg.cime_pmv_set_zero = 0;
159*437bfbebSnyanmisaka regs->reg_s3.rime_sqi_thd.cime_sad_th0 = 0;
160*437bfbebSnyanmisaka regs->reg_s3.fme_sqi_thd0.cime_sad_pu16_th = 0;
161*437bfbebSnyanmisaka regs->reg_s3.fme_sqi_thd1.move_lambda = 8;
162*437bfbebSnyanmisaka }
163*437bfbebSnyanmisaka
164*437bfbebSnyanmisaka regs->reg_rdo.rdo_intra_cime_thd0.atf_rdo_intra_cime_thd0 = 28;
165*437bfbebSnyanmisaka regs->reg_rdo.rdo_intra_cime_thd0.atf_rdo_intra_cime_thd1 = 44;
166*437bfbebSnyanmisaka regs->reg_rdo.rdo_intra_cime_thd1.atf_rdo_intra_cime_thd2 = 72;
167*437bfbebSnyanmisaka regs->reg_rdo.rdo_intra_atf_wgt0.atf_rdo_intra_wgt00 = intra_atf_wgt[scene_motion_flag][0];
168*437bfbebSnyanmisaka regs->reg_rdo.rdo_intra_atf_wgt0.atf_rdo_intra_wgt01 = intra_atf_wgt[scene_motion_flag][1];
169*437bfbebSnyanmisaka regs->reg_rdo.rdo_intra_atf_wgt0.atf_rdo_intra_wgt02 = intra_atf_wgt[scene_motion_flag][2];
170*437bfbebSnyanmisaka regs->reg_rdo.rdo_intra_atf_wgt1.atf_rdo_intra_wgt10 = intra_atf_wgt[scene_motion_flag][3];
171*437bfbebSnyanmisaka regs->reg_rdo.rdo_intra_atf_wgt1.atf_rdo_intra_wgt11 = intra_atf_wgt[scene_motion_flag][4];
172*437bfbebSnyanmisaka regs->reg_rdo.rdo_intra_atf_wgt1.atf_rdo_intra_wgt12 = intra_atf_wgt[scene_motion_flag][5];
173*437bfbebSnyanmisaka regs->reg_rdo.rdo_intra_atf_wgt2.atf_rdo_intra_wgt20 = intra_atf_wgt[scene_motion_flag][6];
174*437bfbebSnyanmisaka regs->reg_rdo.rdo_intra_atf_wgt2.atf_rdo_intra_wgt21 = intra_atf_wgt[scene_motion_flag][7];
175*437bfbebSnyanmisaka regs->reg_rdo.rdo_intra_atf_wgt2.atf_rdo_intra_wgt22 = intra_atf_wgt[scene_motion_flag][8];
176*437bfbebSnyanmisaka regs->reg_rdo.rdo_intra_atf_wgt3.atf_rdo_intra_wgt30 = intra_atf_wgt[scene_motion_flag][9];
177*437bfbebSnyanmisaka regs->reg_rdo.rdo_intra_atf_wgt3.atf_rdo_intra_wgt31 = intra_atf_wgt[scene_motion_flag][10];
178*437bfbebSnyanmisaka regs->reg_rdo.rdo_intra_atf_wgt3.atf_rdo_intra_wgt32 = intra_atf_wgt[scene_motion_flag][11];
179*437bfbebSnyanmisaka
180*437bfbebSnyanmisaka regs->reg_rdo.rdo_skip_cime_thd0.atf_rdo_skip_cime_thd0 = 10;
181*437bfbebSnyanmisaka regs->reg_rdo.rdo_skip_cime_thd0.atf_rdo_skip_cime_thd1 = 8;
182*437bfbebSnyanmisaka regs->reg_rdo.rdo_skip_cime_thd1.atf_rdo_skip_cime_thd2 = 15;
183*437bfbebSnyanmisaka regs->reg_rdo.rdo_skip_cime_thd1.atf_rdo_skip_cime_thd3 = 25;
184*437bfbebSnyanmisaka regs->reg_rdo.rdo_skip_atf_wgt0.atf_rdo_skip_atf_wgt00 = skip_atf_wgt[scene_motion_flag][0];
185*437bfbebSnyanmisaka regs->reg_rdo.rdo_skip_atf_wgt0.atf_rdo_skip_atf_wgt10 = skip_atf_wgt[scene_motion_flag][1];
186*437bfbebSnyanmisaka regs->reg_rdo.rdo_skip_atf_wgt0.atf_rdo_skip_atf_wgt11 = skip_atf_wgt[scene_motion_flag][2];
187*437bfbebSnyanmisaka regs->reg_rdo.rdo_skip_atf_wgt0.atf_rdo_skip_atf_wgt12 = skip_atf_wgt[scene_motion_flag][3];
188*437bfbebSnyanmisaka regs->reg_rdo.rdo_skip_atf_wgt1.atf_rdo_skip_atf_wgt20 = skip_atf_wgt[scene_motion_flag][4];
189*437bfbebSnyanmisaka regs->reg_rdo.rdo_skip_atf_wgt1.atf_rdo_skip_atf_wgt21 = skip_atf_wgt[scene_motion_flag][5];
190*437bfbebSnyanmisaka regs->reg_rdo.rdo_skip_atf_wgt1.atf_rdo_skip_atf_wgt22 = skip_atf_wgt[scene_motion_flag][6];
191*437bfbebSnyanmisaka regs->reg_rdo.rdo_skip_atf_wgt2.atf_rdo_skip_atf_wgt30 = skip_atf_wgt[scene_motion_flag][7];
192*437bfbebSnyanmisaka regs->reg_rdo.rdo_skip_atf_wgt2.atf_rdo_skip_atf_wgt31 = skip_atf_wgt[scene_motion_flag][8];
193*437bfbebSnyanmisaka regs->reg_rdo.rdo_skip_atf_wgt2.atf_rdo_skip_atf_wgt32 = skip_atf_wgt[scene_motion_flag][9];
194*437bfbebSnyanmisaka regs->reg_rdo.rdo_skip_atf_wgt3.atf_rdo_skip_atf_wgt40 = skip_atf_wgt[scene_motion_flag][10];
195*437bfbebSnyanmisaka regs->reg_rdo.rdo_skip_atf_wgt3.atf_rdo_skip_atf_wgt41 = skip_atf_wgt[scene_motion_flag][11];
196*437bfbebSnyanmisaka regs->reg_rdo.rdo_skip_atf_wgt3.atf_rdo_skip_atf_wgt42 = skip_atf_wgt[scene_motion_flag][12];
197*437bfbebSnyanmisaka
198*437bfbebSnyanmisaka if (slice->slice_type != H264_I_SLICE) {
199*437bfbebSnyanmisaka regs->reg_s3.Lvl16_ATR_WGT.lvl16_atr_wgt0 = atr_wgt[scene_motion_flag][0];
200*437bfbebSnyanmisaka regs->reg_s3.Lvl16_ATR_WGT.lvl16_atr_wgt1 = atr_wgt[scene_motion_flag][1];
201*437bfbebSnyanmisaka regs->reg_s3.Lvl16_ATR_WGT.lvl16_atr_wgt2 = atr_wgt[scene_motion_flag][2];
202*437bfbebSnyanmisaka regs->reg_s3.Lvl8_ATR_WGT.lvl8_atr_wgt0 = atr_wgt[scene_motion_flag][3];
203*437bfbebSnyanmisaka regs->reg_s3.Lvl8_ATR_WGT.lvl8_atr_wgt1 = atr_wgt[scene_motion_flag][4];
204*437bfbebSnyanmisaka regs->reg_s3.Lvl8_ATR_WGT.lvl8_atr_wgt2 = atr_wgt[scene_motion_flag][5];
205*437bfbebSnyanmisaka regs->reg_s3.Lvl4_ATR_WGT.lvl4_atr_wgt0 = atr_wgt[scene_motion_flag][6];
206*437bfbebSnyanmisaka regs->reg_s3.Lvl4_ATR_WGT.lvl4_atr_wgt1 = atr_wgt[scene_motion_flag][7];
207*437bfbebSnyanmisaka regs->reg_s3.Lvl4_ATR_WGT.lvl4_atr_wgt2 = atr_wgt[scene_motion_flag][8];
208*437bfbebSnyanmisaka }
209*437bfbebSnyanmisaka
210*437bfbebSnyanmisaka regs->reg_s3.cime_sqi_multi0.cime_multi0 = cime_multi[scene_motion_flag][0];
211*437bfbebSnyanmisaka regs->reg_s3.cime_sqi_multi0.cime_multi1 = cime_multi[scene_motion_flag][1];
212*437bfbebSnyanmisaka regs->reg_s3.cime_sqi_multi1.cime_multi2 = cime_multi[scene_motion_flag][2];
213*437bfbebSnyanmisaka regs->reg_s3.cime_sqi_multi1.cime_multi3 = cime_multi[scene_motion_flag][3];
214*437bfbebSnyanmisaka
215*437bfbebSnyanmisaka regs->reg_s3.rime_sqi_multi.rime_multi0 = rime_multi[scene_motion_flag][0];
216*437bfbebSnyanmisaka regs->reg_s3.rime_sqi_multi.rime_multi1 = rime_multi[scene_motion_flag][1];
217*437bfbebSnyanmisaka regs->reg_s3.rime_sqi_multi.rime_multi2 = rime_multi[scene_motion_flag][2];
218*437bfbebSnyanmisaka
219*437bfbebSnyanmisaka if (hw->qbias_en) {
220*437bfbebSnyanmisaka regs->reg_s3.RDO_QUANT.quant_f_bias_I = hw->qbias_i ? hw->qbias_i : 683;
221*437bfbebSnyanmisaka regs->reg_s3.RDO_QUANT.quant_f_bias_P = hw->qbias_p ? hw->qbias_p : 341;
222*437bfbebSnyanmisaka }
223*437bfbebSnyanmisaka }
224*437bfbebSnyanmisaka
vepu580_h264e_tune_stat_update(void * p,HalEncTask * task)225*437bfbebSnyanmisaka static void vepu580_h264e_tune_stat_update(void *p, HalEncTask *task)
226*437bfbebSnyanmisaka {
227*437bfbebSnyanmisaka HalH264eVepu580Tune *tune = (HalH264eVepu580Tune *)p;
228*437bfbebSnyanmisaka HalH264eVepu580Ctx *ctx = NULL;
229*437bfbebSnyanmisaka EncRcTaskInfo *rc_info = &task->rc_task->info;
230*437bfbebSnyanmisaka RK_S32 scene_mode = 0;
231*437bfbebSnyanmisaka
232*437bfbebSnyanmisaka if (NULL == tune)
233*437bfbebSnyanmisaka return;
234*437bfbebSnyanmisaka
235*437bfbebSnyanmisaka ctx = tune->ctx;
236*437bfbebSnyanmisaka scene_mode = ctx->cfg->tune.scene_mode == MPP_ENC_SCENE_MODE_IPC ? 0 : 1;
237*437bfbebSnyanmisaka tune->ap_motion_flag = scene_mode;
238*437bfbebSnyanmisaka /* update statistic info here */
239*437bfbebSnyanmisaka RK_S32 mb_num = 0;
240*437bfbebSnyanmisaka RK_S32 madp = 0;
241*437bfbebSnyanmisaka RK_S32 md_flag = 0;
242*437bfbebSnyanmisaka RK_S32 nScore = 0;
243*437bfbebSnyanmisaka RK_S32 j;
244*437bfbebSnyanmisaka RK_S32 nScoreT = ((MD_WIN_LEN - 2) * 6 + 2 * 8 + 2 * 11 + 2 * 13) / 2;
245*437bfbebSnyanmisaka RK_S32 i = 0;
246*437bfbebSnyanmisaka RK_S32 mvbit = 10;
247*437bfbebSnyanmisaka RK_S32 madp_cnt_statistics[5];
248*437bfbebSnyanmisaka HalVepu580RegSet *regs = &ctx->regs_sets[task->flags.reg_idx];
249*437bfbebSnyanmisaka
250*437bfbebSnyanmisaka for (i = 0; i < 5; i++) {
251*437bfbebSnyanmisaka madp_cnt_statistics[i] = regs->reg_st.md_sad_b16num0 * madp_num_map[i][0] +
252*437bfbebSnyanmisaka regs->reg_st.md_sad_b16num1 * madp_num_map[i][1] +
253*437bfbebSnyanmisaka regs->reg_st.md_sad_b16num2 * madp_num_map[i][2] +
254*437bfbebSnyanmisaka regs->reg_st.md_sad_b16num3 * madp_num_map[i][3];
255*437bfbebSnyanmisaka }
256*437bfbebSnyanmisaka
257*437bfbebSnyanmisaka rc_info->madi =
258*437bfbebSnyanmisaka tune->pre_madi[0] = (!regs->reg_st.st_bnum_b16.num_b16) ? 0 :
259*437bfbebSnyanmisaka regs->reg_st.madi / regs->reg_st.st_bnum_b16.num_b16;
260*437bfbebSnyanmisaka rc_info->madp =
261*437bfbebSnyanmisaka tune->pre_madp[0] = (!regs->reg_st.st_bnum_cme.num_ctu) ? 0 :
262*437bfbebSnyanmisaka regs->reg_st.madp / regs->reg_st.st_bnum_cme.num_ctu;
263*437bfbebSnyanmisaka
264*437bfbebSnyanmisaka mb_num = regs->reg_st.madi_b16num0 + regs->reg_st.madi_b16num1 +
265*437bfbebSnyanmisaka regs->reg_st.madi_b16num2 + regs->reg_st.madi_b16num3;
266*437bfbebSnyanmisaka mb_num = mb_num ? mb_num : 1;
267*437bfbebSnyanmisaka if (0 != tune->ap_motion_flag)
268*437bfbebSnyanmisaka mvbit = 15;
269*437bfbebSnyanmisaka
270*437bfbebSnyanmisaka madp = MOTION_LEVEL_STILL;
271*437bfbebSnyanmisaka if (0 != madp_cnt_statistics[4]) {
272*437bfbebSnyanmisaka RK_S32 base = tune->ap_motion_flag * 3;
273*437bfbebSnyanmisaka
274*437bfbebSnyanmisaka for (i = 0; i < 3; i++, base++) {
275*437bfbebSnyanmisaka if (tune->pre_madp[0] >= mb_avg_madp_thd[base]) {
276*437bfbebSnyanmisaka if (madp_cnt_statistics[0] > mb_num * ctu_madp_cnt_thd[base][0] >> mvbit ||
277*437bfbebSnyanmisaka madp_cnt_statistics[1] > mb_num * ctu_madp_cnt_thd[base][1] >> mvbit ||
278*437bfbebSnyanmisaka madp_cnt_statistics[2] > mb_num * ctu_madp_cnt_thd[base][2] >> mvbit) {
279*437bfbebSnyanmisaka madp = MOTION_LEVEL_BIG_MOTION;
280*437bfbebSnyanmisaka } else if ((madp_cnt_statistics[0] > mb_num * ctu_madp_cnt_thd[base][3] >> mvbit ||
281*437bfbebSnyanmisaka madp_cnt_statistics[1] > mb_num * ctu_madp_cnt_thd[base][4] >> mvbit) &&
282*437bfbebSnyanmisaka madp_cnt_statistics[3] < mb_num * ctu_madp_cnt_thd[base][5] >> mvbit) {
283*437bfbebSnyanmisaka madp = MOTION_LEVEL_BIG_MOTION;
284*437bfbebSnyanmisaka } else if (madp_cnt_statistics[3] < mb_num * ctu_madp_cnt_thd[base][6] >> mvbit) {
285*437bfbebSnyanmisaka madp = MOTION_LEVEL_BIG_MOTION;
286*437bfbebSnyanmisaka } else if (madp_cnt_statistics[3] < mb_num * ctu_madp_cnt_thd[base][7] >> mvbit) {
287*437bfbebSnyanmisaka madp = MOTION_LEVEL_MOTION;
288*437bfbebSnyanmisaka }
289*437bfbebSnyanmisaka break;
290*437bfbebSnyanmisaka }
291*437bfbebSnyanmisaka }
292*437bfbebSnyanmisaka } else {
293*437bfbebSnyanmisaka madp = MOTION_LEVEL_UNKNOW_SCENE;
294*437bfbebSnyanmisaka }
295*437bfbebSnyanmisaka
296*437bfbebSnyanmisaka if (MOTION_LEVEL_UNKNOW_SCENE != madp) {
297*437bfbebSnyanmisaka nScore = madp * 13 + tune->md_madp[0] * 11 + tune->md_madp[1] * 8;
298*437bfbebSnyanmisaka } else {
299*437bfbebSnyanmisaka nScore = tune->md_madp[0] * 11 + tune->md_madp[1] * 8;
300*437bfbebSnyanmisaka nScoreT -= 13;
301*437bfbebSnyanmisaka }
302*437bfbebSnyanmisaka
303*437bfbebSnyanmisaka for (j = 2; j < MD_WIN_LEN; j++) {
304*437bfbebSnyanmisaka nScore += tune->md_madp[j] * 6;
305*437bfbebSnyanmisaka }
306*437bfbebSnyanmisaka
307*437bfbebSnyanmisaka if (nScore >= nScoreT) {
308*437bfbebSnyanmisaka md_flag = 1;
309*437bfbebSnyanmisaka }
310*437bfbebSnyanmisaka
311*437bfbebSnyanmisaka tune->curr_scene_motion_flag = 0;
312*437bfbebSnyanmisaka if (tune->md_flag_matrix[0] && tune->md_flag_matrix[1] && tune->md_flag_matrix[2]) {
313*437bfbebSnyanmisaka tune->curr_scene_motion_flag = 1;
314*437bfbebSnyanmisaka } else if ((tune->md_flag_matrix[0] && tune->md_flag_matrix[1]) || (tune->md_flag_matrix[1] && tune->md_flag_matrix[2] && tune->md_flag_matrix[3])) {
315*437bfbebSnyanmisaka tune->curr_scene_motion_flag = md_flag;
316*437bfbebSnyanmisaka }
317*437bfbebSnyanmisaka
318*437bfbebSnyanmisaka if (MOTION_LEVEL_UNKNOW_SCENE != madp) {
319*437bfbebSnyanmisaka for (j = MD_WIN_LEN - 2; j >= 0; j--) {
320*437bfbebSnyanmisaka tune->md_madp[j + 1] = tune->md_madp[j];
321*437bfbebSnyanmisaka }
322*437bfbebSnyanmisaka tune->md_madp[0] = madp;
323*437bfbebSnyanmisaka }
324*437bfbebSnyanmisaka for (j = MD_SHOW_LEN - 2; j >= 0; j--) {
325*437bfbebSnyanmisaka tune->md_flag_matrix[j + 1] = tune->md_flag_matrix[j];
326*437bfbebSnyanmisaka }
327*437bfbebSnyanmisaka
328*437bfbebSnyanmisaka tune->md_flag_matrix[0] = md_flag;
329*437bfbebSnyanmisaka
330*437bfbebSnyanmisaka for (j = FRAME_MOTION_ANALYSIS_NUM - 2; j >= 0; j--) {
331*437bfbebSnyanmisaka tune->scene_motion_flag_matrix[j + 1] = tune->scene_motion_flag_matrix[j];
332*437bfbebSnyanmisaka }
333*437bfbebSnyanmisaka tune->scene_motion_flag_matrix[0] = tune->curr_scene_motion_flag;
334*437bfbebSnyanmisaka
335*437bfbebSnyanmisaka tune->pre_madi[1] = tune->pre_madi[0];
336*437bfbebSnyanmisaka tune->pre_madp[1] = tune->pre_madp[0];
337*437bfbebSnyanmisaka }
338*437bfbebSnyanmisaka
setup_vepu580_qpmap_buf(HalH264eVepu580Ctx * ctx)339*437bfbebSnyanmisaka static MPP_RET setup_vepu580_qpmap_buf(HalH264eVepu580Ctx *ctx)
340*437bfbebSnyanmisaka {
341*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
342*437bfbebSnyanmisaka RK_S32 mb_w = MPP_ALIGN(ctx->cfg->prep.width, 64) / 16;
343*437bfbebSnyanmisaka RK_S32 mb_h = MPP_ALIGN(ctx->cfg->prep.height, 16) / 16;
344*437bfbebSnyanmisaka RK_S32 qpmap_base_cfg_size = ctx->qpmap_base_cfg_size
345*437bfbebSnyanmisaka = mb_w * mb_h * 8;
346*437bfbebSnyanmisaka RK_S32 qpmap_qp_cfg_size = ctx->qpmap_qp_cfg_size
347*437bfbebSnyanmisaka = mb_w * mb_h * 2;
348*437bfbebSnyanmisaka RK_S32 md_flag_size = ctx->md_flag_size
349*437bfbebSnyanmisaka = mb_w * mb_h;
350*437bfbebSnyanmisaka
351*437bfbebSnyanmisaka if (!ctx->cfg->tune.deblur_en) {
352*437bfbebSnyanmisaka mpp_log("deblurring is closed!\n");
353*437bfbebSnyanmisaka goto __RET;
354*437bfbebSnyanmisaka }
355*437bfbebSnyanmisaka
356*437bfbebSnyanmisaka if (NULL == ctx->qpmap_base_cfg_buf) {
357*437bfbebSnyanmisaka mpp_buffer_get(NULL, &ctx->qpmap_base_cfg_buf, qpmap_base_cfg_size);
358*437bfbebSnyanmisaka if (!ctx->qpmap_base_cfg_buf) {
359*437bfbebSnyanmisaka mpp_err("qpmap_base_cfg_buf malloc fail, qpmap invalid\n");
360*437bfbebSnyanmisaka ret = MPP_ERR_VALUE;
361*437bfbebSnyanmisaka goto __RET;
362*437bfbebSnyanmisaka }
363*437bfbebSnyanmisaka }
364*437bfbebSnyanmisaka
365*437bfbebSnyanmisaka if (NULL == ctx->qpmap_qp_cfg_buf) {
366*437bfbebSnyanmisaka mpp_buffer_get(NULL, &ctx->qpmap_qp_cfg_buf, qpmap_qp_cfg_size);
367*437bfbebSnyanmisaka if (!ctx->qpmap_qp_cfg_buf) {
368*437bfbebSnyanmisaka mpp_err("qpmap_qp_cfg_buf malloc fail, qpmap invalid\n");
369*437bfbebSnyanmisaka ret = MPP_ERR_VALUE;
370*437bfbebSnyanmisaka goto __RET;
371*437bfbebSnyanmisaka }
372*437bfbebSnyanmisaka }
373*437bfbebSnyanmisaka
374*437bfbebSnyanmisaka if (NULL == ctx->md_flag_buf) {
375*437bfbebSnyanmisaka ctx->md_flag_buf = mpp_malloc(RK_U8, md_flag_size);
376*437bfbebSnyanmisaka if (!ctx->md_flag_buf) {
377*437bfbebSnyanmisaka mpp_err("md_flag_buf malloc fail, qpmap invalid\n");
378*437bfbebSnyanmisaka ret = MPP_ERR_VALUE;
379*437bfbebSnyanmisaka goto __RET;
380*437bfbebSnyanmisaka }
381*437bfbebSnyanmisaka }
382*437bfbebSnyanmisaka
383*437bfbebSnyanmisaka __RET:
384*437bfbebSnyanmisaka hal_h264e_dbg_func("leave, ret %d\n", ret);
385*437bfbebSnyanmisaka return ret;
386*437bfbebSnyanmisaka }