/******************************************************************************
*
* 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 */