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_me_instr_set_router.h 23 * 24 * \brief 25 * This file contains declarations related to me utilities used in encoder 26 * 27 * \date 28 * 15/07/2013 29 * 30 * \author 31 * Ittiam 32 * 33 * List of Functions 34 * 35 * 36 ****************************************************************************** 37 */ 38 39 #ifndef __IHEVCE_ME_INSTR_SET_ROUTER_H_ 40 #define __IHEVCE_ME_INSTR_SET_ROUTER_H_ 41 42 /*****************************************************************************/ 43 /* Typedefs */ 44 /*****************************************************************************/ 45 typedef void FT_SAD_EVALUATOR(err_prms_t *); 46 47 typedef void FT_PART_SADS_EVALUATOR( 48 grid_ctxt_t *, UWORD8 *, WORD32, WORD32 **, cand_t *, WORD32 *, CU_SIZE_T); 49 50 typedef void 51 FT_PART_SADS_EVALUATOR_16X16CU(grid_ctxt_t *, UWORD8 *, WORD32, UWORD16 **, cand_t *, WORD32 *); 52 53 typedef void FT_CALC_SAD_AND_RESULT( 54 hme_search_prms_t *, wgt_pred_ctxt_t *, err_prms_t *, result_upd_prms_t *, U08 **, S32); 55 56 typedef void FT_CALC_SAD_AND_RESULT_SUBPEL(err_prms_t *, result_upd_prms_t *); 57 58 typedef void FT_QPEL_INTERP_AVG(interp_prms_t *, S32, S32, S32); 59 60 typedef void FT_QPEL_INTERP_AVG_1PT(interp_prms_t *, S32, S32, S32, U08 **, S32 *); 61 62 typedef void FT_QPEL_INTERP_AVG_2PT(interp_prms_t *, S32, S32, U08 **, S32 *); 63 64 typedef void FT_GET_WT_INP(layer_ctxt_t *, wgt_pred_ctxt_t *, S32, S32, S32, S32, S32, U08); 65 66 typedef void 67 FT_STORE_4X4_SADS(hme_search_prms_t *, layer_ctxt_t *, range_prms_t *, wgt_pred_ctxt_t *, S16 *); 68 69 typedef void FT_COMBINE_4X4_SADS_AND_COMPUTE_COST( 70 S08, 71 range_prms_t *, 72 range_prms_t *, 73 hme_mv_t *, 74 hme_mv_t *, 75 pred_ctxt_t *, 76 PF_MV_COST_FXN, 77 S16 *, 78 S16 *, 79 S16 *); 80 81 typedef void FT_MV_CLIPPER(hme_search_prms_t *, S32, S08, U08, U08, U08); 82 83 typedef void FT_COMPUTE_VARIANCE(U08 *, S32, S32 *, U32 *, S32, U08); 84 85 typedef void FT_COMPUTE_DISTORTION( 86 U08 *, S32, S32 *, ULWORD64 *, ULWORD64 *, S32 *, S32, S32, S32, S32, S32, U08); 87 88 /*****************************************************************************/ 89 /* Structure */ 90 /*****************************************************************************/ 91 92 // clang-format off 93 typedef struct 94 { 95 FT_SAD_EVALUATOR *pf_evalsad_pt_npu_mxn_8bit; 96 FT_SAD_EVALUATOR *pf_evalsad_grid_npu_MxN; 97 FT_SAD_EVALUATOR *pf_evalsad_pt_npu_8x4_8bit; 98 FT_SAD_EVALUATOR *pf_evalsad_pt_npu_16x4_8bit; 99 FT_SAD_EVALUATOR *pf_evalsad_pt_npu_16x12_8bit; 100 FT_SAD_EVALUATOR *pf_evalsad_pt_npu_24x32_8bit; 101 FT_SAD_EVALUATOR *pf_evalsad_pt_npu_12x16_8bit; 102 FT_SAD_EVALUATOR *pf_evalsad_pt_npu_width_multiple_4_8bit; 103 FT_SAD_EVALUATOR *pf_evalsad_pt_npu_width_multiple_8_8bit; 104 FT_SAD_EVALUATOR *pf_evalsad_pt_npu_width_multiple_16_8bit; 105 FT_PART_SADS_EVALUATOR_16X16CU *pf_compute_4x4_sads_for_16x16_blk; 106 FT_PART_SADS_EVALUATOR *pf_evalsad_grid_pu_MxM; 107 FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_1_best_result_generic; 108 FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_1_best_result_generic; 109 FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_1_best_result_num_part_eq_1; 110 FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_1_best_result_num_square_parts; 111 FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_1_best_result_num_part_lt_9; 112 FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_1_best_result_num_part_lt_17; 113 FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_1_best_result_num_part_eq_1; 114 FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_1_best_result_num_part_1_for_grid; 115 FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_1_best_result_num_square_parts; 116 FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_1_best_result_num_part_lt_9; 117 FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_1_best_result_num_part_lt_17; 118 FT_CALC_SAD_AND_RESULT *pf_calc_pt_sad_and_1_best_result_explicit_generic; 119 FT_CALC_SAD_AND_RESULT *pf_calc_pt_sad_and_1_best_result_explicit_8x8; 120 FT_CALC_SAD_AND_RESULT *pf_calc_pt_sad_and_1_best_result_explicit_8x8_for_grid; 121 FT_CALC_SAD_AND_RESULT *pf_calc_pt_sad_and_1_best_result_explicit_8x8_4x4; 122 FT_CALC_SAD_AND_RESULT *pf_calc_pt_sad_and_2_best_results_explicit_generic; 123 FT_CALC_SAD_AND_RESULT *pf_calc_pt_sad_and_2_best_results_explicit_8x8; 124 FT_CALC_SAD_AND_RESULT *pf_calc_pt_sad_and_2_best_results_explicit_8x8_for_grid; 125 FT_CALC_SAD_AND_RESULT *pf_calc_pt_sad_and_2_best_results_explicit_8x8_4x4; 126 FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_1_best_result_subpel_generic; 127 FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_1_best_result_subpel_num_part_eq_1; 128 FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_1_best_result_subpel_square_parts; 129 FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_1_best_result_subpel_num_part_lt_9; 130 FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_1_best_result_subpel_num_part_lt_17; 131 FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_2_best_results_generic; 132 FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_2_best_results_generic; 133 FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_2_best_results_num_part_eq_1; 134 FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_2_best_results_num_square_parts; 135 FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_2_best_results_num_part_lt_9; 136 FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_2_best_results_num_part_lt_17; 137 FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_2_best_results_num_part_eq_1; 138 FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_2_best_results_num_part_1_for_grid; 139 FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_2_best_results_num_square_parts; 140 FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_2_best_results_num_part_lt_9; 141 FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_2_best_results_num_part_lt_17; 142 FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_2_best_results_subpel_generic; 143 FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_2_best_results_subpel_num_part_eq_1; 144 FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_2_best_results_subpel_square_parts; 145 FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_2_best_results_subpel_num_part_lt_9; 146 FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_2_best_results_subpel_num_part_lt_17; 147 FT_QPEL_INTERP_AVG *pf_qpel_interp_avg_generic; 148 FT_QPEL_INTERP_AVG_1PT *pf_qpel_interp_avg_1pt; 149 FT_QPEL_INTERP_AVG_2PT *pf_qpel_interp_avg_2pt_vert_with_reuse; 150 FT_QPEL_INTERP_AVG_2PT *pf_qpel_interp_avg_2pt_horz_with_reuse; 151 FT_GET_WT_INP *pf_get_wt_inp_generic; 152 FT_GET_WT_INP *pf_get_wt_inp_8x8; 153 FT_GET_WT_INP *pf_get_wt_inp_ctb; 154 FT_STORE_4X4_SADS *pf_store_4x4_sads_high_speed; 155 FT_STORE_4X4_SADS *pf_store_4x4_sads_high_quality; 156 FT_COMBINE_4X4_SADS_AND_COMPUTE_COST *pf_combine_4x4_sads_and_compute_cost_high_speed; 157 FT_COMBINE_4X4_SADS_AND_COMPUTE_COST *pf_combine_4x4_sads_and_compute_cost_high_quality; 158 FT_MV_CLIPPER *pf_mv_clipper; 159 FT_COMPUTE_VARIANCE *pf_compute_variance_for_all_parts; 160 FT_COMPUTE_DISTORTION *pf_compute_stim_injected_distortion_for_all_parts; 161 } ihevce_me_optimised_function_list_t; 162 163 /*****************************************************************************/ 164 /* Extern Function Declarations */ 165 /*****************************************************************************/ 166 167 void ihevce_me_instr_set_router( 168 ihevce_me_optimised_function_list_t *ps_func_list, IV_ARCH_T e_arch); 169 170 PF_SAD_FXN_T hme_get_sad_fxn( 171 BLK_SIZE_T e_blk_size, S32 i4_grid_mask, S32 i4_part_mask); 172 173 void ihevce_sifter_sad_fxn_assigner( 174 FT_SAD_EVALUATOR **ppf_evalsad_pt_npu_mxn, IV_ARCH_T e_arch); 175 176 void hme_evalsad_grid_pu_MxM(err_prms_t *ps_prms); 177 178 FT_CALC_SAD_AND_RESULT *hme_get_calc_sad_and_result_fxn(S08 i1_grid_flag, 179 U08 u1_is_cu_noisy, S32 i4_part_mask, S32 num_parts, S32 num_results); 180 181 /* Function List - C */ 182 FT_SAD_EVALUATOR hme_evalsad_pt_npu_MxN_8bit; 183 FT_SAD_EVALUATOR hme_evalsad_grid_npu_MxN; 184 FT_PART_SADS_EVALUATOR compute_part_sads_for_MxM_blk; 185 FT_PART_SADS_EVALUATOR_16X16CU compute_4x4_sads_for_16x16_blk; 186 FT_CALC_SAD_AND_RESULT hme_calc_sad_and_1_best_result; 187 FT_CALC_SAD_AND_RESULT hme_calc_stim_injected_sad_and_1_best_result; 188 FT_CALC_SAD_AND_RESULT hme_calc_pt_sad_and_result_explicit; 189 FT_CALC_SAD_AND_RESULT_SUBPEL hme_calc_sad_and_1_best_result_subpel; 190 FT_CALC_SAD_AND_RESULT hme_calc_sad_and_2_best_results; 191 FT_CALC_SAD_AND_RESULT hme_calc_stim_injected_sad_and_2_best_results; 192 FT_CALC_SAD_AND_RESULT_SUBPEL hme_calc_sad_and_2_best_results_subpel; 193 FT_QPEL_INTERP_AVG hme_qpel_interp_avg; 194 FT_QPEL_INTERP_AVG_1PT hme_qpel_interp_avg_1pt; 195 FT_QPEL_INTERP_AVG_2PT hme_qpel_interp_avg_2pt_vert_with_reuse; 196 FT_QPEL_INTERP_AVG_2PT hme_qpel_interp_avg_2pt_horz_with_reuse; 197 FT_GET_WT_INP hme_get_wt_inp; 198 FT_STORE_4X4_SADS hme_store_4x4_sads_high_speed; 199 FT_STORE_4X4_SADS hme_store_4x4_sads_high_quality; 200 FT_COMBINE_4X4_SADS_AND_COMPUTE_COST hme_combine_4x4_sads_and_compute_cost_high_speed; 201 FT_COMBINE_4X4_SADS_AND_COMPUTE_COST hme_combine_4x4_sads_and_compute_cost_high_quality; 202 FT_MV_CLIPPER hme_mv_clipper; 203 FT_COMPUTE_VARIANCE hme_compute_variance_for_all_parts; 204 FT_COMPUTE_DISTORTION hme_compute_stim_injected_distortion_for_all_parts; 205 206 207 /* Function List - Neon */ 208 #ifdef ENABLE_NEON 209 FT_SAD_EVALUATOR hme_evalsad_pt_npu_MxN_8bit_neon; 210 FT_SAD_EVALUATOR hme_evalsad_grid_npu_MxN_neon; 211 FT_PART_SADS_EVALUATOR compute_part_sads_for_MxM_blk_neon; 212 FT_PART_SADS_EVALUATOR_16X16CU compute_4x4_sads_for_16x16_blk_neon; 213 FT_CALC_SAD_AND_RESULT hme_calc_sad_and_1_best_result_neon; 214 FT_CALC_SAD_AND_RESULT_SUBPEL hme_calc_sad_and_1_best_result_subpel_neon; 215 FT_QPEL_INTERP_AVG hme_qpel_interp_avg_neon; 216 FT_QPEL_INTERP_AVG_1PT hme_qpel_interp_avg_1pt_neon; 217 FT_QPEL_INTERP_AVG_2PT hme_qpel_interp_avg_2pt_vert_with_reuse_neon; 218 FT_QPEL_INTERP_AVG_2PT hme_qpel_interp_avg_2pt_horz_with_reuse_neon; 219 FT_GET_WT_INP hme_get_wt_inp_8x8_neon; 220 FT_GET_WT_INP hme_get_wt_inp_ctb_neon; 221 FT_STORE_4X4_SADS hme_store_4x4_sads_high_speed_neon; 222 FT_STORE_4X4_SADS hme_store_4x4_sads_high_quality_neon; 223 FT_COMBINE_4X4_SADS_AND_COMPUTE_COST hme_combine_4x4_sads_and_compute_cost_high_speed_neon; 224 FT_COMBINE_4X4_SADS_AND_COMPUTE_COST hme_combine_4x4_sads_and_compute_cost_high_quality_neon; 225 #endif 226 227 // clang-format on 228 229 #endif 230