xref: /rockchip-linux_mpp/mpp/hal/rkenc/h265e/hal_h265e_vepu510_tune.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2024 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 "hal_enc_task.h"
18*437bfbebSnyanmisaka #include "hal_h265e_vepu510_reg.h"
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka typedef struct HalH265eVepu510Tune_t {
21*437bfbebSnyanmisaka     H265eV510HalContext *ctx;
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka     RK_U8 *qm_mv_buf; /* qpmap move flag buffer */
24*437bfbebSnyanmisaka     RK_U32 qm_mv_buf_size;
25*437bfbebSnyanmisaka     Vepu510NpuOut *obj_out; /* object map from npu */
26*437bfbebSnyanmisaka 
27*437bfbebSnyanmisaka     RK_S32 pre_madp[2];
28*437bfbebSnyanmisaka     RK_S32 pre_madi[2];
29*437bfbebSnyanmisaka } HalH265eVepu510Tune;
30*437bfbebSnyanmisaka 
31*437bfbebSnyanmisaka static RK_U32 aq_thd_default[16] = {
32*437bfbebSnyanmisaka     0,  0,  0,  0,  3,  3,  5,  5,
33*437bfbebSnyanmisaka     8,  8,  15, 15, 20, 25, 25, 25
34*437bfbebSnyanmisaka };
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka static RK_S32 aq_qp_delta_default[16] = {
37*437bfbebSnyanmisaka     -8, -7, -6, -5, -4, -3, -2, -1,
38*437bfbebSnyanmisaka     1,  2,  3,  4,  5,  6,  7,  8
39*437bfbebSnyanmisaka };
40*437bfbebSnyanmisaka 
41*437bfbebSnyanmisaka static RK_U32 aq_thd_smt_I[16] = {
42*437bfbebSnyanmisaka     1,  2,  3,   3,  3,  3,  5,  5,
43*437bfbebSnyanmisaka     8,  8,  13,  15, 20, 25, 25, 25
44*437bfbebSnyanmisaka };
45*437bfbebSnyanmisaka 
46*437bfbebSnyanmisaka static RK_S32 aq_qp_delta_smt_I[16] = {
47*437bfbebSnyanmisaka     -8, -7, -6, -5, -4, -3, -2, -1,
48*437bfbebSnyanmisaka     1,  2,  3,  5,  7,  8,  9,  9
49*437bfbebSnyanmisaka };
50*437bfbebSnyanmisaka 
51*437bfbebSnyanmisaka static RK_U32 aq_thd_smt_P[16] = {
52*437bfbebSnyanmisaka     0,  0,  0,   0,  3,  3,  5,  5,
53*437bfbebSnyanmisaka     8,  8,  15, 15, 20, 25, 25, 25
54*437bfbebSnyanmisaka };
55*437bfbebSnyanmisaka 
56*437bfbebSnyanmisaka static RK_S32 aq_qp_delta_smt_P[16] = {
57*437bfbebSnyanmisaka     -8, -7, -6, -5, -4, -3, -2, -1,
58*437bfbebSnyanmisaka     1,  2,  3,  4,  6,  7,  9,  9
59*437bfbebSnyanmisaka };
60*437bfbebSnyanmisaka 
vepu510_h265e_tune_init(H265eV510HalContext * ctx)61*437bfbebSnyanmisaka static HalH265eVepu510Tune *vepu510_h265e_tune_init(H265eV510HalContext *ctx)
62*437bfbebSnyanmisaka {
63*437bfbebSnyanmisaka     HalH265eVepu510Tune *tune = mpp_calloc(HalH265eVepu510Tune, 1);
64*437bfbebSnyanmisaka 
65*437bfbebSnyanmisaka     if (NULL == tune)
66*437bfbebSnyanmisaka         return tune;
67*437bfbebSnyanmisaka 
68*437bfbebSnyanmisaka     tune->ctx = ctx;
69*437bfbebSnyanmisaka     tune->pre_madi[0] = tune->pre_madi[1] = -1;
70*437bfbebSnyanmisaka     tune->pre_madp[0] = tune->pre_madp[1] = -1;
71*437bfbebSnyanmisaka 
72*437bfbebSnyanmisaka     return tune;
73*437bfbebSnyanmisaka }
74*437bfbebSnyanmisaka 
vepu510_h265e_tune_deinit(void * tune)75*437bfbebSnyanmisaka static void vepu510_h265e_tune_deinit(void *tune)
76*437bfbebSnyanmisaka {
77*437bfbebSnyanmisaka     HalH265eVepu510Tune *t = (HalH265eVepu510Tune *)tune;
78*437bfbebSnyanmisaka 
79*437bfbebSnyanmisaka     MPP_FREE(t->qm_mv_buf);
80*437bfbebSnyanmisaka     MPP_FREE(tune);
81*437bfbebSnyanmisaka }
82*437bfbebSnyanmisaka 
vepu510_h265e_tune_aq_prepare(HalH265eVepu510Tune * tune)83*437bfbebSnyanmisaka static void vepu510_h265e_tune_aq_prepare(HalH265eVepu510Tune *tune)
84*437bfbebSnyanmisaka {
85*437bfbebSnyanmisaka     if (tune == NULL) {
86*437bfbebSnyanmisaka         return;
87*437bfbebSnyanmisaka     }
88*437bfbebSnyanmisaka 
89*437bfbebSnyanmisaka     H265eV510HalContext *ctx = tune->ctx;
90*437bfbebSnyanmisaka     MppEncHwCfg *hw = &ctx->cfg->hw;
91*437bfbebSnyanmisaka 
92*437bfbebSnyanmisaka     if (ctx->smart_en) {
93*437bfbebSnyanmisaka         memcpy(hw->aq_thrd_i, aq_thd_smt_I, sizeof(hw->aq_thrd_i));
94*437bfbebSnyanmisaka         memcpy(hw->aq_thrd_p, aq_thd_smt_P, sizeof(hw->aq_thrd_p));
95*437bfbebSnyanmisaka         memcpy(hw->aq_step_i, aq_qp_delta_smt_I, sizeof(hw->aq_step_i));
96*437bfbebSnyanmisaka         memcpy(hw->aq_step_p, aq_qp_delta_smt_P, sizeof(hw->aq_step_p));
97*437bfbebSnyanmisaka     } else {
98*437bfbebSnyanmisaka         memcpy(hw->aq_thrd_i, aq_thd_default, sizeof(hw->aq_thrd_i));
99*437bfbebSnyanmisaka         memcpy(hw->aq_thrd_p, aq_thd_default, sizeof(hw->aq_thrd_p));
100*437bfbebSnyanmisaka         memcpy(hw->aq_step_i, aq_qp_delta_default, sizeof(hw->aq_step_i));
101*437bfbebSnyanmisaka         memcpy(hw->aq_step_p, aq_qp_delta_default, sizeof(hw->aq_step_p));
102*437bfbebSnyanmisaka     }
103*437bfbebSnyanmisaka }
104*437bfbebSnyanmisaka 
vepu510_h265e_tune_aq(HalH265eVepu510Tune * tune)105*437bfbebSnyanmisaka static void vepu510_h265e_tune_aq(HalH265eVepu510Tune *tune)
106*437bfbebSnyanmisaka {
107*437bfbebSnyanmisaka     H265eV510HalContext *ctx = tune->ctx;
108*437bfbebSnyanmisaka     Vepu510H265eFrmCfg *frm_cfg = ctx->frm;
109*437bfbebSnyanmisaka     H265eV510RegSet *regs = frm_cfg->regs_set;
110*437bfbebSnyanmisaka     Vepu510RcRoi *r = &regs->reg_rc_roi;
111*437bfbebSnyanmisaka     MppEncHwCfg *hw = &ctx->cfg->hw;
112*437bfbebSnyanmisaka     RK_U32 i = 0;
113*437bfbebSnyanmisaka     RK_S32 aq_step[16];
114*437bfbebSnyanmisaka 
115*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(aq_thd_default); i++) {
116*437bfbebSnyanmisaka         if (ctx->frame_type == INTRA_FRAME) {
117*437bfbebSnyanmisaka             r->aq_tthd[i] = hw->aq_thrd_i[i];
118*437bfbebSnyanmisaka             aq_step[i] = hw->aq_step_i[i] & 0x1F;
119*437bfbebSnyanmisaka         } else {
120*437bfbebSnyanmisaka             r->aq_tthd[i] = hw->aq_thrd_p[i];
121*437bfbebSnyanmisaka             aq_step[i] = hw->aq_step_p[i] & 0x1F;
122*437bfbebSnyanmisaka         }
123*437bfbebSnyanmisaka     }
124*437bfbebSnyanmisaka 
125*437bfbebSnyanmisaka     r->aq_stp0.aq_stp_s0 = aq_step[0];
126*437bfbebSnyanmisaka     r->aq_stp0.aq_stp_0t1 = aq_step[1];
127*437bfbebSnyanmisaka     r->aq_stp0.aq_stp_1t2 = aq_step[2];
128*437bfbebSnyanmisaka     r->aq_stp0.aq_stp_2t3 = aq_step[3];
129*437bfbebSnyanmisaka     r->aq_stp0.aq_stp_3t4 = aq_step[4];
130*437bfbebSnyanmisaka     r->aq_stp0.aq_stp_4t5 = aq_step[5];
131*437bfbebSnyanmisaka     r->aq_stp1.aq_stp_5t6 = aq_step[6];
132*437bfbebSnyanmisaka     r->aq_stp1.aq_stp_6t7 = aq_step[7];
133*437bfbebSnyanmisaka     r->aq_stp1.aq_stp_7t8 = 0;
134*437bfbebSnyanmisaka     r->aq_stp1.aq_stp_8t9 = aq_step[8];
135*437bfbebSnyanmisaka     r->aq_stp1.aq_stp_9t10 = aq_step[9];
136*437bfbebSnyanmisaka     r->aq_stp1.aq_stp_10t11 = aq_step[10];
137*437bfbebSnyanmisaka     r->aq_stp2.aq_stp_11t12 = aq_step[11];
138*437bfbebSnyanmisaka     r->aq_stp2.aq_stp_12t13 = aq_step[12];
139*437bfbebSnyanmisaka     r->aq_stp2.aq_stp_13t14 = aq_step[13];
140*437bfbebSnyanmisaka     r->aq_stp2.aq_stp_14t15 = aq_step[14];
141*437bfbebSnyanmisaka     r->aq_stp2.aq_stp_b15 = aq_step[15];
142*437bfbebSnyanmisaka 
143*437bfbebSnyanmisaka     r->aq_clip.aq16_rnge = 5;
144*437bfbebSnyanmisaka     r->aq_clip.aq32_rnge = 5;
145*437bfbebSnyanmisaka     r->aq_clip.aq8_rnge = 10;
146*437bfbebSnyanmisaka     r->aq_clip.aq16_dif0 = 12;
147*437bfbebSnyanmisaka     r->aq_clip.aq16_dif1 = 12;
148*437bfbebSnyanmisaka     r->aq_clip.aq_rme_en = 1;
149*437bfbebSnyanmisaka     r->aq_clip.aq_cme_en = 1;
150*437bfbebSnyanmisaka }
151*437bfbebSnyanmisaka 
vepu510_h265e_tune_qpmap_init(HalH265eVepu510Tune * tune)152*437bfbebSnyanmisaka static MPP_RET vepu510_h265e_tune_qpmap_init(HalH265eVepu510Tune *tune)
153*437bfbebSnyanmisaka {
154*437bfbebSnyanmisaka     H265eV510HalContext *ctx = tune->ctx;
155*437bfbebSnyanmisaka     Vepu510H265eFrmCfg *frm = ctx->frm;
156*437bfbebSnyanmisaka     H265eV510RegSet *regs = frm->regs_set;
157*437bfbebSnyanmisaka     H265eVepu510Frame *reg_frm = &regs->reg_frm;
158*437bfbebSnyanmisaka     RK_S32 w32 = MPP_ALIGN(ctx->cfg->prep.width, 32);
159*437bfbebSnyanmisaka     RK_S32 h32 = MPP_ALIGN(ctx->cfg->prep.height, 32);
160*437bfbebSnyanmisaka     RK_S32 roir_buf_fd = -1;
161*437bfbebSnyanmisaka 
162*437bfbebSnyanmisaka     if (frm->roi_data) {
163*437bfbebSnyanmisaka         //TODO: external qpmap buffer
164*437bfbebSnyanmisaka     } else {
165*437bfbebSnyanmisaka         if (NULL == frm->roir_buf) {
166*437bfbebSnyanmisaka             if (NULL == ctx->roi_grp)
167*437bfbebSnyanmisaka                 mpp_buffer_group_get_internal(&ctx->roi_grp, MPP_BUFFER_TYPE_ION);
168*437bfbebSnyanmisaka 
169*437bfbebSnyanmisaka             //TODO: bmap_mdc_dpth = 1 ???
170*437bfbebSnyanmisaka             frm->roir_buf_size = w32 * h32 / 256 * 4;
171*437bfbebSnyanmisaka             mpp_buffer_get(ctx->roi_grp, &frm->roir_buf, frm->roir_buf_size);
172*437bfbebSnyanmisaka         }
173*437bfbebSnyanmisaka 
174*437bfbebSnyanmisaka         roir_buf_fd = mpp_buffer_get_fd(frm->roir_buf);
175*437bfbebSnyanmisaka     }
176*437bfbebSnyanmisaka 
177*437bfbebSnyanmisaka     if (frm->roir_buf == NULL) {
178*437bfbebSnyanmisaka         mpp_err("failed to get roir_buf\n");
179*437bfbebSnyanmisaka         return MPP_ERR_MALLOC;
180*437bfbebSnyanmisaka     }
181*437bfbebSnyanmisaka     reg_frm->common.adr_roir = roir_buf_fd;
182*437bfbebSnyanmisaka 
183*437bfbebSnyanmisaka     if (tune->qm_mv_buf == NULL) {
184*437bfbebSnyanmisaka         tune->qm_mv_buf_size = w32 * h32 / 256;
185*437bfbebSnyanmisaka         tune->qm_mv_buf = mpp_calloc(RK_U8, tune->qm_mv_buf_size);
186*437bfbebSnyanmisaka         if (NULL == tune->qm_mv_buf) {
187*437bfbebSnyanmisaka             mpp_err("failed to get qm_mv_buf\n");
188*437bfbebSnyanmisaka             return MPP_ERR_MALLOC;
189*437bfbebSnyanmisaka         }
190*437bfbebSnyanmisaka     }
191*437bfbebSnyanmisaka 
192*437bfbebSnyanmisaka     hal_h265e_dbg_ctl("roir_buf_fd %d, size %d qm_mv_buf %p size %d\n",
193*437bfbebSnyanmisaka                       roir_buf_fd, frm->roir_buf_size, tune->qm_mv_buf,
194*437bfbebSnyanmisaka                       tune->qm_mv_buf_size);
195*437bfbebSnyanmisaka     return MPP_OK;
196*437bfbebSnyanmisaka }
197*437bfbebSnyanmisaka 
vepu510_h265e_tune_qpmap(void * p,HalEncTask * task)198*437bfbebSnyanmisaka static void vepu510_h265e_tune_qpmap(void *p, HalEncTask *task)
199*437bfbebSnyanmisaka {
200*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
201*437bfbebSnyanmisaka     HalH265eVepu510Tune *tune = (HalH265eVepu510Tune *)p;
202*437bfbebSnyanmisaka 
203*437bfbebSnyanmisaka     (void)task;
204*437bfbebSnyanmisaka     hal_h265e_dbg_func("enter\n");
205*437bfbebSnyanmisaka 
206*437bfbebSnyanmisaka     ret = vepu510_h265e_tune_qpmap_init(tune);
207*437bfbebSnyanmisaka     if (ret != MPP_OK) {
208*437bfbebSnyanmisaka         mpp_err("failed to init qpmap\n");
209*437bfbebSnyanmisaka         return;
210*437bfbebSnyanmisaka     }
211*437bfbebSnyanmisaka 
212*437bfbebSnyanmisaka     hal_h265e_dbg_func("leave\n");
213*437bfbebSnyanmisaka }
214*437bfbebSnyanmisaka 
vepu510_h265e_tune_reg_patch(void * p,HalEncTask * task)215*437bfbebSnyanmisaka static void vepu510_h265e_tune_reg_patch(void *p, HalEncTask *task)
216*437bfbebSnyanmisaka {
217*437bfbebSnyanmisaka     HalH265eVepu510Tune *tune = (HalH265eVepu510Tune *)p;
218*437bfbebSnyanmisaka 
219*437bfbebSnyanmisaka     if (NULL == tune)
220*437bfbebSnyanmisaka         return;
221*437bfbebSnyanmisaka     H265eV510HalContext *ctx = tune->ctx;
222*437bfbebSnyanmisaka 
223*437bfbebSnyanmisaka     vepu510_h265e_tune_aq(tune);
224*437bfbebSnyanmisaka 
225*437bfbebSnyanmisaka     if (ctx->qpmap_en && (task->md_info != NULL)) {
226*437bfbebSnyanmisaka         vepu510_h265e_tune_qpmap(tune, task);
227*437bfbebSnyanmisaka     }
228*437bfbebSnyanmisaka }
229*437bfbebSnyanmisaka 
vepu510_h265e_tune_stat_update(void * p,HalEncTask * task)230*437bfbebSnyanmisaka static void vepu510_h265e_tune_stat_update(void *p, HalEncTask *task)
231*437bfbebSnyanmisaka {
232*437bfbebSnyanmisaka     HalH265eVepu510Tune *tune = (HalH265eVepu510Tune *)p;
233*437bfbebSnyanmisaka     EncRcTaskInfo *hal_rc_ret = (EncRcTaskInfo *)&task->rc_task->info;
234*437bfbebSnyanmisaka 
235*437bfbebSnyanmisaka     if (NULL == tune)
236*437bfbebSnyanmisaka         return;
237*437bfbebSnyanmisaka 
238*437bfbebSnyanmisaka     hal_h265e_dbg_func("enter\n");
239*437bfbebSnyanmisaka     H265eV510HalContext *ctx = tune->ctx;;
240*437bfbebSnyanmisaka     RK_S32 task_idx = task->flags.reg_idx;
241*437bfbebSnyanmisaka     Vepu510H265eFrmCfg *frm = ctx->frms[task_idx];
242*437bfbebSnyanmisaka     Vepu510H265Fbk *fb = &frm->feedback;
243*437bfbebSnyanmisaka     H265eV510RegSet *regs_set = frm->regs_set;
244*437bfbebSnyanmisaka     H265eV510StatusElem *elem = frm->regs_ret;
245*437bfbebSnyanmisaka     MppEncCfgSet *cfg = ctx->cfg;
246*437bfbebSnyanmisaka     RK_S32 w32 = MPP_ALIGN(cfg->prep.width, 32);
247*437bfbebSnyanmisaka     RK_S32 h32 = MPP_ALIGN(cfg->prep.height, 32);
248*437bfbebSnyanmisaka     RK_U32 b16_num = MPP_ALIGN(cfg->prep.width, 16) * MPP_ALIGN(cfg->prep.height, 16) / 256;
249*437bfbebSnyanmisaka     RK_U32 madi_cnt = 0, madp_cnt = 0;
250*437bfbebSnyanmisaka 
251*437bfbebSnyanmisaka     RK_U32 madi_th_cnt0 = elem->st.st_madi_lt_num0.madi_th_lt_cnt0 +
252*437bfbebSnyanmisaka                           elem->st.st_madi_rt_num0.madi_th_rt_cnt0 +
253*437bfbebSnyanmisaka                           elem->st.st_madi_lb_num0.madi_th_lb_cnt0 +
254*437bfbebSnyanmisaka                           elem->st.st_madi_rb_num0.madi_th_rb_cnt0;
255*437bfbebSnyanmisaka     RK_U32 madi_th_cnt1 = elem->st.st_madi_lt_num0.madi_th_lt_cnt1 +
256*437bfbebSnyanmisaka                           elem->st.st_madi_rt_num0.madi_th_rt_cnt1 +
257*437bfbebSnyanmisaka                           elem->st.st_madi_lb_num0.madi_th_lb_cnt1 +
258*437bfbebSnyanmisaka                           elem->st.st_madi_rb_num0.madi_th_rb_cnt1;
259*437bfbebSnyanmisaka     RK_U32 madi_th_cnt2 = elem->st.st_madi_lt_num1.madi_th_lt_cnt2 +
260*437bfbebSnyanmisaka                           elem->st.st_madi_rt_num1.madi_th_rt_cnt2 +
261*437bfbebSnyanmisaka                           elem->st.st_madi_lb_num1.madi_th_lb_cnt2 +
262*437bfbebSnyanmisaka                           elem->st.st_madi_rb_num1.madi_th_rb_cnt2;
263*437bfbebSnyanmisaka     RK_U32 madi_th_cnt3 = elem->st.st_madi_lt_num1.madi_th_lt_cnt3 +
264*437bfbebSnyanmisaka                           elem->st.st_madi_rt_num1.madi_th_rt_cnt3 +
265*437bfbebSnyanmisaka                           elem->st.st_madi_lb_num1.madi_th_lb_cnt3 +
266*437bfbebSnyanmisaka                           elem->st.st_madi_rb_num1.madi_th_rb_cnt3;
267*437bfbebSnyanmisaka     RK_U32 madp_th_cnt0 = elem->st.st_madp_lt_num0.madp_th_lt_cnt0 +
268*437bfbebSnyanmisaka                           elem->st.st_madp_rt_num0.madp_th_rt_cnt0 +
269*437bfbebSnyanmisaka                           elem->st.st_madp_lb_num0.madp_th_lb_cnt0 +
270*437bfbebSnyanmisaka                           elem->st.st_madp_rb_num0.madp_th_rb_cnt0;
271*437bfbebSnyanmisaka     RK_U32 madp_th_cnt1 = elem->st.st_madp_lt_num0.madp_th_lt_cnt1 +
272*437bfbebSnyanmisaka                           elem->st.st_madp_rt_num0.madp_th_rt_cnt1 +
273*437bfbebSnyanmisaka                           elem->st.st_madp_lb_num0.madp_th_lb_cnt1 +
274*437bfbebSnyanmisaka                           elem->st.st_madp_rb_num0.madp_th_rb_cnt1;
275*437bfbebSnyanmisaka     RK_U32 madp_th_cnt2 = elem->st.st_madp_lt_num1.madp_th_lt_cnt2 +
276*437bfbebSnyanmisaka                           elem->st.st_madp_rt_num1.madp_th_rt_cnt2 +
277*437bfbebSnyanmisaka                           elem->st.st_madp_lb_num1.madp_th_lb_cnt2 +
278*437bfbebSnyanmisaka                           elem->st.st_madp_rb_num1.madp_th_rb_cnt2;
279*437bfbebSnyanmisaka     RK_U32 madp_th_cnt3 = elem->st.st_madp_lt_num1.madp_th_lt_cnt3 +
280*437bfbebSnyanmisaka                           elem->st.st_madp_rt_num1.madp_th_rt_cnt3 +
281*437bfbebSnyanmisaka                           elem->st.st_madp_lb_num1.madp_th_lb_cnt3 +
282*437bfbebSnyanmisaka                           elem->st.st_madp_rb_num1.madp_th_rb_cnt3;
283*437bfbebSnyanmisaka 
284*437bfbebSnyanmisaka     madi_cnt = (6 * madi_th_cnt3 + 5 * madi_th_cnt2 + 4 * madi_th_cnt1) >> 2;
285*437bfbebSnyanmisaka     hal_rc_ret->complex_level = (madi_cnt * 100 > 30 * b16_num) ? 2 :
286*437bfbebSnyanmisaka                                 (madi_cnt * 100 > 13 * b16_num) ? 1 : 0;
287*437bfbebSnyanmisaka 
288*437bfbebSnyanmisaka     {
289*437bfbebSnyanmisaka         RK_U32 md_cnt = 0, motion_level = 0;
290*437bfbebSnyanmisaka 
291*437bfbebSnyanmisaka         if (ctx->smart_en)
292*437bfbebSnyanmisaka             md_cnt = (12 * madp_th_cnt3 + 11 * madp_th_cnt2 + 8 * madp_th_cnt1) >> 2;
293*437bfbebSnyanmisaka         else
294*437bfbebSnyanmisaka             md_cnt = (24 * madp_th_cnt3 + 22 * madp_th_cnt2 + 17 * madp_th_cnt1) >> 2;
295*437bfbebSnyanmisaka 
296*437bfbebSnyanmisaka         if (md_cnt * 100 > 15 * b16_num)
297*437bfbebSnyanmisaka             motion_level = 200;
298*437bfbebSnyanmisaka         else if (md_cnt * 100 > 5 * b16_num)
299*437bfbebSnyanmisaka             motion_level = 100;
300*437bfbebSnyanmisaka         else if (md_cnt * 100 > (b16_num >> 2))
301*437bfbebSnyanmisaka             motion_level = 1;
302*437bfbebSnyanmisaka         else
303*437bfbebSnyanmisaka             motion_level = 0;
304*437bfbebSnyanmisaka         hal_rc_ret->motion_level = motion_level;
305*437bfbebSnyanmisaka     }
306*437bfbebSnyanmisaka     hal_h265e_dbg_st("frame %d complex_level %d motion_level %d\n",
307*437bfbebSnyanmisaka                      ctx->frame_num - 1, hal_rc_ret->complex_level, hal_rc_ret->motion_level);
308*437bfbebSnyanmisaka 
309*437bfbebSnyanmisaka     fb->st_madi = madi_th_cnt0 * regs_set->reg_rc_roi.madi_st_thd.madi_th0 +
310*437bfbebSnyanmisaka                   madi_th_cnt1 * (regs_set->reg_rc_roi.madi_st_thd.madi_th0 +
311*437bfbebSnyanmisaka                                   regs_set->reg_rc_roi.madi_st_thd.madi_th1) / 2 +
312*437bfbebSnyanmisaka                   madi_th_cnt2 * (regs_set->reg_rc_roi.madi_st_thd.madi_th1 +
313*437bfbebSnyanmisaka                                   regs_set->reg_rc_roi.madi_st_thd.madi_th2) / 2 +
314*437bfbebSnyanmisaka                   madi_th_cnt3 * regs_set->reg_rc_roi.madi_st_thd.madi_th2;
315*437bfbebSnyanmisaka 
316*437bfbebSnyanmisaka     madi_cnt = madi_th_cnt0 + madi_th_cnt1 + madi_th_cnt2 + madi_th_cnt3;
317*437bfbebSnyanmisaka     if (madi_cnt)
318*437bfbebSnyanmisaka         fb->st_madi = fb->st_madi / madi_cnt;
319*437bfbebSnyanmisaka 
320*437bfbebSnyanmisaka     fb->st_madp = madp_th_cnt0 * regs_set->reg_rc_roi.madp_st_thd0.madp_th0 +
321*437bfbebSnyanmisaka                   madp_th_cnt1 * (regs_set->reg_rc_roi.madp_st_thd0.madp_th0 +
322*437bfbebSnyanmisaka                                   regs_set->reg_rc_roi.madp_st_thd0.madp_th1) / 2 +
323*437bfbebSnyanmisaka                   madp_th_cnt2 * (regs_set->reg_rc_roi.madp_st_thd0.madp_th1 +
324*437bfbebSnyanmisaka                                   regs_set->reg_rc_roi.madp_st_thd1.madp_th2) / 2 +
325*437bfbebSnyanmisaka                   madp_th_cnt3 * regs_set->reg_rc_roi.madp_st_thd1.madp_th2;
326*437bfbebSnyanmisaka 
327*437bfbebSnyanmisaka     madp_cnt = madp_th_cnt0 + madp_th_cnt1 + madp_th_cnt2 + madp_th_cnt3;
328*437bfbebSnyanmisaka     if (madp_cnt)
329*437bfbebSnyanmisaka         fb->st_madp =  fb->st_madp  / madp_cnt;
330*437bfbebSnyanmisaka 
331*437bfbebSnyanmisaka     fb->st_mb_num += elem->st.st_bnum_b16.num_b16;
332*437bfbebSnyanmisaka     fb->frame_type = task->rc_task->frm.is_intra ? INTRA_FRAME : INTER_P_FRAME;
333*437bfbebSnyanmisaka     hal_rc_ret->bit_real += fb->out_strm_size * 8;
334*437bfbebSnyanmisaka 
335*437bfbebSnyanmisaka     hal_rc_ret->madi = elem->st.madi16_sum / fb->st_mb_num;
336*437bfbebSnyanmisaka     hal_rc_ret->madp = elem->st.madp16_sum / fb->st_mb_num;
337*437bfbebSnyanmisaka     hal_rc_ret->dsp_y_avg = elem->st.dsp_y_sum / (w32 / 4 * h32 / 4);
338*437bfbebSnyanmisaka 
339*437bfbebSnyanmisaka     hal_h265e_dbg_st("frame %d bit_real %d quality_real %d dsp_y_avg %3d\n", ctx->frame_num - 1,
340*437bfbebSnyanmisaka                      hal_rc_ret->bit_real, hal_rc_ret->quality_real, hal_rc_ret->dsp_y_avg);
341*437bfbebSnyanmisaka 
342*437bfbebSnyanmisaka     hal_h265e_dbg_func("leave\n");
343*437bfbebSnyanmisaka }