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