diff --git a/mpp/codec/rc/rc_model_v2_smt.c b/mpp/codec/rc/rc_model_v2_smt.c index df43b074..f2b6d005 100644 --- a/mpp/codec/rc/rc_model_v2_smt.c +++ b/mpp/codec/rc/rc_model_v2_smt.c @@ -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)