xref: /rockchip-linux_mpp/mpp/hal/rkenc/h265e/hal_h265e_vepu580_tune.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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 #include "hal_h265e_vepu580_reg.h"
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #define HAL_H265E_DBG_CONTENT           (0x00200000)
21*437bfbebSnyanmisaka #define hal_h264e_dbg_content(fmt, ...) hal_h264e_dbg_f(HAL_H264E_DBG_CONTENT, fmt, ## __VA_ARGS__)
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka #define CTU_BASE_CFG_BYTE 64
24*437bfbebSnyanmisaka #define CTU_QP_CFG_BYTE 192
25*437bfbebSnyanmisaka 
26*437bfbebSnyanmisaka /*
27*437bfbebSnyanmisaka  * Please follow the configuration below:
28*437bfbebSnyanmisaka  *
29*437bfbebSnyanmisaka  * FRAME_CONTENT_ANALYSIS_NUM >= 5
30*437bfbebSnyanmisaka  * MD_WIN_LEN >= 3
31*437bfbebSnyanmisaka  * MD_SHOW_LEN == 4
32*437bfbebSnyanmisaka  */
33*437bfbebSnyanmisaka 
34*437bfbebSnyanmisaka typedef struct HalH265eVepu580Tune_t {
35*437bfbebSnyanmisaka     H265eV580HalContext  *ctx;
36*437bfbebSnyanmisaka 
37*437bfbebSnyanmisaka     /* motion and texture statistic of previous frames */
38*437bfbebSnyanmisaka     RK_S32  curr_scene_motion_flag;
39*437bfbebSnyanmisaka     /* motion and texture statistic of previous frames */
40*437bfbebSnyanmisaka     RK_S32  ap_motion_flag;
41*437bfbebSnyanmisaka     // level: 0~2: 0 <--> static, 1 <-->medium motion, 2 <--> large motion
42*437bfbebSnyanmisaka     RK_S32  md_madp[MD_WIN_LEN];
43*437bfbebSnyanmisaka     // level: 0~2: 0 <--> simple texture, 1 <--> medium texture, 2 <--> complex texture
44*437bfbebSnyanmisaka     RK_S32  txtr_madi[FRAME_CONTENT_ANALYSIS_NUM];
45*437bfbebSnyanmisaka     RK_S32  scene_motion_flag_matrix[FRAME_MOTION_ANALYSIS_NUM];
46*437bfbebSnyanmisaka     RK_S32  md_flag_matrix[MD_SHOW_LEN];
47*437bfbebSnyanmisaka 
48*437bfbebSnyanmisaka     RK_S32  pre_madp[2];
49*437bfbebSnyanmisaka     RK_S32  pre_madi[2];
50*437bfbebSnyanmisaka } HalH265eVepu580Tune;
51*437bfbebSnyanmisaka 
52*437bfbebSnyanmisaka static RK_S32 ctu_avg_madp_thd[6] = {896, 640, 384, 896, 640, 384};
53*437bfbebSnyanmisaka 
54*437bfbebSnyanmisaka static RK_U8 lvl32_preintra_cst_wgt[4][8] = {
55*437bfbebSnyanmisaka     {21, 20, 19, 18, 20, 22, 24, 16},
56*437bfbebSnyanmisaka     {19, 18, 17, 16, 18, 20, 21, 16},
57*437bfbebSnyanmisaka     {20, 19, 18, 17, 19, 21, 22, 16},
58*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16},
59*437bfbebSnyanmisaka };
60*437bfbebSnyanmisaka 
61*437bfbebSnyanmisaka static RK_U8 lvl16_preintra_cst_wgt[4][8] = {
62*437bfbebSnyanmisaka     {21, 20, 19, 18, 20, 22, 24, 16},
63*437bfbebSnyanmisaka     {19, 18, 17, 16, 18, 20, 21, 16},
64*437bfbebSnyanmisaka     {20, 19, 18, 17, 19, 21, 22, 16},
65*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16},
66*437bfbebSnyanmisaka };
67*437bfbebSnyanmisaka 
68*437bfbebSnyanmisaka static RK_S32 skip_b64_atf_wgt[4][13] = {
69*437bfbebSnyanmisaka     {16, 13, 14, 15, 14, 14, 15, 15, 15, 16, 16, 16, 16},
70*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
71*437bfbebSnyanmisaka     {16, 14, 15, 16, 14, 14, 15, 15, 15, 16, 16, 16, 16},
72*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
73*437bfbebSnyanmisaka };
74*437bfbebSnyanmisaka 
75*437bfbebSnyanmisaka static RK_S32 intra_b32_atf_wgt[4][12] = {
76*437bfbebSnyanmisaka     {24, 23, 23, 23, 22, 21, 20, 19, 18, 16, 16, 16},
77*437bfbebSnyanmisaka     {21, 20, 19, 20, 19, 18, 19, 18, 18, 18, 18, 17},
78*437bfbebSnyanmisaka     {20, 19, 18, 19, 18, 17, 18, 17, 17, 16, 16, 16},
79*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
80*437bfbebSnyanmisaka };
81*437bfbebSnyanmisaka 
82*437bfbebSnyanmisaka static RK_S32 skip_b32_atf_wgt[4][13] = {
83*437bfbebSnyanmisaka     {16, 13, 14, 15, 14, 14, 15, 15, 15, 16, 16, 16, 16},
84*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
85*437bfbebSnyanmisaka     {18, 14, 14, 15, 14, 14, 15, 15, 15, 16, 16, 16, 16},
86*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
87*437bfbebSnyanmisaka };
88*437bfbebSnyanmisaka 
89*437bfbebSnyanmisaka static RK_S32 intra_b16_atf_wgt[4][12] = {
90*437bfbebSnyanmisaka     {24, 23, 23, 23, 22, 21, 20, 19, 18, 16, 16, 16},
91*437bfbebSnyanmisaka     {21, 20, 19, 20, 19, 18, 19, 18, 18, 18, 18, 17},
92*437bfbebSnyanmisaka     {20, 19, 18, 19, 18, 17, 18, 17, 17, 16, 16, 16},
93*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
94*437bfbebSnyanmisaka };
95*437bfbebSnyanmisaka 
96*437bfbebSnyanmisaka static RK_S32 skip_b16_atf_wgt[4][13] = {
97*437bfbebSnyanmisaka     {16, 13, 14, 15, 14, 14, 15, 15, 15, 16, 16, 16, 16},
98*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
99*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
100*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
101*437bfbebSnyanmisaka };
102*437bfbebSnyanmisaka 
103*437bfbebSnyanmisaka static RK_S32 intra_b8_atf_wgt[4][12] = {
104*437bfbebSnyanmisaka     {24, 23, 23, 23, 22, 21, 20, 19, 18, 16, 16, 16},
105*437bfbebSnyanmisaka     {21, 20, 19, 20, 19, 18, 19, 18, 18, 18, 18, 17},
106*437bfbebSnyanmisaka     {20, 19, 18, 19, 18, 17, 18, 17, 17, 16, 16, 16},
107*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
108*437bfbebSnyanmisaka };
109*437bfbebSnyanmisaka 
110*437bfbebSnyanmisaka static RK_S32 skip_b8_atf_wgt[4][13] = {
111*437bfbebSnyanmisaka     {16, 13, 14, 15, 14, 14, 15, 15, 15, 16, 16, 16, 16},
112*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
113*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
114*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
115*437bfbebSnyanmisaka };
116*437bfbebSnyanmisaka 
117*437bfbebSnyanmisaka static RK_U32 intra_lvl16_sobel_a[4][9] = {
118*437bfbebSnyanmisaka     {32, 32, 32, 32, 32, 32, 32, 32, 32},
119*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16},
120*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16},
121*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16},
122*437bfbebSnyanmisaka };
123*437bfbebSnyanmisaka 
124*437bfbebSnyanmisaka static RK_U32 intra_lvl16_sobel_c[4][9] = {
125*437bfbebSnyanmisaka     {13, 13, 13, 13, 13, 13, 13, 13, 13},
126*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16},
127*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16},
128*437bfbebSnyanmisaka     {16, 16, 16, 16, 16, 16, 16, 16, 16},
129*437bfbebSnyanmisaka };
130*437bfbebSnyanmisaka 
131*437bfbebSnyanmisaka static RK_U32 intra_lvl16_sobel_d[4][9] = {
132*437bfbebSnyanmisaka     {23750, 23750, 23750, 23750, 23750, 23750, 23750, 23750, 23750},
133*437bfbebSnyanmisaka     {0, 0, 0, 0, 0, 0, 0, 0, 0},
134*437bfbebSnyanmisaka     {0, 0, 0, 0, 0, 0, 0, 0, 0},
135*437bfbebSnyanmisaka     {0, 0, 0, 0, 0, 0, 0, 0, 0},
136*437bfbebSnyanmisaka };
137*437bfbebSnyanmisaka 
138*437bfbebSnyanmisaka static RK_U32 intra_lvl32_sobel_a[4][5] = {
139*437bfbebSnyanmisaka     {18, 18, 18, 18, 18},
140*437bfbebSnyanmisaka     {16, 16, 16, 16, 16},
141*437bfbebSnyanmisaka     {16, 16, 16, 16, 16},
142*437bfbebSnyanmisaka     {16, 16, 16, 16, 16},
143*437bfbebSnyanmisaka };
144*437bfbebSnyanmisaka 
145*437bfbebSnyanmisaka static RK_U32 intra_lvl32_sobel_c[4][5] = {
146*437bfbebSnyanmisaka     {16, 16, 16, 16, 16},
147*437bfbebSnyanmisaka     {16, 16, 16, 16, 16},
148*437bfbebSnyanmisaka     {16, 16, 16, 16, 16},
149*437bfbebSnyanmisaka     {16, 16, 16, 16, 16},
150*437bfbebSnyanmisaka };
151*437bfbebSnyanmisaka 
152*437bfbebSnyanmisaka static RK_U32 qnt_bias_i[4] = {
153*437bfbebSnyanmisaka     128, 128, 128, 128
154*437bfbebSnyanmisaka };
155*437bfbebSnyanmisaka 
156*437bfbebSnyanmisaka static RK_U32 qnt_bias_p[4] = {
157*437bfbebSnyanmisaka     60, 60, 85, 85
158*437bfbebSnyanmisaka };
159*437bfbebSnyanmisaka 
160*437bfbebSnyanmisaka static RK_U32 rime_sqi_cime_sad_th[4] = {
161*437bfbebSnyanmisaka     48, 0, 0, 0
162*437bfbebSnyanmisaka };
163*437bfbebSnyanmisaka 
164*437bfbebSnyanmisaka static RK_U32 fme_sqi_cime_sad_pu16_th[4] = {
165*437bfbebSnyanmisaka     16, 0, 0, 0
166*437bfbebSnyanmisaka };
167*437bfbebSnyanmisaka 
168*437bfbebSnyanmisaka static RK_U32 fme_sqi_cime_sad_pu32_th[4] = {
169*437bfbebSnyanmisaka     16, 0, 0, 0
170*437bfbebSnyanmisaka };
171*437bfbebSnyanmisaka 
172*437bfbebSnyanmisaka static RK_U32 fme_sqi_cime_sad_pu64_th[4] = {
173*437bfbebSnyanmisaka     16, 0, 0, 0
174*437bfbebSnyanmisaka };
175*437bfbebSnyanmisaka 
176*437bfbebSnyanmisaka static RK_U32 chrm_klut_ofst[4] = {
177*437bfbebSnyanmisaka     3, 0, 0, 0
178*437bfbebSnyanmisaka };
179*437bfbebSnyanmisaka 
180*437bfbebSnyanmisaka static RK_S32 pre_intra_b32_cost[4][2] = {
181*437bfbebSnyanmisaka     {31, 30},
182*437bfbebSnyanmisaka     {23, 20},
183*437bfbebSnyanmisaka     {31, 30},
184*437bfbebSnyanmisaka     {23, 20},
185*437bfbebSnyanmisaka };
186*437bfbebSnyanmisaka 
187*437bfbebSnyanmisaka static RK_S32 pre_intra_b16_cost[4][2] = {
188*437bfbebSnyanmisaka     {31, 30},
189*437bfbebSnyanmisaka     {23, 20},
190*437bfbebSnyanmisaka     {31, 30},
191*437bfbebSnyanmisaka     {23, 20},
192*437bfbebSnyanmisaka };
193*437bfbebSnyanmisaka 
194*437bfbebSnyanmisaka static RK_S32 cime_multi[4][4] = {
195*437bfbebSnyanmisaka     {4, 8, 24, 24},
196*437bfbebSnyanmisaka     {4, 7, 20, 20},
197*437bfbebSnyanmisaka     {4, 8, 24, 24},
198*437bfbebSnyanmisaka     {4, 4, 4, 4},
199*437bfbebSnyanmisaka };
200*437bfbebSnyanmisaka 
201*437bfbebSnyanmisaka static RK_S32 rime_multi[4][3] = {
202*437bfbebSnyanmisaka     {4, 32, 128},
203*437bfbebSnyanmisaka     {4, 16, 64},
204*437bfbebSnyanmisaka     {4, 32, 128},
205*437bfbebSnyanmisaka     {4, 4, 4},
206*437bfbebSnyanmisaka };
207*437bfbebSnyanmisaka 
vepu580_h265e_tune_init(H265eV580HalContext * ctx)208*437bfbebSnyanmisaka static HalH265eVepu580Tune *vepu580_h265e_tune_init(H265eV580HalContext *ctx)
209*437bfbebSnyanmisaka {
210*437bfbebSnyanmisaka     HalH265eVepu580Tune *tune = mpp_malloc(HalH265eVepu580Tune, 1);
211*437bfbebSnyanmisaka     RK_S32 scene_mode = ctx->cfg->tune.scene_mode == MPP_ENC_SCENE_MODE_IPC ? 0 : 1;
212*437bfbebSnyanmisaka 
213*437bfbebSnyanmisaka     if (NULL == tune)
214*437bfbebSnyanmisaka         return tune;
215*437bfbebSnyanmisaka 
216*437bfbebSnyanmisaka     tune->ctx = ctx;
217*437bfbebSnyanmisaka     tune->curr_scene_motion_flag = 0;
218*437bfbebSnyanmisaka     tune->ap_motion_flag = scene_mode;
219*437bfbebSnyanmisaka     memset(tune->md_madp, 0, sizeof(tune->md_madp));
220*437bfbebSnyanmisaka     memset(tune->txtr_madi, 0, sizeof(tune->txtr_madi));
221*437bfbebSnyanmisaka     memset(tune->md_flag_matrix, 0, sizeof(tune->md_flag_matrix));
222*437bfbebSnyanmisaka     memset(tune->scene_motion_flag_matrix, 0, sizeof(tune->scene_motion_flag_matrix));
223*437bfbebSnyanmisaka     tune->pre_madi[0] = tune->pre_madi[1] = -1;
224*437bfbebSnyanmisaka     tune->pre_madp[0] = tune->pre_madp[1] = -1;
225*437bfbebSnyanmisaka 
226*437bfbebSnyanmisaka     return tune;
227*437bfbebSnyanmisaka }
228*437bfbebSnyanmisaka 
vepu580_h265e_tune_deinit(void * tune)229*437bfbebSnyanmisaka static void vepu580_h265e_tune_deinit(void *tune)
230*437bfbebSnyanmisaka {
231*437bfbebSnyanmisaka     MPP_FREE(tune);
232*437bfbebSnyanmisaka }
233*437bfbebSnyanmisaka 
vepu580_h265e_tune_atf(H265eV580HalContext * ctx,RK_U32 sm_flag)234*437bfbebSnyanmisaka static void vepu580_h265e_tune_atf(H265eV580HalContext *ctx, RK_U32 sm_flag)
235*437bfbebSnyanmisaka {
236*437bfbebSnyanmisaka     H265eV580RegSet *regs = ctx->frm->regs_set[0];
237*437bfbebSnyanmisaka     vepu580_rdo_cfg  *reg_rdo = &regs->reg_rdo;
238*437bfbebSnyanmisaka     RdoAtfSkipCfg *s;
239*437bfbebSnyanmisaka     RdoAtfCfg* p;
240*437bfbebSnyanmisaka     RK_U32 atf_idx = ctx->cfg->tune.vmaf_opt ? 3 : sm_flag;
241*437bfbebSnyanmisaka 
242*437bfbebSnyanmisaka     s = &reg_rdo->rdo_b64_skip_atf;
243*437bfbebSnyanmisaka     s->rdo_b_cime_thd0.cu_rdo_cime_thd0 = 1;
244*437bfbebSnyanmisaka     s->rdo_b_cime_thd0.cu_rdo_cime_thd1 = 2;
245*437bfbebSnyanmisaka     s->rdo_b_cime_thd1.cu_rdo_cime_thd2 = 4;
246*437bfbebSnyanmisaka     s->rdo_b_cime_thd1.cu_rdo_cime_thd3 = 6;
247*437bfbebSnyanmisaka 
248*437bfbebSnyanmisaka     s->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = skip_b64_atf_wgt[atf_idx][0];
249*437bfbebSnyanmisaka     s->rdo_b_atf_wgt0.cu_rdo_atf_wgt10  = skip_b64_atf_wgt[atf_idx][1];
250*437bfbebSnyanmisaka     s->rdo_b_atf_wgt0.cu_rdo_atf_wgt11  = skip_b64_atf_wgt[atf_idx][2];
251*437bfbebSnyanmisaka     s->rdo_b_atf_wgt0.cu_rdo_atf_wgt12  = skip_b64_atf_wgt[atf_idx][3];
252*437bfbebSnyanmisaka     s->rdo_b_atf_wgt1.cu_rdo_atf_wgt20  = skip_b64_atf_wgt[atf_idx][4];
253*437bfbebSnyanmisaka     s->rdo_b_atf_wgt1.cu_rdo_atf_wgt21  = skip_b64_atf_wgt[atf_idx][5];
254*437bfbebSnyanmisaka     s->rdo_b_atf_wgt1.cu_rdo_atf_wgt22  = skip_b64_atf_wgt[atf_idx][6];
255*437bfbebSnyanmisaka     s->rdo_b_atf_wgt2.cu_rdo_atf_wgt30  = skip_b64_atf_wgt[atf_idx][7];
256*437bfbebSnyanmisaka     s->rdo_b_atf_wgt2.cu_rdo_atf_wgt31  = skip_b64_atf_wgt[atf_idx][8];
257*437bfbebSnyanmisaka     s->rdo_b_atf_wgt2.cu_rdo_atf_wgt32  = skip_b64_atf_wgt[atf_idx][9];
258*437bfbebSnyanmisaka     s->rdo_b_atf_wgt3.cu_rdo_atf_wgt40  = skip_b64_atf_wgt[atf_idx][10];
259*437bfbebSnyanmisaka     s->rdo_b_atf_wgt3.cu_rdo_atf_wgt41  = skip_b64_atf_wgt[atf_idx][11];
260*437bfbebSnyanmisaka     s->rdo_b_atf_wgt3.cu_rdo_atf_wgt42  = skip_b64_atf_wgt[atf_idx][12];
261*437bfbebSnyanmisaka 
262*437bfbebSnyanmisaka     p = &reg_rdo->rdo_b32_intra_atf;
263*437bfbebSnyanmisaka     p->rdo_b_cime_thd0.cu_rdo_cime_thd0 = 24;
264*437bfbebSnyanmisaka     p->rdo_b_cime_thd0.cu_rdo_cime_thd1 = 48;
265*437bfbebSnyanmisaka     p->rdo_b_cime_thd1.cu_rdo_cime_thd2 = 64;
266*437bfbebSnyanmisaka     p->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = intra_b32_atf_wgt[atf_idx][0];
267*437bfbebSnyanmisaka     p->rdo_b_atf_wgt0.cu_rdo_atf_wgt01  = intra_b32_atf_wgt[atf_idx][1];
268*437bfbebSnyanmisaka     p->rdo_b_atf_wgt0.cu_rdo_atf_wgt02  = intra_b32_atf_wgt[atf_idx][2];
269*437bfbebSnyanmisaka     p->rdo_b_atf_wgt1.cu_rdo_atf_wgt10  = intra_b32_atf_wgt[atf_idx][3];
270*437bfbebSnyanmisaka     p->rdo_b_atf_wgt1.cu_rdo_atf_wgt11  = intra_b32_atf_wgt[atf_idx][4];
271*437bfbebSnyanmisaka     p->rdo_b_atf_wgt1.cu_rdo_atf_wgt12  = intra_b32_atf_wgt[atf_idx][5];
272*437bfbebSnyanmisaka     p->rdo_b_atf_wgt2.cu_rdo_atf_wgt20  = intra_b32_atf_wgt[atf_idx][6];
273*437bfbebSnyanmisaka     p->rdo_b_atf_wgt2.cu_rdo_atf_wgt21  = intra_b32_atf_wgt[atf_idx][7];
274*437bfbebSnyanmisaka     p->rdo_b_atf_wgt2.cu_rdo_atf_wgt22  = intra_b32_atf_wgt[atf_idx][8];
275*437bfbebSnyanmisaka     p->rdo_b_atf_wgt3.cu_rdo_atf_wgt30  = intra_b32_atf_wgt[atf_idx][9];
276*437bfbebSnyanmisaka     p->rdo_b_atf_wgt3.cu_rdo_atf_wgt31  = intra_b32_atf_wgt[atf_idx][10];
277*437bfbebSnyanmisaka     p->rdo_b_atf_wgt3.cu_rdo_atf_wgt32  = intra_b32_atf_wgt[atf_idx][11];
278*437bfbebSnyanmisaka 
279*437bfbebSnyanmisaka     s = &reg_rdo->rdo_b32_skip_atf;
280*437bfbebSnyanmisaka     s->rdo_b_cime_thd0.cu_rdo_cime_thd0 =  1;
281*437bfbebSnyanmisaka     s->rdo_b_cime_thd0.cu_rdo_cime_thd1 =  2;
282*437bfbebSnyanmisaka     s->rdo_b_cime_thd1.cu_rdo_cime_thd2 =  4;
283*437bfbebSnyanmisaka     s->rdo_b_cime_thd1.cu_rdo_cime_thd3 =  6;
284*437bfbebSnyanmisaka     s->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  =  skip_b32_atf_wgt[atf_idx][0];
285*437bfbebSnyanmisaka     s->rdo_b_atf_wgt0.cu_rdo_atf_wgt10  =  skip_b32_atf_wgt[atf_idx][1];
286*437bfbebSnyanmisaka     s->rdo_b_atf_wgt0.cu_rdo_atf_wgt11  =  skip_b32_atf_wgt[atf_idx][2];
287*437bfbebSnyanmisaka     s->rdo_b_atf_wgt0.cu_rdo_atf_wgt12  =  skip_b32_atf_wgt[atf_idx][3];
288*437bfbebSnyanmisaka     s->rdo_b_atf_wgt1.cu_rdo_atf_wgt20  =  skip_b32_atf_wgt[atf_idx][4];
289*437bfbebSnyanmisaka     s->rdo_b_atf_wgt1.cu_rdo_atf_wgt21  =  skip_b32_atf_wgt[atf_idx][5];
290*437bfbebSnyanmisaka     s->rdo_b_atf_wgt1.cu_rdo_atf_wgt22  =  skip_b32_atf_wgt[atf_idx][6];
291*437bfbebSnyanmisaka     s->rdo_b_atf_wgt2.cu_rdo_atf_wgt30  =  skip_b32_atf_wgt[atf_idx][7];
292*437bfbebSnyanmisaka     s->rdo_b_atf_wgt2.cu_rdo_atf_wgt31  =  skip_b32_atf_wgt[atf_idx][8];
293*437bfbebSnyanmisaka     s->rdo_b_atf_wgt2.cu_rdo_atf_wgt32  =  skip_b32_atf_wgt[atf_idx][9];
294*437bfbebSnyanmisaka     s->rdo_b_atf_wgt3.cu_rdo_atf_wgt40  =  skip_b32_atf_wgt[atf_idx][10];
295*437bfbebSnyanmisaka     s->rdo_b_atf_wgt3.cu_rdo_atf_wgt41  =  skip_b32_atf_wgt[atf_idx][11];
296*437bfbebSnyanmisaka     s->rdo_b_atf_wgt3.cu_rdo_atf_wgt42  =  skip_b32_atf_wgt[atf_idx][12];
297*437bfbebSnyanmisaka 
298*437bfbebSnyanmisaka     p = &reg_rdo->rdo_b16_intra_atf;
299*437bfbebSnyanmisaka     p->rdo_b_cime_thd0.cu_rdo_cime_thd0 = 24;
300*437bfbebSnyanmisaka     p->rdo_b_cime_thd0.cu_rdo_cime_thd1 = 48;
301*437bfbebSnyanmisaka     p->rdo_b_cime_thd1.cu_rdo_cime_thd2 = 64;
302*437bfbebSnyanmisaka     p->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = intra_b16_atf_wgt[atf_idx][0];
303*437bfbebSnyanmisaka     p->rdo_b_atf_wgt0.cu_rdo_atf_wgt01  = intra_b16_atf_wgt[atf_idx][1];
304*437bfbebSnyanmisaka     p->rdo_b_atf_wgt0.cu_rdo_atf_wgt02  = intra_b16_atf_wgt[atf_idx][2];
305*437bfbebSnyanmisaka     p->rdo_b_atf_wgt1.cu_rdo_atf_wgt10  = intra_b16_atf_wgt[atf_idx][3];
306*437bfbebSnyanmisaka     p->rdo_b_atf_wgt1.cu_rdo_atf_wgt11  = intra_b16_atf_wgt[atf_idx][4];
307*437bfbebSnyanmisaka     p->rdo_b_atf_wgt1.cu_rdo_atf_wgt12  = intra_b16_atf_wgt[atf_idx][5];
308*437bfbebSnyanmisaka     p->rdo_b_atf_wgt2.cu_rdo_atf_wgt20  = intra_b16_atf_wgt[atf_idx][6];
309*437bfbebSnyanmisaka     p->rdo_b_atf_wgt2.cu_rdo_atf_wgt21  = intra_b16_atf_wgt[atf_idx][7];
310*437bfbebSnyanmisaka     p->rdo_b_atf_wgt2.cu_rdo_atf_wgt22  = intra_b16_atf_wgt[atf_idx][8];
311*437bfbebSnyanmisaka     p->rdo_b_atf_wgt3.cu_rdo_atf_wgt30  = intra_b16_atf_wgt[atf_idx][9];
312*437bfbebSnyanmisaka     p->rdo_b_atf_wgt3.cu_rdo_atf_wgt31  = intra_b16_atf_wgt[atf_idx][10];
313*437bfbebSnyanmisaka     p->rdo_b_atf_wgt3.cu_rdo_atf_wgt32  = intra_b16_atf_wgt[atf_idx][11];
314*437bfbebSnyanmisaka 
315*437bfbebSnyanmisaka     s = &reg_rdo->rdo_b16_skip_atf;
316*437bfbebSnyanmisaka     s->rdo_b_cime_thd0.cu_rdo_cime_thd0 = 1;
317*437bfbebSnyanmisaka     s->rdo_b_cime_thd0.cu_rdo_cime_thd1 = 2;
318*437bfbebSnyanmisaka     s->rdo_b_cime_thd1.cu_rdo_cime_thd2 = 4;
319*437bfbebSnyanmisaka     s->rdo_b_cime_thd1.cu_rdo_cime_thd3 = 6;
320*437bfbebSnyanmisaka     s->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = skip_b16_atf_wgt[atf_idx][0];
321*437bfbebSnyanmisaka     s->rdo_b_atf_wgt0.cu_rdo_atf_wgt10  = skip_b16_atf_wgt[atf_idx][1];
322*437bfbebSnyanmisaka     s->rdo_b_atf_wgt0.cu_rdo_atf_wgt11  = skip_b16_atf_wgt[atf_idx][2];
323*437bfbebSnyanmisaka     s->rdo_b_atf_wgt0.cu_rdo_atf_wgt12  = skip_b16_atf_wgt[atf_idx][3];
324*437bfbebSnyanmisaka     s->rdo_b_atf_wgt1.cu_rdo_atf_wgt20  = skip_b16_atf_wgt[atf_idx][4];
325*437bfbebSnyanmisaka     s->rdo_b_atf_wgt1.cu_rdo_atf_wgt21  = skip_b16_atf_wgt[atf_idx][5];
326*437bfbebSnyanmisaka     s->rdo_b_atf_wgt1.cu_rdo_atf_wgt22  = skip_b16_atf_wgt[atf_idx][6];
327*437bfbebSnyanmisaka     s->rdo_b_atf_wgt2.cu_rdo_atf_wgt30  = skip_b16_atf_wgt[atf_idx][7];
328*437bfbebSnyanmisaka     s->rdo_b_atf_wgt2.cu_rdo_atf_wgt31  = skip_b16_atf_wgt[atf_idx][8];
329*437bfbebSnyanmisaka     s->rdo_b_atf_wgt2.cu_rdo_atf_wgt32  = skip_b16_atf_wgt[atf_idx][9];
330*437bfbebSnyanmisaka     s->rdo_b_atf_wgt3.cu_rdo_atf_wgt40  = skip_b16_atf_wgt[atf_idx][10];
331*437bfbebSnyanmisaka     s->rdo_b_atf_wgt3.cu_rdo_atf_wgt41  = skip_b16_atf_wgt[atf_idx][11];
332*437bfbebSnyanmisaka     s->rdo_b_atf_wgt3.cu_rdo_atf_wgt42  = skip_b16_atf_wgt[atf_idx][12];
333*437bfbebSnyanmisaka 
334*437bfbebSnyanmisaka     p = &reg_rdo->rdo_b8_intra_atf;
335*437bfbebSnyanmisaka     p->rdo_b_cime_thd0.cu_rdo_cime_thd0 = 24;
336*437bfbebSnyanmisaka     p->rdo_b_cime_thd0.cu_rdo_cime_thd1 = 48;
337*437bfbebSnyanmisaka     p->rdo_b_cime_thd1.cu_rdo_cime_thd2 = 64;
338*437bfbebSnyanmisaka     p->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = intra_b8_atf_wgt[atf_idx][0];
339*437bfbebSnyanmisaka     p->rdo_b_atf_wgt0.cu_rdo_atf_wgt01  = intra_b8_atf_wgt[atf_idx][1];
340*437bfbebSnyanmisaka     p->rdo_b_atf_wgt0.cu_rdo_atf_wgt02  = intra_b8_atf_wgt[atf_idx][2];
341*437bfbebSnyanmisaka     p->rdo_b_atf_wgt1.cu_rdo_atf_wgt10  = intra_b8_atf_wgt[atf_idx][3];
342*437bfbebSnyanmisaka     p->rdo_b_atf_wgt1.cu_rdo_atf_wgt11  = intra_b8_atf_wgt[atf_idx][4];
343*437bfbebSnyanmisaka     p->rdo_b_atf_wgt1.cu_rdo_atf_wgt12  = intra_b8_atf_wgt[atf_idx][5];
344*437bfbebSnyanmisaka     p->rdo_b_atf_wgt2.cu_rdo_atf_wgt20  = intra_b8_atf_wgt[atf_idx][6];
345*437bfbebSnyanmisaka     p->rdo_b_atf_wgt2.cu_rdo_atf_wgt21  = intra_b8_atf_wgt[atf_idx][7];
346*437bfbebSnyanmisaka     p->rdo_b_atf_wgt2.cu_rdo_atf_wgt22  = intra_b8_atf_wgt[atf_idx][8];
347*437bfbebSnyanmisaka     p->rdo_b_atf_wgt3.cu_rdo_atf_wgt30  = intra_b8_atf_wgt[atf_idx][9];
348*437bfbebSnyanmisaka     p->rdo_b_atf_wgt3.cu_rdo_atf_wgt31  = intra_b8_atf_wgt[atf_idx][10];
349*437bfbebSnyanmisaka     p->rdo_b_atf_wgt3.cu_rdo_atf_wgt32  = intra_b8_atf_wgt[atf_idx][11];
350*437bfbebSnyanmisaka 
351*437bfbebSnyanmisaka     s = &reg_rdo->rdo_b8_skip_atf;
352*437bfbebSnyanmisaka     s->rdo_b_cime_thd0.cu_rdo_cime_thd0 = 1;
353*437bfbebSnyanmisaka     s->rdo_b_cime_thd0.cu_rdo_cime_thd1 = 2;
354*437bfbebSnyanmisaka     s->rdo_b_cime_thd1.cu_rdo_cime_thd2 = 4;
355*437bfbebSnyanmisaka     s->rdo_b_cime_thd1.cu_rdo_cime_thd3 = 6;
356*437bfbebSnyanmisaka     s->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = skip_b8_atf_wgt[atf_idx][0];
357*437bfbebSnyanmisaka     s->rdo_b_atf_wgt0.cu_rdo_atf_wgt10  = skip_b8_atf_wgt[atf_idx][1];
358*437bfbebSnyanmisaka     s->rdo_b_atf_wgt0.cu_rdo_atf_wgt11  = skip_b8_atf_wgt[atf_idx][2];
359*437bfbebSnyanmisaka     s->rdo_b_atf_wgt0.cu_rdo_atf_wgt12  = skip_b8_atf_wgt[atf_idx][3];
360*437bfbebSnyanmisaka     s->rdo_b_atf_wgt1.cu_rdo_atf_wgt20  = skip_b8_atf_wgt[atf_idx][4];
361*437bfbebSnyanmisaka     s->rdo_b_atf_wgt1.cu_rdo_atf_wgt21  = skip_b8_atf_wgt[atf_idx][5];
362*437bfbebSnyanmisaka     s->rdo_b_atf_wgt1.cu_rdo_atf_wgt22  = skip_b8_atf_wgt[atf_idx][6];
363*437bfbebSnyanmisaka     s->rdo_b_atf_wgt2.cu_rdo_atf_wgt30  = skip_b8_atf_wgt[atf_idx][7];
364*437bfbebSnyanmisaka     s->rdo_b_atf_wgt2.cu_rdo_atf_wgt31  = skip_b8_atf_wgt[atf_idx][8];
365*437bfbebSnyanmisaka     s->rdo_b_atf_wgt2.cu_rdo_atf_wgt32  = skip_b8_atf_wgt[atf_idx][9];
366*437bfbebSnyanmisaka     s->rdo_b_atf_wgt3.cu_rdo_atf_wgt40  = skip_b8_atf_wgt[atf_idx][10];
367*437bfbebSnyanmisaka     s->rdo_b_atf_wgt3.cu_rdo_atf_wgt41  = skip_b8_atf_wgt[atf_idx][11];
368*437bfbebSnyanmisaka     s->rdo_b_atf_wgt3.cu_rdo_atf_wgt42  = skip_b8_atf_wgt[atf_idx][12];
369*437bfbebSnyanmisaka }
370*437bfbebSnyanmisaka 
vepu580_h265e_tune_reg_patch(void * p)371*437bfbebSnyanmisaka static void vepu580_h265e_tune_reg_patch(void *p)
372*437bfbebSnyanmisaka {
373*437bfbebSnyanmisaka     HalH265eVepu580Tune *tune = (HalH265eVepu580Tune *)p;
374*437bfbebSnyanmisaka     H265eV580HalContext *ctx = NULL;
375*437bfbebSnyanmisaka     RK_S32 scene_mode = 0;
376*437bfbebSnyanmisaka 
377*437bfbebSnyanmisaka     if (NULL == tune)
378*437bfbebSnyanmisaka         return;
379*437bfbebSnyanmisaka 
380*437bfbebSnyanmisaka     ctx = tune->ctx;
381*437bfbebSnyanmisaka     scene_mode = ctx->cfg->tune.scene_mode == MPP_ENC_SCENE_MODE_IPC ? 0 : 1;
382*437bfbebSnyanmisaka     tune->ap_motion_flag = scene_mode;
383*437bfbebSnyanmisaka     /* modify register here */
384*437bfbebSnyanmisaka     H265eV580RegSet *regs = ctx->frm->regs_set[0];
385*437bfbebSnyanmisaka     hevc_vepu580_rc_klut *rc_regs =  &regs->reg_rc_klut;
386*437bfbebSnyanmisaka     hevc_vepu580_wgt *reg_wgt = &regs->reg_wgt;
387*437bfbebSnyanmisaka     vepu580_rdo_cfg  *reg_rdo = &regs->reg_rdo;
388*437bfbebSnyanmisaka     RK_U32 scene_motion_flag = tune->ap_motion_flag * 2 + tune->curr_scene_motion_flag;
389*437bfbebSnyanmisaka     MppEncHwCfg *hw = &ctx->cfg->hw;
390*437bfbebSnyanmisaka     RK_S32 vmaf_opt = ctx->cfg->tune.vmaf_opt;
391*437bfbebSnyanmisaka     RK_U32 pre_intra_idx = vmaf_opt ? 3 : scene_motion_flag;
392*437bfbebSnyanmisaka 
393*437bfbebSnyanmisaka     if (scene_motion_flag > 3) {
394*437bfbebSnyanmisaka         mpp_err_f("scene_motion_flag is a wrong value %d\n", scene_motion_flag);
395*437bfbebSnyanmisaka         return;
396*437bfbebSnyanmisaka     }
397*437bfbebSnyanmisaka 
398*437bfbebSnyanmisaka     memcpy(&reg_wgt->lvl32_intra_CST_WGT0, lvl32_preintra_cst_wgt[pre_intra_idx],
399*437bfbebSnyanmisaka            sizeof(lvl32_preintra_cst_wgt[pre_intra_idx]));
400*437bfbebSnyanmisaka     memcpy(&reg_wgt->lvl16_intra_CST_WGT0, lvl16_preintra_cst_wgt[pre_intra_idx],
401*437bfbebSnyanmisaka            sizeof(lvl16_preintra_cst_wgt[pre_intra_idx]));
402*437bfbebSnyanmisaka 
403*437bfbebSnyanmisaka     /* Do not adjust the ATF weight when skip bias is enabled */
404*437bfbebSnyanmisaka     if (!hw->skip_bias_en)
405*437bfbebSnyanmisaka         vepu580_h265e_tune_atf(ctx, scene_motion_flag);
406*437bfbebSnyanmisaka 
407*437bfbebSnyanmisaka     reg_rdo->preintra_b32_cst_wgt.pre_intra32_cst_wgt00 = pre_intra_b32_cost[scene_motion_flag][0];
408*437bfbebSnyanmisaka     reg_rdo->preintra_b32_cst_wgt.pre_intra32_cst_wgt01 = pre_intra_b32_cost[scene_motion_flag][1];
409*437bfbebSnyanmisaka     reg_rdo->preintra_b16_cst_wgt.pre_intra16_cst_wgt00 = pre_intra_b16_cost[scene_motion_flag][0];
410*437bfbebSnyanmisaka     reg_rdo->preintra_b16_cst_wgt.pre_intra16_cst_wgt01 = pre_intra_b16_cost[scene_motion_flag][1];
411*437bfbebSnyanmisaka 
412*437bfbebSnyanmisaka     rc_regs->md_sad_thd.md_sad_thd0 = 7;
413*437bfbebSnyanmisaka     rc_regs->md_sad_thd.md_sad_thd1 = 15;
414*437bfbebSnyanmisaka     rc_regs->md_sad_thd.md_sad_thd2 = 25;
415*437bfbebSnyanmisaka     rc_regs->madi_thd.madi_thd0     = 4;
416*437bfbebSnyanmisaka     rc_regs->madi_thd.madi_thd1     = 9;
417*437bfbebSnyanmisaka     rc_regs->madi_thd.madi_thd2     = 15;
418*437bfbebSnyanmisaka 
419*437bfbebSnyanmisaka     reg_wgt->cime_sqi_cfg.cime_pmv_set_zero = !tune->curr_scene_motion_flag;
420*437bfbebSnyanmisaka     reg_wgt->cime_sqi_multi0.cime_multi0 = cime_multi[scene_motion_flag][0];
421*437bfbebSnyanmisaka     reg_wgt->cime_sqi_multi0.cime_multi1 = cime_multi[scene_motion_flag][1];
422*437bfbebSnyanmisaka     reg_wgt->cime_sqi_multi1.cime_multi2 = cime_multi[scene_motion_flag][2];
423*437bfbebSnyanmisaka     reg_wgt->cime_sqi_multi1.cime_multi3 = cime_multi[scene_motion_flag][3];
424*437bfbebSnyanmisaka 
425*437bfbebSnyanmisaka     reg_wgt->rime_sqi_multi.rime_multi0 = rime_multi[scene_motion_flag][0];
426*437bfbebSnyanmisaka     reg_wgt->rime_sqi_multi.rime_multi1 = rime_multi[scene_motion_flag][1];
427*437bfbebSnyanmisaka     reg_wgt->rime_sqi_multi.rime_multi2 = rime_multi[scene_motion_flag][2];
428*437bfbebSnyanmisaka 
429*437bfbebSnyanmisaka     if (tune->curr_scene_motion_flag) {
430*437bfbebSnyanmisaka         reg_wgt->fme_sqi_thd1.move_lambda = 8;
431*437bfbebSnyanmisaka     }
432*437bfbebSnyanmisaka 
433*437bfbebSnyanmisaka     reg_rdo->rdo_sqi_cfg.rdo_segment_en = vmaf_opt ? 0 : !tune->curr_scene_motion_flag;
434*437bfbebSnyanmisaka     reg_rdo->rdo_sqi_cfg.rdo_smear_en = vmaf_opt ? 0 : !tune->curr_scene_motion_flag;
435*437bfbebSnyanmisaka 
436*437bfbebSnyanmisaka     reg_wgt->i16_sobel_a_00.intra_l16_sobel_a0_qp0 = intra_lvl16_sobel_a[scene_motion_flag][0];
437*437bfbebSnyanmisaka     reg_wgt->i16_sobel_a_00.intra_l16_sobel_a0_qp1 = intra_lvl16_sobel_a[scene_motion_flag][1];
438*437bfbebSnyanmisaka     reg_wgt->i16_sobel_a_00.intra_l16_sobel_a0_qp2 = intra_lvl16_sobel_a[scene_motion_flag][2];
439*437bfbebSnyanmisaka     reg_wgt->i16_sobel_a_00.intra_l16_sobel_a0_qp3 = intra_lvl16_sobel_a[scene_motion_flag][3];
440*437bfbebSnyanmisaka     reg_wgt->i16_sobel_a_00.intra_l16_sobel_a0_qp4 = intra_lvl16_sobel_a[scene_motion_flag][4];
441*437bfbebSnyanmisaka     reg_wgt->i16_sobel_a_01.intra_l16_sobel_a0_qp5 = intra_lvl16_sobel_a[scene_motion_flag][5];
442*437bfbebSnyanmisaka     reg_wgt->i16_sobel_a_01.intra_l16_sobel_a0_qp6 = intra_lvl16_sobel_a[scene_motion_flag][6];
443*437bfbebSnyanmisaka     reg_wgt->i16_sobel_a_01.intra_l16_sobel_a0_qp7 = intra_lvl16_sobel_a[scene_motion_flag][7];
444*437bfbebSnyanmisaka     reg_wgt->i16_sobel_a_01.intra_l16_sobel_a0_qp8 = intra_lvl16_sobel_a[scene_motion_flag][8];
445*437bfbebSnyanmisaka     reg_wgt->i16_sobel_c_00.intra_l16_sobel_c0_qp0 = intra_lvl16_sobel_c[scene_motion_flag][0];
446*437bfbebSnyanmisaka     reg_wgt->i16_sobel_c_00.intra_l16_sobel_c0_qp1 = intra_lvl16_sobel_c[scene_motion_flag][1];
447*437bfbebSnyanmisaka     reg_wgt->i16_sobel_c_00.intra_l16_sobel_c0_qp2 = intra_lvl16_sobel_c[scene_motion_flag][2];
448*437bfbebSnyanmisaka     reg_wgt->i16_sobel_c_00.intra_l16_sobel_c0_qp3 = intra_lvl16_sobel_c[scene_motion_flag][3];
449*437bfbebSnyanmisaka     reg_wgt->i16_sobel_c_00.intra_l16_sobel_c0_qp4 = intra_lvl16_sobel_c[scene_motion_flag][4];
450*437bfbebSnyanmisaka     reg_wgt->i16_sobel_c_01.intra_l16_sobel_c0_qp5 = intra_lvl16_sobel_c[scene_motion_flag][5];
451*437bfbebSnyanmisaka     reg_wgt->i16_sobel_c_01.intra_l16_sobel_c0_qp6 = intra_lvl16_sobel_c[scene_motion_flag][6];
452*437bfbebSnyanmisaka     reg_wgt->i16_sobel_c_01.intra_l16_sobel_c0_qp7 = intra_lvl16_sobel_c[scene_motion_flag][7];
453*437bfbebSnyanmisaka     reg_wgt->i16_sobel_c_01.intra_l16_sobel_c0_qp8 = intra_lvl16_sobel_c[scene_motion_flag][8];
454*437bfbebSnyanmisaka     reg_wgt->i16_sobel_d_00.intra_l16_sobel_d0_qp0 = intra_lvl16_sobel_d[scene_motion_flag][0];
455*437bfbebSnyanmisaka     reg_wgt->i16_sobel_d_00.intra_l16_sobel_d0_qp1 = intra_lvl16_sobel_d[scene_motion_flag][1];
456*437bfbebSnyanmisaka     reg_wgt->i16_sobel_d_01.intra_l16_sobel_d0_qp2 = intra_lvl16_sobel_d[scene_motion_flag][2];
457*437bfbebSnyanmisaka     reg_wgt->i16_sobel_d_01.intra_l16_sobel_d0_qp3 = intra_lvl16_sobel_d[scene_motion_flag][3];
458*437bfbebSnyanmisaka     reg_wgt->i16_sobel_d_02.intra_l16_sobel_d0_qp4 = intra_lvl16_sobel_d[scene_motion_flag][4];
459*437bfbebSnyanmisaka     reg_wgt->i16_sobel_d_02.intra_l16_sobel_d0_qp5 = intra_lvl16_sobel_d[scene_motion_flag][5];
460*437bfbebSnyanmisaka     reg_wgt->i16_sobel_d_03.intra_l16_sobel_d0_qp6 = intra_lvl16_sobel_d[scene_motion_flag][6];
461*437bfbebSnyanmisaka     reg_wgt->i16_sobel_d_03.intra_l16_sobel_d0_qp7 = intra_lvl16_sobel_d[scene_motion_flag][7];
462*437bfbebSnyanmisaka     reg_wgt->i16_sobel_d_04.intra_l16_sobel_d0_qp8 = intra_lvl16_sobel_d[scene_motion_flag][8];
463*437bfbebSnyanmisaka     reg_wgt->i32_sobel_a.intra_l32_sobel_a1_qp0 = intra_lvl32_sobel_a[scene_motion_flag][0];
464*437bfbebSnyanmisaka     reg_wgt->i32_sobel_a.intra_l32_sobel_a1_qp1 = intra_lvl32_sobel_a[scene_motion_flag][1];
465*437bfbebSnyanmisaka     reg_wgt->i32_sobel_a.intra_l32_sobel_a1_qp2 = intra_lvl32_sobel_a[scene_motion_flag][2];
466*437bfbebSnyanmisaka     reg_wgt->i32_sobel_a.intra_l32_sobel_a1_qp3 = intra_lvl32_sobel_a[scene_motion_flag][3];
467*437bfbebSnyanmisaka     reg_wgt->i32_sobel_a.intra_l32_sobel_a1_qp4 = intra_lvl32_sobel_a[scene_motion_flag][4];
468*437bfbebSnyanmisaka     reg_wgt->i32_sobel_c.intra_l32_sobel_c1_qp0 = intra_lvl32_sobel_c[scene_motion_flag][0];
469*437bfbebSnyanmisaka     reg_wgt->i32_sobel_c.intra_l32_sobel_c1_qp1 = intra_lvl32_sobel_c[scene_motion_flag][1];
470*437bfbebSnyanmisaka     reg_wgt->i32_sobel_c.intra_l32_sobel_c1_qp2 = intra_lvl32_sobel_c[scene_motion_flag][2];
471*437bfbebSnyanmisaka     reg_wgt->i32_sobel_c.intra_l32_sobel_c1_qp3 = intra_lvl32_sobel_c[scene_motion_flag][3];
472*437bfbebSnyanmisaka     reg_wgt->i32_sobel_c.intra_l32_sobel_c1_qp4 = intra_lvl32_sobel_c[scene_motion_flag][4];
473*437bfbebSnyanmisaka 
474*437bfbebSnyanmisaka     if (hw->qbias_en) {
475*437bfbebSnyanmisaka         reg_wgt->reg1484_qnt_bias_comb.qnt_bias_i = hw->qbias_i ? hw->qbias_i : 171;
476*437bfbebSnyanmisaka         reg_wgt->reg1484_qnt_bias_comb.qnt_bias_p = hw->qbias_p ? hw->qbias_p : 85;
477*437bfbebSnyanmisaka     } else {
478*437bfbebSnyanmisaka         reg_wgt->reg1484_qnt_bias_comb.qnt_bias_i = qnt_bias_i[scene_motion_flag];
479*437bfbebSnyanmisaka         reg_wgt->reg1484_qnt_bias_comb.qnt_bias_p = qnt_bias_p[scene_motion_flag];
480*437bfbebSnyanmisaka     }
481*437bfbebSnyanmisaka 
482*437bfbebSnyanmisaka     reg_wgt->rime_sqi_thd.cime_sad_th0 = rime_sqi_cime_sad_th[scene_motion_flag];
483*437bfbebSnyanmisaka     reg_wgt->fme_sqi_thd0.cime_sad_pu16_th = fme_sqi_cime_sad_pu16_th[scene_motion_flag];
484*437bfbebSnyanmisaka     reg_wgt->fme_sqi_thd0.cime_sad_pu32_th = fme_sqi_cime_sad_pu32_th[scene_motion_flag];
485*437bfbebSnyanmisaka     reg_wgt->fme_sqi_thd1.cime_sad_pu64_th = fme_sqi_cime_sad_pu64_th[scene_motion_flag];
486*437bfbebSnyanmisaka     rc_regs->klut_ofst.chrm_klut_ofst = chrm_klut_ofst[scene_motion_flag];
487*437bfbebSnyanmisaka }
488*437bfbebSnyanmisaka 
vepu580_h265e_tune_stat_update(void * p,EncRcTaskInfo * rc_info)489*437bfbebSnyanmisaka static void vepu580_h265e_tune_stat_update(void *p, EncRcTaskInfo *rc_info)
490*437bfbebSnyanmisaka {
491*437bfbebSnyanmisaka     HalH265eVepu580Tune *tune = (HalH265eVepu580Tune *)p;
492*437bfbebSnyanmisaka     H265eV580HalContext *ctx = NULL;
493*437bfbebSnyanmisaka     RK_S32 scene_mode = 0;
494*437bfbebSnyanmisaka 
495*437bfbebSnyanmisaka     if (NULL == tune)
496*437bfbebSnyanmisaka         return;
497*437bfbebSnyanmisaka 
498*437bfbebSnyanmisaka     ctx = tune->ctx;
499*437bfbebSnyanmisaka     scene_mode = ctx->cfg->tune.scene_mode == MPP_ENC_SCENE_MODE_IPC ? 0 : 1;
500*437bfbebSnyanmisaka     tune->ap_motion_flag = scene_mode;
501*437bfbebSnyanmisaka     /* update statistic info here */
502*437bfbebSnyanmisaka     RK_S32 j;
503*437bfbebSnyanmisaka     RK_S32 i = 0;
504*437bfbebSnyanmisaka     RK_S32 mvbit = 10;
505*437bfbebSnyanmisaka     Vepu580H265Fbk *fb = &ctx->frm->feedback;
506*437bfbebSnyanmisaka 
507*437bfbebSnyanmisaka     for (i = 0; i < (RK_S32)ctx->tile_num; i++) {
508*437bfbebSnyanmisaka         H265eV580StatusElem *elem = ctx->frm->regs_ret[i];
509*437bfbebSnyanmisaka 
510*437bfbebSnyanmisaka         fb->st_md_sad_b16num0 += elem->st.md_sad_b16num0;
511*437bfbebSnyanmisaka         fb->st_md_sad_b16num1 += elem->st.md_sad_b16num1;
512*437bfbebSnyanmisaka         fb->st_md_sad_b16num2 += elem->st.md_sad_b16num2;
513*437bfbebSnyanmisaka         fb->st_md_sad_b16num3 += elem->st.md_sad_b16num3;
514*437bfbebSnyanmisaka         fb->st_madi_b16num0 += elem->st.madi_b16num0;
515*437bfbebSnyanmisaka         fb->st_madi_b16num1 += elem->st.madi_b16num1;
516*437bfbebSnyanmisaka         fb->st_madi_b16num2 += elem->st.madi_b16num2;
517*437bfbebSnyanmisaka         fb->st_madi_b16num3 += elem->st.madi_b16num3;
518*437bfbebSnyanmisaka     }
519*437bfbebSnyanmisaka 
520*437bfbebSnyanmisaka     RK_S32 mb_num = fb->st_mb_num ? fb->st_mb_num : 1;
521*437bfbebSnyanmisaka     RK_S32 madp = 0;
522*437bfbebSnyanmisaka     RK_S32 md_flag = 0;
523*437bfbebSnyanmisaka     RK_S32 nScore = 0;
524*437bfbebSnyanmisaka     RK_S32 nScoreT = ((MD_WIN_LEN - 2) * 6 + 2 * 8 + 2 * 11 + 2 * 13) / 2;
525*437bfbebSnyanmisaka     RK_S32 madp_cnt_statistics[5];
526*437bfbebSnyanmisaka     RK_U32 md_cnt = (24 * fb->st_md_sad_b16num3 + 22 * fb->st_md_sad_b16num2 + 17 *
527*437bfbebSnyanmisaka                      fb->st_md_sad_b16num1) >> 2;
528*437bfbebSnyanmisaka     RK_U32 madi_cnt = (6 * fb->st_madi_b16num3 + 5 * fb->st_madi_b16num2 + 4 *
529*437bfbebSnyanmisaka                        fb->st_madi_b16num1) >> 2;
530*437bfbebSnyanmisaka     RK_U32 mbs = ((ctx->cfg->prep.width + 15) / 16) * ((ctx->cfg->prep.height + 15) / 16);
531*437bfbebSnyanmisaka     for (i = 0; i < 5; i++) {
532*437bfbebSnyanmisaka         madp_cnt_statistics[i] = fb->st_md_sad_b16num0 * madp_num_map[i][0] +
533*437bfbebSnyanmisaka                                  fb->st_md_sad_b16num1 * madp_num_map[i][1] +
534*437bfbebSnyanmisaka                                  fb->st_md_sad_b16num2 * madp_num_map[i][2] +
535*437bfbebSnyanmisaka                                  fb->st_md_sad_b16num3 * madp_num_map[i][3];
536*437bfbebSnyanmisaka     }
537*437bfbebSnyanmisaka 
538*437bfbebSnyanmisaka     tune->pre_madi[0] = fb->st_madi;
539*437bfbebSnyanmisaka     tune->pre_madp[0] = fb->st_madp;
540*437bfbebSnyanmisaka 
541*437bfbebSnyanmisaka     if (0 != tune->ap_motion_flag)
542*437bfbebSnyanmisaka         mvbit = 15;
543*437bfbebSnyanmisaka 
544*437bfbebSnyanmisaka     madp = MOTION_LEVEL_STILL;
545*437bfbebSnyanmisaka     if (0 != madp_cnt_statistics[4]) {
546*437bfbebSnyanmisaka         RK_S32 base = tune->ap_motion_flag * 3;
547*437bfbebSnyanmisaka 
548*437bfbebSnyanmisaka         for (i = 0; i < 3; i++, base++) {
549*437bfbebSnyanmisaka             if (tune->pre_madp[0] >= ctu_avg_madp_thd[i]) {
550*437bfbebSnyanmisaka                 if (madp_cnt_statistics[0] > mb_num * ctu_madp_cnt_thd[base][0] >> mvbit ||
551*437bfbebSnyanmisaka                     madp_cnt_statistics[1] > mb_num * ctu_madp_cnt_thd[base][1] >> mvbit ||
552*437bfbebSnyanmisaka                     madp_cnt_statistics[2] > mb_num * ctu_madp_cnt_thd[base][2] >> mvbit) {
553*437bfbebSnyanmisaka                     madp =  MOTION_LEVEL_BIG_MOTION;
554*437bfbebSnyanmisaka                 } else if ((madp_cnt_statistics[0] > mb_num * ctu_madp_cnt_thd[base][3] >> mvbit ||
555*437bfbebSnyanmisaka                             madp_cnt_statistics[1] > mb_num * ctu_madp_cnt_thd[base][4] >> mvbit) &&
556*437bfbebSnyanmisaka                            madp_cnt_statistics[3] < mb_num * ctu_madp_cnt_thd[base][5] >> mvbit) {
557*437bfbebSnyanmisaka                     madp =  MOTION_LEVEL_BIG_MOTION;
558*437bfbebSnyanmisaka                 } else if (madp_cnt_statistics[3] < mb_num * ctu_madp_cnt_thd[base][6] >> mvbit) {
559*437bfbebSnyanmisaka                     madp =  MOTION_LEVEL_BIG_MOTION;
560*437bfbebSnyanmisaka                 } else if (madp_cnt_statistics[3] < mb_num * ctu_madp_cnt_thd[base][7] >> mvbit) {
561*437bfbebSnyanmisaka                     madp =  MOTION_LEVEL_MOTION;
562*437bfbebSnyanmisaka                 }
563*437bfbebSnyanmisaka                 break;
564*437bfbebSnyanmisaka             }
565*437bfbebSnyanmisaka         }
566*437bfbebSnyanmisaka     } else {
567*437bfbebSnyanmisaka         madp = MOTION_LEVEL_UNKNOW_SCENE;
568*437bfbebSnyanmisaka     }
569*437bfbebSnyanmisaka 
570*437bfbebSnyanmisaka     if (MOTION_LEVEL_UNKNOW_SCENE != madp) {
571*437bfbebSnyanmisaka         nScore = madp * 13 + tune->md_madp[0] * 11 + tune->md_madp[1] * 8;
572*437bfbebSnyanmisaka     } else {
573*437bfbebSnyanmisaka         nScore = tune->md_madp[0] * 11 + tune->md_madp[1] * 8;
574*437bfbebSnyanmisaka         nScoreT -= 13;
575*437bfbebSnyanmisaka     }
576*437bfbebSnyanmisaka 
577*437bfbebSnyanmisaka     for (j = 2; j < MD_WIN_LEN; j++) {
578*437bfbebSnyanmisaka         nScore += tune->md_madp[j] * 6;
579*437bfbebSnyanmisaka     }
580*437bfbebSnyanmisaka 
581*437bfbebSnyanmisaka     if (nScore >= nScoreT) {
582*437bfbebSnyanmisaka         md_flag = 1;
583*437bfbebSnyanmisaka     }
584*437bfbebSnyanmisaka 
585*437bfbebSnyanmisaka     tune->curr_scene_motion_flag = 0;
586*437bfbebSnyanmisaka     if (tune->md_flag_matrix[0] && tune->md_flag_matrix[1] && tune->md_flag_matrix[2]) {
587*437bfbebSnyanmisaka         tune->curr_scene_motion_flag = 1;
588*437bfbebSnyanmisaka     } else if ((tune->md_flag_matrix[0] && tune->md_flag_matrix[1]) ||
589*437bfbebSnyanmisaka                (tune->md_flag_matrix[1] && tune->md_flag_matrix[2] && tune->md_flag_matrix[3])) {
590*437bfbebSnyanmisaka         tune->curr_scene_motion_flag = md_flag;
591*437bfbebSnyanmisaka     }
592*437bfbebSnyanmisaka 
593*437bfbebSnyanmisaka     if (MOTION_LEVEL_UNKNOW_SCENE != madp) {
594*437bfbebSnyanmisaka         for (j = MD_WIN_LEN - 2; j >= 0; j--) {
595*437bfbebSnyanmisaka             tune->md_madp[j + 1] = tune->md_madp[j];
596*437bfbebSnyanmisaka         }
597*437bfbebSnyanmisaka         tune->md_madp[0] = madp;
598*437bfbebSnyanmisaka     }
599*437bfbebSnyanmisaka     for (j = MD_SHOW_LEN - 2; j >= 0;  j--) {
600*437bfbebSnyanmisaka         tune->md_flag_matrix[j + 1] = tune->md_flag_matrix[j];
601*437bfbebSnyanmisaka     }
602*437bfbebSnyanmisaka     tune->md_flag_matrix[0] = md_flag;
603*437bfbebSnyanmisaka 
604*437bfbebSnyanmisaka     for (j = FRAME_MOTION_ANALYSIS_NUM - 2; j >= 0;  j--) {
605*437bfbebSnyanmisaka         tune->scene_motion_flag_matrix[j + 1] = tune->scene_motion_flag_matrix[j];
606*437bfbebSnyanmisaka     }
607*437bfbebSnyanmisaka     tune->scene_motion_flag_matrix[0] = tune->curr_scene_motion_flag;
608*437bfbebSnyanmisaka 
609*437bfbebSnyanmisaka     tune->pre_madi[1] = tune->pre_madi[0];
610*437bfbebSnyanmisaka     tune->pre_madp[1] = tune->pre_madp[0];
611*437bfbebSnyanmisaka 
612*437bfbebSnyanmisaka     rc_info->motion_level = 0;
613*437bfbebSnyanmisaka     if (md_cnt * 100 > 15 * mbs)
614*437bfbebSnyanmisaka         rc_info->motion_level = 200;
615*437bfbebSnyanmisaka     else if (md_cnt * 100 > 5 * mbs)
616*437bfbebSnyanmisaka         rc_info->motion_level = 100;
617*437bfbebSnyanmisaka     else
618*437bfbebSnyanmisaka         rc_info->motion_level = 0;
619*437bfbebSnyanmisaka 
620*437bfbebSnyanmisaka     rc_info->complex_level = 0;
621*437bfbebSnyanmisaka     if (madi_cnt * 100 > 30 * mbs)
622*437bfbebSnyanmisaka         rc_info->complex_level = 2;
623*437bfbebSnyanmisaka     else if (madi_cnt * 100 > 13 * mbs)
624*437bfbebSnyanmisaka         rc_info->complex_level = 1;
625*437bfbebSnyanmisaka     else
626*437bfbebSnyanmisaka         rc_info->complex_level = 0;
627*437bfbebSnyanmisaka     hal_h265e_dbg_detail("motion_level = %u, complex_level = %u\n", rc_info->motion_level,
628*437bfbebSnyanmisaka                          rc_info->complex_level);
629*437bfbebSnyanmisaka }
630*437bfbebSnyanmisaka 
vepu580_setup_qpmap_buf(H265eV580HalContext * ctx)631*437bfbebSnyanmisaka static MPP_RET vepu580_setup_qpmap_buf(H265eV580HalContext *ctx)
632*437bfbebSnyanmisaka {
633*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
634*437bfbebSnyanmisaka     RK_S32 w = ctx->cfg->prep.width;
635*437bfbebSnyanmisaka     RK_S32 h = ctx->cfg->prep.height;
636*437bfbebSnyanmisaka     RK_S32 ctu_w = MPP_ALIGN(w, 64) / 64;
637*437bfbebSnyanmisaka     RK_S32 ctu_h = MPP_ALIGN(h, 64) / 64;
638*437bfbebSnyanmisaka     RK_S32 qpmap_base_cfg_size   = ctx->qpmap_base_cfg_size
639*437bfbebSnyanmisaka                                    = ctu_w * ctu_h * 64;
640*437bfbebSnyanmisaka     RK_S32 qpmap_qp_cfg_size     = ctx->qpmap_qp_cfg_size
641*437bfbebSnyanmisaka                                    = ctu_w * ctu_h * 192;
642*437bfbebSnyanmisaka     RK_S32 md_flag_size = ctx->md_flag_size
643*437bfbebSnyanmisaka                           = ctu_w * ctu_h * 16;
644*437bfbebSnyanmisaka 
645*437bfbebSnyanmisaka     if (!ctx->cfg->tune.deblur_en) {
646*437bfbebSnyanmisaka         mpp_log("deblurring is closed!\n");
647*437bfbebSnyanmisaka         goto __RET;
648*437bfbebSnyanmisaka     }
649*437bfbebSnyanmisaka 
650*437bfbebSnyanmisaka     if (NULL == ctx->qpmap_base_cfg_buf) {
651*437bfbebSnyanmisaka         mpp_buffer_get(NULL, &ctx->qpmap_base_cfg_buf, qpmap_base_cfg_size);
652*437bfbebSnyanmisaka         if (!ctx->qpmap_base_cfg_buf) {
653*437bfbebSnyanmisaka             mpp_err("qpmap_base_cfg_buf malloc fail, qpmap invalid\n");
654*437bfbebSnyanmisaka             ret = MPP_ERR_VALUE;
655*437bfbebSnyanmisaka             goto __RET;
656*437bfbebSnyanmisaka         }
657*437bfbebSnyanmisaka     }
658*437bfbebSnyanmisaka 
659*437bfbebSnyanmisaka     if (NULL == ctx->qpmap_qp_cfg_buf) {
660*437bfbebSnyanmisaka         mpp_buffer_get(NULL, &ctx->qpmap_qp_cfg_buf, qpmap_qp_cfg_size);
661*437bfbebSnyanmisaka         if (!ctx->qpmap_qp_cfg_buf) {
662*437bfbebSnyanmisaka             mpp_err("qpmap_qp_cfg_buf malloc fail, qpmap invalid\n");
663*437bfbebSnyanmisaka             ret = MPP_ERR_VALUE;
664*437bfbebSnyanmisaka             goto __RET;
665*437bfbebSnyanmisaka         }
666*437bfbebSnyanmisaka     }
667*437bfbebSnyanmisaka 
668*437bfbebSnyanmisaka     if (NULL == ctx->md_flag_buf) {
669*437bfbebSnyanmisaka         ctx->md_flag_buf = mpp_malloc(RK_U8, md_flag_size);
670*437bfbebSnyanmisaka         if (!ctx->md_flag_buf) {
671*437bfbebSnyanmisaka             mpp_err("md_flag_buf malloc fail, qpmap invalid\n");
672*437bfbebSnyanmisaka             ret = MPP_ERR_VALUE;
673*437bfbebSnyanmisaka             goto __RET;
674*437bfbebSnyanmisaka         }
675*437bfbebSnyanmisaka     }
676*437bfbebSnyanmisaka 
677*437bfbebSnyanmisaka __RET:
678*437bfbebSnyanmisaka     hal_h265e_dbg_func("leave, ret %d\n", ret);
679*437bfbebSnyanmisaka     return ret;
680*437bfbebSnyanmisaka }