432 lines
14 KiB
C
432 lines
14 KiB
C
/******************************************************************************
|
|
*
|
|
* Copyright (C) 2018 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*****************************************************************************
|
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
|
*/
|
|
/*!
|
|
******************************************************************************
|
|
* \file ihevce_enc_loop_utils.h
|
|
*
|
|
* \brief
|
|
* This file contains interface defination of frame proceswsing pass
|
|
*
|
|
* \date
|
|
* 18/09/2012
|
|
*
|
|
* \author
|
|
* Ittiam
|
|
*
|
|
******************************************************************************
|
|
*/
|
|
|
|
#ifndef _IHEVCE_ENC_LOOP_UTILS_H_
|
|
#define _IHEVCE_ENC_LOOP_UTILS_H_
|
|
|
|
/*****************************************************************************/
|
|
/* Constant Macros */
|
|
/*****************************************************************************/
|
|
#define INTRA_ENC_DBG_L0 1 // Frame Level
|
|
#define INTRA_ENC_DBG_L1 1 // CTB Row Level
|
|
#define INTRA_ENC_DBG_L2 0 // CTB/CU Level
|
|
#define INTRA_ENC_DBG_L3 0 // PU/TU Level
|
|
#define INTRA_ENC_DBG_L4 0 // Pixel Level
|
|
/*****************************************************************************/
|
|
/* Function Macros */
|
|
/*****************************************************************************/
|
|
|
|
#define CABAC_FRAC_BITS_Q_SHIFT (1 << CABAC_FRAC_BITS_Q)
|
|
#define LAMDA_Q_SHIFT_FACT 20
|
|
|
|
#define QUANT_ROUND_FACTOR(out, r1, r0, lambda) \
|
|
{ \
|
|
LWORD64 temp3_m; \
|
|
LWORD64 temp; \
|
|
temp3_m = (((r1 - r0) * lambda)); \
|
|
temp = (CLIP3( \
|
|
((CABAC_FRAC_BITS_Q_SHIFT - \
|
|
((((LWORD64)(temp3_m) + ((LWORD64)CABAC_FRAC_BITS_Q_SHIFT << LAMDA_Q_SHIFT_FACT)) / \
|
|
2) >> \
|
|
LAMDA_Q_SHIFT_FACT))), \
|
|
0, \
|
|
(CABAC_FRAC_BITS_Q_SHIFT >> 1))); \
|
|
out = ((WORD32)(temp * (1 << QUANT_ROUND_FACTOR_Q))) >> CABAC_FRAC_BITS_Q; \
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* Typedefs */
|
|
/*****************************************************************************/
|
|
|
|
/*****************************************************************************/
|
|
/* Enums */
|
|
/*****************************************************************************/
|
|
|
|
/*****************************************************************************/
|
|
/* Structure */
|
|
/*****************************************************************************/
|
|
|
|
/*****************************************************************************/
|
|
/* Extern Variable Declarations */
|
|
/*****************************************************************************/
|
|
|
|
/*****************************************************************************/
|
|
/* Extern Function Declarations */
|
|
/*****************************************************************************/
|
|
|
|
void ihevce_get_cl_cu_lambda_prms(ihevce_enc_loop_ctxt_t *ps_ctxt, WORD32 i4_cur_cu_qp);
|
|
|
|
void ihevce_populate_cl_cu_lambda_prms(
|
|
ihevce_enc_loop_ctxt_t *ps_ctxt,
|
|
frm_lambda_ctxt_t *ps_frm_lamda,
|
|
WORD32 i4_slice_type,
|
|
WORD32 i4_temporal_lyr_id,
|
|
WORD32 i4_lambda_type);
|
|
|
|
void ihevce_compute_quant_rel_param(ihevce_enc_loop_ctxt_t *ps_ctxt, WORD8 i1_cu_qp);
|
|
|
|
void ihevce_compute_cu_level_QP(
|
|
ihevce_enc_loop_ctxt_t *ps_ctxt,
|
|
WORD32 i4_activity_for_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,
|
|
WORD32 scan_idx,
|
|
WORD32 trans_size,
|
|
UWORD8 *pu1_out_data,
|
|
UWORD8 *pu1_csbf_buf,
|
|
WORD32 i4_csbf_stride);
|
|
|
|
void ihevce_populate_intra_pred_mode(
|
|
WORD32 top_intra_mode,
|
|
WORD32 left_intra_mode,
|
|
WORD32 available_top,
|
|
WORD32 available_left,
|
|
WORD32 cu_pos_y,
|
|
WORD32 *ps_cand_mode_list);
|
|
|
|
void ihevce_intra_pred_mode_signaling(
|
|
WORD32 top_intra_mode,
|
|
WORD32 left_intra_mode,
|
|
WORD32 available_top,
|
|
WORD32 available_left,
|
|
WORD32 cu_pos_y,
|
|
WORD32 luma_intra_pred_mode_current,
|
|
intra_prev_rem_flags_t *ps_intra_pred_mode_current);
|
|
void ihevce_chroma_interleave_2d_copy(
|
|
UWORD8 *pu1_uv_src_bp,
|
|
WORD32 src_strd,
|
|
UWORD8 *pu1_uv_dst_bp,
|
|
WORD32 dst_strd,
|
|
WORD32 w,
|
|
WORD32 h,
|
|
CHROMA_PLANE_ID_T e_chroma_plane);
|
|
|
|
WORD32 ihevce_t_q_iq_ssd_scan_fxn(
|
|
ihevce_enc_loop_ctxt_t *ps_ctxt,
|
|
UWORD8 *pu1_pred,
|
|
WORD32 pred_strd,
|
|
UWORD8 *pu1_src,
|
|
WORD32 src_strd,
|
|
WORD16 *pi2_deq_data,
|
|
WORD32 deq_data_strd,
|
|
UWORD8 *pu1_recon,
|
|
WORD32 i4_recon_stride,
|
|
UWORD8 *pu1_ecd_data,
|
|
UWORD8 *pu1_csbf_buf,
|
|
WORD32 csbf_strd,
|
|
WORD32 trans_size,
|
|
WORD32 packed_pred_mode,
|
|
LWORD64 *pi8_cost,
|
|
WORD32 *pi4_coeff_off,
|
|
WORD32 *pi4_tu_bits,
|
|
UWORD32 *pu4_blk_sad,
|
|
WORD32 *pi4_zero_col,
|
|
WORD32 *pi4_zero_row,
|
|
UWORD8 *pu1_is_recon_available,
|
|
WORD32 i4_perform_rdoq,
|
|
WORD32 i4_perform_sbh,
|
|
#if USE_NOISE_TERM_IN_ZERO_CODING_DECISION_ALGORITHMS
|
|
WORD32 i4_alpha_stim_multiplier,
|
|
UWORD8 u1_is_cu_noisy,
|
|
#endif
|
|
SSD_TYPE_T e_ssd_type,
|
|
WORD32 early_cbf);
|
|
|
|
void ihevce_quant_rounding_factor_gen(
|
|
WORD32 i4_trans_size,
|
|
WORD32 is_luma,
|
|
rdopt_entropy_ctxt_t *ps_rdopt_entropy_ctxt,
|
|
WORD32 *pi4_quant_round_0_1,
|
|
WORD32 *pi4_quant_round_1_2,
|
|
double i4_lamda_modifier,
|
|
UWORD8 i4_is_tu_level_quant_rounding);
|
|
|
|
void ihevce_it_recon_fxn(
|
|
ihevce_enc_loop_ctxt_t *ps_ctxt,
|
|
WORD16 *pi2_deq_data,
|
|
WORD32 deq_dat_strd,
|
|
UWORD8 *pu1_pred,
|
|
WORD32 pred_strd,
|
|
UWORD8 *pu1_recon,
|
|
WORD32 recon_strd,
|
|
UWORD8 *pu1_ecd_data,
|
|
WORD32 trans_size,
|
|
WORD32 packed_pred_mode,
|
|
WORD32 cbf,
|
|
WORD32 zero_cols,
|
|
WORD32 zero_rows);
|
|
|
|
void ihevce_chroma_it_recon_fxn(
|
|
ihevce_enc_loop_ctxt_t *ps_ctxt,
|
|
WORD16 *pi2_deq_data,
|
|
WORD32 deq_dat_strd,
|
|
UWORD8 *pu1_pred,
|
|
WORD32 pred_strd,
|
|
UWORD8 *pu1_recon,
|
|
WORD32 recon_strd,
|
|
UWORD8 *pu1_ecd_data,
|
|
WORD32 trans_size,
|
|
WORD32 cbf,
|
|
WORD32 zero_cols,
|
|
WORD32 zero_rows,
|
|
CHROMA_PLANE_ID_T e_chroma_plane);
|
|
|
|
void ihevce_mpm_idx_based_filter_RDOPT_cand(
|
|
ihevce_enc_loop_ctxt_t *ps_ctxt,
|
|
cu_analyse_t *ps_cu_analyse,
|
|
nbr_4x4_t *ps_left_nbr_4x4,
|
|
nbr_4x4_t *ps_top_nbr_4x4,
|
|
UWORD8 *pu1_luma_mode,
|
|
UWORD8 *pu1_eval_mark);
|
|
|
|
LWORD64 ihevce_intra_rdopt_cu_ntu(
|
|
ihevce_enc_loop_ctxt_t *ps_ctxt,
|
|
enc_loop_cu_prms_t *ps_cu_prms,
|
|
void *pv_pred_org,
|
|
WORD32 pred_strd_org,
|
|
enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms,
|
|
UWORD8 *pu1_luma_mode,
|
|
cu_analyse_t *ps_cu_analyse,
|
|
void *pv_curr_src,
|
|
void *pv_cu_left,
|
|
void *pv_cu_top,
|
|
void *pv_cu_top_left,
|
|
nbr_4x4_t *ps_left_nbr_4x4,
|
|
nbr_4x4_t *ps_top_nbr_4x4,
|
|
WORD32 nbr_4x4_left_strd,
|
|
WORD32 cu_left_stride,
|
|
WORD32 curr_buf_idx,
|
|
WORD32 func_proc_mode,
|
|
WORD32 i4_alpha_stim_multiplier);
|
|
LWORD64 ihevce_inter_rdopt_cu_ntu(
|
|
ihevce_enc_loop_ctxt_t *ps_ctxt,
|
|
enc_loop_cu_prms_t *ps_cu_prms,
|
|
void *pv_src,
|
|
WORD32 cu_size,
|
|
WORD32 cu_pos_x,
|
|
WORD32 cu_pos_y,
|
|
WORD32 curr_buf_idx,
|
|
enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms,
|
|
cu_inter_cand_t *ps_inter_cand,
|
|
cu_analyse_t *ps_cu_analyse,
|
|
WORD32 i4_alpha_stim_multiplier);
|
|
|
|
LWORD64 ihevce_inter_tu_tree_selector_and_rdopt_cost_computer(
|
|
ihevce_enc_loop_ctxt_t *ps_ctxt,
|
|
enc_loop_cu_prms_t *ps_cu_prms,
|
|
void *pv_src,
|
|
WORD32 cu_size,
|
|
WORD32 cu_pos_x,
|
|
WORD32 cu_pos_y,
|
|
WORD32 curr_buf_idx,
|
|
enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms,
|
|
cu_inter_cand_t *ps_inter_cand,
|
|
cu_analyse_t *ps_cu_analyse,
|
|
WORD32 i4_alpha_stim_multiplier);
|
|
|
|
LWORD64 ihevce_inter_rdopt_cu_mc_mvp(
|
|
ihevce_enc_loop_ctxt_t *ps_ctxt,
|
|
cu_inter_cand_t *ps_inter_cand,
|
|
WORD32 cu_size,
|
|
WORD32 cu_pos_x,
|
|
WORD32 cu_pos_y,
|
|
nbr_4x4_t *ps_left_nbr_4x4,
|
|
nbr_4x4_t *ps_top_nbr_4x4,
|
|
nbr_4x4_t *ps_topleft_nbr_4x4,
|
|
WORD32 nbr_4x4_left_strd,
|
|
WORD32 curr_buf_idx);
|
|
void ihevce_intra_chroma_pred_mode_selector(
|
|
ihevce_enc_loop_ctxt_t *ps_ctxt,
|
|
enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms,
|
|
cu_analyse_t *ps_cu_analyse,
|
|
WORD32 rd_opt_curr_idx,
|
|
WORD32 tu_mode,
|
|
WORD32 i4_alpha_stim_multiplier,
|
|
UWORD8 u1_is_cu_noisy);
|
|
|
|
LWORD64 ihevce_chroma_cu_prcs_rdopt(
|
|
ihevce_enc_loop_ctxt_t *ps_ctxt,
|
|
WORD32 rd_opt_curr_idx,
|
|
WORD32 func_proc_mode,
|
|
UWORD8 *pu1_chrm_src,
|
|
WORD32 chrm_src_stride,
|
|
UWORD8 *pu1_cu_left,
|
|
UWORD8 *pu1_cu_top,
|
|
UWORD8 *pu1_cu_top_left,
|
|
WORD32 cu_left_stride,
|
|
WORD32 cu_pos_x,
|
|
WORD32 cu_pos_y,
|
|
WORD32 *pi4_chrm_tu_bits,
|
|
WORD32 i4_alpha_stim_multiplier,
|
|
UWORD8 u1_is_cu_noisy);
|
|
|
|
void ihevce_set_eval_flags(
|
|
ihevce_enc_loop_ctxt_t *ps_ctxt, enc_loop_cu_final_prms_t *ps_enc_loop_bestprms);
|
|
|
|
void ihevce_final_rdopt_mode_prcs(
|
|
ihevce_enc_loop_ctxt_t *ps_ctxt, final_mode_process_prms_t *ps_prms);
|
|
|
|
WORD32 ihevce_set_flags_to_regulate_reevaluation(
|
|
cu_final_recon_flags_t *ps_cu_recon_flags,
|
|
ihevce_enc_cu_node_ctxt_t *ps_enc_out_ctxt,
|
|
UWORD8 *pu1_deviant_cu_regions,
|
|
WORD32 i4_num_deviant_cus,
|
|
WORD8 i1_qp_past,
|
|
WORD8 i1_qp_present,
|
|
UWORD8 u1_is_422);
|
|
|
|
void ihevce_err_compute(
|
|
UWORD8 *pu1_inp,
|
|
UWORD8 *pu1_interp_out_buf,
|
|
WORD32 *pi4_sad_grid,
|
|
WORD32 *pi4_tu_split_flags,
|
|
WORD32 inp_stride,
|
|
WORD32 out_stride,
|
|
WORD32 blk_size,
|
|
WORD32 part_mask,
|
|
WORD32 use_satd_for_err_calc);
|
|
void ihevce_determine_children_cost_of_32x32_cu(
|
|
block_merge_input_t *ps_merge_in,
|
|
WORD32 *pi4_cost_children,
|
|
WORD32 idx_of_tl_child,
|
|
WORD32 cu_pos_x,
|
|
WORD32 cu_pos_y);
|
|
|
|
WORD32 ihevce_determine_children_cost_of_cu_from_me_results(
|
|
block_merge_input_t *ps_merge_in,
|
|
cur_ctb_cu_tree_t *ps_cu_tree_root,
|
|
WORD32 *pi4_ref_bits,
|
|
WORD32 *pi4_cost_children,
|
|
WORD32 idx_of_tl_child,
|
|
CU_SIZE_T e_cu_size_parent);
|
|
|
|
void *ihevce_tu_tree_update(
|
|
tu_prms_t *ps_tu_prms,
|
|
WORD32 *pnum_tu_in_cu,
|
|
WORD32 depth,
|
|
WORD32 tu_split_flag,
|
|
WORD32 tu_early_cbf,
|
|
WORD32 i4_x_off,
|
|
WORD32 i4_y_off);
|
|
WORD32 ihevce_shrink_inter_tu_tree(
|
|
tu_enc_loop_out_t *ps_tu_enc_loop,
|
|
tu_enc_loop_temp_prms_t *ps_tu_enc_loop_temp_prms,
|
|
recon_datastore_t *ps_recon_datastore,
|
|
WORD32 num_tu_in_cu,
|
|
UWORD8 u1_is_422);
|
|
UWORD8 ihevce_intra_mode_nxn_hash_updater(
|
|
UWORD8 *pu1_mode_array, UWORD8 *pu1_hash_table, UWORD8 u1_num_ipe_modes);
|
|
|
|
#if ENABLE_TU_TREE_DETERMINATION_IN_RDOPT
|
|
WORD32 ihevce_determine_tu_tree_distribution(
|
|
cu_inter_cand_t *ps_cu_data,
|
|
me_func_selector_t *ps_func_selector,
|
|
WORD16 *pi2_scratch_mem,
|
|
UWORD8 *pu1_inp,
|
|
WORD32 i4_inp_stride,
|
|
WORD32 i4_lambda,
|
|
UWORD8 u1_lambda_q_shift,
|
|
UWORD8 u1_cu_size,
|
|
UWORD8 u1_max_tr_depth);
|
|
#endif
|
|
|
|
void ihevce_populate_nbr_4x4_with_pu_data(
|
|
nbr_4x4_t *ps_nbr_4x4, pu_t *ps_pu, WORD32 i4_nbr_buf_stride);
|
|
|
|
void ihevce_call_luma_inter_pred_rdopt_pass1(
|
|
ihevce_enc_loop_ctxt_t *ps_ctxt, cu_inter_cand_t *ps_inter_cand, WORD32 cu_size);
|
|
|
|
LWORD64 ihevce_it_recon_ssd(
|
|
ihevce_enc_loop_ctxt_t *ps_ctxt,
|
|
UWORD8 *pu1_src,
|
|
WORD32 i4_src_strd,
|
|
UWORD8 *pu1_pred,
|
|
WORD32 i4_pred_strd,
|
|
WORD16 *pi2_deq_data,
|
|
WORD32 i4_deq_data_strd,
|
|
UWORD8 *pu1_recon,
|
|
WORD32 i4_recon_stride,
|
|
UWORD8 *pu1_ecd_data,
|
|
UWORD8 u1_trans_size,
|
|
UWORD8 u1_pred_mode,
|
|
WORD32 i4_cbf,
|
|
WORD32 i4_zero_col,
|
|
WORD32 i4_zero_row,
|
|
CHROMA_PLANE_ID_T e_chroma_plane);
|
|
|
|
WORD32 ihevce_chroma_t_q_iq_ssd_scan_fxn(
|
|
ihevce_enc_loop_ctxt_t *ps_ctxt,
|
|
UWORD8 *pu1_pred,
|
|
WORD32 pred_strd,
|
|
UWORD8 *pu1_src,
|
|
WORD32 src_strd,
|
|
WORD16 *pi2_deq_data,
|
|
WORD32 deq_data_strd,
|
|
UWORD8 *pu1_recon,
|
|
WORD32 i4_recon_stride,
|
|
UWORD8 *pu1_ecd_data,
|
|
UWORD8 *pu1_csbf_buf,
|
|
WORD32 csbf_strd,
|
|
WORD32 trans_size,
|
|
WORD32 i4_scan_idx,
|
|
WORD32 intra_flag,
|
|
WORD32 *pi4_coeff_off,
|
|
WORD32 *pi4_tu_bits,
|
|
WORD32 *pi4_zero_col,
|
|
WORD32 *pi4_zero_row,
|
|
UWORD8 *pu1_is_recon_available,
|
|
WORD32 i4_perform_sbh,
|
|
WORD32 i4_perform_rdoq,
|
|
LWORD64 *pi8_cost,
|
|
#if USE_NOISE_TERM_IN_ZERO_CODING_DECISION_ALGORITHMS
|
|
WORD32 i4_alpha_stim_multiplier,
|
|
UWORD8 u1_is_cu_noisy,
|
|
#endif
|
|
UWORD8 u1_is_skip,
|
|
SSD_TYPE_T e_ssd_type,
|
|
CHROMA_PLANE_ID_T e_chroma_plane);
|
|
void ihevce_update_pred_qp(ihevce_enc_loop_ctxt_t *ps_ctxt, WORD32 cu_pos_x, WORD32 cu_pos_y);
|
|
#endif /* _IHEVCE_ENC_LOOP_UTILS_H_ */
|