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:
Ram Mohan 2019-07-09 17:41:19 +05:30
parent 50408aad50
commit ceed88e597
4 changed files with 69 additions and 226 deletions

View file

@ -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;

View file

@ -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) &&

View file

@ -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,

View file

@ -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(