mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-09-27 05:25:53 +08:00
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:

committed by
Tingjin Huang

parent
2bec3a942d
commit
db6deeef62
@@ -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)
|
||||
|
Reference in New Issue
Block a user