1*c83a76b0SSuyog Pawar /****************************************************************************** 2*c83a76b0SSuyog Pawar * 3*c83a76b0SSuyog Pawar * Copyright (C) 2018 The Android Open Source Project 4*c83a76b0SSuyog Pawar * 5*c83a76b0SSuyog Pawar * Licensed under the Apache License, Version 2.0 (the "License"); 6*c83a76b0SSuyog Pawar * you may not use this file except in compliance with the License. 7*c83a76b0SSuyog Pawar * You may obtain a copy of the License at: 8*c83a76b0SSuyog Pawar * 9*c83a76b0SSuyog Pawar * http://www.apache.org/licenses/LICENSE-2.0 10*c83a76b0SSuyog Pawar * 11*c83a76b0SSuyog Pawar * Unless required by applicable law or agreed to in writing, software 12*c83a76b0SSuyog Pawar * distributed under the License is distributed on an "AS IS" BASIS, 13*c83a76b0SSuyog Pawar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*c83a76b0SSuyog Pawar * See the License for the specific language governing permissions and 15*c83a76b0SSuyog Pawar * limitations under the License. 16*c83a76b0SSuyog Pawar * 17*c83a76b0SSuyog Pawar ***************************************************************************** 18*c83a76b0SSuyog Pawar * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19*c83a76b0SSuyog Pawar */ 20*c83a76b0SSuyog Pawar 21*c83a76b0SSuyog Pawar /** 22*c83a76b0SSuyog Pawar ****************************************************************************** 23*c83a76b0SSuyog Pawar * @file ihevce_me_common_defs.h 24*c83a76b0SSuyog Pawar * 25*c83a76b0SSuyog Pawar * @brief 26*c83a76b0SSuyog Pawar * This file contains structures and interface prototypes for header encoding 27*c83a76b0SSuyog Pawar * 28*c83a76b0SSuyog Pawar * @author 29*c83a76b0SSuyog Pawar * Ittiam 30*c83a76b0SSuyog Pawar ****************************************************************************** 31*c83a76b0SSuyog Pawar */ 32*c83a76b0SSuyog Pawar 33*c83a76b0SSuyog Pawar #ifndef _IHEVCE_ME_COMMON_DEFS_H_ 34*c83a76b0SSuyog Pawar #define _IHEVCE_ME_COMMON_DEFS_H_ 35*c83a76b0SSuyog Pawar 36*c83a76b0SSuyog Pawar /****************************************************************************/ 37*c83a76b0SSuyog Pawar /* Constant Macros */ 38*c83a76b0SSuyog Pawar /****************************************************************************/ 39*c83a76b0SSuyog Pawar /** 40*c83a76b0SSuyog Pawar ******************************************************************************* 41*c83a76b0SSuyog Pawar @brief We basically store an impossible and unique MV to identify intra blks 42*c83a76b0SSuyog Pawar or CUs 43*c83a76b0SSuyog Pawar ******************************************************************************* 44*c83a76b0SSuyog Pawar */ 45*c83a76b0SSuyog Pawar #define INTRA_MV 0x4000 46*c83a76b0SSuyog Pawar /** 47*c83a76b0SSuyog Pawar ******************************************************************************* 48*c83a76b0SSuyog Pawar @brief MAX INT VAL is defined as follows so that adding the four candidates, 49*c83a76b0SSuyog Pawar still will be a positive value 50*c83a76b0SSuyog Pawar ******************************************************************************* 51*c83a76b0SSuyog Pawar */ 52*c83a76b0SSuyog Pawar #define MAX_INT_VAL (0x7FFFFFF) 53*c83a76b0SSuyog Pawar 54*c83a76b0SSuyog Pawar /** 55*c83a76b0SSuyog Pawar ******************************************************************************* 56*c83a76b0SSuyog Pawar @brief Max number of results stored in search result str (per partition) during 57*c83a76b0SSuyog Pawar refinement search. Needed for memory allocation purposes 58*c83a76b0SSuyog Pawar ******************************************************************************* 59*c83a76b0SSuyog Pawar */ 60*c83a76b0SSuyog Pawar #define MAX_REFINE_RESULTS 4 61*c83a76b0SSuyog Pawar 62*c83a76b0SSuyog Pawar /** 63*c83a76b0SSuyog Pawar ******************************************************************************* 64*c83a76b0SSuyog Pawar @brief Maximum number of partitions in a CU (NxN case) 65*c83a76b0SSuyog Pawar ******************************************************************************* 66*c83a76b0SSuyog Pawar */ 67*c83a76b0SSuyog Pawar #define MAX_NUM_PARTS 4 68*c83a76b0SSuyog Pawar 69*c83a76b0SSuyog Pawar /** As min CU size is 8, there can only be two partitions in a CU */ 70*c83a76b0SSuyog Pawar #define MAX_NUM_INTER_PARTS 2 71*c83a76b0SSuyog Pawar 72*c83a76b0SSuyog Pawar /* 4 for the num of REF and 2 for num_results_per_part */ 73*c83a76b0SSuyog Pawar #define MAX_NUM_RESULTS_PER_PART_LIST 8 74*c83a76b0SSuyog Pawar 75*c83a76b0SSuyog Pawar #define MAX_NUM_RESULTS_PER_PART 2 76*c83a76b0SSuyog Pawar 77*c83a76b0SSuyog Pawar #define MAX_NUM_REF 12 78*c83a76b0SSuyog Pawar 79*c83a76b0SSuyog Pawar #define NUM_BEST_ME_OUTPUTS 4 80*c83a76b0SSuyog Pawar 81*c83a76b0SSuyog Pawar #define MAX_NUM_CLUSTERS_IN_ONE_REF_IDX 5 82*c83a76b0SSuyog Pawar 83*c83a76b0SSuyog Pawar /* Assumption is (MAX_NUM_CANDS_BESTUNI >= MAX_NUM_CANDS_BESTALT) */ 84*c83a76b0SSuyog Pawar #define MAX_NUM_CANDS_BESTUNI 10 85*c83a76b0SSuyog Pawar 86*c83a76b0SSuyog Pawar #define MAX_NUM_CANDS_BESTALT 10 87*c83a76b0SSuyog Pawar 88*c83a76b0SSuyog Pawar #define MAX_NUM_MERGE_CANDTS 4 * (3 * MAX_NUM_CLUSTERS_IN_ONE_REF_IDX + 2 * MAX_NUM_CANDS_BESTUNI) 89*c83a76b0SSuyog Pawar 90*c83a76b0SSuyog Pawar #define MAX_NUM_CLUSTERS_16x16 8 91*c83a76b0SSuyog Pawar 92*c83a76b0SSuyog Pawar #define MAX_NUM_CLUSTERS_32x32 10 93*c83a76b0SSuyog Pawar 94*c83a76b0SSuyog Pawar #define MAX_NUM_CLUSTERS_64x64 10 95*c83a76b0SSuyog Pawar 96*c83a76b0SSuyog Pawar #define MAX_DISTANCE_FROM_CENTROID_16x16 4 97*c83a76b0SSuyog Pawar 98*c83a76b0SSuyog Pawar #define MAX_DISTANCE_FROM_CENTROID_32x32 8 99*c83a76b0SSuyog Pawar 100*c83a76b0SSuyog Pawar #define MAX_DISTANCE_FROM_CENTROID_64x64 16 101*c83a76b0SSuyog Pawar 102*c83a76b0SSuyog Pawar #define MAX_DISTANCE_FROM_CENTROID_16x16_B 4 103*c83a76b0SSuyog Pawar 104*c83a76b0SSuyog Pawar #define MAX_DISTANCE_FROM_CENTROID_32x32_B 8 105*c83a76b0SSuyog Pawar 106*c83a76b0SSuyog Pawar #define MAX_DISTANCE_FROM_CENTROID_64x64_B 16 107*c83a76b0SSuyog Pawar 108*c83a76b0SSuyog Pawar #define MAX_NUM_CLUSTERS_IN_VALID_16x16_BLK 3 109*c83a76b0SSuyog Pawar 110*c83a76b0SSuyog Pawar #define MAX_NUM_CLUSTERS_IN_VALID_32x32_BLK 5 111*c83a76b0SSuyog Pawar 112*c83a76b0SSuyog Pawar #define MAX_NUM_CLUSTERS_IN_VALID_64x64_BLK 5 113*c83a76b0SSuyog Pawar 114*c83a76b0SSuyog Pawar #define ALL_INTER_COST_DIFF_THR 10 115*c83a76b0SSuyog Pawar 116*c83a76b0SSuyog Pawar #define MAX_INTRA_PERCENTAGE 25 117*c83a76b0SSuyog Pawar 118*c83a76b0SSuyog Pawar #define CLUSTER_DATA_DUMP 0 119*c83a76b0SSuyog Pawar 120*c83a76b0SSuyog Pawar #define DISABLE_INTER_CANDIDATES 0 121*c83a76b0SSuyog Pawar 122*c83a76b0SSuyog Pawar #define ENABLE_4CTB_EVALUATION 1 123*c83a76b0SSuyog Pawar 124*c83a76b0SSuyog Pawar #define USE_2N_NBR 1 125*c83a76b0SSuyog Pawar 126*c83a76b0SSuyog Pawar #define USE_CLUSTER_DATA_AS_BLK_MERGE_CANDTS 0 127*c83a76b0SSuyog Pawar 128*c83a76b0SSuyog Pawar #define MAX_REFS_SEARCHABLE MAX_NUM_REF 129*c83a76b0SSuyog Pawar 130*c83a76b0SSuyog Pawar #define DEBUG_TRACE_ENABLE 0 131*c83a76b0SSuyog Pawar 132*c83a76b0SSuyog Pawar #define DISABLE_INTRA_IN_BPICS 1 133*c83a76b0SSuyog Pawar 134*c83a76b0SSuyog Pawar #define DISABLE_L0_IPE_INTRA_IN_BPICS 1 135*c83a76b0SSuyog Pawar 136*c83a76b0SSuyog Pawar #define DISABLE_L2_IPE_INTRA_IN_BPICS 0 137*c83a76b0SSuyog Pawar 138*c83a76b0SSuyog Pawar #define DISABLE_L2_IPE_INTRA_IN_IPBPICS 0 139*c83a76b0SSuyog Pawar 140*c83a76b0SSuyog Pawar #define DISABLE_L1_L2_IPE_INTRA_IN_BPICS 1 141*c83a76b0SSuyog Pawar 142*c83a76b0SSuyog Pawar #define RC_DEPENDENCY_FOR_BPIC 1 143*c83a76b0SSuyog Pawar 144*c83a76b0SSuyog Pawar #define DISABLE_L1_L2_IPE_INTRA_IN_IPBPICS 0 145*c83a76b0SSuyog Pawar 146*c83a76b0SSuyog Pawar #define DISABLE_L2_IPE_IN_IPB_L1_IN_B 0 147*c83a76b0SSuyog Pawar 148*c83a76b0SSuyog Pawar #define DISABLE_L2_IPE_IN_PB_L1_IN_B 1 149*c83a76b0SSuyog Pawar 150*c83a76b0SSuyog Pawar #define DISBLE_CHILD_CU_EVAL_L0_IPE 0 151*c83a76b0SSuyog Pawar 152*c83a76b0SSuyog Pawar #define FORCE_NXN_MODE_BASED_ON_OL_IPE 0 153*c83a76b0SSuyog Pawar 154*c83a76b0SSuyog Pawar #define TEMPORAL_LAYER_DISABLE 0 155*c83a76b0SSuyog Pawar 156*c83a76b0SSuyog Pawar #define COARSE_ME_OPT 1 157*c83a76b0SSuyog Pawar 158*c83a76b0SSuyog Pawar #define NUM_RESULTS_TO_EXPORT_MS 3 159*c83a76b0SSuyog Pawar 160*c83a76b0SSuyog Pawar #define NUM_RESULTS_TO_EXPORT_HS NUM_BEST_ME_OUTPUTS 161*c83a76b0SSuyog Pawar 162*c83a76b0SSuyog Pawar #define NUM_RESULTS_TO_EXPORT_XS 2 163*c83a76b0SSuyog Pawar 164*c83a76b0SSuyog Pawar #define DISABLE_MERGE 0 165*c83a76b0SSuyog Pawar 166*c83a76b0SSuyog Pawar #define INTERP_OUT_BUF_SIZE (64 * 64) 167*c83a76b0SSuyog Pawar 168*c83a76b0SSuyog Pawar /* NUM_BEST_ME_OUTPUTS - Maximum possible TU Recursion candidates */ 169*c83a76b0SSuyog Pawar /* 2 - Required for Hadamard Transform coefficients */ 170*c83a76b0SSuyog Pawar /* 2 - Required in 'hme_compute_pred_and_evaluate_bi' */ 171*c83a76b0SSuyog Pawar /* 5 of these are also used in 'hme_subpel_refine_cu_hs' */ 172*c83a76b0SSuyog Pawar #define MAX_NUM_PRED_BUFS_USED_FOR_PARTTYPE_DECISIONS (NUM_BEST_ME_OUTPUTS) + 2 + 2 173*c83a76b0SSuyog Pawar 174*c83a76b0SSuyog Pawar #define MAX_WKG_MEM_SIZE_PER_THREAD \ 175*c83a76b0SSuyog Pawar (MAX_NUM_PRED_BUFS_USED_FOR_PARTTYPE_DECISIONS) * (INTERP_OUT_BUF_SIZE) 176*c83a76b0SSuyog Pawar 177*c83a76b0SSuyog Pawar /** 178*c83a76b0SSuyog Pawar ****************************************************************************** 179*c83a76b0SSuyog Pawar * @macro OLD_XTREME_SPEED 180*c83a76b0SSuyog Pawar * @brief Reverts the changes back to older Xtreme speed model 181*c83a76b0SSuyog Pawar ****************************************************************************** 182*c83a76b0SSuyog Pawar */ 183*c83a76b0SSuyog Pawar #define OLD_XTREME_SPEED 0 184*c83a76b0SSuyog Pawar #define OLD_HIGH_SPEED 0 185*c83a76b0SSuyog Pawar 186*c83a76b0SSuyog Pawar /** 187*c83a76b0SSuyog Pawar ****************************************************************************** 188*c83a76b0SSuyog Pawar * @macro BIT_EN 189*c83a76b0SSuyog Pawar * @brief Enables the bit at a given bit position 190*c83a76b0SSuyog Pawar ****************************************************************************** 191*c83a76b0SSuyog Pawar */ 192*c83a76b0SSuyog Pawar #define BIT_EN(x) (1 << (x)) 193*c83a76b0SSuyog Pawar 194*c83a76b0SSuyog Pawar /** 195*c83a76b0SSuyog Pawar ****************************************************************************** 196*c83a76b0SSuyog Pawar * @macros ENABLE_mxn 197*c83a76b0SSuyog Pawar * @brief Enables a type or a group of partitions. ENABLE_ALL_PARTS, enables all 198*c83a76b0SSuyog Pawar * partitions, while others enable selected partitions. These can be used 199*c83a76b0SSuyog Pawar * to set the mask of active partitions 200*c83a76b0SSuyog Pawar ****************************************************************************** 201*c83a76b0SSuyog Pawar */ 202*c83a76b0SSuyog Pawar #define ENABLE_2Nx2N (BIT_EN(PART_ID_2Nx2N)) 203*c83a76b0SSuyog Pawar #define ENABLE_2NxN (BIT_EN(PART_ID_2NxN_T) | BIT_EN(PART_ID_2NxN_B)) 204*c83a76b0SSuyog Pawar #define ENABLE_Nx2N (BIT_EN(PART_ID_Nx2N_L) | BIT_EN(PART_ID_Nx2N_R)) 205*c83a76b0SSuyog Pawar #define ENABLE_NxN \ 206*c83a76b0SSuyog Pawar (BIT_EN(PART_ID_NxN_TL) | BIT_EN(PART_ID_NxN_TR) | BIT_EN(PART_ID_NxN_BL) | \ 207*c83a76b0SSuyog Pawar BIT_EN(PART_ID_NxN_BR)) 208*c83a76b0SSuyog Pawar #define ENABLE_2NxnU (BIT_EN(PART_ID_2NxnU_T) | BIT_EN(PART_ID_2NxnU_B)) 209*c83a76b0SSuyog Pawar #define ENABLE_2NxnD (BIT_EN(PART_ID_2NxnD_T) | BIT_EN(PART_ID_2NxnD_B)) 210*c83a76b0SSuyog Pawar #define ENABLE_nLx2N (BIT_EN(PART_ID_nLx2N_L) | BIT_EN(PART_ID_nLx2N_R)) 211*c83a76b0SSuyog Pawar #define ENABLE_nRx2N (BIT_EN(PART_ID_nRx2N_L) | BIT_EN(PART_ID_nRx2N_R)) 212*c83a76b0SSuyog Pawar #define ENABLE_AMP ((ENABLE_2NxnU) | (ENABLE_2NxnD) | (ENABLE_nLx2N) | (ENABLE_nRx2N)) 213*c83a76b0SSuyog Pawar #define ENABLE_ALL_PARTS \ 214*c83a76b0SSuyog Pawar ((ENABLE_2Nx2N) | (ENABLE_NxN) | (ENABLE_2NxN) | (ENABLE_Nx2N) | (ENABLE_AMP)) 215*c83a76b0SSuyog Pawar 216*c83a76b0SSuyog Pawar #define DISABLE_THE_CHILDREN_NODES(ps_parent_node) \ 217*c83a76b0SSuyog Pawar { \ 218*c83a76b0SSuyog Pawar (ps_parent_node)->ps_child_node_tl->is_node_valid = 0; \ 219*c83a76b0SSuyog Pawar (ps_parent_node)->ps_child_node_tr->is_node_valid = 0; \ 220*c83a76b0SSuyog Pawar (ps_parent_node)->ps_child_node_bl->is_node_valid = 0; \ 221*c83a76b0SSuyog Pawar (ps_parent_node)->ps_child_node_br->is_node_valid = 0; \ 222*c83a76b0SSuyog Pawar } 223*c83a76b0SSuyog Pawar 224*c83a76b0SSuyog Pawar #define NULLIFY_THE_CHILDREN_NODES(ps_parent_node) \ 225*c83a76b0SSuyog Pawar { \ 226*c83a76b0SSuyog Pawar (ps_parent_node)->ps_child_node_tl = NULL; \ 227*c83a76b0SSuyog Pawar (ps_parent_node)->ps_child_node_tr = NULL; \ 228*c83a76b0SSuyog Pawar (ps_parent_node)->ps_child_node_bl = NULL; \ 229*c83a76b0SSuyog Pawar (ps_parent_node)->ps_child_node_br = NULL; \ 230*c83a76b0SSuyog Pawar } 231*c83a76b0SSuyog Pawar 232*c83a76b0SSuyog Pawar #define DISABLE_ALL_KIN_OF_64x64_NODE(ps_tree_root) \ 233*c83a76b0SSuyog Pawar { \ 234*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)); \ 235*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tl); \ 236*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tr); \ 237*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_bl); \ 238*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_br); \ 239*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tl->ps_child_node_tl); \ 240*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tl->ps_child_node_tr); \ 241*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tl->ps_child_node_bl); \ 242*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tl->ps_child_node_br); \ 243*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tr->ps_child_node_tl); \ 244*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tr->ps_child_node_tr); \ 245*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tr->ps_child_node_bl); \ 246*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tr->ps_child_node_br); \ 247*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_bl->ps_child_node_tl); \ 248*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_bl->ps_child_node_tr); \ 249*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_bl->ps_child_node_bl); \ 250*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_bl->ps_child_node_br); \ 251*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_br->ps_child_node_tl); \ 252*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_br->ps_child_node_tr); \ 253*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_br->ps_child_node_bl); \ 254*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_br->ps_child_node_br); \ 255*c83a76b0SSuyog Pawar } 256*c83a76b0SSuyog Pawar 257*c83a76b0SSuyog Pawar #define DISABLE_ALL_KIN_OF_32x32_NODE(ps_tree_root) \ 258*c83a76b0SSuyog Pawar { \ 259*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)); \ 260*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tl); \ 261*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_tr); \ 262*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_bl); \ 263*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES((ps_tree_root)->ps_child_node_br); \ 264*c83a76b0SSuyog Pawar } 265*c83a76b0SSuyog Pawar 266*c83a76b0SSuyog Pawar #define ENABLE_THE_CHILDREN_NODES(ps_parent_node) \ 267*c83a76b0SSuyog Pawar { \ 268*c83a76b0SSuyog Pawar (ps_parent_node)->ps_child_node_tl->is_node_valid = 1; \ 269*c83a76b0SSuyog Pawar (ps_parent_node)->ps_child_node_tr->is_node_valid = 1; \ 270*c83a76b0SSuyog Pawar (ps_parent_node)->ps_child_node_bl->is_node_valid = 1; \ 271*c83a76b0SSuyog Pawar (ps_parent_node)->ps_child_node_br->is_node_valid = 1; \ 272*c83a76b0SSuyog Pawar } 273*c83a76b0SSuyog Pawar 274*c83a76b0SSuyog Pawar #define CLIP_MV_WITHIN_RANGE( \ 275*c83a76b0SSuyog Pawar x, y, range, fpel_refine_extent, hpel_refine_extent, qpel_refine_extent) \ 276*c83a76b0SSuyog Pawar { \ 277*c83a76b0SSuyog Pawar WORD16 i4_range_erosion_metric; \ 278*c83a76b0SSuyog Pawar \ 279*c83a76b0SSuyog Pawar i4_range_erosion_metric = \ 280*c83a76b0SSuyog Pawar ((fpel_refine_extent) << 2) + ((hpel_refine_extent) << 1) + (qpel_refine_extent); \ 281*c83a76b0SSuyog Pawar i4_range_erosion_metric += 2; \ 282*c83a76b0SSuyog Pawar i4_range_erosion_metric >>= 2; \ 283*c83a76b0SSuyog Pawar \ 284*c83a76b0SSuyog Pawar if((x) > ((range)->i2_max_x - i4_range_erosion_metric)) \ 285*c83a76b0SSuyog Pawar (x) = ((range)->i2_max_x - i4_range_erosion_metric); \ 286*c83a76b0SSuyog Pawar if((x) < ((range)->i2_min_x + i4_range_erosion_metric)) \ 287*c83a76b0SSuyog Pawar (x) = ((range)->i2_min_x + i4_range_erosion_metric); \ 288*c83a76b0SSuyog Pawar if((y) > ((range)->i2_max_y - i4_range_erosion_metric)) \ 289*c83a76b0SSuyog Pawar (y) = ((range)->i2_max_y - i4_range_erosion_metric); \ 290*c83a76b0SSuyog Pawar if((y) < ((range)->i2_min_y + i4_range_erosion_metric)) \ 291*c83a76b0SSuyog Pawar (y) = ((range)->i2_min_y + i4_range_erosion_metric); \ 292*c83a76b0SSuyog Pawar } 293*c83a76b0SSuyog Pawar 294*c83a76b0SSuyog Pawar /****************************************************************************/ 295*c83a76b0SSuyog Pawar /* Enumerations */ 296*c83a76b0SSuyog Pawar /****************************************************************************/ 297*c83a76b0SSuyog Pawar /** 298*c83a76b0SSuyog Pawar 299*c83a76b0SSuyog Pawar 300*c83a76b0SSuyog Pawar ****************************************************************************** 301*c83a76b0SSuyog Pawar * @enum CU_SIZE_T 302*c83a76b0SSuyog Pawar * @brief Enumerates all possible CU sizes (8x8 to 64x64) 303*c83a76b0SSuyog Pawar ****************************************************************************** 304*c83a76b0SSuyog Pawar */ 305*c83a76b0SSuyog Pawar typedef enum 306*c83a76b0SSuyog Pawar { 307*c83a76b0SSuyog Pawar CU_INVALID = -1, 308*c83a76b0SSuyog Pawar CU_8x8 = 0, 309*c83a76b0SSuyog Pawar CU_16x16, 310*c83a76b0SSuyog Pawar CU_32x32, 311*c83a76b0SSuyog Pawar CU_64x64, 312*c83a76b0SSuyog Pawar NUM_CU_SIZES 313*c83a76b0SSuyog Pawar } CU_SIZE_T; 314*c83a76b0SSuyog Pawar 315*c83a76b0SSuyog Pawar /** 316*c83a76b0SSuyog Pawar ****************************************************************************** 317*c83a76b0SSuyog Pawar * @enum PART_TYPE_T 318*c83a76b0SSuyog Pawar * @brief Defines all possible partition splits within a inter CU 319*c83a76b0SSuyog Pawar ****************************************************************************** 320*c83a76b0SSuyog Pawar */ 321*c83a76b0SSuyog Pawar typedef enum 322*c83a76b0SSuyog Pawar { 323*c83a76b0SSuyog Pawar PRT_INVALID = -1, 324*c83a76b0SSuyog Pawar PRT_2Nx2N = 0, 325*c83a76b0SSuyog Pawar PRT_2NxN, 326*c83a76b0SSuyog Pawar PRT_Nx2N, 327*c83a76b0SSuyog Pawar PRT_NxN, 328*c83a76b0SSuyog Pawar PRT_2NxnU, 329*c83a76b0SSuyog Pawar PRT_2NxnD, 330*c83a76b0SSuyog Pawar PRT_nLx2N, 331*c83a76b0SSuyog Pawar PRT_nRx2N, 332*c83a76b0SSuyog Pawar MAX_PART_TYPES 333*c83a76b0SSuyog Pawar } PART_TYPE_T; 334*c83a76b0SSuyog Pawar 335*c83a76b0SSuyog Pawar /** 336*c83a76b0SSuyog Pawar ****************************************************************************** 337*c83a76b0SSuyog Pawar * @enum PART_ID_T 338*c83a76b0SSuyog Pawar * @brief Defines all possible partition ids within a inter CU 339*c83a76b0SSuyog Pawar ****************************************************************************** 340*c83a76b0SSuyog Pawar */ 341*c83a76b0SSuyog Pawar typedef enum 342*c83a76b0SSuyog Pawar { 343*c83a76b0SSuyog Pawar PART_ID_INVALID = -1, 344*c83a76b0SSuyog Pawar PART_ID_2Nx2N = 0, 345*c83a76b0SSuyog Pawar /* These 2 belong to 2NxN Part */ 346*c83a76b0SSuyog Pawar PART_ID_2NxN_T = 1, 347*c83a76b0SSuyog Pawar PART_ID_2NxN_B = 2, 348*c83a76b0SSuyog Pawar /* These 2 belong to Nx2N */ 349*c83a76b0SSuyog Pawar PART_ID_Nx2N_L = 3, 350*c83a76b0SSuyog Pawar PART_ID_Nx2N_R = 4, 351*c83a76b0SSuyog Pawar 352*c83a76b0SSuyog Pawar /* 4 partitions of NxN */ 353*c83a76b0SSuyog Pawar PART_ID_NxN_TL = 5, 354*c83a76b0SSuyog Pawar PART_ID_NxN_TR = 6, 355*c83a76b0SSuyog Pawar PART_ID_NxN_BL = 7, 356*c83a76b0SSuyog Pawar PART_ID_NxN_BR = 8, 357*c83a76b0SSuyog Pawar 358*c83a76b0SSuyog Pawar /*************************************************************************/ 359*c83a76b0SSuyog Pawar /* ________ */ 360*c83a76b0SSuyog Pawar /* |________|-->2NxnU_T */ 361*c83a76b0SSuyog Pawar /* | | */ 362*c83a76b0SSuyog Pawar /* | |-->2NxnU_B */ 363*c83a76b0SSuyog Pawar /* |________| */ 364*c83a76b0SSuyog Pawar /*************************************************************************/ 365*c83a76b0SSuyog Pawar PART_ID_2NxnU_T = 9, 366*c83a76b0SSuyog Pawar PART_ID_2NxnU_B = 10, 367*c83a76b0SSuyog Pawar 368*c83a76b0SSuyog Pawar /*************************************************************************/ 369*c83a76b0SSuyog Pawar /* ________ */ 370*c83a76b0SSuyog Pawar /* | | */ 371*c83a76b0SSuyog Pawar /* | |-->2NxnD_T */ 372*c83a76b0SSuyog Pawar /* |________| */ 373*c83a76b0SSuyog Pawar /* |________|-->2NxnD_B */ 374*c83a76b0SSuyog Pawar /*************************************************************************/ 375*c83a76b0SSuyog Pawar PART_ID_2NxnD_T = 11, 376*c83a76b0SSuyog Pawar PART_ID_2NxnD_B = 12, 377*c83a76b0SSuyog Pawar 378*c83a76b0SSuyog Pawar /*************************************************************************/ 379*c83a76b0SSuyog Pawar /* ________ */ 380*c83a76b0SSuyog Pawar /* | | | */ 381*c83a76b0SSuyog Pawar /* | | |-->nLx2N_R */ 382*c83a76b0SSuyog Pawar /* | | | */ 383*c83a76b0SSuyog Pawar /* |_|______| */ 384*c83a76b0SSuyog Pawar /* | */ 385*c83a76b0SSuyog Pawar /* v */ 386*c83a76b0SSuyog Pawar /* nLx2N_L */ 387*c83a76b0SSuyog Pawar /*************************************************************************/ 388*c83a76b0SSuyog Pawar PART_ID_nLx2N_L = 13, 389*c83a76b0SSuyog Pawar PART_ID_nLx2N_R = 14, 390*c83a76b0SSuyog Pawar 391*c83a76b0SSuyog Pawar /*************************************************************************/ 392*c83a76b0SSuyog Pawar /* ________ */ 393*c83a76b0SSuyog Pawar /* | | | */ 394*c83a76b0SSuyog Pawar /* | | |-->nRx2N_R */ 395*c83a76b0SSuyog Pawar /* | | | */ 396*c83a76b0SSuyog Pawar /* |______|_| */ 397*c83a76b0SSuyog Pawar /* | */ 398*c83a76b0SSuyog Pawar /* v */ 399*c83a76b0SSuyog Pawar /* nRx2N_L */ 400*c83a76b0SSuyog Pawar /*************************************************************************/ 401*c83a76b0SSuyog Pawar /* AMP 12x16 and 4x16 split */ 402*c83a76b0SSuyog Pawar PART_ID_nRx2N_L = 15, 403*c83a76b0SSuyog Pawar PART_ID_nRx2N_R = 16, 404*c83a76b0SSuyog Pawar TOT_NUM_PARTS = 17 405*c83a76b0SSuyog Pawar } PART_ID_T; 406*c83a76b0SSuyog Pawar 407*c83a76b0SSuyog Pawar /** 408*c83a76b0SSuyog Pawar ****************************************************************************** 409*c83a76b0SSuyog Pawar * @enum CU_POS_T 410*c83a76b0SSuyog Pawar * @brief Position of a block wrt its parent in the CU tree 411*c83a76b0SSuyog Pawar ****************************************************************************** 412*c83a76b0SSuyog Pawar */ 413*c83a76b0SSuyog Pawar typedef enum 414*c83a76b0SSuyog Pawar { 415*c83a76b0SSuyog Pawar POS_NA = -1, 416*c83a76b0SSuyog Pawar POS_TL = 0, 417*c83a76b0SSuyog Pawar POS_TR = 1, 418*c83a76b0SSuyog Pawar POS_BL = 2, 419*c83a76b0SSuyog Pawar POS_BR = 3 420*c83a76b0SSuyog Pawar } CU_POS_T; 421*c83a76b0SSuyog Pawar 422*c83a76b0SSuyog Pawar typedef CU_POS_T TU_POS_T; 423*c83a76b0SSuyog Pawar 424*c83a76b0SSuyog Pawar /****************************************************************************/ 425*c83a76b0SSuyog Pawar /* Structures */ 426*c83a76b0SSuyog Pawar /****************************************************************************/ 427*c83a76b0SSuyog Pawar 428*c83a76b0SSuyog Pawar /** 429*c83a76b0SSuyog Pawar ****************************************************************************** 430*c83a76b0SSuyog Pawar * @struct range_prms_t 431*c83a76b0SSuyog Pawar * @brief Indicates valid range of MV for a given blk/cu/ctb 432*c83a76b0SSuyog Pawar ****************************************************************************** 433*c83a76b0SSuyog Pawar */ 434*c83a76b0SSuyog Pawar typedef struct 435*c83a76b0SSuyog Pawar { 436*c83a76b0SSuyog Pawar /** Min x value possible, precision inferred from context */ 437*c83a76b0SSuyog Pawar WORD16 i2_min_x; 438*c83a76b0SSuyog Pawar /** Max x value possible, precision inferred from context */ 439*c83a76b0SSuyog Pawar WORD16 i2_max_x; 440*c83a76b0SSuyog Pawar /** Min y value possible, precision inferred from context */ 441*c83a76b0SSuyog Pawar WORD16 i2_min_y; 442*c83a76b0SSuyog Pawar /** Max y value possible, precision inferred from context */ 443*c83a76b0SSuyog Pawar WORD16 i2_max_y; 444*c83a76b0SSuyog Pawar } range_prms_t; 445*c83a76b0SSuyog Pawar 446*c83a76b0SSuyog Pawar /** 447*c83a76b0SSuyog Pawar ****************************************************************************** 448*c83a76b0SSuyog Pawar * MACRO for enabling Dynamical Vertical Search Range Support 449*c83a76b0SSuyog Pawar * Note : Should be always 1, else part is not supported 450*c83a76b0SSuyog Pawar ****************************************************************************** 451*c83a76b0SSuyog Pawar */ 452*c83a76b0SSuyog Pawar #define DVSR_CHANGES 1 453*c83a76b0SSuyog Pawar 454*c83a76b0SSuyog Pawar /** 455*c83a76b0SSuyog Pawar ****************************************************************************** 456*c83a76b0SSuyog Pawar * @struct dyn_range_prms_t 457*c83a76b0SSuyog Pawar * @brief Indicates Dynamic search range for a given blk/cu/ctb 458*c83a76b0SSuyog Pawar ****************************************************************************** 459*c83a76b0SSuyog Pawar */ 460*c83a76b0SSuyog Pawar typedef struct 461*c83a76b0SSuyog Pawar { 462*c83a76b0SSuyog Pawar /** Min x value possible */ 463*c83a76b0SSuyog Pawar //WORD16 i2_dyn_min_x; 464*c83a76b0SSuyog Pawar /** Max x value possible */ 465*c83a76b0SSuyog Pawar //WORD16 i2_dyn_max_x; 466*c83a76b0SSuyog Pawar /** Min y value possible */ 467*c83a76b0SSuyog Pawar WORD16 i2_dyn_min_y; 468*c83a76b0SSuyog Pawar /** Max y value possible */ 469*c83a76b0SSuyog Pawar WORD16 i2_dyn_max_y; 470*c83a76b0SSuyog Pawar 471*c83a76b0SSuyog Pawar /** Pic order count */ 472*c83a76b0SSuyog Pawar WORD32 i4_poc; 473*c83a76b0SSuyog Pawar 474*c83a76b0SSuyog Pawar } dyn_range_prms_t; 475*c83a76b0SSuyog Pawar 476*c83a76b0SSuyog Pawar /** 477*c83a76b0SSuyog Pawar ****************************************************************************** 478*c83a76b0SSuyog Pawar * @macro INIT_DYN_SEARCH_PRMS 479*c83a76b0SSuyog Pawar * @brief Initializes this dyn_range_prms_t structure. Can be used to zero 480*c83a76b0SSuyog Pawar * out the range 481*c83a76b0SSuyog Pawar ****************************************************************************** 482*c83a76b0SSuyog Pawar */ 483*c83a76b0SSuyog Pawar #define INIT_DYN_SEARCH_PRMS(x, ref_poc) \ 484*c83a76b0SSuyog Pawar { \ 485*c83a76b0SSuyog Pawar (x)->i2_dyn_min_y = 0; \ 486*c83a76b0SSuyog Pawar (x)->i2_dyn_max_y = 0; \ 487*c83a76b0SSuyog Pawar (x)->i4_poc = ref_poc; \ 488*c83a76b0SSuyog Pawar } 489*c83a76b0SSuyog Pawar 490*c83a76b0SSuyog Pawar typedef struct 491*c83a76b0SSuyog Pawar { 492*c83a76b0SSuyog Pawar WORD16 mvx; 493*c83a76b0SSuyog Pawar 494*c83a76b0SSuyog Pawar WORD16 mvy; 495*c83a76b0SSuyog Pawar 496*c83a76b0SSuyog Pawar /* 0=>mv is not a part of bi-pred mv */ 497*c83a76b0SSuyog Pawar /* 1=>inverse of case 0 */ 498*c83a76b0SSuyog Pawar UWORD8 is_uni; 499*c83a76b0SSuyog Pawar 500*c83a76b0SSuyog Pawar WORD16 pixel_count; 501*c83a76b0SSuyog Pawar 502*c83a76b0SSuyog Pawar WORD32 sdi; 503*c83a76b0SSuyog Pawar 504*c83a76b0SSuyog Pawar } mv_data_t; 505*c83a76b0SSuyog Pawar 506*c83a76b0SSuyog Pawar /** 507*c83a76b0SSuyog Pawar ****************************************************************************** 508*c83a76b0SSuyog Pawar * @brief This struct is stores the search result for a prediction unit (PU) 509*c83a76b0SSuyog Pawar ****************************************************************************** 510*c83a76b0SSuyog Pawar */ 511*c83a76b0SSuyog Pawar 512*c83a76b0SSuyog Pawar typedef struct 513*c83a76b0SSuyog Pawar { 514*c83a76b0SSuyog Pawar /** 515*c83a76b0SSuyog Pawar * PU attributes likes mvs, refids, pred mode, wdt, heigt, ctbx/y offsets etc 516*c83a76b0SSuyog Pawar */ 517*c83a76b0SSuyog Pawar pu_t pu; 518*c83a76b0SSuyog Pawar 519*c83a76b0SSuyog Pawar /* mv cost for this pu */ 520*c83a76b0SSuyog Pawar WORD32 i4_mv_cost; 521*c83a76b0SSuyog Pawar 522*c83a76b0SSuyog Pawar /* total cost for this pu */ 523*c83a76b0SSuyog Pawar WORD32 i4_tot_cost; 524*c83a76b0SSuyog Pawar 525*c83a76b0SSuyog Pawar WORD32 i4_sdi; 526*c83a76b0SSuyog Pawar } pu_result_t; 527*c83a76b0SSuyog Pawar 528*c83a76b0SSuyog Pawar /** 529*c83a76b0SSuyog Pawar ****************************************************************************** 530*c83a76b0SSuyog Pawar * @brief This struct is stores the search result for partition type of CU 531*c83a76b0SSuyog Pawar ****************************************************************************** 532*c83a76b0SSuyog Pawar */ 533*c83a76b0SSuyog Pawar typedef struct 534*c83a76b0SSuyog Pawar { 535*c83a76b0SSuyog Pawar /** part results for a part type */ 536*c83a76b0SSuyog Pawar pu_result_t as_pu_results[MAX_NUM_INTER_PARTS]; 537*c83a76b0SSuyog Pawar 538*c83a76b0SSuyog Pawar UWORD8 *pu1_pred; 539*c83a76b0SSuyog Pawar 540*c83a76b0SSuyog Pawar WORD32 i4_pred_stride; 541*c83a76b0SSuyog Pawar 542*c83a76b0SSuyog Pawar /* total cost for part type */ 543*c83a76b0SSuyog Pawar WORD32 i4_tot_cost; 544*c83a76b0SSuyog Pawar 545*c83a76b0SSuyog Pawar /* TU split flag : tu_split_flag[0] represents the transform splits 546*c83a76b0SSuyog Pawar * for CU size <= 32, for 64x64 each ai4_tu_split_flag corresponds 547*c83a76b0SSuyog Pawar * to respective 32x32 */ 548*c83a76b0SSuyog Pawar /* For a 8x8 TU - 1 bit used to indicate split */ 549*c83a76b0SSuyog Pawar /* 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 */ 550*c83a76b0SSuyog Pawar /* For a 32x32 TU - See above */ 551*c83a76b0SSuyog Pawar WORD32 ai4_tu_split_flag[4]; 552*c83a76b0SSuyog Pawar 553*c83a76b0SSuyog Pawar /* TU early cbf : tu_early_cbf[0] represents the transform splits 554*c83a76b0SSuyog Pawar * for CU size <= 32, for 64x64 each ai4_tu_early_cbf corresponds 555*c83a76b0SSuyog Pawar * to respective 32x32 */ 556*c83a76b0SSuyog Pawar WORD32 ai4_tu_early_cbf[4]; 557*c83a76b0SSuyog Pawar 558*c83a76b0SSuyog Pawar /* Populate the tu_split flag cost for the candidates */ 559*c83a76b0SSuyog Pawar WORD32 i4_tu_split_cost; 560*c83a76b0SSuyog Pawar 561*c83a76b0SSuyog Pawar /** partition type : shall be one of PART_TYPE_T */ 562*c83a76b0SSuyog Pawar UWORD8 u1_part_type; 563*c83a76b0SSuyog Pawar } part_type_results_t; 564*c83a76b0SSuyog Pawar 565*c83a76b0SSuyog Pawar /** 566*c83a76b0SSuyog Pawar ****************************************************************************** 567*c83a76b0SSuyog Pawar * @struct part_results_t 568*c83a76b0SSuyog Pawar * @brief Basic structure used for storage of search results, specification 569*c83a76b0SSuyog Pawar * of init candidates for search etc. This structure is complete for 570*c83a76b0SSuyog Pawar * specification of mv and cost for a given direction of search (L0/L1) but 571*c83a76b0SSuyog Pawar * does not carry information of what type of partition it represents. 572*c83a76b0SSuyog Pawar ****************************************************************************** 573*c83a76b0SSuyog Pawar */ 574*c83a76b0SSuyog Pawar typedef struct 575*c83a76b0SSuyog Pawar { 576*c83a76b0SSuyog Pawar /** Motion vector X component */ 577*c83a76b0SSuyog Pawar WORD16 i2_mv_x; 578*c83a76b0SSuyog Pawar 579*c83a76b0SSuyog Pawar /** Motion vector Y component */ 580*c83a76b0SSuyog Pawar WORD16 i2_mv_y; 581*c83a76b0SSuyog Pawar 582*c83a76b0SSuyog Pawar /** Ref id, as specified in terms of Lc, unified list */ 583*c83a76b0SSuyog Pawar WORD8 i1_ref_idx; 584*c83a76b0SSuyog Pawar 585*c83a76b0SSuyog Pawar /** SAD / SATD stored here */ 586*c83a76b0SSuyog Pawar WORD32 i4_sad; 587*c83a76b0SSuyog Pawar } part_results_t; 588*c83a76b0SSuyog Pawar 589*c83a76b0SSuyog Pawar /** 590*c83a76b0SSuyog Pawar ****************************************************************************** 591*c83a76b0SSuyog Pawar * @brief This struct is used for storing output of me search or block merge 592*c83a76b0SSuyog Pawar * and also all of the intermediate results required 593*c83a76b0SSuyog Pawar ****************************************************************************** 594*c83a76b0SSuyog Pawar */ 595*c83a76b0SSuyog Pawar typedef struct 596*c83a76b0SSuyog Pawar { 597*c83a76b0SSuyog Pawar /** 598*c83a76b0SSuyog Pawar * X and y offsets w.r.t. CTB start in encode layers. For non encode 599*c83a76b0SSuyog Pawar * layers, these may typically be 0 600*c83a76b0SSuyog Pawar */ 601*c83a76b0SSuyog Pawar UWORD8 u1_x_off; 602*c83a76b0SSuyog Pawar 603*c83a76b0SSuyog Pawar UWORD8 u1_y_off; 604*c83a76b0SSuyog Pawar 605*c83a76b0SSuyog Pawar /** cu size as per the CU_SIZE_T enumeration */ 606*c83a76b0SSuyog Pawar UWORD8 u1_cu_size; 607*c83a76b0SSuyog Pawar 608*c83a76b0SSuyog Pawar WORD32 i4_inp_offset; 609*c83a76b0SSuyog Pawar 610*c83a76b0SSuyog Pawar /** best results of a CU sorted in increasing cost */ 611*c83a76b0SSuyog Pawar part_type_results_t *ps_best_results; 612*c83a76b0SSuyog Pawar 613*c83a76b0SSuyog Pawar /** active partition mask for this CU */ 614*c83a76b0SSuyog Pawar WORD32 i4_part_mask; 615*c83a76b0SSuyog Pawar 616*c83a76b0SSuyog Pawar /** number of best results mainted for every PU */ 617*c83a76b0SSuyog Pawar UWORD8 u1_num_best_results; 618*c83a76b0SSuyog Pawar 619*c83a76b0SSuyog Pawar /** Split flag to indicate whether current CU is split or not */ 620*c83a76b0SSuyog Pawar UWORD8 u1_split_flag; 621*c83a76b0SSuyog Pawar 622*c83a76b0SSuyog Pawar } inter_cu_results_t; 623*c83a76b0SSuyog Pawar 624*c83a76b0SSuyog Pawar /** 625*c83a76b0SSuyog Pawar ****************************************************************************** 626*c83a76b0SSuyog Pawar * @brief This struct is used for storing input of me search in the form of 627*c83a76b0SSuyog Pawar * pu_results_t structure which is given to hme_decide_part_types as i/p 628*c83a76b0SSuyog Pawar ****************************************************************************** 629*c83a76b0SSuyog Pawar */ 630*c83a76b0SSuyog Pawar typedef struct 631*c83a76b0SSuyog Pawar { 632*c83a76b0SSuyog Pawar /** ptrs to multiple pu results of a CU. Can be seperated out as seperate structure*/ 633*c83a76b0SSuyog Pawar pu_result_t *aps_pu_results[2][TOT_NUM_PARTS]; 634*c83a76b0SSuyog Pawar 635*c83a76b0SSuyog Pawar /** max number of best results mainted for a partition in L0*/ 636*c83a76b0SSuyog Pawar UWORD8 u1_num_results_per_part_l0[TOT_NUM_PARTS]; 637*c83a76b0SSuyog Pawar 638*c83a76b0SSuyog Pawar /** max number of best results mainted for a partition in L*/ 639*c83a76b0SSuyog Pawar UWORD8 u1_num_results_per_part_l1[TOT_NUM_PARTS]; 640*c83a76b0SSuyog Pawar } inter_pu_results_t; 641*c83a76b0SSuyog Pawar 642*c83a76b0SSuyog Pawar /** 643*c83a76b0SSuyog Pawar ****************************************************************************** 644*c83a76b0SSuyog Pawar * @struct me_results_16x16_t 645*c83a76b0SSuyog Pawar * @brief Contains complete search result for a CU for a given type of 646*c83a76b0SSuyog Pawar * partition split. Holds ptrs to results for each partition, with 647*c83a76b0SSuyog Pawar * information of partition type. 648*c83a76b0SSuyog Pawar ****************************************************************************** 649*c83a76b0SSuyog Pawar */ 650*c83a76b0SSuyog Pawar typedef struct 651*c83a76b0SSuyog Pawar { 652*c83a76b0SSuyog Pawar /** 653*c83a76b0SSuyog Pawar * X and y offsets w.r.t. CTB start in encode layers. For non encode 654*c83a76b0SSuyog Pawar * layers, these may typically be 0 655*c83a76b0SSuyog Pawar */ 656*c83a76b0SSuyog Pawar UWORD8 u1_x_off; 657*c83a76b0SSuyog Pawar 658*c83a76b0SSuyog Pawar UWORD8 u1_y_off; 659*c83a76b0SSuyog Pawar 660*c83a76b0SSuyog Pawar /** 661*c83a76b0SSuyog Pawar * Type of partition that the CU is split into, for which this 662*c83a76b0SSuyog Pawar * result is relevant 663*c83a76b0SSuyog Pawar */ 664*c83a76b0SSuyog Pawar PART_TYPE_T e_part_type; 665*c83a76b0SSuyog Pawar 666*c83a76b0SSuyog Pawar /** 667*c83a76b0SSuyog Pawar * Pointer to results of each individual partitions. Note that max 668*c83a76b0SSuyog Pawar * number of partitions a CU can be split into is MAX_NUM_PARTS 669*c83a76b0SSuyog Pawar * 3 => L0 best, L1 best and best across L0 and L1 670*c83a76b0SSuyog Pawar */ 671*c83a76b0SSuyog Pawar part_results_t as_part_result[MAX_NUM_PARTS][3]; 672*c83a76b0SSuyog Pawar 673*c83a76b0SSuyog Pawar /* Contains the best uni dir for each partition type */ 674*c83a76b0SSuyog Pawar /* enabled for this 16x16 block */ 675*c83a76b0SSuyog Pawar WORD32 ai4_best_uni_dir[MAX_NUM_PARTS]; 676*c83a76b0SSuyog Pawar 677*c83a76b0SSuyog Pawar /* Contains the best pred dir for each partition type */ 678*c83a76b0SSuyog Pawar /* enabled for this 16x16 block */ 679*c83a76b0SSuyog Pawar WORD32 ai4_best_pred_dir[MAX_NUM_PARTS]; 680*c83a76b0SSuyog Pawar } me_results_16x16_t; 681*c83a76b0SSuyog Pawar 682*c83a76b0SSuyog Pawar /** 683*c83a76b0SSuyog Pawar ****************************************************************************** 684*c83a76b0SSuyog Pawar * @struct me_results_8x8_t 685*c83a76b0SSuyog Pawar * @brief Contains complete search result for a CU for a given type of 686*c83a76b0SSuyog Pawar * partition split. Holds ptrs to results for each partition, with 687*c83a76b0SSuyog Pawar * information of partition type. 688*c83a76b0SSuyog Pawar * @assumptions e_part_type is always PRT_2Nx2N 689*c83a76b0SSuyog Pawar ****************************************************************************** 690*c83a76b0SSuyog Pawar */ 691*c83a76b0SSuyog Pawar typedef struct 692*c83a76b0SSuyog Pawar { 693*c83a76b0SSuyog Pawar /** 694*c83a76b0SSuyog Pawar * X and y offsets w.r.t. CTB start in encode layers. For non encode 695*c83a76b0SSuyog Pawar * layers, these may typically be 0 696*c83a76b0SSuyog Pawar */ 697*c83a76b0SSuyog Pawar UWORD8 u1_x_off; 698*c83a76b0SSuyog Pawar 699*c83a76b0SSuyog Pawar UWORD8 u1_y_off; 700*c83a76b0SSuyog Pawar 701*c83a76b0SSuyog Pawar /** 702*c83a76b0SSuyog Pawar * Type of partition that the CU is split into, for which this 703*c83a76b0SSuyog Pawar * result is relevant 704*c83a76b0SSuyog Pawar */ 705*c83a76b0SSuyog Pawar PART_TYPE_T e_part_type; 706*c83a76b0SSuyog Pawar 707*c83a76b0SSuyog Pawar /** 708*c83a76b0SSuyog Pawar * Pointer to results of each individual partitions. Note that max 709*c83a76b0SSuyog Pawar * number of partitions a CU can be split into is MAX_NUM_PARTS 710*c83a76b0SSuyog Pawar * 3 => L0 best, L1 best and best across L0 and L1 711*c83a76b0SSuyog Pawar */ 712*c83a76b0SSuyog Pawar part_results_t as_part_result[2]; 713*c83a76b0SSuyog Pawar 714*c83a76b0SSuyog Pawar /* Contains the best uni dir for each partition type */ 715*c83a76b0SSuyog Pawar /* enabled for this 16x16 block */ 716*c83a76b0SSuyog Pawar WORD32 i4_best_uni_dir; 717*c83a76b0SSuyog Pawar 718*c83a76b0SSuyog Pawar /* Contains the best pred dir for each partition type */ 719*c83a76b0SSuyog Pawar /* enabled for this 16x16 block */ 720*c83a76b0SSuyog Pawar WORD32 i4_best_pred_dir; 721*c83a76b0SSuyog Pawar } me_results_8x8_t; 722*c83a76b0SSuyog Pawar 723*c83a76b0SSuyog Pawar /** 724*c83a76b0SSuyog Pawar ****************************************************************************** 725*c83a76b0SSuyog Pawar * @struct cluster_mv_list_t 726*c83a76b0SSuyog Pawar * @brief Contains data computed by the clustering algorithm 727*c83a76b0SSuyog Pawar ****************************************************************************** 728*c83a76b0SSuyog Pawar */ 729*c83a76b0SSuyog Pawar typedef struct 730*c83a76b0SSuyog Pawar { 731*c83a76b0SSuyog Pawar mv_t as_mv[MAX_NUM_MERGE_CANDTS]; 732*c83a76b0SSuyog Pawar 733*c83a76b0SSuyog Pawar WORD32 num_mvs; 734*c83a76b0SSuyog Pawar 735*c83a76b0SSuyog Pawar } cluster_mv_list_t; 736*c83a76b0SSuyog Pawar 737*c83a76b0SSuyog Pawar /** 738*c83a76b0SSuyog Pawar ****************************************************************************** 739*c83a76b0SSuyog Pawar * @struct qpel_input_buf_cfg_t 740*c83a76b0SSuyog Pawar * @brief For QPEL averaging, this descriptor (typically outcome of lookup) 741*c83a76b0SSuyog Pawar * contains info related to the 2 fpel/hpel planes that are to be 742*c83a76b0SSuyog Pawar * averaged along wiht the exact offsets 743*c83a76b0SSuyog Pawar ****************************************************************************** 744*c83a76b0SSuyog Pawar */ 745*c83a76b0SSuyog Pawar typedef struct 746*c83a76b0SSuyog Pawar { 747*c83a76b0SSuyog Pawar /** id of buf1 for input of averaging: 0-3 */ 748*c83a76b0SSuyog Pawar WORD8 i1_buf_id1; 749*c83a76b0SSuyog Pawar 750*c83a76b0SSuyog Pawar /** 751*c83a76b0SSuyog Pawar * x and y offset in buf 1 w.r.t. colocated input point after correcting 752*c83a76b0SSuyog Pawar * for fpel mvx and mvy 753*c83a76b0SSuyog Pawar */ 754*c83a76b0SSuyog Pawar WORD8 i1_buf_xoff1; 755*c83a76b0SSuyog Pawar WORD8 i1_buf_yoff1; 756*c83a76b0SSuyog Pawar 757*c83a76b0SSuyog Pawar /** id of buf2 for input of averaging: 0-3 */ 758*c83a76b0SSuyog Pawar WORD8 i1_buf_id2; 759*c83a76b0SSuyog Pawar 760*c83a76b0SSuyog Pawar /** 761*c83a76b0SSuyog Pawar * x and y offset in buf 2 w.r.t. colocated input point after correcting 762*c83a76b0SSuyog Pawar * for fpel mvx and mvy 763*c83a76b0SSuyog Pawar */ 764*c83a76b0SSuyog Pawar WORD8 i1_buf_xoff2; 765*c83a76b0SSuyog Pawar WORD8 i1_buf_yoff2; 766*c83a76b0SSuyog Pawar } qpel_input_buf_cfg_t; 767*c83a76b0SSuyog Pawar 768*c83a76b0SSuyog Pawar typedef struct 769*c83a76b0SSuyog Pawar { 770*c83a76b0SSuyog Pawar UWORD8 *apu1_pred_bufs[MAX_NUM_PRED_BUFS_USED_FOR_PARTTYPE_DECISIONS]; 771*c83a76b0SSuyog Pawar 772*c83a76b0SSuyog Pawar UWORD32 u4_pred_buf_usage_indicator; 773*c83a76b0SSuyog Pawar } hme_pred_buf_mngr_t; 774*c83a76b0SSuyog Pawar 775*c83a76b0SSuyog Pawar #endif 776