mirror of
https://github.com/ittiam-systems/libhevc.git
synced 2026-10-09 10:22:19 +07:00
libhevcenc: default initialize enc ctxt at the start
When cu level rc is enabled, the lagrange param is left uninitialized at the start of row. This is causing the outputs to vary from run to run when multi-thread is enabled, for a given input and encoding options. This is now corrected. Test: hevcenc -c vid_enc_cfg.txt Bug: 139402085 Change-Id: Ic9693e9a547d9d5dc1c3b7ef4a46640850723829
This commit is contained in:
parent
50408aad50
commit
ceed88e597
4 changed files with 69 additions and 226 deletions
|
|
@ -624,6 +624,11 @@ LWORD64 ihevce_cu_mode_decide(
|
|||
}
|
||||
}
|
||||
|
||||
if(ps_ctxt->i1_cu_qp_delta_enable)
|
||||
{
|
||||
ihevce_update_cu_level_qp_lamda(ps_ctxt, ps_cu_analyse, 4, 0);
|
||||
}
|
||||
|
||||
s_prms.i4_ctb_nbr_map_stride = ps_ctxt->i4_nbr_map_strd;
|
||||
s_prms.i4_max_num_inter_rdopt_cands = ps_ctxt->i4_max_num_inter_rdopt_cands;
|
||||
s_prms.i4_nbr_4x4_left_strd = nbr_4x4_left_strd;
|
||||
|
|
@ -2037,11 +2042,6 @@ void ihevce_enc_loop_process_row(
|
|||
ps_ctb_ipe_analyse->nodes_created_in_cu_tree = 1;
|
||||
ps_ctxt->ps_enc_out_ctxt = &ps_ctxt->as_enc_cu_ctxt[0];
|
||||
ps_ctxt->pu1_ecd_data = pu1_row_ecd_data;
|
||||
if(ps_ctxt->i4_use_ctb_level_lamda)
|
||||
{
|
||||
ihevce_compute_cu_level_QP(
|
||||
ps_ctxt, -1, ps_ctb_ipe_analyse->i4_64x64_act_factor[3][1], 0);
|
||||
}
|
||||
|
||||
s_cu_update_prms.ppu1_row_ecd_data = &pu1_row_ecd_data;
|
||||
s_cu_update_prms.pi4_last_cu_pos_in_ctb = &last_cu_pos_in_ctb;
|
||||
|
|
|
|||
|
|
@ -845,6 +845,57 @@ void ihevce_compute_cu_level_QP(
|
|||
}
|
||||
}
|
||||
|
||||
void ihevce_update_cu_level_qp_lamda(
|
||||
ihevce_enc_loop_ctxt_t *ps_ctxt, cu_analyse_t *ps_cu_analyse, WORD32 trans_size, WORD32 is_intra)
|
||||
{
|
||||
WORD32 i4_act_counter = 0, i4_act_counter_lamda = 0;
|
||||
|
||||
if(ps_cu_analyse->u1_cu_size == 64)
|
||||
{
|
||||
ASSERT((trans_size == 32) || (trans_size == 16) || (trans_size == 8) || (trans_size == 4));
|
||||
i4_act_counter = (trans_size == 16) + 2 * ((trans_size == 8) || (trans_size == 4));
|
||||
i4_act_counter_lamda = 3;
|
||||
}
|
||||
else if(ps_cu_analyse->u1_cu_size == 32)
|
||||
{
|
||||
ASSERT((trans_size == 32) || (trans_size == 16) || (trans_size == 8) || (trans_size == 4));
|
||||
i4_act_counter = (trans_size == 16) + 2 * ((trans_size == 8) || (trans_size == 4));
|
||||
i4_act_counter_lamda = 0;
|
||||
}
|
||||
else if(ps_cu_analyse->u1_cu_size == 16)
|
||||
{
|
||||
ASSERT((trans_size == 16) || (trans_size == 8) || (trans_size == 4));
|
||||
i4_act_counter = (trans_size == 8) || (trans_size == 4);
|
||||
i4_act_counter_lamda = 0;
|
||||
}
|
||||
else if(ps_cu_analyse->u1_cu_size == 8)
|
||||
{
|
||||
ASSERT((trans_size == 8) || (trans_size == 4));
|
||||
i4_act_counter = 1;
|
||||
i4_act_counter_lamda = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
ASSERT(0);
|
||||
}
|
||||
|
||||
if(ps_ctxt->i4_use_ctb_level_lamda)
|
||||
{
|
||||
ihevce_compute_cu_level_QP(
|
||||
ps_ctxt, ps_cu_analyse->i4_act_factor[i4_act_counter][is_intra], -1, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
ihevce_compute_cu_level_QP(
|
||||
ps_ctxt,
|
||||
ps_cu_analyse->i4_act_factor[i4_act_counter][is_intra],
|
||||
ps_cu_analyse->i4_act_factor[i4_act_counter_lamda][is_intra],
|
||||
0);
|
||||
}
|
||||
|
||||
ps_cu_analyse->i1_cu_qp = ps_ctxt->i4_cu_qp;
|
||||
}
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
* \if Function name : ihevce_scan_coeffs \endif
|
||||
|
|
@ -2986,53 +3037,9 @@ LWORD64 ihevce_intra_rdopt_cu_ntu(
|
|||
|
||||
if(ps_ctxt->i1_cu_qp_delta_enable)
|
||||
{
|
||||
WORD32 i4_act_counter = 0, i4_act_counter_lamda = 0;
|
||||
if(ps_cu_analyse->u1_cu_size == 64)
|
||||
{
|
||||
ASSERT(
|
||||
(trans_size == 32) || (trans_size == 16) || (trans_size == 8) || (trans_size == 4));
|
||||
i4_act_counter = (trans_size == 16) + 2 * ((trans_size == 8) || (trans_size == 4));
|
||||
i4_act_counter_lamda = 3;
|
||||
}
|
||||
else if(ps_cu_analyse->u1_cu_size == 32)
|
||||
{
|
||||
ASSERT(
|
||||
(trans_size == 32) || (trans_size == 16) || (trans_size == 8) || (trans_size == 4));
|
||||
i4_act_counter = (trans_size == 16) + 2 * ((trans_size == 8) || (trans_size == 4));
|
||||
i4_act_counter_lamda = 0;
|
||||
}
|
||||
else if(ps_cu_analyse->u1_cu_size == 16)
|
||||
{
|
||||
ASSERT((trans_size == 16) || (trans_size == 8) || (trans_size == 4));
|
||||
i4_act_counter = (trans_size == 8) || (trans_size == 4);
|
||||
i4_act_counter_lamda = 0;
|
||||
}
|
||||
else if(ps_cu_analyse->u1_cu_size == 8)
|
||||
{
|
||||
ASSERT((trans_size == 8) || (trans_size == 4));
|
||||
i4_act_counter = 1;
|
||||
i4_act_counter_lamda = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
ASSERT(0);
|
||||
}
|
||||
if(ps_ctxt->i4_use_ctb_level_lamda)
|
||||
{
|
||||
ihevce_compute_cu_level_QP(
|
||||
ps_ctxt, ps_cu_analyse->i4_act_factor[i4_act_counter][1], -1, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
ihevce_compute_cu_level_QP(
|
||||
ps_ctxt,
|
||||
ps_cu_analyse->i4_act_factor[i4_act_counter][1],
|
||||
ps_cu_analyse->i4_act_factor[i4_act_counter_lamda][1],
|
||||
0);
|
||||
}
|
||||
|
||||
ps_cu_analyse->i1_cu_qp = ps_ctxt->i4_cu_qp;
|
||||
ihevce_update_cu_level_qp_lamda(ps_ctxt, ps_cu_analyse, trans_size, 1);
|
||||
}
|
||||
|
||||
if(u1_is_cu_noisy && !ps_ctxt->u1_enable_psyRDOPT)
|
||||
{
|
||||
ps_ctxt->i8_cl_ssd_lambda_qf =
|
||||
|
|
@ -4371,59 +4378,9 @@ LWORD64 ihevce_inter_rdopt_cu_ntu(
|
|||
|
||||
if(ps_ctxt->i1_cu_qp_delta_enable)
|
||||
{
|
||||
WORD32 i4_act_counter = 0, i4_act_counter_lamda = 0;
|
||||
|
||||
if(ps_cu_analyse->u1_cu_size == 64)
|
||||
{
|
||||
ASSERT(
|
||||
(i4_min_trans_size == 32) || (i4_min_trans_size == 16) ||
|
||||
(i4_min_trans_size == 8) || (i4_min_trans_size == 4));
|
||||
i4_act_counter = (i4_min_trans_size == 16) +
|
||||
2 * ((i4_min_trans_size == 8) || (i4_min_trans_size == 4));
|
||||
i4_act_counter_lamda = 3;
|
||||
}
|
||||
else if(ps_cu_analyse->u1_cu_size == 32)
|
||||
{
|
||||
ASSERT(
|
||||
(i4_min_trans_size == 32) || (i4_min_trans_size == 16) ||
|
||||
(i4_min_trans_size == 8) || (i4_min_trans_size == 4));
|
||||
i4_act_counter = (i4_min_trans_size == 16) +
|
||||
2 * ((i4_min_trans_size == 8) || (i4_min_trans_size == 4));
|
||||
i4_act_counter_lamda = 0;
|
||||
}
|
||||
else if(ps_cu_analyse->u1_cu_size == 16)
|
||||
{
|
||||
ASSERT(
|
||||
(i4_min_trans_size == 16) || (i4_min_trans_size == 8) || (i4_min_trans_size == 4));
|
||||
i4_act_counter = (i4_min_trans_size == 8) || (i4_min_trans_size == 4);
|
||||
i4_act_counter_lamda = 0;
|
||||
}
|
||||
else if(ps_cu_analyse->u1_cu_size == 8)
|
||||
{
|
||||
ASSERT((i4_min_trans_size == 8) || (i4_min_trans_size == 4));
|
||||
i4_act_counter = 1;
|
||||
i4_act_counter_lamda = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
ASSERT(0);
|
||||
}
|
||||
if(ps_ctxt->i4_use_ctb_level_lamda)
|
||||
{
|
||||
ihevce_compute_cu_level_QP(
|
||||
ps_ctxt, ps_cu_analyse->i4_act_factor[i4_act_counter][0], -1, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
ihevce_compute_cu_level_QP(
|
||||
ps_ctxt,
|
||||
ps_cu_analyse->i4_act_factor[i4_act_counter][0],
|
||||
ps_cu_analyse->i4_act_factor[i4_act_counter_lamda][0],
|
||||
0);
|
||||
}
|
||||
|
||||
ps_cu_analyse->i1_cu_qp = ps_ctxt->i4_cu_qp;
|
||||
ihevce_update_cu_level_qp_lamda(ps_ctxt, ps_cu_analyse, i4_min_trans_size, 0);
|
||||
}
|
||||
|
||||
if(u1_is_cu_noisy && !ps_ctxt->u1_enable_psyRDOPT)
|
||||
{
|
||||
ps_ctxt->i8_cl_ssd_lambda_qf =
|
||||
|
|
@ -5243,57 +5200,7 @@ LWORD64 ihevce_inter_tu_tree_selector_and_rdopt_cost_computer(
|
|||
|
||||
if(ps_ctxt->i1_cu_qp_delta_enable)
|
||||
{
|
||||
WORD32 i4_act_counter = 0, i4_act_counter_lamda = 0;
|
||||
if(ps_cu_analyse->u1_cu_size == 64)
|
||||
{
|
||||
ASSERT(
|
||||
(i4_min_trans_size == 32) || (i4_min_trans_size == 16) ||
|
||||
(i4_min_trans_size == 8) || (i4_min_trans_size == 4));
|
||||
i4_act_counter = (i4_min_trans_size == 16) +
|
||||
2 * ((i4_min_trans_size == 8) || (i4_min_trans_size == 4));
|
||||
i4_act_counter_lamda = 3;
|
||||
}
|
||||
else if(ps_cu_analyse->u1_cu_size == 32)
|
||||
{
|
||||
ASSERT(
|
||||
(i4_min_trans_size == 32) || (i4_min_trans_size == 16) ||
|
||||
(i4_min_trans_size == 8) || (i4_min_trans_size == 4));
|
||||
i4_act_counter = (i4_min_trans_size == 16) +
|
||||
2 * ((i4_min_trans_size == 8) || (i4_min_trans_size == 4));
|
||||
i4_act_counter_lamda = 0;
|
||||
}
|
||||
else if(ps_cu_analyse->u1_cu_size == 16)
|
||||
{
|
||||
ASSERT(
|
||||
(i4_min_trans_size == 16) || (i4_min_trans_size == 8) || (i4_min_trans_size == 4));
|
||||
i4_act_counter = (i4_min_trans_size == 8) || (i4_min_trans_size == 4);
|
||||
i4_act_counter_lamda = 0;
|
||||
}
|
||||
else if(ps_cu_analyse->u1_cu_size == 8)
|
||||
{
|
||||
ASSERT((i4_min_trans_size == 8) || (i4_min_trans_size == 4));
|
||||
i4_act_counter = 1;
|
||||
i4_act_counter_lamda = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
ASSERT(0);
|
||||
}
|
||||
if(ps_ctxt->i4_use_ctb_level_lamda)
|
||||
{
|
||||
ihevce_compute_cu_level_QP(
|
||||
ps_ctxt, ps_cu_analyse->i4_act_factor[i4_act_counter][0], -1, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
ihevce_compute_cu_level_QP(
|
||||
ps_ctxt,
|
||||
ps_cu_analyse->i4_act_factor[i4_act_counter][0],
|
||||
ps_cu_analyse->i4_act_factor[i4_act_counter_lamda][0],
|
||||
0);
|
||||
}
|
||||
|
||||
ps_cu_analyse->i1_cu_qp = ps_ctxt->i4_cu_qp;
|
||||
ihevce_update_cu_level_qp_lamda(ps_ctxt, ps_cu_analyse, i4_min_trans_size, 0);
|
||||
}
|
||||
|
||||
if(u1_is_cu_noisy && !ps_ctxt->u1_enable_psyRDOPT)
|
||||
|
|
@ -6564,57 +6471,7 @@ void ihevce_intra_chroma_pred_mode_selector(
|
|||
|
||||
if(ps_ctxt->i1_cu_qp_delta_enable)
|
||||
{
|
||||
WORD32 i4_act_counter = 0, i4_act_counter_lamda = 0;
|
||||
if(ps_cu_analyse->u1_cu_size == 64)
|
||||
{
|
||||
ASSERT(
|
||||
(luma_trans_size == 32) || (luma_trans_size == 16) || (luma_trans_size == 8) ||
|
||||
(luma_trans_size == 4));
|
||||
i4_act_counter = (luma_trans_size == 16) +
|
||||
2 * ((luma_trans_size == 8) || (luma_trans_size == 4));
|
||||
i4_act_counter_lamda = 3;
|
||||
}
|
||||
else if(ps_cu_analyse->u1_cu_size == 32)
|
||||
{
|
||||
ASSERT(
|
||||
(luma_trans_size == 32) || (luma_trans_size == 16) || (luma_trans_size == 8) ||
|
||||
(luma_trans_size == 4));
|
||||
i4_act_counter = (luma_trans_size == 16) +
|
||||
2 * ((luma_trans_size == 8) || (luma_trans_size == 4));
|
||||
i4_act_counter_lamda = 0;
|
||||
}
|
||||
else if(ps_cu_analyse->u1_cu_size == 16)
|
||||
{
|
||||
ASSERT((luma_trans_size == 16) || (luma_trans_size == 8) || (luma_trans_size == 4));
|
||||
i4_act_counter = (luma_trans_size == 8) || (luma_trans_size == 4);
|
||||
i4_act_counter_lamda = 0;
|
||||
}
|
||||
else if(ps_cu_analyse->u1_cu_size == 8)
|
||||
{
|
||||
ASSERT((luma_trans_size == 8) || (luma_trans_size == 4));
|
||||
i4_act_counter = 1;
|
||||
i4_act_counter_lamda = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
ASSERT(0);
|
||||
}
|
||||
/*assumption is that control comes here for intras*/
|
||||
if(ps_ctxt->i4_use_ctb_level_lamda)
|
||||
{
|
||||
ihevce_compute_cu_level_QP(
|
||||
ps_ctxt, ps_cu_analyse->i4_act_factor[i4_act_counter][1], -1, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
ihevce_compute_cu_level_QP(
|
||||
ps_ctxt,
|
||||
ps_cu_analyse->i4_act_factor[i4_act_counter][1],
|
||||
ps_cu_analyse->i4_act_factor[i4_act_counter_lamda][1],
|
||||
0);
|
||||
}
|
||||
|
||||
ps_cu_analyse->i1_cu_qp = ps_ctxt->i4_cu_qp;
|
||||
ihevce_update_cu_level_qp_lamda(ps_ctxt, ps_cu_analyse, luma_trans_size, 1);
|
||||
}
|
||||
|
||||
u1_compute_spatial_ssd = (ps_ctxt->i4_cu_qp <= MAX_QP_WHERE_SPATIAL_SSD_ENABLED) &&
|
||||
|
|
|
|||
|
|
@ -103,6 +103,12 @@ void ihevce_compute_cu_level_QP(
|
|||
WORD32 i4_activity_for_lamda,
|
||||
WORD32 i4_reduce_qp);
|
||||
|
||||
void ihevce_update_cu_level_qp_lamda(
|
||||
ihevce_enc_loop_ctxt_t *ps_ctxt,
|
||||
cu_analyse_t *ps_cu_analyse,
|
||||
WORD32 trans_size,
|
||||
WORD32 is_intra);
|
||||
|
||||
WORD32 ihevce_scan_coeffs(
|
||||
WORD16 *pi2_quant_coeffs,
|
||||
WORD32 *pi4_subBlock2csbfId_map,
|
||||
|
|
|
|||
|
|
@ -201,7 +201,6 @@ void ihevce_ipe_recompute_lambda_from_min_8x8_act_in_ctb(
|
|||
ihevce_ipe_ctxt_t *ps_ctxt, ihevce_ed_ctb_l1_t *ps_ed_ctb_l1)
|
||||
{
|
||||
WORD32 i4_cu_qp = 0;
|
||||
WORD32 i4_mod_factor_num;
|
||||
#if MODULATE_LAMDA_WHEN_SPATIAL_MOD_ON
|
||||
WORD32 i4_activity;
|
||||
#endif
|
||||
|
|
@ -209,19 +208,6 @@ void ihevce_ipe_recompute_lambda_from_min_8x8_act_in_ctb(
|
|||
WORD32 i4_curr_satd;
|
||||
long double ld_avg_satd;
|
||||
|
||||
#if MODULATE_LAMDA_WHEN_SPATIAL_MOD_ON
|
||||
WORD32 i4_mod_factor_denom = QP_MOD_FACTOR_DEN;
|
||||
#endif
|
||||
|
||||
if(ISLICE == ps_ctxt->i4_slice_type)
|
||||
{
|
||||
i4_mod_factor_num = INTRA_QP_MOD_FACTOR_NUM;
|
||||
}
|
||||
else
|
||||
{
|
||||
i4_mod_factor_num = INTER_QP_MOD_FACTOR_NUM;
|
||||
}
|
||||
|
||||
#if LAMDA_BASED_ON_QUANT
|
||||
i4_curr_satd = ps_ed_ctb_l1->i4_32x32_satd[0][2];
|
||||
i8_avg_satd = ps_ctxt->i8_curr_frame_32x32_avg_act[2];
|
||||
|
|
@ -956,13 +942,7 @@ void ihevce_ipe_process_row(
|
|||
|
||||
if(ps_ctxt->u1_use_lambda_derived_from_min_8x8_act_in_ctb)
|
||||
{
|
||||
/*HACK : MAMATHA, This function assumes that data is accumalated
|
||||
for all probable CU-TU combinations for INcomplete CTB, which is currently not the case,
|
||||
hence not recomputing lamda for the incomplete CTB */
|
||||
if((ps_ctb_node->u1_width == u1_ctb_size) && (ps_ctb_node->u1_height == u1_ctb_size))
|
||||
{
|
||||
ihevce_ipe_recompute_lambda_from_min_8x8_act_in_ctb(ps_ctxt, ps_ed_ctb_l1);
|
||||
}
|
||||
ihevce_ipe_recompute_lambda_from_min_8x8_act_in_ctb(ps_ctxt, ps_ed_ctb_l1);
|
||||
}
|
||||
|
||||
ihevce_ipe_process_ctb(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue