C++程序  |  230行  |  10.92 KB

/******************************************************************************
 *
 * 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_me_instr_set_router.h
*
* \brief
*    This file contains declarations related to me utilities used in encoder
*
* \date
*    15/07/2013
*
* \author
*    Ittiam
*
* List of Functions
*
*
******************************************************************************
*/

#ifndef __IHEVCE_ME_INSTR_SET_ROUTER_H_
#define __IHEVCE_ME_INSTR_SET_ROUTER_H_

/*****************************************************************************/
/* Typedefs                                                                  */
/*****************************************************************************/
typedef void FT_SAD_EVALUATOR(err_prms_t *);

typedef void FT_PART_SADS_EVALUATOR(
    grid_ctxt_t *, UWORD8 *, WORD32, WORD32 **, cand_t *, WORD32 *, CU_SIZE_T);

typedef void
    FT_PART_SADS_EVALUATOR_16X16CU(grid_ctxt_t *, UWORD8 *, WORD32, UWORD16 **, cand_t *, WORD32 *);

typedef void FT_CALC_SAD_AND_RESULT(
    hme_search_prms_t *, wgt_pred_ctxt_t *, err_prms_t *, result_upd_prms_t *, U08 **, S32);

typedef void FT_CALC_SAD_AND_RESULT_SUBPEL(err_prms_t *, result_upd_prms_t *);

typedef void FT_QPEL_INTERP_AVG(interp_prms_t *, S32, S32, S32);

typedef void FT_QPEL_INTERP_AVG_1PT(interp_prms_t *, S32, S32, S32, U08 **, S32 *);

typedef void FT_QPEL_INTERP_AVG_2PT(interp_prms_t *, S32, S32, U08 **, S32 *);

typedef void FT_GET_WT_INP(layer_ctxt_t *, wgt_pred_ctxt_t *, S32, S32, S32, S32, S32, U08);

typedef void
    FT_STORE_4X4_SADS(hme_search_prms_t *, layer_ctxt_t *, range_prms_t *, wgt_pred_ctxt_t *, S16 *);

typedef void FT_COMBINE_4X4_SADS_AND_COMPUTE_COST(
    S08,
    range_prms_t *,
    range_prms_t *,
    hme_mv_t *,
    hme_mv_t *,
    pred_ctxt_t *,
    PF_MV_COST_FXN,
    S16 *,
    S16 *,
    S16 *);

typedef void FT_MV_CLIPPER(hme_search_prms_t *, S32, S08, U08, U08, U08);

typedef void FT_COMPUTE_VARIANCE(U08 *, S32, S32 *, U32 *, S32, U08);

typedef void FT_COMPUTE_DISTORTION(
    U08 *, S32, S32 *, ULWORD64 *, ULWORD64 *, S32 *, S32, S32, S32, S32, S32, U08);

/*****************************************************************************/
/* Structure                                                                 */
/*****************************************************************************/

// clang-format off
typedef struct
{
    FT_SAD_EVALUATOR *pf_evalsad_pt_npu_mxn_8bit;
    FT_SAD_EVALUATOR *pf_evalsad_grid_npu_MxN;
    FT_SAD_EVALUATOR *pf_evalsad_pt_npu_8x4_8bit;
    FT_SAD_EVALUATOR *pf_evalsad_pt_npu_16x4_8bit;
    FT_SAD_EVALUATOR *pf_evalsad_pt_npu_16x12_8bit;
    FT_SAD_EVALUATOR *pf_evalsad_pt_npu_24x32_8bit;
    FT_SAD_EVALUATOR *pf_evalsad_pt_npu_12x16_8bit;
    FT_SAD_EVALUATOR *pf_evalsad_pt_npu_width_multiple_4_8bit;
    FT_SAD_EVALUATOR *pf_evalsad_pt_npu_width_multiple_8_8bit;
    FT_SAD_EVALUATOR *pf_evalsad_pt_npu_width_multiple_16_8bit;
    FT_PART_SADS_EVALUATOR_16X16CU *pf_compute_4x4_sads_for_16x16_blk;
    FT_PART_SADS_EVALUATOR *pf_evalsad_grid_pu_MxM;
    FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_1_best_result_generic;
    FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_1_best_result_generic;
    FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_1_best_result_num_part_eq_1;
    FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_1_best_result_num_square_parts;
    FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_1_best_result_num_part_lt_9;
    FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_1_best_result_num_part_lt_17;
    FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_1_best_result_num_part_eq_1;
    FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_1_best_result_num_part_1_for_grid;
    FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_1_best_result_num_square_parts;
    FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_1_best_result_num_part_lt_9;
    FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_1_best_result_num_part_lt_17;
    FT_CALC_SAD_AND_RESULT *pf_calc_pt_sad_and_1_best_result_explicit_generic;
    FT_CALC_SAD_AND_RESULT *pf_calc_pt_sad_and_1_best_result_explicit_8x8;
    FT_CALC_SAD_AND_RESULT *pf_calc_pt_sad_and_1_best_result_explicit_8x8_for_grid;
    FT_CALC_SAD_AND_RESULT *pf_calc_pt_sad_and_1_best_result_explicit_8x8_4x4;
    FT_CALC_SAD_AND_RESULT *pf_calc_pt_sad_and_2_best_results_explicit_generic;
    FT_CALC_SAD_AND_RESULT *pf_calc_pt_sad_and_2_best_results_explicit_8x8;
    FT_CALC_SAD_AND_RESULT *pf_calc_pt_sad_and_2_best_results_explicit_8x8_for_grid;
    FT_CALC_SAD_AND_RESULT *pf_calc_pt_sad_and_2_best_results_explicit_8x8_4x4;
    FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_1_best_result_subpel_generic;
    FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_1_best_result_subpel_num_part_eq_1;
    FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_1_best_result_subpel_square_parts;
    FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_1_best_result_subpel_num_part_lt_9;
    FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_1_best_result_subpel_num_part_lt_17;
    FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_2_best_results_generic;
    FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_2_best_results_generic;
    FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_2_best_results_num_part_eq_1;
    FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_2_best_results_num_square_parts;
    FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_2_best_results_num_part_lt_9;
    FT_CALC_SAD_AND_RESULT *pf_calc_stim_injected_sad_and_2_best_results_num_part_lt_17;
    FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_2_best_results_num_part_eq_1;
    FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_2_best_results_num_part_1_for_grid;
    FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_2_best_results_num_square_parts;
    FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_2_best_results_num_part_lt_9;
    FT_CALC_SAD_AND_RESULT *pf_calc_sad_and_2_best_results_num_part_lt_17;
    FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_2_best_results_subpel_generic;
    FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_2_best_results_subpel_num_part_eq_1;
    FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_2_best_results_subpel_square_parts;
    FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_2_best_results_subpel_num_part_lt_9;
    FT_CALC_SAD_AND_RESULT_SUBPEL *pf_calc_sad_and_2_best_results_subpel_num_part_lt_17;
    FT_QPEL_INTERP_AVG *pf_qpel_interp_avg_generic;
    FT_QPEL_INTERP_AVG_1PT *pf_qpel_interp_avg_1pt;
    FT_QPEL_INTERP_AVG_2PT *pf_qpel_interp_avg_2pt_vert_with_reuse;
    FT_QPEL_INTERP_AVG_2PT *pf_qpel_interp_avg_2pt_horz_with_reuse;
    FT_GET_WT_INP *pf_get_wt_inp_generic;
    FT_GET_WT_INP *pf_get_wt_inp_8x8;
    FT_GET_WT_INP *pf_get_wt_inp_ctb;
    FT_STORE_4X4_SADS *pf_store_4x4_sads_high_speed;
    FT_STORE_4X4_SADS *pf_store_4x4_sads_high_quality;
    FT_COMBINE_4X4_SADS_AND_COMPUTE_COST *pf_combine_4x4_sads_and_compute_cost_high_speed;
    FT_COMBINE_4X4_SADS_AND_COMPUTE_COST *pf_combine_4x4_sads_and_compute_cost_high_quality;
    FT_MV_CLIPPER *pf_mv_clipper;
    FT_COMPUTE_VARIANCE *pf_compute_variance_for_all_parts;
    FT_COMPUTE_DISTORTION *pf_compute_stim_injected_distortion_for_all_parts;
} ihevce_me_optimised_function_list_t;

/*****************************************************************************/
/* Extern Function Declarations                                              */
/*****************************************************************************/

void ihevce_me_instr_set_router(
    ihevce_me_optimised_function_list_t *ps_func_list, IV_ARCH_T e_arch);

PF_SAD_FXN_T hme_get_sad_fxn(
    BLK_SIZE_T e_blk_size, S32 i4_grid_mask, S32 i4_part_mask);

void ihevce_sifter_sad_fxn_assigner(
    FT_SAD_EVALUATOR **ppf_evalsad_pt_npu_mxn, IV_ARCH_T e_arch);

void hme_evalsad_grid_pu_MxM(err_prms_t *ps_prms);

FT_CALC_SAD_AND_RESULT *hme_get_calc_sad_and_result_fxn(S08 i1_grid_flag,
    U08 u1_is_cu_noisy, S32 i4_part_mask, S32 num_parts, S32 num_results);

/* Function List - C */
FT_SAD_EVALUATOR hme_evalsad_pt_npu_MxN_8bit;
FT_SAD_EVALUATOR hme_evalsad_grid_npu_MxN;
FT_PART_SADS_EVALUATOR compute_part_sads_for_MxM_blk;
FT_PART_SADS_EVALUATOR_16X16CU compute_4x4_sads_for_16x16_blk;
FT_CALC_SAD_AND_RESULT hme_calc_sad_and_1_best_result;
FT_CALC_SAD_AND_RESULT hme_calc_stim_injected_sad_and_1_best_result;
FT_CALC_SAD_AND_RESULT hme_calc_pt_sad_and_result_explicit;
FT_CALC_SAD_AND_RESULT_SUBPEL hme_calc_sad_and_1_best_result_subpel;
FT_CALC_SAD_AND_RESULT hme_calc_sad_and_2_best_results;
FT_CALC_SAD_AND_RESULT hme_calc_stim_injected_sad_and_2_best_results;
FT_CALC_SAD_AND_RESULT_SUBPEL hme_calc_sad_and_2_best_results_subpel;
FT_QPEL_INTERP_AVG hme_qpel_interp_avg;
FT_QPEL_INTERP_AVG_1PT hme_qpel_interp_avg_1pt;
FT_QPEL_INTERP_AVG_2PT hme_qpel_interp_avg_2pt_vert_with_reuse;
FT_QPEL_INTERP_AVG_2PT hme_qpel_interp_avg_2pt_horz_with_reuse;
FT_GET_WT_INP hme_get_wt_inp;
FT_STORE_4X4_SADS hme_store_4x4_sads_high_speed;
FT_STORE_4X4_SADS hme_store_4x4_sads_high_quality;
FT_COMBINE_4X4_SADS_AND_COMPUTE_COST hme_combine_4x4_sads_and_compute_cost_high_speed;
FT_COMBINE_4X4_SADS_AND_COMPUTE_COST hme_combine_4x4_sads_and_compute_cost_high_quality;
FT_MV_CLIPPER hme_mv_clipper;
FT_COMPUTE_VARIANCE hme_compute_variance_for_all_parts;
FT_COMPUTE_DISTORTION hme_compute_stim_injected_distortion_for_all_parts;


/* Function List - Neon */
#ifdef ENABLE_NEON
FT_SAD_EVALUATOR hme_evalsad_pt_npu_MxN_8bit_neon;
FT_SAD_EVALUATOR hme_evalsad_grid_npu_MxN_neon;
FT_PART_SADS_EVALUATOR compute_part_sads_for_MxM_blk_neon;
FT_PART_SADS_EVALUATOR_16X16CU compute_4x4_sads_for_16x16_blk_neon;
FT_CALC_SAD_AND_RESULT hme_calc_sad_and_1_best_result_neon;
FT_CALC_SAD_AND_RESULT_SUBPEL hme_calc_sad_and_1_best_result_subpel_neon;
FT_QPEL_INTERP_AVG hme_qpel_interp_avg_neon;
FT_QPEL_INTERP_AVG_1PT hme_qpel_interp_avg_1pt_neon;
FT_QPEL_INTERP_AVG_2PT hme_qpel_interp_avg_2pt_vert_with_reuse_neon;
FT_QPEL_INTERP_AVG_2PT hme_qpel_interp_avg_2pt_horz_with_reuse_neon;
FT_GET_WT_INP hme_get_wt_inp_8x8_neon;
FT_GET_WT_INP hme_get_wt_inp_ctb_neon;
FT_STORE_4X4_SADS hme_store_4x4_sads_high_speed_neon;
FT_STORE_4X4_SADS hme_store_4x4_sads_high_quality_neon;
FT_COMBINE_4X4_SADS_AND_COMPUTE_COST hme_combine_4x4_sads_and_compute_cost_high_speed_neon;
FT_COMBINE_4X4_SADS_AND_COMPUTE_COST hme_combine_4x4_sads_and_compute_cost_high_quality_neon;
#endif

// clang-format on

#endif