You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

776 lines
29 KiB

/******************************************************************************
*
* 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_common_defs.h
*
* @brief
* This file contains structures and interface prototypes for header encoding
*
* @author
* Ittiam
******************************************************************************
*/
#ifndef _IHEVCE_ME_COMMON_DEFS_H_
#define _IHEVCE_ME_COMMON_DEFS_H_
/****************************************************************************/
/* Constant Macros */
/****************************************************************************/
/**
*******************************************************************************
@brief We basically store an impossible and unique MV to identify intra blks
or CUs
*******************************************************************************
*/
#define INTRA_MV 0x4000
/**
*******************************************************************************
@brief MAX INT VAL is defined as follows so that adding the four candidates,
still will be a positive value
*******************************************************************************
*/
#define MAX_INT_VAL (0x7FFFFFF)
/**
*******************************************************************************
@brief Max number of results stored in search result str (per partition) during
refinement search. Needed for memory allocation purposes
*******************************************************************************
*/
#define MAX_REFINE_RESULTS 4
/**
*******************************************************************************
@brief Maximum number of partitions in a CU (NxN case)
*******************************************************************************
*/
#define MAX_NUM_PARTS 4
/** As min CU size is 8, there can only be two partitions in a CU */
#define MAX_NUM_INTER_PARTS 2
/* 4 for the num of REF and 2 for num_results_per_part */
#define MAX_NUM_RESULTS_PER_PART_LIST 8
#define MAX_NUM_RESULTS_PER_PART 2
#define MAX_NUM_REF 12
#define NUM_BEST_ME_OUTPUTS 4
#define MAX_NUM_CLUSTERS_IN_ONE_REF_IDX 5
/* Assumption is (MAX_NUM_CANDS_BESTUNI >= MAX_NUM_CANDS_BESTALT) */
#define MAX_NUM_CANDS_BESTUNI 10
#define MAX_NUM_CANDS_BESTALT 10
#define MAX_NUM_MERGE_CANDTS 4 * (3 * MAX_NUM_CLUSTERS_IN_ONE_REF_IDX + 2 * MAX_NUM_CANDS_BESTUNI)
#define MAX_NUM_CLUSTERS_16x16 8
#define MAX_NUM_CLUSTERS_32x32 10
#define MAX_NUM_CLUSTERS_64x64 10
#define MAX_DISTANCE_FROM_CENTROID_16x16 4
#define MAX_DISTANCE_FROM_CENTROID_32x32 8
#define MAX_DISTANCE_FROM_CENTROID_64x64 16
#define MAX_DISTANCE_FROM_CENTROID_16x16_B 4
#define MAX_DISTANCE_FROM_CENTROID_32x32_B 8
#define MAX_DISTANCE_FROM_CENTROID_64x64_B 16
#define MAX_NUM_CLUSTERS_IN_VALID_16x16_BLK 3
#define MAX_NUM_CLUSTERS_IN_VALID_32x32_BLK 5
#define MAX_NUM_CLUSTERS_IN_VALID_64x64_BLK 5
#define ALL_INTER_COST_DIFF_THR 10
#define MAX_INTRA_PERCENTAGE 25
#define CLUSTER_DATA_DUMP 0
#define DISABLE_INTER_CANDIDATES 0
#define ENABLE_4CTB_EVALUATION 1
#define USE_2N_NBR 1
#define USE_CLUSTER_DATA_AS_BLK_MERGE_CANDTS 0
#define MAX_REFS_SEARCHABLE MAX_NUM_REF
#define DEBUG_TRACE_ENABLE 0
#define DISABLE_INTRA_IN_BPICS 1
#define DISABLE_L0_IPE_INTRA_IN_BPICS 1
#define DISABLE_L2_IPE_INTRA_IN_BPICS 0
#define DISABLE_L2_IPE_INTRA_IN_IPBPICS 0
#define DISABLE_L1_L2_IPE_INTRA_IN_BPICS 1
#define RC_DEPENDENCY_FOR_BPIC 1
#define DISABLE_L1_L2_IPE_INTRA_IN_IPBPICS 0
#define DISABLE_L2_IPE_IN_IPB_L1_IN_B 0
#define DISABLE_L2_IPE_IN_PB_L1_IN_B 1
#define DISBLE_CHILD_CU_EVAL_L0_IPE 0
#define FORCE_NXN_MODE_BASED_ON_OL_IPE 0
#define TEMPORAL_LAYER_DISABLE 0
#define COARSE_ME_OPT 1
#define NUM_RESULTS_TO_EXPORT_MS 3
#define NUM_RESULTS_TO_EXPORT_HS NUM_BEST_ME_OUTPUTS
#define NUM_RESULTS_TO_EXPORT_XS 2
#define DISABLE_MERGE 0
#define INTERP_OUT_BUF_SIZE (64 * 64)
/* NUM_BEST_ME_OUTPUTS - Maximum possible TU Recursion candidates */
/* 2 - Required for Hadamard Transform coefficients */
/* 2 - Required in 'hme_compute_pred_and_evaluate_bi' */
/* 5 of these are also used in 'hme_subpel_refine_cu_hs' */
#define MAX_NUM_PRED_BUFS_USED_FOR_PARTTYPE_DECISIONS (NUM_BEST_ME_OUTPUTS) + 2 + 2
#define MAX_WKG_MEM_SIZE_PER_THREAD \
(MAX_NUM_PRED_BUFS_USED_FOR_PARTTYPE_DECISIONS) * (INTERP_OUT_BUF_SIZE)
/**
******************************************************************************
* @macro OLD_XTREME_SPEED
* @brief Reverts the changes back to older Xtreme speed model
******************************************************************************
*/
#define OLD_XTREME_SPEED 0
#define OLD_HIGH_SPEED 0
/**
******************************************************************************
* @macro BIT_EN
* @brief Enables the bit at a given bit position
******************************************************************************
*/
#define BIT_EN(x) (1 << (x))
/**
******************************************************************************
* @macros ENABLE_mxn
* @brief Enables a type or a group of partitions. ENABLE_ALL_PARTS, enables all
* partitions, while others enable selected partitions. These can be used
* to set the mask of active partitions
******************************************************************************
*/
#define ENABLE_2Nx2N (BIT_EN(PART_ID_2Nx2N))
#define ENABLE_2NxN (BIT_EN(PART_ID_2NxN_T) | BIT_EN(PART_ID_2NxN_B))
#define ENABLE_Nx2N (BIT_EN(PART_ID_Nx2N_L) | BIT_EN(PART_ID_Nx2N_R))
#define ENABLE_NxN \
(BIT_EN(PART_ID_NxN_TL) | BIT_EN(PART_ID_NxN_TR) | BIT_EN(PART_ID_NxN_BL) | \
BIT_EN(PART_ID_NxN_BR))
#define ENABLE_2NxnU (BIT_EN(PART_ID_2NxnU_T) | BIT_EN(PART_ID_2NxnU_B))
#define ENABLE_2NxnD (BIT_EN(PART_ID_2NxnD_T) | BIT_EN(PART_ID_2NxnD_B))
#define ENABLE_nLx2N (BIT_EN(PART_ID_nLx2N_L) | BIT_EN(PART_ID_nLx2N_R))
#define ENABLE_nRx2N (BIT_EN(PART_ID_nRx2N_L) | BIT_EN(PART_ID_nRx2N_R))
#define ENABLE_AMP ((ENABLE_2NxnU) | (ENABLE_2NxnD) | (ENABLE_nLx2N) | (ENABLE_nRx2N))
#define ENABLE_ALL_PARTS \
((ENABLE_2Nx2N) | (ENABLE_NxN) | (ENABLE_2NxN) | (ENABLE_Nx2N) | (ENABLE_AMP))
#define DISABLE_THE_CHILDREN_NODES(ps_parent_node) \
{ \
(ps_parent_node)->ps_child_node_tl->is_node_valid = 0; \
(ps_parent_node)->ps_child_node_tr->is_node_valid = 0; \
(ps_parent_node)->ps_child_node_bl->is_node_valid = 0; \
(ps_parent_node)->ps_child_node_br->is_node_valid = 0; \
}
#define NULLIFY_THE_CHILDREN_NODES(ps_parent_node) \
{ \
(ps_parent_node)->ps_child_node_tl = NULL; \
(ps_parent_node)->ps_child_node_tr = NULL; \
(ps_parent_node)->ps_child_node_bl = NULL; \
(ps_parent_node)->ps_child_node_br = NULL; \
}
#define DISABLE_ALL_KIN_OF_64x64_NODE(ps_tree_root) \
{ \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tl); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tr); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_bl); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_br); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tl->ps_child_node_tl); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tl->ps_child_node_tr); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tl->ps_child_node_bl); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tl->ps_child_node_br); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tr->ps_child_node_tl); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tr->ps_child_node_tr); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tr->ps_child_node_bl); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tr->ps_child_node_br); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_bl->ps_child_node_tl); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_bl->ps_child_node_tr); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_bl->ps_child_node_bl); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_bl->ps_child_node_br); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_br->ps_child_node_tl); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_br->ps_child_node_tr); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_br->ps_child_node_bl); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_br->ps_child_node_br); \
}
#define DISABLE_ALL_KIN_OF_32x32_NODE(ps_tree_root) \
{ \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tl); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tr); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_bl); \
DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_br); \
}
#define ENABLE_THE_CHILDREN_NODES(ps_parent_node) \
{ \
(ps_parent_node)->ps_child_node_tl->is_node_valid = 1; \
(ps_parent_node)->ps_child_node_tr->is_node_valid = 1; \
(ps_parent_node)->ps_child_node_bl->is_node_valid = 1; \
(ps_parent_node)->ps_child_node_br->is_node_valid = 1; \
}
#define CLIP_MV_WITHIN_RANGE( \
x, y, range, fpel_refine_extent, hpel_refine_extent, qpel_refine_extent) \
{ \
WORD16 i4_range_erosion_metric; \
\
i4_range_erosion_metric = \
((fpel_refine_extent) << 2) + ((hpel_refine_extent) << 1) + (qpel_refine_extent); \
i4_range_erosion_metric += 2; \
i4_range_erosion_metric >>= 2; \
\
if((x) > ((range)->i2_max_x - i4_range_erosion_metric)) \
(x) = ((range)->i2_max_x - i4_range_erosion_metric); \
if((x) < ((range)->i2_min_x + i4_range_erosion_metric)) \
(x) = ((range)->i2_min_x + i4_range_erosion_metric); \
if((y) > ((range)->i2_max_y - i4_range_erosion_metric)) \
(y) = ((range)->i2_max_y - i4_range_erosion_metric); \
if((y) < ((range)->i2_min_y + i4_range_erosion_metric)) \
(y) = ((range)->i2_min_y + i4_range_erosion_metric); \
}
/****************************************************************************/
/* Enumerations */
/****************************************************************************/
/**
******************************************************************************
* @enum CU_SIZE_T
* @brief Enumerates all possible CU sizes (8x8 to 64x64)
******************************************************************************
*/
typedef enum
{
CU_INVALID = -1,
CU_8x8 = 0,
CU_16x16,
CU_32x32,
CU_64x64,
NUM_CU_SIZES
} CU_SIZE_T;
/**
******************************************************************************
* @enum PART_TYPE_T
* @brief Defines all possible partition splits within a inter CU
******************************************************************************
*/
typedef enum
{
PRT_INVALID = -1,
PRT_2Nx2N = 0,
PRT_2NxN,
PRT_Nx2N,
PRT_NxN,
PRT_2NxnU,
PRT_2NxnD,
PRT_nLx2N,
PRT_nRx2N,
MAX_PART_TYPES
} PART_TYPE_T;
/**
******************************************************************************
* @enum PART_ID_T
* @brief Defines all possible partition ids within a inter CU
******************************************************************************
*/
typedef enum
{
PART_ID_INVALID = -1,
PART_ID_2Nx2N = 0,
/* These 2 belong to 2NxN Part */
PART_ID_2NxN_T = 1,
PART_ID_2NxN_B = 2,
/* These 2 belong to Nx2N */
PART_ID_Nx2N_L = 3,
PART_ID_Nx2N_R = 4,
/* 4 partitions of NxN */
PART_ID_NxN_TL = 5,
PART_ID_NxN_TR = 6,
PART_ID_NxN_BL = 7,
PART_ID_NxN_BR = 8,
/*************************************************************************/
/* ________ */
/* |________|-->2NxnU_T */
/* | | */
/* | |-->2NxnU_B */
/* |________| */
/*************************************************************************/
PART_ID_2NxnU_T = 9,
PART_ID_2NxnU_B = 10,
/*************************************************************************/
/* ________ */
/* | | */
/* | |-->2NxnD_T */
/* |________| */
/* |________|-->2NxnD_B */
/*************************************************************************/
PART_ID_2NxnD_T = 11,
PART_ID_2NxnD_B = 12,
/*************************************************************************/
/* ________ */
/* | | | */
/* | | |-->nLx2N_R */
/* | | | */
/* |_|______| */
/* | */
/* v */
/* nLx2N_L */
/*************************************************************************/
PART_ID_nLx2N_L = 13,
PART_ID_nLx2N_R = 14,
/*************************************************************************/
/* ________ */
/* | | | */
/* | | |-->nRx2N_R */
/* | | | */
/* |______|_| */
/* | */
/* v */
/* nRx2N_L */
/*************************************************************************/
/* AMP 12x16 and 4x16 split */
PART_ID_nRx2N_L = 15,
PART_ID_nRx2N_R = 16,
TOT_NUM_PARTS = 17
} PART_ID_T;
/**
******************************************************************************
* @enum CU_POS_T
* @brief Position of a block wrt its parent in the CU tree
******************************************************************************
*/
typedef enum
{
POS_NA = -1,
POS_TL = 0,
POS_TR = 1,
POS_BL = 2,
POS_BR = 3
} CU_POS_T;
typedef CU_POS_T TU_POS_T;
/****************************************************************************/
/* Structures */
/****************************************************************************/
/**
******************************************************************************
* @struct range_prms_t
* @brief Indicates valid range of MV for a given blk/cu/ctb
******************************************************************************
*/
typedef struct
{
/** Min x value possible, precision inferred from context */
WORD16 i2_min_x;
/** Max x value possible, precision inferred from context */
WORD16 i2_max_x;
/** Min y value possible, precision inferred from context */
WORD16 i2_min_y;
/** Max y value possible, precision inferred from context */
WORD16 i2_max_y;
} range_prms_t;
/**
******************************************************************************
* MACRO for enabling Dynamical Vertical Search Range Support
* Note : Should be always 1, else part is not supported
******************************************************************************
*/
#define DVSR_CHANGES 1
/**
******************************************************************************
* @struct dyn_range_prms_t
* @brief Indicates Dynamic search range for a given blk/cu/ctb
******************************************************************************
*/
typedef struct
{
/** Min x value possible */
//WORD16 i2_dyn_min_x;
/** Max x value possible */
//WORD16 i2_dyn_max_x;
/** Min y value possible */
WORD16 i2_dyn_min_y;
/** Max y value possible */
WORD16 i2_dyn_max_y;
/** Pic order count */
WORD32 i4_poc;
} dyn_range_prms_t;
/**
******************************************************************************
* @macro INIT_DYN_SEARCH_PRMS
* @brief Initializes this dyn_range_prms_t structure. Can be used to zero
* out the range
******************************************************************************
*/
#define INIT_DYN_SEARCH_PRMS(x, ref_poc) \
{ \
(x)->i2_dyn_min_y = 0; \
(x)->i2_dyn_max_y = 0; \
(x)->i4_poc = ref_poc; \
}
typedef struct
{
WORD16 mvx;
WORD16 mvy;
/* 0=>mv is not a part of bi-pred mv */
/* 1=>inverse of case 0 */
UWORD8 is_uni;
WORD16 pixel_count;
WORD32 sdi;
} mv_data_t;
/**
******************************************************************************
* @brief This struct is stores the search result for a prediction unit (PU)
******************************************************************************
*/
typedef struct
{
/**
* PU attributes likes mvs, refids, pred mode, wdt, heigt, ctbx/y offsets etc
*/
pu_t pu;
/* mv cost for this pu */
WORD32 i4_mv_cost;
/* total cost for this pu */
WORD32 i4_tot_cost;
WORD32 i4_sdi;
} pu_result_t;
/**
******************************************************************************
* @brief This struct is stores the search result for partition type of CU
******************************************************************************
*/
typedef struct
{
/** part results for a part type */
pu_result_t as_pu_results[MAX_NUM_INTER_PARTS];
UWORD8 *pu1_pred;
WORD32 i4_pred_stride;
/* total cost for part type */
WORD32 i4_tot_cost;
/* TU split flag : tu_split_flag[0] represents the transform splits
* for CU size <= 32, for 64x64 each ai4_tu_split_flag corresponds
* to respective 32x32 */
/* For a 8x8 TU - 1 bit used to indicate split */
/* For a 16x16 TU - LSB used to indicate winner between 16 and 8 TU's. 4 other bits used to indicate split in each 8x8 quadrant */
/* For a 32x32 TU - See above */
WORD32 ai4_tu_split_flag[4];
/* TU early cbf : tu_early_cbf[0] represents the transform splits
* for CU size <= 32, for 64x64 each ai4_tu_early_cbf corresponds
* to respective 32x32 */
WORD32 ai4_tu_early_cbf[4];
/* Populate the tu_split flag cost for the candidates */
WORD32 i4_tu_split_cost;
/** partition type : shall be one of PART_TYPE_T */
UWORD8 u1_part_type;
} part_type_results_t;
/**
******************************************************************************
* @struct part_results_t
* @brief Basic structure used for storage of search results, specification
* of init candidates for search etc. This structure is complete for
* specification of mv and cost for a given direction of search (L0/L1) but
* does not carry information of what type of partition it represents.
******************************************************************************
*/
typedef struct
{
/** Motion vector X component */
WORD16 i2_mv_x;
/** Motion vector Y component */
WORD16 i2_mv_y;
/** Ref id, as specified in terms of Lc, unified list */
WORD8 i1_ref_idx;
/** SAD / SATD stored here */
WORD32 i4_sad;
} part_results_t;
/**
******************************************************************************
* @brief This struct is used for storing output of me search or block merge
* and also all of the intermediate results required
******************************************************************************
*/
typedef struct
{
/**
* X and y offsets w.r.t. CTB start in encode layers. For non encode
* layers, these may typically be 0
*/
UWORD8 u1_x_off;
UWORD8 u1_y_off;
/** cu size as per the CU_SIZE_T enumeration */
UWORD8 u1_cu_size;
WORD32 i4_inp_offset;
/** best results of a CU sorted in increasing cost */
part_type_results_t *ps_best_results;
/** active partition mask for this CU */
WORD32 i4_part_mask;
/** number of best results mainted for every PU */
UWORD8 u1_num_best_results;
/** Split flag to indicate whether current CU is split or not */
UWORD8 u1_split_flag;
} inter_cu_results_t;
/**
******************************************************************************
* @brief This struct is used for storing input of me search in the form of
* pu_results_t structure which is given to hme_decide_part_types as i/p
******************************************************************************
*/
typedef struct
{
/** ptrs to multiple pu results of a CU. Can be seperated out as seperate structure*/
pu_result_t *aps_pu_results[2][TOT_NUM_PARTS];
/** max number of best results mainted for a partition in L0*/
UWORD8 u1_num_results_per_part_l0[TOT_NUM_PARTS];
/** max number of best results mainted for a partition in L*/
UWORD8 u1_num_results_per_part_l1[TOT_NUM_PARTS];
} inter_pu_results_t;
/**
******************************************************************************
* @struct me_results_16x16_t
* @brief Contains complete search result for a CU for a given type of
* partition split. Holds ptrs to results for each partition, with
* information of partition type.
******************************************************************************
*/
typedef struct
{
/**
* X and y offsets w.r.t. CTB start in encode layers. For non encode
* layers, these may typically be 0
*/
UWORD8 u1_x_off;
UWORD8 u1_y_off;
/**
* Type of partition that the CU is split into, for which this
* result is relevant
*/
PART_TYPE_T e_part_type;
/**
* Pointer to results of each individual partitions. Note that max
* number of partitions a CU can be split into is MAX_NUM_PARTS
* 3 => L0 best, L1 best and best across L0 and L1
*/
part_results_t as_part_result[MAX_NUM_PARTS][3];
/* Contains the best uni dir for each partition type */
/* enabled for this 16x16 block */
WORD32 ai4_best_uni_dir[MAX_NUM_PARTS];
/* Contains the best pred dir for each partition type */
/* enabled for this 16x16 block */
WORD32 ai4_best_pred_dir[MAX_NUM_PARTS];
} me_results_16x16_t;
/**
******************************************************************************
* @struct me_results_8x8_t
* @brief Contains complete search result for a CU for a given type of
* partition split. Holds ptrs to results for each partition, with
* information of partition type.
* @assumptions e_part_type is always PRT_2Nx2N
******************************************************************************
*/
typedef struct
{
/**
* X and y offsets w.r.t. CTB start in encode layers. For non encode
* layers, these may typically be 0
*/
UWORD8 u1_x_off;
UWORD8 u1_y_off;
/**
* Type of partition that the CU is split into, for which this
* result is relevant
*/
PART_TYPE_T e_part_type;
/**
* Pointer to results of each individual partitions. Note that max
* number of partitions a CU can be split into is MAX_NUM_PARTS
* 3 => L0 best, L1 best and best across L0 and L1
*/
part_results_t as_part_result[2];
/* Contains the best uni dir for each partition type */
/* enabled for this 16x16 block */
WORD32 i4_best_uni_dir;
/* Contains the best pred dir for each partition type */
/* enabled for this 16x16 block */
WORD32 i4_best_pred_dir;
} me_results_8x8_t;
/**
******************************************************************************
* @struct cluster_mv_list_t
* @brief Contains data computed by the clustering algorithm
******************************************************************************
*/
typedef struct
{
mv_t as_mv[MAX_NUM_MERGE_CANDTS];
WORD32 num_mvs;
} cluster_mv_list_t;
/**
******************************************************************************
* @struct qpel_input_buf_cfg_t
* @brief For QPEL averaging, this descriptor (typically outcome of lookup)
* contains info related to the 2 fpel/hpel planes that are to be
* averaged along wiht the exact offsets
******************************************************************************
*/
typedef struct
{
/** id of buf1 for input of averaging: 0-3 */
WORD8 i1_buf_id1;
/**
* x and y offset in buf 1 w.r.t. colocated input point after correcting
* for fpel mvx and mvy
*/
WORD8 i1_buf_xoff1;
WORD8 i1_buf_yoff1;
/** id of buf2 for input of averaging: 0-3 */
WORD8 i1_buf_id2;
/**
* x and y offset in buf 2 w.r.t. colocated input point after correcting
* for fpel mvx and mvy
*/
WORD8 i1_buf_xoff2;
WORD8 i1_buf_yoff2;
} qpel_input_buf_cfg_t;
typedef struct
{
UWORD8 *apu1_pred_bufs[MAX_NUM_PRED_BUFS_USED_FOR_PARTTYPE_DECISIONS];
UWORD32 u4_pred_buf_usage_indicator;
} hme_pred_buf_mngr_t;
#endif