1 /****************************************************************************** 2 * 3 * Copyright (C) 2018 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ***************************************************************************** 18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19 */ 20 /*! 21 ****************************************************************************** 22 * \file ihevce_enc_loop_inter_mode_sifter.h 23 * 24 * \brief 25 * 26 * \date 27 * 11/09/2014 28 * 29 * \author 30 * Ittiam 31 * 32 ****************************************************************************** 33 */ 34 #ifndef _IHEVCE_ENC_LOOP_INTER_MODE_SIFTER 35 #define _IHEVCE_ENC_LOOP_INTER_MODE_SIFTER 36 37 /*****************************************************************************/ 38 /* Function Macros */ 39 /*****************************************************************************/ 40 41 #define SKIP_MODE_COST ((DISABLE_SKIP) ? INT_MAX : 1) 42 43 #define COMPUTE_NUM_POSITIVE_REFERENCES_AND_FREE_IF_ZERO( \ 44 value_referred, pos_array, neg_array, length_pos_array, length_neg_array, usage_indicator) \ 45 { \ 46 UWORD8 i; \ 47 \ 48 UWORD8 num_references = 0; \ 49 \ 50 for(i = 0; i < length_pos_array; i++) \ 51 { \ 52 num_references += (value_referred == pos_array[i]); \ 53 } \ 54 \ 55 for(i = 0; i < length_neg_array; i++) \ 56 { \ 57 num_references -= (value_referred == neg_array[i]); \ 58 } \ 59 \ 60 if(num_references <= 0) \ 61 { \ 62 ihevce_set_pred_buf_as_free(usage_indicator, value_referred); \ 63 } \ 64 } 65 66 /*****************************************************************************/ 67 /* Enums */ 68 /*****************************************************************************/ 69 70 typedef enum 71 { 72 ME_OR_SKIP_DERIVED = 0, 73 MERGE_DERIVED = 1, 74 MIXED_MODE_TYPE0 = 2, 75 MIXED_MODE_TYPE1 = 3 76 77 } INTER_CANDIDATE_ID_T; 78 79 typedef enum 80 { 81 CLASS1, 82 CLASS2, 83 CLASS3 84 85 } UNIVERSE_CLASS_ID_T; 86 87 /*****************************************************************************/ 88 /* Structure */ 89 /*****************************************************************************/ 90 typedef struct 91 { 92 cu_inter_merge_skip_t *ps_cu_inter_merge_skip; 93 94 cu_mixed_mode_inter_t *ps_mixed_modes_datastore; 95 96 cu_inter_cand_t *ps_me_cands; 97 98 inter_cu_mode_info_t *ps_inter_cu_mode_info; 99 100 mv_pred_ctxt_t *ps_mv_pred_ctxt; 101 102 inter_pred_ctxt_t *ps_mc_ctxt; 103 104 WORD32 (*pai4_mv_cost)[NUM_INTER_PU_PARTS]; 105 106 WORD32 (*pai4_me_err_metric)[NUM_INTER_PU_PARTS]; 107 108 void *pv_src; 109 110 ihevce_inter_pred_buf_data_t *ps_pred_buf_data; 111 112 UWORD8 *pu1_ctb_nbr_map; 113 114 nbr_4x4_t *aps_cu_nbr_buf[2]; 115 116 nbr_4x4_t *ps_left_nbr_4x4; 117 118 nbr_4x4_t *ps_top_nbr_4x4; 119 120 nbr_4x4_t *ps_topleft_nbr_4x4; 121 122 cu_me_intra_pred_prms_t *ps_cu_me_intra_pred_prms; 123 124 PF_LUMA_INTER_PRED_PU pf_luma_inter_pred_pu; 125 126 WORD32 i4_ctb_nbr_map_stride; 127 128 WORD32 i4_src_strd; 129 130 WORD32 i4_nbr_4x4_left_strd; 131 132 WORD32 i4_max_num_inter_rdopt_cands; 133 134 WORD32 i4_lambda_qf; 135 136 UWORD8 u1_cu_size; 137 138 UWORD8 u1_cu_pos_x; 139 140 UWORD8 u1_cu_pos_y; 141 142 UWORD8 u1_num_me_cands; 143 144 UWORD8 u1_max_merge_candidates; 145 146 UWORD8 u1_use_satd_for_merge_eval; 147 148 UWORD8 u1_quality_preset; 149 150 WORD8 i1_slice_type; 151 152 UWORD8 u1_is_hbd; 153 154 UWORD8 u1_reuse_me_sad; 155 156 UWORD8 u1_merge_idx_cabac_model; 157 158 UWORD8 u1_use_merge_cand_from_top_row; 159 160 UWORD8 u1_is_cu_noisy; 161 162 WORD32 i4_alpha_stim_multiplier; 163 164 ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list; 165 166 FT_SAD_EVALUATOR *pf_evalsad_pt_npu_mxn_8bit; 167 168 } ihevce_inter_cand_sifter_prms_t; 169 170 typedef struct 171 { 172 UWORD8 au1_valid_merge_indices[MAX_NUM_MERGE_CAND]; 173 174 merge_cand_list_t *ps_list; 175 176 inter_pred_ctxt_t *ps_mc_ctxt; 177 178 mv_pred_ctxt_t *ps_mv_pred_ctxt; 179 180 PF_LUMA_INTER_PRED_PU pf_luma_inter_pred_pu; 181 182 PF_SAD_FXN_T pf_sad_fxn; 183 184 void **ppv_pred_buf_list; 185 186 UWORD8 *pu1_merge_pred_buf_array; 187 188 UWORD8 (*pau1_best_pred_buf_id)[MAX_NUM_INTER_PARTS]; 189 190 UWORD8 *pu1_is_top_used; 191 192 WORD32 (*pai4_noise_term)[MAX_NUM_INTER_PARTS]; 193 194 UWORD32 (*pau4_pred_variance)[MAX_NUM_INTER_PARTS]; 195 196 UWORD32 *pu4_src_variance; 197 198 WORD32 i4_alpha_stim_multiplier; 199 200 UWORD8 u1_merge_idx_cabac_model; 201 WORD32 i4_src_stride; 202 203 WORD32 i4_pred_stride; 204 205 WORD32 i4_lambda; 206 207 UWORD8 u1_max_cands; 208 209 UWORD8 u1_use_merge_cand_from_top_row; 210 211 UWORD8 u1_is_cu_noisy; 212 213 UWORD8 u1_is_hbd; 214 215 ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list; 216 217 } merge_prms_t; 218 219 /*****************************************************************************/ 220 /* Extern Function Declarations */ 221 /*****************************************************************************/ 222 223 void ihevce_inter_cand_sifter(ihevce_inter_cand_sifter_prms_t *ps_ctxt); 224 225 #endif /* _IHEVCE_ENC_LOOP_INTER_MODE_SIFTER */ 226