chore[rc_smt]: Adjust code style for rc_smt

Change-Id: I819c76652270104b32775b44e8f6658bf95b4437
Signed-off-by: timkingh.huang <timkingh.huang@rock-chips.com>
This commit is contained in:
timkingh.huang
2025-07-08 16:28:33 +08:00
committed by Tingjin Huang
parent 2bec3a942d
commit db6deeef62

View File

@@ -708,31 +708,247 @@ static RK_S32 smt_calc_coef(void *ctx)
return coef2;
}
/* bit_target_use: average of bits_tgt_lower and bits_tgt_upper */
static RK_S32 derive_iframe_qp_by_bitrate(RcModelV2SmtCtx *p, RK_S32 bit_target_use)
{
RcFpsCfg *fps = &p->usr_cfg.fps;
RK_S32 avg_bps = (p->usr_cfg.bps_min + p->usr_cfg.bps_max) / 2;
RK_S32 fps_out = fps->fps_out_num / fps->fps_out_denom;
RK_S32 avg_pqp = mpp_data_avg(p->qp_p, -1, 1, 1);
RK_S32 avg_qp = mpp_clip(avg_pqp, p->qp_min, p->qp_max);
RK_S32 prev_iqp = p->pre_qp_i;
RK_S32 prev_pqp = p->qp_prev_out;
RK_S32 pre_bits_i = p->pre_real_bit_i;
RK_S32 qp_out_i = 0;
if (bit_target_use <= pre_bits_i) {
qp_out_i = (bit_target_use * 5 < pre_bits_i) ? prev_iqp + 3 :
(bit_target_use * 2 < pre_bits_i) ? prev_iqp + 2 :
(bit_target_use * 3 < pre_bits_i * 2) ? prev_iqp + 1 : prev_iqp;
} else {
qp_out_i = (pre_bits_i * 3 < bit_target_use) ? prev_iqp - 3 :
(pre_bits_i * 2 < bit_target_use) ? prev_iqp - 2 :
(pre_bits_i * 3 < bit_target_use * 2) ? prev_iqp - 1 : prev_iqp;
}
rc_dbg_rc("frame %lld bit_target_use %d pre_bits_i %d prev_iqp %d qp_out_i %d\n",
p->frm_num, bit_target_use, pre_bits_i, prev_iqp, qp_out_i);
//FIX: may be invalid(2025.01.06)
if (!p->reenc_cnt && p->usr_cfg.debreath_cfg.enable)
calc_smt_debreath_qp(p);
qp_out_i = mpp_clip(qp_out_i, inter_pqp0[avg_qp], inter_pqp1[avg_qp]);
qp_out_i = mpp_clip(qp_out_i, inter_pqp0[prev_pqp], inter_pqp1[prev_pqp]);
if (qp_out_i > 27)
qp_out_i = mpp_clip(qp_out_i, intra_pqp0[0][prev_iqp], intra_pqp1[prev_iqp]);
else if (qp_out_i > 22)
qp_out_i = mpp_clip(qp_out_i, intra_pqp0[1][prev_iqp], intra_pqp1[prev_iqp]);
else
qp_out_i = mpp_clip(qp_out_i, intra_pqp0[2][prev_iqp], intra_pqp1[prev_iqp]);
rc_dbg_rc("frame %lld qp_out_i %d avg_qp %d prev_pqp %d prev_iqp %d qp_out_i %d\n",
p->frm_num, qp_out_i, avg_qp, prev_pqp, prev_iqp, qp_out_i);
if (p->pre_gop_left_bit < 0) {
if (abs(p->pre_gop_left_bit) * 5 > avg_bps * (p->igop / fps_out))
qp_out_i = mpp_clip(qp_out_i, 20, 51);
else if (abs(p->pre_gop_left_bit) * 20 > avg_bps * (p->igop / fps_out))
qp_out_i = mpp_clip(qp_out_i, 15, 51);
rc_dbg_rc("frame %lld pre_gop_left_bit %d avg_bps %d qp_out_i %d\n",
p->frm_num, p->pre_gop_left_bit, avg_bps, qp_out_i);
}
return qp_out_i;
}
static RK_S32 derive_pframe_qp_by_bitrate(RcModelV2SmtCtx *p)
{
RcFpsCfg *fps = &p->usr_cfg.fps;
RK_S32 avg_bps = (p->usr_cfg.bps_min + p->usr_cfg.bps_max) / 2;
RK_S32 fps_out = fps->fps_out_num / fps->fps_out_denom;
RK_S32 bits_target_use = 0;
RK_S32 pre_diff_bit_use = 0;
RK_S32 coef = smt_calc_coef(p);
RK_S32 m_tbr = p->bits_tgt_upper - p->bits_tgt_lower;
RK_S32 m_dbr = p->pre_diff_bit_upper - p->pre_diff_bit_lower;
RK_S32 diff_bit = (p->pid_lower_all.i + p->pid_upper_all.i) >> 1;
RK_S32 prev_pqp = p->qp_prev_out;
RK_S32 qp_out = p->qp_out;
RK_S32 qp_add = 0, qp_minus = 0;
bits_target_use = ((RK_S64)m_tbr * coef + (RK_S64)p->bits_tgt_lower * 1024) >> 10;
pre_diff_bit_use = ((RK_S64)m_dbr * coef + (RK_S64)p->pre_diff_bit_lower * 1024) >> 10;
if (bits_target_use < 100)
bits_target_use = 100;
rc_dbg_rc("frame %lld bits_target_use %d m_tbr %d coef %d bits_tgt_lower %d\n"
"pre_diff_bit_use %d m_dbr %d pre_diff_bit_lower %d "
"bits_tgt_upper %d pre_diff_bit_upper %d qp_out_0 %d\n",
p->frm_num, bits_target_use, m_tbr, coef, p->bits_tgt_lower,
pre_diff_bit_use, m_dbr, p->pre_diff_bit_lower,
p->bits_tgt_upper, p->pre_diff_bit_upper, qp_out);
if (abs(pre_diff_bit_use) * 100 <= bits_target_use * 3)
qp_out = prev_pqp - 1;
else if (pre_diff_bit_use * 100 > bits_target_use * 3) {
if (pre_diff_bit_use >= bits_target_use)
qp_out = qp_out >= 30 ? prev_pqp - 4 : prev_pqp - 3;
else if (pre_diff_bit_use * 4 >= bits_target_use * 1)
qp_out = qp_out >= 30 ? prev_pqp - 3 : prev_pqp - 2;
else if (pre_diff_bit_use * 10 > bits_target_use * 1)
qp_out = prev_pqp - 2;
else
qp_out = prev_pqp - 1;
} else {
RK_S32 qp_add_tmp = (prev_pqp >= 36) ? 0 : 1;
pre_diff_bit_use = abs(pre_diff_bit_use);
qp_out = (pre_diff_bit_use >= 2 * bits_target_use) ? prev_pqp + 2 + qp_add_tmp :
(pre_diff_bit_use * 3 >= bits_target_use * 2) ? prev_pqp + 1 + qp_add_tmp :
(pre_diff_bit_use * 5 > bits_target_use) ? prev_pqp + 1 : prev_pqp;
}
rc_dbg_rc("frame %lld prev_pqp %d qp_out_1 %d\n", p->frm_num, prev_pqp, qp_out);
qp_out = mpp_clip(qp_out, p->qp_min, p->qp_max);
if (qp_out > LOW_QP) {
pre_diff_bit_use = ((RK_S64)m_dbr * coef + (RK_S64)p->pre_diff_bit_lower * 1024) >> 10;
bits_target_use = avg_bps / fps_out;
bits_target_use = -bits_target_use / 5;
coef += pre_diff_bit_use <= 2 * bits_target_use ? 205 :
((pre_diff_bit_use <= bits_target_use) ? 102 : 51);
if (coef >= 1024 || qp_out > LOW_LOW_QP)
coef = 1024;
rc_dbg_rc("frame %lld pre_diff_bit_use %d bits_target_use %d coef %d\n",
p->frm_num, pre_diff_bit_use, bits_target_use, coef);
pre_diff_bit_use = ((RK_S64)m_dbr * coef + (RK_S64)p->pre_diff_bit_lower * 1024) >> 10;
bits_target_use = ((RK_S64)m_tbr * coef + (RK_S64)p->bits_tgt_lower * 1024) >> 10;
if (bits_target_use < 100)
bits_target_use = 100;
if (abs(pre_diff_bit_use) * 100 <= bits_target_use * 3)
qp_out = prev_pqp;
else if (pre_diff_bit_use * 100 > bits_target_use * 3) {
if (pre_diff_bit_use >= bits_target_use)
qp_out = qp_out >= 30 ? prev_pqp - 3 : prev_pqp - 2;
else if (pre_diff_bit_use * 4 >= bits_target_use * 1)
qp_out = qp_out >= 30 ? prev_pqp - 2 : prev_pqp - 1;
else if (pre_diff_bit_use * 10 > bits_target_use * 1)
qp_out = prev_pqp - 1;
else
qp_out = prev_pqp;
} else {
pre_diff_bit_use = abs(pre_diff_bit_use);
qp_out = prev_pqp + (pre_diff_bit_use * 3 >= bits_target_use * 2 ? 1 : 0);
}
rc_dbg_rc("frame %lld pre_diff_bit_use %d bits_target_use %d prev_pqp %d qp_out_2 %d\n",
p->frm_num, pre_diff_bit_use, bits_target_use, prev_pqp, qp_out);
}
qp_out = mpp_clip(qp_out, p->qp_min, p->qp_max);
//Add rc_container
p->change_bit_flag = 0;
if (p->usr_cfg.rc_container) {
RK_S32 cnt = p->usr_cfg.scene_mode * 3 + p->usr_cfg.rc_container;
if (p->count_real_bit < p->count_pred_bit * rc_ctnr_br_thd1[cnt] / 100) {
if (qp_out > rc_ctnr_qp_thd1[cnt]) {
p->change_bit_flag = 1;
}
qp_out = mpp_clip(qp_out, 10, rc_ctnr_qp_thd1[cnt]);
} else if (p->count_real_bit < p->count_pred_bit * rc_ctnr_br_thd2[cnt] / 100) {
if (qp_out > rc_ctnr_qp_thd2[cnt]) {
p->change_bit_flag = 1;
}
qp_out = mpp_clip(qp_out, 10, rc_ctnr_qp_thd2[cnt]);
}
}
qp_add = qp_out > 36 ? 1 : (qp_out > 33 ? 2 : (qp_out > 30 ? 3 : 4));
qp_minus = qp_out > 40 ? 4 : (qp_out > 36 ? 3 : (qp_out > 33 ? 2 : 1));
qp_out = mpp_clip(qp_out, prev_pqp - qp_minus, prev_pqp + qp_add);
rc_dbg_rc("frame %lld qp_out_3 %d qp_add %d qp_minus %d\n",
p->frm_num, qp_out, qp_add, qp_minus);
if (diff_bit > 0) {
if (avg_bps * 5 > avg_bps) //FIXME: avg_bps is typo error?(2025.01.06)
qp_out = mpp_clip(qp_out, 25, 51);
else if (avg_bps * 20 > avg_bps)
qp_out = mpp_clip(qp_out, 21, 51);
rc_dbg_rc("frame %lld avg_bps %d qp_out_4 %d\n", p->frm_num, avg_bps, qp_out);
}
return qp_out;
}
static RK_S32 revise_qp_by_complexity(RcModelV2SmtCtx *p, RK_S32 fm_min_iqp,
RK_S32 fm_min_pqp, RK_S32 fm_max_iqp, RK_S32 fm_max_pqp)
{
RK_S32 md_lvl_sum = mpp_data_sum_v2(p->motion_level);
RK_S32 md_lvl_0 = mpp_data_get_pre_val_v2(p->motion_level, 0);
RK_S32 cplx_lvl_sum = mpp_data_sum_v2(p->complex_level);
RK_S32 qp_add = 0, qp_add_p = 0;
RK_S32 qp_final = p->qp_out;
qp_add = 4;
qp_add_p = 4;
if (md_lvl_sum >= 700 || md_lvl_0 == 200) {
qp_add = 6;
qp_add_p = 6;
} else if (md_lvl_sum >= 400 || md_lvl_0 == 100) {
qp_add = 5;
qp_add_p = 5;
}
if (cplx_lvl_sum >= 12) {
qp_add++;
qp_add_p++;
}
rc_dbg_rc("frame %lld md_lvl_sum %d md_lvl_0 %d cplx_lvl_sum %d "
"qp_add_cplx %d qp_add_p %d qp_final_0 %d\n",
p->frm_num, md_lvl_sum, md_lvl_0, cplx_lvl_sum,
qp_add, qp_add_p, qp_final);
if (p->frame_type == INTRA_FRAME)
qp_final = mpp_clip(qp_final, fm_min_iqp + qp_add, fm_max_iqp);
else if (p->frame_type == INTER_VI_FRAME) {
RK_S32 vi_max_qp = (fm_max_pqp > 42) ? (fm_max_pqp - 5) :
(fm_max_pqp > 39) ? (fm_max_pqp - 3) :
(fm_max_pqp > 35) ? (fm_max_pqp - 2) : fm_max_pqp;
qp_final -= 1;
qp_final = mpp_clip(qp_final, fm_min_pqp + qp_add - 1, fm_max_pqp);
qp_final = mpp_clip(qp_final, qp_final, vi_max_qp);
} else
qp_final = mpp_clip(qp_final, fm_min_pqp + qp_add_p, fm_max_pqp);
qp_final = mpp_clip(qp_final, p->qp_min, p->qp_max);
rc_dbg_rc("frame %lld frm_type %d frm_qp %d:%d:%d:%d blk_qp %d:%d qp_final_1 %d\n",
p->frm_num, p->frame_type, fm_min_iqp, fm_max_iqp,
fm_min_pqp, fm_max_pqp, p->qp_min, p->qp_max, qp_final);
return qp_final;
}
MPP_RET rc_model_v2_smt_start(void *ctx, EncRcTask * task)
{
RcModelV2SmtCtx *p = (RcModelV2SmtCtx *) ctx;
EncFrmStatus *frm = &task->frm;
EncRcTaskInfo *info = &task->info;
RcFpsCfg *fps = &p->usr_cfg.fps;
RK_S32 qp_add = 0, qp_add_p = 0, qp_minus = 0;
RK_S32 bit_target_use = 0;
RK_S32 avg_bps = (p->usr_cfg.bps_min + p->usr_cfg.bps_max) / 2;
RK_S32 fps_out = fps->fps_out_num / fps->fps_out_denom;
RK_S32 avg_pqp = 0;
RK_S32 prev_pqp = p->qp_prev_out;
RK_S32 fm_min_iqp = p->usr_cfg.fqp_min_i;
RK_S32 fm_min_pqp = p->usr_cfg.fqp_min_p;
RK_S32 fm_max_iqp = p->usr_cfg.fqp_max_i;
RK_S32 fm_max_pqp = p->usr_cfg.fqp_max_p;
RK_S32 md_lvl_sum = mpp_data_sum_v2(p->motion_level);
RK_S32 md_lvl_0 = mpp_data_get_pre_val_v2(p->motion_level, 0);
RK_S32 cplx_lvl_sum = mpp_data_sum_v2(p->complex_level);
if (frm->reencode)
return MPP_OK;
smt_start_prepare(ctx, task);
bit_target_use = info->bit_max;
avg_pqp = mpp_data_avg(p->qp_p, -1, 1, 1);
if (p->frm_num == 0) {
@@ -755,191 +971,20 @@ MPP_RET rc_model_v2_smt_start(void *ctx, EncRcTask * task)
"mb_w %d mb_h %d ratio %d qp_out %d\n",
p->usr_cfg.init_quality, p->bits_tgt_upper,
mb_w, mb_h, ratio, p->qp_out);
}
p->change_bit_flag = 0;
if (p->frame_type == INTRA_FRAME) {
if (p->frm_num > 0) {
RK_S32 avg_qp = mpp_clip(avg_pqp, p->qp_min, p->qp_max);
RK_S32 prev_iqp = p->pre_qp_i;
RK_S32 pre_bits_i = p->pre_real_bit_i;
RK_S32 qp_out_i = 0;
if (bit_target_use <= pre_bits_i) {
qp_out_i = (bit_target_use * 5 < pre_bits_i) ? prev_iqp + 3 :
(bit_target_use * 2 < pre_bits_i) ? prev_iqp + 2 :
(bit_target_use * 3 < pre_bits_i * 2) ? prev_iqp + 1 : prev_iqp;
} else {
qp_out_i = (pre_bits_i * 3 < bit_target_use) ? prev_iqp - 3 :
(pre_bits_i * 2 < bit_target_use) ? prev_iqp - 2 :
(pre_bits_i * 3 < bit_target_use * 2) ? prev_iqp - 1 : prev_iqp;
}
if (!p->reenc_cnt && p->usr_cfg.debreath_cfg.enable)
calc_smt_debreath_qp(p);
qp_out_i = mpp_clip(qp_out_i, inter_pqp0[avg_qp], inter_pqp1[avg_qp]);
qp_out_i = mpp_clip(qp_out_i, inter_pqp0[prev_pqp], inter_pqp1[prev_pqp]);
if (qp_out_i > 27)
p->qp_out = mpp_clip(qp_out_i, intra_pqp0[0][prev_iqp], intra_pqp1[prev_iqp]);
else if (qp_out_i > 22)
p->qp_out = mpp_clip(qp_out_i, intra_pqp0[1][prev_iqp], intra_pqp1[prev_iqp]);
else
p->qp_out = mpp_clip(qp_out_i, intra_pqp0[2][prev_iqp], intra_pqp1[prev_iqp]);
if (p->pre_gop_left_bit < 0) {
if (abs(p->pre_gop_left_bit) * 5 > avg_bps * (p->igop / fps_out))
p->qp_out = mpp_clip(p->qp_out, 20, 51);
else if (abs(p->pre_gop_left_bit) * 20 > avg_bps * (p->igop / fps_out))
p->qp_out = mpp_clip(p->qp_out, 15, 51);
}
}
} else if (p->frame_type == INTRA_FRAME) {
// if (p->frm_num > 0)
p->qp_out = derive_iframe_qp_by_bitrate(p, info->bit_max);
} else {
if (p->last_frame_type == INTRA_FRAME)
p->qp_out = prev_pqp + (prev_pqp < 33 ? 3 : (prev_pqp < 35 ? 2 : 1));
else {
RK_S32 bits_tgt_use = 0;
RK_S32 pre_diff_bit_use = 0;
RK_S32 coef = smt_calc_coef(ctx);
RK_S32 m_tbr = p->bits_tgt_upper - p->bits_tgt_lower;
RK_S32 m_dbr = p->pre_diff_bit_upper - p->pre_diff_bit_lower;
RK_S32 diff_bit = (p->pid_lower_all.i + p->pid_upper_all.i) >> 1;
RK_S32 qp_out = p->qp_out;
bits_tgt_use = (m_tbr * coef + p->bits_tgt_lower * 1024) >> 10;
pre_diff_bit_use = (m_dbr * coef + p->pre_diff_bit_lower * 1024) >> 10;
if (bits_tgt_use < 100)
bits_tgt_use = 100;
rc_dbg_rc("frame %lld bits_target_use %d m_tbr %d coef %d bits_tgt_lower %d\n"
"pre_diff_bit_use %d m_dbr %d pre_diff_bit_lower %d "
"bits_tgt_upper %d pre_diff_bit_upper %d qp_out_0 %d\n",
p->frm_num, bits_tgt_use, m_tbr, coef, p->bits_tgt_lower,
pre_diff_bit_use, m_dbr, p->pre_diff_bit_lower,
p->bits_tgt_upper, p->pre_diff_bit_upper, qp_out);
if (abs(pre_diff_bit_use) * 100 <= bits_tgt_use * 3)
qp_out = prev_pqp - 1;
else if (pre_diff_bit_use * 100 > bits_tgt_use * 3) {
if (pre_diff_bit_use >= bits_tgt_use)
qp_out = qp_out >= 30 ? prev_pqp - 4 : prev_pqp - 3;
else if (pre_diff_bit_use * 4 >= bits_tgt_use * 1)
qp_out = qp_out >= 30 ? prev_pqp - 3 : prev_pqp - 2;
else if (pre_diff_bit_use * 10 > bits_tgt_use * 1)
qp_out = prev_pqp - 2;
else
qp_out = prev_pqp - 1;
} else {
RK_S32 qp_add_tmp = 1;
if (prev_pqp >= 36)
qp_add_tmp = 0;
pre_diff_bit_use = abs(pre_diff_bit_use);
qp_out = (pre_diff_bit_use >= 2 * bits_tgt_use) ? prev_pqp + 2 + qp_add_tmp :
(pre_diff_bit_use * 3 >= bits_tgt_use * 2) ? prev_pqp + 1 + qp_add_tmp :
(pre_diff_bit_use * 5 > bits_tgt_use) ? prev_pqp + 1 : prev_pqp;
}
rc_dbg_rc("frame %lld prev_pqp %d qp_out_1 %d\n", p->frm_num, prev_pqp, qp_out);
qp_out = mpp_clip(qp_out, p->qp_min, p->qp_max);
pre_diff_bit_use = (m_dbr * coef + p->pre_diff_bit_lower * 1024) >> 10;
bits_tgt_use = avg_bps / fps_out;
bits_tgt_use = -bits_tgt_use / 5;
if (qp_out > LOW_QP) {
coef += pre_diff_bit_use <= 2 * bits_tgt_use ? 205 :
((pre_diff_bit_use <= bits_tgt_use) ? 102 : 51);
if (coef >= 1024 || qp_out > LOW_LOW_QP)
coef = 1024;
rc_dbg_rc("frame %lld pre_diff_bit_use %d bits_tgt_use %d coef %d\n",
p->frm_num, pre_diff_bit_use, bits_tgt_use, coef);
pre_diff_bit_use = (m_dbr * coef + p->pre_diff_bit_lower * 1024) >> 10;
bits_tgt_use = (m_tbr * coef + p->bits_tgt_lower * 1024) >> 10;
if (bits_tgt_use < 100)
bits_tgt_use = 100;
if (abs(pre_diff_bit_use) * 100 <= bits_tgt_use * 3)
qp_out = prev_pqp;
else if (pre_diff_bit_use * 100 > bits_tgt_use * 3) {
if (pre_diff_bit_use >= bits_tgt_use)
qp_out = qp_out >= 30 ? prev_pqp - 3 : prev_pqp - 2;
else if (pre_diff_bit_use * 4 >= bits_tgt_use * 1)
qp_out = qp_out >= 30 ? prev_pqp - 2 : prev_pqp - 1;
else if (pre_diff_bit_use * 10 > bits_tgt_use * 1)
qp_out = prev_pqp - 1;
else
qp_out = prev_pqp;
} else {
pre_diff_bit_use = abs(pre_diff_bit_use);
qp_out = prev_pqp + (pre_diff_bit_use * 3 >= bits_tgt_use * 2 ? 1 : 0);
}
rc_dbg_rc("frame %lld pre_diff_bit_use %d bits_tgt_use %d prev_pqp %d qp_out_2 %d\n",
p->frm_num, pre_diff_bit_use, bits_tgt_use, prev_pqp, qp_out);
}
qp_out = mpp_clip(qp_out, p->qp_min, p->qp_max);
//Add rc_container
if (p->usr_cfg.rc_container) {
RK_S32 cnt = p->usr_cfg.scene_mode * 3 + p->usr_cfg.rc_container;
if (p->count_real_bit < p->count_pred_bit * rc_ctnr_br_thd1[cnt] / 100) {
if (qp_out > rc_ctnr_qp_thd1[cnt]) {
p->change_bit_flag = 1;
}
qp_out = mpp_clip(qp_out, 10, rc_ctnr_qp_thd1[cnt]);
} else if (p->count_real_bit < p->count_pred_bit * rc_ctnr_br_thd2[cnt] / 100) {
if (qp_out > rc_ctnr_qp_thd2[cnt]) {
p->change_bit_flag = 1;
}
qp_out = mpp_clip(qp_out, 10, rc_ctnr_qp_thd2[cnt]);
}
}
qp_add = qp_out > 36 ? 1 : (qp_out > 33 ? 2 : (qp_out > 30 ? 3 : 4));
qp_minus = qp_out > 40 ? 4 : (qp_out > 36 ? 3 : (qp_out > 33 ? 2 : 1));
p->qp_out = mpp_clip(qp_out, prev_pqp - qp_minus, prev_pqp + qp_add);
rc_dbg_rc("frame %lld qp_out_3 %d qp_add %d qp_minus %d\n",
p->frm_num, qp_out, qp_add, qp_minus);
if (diff_bit > 0) {
if (avg_bps * 5 > avg_bps)
p->qp_out = mpp_clip(p->qp_out, 25, 51);
else if (avg_bps * 20 > avg_bps)
p->qp_out = mpp_clip(p->qp_out, 21, 51);
}
rc_dbg_rc("frame %lld avg_bps %d qp_out_4 %d\n", p->frm_num, avg_bps, qp_out);
}
if (p->last_frame_type == INTRA_FRAME) {
RK_S32 prev_qp = p->qp_prev_out;
p->qp_out = prev_qp + (prev_qp < 33 ? 3 : (prev_qp < 35 ? 2 : 1));
} else
p->qp_out = derive_pframe_qp_by_bitrate(p);
}
qp_add = 4;
qp_add_p = 4;
if (md_lvl_sum >= 700 || md_lvl_0 == 200) {
qp_add = 6;
qp_add_p = 6;
} else if (md_lvl_sum >= 400 || md_lvl_0 == 100) {
qp_add = 5;
qp_add_p = 5;
}
if (cplx_lvl_sum >= 12) {
qp_add++;
qp_add_p++;
}
p->qp_out = revise_qp_by_complexity(p, fm_min_iqp, fm_min_pqp, fm_max_iqp, fm_max_pqp);
if (p->frame_type == INTRA_FRAME)
p->qp_out = mpp_clip(p->qp_out, fm_min_iqp + qp_add, fm_max_iqp);
else if (p->frame_type == INTER_VI_FRAME) {
RK_S32 vi_max_qp = (fm_max_pqp > 42) ? (fm_max_pqp - 5) :
(fm_max_pqp > 39) ? (fm_max_pqp - 3) :
(fm_max_pqp > 35) ? (fm_max_pqp - 2) : fm_max_pqp;
p->qp_out -= 1;
p->qp_out = mpp_clip(p->qp_out, fm_min_pqp + qp_add - 1, fm_max_pqp);
p->qp_out = mpp_clip(p->qp_out, p->qp_out, vi_max_qp);
} else
p->qp_out = mpp_clip(p->qp_out, fm_min_pqp + qp_add_p, fm_max_pqp);
p->qp_out = mpp_clip(p->qp_out, p->qp_min, p->qp_max);
info->quality_target = p->qp_out;
info->complex_scene = 0;
if (p->frame_type == INTER_P_FRAME && avg_pqp >= fm_max_pqp - 1 &&
p->qp_out == fm_max_pqp && p->qp_prev_out == fm_max_pqp)