/****************************************************************************** * * 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_inter_mode_sifter.h * * \brief * * \date * 11/09/2014 * * \author * Ittiam * ****************************************************************************** */ #ifndef _IHEVCE_ENC_LOOP_INTER_MODE_SIFTER #define _IHEVCE_ENC_LOOP_INTER_MODE_SIFTER /*****************************************************************************/ /* Function Macros */ /*****************************************************************************/ #define SKIP_MODE_COST ((DISABLE_SKIP) ? INT_MAX : 1) #define COMPUTE_NUM_POSITIVE_REFERENCES_AND_FREE_IF_ZERO( \ value_referred, pos_array, neg_array, length_pos_array, length_neg_array, usage_indicator) \ { \ UWORD8 i; \ \ UWORD8 num_references = 0; \ \ for(i = 0; i < length_pos_array; i++) \ { \ num_references += (value_referred == pos_array[i]); \ } \ \ for(i = 0; i < length_neg_array; i++) \ { \ num_references -= (value_referred == neg_array[i]); \ } \ \ if(num_references <= 0) \ { \ ihevce_set_pred_buf_as_free(usage_indicator, value_referred); \ } \ } /*****************************************************************************/ /* Enums */ /*****************************************************************************/ typedef enum { ME_OR_SKIP_DERIVED = 0, MERGE_DERIVED = 1, MIXED_MODE_TYPE0 = 2, MIXED_MODE_TYPE1 = 3 } INTER_CANDIDATE_ID_T; typedef enum { CLASS1, CLASS2, CLASS3 } UNIVERSE_CLASS_ID_T; /*****************************************************************************/ /* Structure */ /*****************************************************************************/ typedef struct { cu_inter_merge_skip_t *ps_cu_inter_merge_skip; cu_mixed_mode_inter_t *ps_mixed_modes_datastore; cu_inter_cand_t *ps_me_cands; inter_cu_mode_info_t *ps_inter_cu_mode_info; mv_pred_ctxt_t *ps_mv_pred_ctxt; inter_pred_ctxt_t *ps_mc_ctxt; WORD32 (*pai4_mv_cost)[NUM_INTER_PU_PARTS]; WORD32 (*pai4_me_err_metric)[NUM_INTER_PU_PARTS]; void *pv_src; ihevce_inter_pred_buf_data_t *ps_pred_buf_data; UWORD8 *pu1_ctb_nbr_map; nbr_4x4_t *aps_cu_nbr_buf[2]; nbr_4x4_t *ps_left_nbr_4x4; nbr_4x4_t *ps_top_nbr_4x4; nbr_4x4_t *ps_topleft_nbr_4x4; cu_me_intra_pred_prms_t *ps_cu_me_intra_pred_prms; PF_LUMA_INTER_PRED_PU pf_luma_inter_pred_pu; WORD32 i4_ctb_nbr_map_stride; WORD32 i4_src_strd; WORD32 i4_nbr_4x4_left_strd; WORD32 i4_max_num_inter_rdopt_cands; WORD32 i4_lambda_qf; UWORD8 u1_cu_size; UWORD8 u1_cu_pos_x; UWORD8 u1_cu_pos_y; UWORD8 u1_num_me_cands; UWORD8 u1_max_merge_candidates; UWORD8 u1_use_satd_for_merge_eval; UWORD8 u1_quality_preset; WORD8 i1_slice_type; UWORD8 u1_is_hbd; UWORD8 u1_reuse_me_sad; UWORD8 u1_merge_idx_cabac_model; UWORD8 u1_use_merge_cand_from_top_row; UWORD8 u1_is_cu_noisy; WORD32 i4_alpha_stim_multiplier; ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list; FT_SAD_EVALUATOR *pf_evalsad_pt_npu_mxn_8bit; } ihevce_inter_cand_sifter_prms_t; typedef struct { UWORD8 au1_valid_merge_indices[MAX_NUM_MERGE_CAND]; merge_cand_list_t *ps_list; inter_pred_ctxt_t *ps_mc_ctxt; mv_pred_ctxt_t *ps_mv_pred_ctxt; PF_LUMA_INTER_PRED_PU pf_luma_inter_pred_pu; PF_SAD_FXN_T pf_sad_fxn; void **ppv_pred_buf_list; UWORD8 *pu1_merge_pred_buf_array; UWORD8 (*pau1_best_pred_buf_id)[MAX_NUM_INTER_PARTS]; UWORD8 *pu1_is_top_used; WORD32 (*pai4_noise_term)[MAX_NUM_INTER_PARTS]; UWORD32 (*pau4_pred_variance)[MAX_NUM_INTER_PARTS]; UWORD32 *pu4_src_variance; WORD32 i4_alpha_stim_multiplier; UWORD8 u1_merge_idx_cabac_model; WORD32 i4_src_stride; WORD32 i4_pred_stride; WORD32 i4_lambda; UWORD8 u1_max_cands; UWORD8 u1_use_merge_cand_from_top_row; UWORD8 u1_is_cu_noisy; UWORD8 u1_is_hbd; ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list; } merge_prms_t; /*****************************************************************************/ /* Extern Function Declarations */ /*****************************************************************************/ void ihevce_inter_cand_sifter(ihevce_inter_cand_sifter_prms_t *ps_ctxt); #endif /* _IHEVCE_ENC_LOOP_INTER_MODE_SIFTER */