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 * \file hme_defs.h 23*c83a76b0SSuyog Pawar * 24*c83a76b0SSuyog Pawar * \brief 25*c83a76b0SSuyog Pawar * Important definitions, enumerations, macros and structures used by ME 26*c83a76b0SSuyog Pawar * 27*c83a76b0SSuyog Pawar * \date 28*c83a76b0SSuyog Pawar * 18/09/2012 29*c83a76b0SSuyog Pawar * 30*c83a76b0SSuyog Pawar * \author 31*c83a76b0SSuyog Pawar * Ittiam 32*c83a76b0SSuyog Pawar * 33*c83a76b0SSuyog Pawar ****************************************************************************** 34*c83a76b0SSuyog Pawar */ 35*c83a76b0SSuyog Pawar 36*c83a76b0SSuyog Pawar #ifndef _HME_DEFS_H_ 37*c83a76b0SSuyog Pawar #define _HME_DEFS_H_ 38*c83a76b0SSuyog Pawar 39*c83a76b0SSuyog Pawar /*****************************************************************************/ 40*c83a76b0SSuyog Pawar /* Constant Macros */ 41*c83a76b0SSuyog Pawar /*****************************************************************************/ 42*c83a76b0SSuyog Pawar /** 43*c83a76b0SSuyog Pawar ******************************************************************************* 44*c83a76b0SSuyog Pawar @brief Blk size of the CTB in the max possible case 45*c83a76b0SSuyog Pawar ******************************************************************************* 46*c83a76b0SSuyog Pawar */ 47*c83a76b0SSuyog Pawar #define CTB_BLK_SIZE 64 48*c83a76b0SSuyog Pawar 49*c83a76b0SSuyog Pawar /** 50*c83a76b0SSuyog Pawar ******************************************************************************* 51*c83a76b0SSuyog Pawar @brief Maximun number of results per partition 52*c83a76b0SSuyog Pawar ******************************************************************************* 53*c83a76b0SSuyog Pawar */ 54*c83a76b0SSuyog Pawar #define MAX_RESULTS_PER_PART 2 55*c83a76b0SSuyog Pawar 56*c83a76b0SSuyog Pawar /** 57*c83a76b0SSuyog Pawar ******************************************************************************* 58*c83a76b0SSuyog Pawar @brief Not used currently 59*c83a76b0SSuyog Pawar ******************************************************************************* 60*c83a76b0SSuyog Pawar */ 61*c83a76b0SSuyog Pawar #define MAX_NUM_UNIFIED_RESULTS 10 62*c83a76b0SSuyog Pawar #define MAX_NUM_CTB_NODES 10 63*c83a76b0SSuyog Pawar 64*c83a76b0SSuyog Pawar /** 65*c83a76b0SSuyog Pawar ******************************************************************************* 66*c83a76b0SSuyog Pawar @brief For 64x64 CTB, we have 16x16 MV grid for prediction purposes (cost calc) 67*c83a76b0SSuyog Pawar This has 1 padding at boundaries for causal neighbours 68*c83a76b0SSuyog Pawar ******************************************************************************* 69*c83a76b0SSuyog Pawar */ 70*c83a76b0SSuyog Pawar #define CTB_MV_GRID_PAD 1 71*c83a76b0SSuyog Pawar 72*c83a76b0SSuyog Pawar /** 73*c83a76b0SSuyog Pawar ******************************************************************************* 74*c83a76b0SSuyog Pawar @brief number of bits per bin 75*c83a76b0SSuyog Pawar ******************************************************************************* 76*c83a76b0SSuyog Pawar */ 77*c83a76b0SSuyog Pawar #define HME_CABAC_BITS_PER_BIN 0.5 78*c83a76b0SSuyog Pawar 79*c83a76b0SSuyog Pawar /** 80*c83a76b0SSuyog Pawar ******************************************************************************* 81*c83a76b0SSuyog Pawar @brief bin count to bit count conversion 82*c83a76b0SSuyog Pawar ******************************************************************************* 83*c83a76b0SSuyog Pawar */ 84*c83a76b0SSuyog Pawar #define HME_GET_CAB_BIT(x) (U08(((x)*HME_CABAC_BITS_PER_BIN + 0.5))) 85*c83a76b0SSuyog Pawar 86*c83a76b0SSuyog Pawar /** 87*c83a76b0SSuyog Pawar ******************************************************************************* 88*c83a76b0SSuyog Pawar @brief Columns in the MV grid 89*c83a76b0SSuyog Pawar ******************************************************************************* 90*c83a76b0SSuyog Pawar */ 91*c83a76b0SSuyog Pawar #define NUM_COLUMNS_IN_CTB_GRID (((CTB_BLK_SIZE) >> 2) + (2 * CTB_MV_GRID_PAD)) 92*c83a76b0SSuyog Pawar 93*c83a76b0SSuyog Pawar /** 94*c83a76b0SSuyog Pawar ******************************************************************************* 95*c83a76b0SSuyog Pawar @brief Rows in MV grid 96*c83a76b0SSuyog Pawar ******************************************************************************* 97*c83a76b0SSuyog Pawar */ 98*c83a76b0SSuyog Pawar #define NUM_ROWS_IN_CTB_GRID (NUM_COLUMNS_IN_CTB_GRID) 99*c83a76b0SSuyog Pawar 100*c83a76b0SSuyog Pawar /** 101*c83a76b0SSuyog Pawar ******************************************************************************* 102*c83a76b0SSuyog Pawar @brief Total number of MVs held in CTB grid for prediction pourposes 103*c83a76b0SSuyog Pawar ******************************************************************************* 104*c83a76b0SSuyog Pawar */ 105*c83a76b0SSuyog Pawar #define NUM_MVS_IN_CTB_GRID ((NUM_COLUMNS_IN_CTB_GRID) * (NUM_ROWS_IN_CTB_GRID)) 106*c83a76b0SSuyog Pawar 107*c83a76b0SSuyog Pawar /** 108*c83a76b0SSuyog Pawar ******************************************************************************* 109*c83a76b0SSuyog Pawar @brief Max number of candidates used for refinement during CU merge stage 110*c83a76b0SSuyog Pawar ******************************************************************************* 111*c83a76b0SSuyog Pawar */ 112*c83a76b0SSuyog Pawar #define MAX_MERGE_CANDTS 64 113*c83a76b0SSuyog Pawar 114*c83a76b0SSuyog Pawar /** 115*c83a76b0SSuyog Pawar ******************************************************************************* 116*c83a76b0SSuyog Pawar @brief For BIDIR refinement, we use 2I-P0 as input, done max at CTB level, so 117*c83a76b0SSuyog Pawar stride for this input is 64 118*c83a76b0SSuyog Pawar ******************************************************************************* 119*c83a76b0SSuyog Pawar */ 120*c83a76b0SSuyog Pawar #define BACK_PREDICTION_INPUT_STRIDE 64 121*c83a76b0SSuyog Pawar 122*c83a76b0SSuyog Pawar /** 123*c83a76b0SSuyog Pawar ******************************************************************************* 124*c83a76b0SSuyog Pawar @brief We basically store an impossible and unique MV to identify intra blks 125*c83a76b0SSuyog Pawar or CUs 126*c83a76b0SSuyog Pawar ******************************************************************************* 127*c83a76b0SSuyog Pawar */ 128*c83a76b0SSuyog Pawar #define INTRA_MV 0x4000 129*c83a76b0SSuyog Pawar 130*c83a76b0SSuyog Pawar /** 131*c83a76b0SSuyog Pawar ******************************************************************************* 132*c83a76b0SSuyog Pawar @brief Defines the largest CTB supported by HME 133*c83a76b0SSuyog Pawar ******************************************************************************* 134*c83a76b0SSuyog Pawar */ 135*c83a76b0SSuyog Pawar #define HME_MAX_CTB_SIZE 64 136*c83a76b0SSuyog Pawar 137*c83a76b0SSuyog Pawar /** 138*c83a76b0SSuyog Pawar ******************************************************************************* 139*c83a76b0SSuyog Pawar @brief Maximum number of 16x16 blks possible in a CTB. The basic search unit 140*c83a76b0SSuyog Pawar in the encode layer is 16x16 141*c83a76b0SSuyog Pawar ******************************************************************************* 142*c83a76b0SSuyog Pawar */ 143*c83a76b0SSuyog Pawar #define HME_MAX_16x16_IN_CTB ((HME_MAX_CTB_SIZE >> 4) * (HME_MAX_CTB_SIZE >> 4)) 144*c83a76b0SSuyog Pawar 145*c83a76b0SSuyog Pawar /** 146*c83a76b0SSuyog Pawar ******************************************************************************* 147*c83a76b0SSuyog Pawar @brief Max number of 8x8s possible in a CTB, this in other words is also the 148*c83a76b0SSuyog Pawar maximum number of CUs possible in a CTB 149*c83a76b0SSuyog Pawar ******************************************************************************* 150*c83a76b0SSuyog Pawar */ 151*c83a76b0SSuyog Pawar #define HME_MAX_8x8_IN_CTB ((HME_MAX_CTB_SIZE >> 3) * (HME_MAX_CTB_SIZE >> 3)) 152*c83a76b0SSuyog Pawar 153*c83a76b0SSuyog Pawar /** 154*c83a76b0SSuyog Pawar ******************************************************************************* 155*c83a76b0SSuyog Pawar @brief Maximum number of init candts supported for refinement search. 156*c83a76b0SSuyog Pawar ******************************************************************************* 157*c83a76b0SSuyog Pawar */ 158*c83a76b0SSuyog Pawar #define MAX_INIT_CANDTS 60 159*c83a76b0SSuyog Pawar 160*c83a76b0SSuyog Pawar /** 161*c83a76b0SSuyog Pawar ******************************************************************************* 162*c83a76b0SSuyog Pawar @brief Maximum MV in X and Y directions in fullpel units allowed in any layer 163*c83a76b0SSuyog Pawar Any computed range for MV hasto be within this 164*c83a76b0SSuyog Pawar ******************************************************************************* 165*c83a76b0SSuyog Pawar */ 166*c83a76b0SSuyog Pawar #define MAX_MV_X_FINEST 1024 167*c83a76b0SSuyog Pawar #define MAX_MV_Y_FINEST 512 168*c83a76b0SSuyog Pawar 169*c83a76b0SSuyog Pawar #define MAX_NUM_RESULTS 10 170*c83a76b0SSuyog Pawar 171*c83a76b0SSuyog Pawar #define USE_MODIFIED 1 172*c83a76b0SSuyog Pawar 173*c83a76b0SSuyog Pawar #define ENABLE_EXPLICIT_SEARCH_IN_P_IN_L0 1 174*c83a76b0SSuyog Pawar 175*c83a76b0SSuyog Pawar #define ENABLE_EXPLICIT_SEARCH_IN_PQ 0 176*c83a76b0SSuyog Pawar 177*c83a76b0SSuyog Pawar /** 178*c83a76b0SSuyog Pawar ******************************************************************************* 179*c83a76b0SSuyog Pawar @brief Driven by reasoning that we can tolerate an error of 4 in global mv 180*c83a76b0SSuyog Pawar in coarsest layer per comp, assuming we have search range of 1024x512, the mv 181*c83a76b0SSuyog Pawar range in coarse layer is 128x64, total bins is then 256/4 x 128/4 or 2K bins 182*c83a76b0SSuyog Pawar ******************************************************************************* 183*c83a76b0SSuyog Pawar */ 184*c83a76b0SSuyog Pawar #define LOG_MAX_NUM_BINS 11 185*c83a76b0SSuyog Pawar #define MAX_NUM_BINS (1 << LOG_MAX_NUM_BINS) 186*c83a76b0SSuyog Pawar 187*c83a76b0SSuyog Pawar #define NEXT_BLOCK_OFFSET_IN_L0_ME 22 188*c83a76b0SSuyog Pawar 189*c83a76b0SSuyog Pawar #define PREV_BLOCK_OFFSET_IN_L0_ME 6 190*c83a76b0SSuyog Pawar 191*c83a76b0SSuyog Pawar #define COLOCATED_BLOCK_OFFSET 2 192*c83a76b0SSuyog Pawar 193*c83a76b0SSuyog Pawar #define COLOCATED_4X4_NEXT_BLOCK_OFFSET 14 194*c83a76b0SSuyog Pawar 195*c83a76b0SSuyog Pawar #define MAP_X_MAX 16 196*c83a76b0SSuyog Pawar 197*c83a76b0SSuyog Pawar #define MAP_Y_MAX 16 198*c83a76b0SSuyog Pawar 199*c83a76b0SSuyog Pawar #define NUM_POINTS_IN_RECTANGULAR_GRID 9 200*c83a76b0SSuyog Pawar 201*c83a76b0SSuyog Pawar /* 202*c83a76b0SSuyog Pawar ****************************************************************************** 203*c83a76b0SSuyog Pawar @brief Maximum number of elements in the sigmaX and sigmaX-Square array 204*c83a76b0SSuyog Pawar computed at 4x4 level for any CU size 205*c83a76b0SSuyog Pawar ****************************************************************************** 206*c83a76b0SSuyog Pawar */ 207*c83a76b0SSuyog Pawar #define MAX_NUM_SIGMAS_4x4 256 208*c83a76b0SSuyog Pawar 209*c83a76b0SSuyog Pawar /*****************************************************************************/ 210*c83a76b0SSuyog Pawar /* Function Macros */ 211*c83a76b0SSuyog Pawar /*****************************************************************************/ 212*c83a76b0SSuyog Pawar 213*c83a76b0SSuyog Pawar /** 214*c83a76b0SSuyog Pawar ******************************************************************************* 215*c83a76b0SSuyog Pawar @brief Calculates number of blks in picture, given width, ht, and a variable 216*c83a76b0SSuyog Pawar shift that controls basic blk size 217*c83a76b0SSuyog Pawar ******************************************************************************* 218*c83a76b0SSuyog Pawar */ 219*c83a76b0SSuyog Pawar #define GET_NUM_BLKS_IN_PIC(wd, ht, shift, num_cols, num_blks) \ 220*c83a76b0SSuyog Pawar { \ 221*c83a76b0SSuyog Pawar S32 y, rnd; \ 222*c83a76b0SSuyog Pawar rnd = (1 << shift) - 1; \ 223*c83a76b0SSuyog Pawar num_cols = (wd + rnd) >> shift; \ 224*c83a76b0SSuyog Pawar y = (ht + rnd) >> shift; \ 225*c83a76b0SSuyog Pawar num_blks = num_cols * y; \ 226*c83a76b0SSuyog Pawar } 227*c83a76b0SSuyog Pawar 228*c83a76b0SSuyog Pawar #define COUNT_CANDS(a, b) \ 229*c83a76b0SSuyog Pawar { \ 230*c83a76b0SSuyog Pawar b = (((a) & (1))) + (((a >> 1) & (1))) + (((a >> 2) & (1))) + (((a >> 3) & (1))) + \ 231*c83a76b0SSuyog Pawar (((a >> 4) & (1))) + (((a >> 5) & (1))) + (((a >> 6) & (1))) + (((a >> 7) & (1))) + \ 232*c83a76b0SSuyog Pawar (((a >> 8) & (1))); \ 233*c83a76b0SSuyog Pawar } 234*c83a76b0SSuyog Pawar 235*c83a76b0SSuyog Pawar #define COPY_MV_TO_SEARCH_NODE(node, mv, pref, refid, shift) \ 236*c83a76b0SSuyog Pawar { \ 237*c83a76b0SSuyog Pawar (node)->s_mv.i2_mvx = (mv)->i2_mv_x; \ 238*c83a76b0SSuyog Pawar (node)->s_mv.i2_mvy = (mv)->i2_mv_y; \ 239*c83a76b0SSuyog Pawar (node)->i1_ref_idx = *pref; \ 240*c83a76b0SSuyog Pawar (node)->u1_is_avail = 1; \ 241*c83a76b0SSuyog Pawar \ 242*c83a76b0SSuyog Pawar /* Can set the availability flag for MV Pred purposes */ \ 243*c83a76b0SSuyog Pawar if(((node)->i1_ref_idx < 0) || ((node)->s_mv.i2_mvx == INTRA_MV)) \ 244*c83a76b0SSuyog Pawar { \ 245*c83a76b0SSuyog Pawar (node)->u1_is_avail = 0; \ 246*c83a76b0SSuyog Pawar (node)->i1_ref_idx = refid; \ 247*c83a76b0SSuyog Pawar (node)->s_mv.i2_mvx = 0; \ 248*c83a76b0SSuyog Pawar (node)->s_mv.i2_mvy = 0; \ 249*c83a76b0SSuyog Pawar } \ 250*c83a76b0SSuyog Pawar (node)->s_mv.i2_mvx >>= (shift); \ 251*c83a76b0SSuyog Pawar (node)->s_mv.i2_mvy >>= (shift); \ 252*c83a76b0SSuyog Pawar (node)->u1_subpel_done = (shift) ? 0 : 1; \ 253*c83a76b0SSuyog Pawar } 254*c83a76b0SSuyog Pawar 255*c83a76b0SSuyog Pawar #define COMPUTE_MVD(ps_mv, ps_data, cumulative_mv_distance) \ 256*c83a76b0SSuyog Pawar { \ 257*c83a76b0SSuyog Pawar S32 mvx_q8 = (ps_mv)->mvx << 8; \ 258*c83a76b0SSuyog Pawar S32 mvy_q8 = (ps_mv)->mvy << 8; \ 259*c83a76b0SSuyog Pawar S32 mvcx_q8 = (ps_data)->s_centroid.i4_pos_x_q8; \ 260*c83a76b0SSuyog Pawar S32 mvcy_q8 = (ps_data)->s_centroid.i4_pos_y_q8; \ 261*c83a76b0SSuyog Pawar \ 262*c83a76b0SSuyog Pawar S32 mvdx_q8 = mvx_q8 - mvcx_q8; \ 263*c83a76b0SSuyog Pawar S32 mvdy_q8 = mvy_q8 - mvcy_q8; \ 264*c83a76b0SSuyog Pawar \ 265*c83a76b0SSuyog Pawar S32 mvdx = (mvdx_q8 + (1 << 7)) >> 8; \ 266*c83a76b0SSuyog Pawar S32 mvdy = (mvdy_q8 + (1 << 7)) >> 8; \ 267*c83a76b0SSuyog Pawar \ 268*c83a76b0SSuyog Pawar S32 mvd = ABS(mvdx) + ABS(mvdy); \ 269*c83a76b0SSuyog Pawar \ 270*c83a76b0SSuyog Pawar cumulative_mv_distance += mvd; \ 271*c83a76b0SSuyog Pawar } 272*c83a76b0SSuyog Pawar 273*c83a76b0SSuyog Pawar #define STATS_COLLECTOR_MV_INSERT( \ 274*c83a76b0SSuyog Pawar ps_mv_store, num_mvs_stored, mvx_cur, mvy_cur, stats_struct, check_for_duplicate, ref_idx) \ 275*c83a76b0SSuyog Pawar { \ 276*c83a76b0SSuyog Pawar S32 i4_j; \ 277*c83a76b0SSuyog Pawar (stats_struct).f_num_cands_being_processed++; \ 278*c83a76b0SSuyog Pawar check_for_duplicate = 0; \ 279*c83a76b0SSuyog Pawar \ 280*c83a76b0SSuyog Pawar for(i4_j = 0; i4_j < (num_mvs_stored); i4_j++) \ 281*c83a76b0SSuyog Pawar { \ 282*c83a76b0SSuyog Pawar if(((ps_mv_store)[i4_j].s_mv.i2_mvx == (mvx_cur)) && \ 283*c83a76b0SSuyog Pawar ((ps_mv_store)[i4_j].s_mv.i2_mvy == (mvy_cur)) && \ 284*c83a76b0SSuyog Pawar ((ps_mv_store)[i4_j].i1_ref_idx == ref_idx)) \ 285*c83a76b0SSuyog Pawar { \ 286*c83a76b0SSuyog Pawar (stats_struct).f_num_duplicates_amongst_processed++; \ 287*c83a76b0SSuyog Pawar check_for_duplicate = 0; \ 288*c83a76b0SSuyog Pawar break; \ 289*c83a76b0SSuyog Pawar } \ 290*c83a76b0SSuyog Pawar } \ 291*c83a76b0SSuyog Pawar \ 292*c83a76b0SSuyog Pawar if(i4_j == (num_mvs_stored)) \ 293*c83a76b0SSuyog Pawar { \ 294*c83a76b0SSuyog Pawar (ps_mv_store)[i4_j].s_mv.i2_mvx = (mvx_cur); \ 295*c83a76b0SSuyog Pawar (ps_mv_store)[i4_j].s_mv.i2_mvy = (mvy_cur); \ 296*c83a76b0SSuyog Pawar (ps_mv_store)[i4_j].i1_ref_idx = ref_idx; \ 297*c83a76b0SSuyog Pawar (num_mvs_stored)++; \ 298*c83a76b0SSuyog Pawar } \ 299*c83a76b0SSuyog Pawar } 300*c83a76b0SSuyog Pawar 301*c83a76b0SSuyog Pawar #define UPDATE_CLUSTER_METADATA_POST_MERGE(ps_cluster) \ 302*c83a76b0SSuyog Pawar { \ 303*c83a76b0SSuyog Pawar S32 m; \ 304*c83a76b0SSuyog Pawar \ 305*c83a76b0SSuyog Pawar S32 num_clusters_evaluated = 0; \ 306*c83a76b0SSuyog Pawar \ 307*c83a76b0SSuyog Pawar for(m = 0; num_clusters_evaluated < (ps_cluster)->num_clusters; m++) \ 308*c83a76b0SSuyog Pawar { \ 309*c83a76b0SSuyog Pawar if(!((ps_cluster)->as_cluster_data[m].is_valid_cluster)) \ 310*c83a76b0SSuyog Pawar { \ 311*c83a76b0SSuyog Pawar if(-1 != (ps_cluster)->as_cluster_data[m].ref_id) \ 312*c83a76b0SSuyog Pawar { \ 313*c83a76b0SSuyog Pawar (ps_cluster)->au1_num_clusters[(ps_cluster)->as_cluster_data[m].ref_id]--; \ 314*c83a76b0SSuyog Pawar } \ 315*c83a76b0SSuyog Pawar } \ 316*c83a76b0SSuyog Pawar else \ 317*c83a76b0SSuyog Pawar { \ 318*c83a76b0SSuyog Pawar num_clusters_evaluated++; \ 319*c83a76b0SSuyog Pawar } \ 320*c83a76b0SSuyog Pawar } \ 321*c83a76b0SSuyog Pawar } 322*c83a76b0SSuyog Pawar 323*c83a76b0SSuyog Pawar #define SET_VALUES_FOR_TOP_REF_IDS(ps_cluster_blk, best_uni_ref, best_alt_ref, num_ref) \ 324*c83a76b0SSuyog Pawar { \ 325*c83a76b0SSuyog Pawar ps_cluster_blk->best_uni_ref = best_uni_ref; \ 326*c83a76b0SSuyog Pawar ps_cluster_blk->best_alt_ref = best_alt_ref; \ 327*c83a76b0SSuyog Pawar ps_cluster_blk->num_refs = num_ref; \ 328*c83a76b0SSuyog Pawar } 329*c83a76b0SSuyog Pawar 330*c83a76b0SSuyog Pawar #define MAP_X_MAX 16 331*c83a76b0SSuyog Pawar #define MAP_Y_MAX 16 332*c83a76b0SSuyog Pawar 333*c83a76b0SSuyog Pawar #define CHECK_FOR_DUPES_AND_INSERT_UNIQUE_NODES( \ 334*c83a76b0SSuyog Pawar ps_dedup_enabler, num_cands, mvx, mvy, check_for_duplicate) \ 335*c83a76b0SSuyog Pawar { \ 336*c83a76b0SSuyog Pawar S32 center_mvx; \ 337*c83a76b0SSuyog Pawar S32 center_mvy; \ 338*c83a76b0SSuyog Pawar S32 mvdx; \ 339*c83a76b0SSuyog Pawar S32 mvdy; \ 340*c83a76b0SSuyog Pawar U32 *pu4_node_map; \ 341*c83a76b0SSuyog Pawar S32 columnar_presence; \ 342*c83a76b0SSuyog Pawar \ 343*c83a76b0SSuyog Pawar (check_for_duplicate) = 0; \ 344*c83a76b0SSuyog Pawar { \ 345*c83a76b0SSuyog Pawar subpel_dedup_enabler_t *ps_dedup = &(ps_dedup_enabler)[0]; \ 346*c83a76b0SSuyog Pawar center_mvx = ps_dedup->i2_mv_x; \ 347*c83a76b0SSuyog Pawar center_mvy = ps_dedup->i2_mv_y; \ 348*c83a76b0SSuyog Pawar pu4_node_map = ps_dedup->au4_node_map; \ 349*c83a76b0SSuyog Pawar \ 350*c83a76b0SSuyog Pawar mvdx = (mvx)-center_mvx; \ 351*c83a76b0SSuyog Pawar mvdy = (mvy)-center_mvy; \ 352*c83a76b0SSuyog Pawar \ 353*c83a76b0SSuyog Pawar if(((mvdx < MAP_X_MAX) && (mvdx >= -MAP_X_MAX)) && \ 354*c83a76b0SSuyog Pawar ((mvdy < MAP_Y_MAX) && (mvdy >= -MAP_Y_MAX))) \ 355*c83a76b0SSuyog Pawar { \ 356*c83a76b0SSuyog Pawar columnar_presence = pu4_node_map[MAP_X_MAX + mvdx]; \ 357*c83a76b0SSuyog Pawar \ 358*c83a76b0SSuyog Pawar if(0 == (columnar_presence & (1U << (MAP_Y_MAX + mvdy)))) \ 359*c83a76b0SSuyog Pawar { \ 360*c83a76b0SSuyog Pawar columnar_presence |= (1U << (MAP_Y_MAX + mvdy)); \ 361*c83a76b0SSuyog Pawar pu4_node_map[MAP_X_MAX + mvdx] = columnar_presence; \ 362*c83a76b0SSuyog Pawar } \ 363*c83a76b0SSuyog Pawar else \ 364*c83a76b0SSuyog Pawar { \ 365*c83a76b0SSuyog Pawar (check_for_duplicate) = 1; \ 366*c83a76b0SSuyog Pawar } \ 367*c83a76b0SSuyog Pawar } \ 368*c83a76b0SSuyog Pawar } \ 369*c83a76b0SSuyog Pawar } 370*c83a76b0SSuyog Pawar 371*c83a76b0SSuyog Pawar #define BUMP_OUTLIER_CLUSTERS(ps_cluster_blk, sdi_threshold) \ 372*c83a76b0SSuyog Pawar { \ 373*c83a76b0SSuyog Pawar outlier_data_t as_outliers[MAX_NUM_CLUSTERS_64x64 + 1]; \ 374*c83a76b0SSuyog Pawar \ 375*c83a76b0SSuyog Pawar S32 j, k; \ 376*c83a76b0SSuyog Pawar \ 377*c83a76b0SSuyog Pawar S32 num_clusters_evaluated = 0; \ 378*c83a76b0SSuyog Pawar S32 num_clusters = ps_cluster_blk->num_clusters; \ 379*c83a76b0SSuyog Pawar S32 num_outliers_present = 0; \ 380*c83a76b0SSuyog Pawar \ 381*c83a76b0SSuyog Pawar for(j = 0; num_clusters_evaluated < num_clusters; j++) \ 382*c83a76b0SSuyog Pawar { \ 383*c83a76b0SSuyog Pawar cluster_data_t *ps_data = &ps_cluster_blk->as_cluster_data[j]; \ 384*c83a76b0SSuyog Pawar \ 385*c83a76b0SSuyog Pawar if(!ps_data->is_valid_cluster) \ 386*c83a76b0SSuyog Pawar { \ 387*c83a76b0SSuyog Pawar continue; \ 388*c83a76b0SSuyog Pawar } \ 389*c83a76b0SSuyog Pawar \ 390*c83a76b0SSuyog Pawar num_clusters_evaluated++; \ 391*c83a76b0SSuyog Pawar \ 392*c83a76b0SSuyog Pawar if((ps_data->num_mvs == 1) && (ps_data->as_mv[0].sdi < sdi_threshold) && \ 393*c83a76b0SSuyog Pawar (ps_cluster_blk->au1_num_clusters[ps_data->ref_id] > \ 394*c83a76b0SSuyog Pawar MAX_NUM_CLUSTERS_IN_ONE_REF_IDX)) \ 395*c83a76b0SSuyog Pawar { \ 396*c83a76b0SSuyog Pawar as_outliers[num_outliers_present].cluster_id = j; \ 397*c83a76b0SSuyog Pawar as_outliers[num_outliers_present].ref_idx = ps_data->ref_id; \ 398*c83a76b0SSuyog Pawar as_outliers[num_outliers_present].sdi = ps_data->as_mv[0].sdi; \ 399*c83a76b0SSuyog Pawar num_outliers_present++; \ 400*c83a76b0SSuyog Pawar } \ 401*c83a76b0SSuyog Pawar } \ 402*c83a76b0SSuyog Pawar \ 403*c83a76b0SSuyog Pawar for(j = 0; j < (num_outliers_present - 1); j++) \ 404*c83a76b0SSuyog Pawar { \ 405*c83a76b0SSuyog Pawar for(k = (j + 1); k < num_outliers_present; k++) \ 406*c83a76b0SSuyog Pawar { \ 407*c83a76b0SSuyog Pawar if(as_outliers[j].sdi > as_outliers[k].sdi) \ 408*c83a76b0SSuyog Pawar { \ 409*c83a76b0SSuyog Pawar as_outliers[MAX_NUM_CLUSTERS_64x64] = as_outliers[j]; \ 410*c83a76b0SSuyog Pawar as_outliers[j] = as_outliers[k]; \ 411*c83a76b0SSuyog Pawar as_outliers[k] = as_outliers[MAX_NUM_CLUSTERS_64x64]; \ 412*c83a76b0SSuyog Pawar } \ 413*c83a76b0SSuyog Pawar } \ 414*c83a76b0SSuyog Pawar } \ 415*c83a76b0SSuyog Pawar \ 416*c83a76b0SSuyog Pawar for(j = 0; j < (num_outliers_present); j++) \ 417*c83a76b0SSuyog Pawar { \ 418*c83a76b0SSuyog Pawar S32 ref_idx = as_outliers[j].ref_idx; \ 419*c83a76b0SSuyog Pawar \ 420*c83a76b0SSuyog Pawar if((ps_cluster_blk->au1_num_clusters[ref_idx] > MAX_NUM_CLUSTERS_IN_ONE_REF_IDX)) \ 421*c83a76b0SSuyog Pawar { \ 422*c83a76b0SSuyog Pawar ps_cluster_blk->as_cluster_data[as_outliers[j].cluster_id].is_valid_cluster = 0; \ 423*c83a76b0SSuyog Pawar ps_cluster_blk->num_clusters--; \ 424*c83a76b0SSuyog Pawar ps_cluster_blk->au1_num_clusters[ref_idx]--; \ 425*c83a76b0SSuyog Pawar } \ 426*c83a76b0SSuyog Pawar } \ 427*c83a76b0SSuyog Pawar } 428*c83a76b0SSuyog Pawar 429*c83a76b0SSuyog Pawar #define ADD_CLUSTER_CENTROID_AS_CANDS_FOR_BLK_MERGE( \ 430*c83a76b0SSuyog Pawar ps_cluster_data, ps_range_prms, ps_list, ps_mv, is_ref_in_l0, ref_idx) \ 431*c83a76b0SSuyog Pawar { \ 432*c83a76b0SSuyog Pawar ps_list = &(ps_cluster_data)->as_mv_list[!(is_ref_in_l0)][(ref_idx)]; \ 433*c83a76b0SSuyog Pawar ps_mv = &ps_list->as_mv[ps_list->num_mvs]; \ 434*c83a76b0SSuyog Pawar \ 435*c83a76b0SSuyog Pawar ps_mv->i2_mvx = (ps_centroid->i4_pos_x_q8 + (1 << 7)) >> 8; \ 436*c83a76b0SSuyog Pawar ps_mv->i2_mvy = (ps_centroid->i4_pos_y_q8 + (1 << 7)) >> 8; \ 437*c83a76b0SSuyog Pawar \ 438*c83a76b0SSuyog Pawar CLIP_MV_WITHIN_RANGE(ps_mv->i2_mvx, ps_mv->i2_mvy, (ps_range_prms), 0, 0, 0); \ 439*c83a76b0SSuyog Pawar \ 440*c83a76b0SSuyog Pawar ps_cluster_data->ai4_ref_id_valid[!(is_ref_in_l0)][(ref_idx)] = 1; \ 441*c83a76b0SSuyog Pawar \ 442*c83a76b0SSuyog Pawar ps_list->num_mvs++; \ 443*c83a76b0SSuyog Pawar } 444*c83a76b0SSuyog Pawar 445*c83a76b0SSuyog Pawar #define COPY_SEARCH_CANDIDATE_DATA(node, mv, pref, refid, shift) \ 446*c83a76b0SSuyog Pawar { \ 447*c83a76b0SSuyog Pawar (node)->ps_mv->i2_mvx = (mv)->i2_mv_x; \ 448*c83a76b0SSuyog Pawar (node)->ps_mv->i2_mvy = (mv)->i2_mv_y; \ 449*c83a76b0SSuyog Pawar (node)->i1_ref_idx = *pref; \ 450*c83a76b0SSuyog Pawar (node)->u1_is_avail = 1; \ 451*c83a76b0SSuyog Pawar \ 452*c83a76b0SSuyog Pawar /* Can set the availability flag for MV Pred purposes */ \ 453*c83a76b0SSuyog Pawar if(((node)->i1_ref_idx < 0) || ((node)->ps_mv->i2_mvx == INTRA_MV)) \ 454*c83a76b0SSuyog Pawar { \ 455*c83a76b0SSuyog Pawar (node)->u1_is_avail = 0; \ 456*c83a76b0SSuyog Pawar (node)->i1_ref_idx = refid; \ 457*c83a76b0SSuyog Pawar (node)->ps_mv->i2_mvx = 0; \ 458*c83a76b0SSuyog Pawar (node)->ps_mv->i2_mvy = 0; \ 459*c83a76b0SSuyog Pawar } \ 460*c83a76b0SSuyog Pawar (node)->ps_mv->i2_mvx >>= (shift); \ 461*c83a76b0SSuyog Pawar (node)->ps_mv->i2_mvy >>= (shift); \ 462*c83a76b0SSuyog Pawar (node)->u1_subpel_done = (shift) ? 0 : 1; \ 463*c83a76b0SSuyog Pawar } 464*c83a76b0SSuyog Pawar /** 465*c83a76b0SSuyog Pawar ******************************************************************************* 466*c83a76b0SSuyog Pawar * @macro MIN_NODE 467*c83a76b0SSuyog Pawar * @brief Returns the search node with lesser cost 468*c83a76b0SSuyog Pawar ******************************************************************************* 469*c83a76b0SSuyog Pawar */ 470*c83a76b0SSuyog Pawar #define MIN_NODE(a, b) (((a)->i4_tot_cost < (b)->i4_tot_cost) ? (a) : (b)) 471*c83a76b0SSuyog Pawar 472*c83a76b0SSuyog Pawar /** 473*c83a76b0SSuyog Pawar ******************************************************************************* 474*c83a76b0SSuyog Pawar * @macro MAX_NODE 475*c83a76b0SSuyog Pawar * @brief Returns search node with higher cost 476*c83a76b0SSuyog Pawar ******************************************************************************* 477*c83a76b0SSuyog Pawar */ 478*c83a76b0SSuyog Pawar #define MAX_NODE(a, b) (((a)->i4_tot_cost >= (b)->i4_tot_cost) ? (a) : (b)) 479*c83a76b0SSuyog Pawar 480*c83a76b0SSuyog Pawar /** 481*c83a76b0SSuyog Pawar ****************************************************************************** 482*c83a76b0SSuyog Pawar * @macro HME_INV_WT_PRED 483*c83a76b0SSuyog Pawar * @brief Implements inverse of wt pred formula. Actual wt pred formula is 484*c83a76b0SSuyog Pawar * ((input * wt) + rnd) >> shift) + offset 485*c83a76b0SSuyog Pawar ****************************************************************************** 486*c83a76b0SSuyog Pawar */ 487*c83a76b0SSuyog Pawar #define HME_INV_WT_PRED(inp, wt, off, shift) (((((inp) - (off)) << (shift)) + ((wt) >> 1)) / (wt)) 488*c83a76b0SSuyog Pawar #define HME_INV_WT_PRED1(inp, wt, off, shift) \ 489*c83a76b0SSuyog Pawar (((((inp) - (off)) << (shift)) * wt + (1 << 14)) >> 15) 490*c83a76b0SSuyog Pawar 491*c83a76b0SSuyog Pawar /** 492*c83a76b0SSuyog Pawar ****************************************************************************** 493*c83a76b0SSuyog Pawar * @macro HME_WT_PRED 494*c83a76b0SSuyog Pawar * @brief Implements wt pred formula as per spec 495*c83a76b0SSuyog Pawar ****************************************************************************** 496*c83a76b0SSuyog Pawar */ 497*c83a76b0SSuyog Pawar #define HME_WT_PRED(p0, p1, w0, w1, rnd, shift) \ 498*c83a76b0SSuyog Pawar (((((S32)w0) * ((S32)p0) + ((S32)w1) * ((S32)p1)) >> shift) + rnd) 499*c83a76b0SSuyog Pawar 500*c83a76b0SSuyog Pawar /** 501*c83a76b0SSuyog Pawar ****************************************************************************** 502*c83a76b0SSuyog Pawar * @macro PREFETCH_BLK 503*c83a76b0SSuyog Pawar * @brief Prefetches a block of data into cahce before hand 504*c83a76b0SSuyog Pawar ****************************************************************************** 505*c83a76b0SSuyog Pawar */ 506*c83a76b0SSuyog Pawar 507*c83a76b0SSuyog Pawar /** 508*c83a76b0SSuyog Pawar ****************************************************************************** 509*c83a76b0SSuyog Pawar * @macro INSERT_NEW_NODE 510*c83a76b0SSuyog Pawar * @brief Inserts a new search node in a list if it is unique; helps in 511*c83a76b0SSuyog Pawar removing duplicate nodes/candidates 512*c83a76b0SSuyog Pawar ****************************************************************************** 513*c83a76b0SSuyog Pawar */ 514*c83a76b0SSuyog Pawar #define PREFETCH_BLK(pu1_src, src_stride, lines, type) \ 515*c83a76b0SSuyog Pawar { \ 516*c83a76b0SSuyog Pawar WORD32 ctr; \ 517*c83a76b0SSuyog Pawar for(ctr = 0; ctr < lines; ctr++) \ 518*c83a76b0SSuyog Pawar { \ 519*c83a76b0SSuyog Pawar PREFETCH((char const *)pu1_src, type); \ 520*c83a76b0SSuyog Pawar pu1_src += src_stride; \ 521*c83a76b0SSuyog Pawar } \ 522*c83a76b0SSuyog Pawar } 523*c83a76b0SSuyog Pawar 524*c83a76b0SSuyog Pawar #define INSERT_UNIQUE_NODE( \ 525*c83a76b0SSuyog Pawar as_nodes, num_nodes, new_node, au4_map, center_x, center_y, use_hashing) \ 526*c83a76b0SSuyog Pawar { \ 527*c83a76b0SSuyog Pawar WORD32 k; \ 528*c83a76b0SSuyog Pawar UWORD32 map; \ 529*c83a76b0SSuyog Pawar WORD32 delta_x, delta_y; \ 530*c83a76b0SSuyog Pawar delta_x = (new_node).ps_mv->i2_mvx - (center_x); \ 531*c83a76b0SSuyog Pawar delta_y = (new_node).ps_mv->i2_mvy - (center_y); \ 532*c83a76b0SSuyog Pawar map = 0; \ 533*c83a76b0SSuyog Pawar \ 534*c83a76b0SSuyog Pawar if((use_hashing) && (delta_x < MAP_X_MAX) && (delta_x >= (-MAP_X_MAX)) && \ 535*c83a76b0SSuyog Pawar (delta_y < MAP_Y_MAX) && (delta_y >= (-MAP_Y_MAX))) \ 536*c83a76b0SSuyog Pawar { \ 537*c83a76b0SSuyog Pawar map = (au4_map)[delta_x + MAP_X_MAX]; \ 538*c83a76b0SSuyog Pawar if(0 == (map & (1U << (delta_y + MAP_Y_MAX)))) \ 539*c83a76b0SSuyog Pawar { \ 540*c83a76b0SSuyog Pawar (new_node).s_mv = (new_node).ps_mv[0]; \ 541*c83a76b0SSuyog Pawar (as_nodes)[(num_nodes)] = (new_node); \ 542*c83a76b0SSuyog Pawar ((num_nodes))++; \ 543*c83a76b0SSuyog Pawar map |= 1U << (delta_y + MAP_Y_MAX); \ 544*c83a76b0SSuyog Pawar (au4_map)[delta_x + MAP_X_MAX] = map; \ 545*c83a76b0SSuyog Pawar } \ 546*c83a76b0SSuyog Pawar } \ 547*c83a76b0SSuyog Pawar else \ 548*c83a76b0SSuyog Pawar { \ 549*c83a76b0SSuyog Pawar for(k = 0; k < ((num_nodes)); k++) \ 550*c83a76b0SSuyog Pawar { \ 551*c83a76b0SSuyog Pawar /* Search is this node is already present in unique list */ \ 552*c83a76b0SSuyog Pawar if(((as_nodes)[k].s_mv.i2_mvx == (new_node).ps_mv->i2_mvx) && \ 553*c83a76b0SSuyog Pawar ((as_nodes)[k].s_mv.i2_mvy == (new_node).ps_mv->i2_mvy) && \ 554*c83a76b0SSuyog Pawar ((as_nodes)[k].i1_ref_idx == (new_node).i1_ref_idx)) \ 555*c83a76b0SSuyog Pawar { \ 556*c83a76b0SSuyog Pawar /* This is duplicate node; need not be inserted */ \ 557*c83a76b0SSuyog Pawar break; \ 558*c83a76b0SSuyog Pawar } \ 559*c83a76b0SSuyog Pawar } \ 560*c83a76b0SSuyog Pawar if(k == ((num_nodes))) \ 561*c83a76b0SSuyog Pawar { \ 562*c83a76b0SSuyog Pawar /* Insert new node only if it is not duplicate node */ \ 563*c83a76b0SSuyog Pawar (new_node).s_mv = (new_node).ps_mv[0]; \ 564*c83a76b0SSuyog Pawar (as_nodes)[k] = (new_node); \ 565*c83a76b0SSuyog Pawar ((num_nodes))++; \ 566*c83a76b0SSuyog Pawar } \ 567*c83a76b0SSuyog Pawar } \ 568*c83a76b0SSuyog Pawar } 569*c83a76b0SSuyog Pawar 570*c83a76b0SSuyog Pawar /** 571*c83a76b0SSuyog Pawar ****************************************************************************** 572*c83a76b0SSuyog Pawar * @macro INSERT_NEW_NODE 573*c83a76b0SSuyog Pawar * @brief Inserts a new search node in a list if it is unique; helps in 574*c83a76b0SSuyog Pawar removing duplicate nodes/candidates 575*c83a76b0SSuyog Pawar ****************************************************************************** 576*c83a76b0SSuyog Pawar */ 577*c83a76b0SSuyog Pawar #define INSERT_NEW_NODE_NOMAP(as_nodes, num_nodes, new_node, implicit_layer) \ 578*c83a76b0SSuyog Pawar { \ 579*c83a76b0SSuyog Pawar WORD32 k; \ 580*c83a76b0SSuyog Pawar if(!implicit_layer) \ 581*c83a76b0SSuyog Pawar { \ 582*c83a76b0SSuyog Pawar for(k = 0; k < (num_nodes); k++) \ 583*c83a76b0SSuyog Pawar { \ 584*c83a76b0SSuyog Pawar /* Search is this node is already present in unique list */ \ 585*c83a76b0SSuyog Pawar if((as_nodes[k].s_mv.i2_mvx == new_node.s_mv.i2_mvx) && \ 586*c83a76b0SSuyog Pawar (as_nodes[k].s_mv.i2_mvy == new_node.s_mv.i2_mvy)) \ 587*c83a76b0SSuyog Pawar { \ 588*c83a76b0SSuyog Pawar /* This is duplicate node; need not be inserted */ \ 589*c83a76b0SSuyog Pawar break; \ 590*c83a76b0SSuyog Pawar } \ 591*c83a76b0SSuyog Pawar } \ 592*c83a76b0SSuyog Pawar } \ 593*c83a76b0SSuyog Pawar else \ 594*c83a76b0SSuyog Pawar { \ 595*c83a76b0SSuyog Pawar for(k = 0; k < (num_nodes); k++) \ 596*c83a76b0SSuyog Pawar { \ 597*c83a76b0SSuyog Pawar /* Search is this node is already present in unique list */ \ 598*c83a76b0SSuyog Pawar if((as_nodes[k].s_mv.i2_mvx == new_node.s_mv.i2_mvx) && \ 599*c83a76b0SSuyog Pawar (as_nodes[k].s_mv.i2_mvy == new_node.s_mv.i2_mvy) && \ 600*c83a76b0SSuyog Pawar (as_nodes[k].i1_ref_idx == new_node.i1_ref_idx)) \ 601*c83a76b0SSuyog Pawar { \ 602*c83a76b0SSuyog Pawar /* This is duplicate node; need not be inserted */ \ 603*c83a76b0SSuyog Pawar break; \ 604*c83a76b0SSuyog Pawar } \ 605*c83a76b0SSuyog Pawar } \ 606*c83a76b0SSuyog Pawar } \ 607*c83a76b0SSuyog Pawar \ 608*c83a76b0SSuyog Pawar if(k == (num_nodes)) \ 609*c83a76b0SSuyog Pawar { \ 610*c83a76b0SSuyog Pawar /* Insert new node only if it is not duplicate node */ \ 611*c83a76b0SSuyog Pawar as_nodes[k] = new_node; \ 612*c83a76b0SSuyog Pawar (num_nodes)++; \ 613*c83a76b0SSuyog Pawar } \ 614*c83a76b0SSuyog Pawar } 615*c83a76b0SSuyog Pawar /** 616*c83a76b0SSuyog Pawar ****************************************************************************** 617*c83a76b0SSuyog Pawar * @macro INSERT_NEW_NODE_NOMAP_ALTERNATE 618*c83a76b0SSuyog Pawar * @brief Inserts a new search node in a list if it is unique; helps in 619*c83a76b0SSuyog Pawar removing duplicate nodes/candidates 620*c83a76b0SSuyog Pawar ****************************************************************************** 621*c83a76b0SSuyog Pawar */ 622*c83a76b0SSuyog Pawar #define INSERT_NEW_NODE_NOMAP_ALTERNATE(as_nodes, num_nodes, new_node, result_num, part_id) \ 623*c83a76b0SSuyog Pawar { \ 624*c83a76b0SSuyog Pawar WORD32 k; \ 625*c83a76b0SSuyog Pawar WORD32 part_id_1 = (new_node->i4_num_valid_parts > 8) ? new_node->ai4_part_id[part_id] \ 626*c83a76b0SSuyog Pawar : part_id; \ 627*c83a76b0SSuyog Pawar for(k = 0; k < (num_nodes); k++) \ 628*c83a76b0SSuyog Pawar { \ 629*c83a76b0SSuyog Pawar /* Search is this node is already present in unique list */ \ 630*c83a76b0SSuyog Pawar if((as_nodes[k].s_mv.i2_mvx == new_node->i2_mv_x[result_num][part_id_1]) && \ 631*c83a76b0SSuyog Pawar (as_nodes[k].s_mv.i2_mvy == new_node->i2_mv_y[result_num][part_id_1]) && \ 632*c83a76b0SSuyog Pawar (as_nodes[k].i1_ref_idx == new_node->i2_ref_idx[result_num][part_id_1])) \ 633*c83a76b0SSuyog Pawar { \ 634*c83a76b0SSuyog Pawar /* This is duplicate node; need not be inserted */ \ 635*c83a76b0SSuyog Pawar break; \ 636*c83a76b0SSuyog Pawar } \ 637*c83a76b0SSuyog Pawar } \ 638*c83a76b0SSuyog Pawar \ 639*c83a76b0SSuyog Pawar if(k == (num_nodes)) \ 640*c83a76b0SSuyog Pawar { \ 641*c83a76b0SSuyog Pawar /* Insert new node only if it is not duplicate node */ \ 642*c83a76b0SSuyog Pawar as_nodes[k].i4_tot_cost = (WORD32)new_node->i2_tot_cost[result_num][part_id_1]; \ 643*c83a76b0SSuyog Pawar as_nodes[k].i4_mv_cost = (WORD32)new_node->i2_mv_cost[result_num][part_id_1]; \ 644*c83a76b0SSuyog Pawar as_nodes[k].s_mv.i2_mvx = new_node->i2_mv_x[result_num][part_id_1]; \ 645*c83a76b0SSuyog Pawar as_nodes[k].s_mv.i2_mvy = new_node->i2_mv_y[result_num][part_id_1]; \ 646*c83a76b0SSuyog Pawar as_nodes[k].i1_ref_idx = (WORD8)new_node->i2_ref_idx[result_num][part_id_1]; \ 647*c83a76b0SSuyog Pawar as_nodes[k].u1_part_id = new_node->ai4_part_id[part_id]; \ 648*c83a76b0SSuyog Pawar (num_nodes)++; \ 649*c83a76b0SSuyog Pawar } \ 650*c83a76b0SSuyog Pawar } 651*c83a76b0SSuyog Pawar 652*c83a76b0SSuyog Pawar #define INSERT_NEW_NODE( \ 653*c83a76b0SSuyog Pawar as_nodes, num_nodes, new_node, implicit_layer, au4_map, center_x, center_y, use_hashing) \ 654*c83a76b0SSuyog Pawar { \ 655*c83a76b0SSuyog Pawar WORD32 k; \ 656*c83a76b0SSuyog Pawar UWORD32 map; \ 657*c83a76b0SSuyog Pawar WORD32 delta_x, delta_y; \ 658*c83a76b0SSuyog Pawar delta_x = (new_node).s_mv.i2_mvx - center_x; \ 659*c83a76b0SSuyog Pawar delta_y = (new_node).s_mv.i2_mvy - center_y; \ 660*c83a76b0SSuyog Pawar map = 0; \ 661*c83a76b0SSuyog Pawar if((delta_x < MAP_X_MAX) && (delta_x >= (-MAP_X_MAX)) && (delta_y < MAP_Y_MAX) && \ 662*c83a76b0SSuyog Pawar (delta_y >= (-MAP_Y_MAX)) && (use_hashing)) \ 663*c83a76b0SSuyog Pawar { \ 664*c83a76b0SSuyog Pawar map = (au4_map)[delta_x + MAP_X_MAX]; \ 665*c83a76b0SSuyog Pawar if(0 == (map & (1U << (delta_y + MAP_Y_MAX)))) \ 666*c83a76b0SSuyog Pawar { \ 667*c83a76b0SSuyog Pawar (as_nodes)[(num_nodes)] = (new_node); \ 668*c83a76b0SSuyog Pawar (num_nodes)++; \ 669*c83a76b0SSuyog Pawar map |= 1U << (delta_y + MAP_Y_MAX); \ 670*c83a76b0SSuyog Pawar (au4_map)[delta_x + MAP_X_MAX] = map; \ 671*c83a76b0SSuyog Pawar } \ 672*c83a76b0SSuyog Pawar } \ 673*c83a76b0SSuyog Pawar else if(!(implicit_layer)) \ 674*c83a76b0SSuyog Pawar { \ 675*c83a76b0SSuyog Pawar for(k = 0; k < (num_nodes); k++) \ 676*c83a76b0SSuyog Pawar { \ 677*c83a76b0SSuyog Pawar /* Search is this node is already present in unique list */ \ 678*c83a76b0SSuyog Pawar if(((as_nodes)[k].s_mv.i2_mvx == (new_node).s_mv.i2_mvx) && \ 679*c83a76b0SSuyog Pawar ((as_nodes)[k].s_mv.i2_mvy == (new_node).s_mv.i2_mvy)) \ 680*c83a76b0SSuyog Pawar { \ 681*c83a76b0SSuyog Pawar /* This is duplicate node; need not be inserted */ \ 682*c83a76b0SSuyog Pawar break; \ 683*c83a76b0SSuyog Pawar } \ 684*c83a76b0SSuyog Pawar } \ 685*c83a76b0SSuyog Pawar if(k == (num_nodes)) \ 686*c83a76b0SSuyog Pawar { \ 687*c83a76b0SSuyog Pawar /* Insert new node only if it is not duplicate node */ \ 688*c83a76b0SSuyog Pawar (as_nodes)[k] = (new_node); \ 689*c83a76b0SSuyog Pawar (num_nodes)++; \ 690*c83a76b0SSuyog Pawar } \ 691*c83a76b0SSuyog Pawar } \ 692*c83a76b0SSuyog Pawar else \ 693*c83a76b0SSuyog Pawar { \ 694*c83a76b0SSuyog Pawar for(k = 0; k < (num_nodes); k++) \ 695*c83a76b0SSuyog Pawar { \ 696*c83a76b0SSuyog Pawar /* Search is this node is already present in unique list */ \ 697*c83a76b0SSuyog Pawar if(((as_nodes)[k].s_mv.i2_mvx == (new_node).s_mv.i2_mvx) && \ 698*c83a76b0SSuyog Pawar ((as_nodes)[k].s_mv.i2_mvy == (new_node).s_mv.i2_mvy) && \ 699*c83a76b0SSuyog Pawar ((as_nodes)[k].i1_ref_idx == (new_node).i1_ref_idx)) \ 700*c83a76b0SSuyog Pawar { \ 701*c83a76b0SSuyog Pawar /* This is duplicate node; need not be inserted */ \ 702*c83a76b0SSuyog Pawar break; \ 703*c83a76b0SSuyog Pawar } \ 704*c83a76b0SSuyog Pawar } \ 705*c83a76b0SSuyog Pawar if(k == (num_nodes)) \ 706*c83a76b0SSuyog Pawar { \ 707*c83a76b0SSuyog Pawar /* Insert new node only if it is not duplicate node */ \ 708*c83a76b0SSuyog Pawar (as_nodes)[k] = (new_node); \ 709*c83a76b0SSuyog Pawar (num_nodes)++; \ 710*c83a76b0SSuyog Pawar } \ 711*c83a76b0SSuyog Pawar } \ 712*c83a76b0SSuyog Pawar } 713*c83a76b0SSuyog Pawar 714*c83a76b0SSuyog Pawar #define COMPUTE_DIFF_MV(mvdx, mvdy, inp_node, mv_p_x, mv_p_y, inp_sh, pred_sh) \ 715*c83a76b0SSuyog Pawar { \ 716*c83a76b0SSuyog Pawar mvdx = (inp_node)->s_mv.i2_mvx << (inp_sh); \ 717*c83a76b0SSuyog Pawar mvdy = (inp_node)->s_mv.i2_mvy << (inp_sh); \ 718*c83a76b0SSuyog Pawar mvdx -= ((mv_p_x) << (pred_sh)); \ 719*c83a76b0SSuyog Pawar mvdy -= ((mv_p_y) << (pred_sh)); \ 720*c83a76b0SSuyog Pawar } 721*c83a76b0SSuyog Pawar 722*c83a76b0SSuyog Pawar #define COMPUTE_MV_DIFFERENCE(mvdx, mvdy, inp_node, mv_p_x, mv_p_y, inp_sh, pred_sh) \ 723*c83a76b0SSuyog Pawar { \ 724*c83a76b0SSuyog Pawar mvdx = (inp_node)->ps_mv->i2_mvx << (inp_sh); \ 725*c83a76b0SSuyog Pawar mvdy = (inp_node)->ps_mv->i2_mvy << (inp_sh); \ 726*c83a76b0SSuyog Pawar mvdx -= ((mv_p_x) << (pred_sh)); \ 727*c83a76b0SSuyog Pawar mvdy -= ((mv_p_y) << (pred_sh)); \ 728*c83a76b0SSuyog Pawar } 729*c83a76b0SSuyog Pawar 730*c83a76b0SSuyog Pawar /** 731*c83a76b0SSuyog Pawar ****************************************************************************** 732*c83a76b0SSuyog Pawar * @enum CU_MERGE_RESULT_T 733*c83a76b0SSuyog Pawar * @brief Describes the results of merge, whether successful or not 734*c83a76b0SSuyog Pawar ****************************************************************************** 735*c83a76b0SSuyog Pawar */ 736*c83a76b0SSuyog Pawar typedef enum 737*c83a76b0SSuyog Pawar { 738*c83a76b0SSuyog Pawar CU_MERGED, 739*c83a76b0SSuyog Pawar CU_SPLIT 740*c83a76b0SSuyog Pawar } CU_MERGE_RESULT_T; 741*c83a76b0SSuyog Pawar 742*c83a76b0SSuyog Pawar /** 743*c83a76b0SSuyog Pawar ****************************************************************************** 744*c83a76b0SSuyog Pawar * @enum PART_ORIENT_T 745*c83a76b0SSuyog Pawar * @brief Describes the orientation of partition (vert/horz, left/rt) 746*c83a76b0SSuyog Pawar ****************************************************************************** 747*c83a76b0SSuyog Pawar */ 748*c83a76b0SSuyog Pawar typedef enum 749*c83a76b0SSuyog Pawar { 750*c83a76b0SSuyog Pawar VERT_LEFT, 751*c83a76b0SSuyog Pawar VERT_RIGHT, 752*c83a76b0SSuyog Pawar HORZ_TOP, 753*c83a76b0SSuyog Pawar HORZ_BOT 754*c83a76b0SSuyog Pawar } PART_ORIENT_T; 755*c83a76b0SSuyog Pawar 756*c83a76b0SSuyog Pawar /** 757*c83a76b0SSuyog Pawar ****************************************************************************** 758*c83a76b0SSuyog Pawar * @enum GRID_PT_T 759*c83a76b0SSuyog Pawar * @brief For a 3x3 rect grid, nubers each pt as shown 760*c83a76b0SSuyog Pawar * 5 2 6 761*c83a76b0SSuyog Pawar * 1 0 3 762*c83a76b0SSuyog Pawar * 7 4 8 763*c83a76b0SSuyog Pawar ****************************************************************************** 764*c83a76b0SSuyog Pawar */ 765*c83a76b0SSuyog Pawar typedef enum 766*c83a76b0SSuyog Pawar { 767*c83a76b0SSuyog Pawar PT_C = 0, 768*c83a76b0SSuyog Pawar PT_L = 1, 769*c83a76b0SSuyog Pawar PT_T = 2, 770*c83a76b0SSuyog Pawar PT_R = 3, 771*c83a76b0SSuyog Pawar PT_B = 4, 772*c83a76b0SSuyog Pawar PT_TL = 5, 773*c83a76b0SSuyog Pawar PT_TR = 6, 774*c83a76b0SSuyog Pawar PT_BL = 7, 775*c83a76b0SSuyog Pawar PT_BR = 8, 776*c83a76b0SSuyog Pawar NUM_GRID_PTS 777*c83a76b0SSuyog Pawar } GRID_PT_T; 778*c83a76b0SSuyog Pawar 779*c83a76b0SSuyog Pawar /** 780*c83a76b0SSuyog Pawar ****************************************************************************** 781*c83a76b0SSuyog Pawar * @macro IS_POW 782*c83a76b0SSuyog Pawar * @brief Returns whwehter a number is power of 2 783*c83a76b0SSuyog Pawar ****************************************************************************** 784*c83a76b0SSuyog Pawar */ 785*c83a76b0SSuyog Pawar #define IS_POW_2(x) (!((x) & ((x)-1))) 786*c83a76b0SSuyog Pawar 787*c83a76b0SSuyog Pawar /** 788*c83a76b0SSuyog Pawar ****************************************************************************** 789*c83a76b0SSuyog Pawar * @macro GRID_ALL_PTS_VALID 790*c83a76b0SSuyog Pawar * @brief For a 3x3 rect grid, this can be used to enable all pts in grid 791*c83a76b0SSuyog Pawar ****************************************************************************** 792*c83a76b0SSuyog Pawar */ 793*c83a76b0SSuyog Pawar #define GRID_ALL_PTS_VALID 0x1ff 794*c83a76b0SSuyog Pawar 795*c83a76b0SSuyog Pawar /** 796*c83a76b0SSuyog Pawar ****************************************************************************** 797*c83a76b0SSuyog Pawar * @macro GRID_DIAMOND_ENABLE_ALL 798*c83a76b0SSuyog Pawar * @brief If we search diamond, this enables all 5 pts of diamond (including centre) 799*c83a76b0SSuyog Pawar ****************************************************************************** 800*c83a76b0SSuyog Pawar */ 801*c83a76b0SSuyog Pawar #define GRID_DIAMOND_ENABLE_ALL \ 802*c83a76b0SSuyog Pawar (BIT_EN(PT_C) | BIT_EN(PT_L) | BIT_EN(PT_T) | BIT_EN(PT_R) | BIT_EN(PT_B)) 803*c83a76b0SSuyog Pawar 804*c83a76b0SSuyog Pawar /** 805*c83a76b0SSuyog Pawar ****************************************************************************** 806*c83a76b0SSuyog Pawar * @macro GRID_RT_3_INVALID, GRID_LT_3_INVALID,GRID_TOP_3_INVALID,GRID_BOT_3_INVALID 807*c83a76b0SSuyog Pawar * @brief For a square grid search, depending on where the best result is 808*c83a76b0SSuyog Pawar * we can optimise search for next iteration by invalidating some pts 809*c83a76b0SSuyog Pawar ****************************************************************************** 810*c83a76b0SSuyog Pawar */ 811*c83a76b0SSuyog Pawar #define GRID_RT_3_INVALID ((GRID_ALL_PTS_VALID) ^ (BIT_EN(PT_TR) | BIT_EN(PT_R) | BIT_EN(PT_BR))) 812*c83a76b0SSuyog Pawar #define GRID_LT_3_INVALID ((GRID_ALL_PTS_VALID) ^ (BIT_EN(PT_TL) | BIT_EN(PT_L) | BIT_EN(PT_BL))) 813*c83a76b0SSuyog Pawar #define GRID_TOP_3_INVALID ((GRID_ALL_PTS_VALID) ^ (BIT_EN(PT_TL) | BIT_EN(PT_T) | BIT_EN(PT_TR))) 814*c83a76b0SSuyog Pawar #define GRID_BOT_3_INVALID ((GRID_ALL_PTS_VALID) ^ (BIT_EN(PT_BL) | BIT_EN(PT_B) | BIT_EN(PT_BR))) 815*c83a76b0SSuyog Pawar 816*c83a76b0SSuyog Pawar /** 817*c83a76b0SSuyog Pawar ****************************************************************************** 818*c83a76b0SSuyog Pawar * @enum GMV_MVTYPE_T 819*c83a76b0SSuyog Pawar * @brief Defines what type of GMV we need (thin lobe for a very spiky 820*c83a76b0SSuyog Pawar * distribution of mv or thick lobe for a blurred distrib of mvs 821*c83a76b0SSuyog Pawar ****************************************************************************** 822*c83a76b0SSuyog Pawar */ 823*c83a76b0SSuyog Pawar typedef enum 824*c83a76b0SSuyog Pawar { 825*c83a76b0SSuyog Pawar GMV_THICK_LOBE, 826*c83a76b0SSuyog Pawar GMV_THIN_LOBE, 827*c83a76b0SSuyog Pawar NUM_GMV_LOBES 828*c83a76b0SSuyog Pawar } GMV_MVTYPE_T; 829*c83a76b0SSuyog Pawar 830*c83a76b0SSuyog Pawar /** 831*c83a76b0SSuyog Pawar ****************************************************************************** 832*c83a76b0SSuyog Pawar * @enum BLK_TYPE_T 833*c83a76b0SSuyog Pawar * @brief Defines all possible inter blks possible 834*c83a76b0SSuyog Pawar ****************************************************************************** 835*c83a76b0SSuyog Pawar */ 836*c83a76b0SSuyog Pawar typedef enum 837*c83a76b0SSuyog Pawar { 838*c83a76b0SSuyog Pawar BLK_INVALID = -1, 839*c83a76b0SSuyog Pawar BLK_4x4 = 0, 840*c83a76b0SSuyog Pawar BLK_4x8, 841*c83a76b0SSuyog Pawar BLK_8x4, 842*c83a76b0SSuyog Pawar BLK_8x8, 843*c83a76b0SSuyog Pawar BLK_4x16, 844*c83a76b0SSuyog Pawar BLK_8x16, 845*c83a76b0SSuyog Pawar BLK_12x16, 846*c83a76b0SSuyog Pawar BLK_16x4, 847*c83a76b0SSuyog Pawar BLK_16x8, 848*c83a76b0SSuyog Pawar BLK_16x12, 849*c83a76b0SSuyog Pawar BLK_16x16, 850*c83a76b0SSuyog Pawar BLK_8x32, 851*c83a76b0SSuyog Pawar BLK_16x32, 852*c83a76b0SSuyog Pawar BLK_24x32, 853*c83a76b0SSuyog Pawar BLK_32x8, 854*c83a76b0SSuyog Pawar BLK_32x16, 855*c83a76b0SSuyog Pawar BLK_32x24, 856*c83a76b0SSuyog Pawar BLK_32x32, 857*c83a76b0SSuyog Pawar BLK_16x64, 858*c83a76b0SSuyog Pawar BLK_32x64, 859*c83a76b0SSuyog Pawar BLK_48x64, 860*c83a76b0SSuyog Pawar BLK_64x16, 861*c83a76b0SSuyog Pawar BLK_64x32, 862*c83a76b0SSuyog Pawar BLK_64x48, 863*c83a76b0SSuyog Pawar BLK_64x64, 864*c83a76b0SSuyog Pawar NUM_BLK_SIZES 865*c83a76b0SSuyog Pawar } BLK_SIZE_T; 866*c83a76b0SSuyog Pawar 867*c83a76b0SSuyog Pawar /** 868*c83a76b0SSuyog Pawar ****************************************************************************** 869*c83a76b0SSuyog Pawar * @enum SEARCH_COMPLEXITY_T 870*c83a76b0SSuyog Pawar * @brief For refinement layer, this decides the number of refinement candts 871*c83a76b0SSuyog Pawar ****************************************************************************** 872*c83a76b0SSuyog Pawar */ 873*c83a76b0SSuyog Pawar typedef enum 874*c83a76b0SSuyog Pawar { 875*c83a76b0SSuyog Pawar SEARCH_CX_LOW = 0, 876*c83a76b0SSuyog Pawar SEARCH_CX_MED = 1, 877*c83a76b0SSuyog Pawar SEARCH_CX_HIGH = 2 878*c83a76b0SSuyog Pawar } SEARCH_COMPLEXITY_T; 879*c83a76b0SSuyog Pawar 880*c83a76b0SSuyog Pawar /** 881*c83a76b0SSuyog Pawar ****************************************************************************** 882*c83a76b0SSuyog Pawar * @enum CTB_BOUNDARY_TYPES_T 883*c83a76b0SSuyog Pawar * @brief For pictures not a multiples of CTB horizontally or vertically, we 884*c83a76b0SSuyog Pawar * define 4 unique cases, centre (full ctbs), bottom boundary (64x8k CTBs), 885*c83a76b0SSuyog Pawar * right boundary (8mx64 CTBs), and bottom rt corner (8mx8k CTB) 886*c83a76b0SSuyog Pawar ****************************************************************************** 887*c83a76b0SSuyog Pawar */ 888*c83a76b0SSuyog Pawar typedef enum 889*c83a76b0SSuyog Pawar { 890*c83a76b0SSuyog Pawar CTB_CENTRE, 891*c83a76b0SSuyog Pawar CTB_BOT_PIC_BOUNDARY, 892*c83a76b0SSuyog Pawar CTB_RT_PIC_BOUNDARY, 893*c83a76b0SSuyog Pawar CTB_BOT_RT_PIC_BOUNDARY, 894*c83a76b0SSuyog Pawar NUM_CTB_BOUNDARY_TYPES, 895*c83a76b0SSuyog Pawar } CTB_BOUNDARY_TYPES_T; 896*c83a76b0SSuyog Pawar 897*c83a76b0SSuyog Pawar /** 898*c83a76b0SSuyog Pawar ****************************************************************************** 899*c83a76b0SSuyog Pawar * @enum SEARCH_CANDIDATE_TYPE_T 900*c83a76b0SSuyog Pawar * @brief Monikers for all sorts of search candidates used in ME 901*c83a76b0SSuyog Pawar ****************************************************************************** 902*c83a76b0SSuyog Pawar */ 903*c83a76b0SSuyog Pawar typedef enum 904*c83a76b0SSuyog Pawar { 905*c83a76b0SSuyog Pawar ILLUSORY_CANDIDATE = -1, 906*c83a76b0SSuyog Pawar ZERO_MV = 0, 907*c83a76b0SSuyog Pawar ZERO_MV_ALTREF, 908*c83a76b0SSuyog Pawar SPATIAL_LEFT0, 909*c83a76b0SSuyog Pawar SPATIAL_TOP0, 910*c83a76b0SSuyog Pawar SPATIAL_TOP_RIGHT0, 911*c83a76b0SSuyog Pawar SPATIAL_TOP_LEFT0, 912*c83a76b0SSuyog Pawar SPATIAL_LEFT1, 913*c83a76b0SSuyog Pawar SPATIAL_TOP1, 914*c83a76b0SSuyog Pawar SPATIAL_TOP_RIGHT1, 915*c83a76b0SSuyog Pawar SPATIAL_TOP_LEFT1, 916*c83a76b0SSuyog Pawar PROJECTED_COLOC0, 917*c83a76b0SSuyog Pawar PROJECTED_COLOC1, 918*c83a76b0SSuyog Pawar PROJECTED_COLOC2, 919*c83a76b0SSuyog Pawar PROJECTED_COLOC3, 920*c83a76b0SSuyog Pawar PROJECTED_COLOC4, 921*c83a76b0SSuyog Pawar PROJECTED_COLOC5, 922*c83a76b0SSuyog Pawar PROJECTED_COLOC6, 923*c83a76b0SSuyog Pawar PROJECTED_COLOC7, 924*c83a76b0SSuyog Pawar PROJECTED_COLOC_TR0, 925*c83a76b0SSuyog Pawar PROJECTED_COLOC_TR1, 926*c83a76b0SSuyog Pawar PROJECTED_COLOC_BL0, 927*c83a76b0SSuyog Pawar PROJECTED_COLOC_BL1, 928*c83a76b0SSuyog Pawar PROJECTED_COLOC_BR0, 929*c83a76b0SSuyog Pawar PROJECTED_COLOC_BR1, 930*c83a76b0SSuyog Pawar PROJECTED_TOP0, 931*c83a76b0SSuyog Pawar PROJECTED_TOP1, 932*c83a76b0SSuyog Pawar PROJECTED_TOP_RIGHT0, 933*c83a76b0SSuyog Pawar PROJECTED_TOP_RIGHT1, 934*c83a76b0SSuyog Pawar PROJECTED_TOP_LEFT0, 935*c83a76b0SSuyog Pawar PROJECTED_TOP_LEFT1, 936*c83a76b0SSuyog Pawar PROJECTED_RIGHT0, 937*c83a76b0SSuyog Pawar PROJECTED_RIGHT1, 938*c83a76b0SSuyog Pawar PROJECTED_BOTTOM0, 939*c83a76b0SSuyog Pawar PROJECTED_BOTTOM1, 940*c83a76b0SSuyog Pawar PROJECTED_BOTTOM_RIGHT0, 941*c83a76b0SSuyog Pawar PROJECTED_BOTTOM_RIGHT1, 942*c83a76b0SSuyog Pawar PROJECTED_BOTTOM_LEFT0, 943*c83a76b0SSuyog Pawar PROJECTED_BOTTOM_LEFT1, 944*c83a76b0SSuyog Pawar COLOCATED_GLOBAL_MV0, 945*c83a76b0SSuyog Pawar COLOCATED_GLOBAL_MV1, 946*c83a76b0SSuyog Pawar PROJECTED_TOP2, 947*c83a76b0SSuyog Pawar PROJECTED_TOP3, 948*c83a76b0SSuyog Pawar PROJECTED_TOP_RIGHT2, 949*c83a76b0SSuyog Pawar PROJECTED_TOP_RIGHT3, 950*c83a76b0SSuyog Pawar PROJECTED_TOP_LEFT2, 951*c83a76b0SSuyog Pawar PROJECTED_TOP_LEFT3, 952*c83a76b0SSuyog Pawar PROJECTED_RIGHT2, 953*c83a76b0SSuyog Pawar PROJECTED_RIGHT3, 954*c83a76b0SSuyog Pawar PROJECTED_BOTTOM2, 955*c83a76b0SSuyog Pawar PROJECTED_BOTTOM3, 956*c83a76b0SSuyog Pawar PROJECTED_BOTTOM_RIGHT2, 957*c83a76b0SSuyog Pawar PROJECTED_BOTTOM_RIGHT3, 958*c83a76b0SSuyog Pawar PROJECTED_BOTTOM_LEFT2, 959*c83a76b0SSuyog Pawar PROJECTED_BOTTOM_LEFT3, 960*c83a76b0SSuyog Pawar NUM_SEARCH_CAND_TYPES 961*c83a76b0SSuyog Pawar } SEARCH_CANDIDATE_TYPE_T; 962*c83a76b0SSuyog Pawar 963*c83a76b0SSuyog Pawar typedef enum 964*c83a76b0SSuyog Pawar { 965*c83a76b0SSuyog Pawar ILLUSORY_LOCATION = -1, 966*c83a76b0SSuyog Pawar COLOCATED, 967*c83a76b0SSuyog Pawar COLOCATED_4x4_TR, 968*c83a76b0SSuyog Pawar COLOCATED_4x4_BL, 969*c83a76b0SSuyog Pawar COLOCATED_4x4_BR, 970*c83a76b0SSuyog Pawar LEFT, 971*c83a76b0SSuyog Pawar TOPLEFT, 972*c83a76b0SSuyog Pawar TOP, 973*c83a76b0SSuyog Pawar TOPRIGHT, 974*c83a76b0SSuyog Pawar RIGHT, 975*c83a76b0SSuyog Pawar BOTTOMRIGHT, 976*c83a76b0SSuyog Pawar BOTTOM, 977*c83a76b0SSuyog Pawar BOTTOMLEFT, 978*c83a76b0SSuyog Pawar NUM_SEARCH_CAND_LOCATIONS 979*c83a76b0SSuyog Pawar } SEARCH_CAND_LOCATIONS_T; 980*c83a76b0SSuyog Pawar 981*c83a76b0SSuyog Pawar /** 982*c83a76b0SSuyog Pawar ****************************************************************************** 983*c83a76b0SSuyog Pawar * @macros ENABLE_mxn 984*c83a76b0SSuyog Pawar * @brief Enables a type or a group of partitions. ENABLE_ALL_PARTS, enables all 985*c83a76b0SSuyog Pawar * partitions, while others enable selected partitions. These can be used 986*c83a76b0SSuyog Pawar * to set the mask of active partitions 987*c83a76b0SSuyog Pawar ****************************************************************************** 988*c83a76b0SSuyog Pawar */ 989*c83a76b0SSuyog Pawar #define ENABLE_2Nx2N (BIT_EN(PART_ID_2Nx2N)) 990*c83a76b0SSuyog Pawar #define ENABLE_2NxN (BIT_EN(PART_ID_2NxN_T) | BIT_EN(PART_ID_2NxN_B)) 991*c83a76b0SSuyog Pawar #define ENABLE_Nx2N (BIT_EN(PART_ID_Nx2N_L) | BIT_EN(PART_ID_Nx2N_R)) 992*c83a76b0SSuyog Pawar #define ENABLE_NxN \ 993*c83a76b0SSuyog Pawar (BIT_EN(PART_ID_NxN_TL) | BIT_EN(PART_ID_NxN_TR) | BIT_EN(PART_ID_NxN_BL) | \ 994*c83a76b0SSuyog Pawar BIT_EN(PART_ID_NxN_BR)) 995*c83a76b0SSuyog Pawar #define ENABLE_2NxnU (BIT_EN(PART_ID_2NxnU_T) | BIT_EN(PART_ID_2NxnU_B)) 996*c83a76b0SSuyog Pawar #define ENABLE_2NxnD (BIT_EN(PART_ID_2NxnD_T) | BIT_EN(PART_ID_2NxnD_B)) 997*c83a76b0SSuyog Pawar #define ENABLE_nLx2N (BIT_EN(PART_ID_nLx2N_L) | BIT_EN(PART_ID_nLx2N_R)) 998*c83a76b0SSuyog Pawar #define ENABLE_nRx2N (BIT_EN(PART_ID_nRx2N_L) | BIT_EN(PART_ID_nRx2N_R)) 999*c83a76b0SSuyog Pawar #define ENABLE_AMP ((ENABLE_2NxnU) | (ENABLE_2NxnD) | (ENABLE_nLx2N) | (ENABLE_nRx2N)) 1000*c83a76b0SSuyog Pawar #define ENABLE_SMP ((ENABLE_2NxN) | (ENABLE_Nx2N)) 1001*c83a76b0SSuyog Pawar #define ENABLE_ALL_PARTS \ 1002*c83a76b0SSuyog Pawar ((ENABLE_2Nx2N) | (ENABLE_NxN) | (ENABLE_2NxN) | (ENABLE_Nx2N) | (ENABLE_AMP)) 1003*c83a76b0SSuyog Pawar #define ENABLE_SQUARE_PARTS ((ENABLE_2Nx2N) | (ENABLE_NxN)) 1004*c83a76b0SSuyog Pawar 1005*c83a76b0SSuyog Pawar /** 1006*c83a76b0SSuyog Pawar ****************************************************************************** 1007*c83a76b0SSuyog Pawar * @enum MV_PEL_RES_T 1008*c83a76b0SSuyog Pawar * @brief Resolution of MV fpel/hpel/qpel units. Useful for maintaining 1009*c83a76b0SSuyog Pawar * predictors. During fpel search, candts, predictors etc are in fpel units, 1010*c83a76b0SSuyog Pawar * in subpel search, they are in subpel units 1011*c83a76b0SSuyog Pawar ****************************************************************************** 1012*c83a76b0SSuyog Pawar */ 1013*c83a76b0SSuyog Pawar typedef enum 1014*c83a76b0SSuyog Pawar { 1015*c83a76b0SSuyog Pawar MV_RES_FPEL, 1016*c83a76b0SSuyog Pawar MV_RES_HPEL, 1017*c83a76b0SSuyog Pawar MV_RES_QPEL 1018*c83a76b0SSuyog Pawar } MV_PEL_RES_T; 1019*c83a76b0SSuyog Pawar 1020*c83a76b0SSuyog Pawar /** 1021*c83a76b0SSuyog Pawar ****************************************************************************** 1022*c83a76b0SSuyog Pawar * @enum HME_SET_MVPRED_RES 1023*c83a76b0SSuyog Pawar * @brief Sets resolution for predictor bank (fpel/qpel/hpel units) 1024*c83a76b0SSuyog Pawar ****************************************************************************** 1025*c83a76b0SSuyog Pawar */ 1026*c83a76b0SSuyog Pawar #define HME_SET_MVPRED_RES(ps_pred_ctxt, mv_pel_res) ((ps_pred_ctxt)->mv_pel = mv_pel_res) 1027*c83a76b0SSuyog Pawar 1028*c83a76b0SSuyog Pawar /** 1029*c83a76b0SSuyog Pawar ****************************************************************************** 1030*c83a76b0SSuyog Pawar * @enum HME_SET_MVPRED_DIR 1031*c83a76b0SSuyog Pawar * @brief Sets the direction, meaning L0/L1. Since L0 and L1 use separate 1032*c83a76b0SSuyog Pawar * candts, the pred ctxt for them hasto be maintained separately 1033*c83a76b0SSuyog Pawar ****************************************************************************** 1034*c83a76b0SSuyog Pawar */ 1035*c83a76b0SSuyog Pawar #define HME_SET_MVPRED_DIR(ps_pred_ctxt, pred_lx) ((ps_pred_ctxt)->pred_lx = pred_lx) 1036*c83a76b0SSuyog Pawar 1037*c83a76b0SSuyog Pawar /** 1038*c83a76b0SSuyog Pawar ****************************************************************************** 1039*c83a76b0SSuyog Pawar * @brief macros to clip / check mv within specified range 1040*c83a76b0SSuyog Pawar ****************************************************************************** 1041*c83a76b0SSuyog Pawar */ 1042*c83a76b0SSuyog Pawar #define CHECK_MV_WITHIN_RANGE(x, y, range) \ 1043*c83a76b0SSuyog Pawar (((x) > (range)->i2_min_x) && ((x) < (range)->i2_max_x) && ((y) > (range)->i2_min_y) && \ 1044*c83a76b0SSuyog Pawar ((y) < (range)->i2_max_y)) 1045*c83a76b0SSuyog Pawar 1046*c83a76b0SSuyog Pawar #define CONVERT_MV_LIMIT_TO_QPEL(range) \ 1047*c83a76b0SSuyog Pawar { \ 1048*c83a76b0SSuyog Pawar (range)->i2_max_x <<= 2; \ 1049*c83a76b0SSuyog Pawar (range)->i2_max_y <<= 2; \ 1050*c83a76b0SSuyog Pawar (range)->i2_min_x <<= 2; \ 1051*c83a76b0SSuyog Pawar (range)->i2_min_y <<= 2; \ 1052*c83a76b0SSuyog Pawar } 1053*c83a76b0SSuyog Pawar 1054*c83a76b0SSuyog Pawar #define CONVERT_MV_LIMIT_TO_FPEL(range) \ 1055*c83a76b0SSuyog Pawar { \ 1056*c83a76b0SSuyog Pawar (range)->i2_max_x >>= 2; \ 1057*c83a76b0SSuyog Pawar (range)->i2_max_y >>= 2; \ 1058*c83a76b0SSuyog Pawar (range)->i2_min_x >>= 2; \ 1059*c83a76b0SSuyog Pawar (range)->i2_min_y >>= 2; \ 1060*c83a76b0SSuyog Pawar } 1061*c83a76b0SSuyog Pawar 1062*c83a76b0SSuyog Pawar /** 1063*c83a76b0SSuyog Pawar ****************************************************************************** 1064*c83a76b0SSuyog Pawar * @brief Swicth to debug the number of subpel search nodes 1065*c83a76b0SSuyog Pawar ****************************************************************************** 1066*c83a76b0SSuyog Pawar */ 1067*c83a76b0SSuyog Pawar #define DEBUG_SUBPEL_SEARCH_NODE_HS_COUNT 0 1068*c83a76b0SSuyog Pawar 1069*c83a76b0SSuyog Pawar /** 1070*c83a76b0SSuyog Pawar ****************************************************************************** 1071*c83a76b0SSuyog Pawar * @typedef SAD_GRID_T 1072*c83a76b0SSuyog Pawar * @brief Defines a 2D array type used to store SADs across grid and across 1073*c83a76b0SSuyog Pawar * partition types 1074*c83a76b0SSuyog Pawar ****************************************************************************** 1075*c83a76b0SSuyog Pawar */ 1076*c83a76b0SSuyog Pawar typedef S32 SAD_GRID_T[9][MAX_NUM_PARTS]; 1077*c83a76b0SSuyog Pawar 1078*c83a76b0SSuyog Pawar /*****************************************************************************/ 1079*c83a76b0SSuyog Pawar /* Structures */ 1080*c83a76b0SSuyog Pawar /*****************************************************************************/ 1081*c83a76b0SSuyog Pawar 1082*c83a76b0SSuyog Pawar /** 1083*c83a76b0SSuyog Pawar ****************************************************************************** 1084*c83a76b0SSuyog Pawar * @struct grid_node_t 1085*c83a76b0SSuyog Pawar * @brief stores a complete info for a candt 1086*c83a76b0SSuyog Pawar ****************************************************************************** 1087*c83a76b0SSuyog Pawar */ 1088*c83a76b0SSuyog Pawar typedef struct 1089*c83a76b0SSuyog Pawar { 1090*c83a76b0SSuyog Pawar S16 i2_mv_x; 1091*c83a76b0SSuyog Pawar S16 i2_mv_y; 1092*c83a76b0SSuyog Pawar S08 i1_ref_idx; 1093*c83a76b0SSuyog Pawar } grid_node_t; 1094*c83a76b0SSuyog Pawar 1095*c83a76b0SSuyog Pawar /** 1096*c83a76b0SSuyog Pawar ****************************************************************************** 1097*c83a76b0SSuyog Pawar * @struct search_node_t 1098*c83a76b0SSuyog Pawar * @brief Basic structure used for storage of search results, specification 1099*c83a76b0SSuyog Pawar * of init candidates for search etc. This structure is complete for 1100*c83a76b0SSuyog Pawar * specification of mv and cost for a given direction of search (L0/L1) but 1101*c83a76b0SSuyog Pawar * does not carry information of what type of partition it represents. 1102*c83a76b0SSuyog Pawar ****************************************************************************** 1103*c83a76b0SSuyog Pawar */ 1104*c83a76b0SSuyog Pawar typedef struct 1105*c83a76b0SSuyog Pawar { 1106*c83a76b0SSuyog Pawar /** Motion vector */ 1107*c83a76b0SSuyog Pawar mv_t s_mv; 1108*c83a76b0SSuyog Pawar 1109*c83a76b0SSuyog Pawar /** Used in the hme_mv_clipper function to reduce loads and stores */ 1110*c83a76b0SSuyog Pawar mv_t *ps_mv; 1111*c83a76b0SSuyog Pawar 1112*c83a76b0SSuyog Pawar /** Ref id, as specified in terms of Lc, unified list */ 1113*c83a76b0SSuyog Pawar S08 i1_ref_idx; 1114*c83a76b0SSuyog Pawar 1115*c83a76b0SSuyog Pawar /** Flag to indicate whether mv is in fpel or QPEL units */ 1116*c83a76b0SSuyog Pawar U08 u1_subpel_done; 1117*c83a76b0SSuyog Pawar 1118*c83a76b0SSuyog Pawar /** 1119*c83a76b0SSuyog Pawar * Indicates whether this node constitutes a valid predictor candt. 1120*c83a76b0SSuyog Pawar * Since this structure also used for predictor candts, some candts may 1121*c83a76b0SSuyog Pawar * not be available (anti causal or outside pic boundary). Availabilit 1122*c83a76b0SSuyog Pawar * can be inferred using this flag. 1123*c83a76b0SSuyog Pawar */ 1124*c83a76b0SSuyog Pawar U08 u1_is_avail; 1125*c83a76b0SSuyog Pawar 1126*c83a76b0SSuyog Pawar /** 1127*c83a76b0SSuyog Pawar * Indicates partition Id to which this node belongs. Useful during 1128*c83a76b0SSuyog Pawar * subpel / fullpel refinement search to identify partition whose 1129*c83a76b0SSuyog Pawar * cost needs to be minimized 1130*c83a76b0SSuyog Pawar */ 1131*c83a76b0SSuyog Pawar U08 u1_part_id; 1132*c83a76b0SSuyog Pawar 1133*c83a76b0SSuyog Pawar /** SAD / SATD stored here */ 1134*c83a76b0SSuyog Pawar S32 i4_sad; 1135*c83a76b0SSuyog Pawar 1136*c83a76b0SSuyog Pawar /** 1137*c83a76b0SSuyog Pawar * Cost related to coding MV, multiplied by lambda 1138*c83a76b0SSuyog Pawar * TODO : Entry may be redundant, can be removed 1139*c83a76b0SSuyog Pawar */ 1140*c83a76b0SSuyog Pawar S32 i4_mv_cost; 1141*c83a76b0SSuyog Pawar 1142*c83a76b0SSuyog Pawar /** Total cost, (SAD + MV Cost) */ 1143*c83a76b0SSuyog Pawar S32 i4_tot_cost; 1144*c83a76b0SSuyog Pawar 1145*c83a76b0SSuyog Pawar /** Subpel_Dist_Improvement. 1146*c83a76b0SSuyog Pawar It is the reduction in distortion (SAD or SATD) achieved 1147*c83a76b0SSuyog Pawar from the full-pel stage to the sub-pel stage 1148*c83a76b0SSuyog Pawar */ 1149*c83a76b0SSuyog Pawar S32 i4_sdi; 1150*c83a76b0SSuyog Pawar 1151*c83a76b0SSuyog Pawar } search_node_t; 1152*c83a76b0SSuyog Pawar 1153*c83a76b0SSuyog Pawar /** 1154*c83a76b0SSuyog Pawar ****************************************************************************** 1155*c83a76b0SSuyog Pawar * @macro INIT_SEARCH_NODE 1156*c83a76b0SSuyog Pawar * @brief Initializes this search_node_t structure. Can be used to zero 1157*c83a76b0SSuyog Pawar * out candts, set max costs in results etc 1158*c83a76b0SSuyog Pawar ****************************************************************************** 1159*c83a76b0SSuyog Pawar */ 1160*c83a76b0SSuyog Pawar #define INIT_SEARCH_NODE(x, a) \ 1161*c83a76b0SSuyog Pawar { \ 1162*c83a76b0SSuyog Pawar (x)->s_mv.i2_mvx = 0; \ 1163*c83a76b0SSuyog Pawar (x)->s_mv.i2_mvy = 0; \ 1164*c83a76b0SSuyog Pawar (x)->i1_ref_idx = a; \ 1165*c83a76b0SSuyog Pawar (x)->i4_tot_cost = MAX_32BIT_VAL; \ 1166*c83a76b0SSuyog Pawar (x)->i4_sad = MAX_32BIT_VAL; \ 1167*c83a76b0SSuyog Pawar (x)->u1_subpel_done = 0; \ 1168*c83a76b0SSuyog Pawar (x)->u1_is_avail = 1; \ 1169*c83a76b0SSuyog Pawar } 1170*c83a76b0SSuyog Pawar 1171*c83a76b0SSuyog Pawar /** 1172*c83a76b0SSuyog Pawar ****************************************************************************** 1173*c83a76b0SSuyog Pawar * @struct part_attr_t 1174*c83a76b0SSuyog Pawar * @brief Geometric description of a partition w.r.t. CU start. Note that 1175*c83a76b0SSuyog Pawar * since this is used across various CU sizes, the inference of 1176*c83a76b0SSuyog Pawar * these members is to be done in the context of specific usage 1177*c83a76b0SSuyog Pawar ****************************************************************************** 1178*c83a76b0SSuyog Pawar */ 1179*c83a76b0SSuyog Pawar typedef struct 1180*c83a76b0SSuyog Pawar { 1181*c83a76b0SSuyog Pawar /** Start of partition w.r.t. CU start in x dirn */ 1182*c83a76b0SSuyog Pawar U08 u1_x_start; 1183*c83a76b0SSuyog Pawar /** Size of partitino w.r.t. CU start in x dirn */ 1184*c83a76b0SSuyog Pawar U08 u1_x_count; 1185*c83a76b0SSuyog Pawar /** Start of partition w.r.t. CU start in y dirn */ 1186*c83a76b0SSuyog Pawar U08 u1_y_start; 1187*c83a76b0SSuyog Pawar /** Size of partitino w.r.t. CU start in y dirn */ 1188*c83a76b0SSuyog Pawar U08 u1_y_count; 1189*c83a76b0SSuyog Pawar } part_attr_t; 1190*c83a76b0SSuyog Pawar 1191*c83a76b0SSuyog Pawar /** 1192*c83a76b0SSuyog Pawar ****************************************************************************** 1193*c83a76b0SSuyog Pawar * @struct search_candt_t 1194*c83a76b0SSuyog Pawar * @brief Complete information for a given candt in any refinement srch 1195*c83a76b0SSuyog Pawar ****************************************************************************** 1196*c83a76b0SSuyog Pawar */ 1197*c83a76b0SSuyog Pawar typedef struct 1198*c83a76b0SSuyog Pawar { 1199*c83a76b0SSuyog Pawar /** Points to the mv, ref id info. */ 1200*c83a76b0SSuyog Pawar search_node_t *ps_search_node; 1201*c83a76b0SSuyog Pawar /** Number of refinemnts to be done for this candt */ 1202*c83a76b0SSuyog Pawar U08 u1_num_steps_refine; 1203*c83a76b0SSuyog Pawar } search_candt_t; 1204*c83a76b0SSuyog Pawar 1205*c83a76b0SSuyog Pawar /** 1206*c83a76b0SSuyog Pawar ****************************************************************************** 1207*c83a76b0SSuyog Pawar * @struct result_node_t 1208*c83a76b0SSuyog Pawar * @brief Contains complete search result for a CU for a given type of 1209*c83a76b0SSuyog Pawar * partition split. Holds ptrs to results for each partition, with 1210*c83a76b0SSuyog Pawar * information of partition type. 1211*c83a76b0SSuyog Pawar ****************************************************************************** 1212*c83a76b0SSuyog Pawar */ 1213*c83a76b0SSuyog Pawar typedef struct 1214*c83a76b0SSuyog Pawar { 1215*c83a76b0SSuyog Pawar /** 1216*c83a76b0SSuyog Pawar * Type of partition that the CU is split into, for which this 1217*c83a76b0SSuyog Pawar * result is relevant 1218*c83a76b0SSuyog Pawar */ 1219*c83a76b0SSuyog Pawar PART_TYPE_T e_part_type; 1220*c83a76b0SSuyog Pawar 1221*c83a76b0SSuyog Pawar /** 1222*c83a76b0SSuyog Pawar * Total cost of coding the CU (sum of costs of individual partitions 1223*c83a76b0SSuyog Pawar * plus other possible CU level overheads) 1224*c83a76b0SSuyog Pawar */ 1225*c83a76b0SSuyog Pawar S32 i4_tot_cost; 1226*c83a76b0SSuyog Pawar 1227*c83a76b0SSuyog Pawar /** 1228*c83a76b0SSuyog Pawar * Pointer to results of each individual partitions. Note that max 1229*c83a76b0SSuyog Pawar * number of partitions a CU can be split into is MAX_NUM_PARTS 1230*c83a76b0SSuyog Pawar */ 1231*c83a76b0SSuyog Pawar search_node_t *ps_part_result[MAX_NUM_PARTS]; 1232*c83a76b0SSuyog Pawar 1233*c83a76b0SSuyog Pawar /* TU split flag : tu_split_flag[0] represents the transform splits 1234*c83a76b0SSuyog Pawar * for CU size <= 32, for 64x64 each ai4_tu_split_flag corresponds 1235*c83a76b0SSuyog Pawar * to respective 32x32 */ 1236*c83a76b0SSuyog Pawar S32 ai4_tu_split_flag[4]; 1237*c83a76b0SSuyog Pawar 1238*c83a76b0SSuyog Pawar } result_node_t; 1239*c83a76b0SSuyog Pawar 1240*c83a76b0SSuyog Pawar /** 1241*c83a76b0SSuyog Pawar ****************************************************************************** 1242*c83a76b0SSuyog Pawar * @struct ctb_node_t 1243*c83a76b0SSuyog Pawar * @brief Finalized information for a given CU or CTB. This is a recursive 1244*c83a76b0SSuyog Pawar * structure and can hence start at CTB level, recursing for every 1245*c83a76b0SSuyog Pawar * level of split till we hit leaf CUs in the CTB. At leaf node 1246*c83a76b0SSuyog Pawar * it contains info for coded non split CU, with child nodes being 1247*c83a76b0SSuyog Pawar * set to NULL 1248*c83a76b0SSuyog Pawar ****************************************************************************** 1249*c83a76b0SSuyog Pawar */ 1250*c83a76b0SSuyog Pawar typedef struct ctb_node_t 1251*c83a76b0SSuyog Pawar { 1252*c83a76b0SSuyog Pawar /** x offset of this CU w.r.t. CTB start (0-63) */ 1253*c83a76b0SSuyog Pawar U08 u1_x_off; 1254*c83a76b0SSuyog Pawar /** y offset of this C U w.r.t. CTB start (0-63) */ 1255*c83a76b0SSuyog Pawar U08 u1_y_off; 1256*c83a76b0SSuyog Pawar /** Results of each partition in both directions L0,L1 */ 1257*c83a76b0SSuyog Pawar search_node_t as_part_results[MAX_NUM_PARTS][2]; 1258*c83a76b0SSuyog Pawar /** 1259*c83a76b0SSuyog Pawar * Pointers to pred buffers. Note that the buffer may be allocated 1260*c83a76b0SSuyog Pawar * at parent level or at this level 1261*c83a76b0SSuyog Pawar */ 1262*c83a76b0SSuyog Pawar U08 *apu1_pred[2]; 1263*c83a76b0SSuyog Pawar /** Prediction direction for each partition: 0-L0, 1-L1, 2-BI */ 1264*c83a76b0SSuyog Pawar U08 u1_pred_dir[MAX_NUM_PARTS]; 1265*c83a76b0SSuyog Pawar /** 1266*c83a76b0SSuyog Pawar * When pred direction is decided to be BI, we still store the best 1267*c83a76b0SSuyog Pawar * uni pred dir (L0/L1) in this array, for RD Opt purposes 1268*c83a76b0SSuyog Pawar */ 1269*c83a76b0SSuyog Pawar U08 u1_best_uni_dir[MAX_NUM_PARTS]; 1270*c83a76b0SSuyog Pawar /** Stride of pred buffer pointed to by apu1_pred member */ 1271*c83a76b0SSuyog Pawar S32 i4_pred_stride; 1272*c83a76b0SSuyog Pawar /** Size of the CU that this node represents */ 1273*c83a76b0SSuyog Pawar CU_SIZE_T e_cu_size; 1274*c83a76b0SSuyog Pawar /** For leaf CUs, this indicats type of partition (for e.g. PRT_2NxN) */ 1275*c83a76b0SSuyog Pawar PART_TYPE_T e_part_type; 1276*c83a76b0SSuyog Pawar /** Below entries are for a CU level*/ 1277*c83a76b0SSuyog Pawar S32 i4_sad; 1278*c83a76b0SSuyog Pawar S32 i4_satd; 1279*c83a76b0SSuyog Pawar S32 i4_mv_cost; 1280*c83a76b0SSuyog Pawar S32 i4_rate; 1281*c83a76b0SSuyog Pawar S32 i4_dist; 1282*c83a76b0SSuyog Pawar S32 i4_tot_cost; 1283*c83a76b0SSuyog Pawar /** Best costs of each partitions, if partition is BI, then best cost across uni/bi */ 1284*c83a76b0SSuyog Pawar S32 ai4_part_costs[4]; 1285*c83a76b0SSuyog Pawar 1286*c83a76b0SSuyog Pawar /* TU split flag : tu_split_flag[0] represents the transform splits 1287*c83a76b0SSuyog Pawar * for CU size <= 32, for 64x64 each ai4_tu_split_flag corresponds 1288*c83a76b0SSuyog Pawar * to respective 32x32 */ 1289*c83a76b0SSuyog Pawar /* For a 8x8 TU - 1 bit used to indicate split */ 1290*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 */ 1291*c83a76b0SSuyog Pawar /* For a 32x32 TU - See above */ 1292*c83a76b0SSuyog Pawar S32 ai4_tu_split_flag[4]; 1293*c83a76b0SSuyog Pawar 1294*c83a76b0SSuyog Pawar /** 1295*c83a76b0SSuyog Pawar * pointers to child nodes. If this node is split, then the below point 1296*c83a76b0SSuyog Pawar * to children nodes (TL, TR, BL, BR) each of quarter size (w/2, h/2) 1297*c83a76b0SSuyog Pawar * If this node not split, then below point to null 1298*c83a76b0SSuyog Pawar */ 1299*c83a76b0SSuyog Pawar struct ctb_node_t *ps_tl; 1300*c83a76b0SSuyog Pawar struct ctb_node_t *ps_tr; 1301*c83a76b0SSuyog Pawar struct ctb_node_t *ps_bl; 1302*c83a76b0SSuyog Pawar struct ctb_node_t *ps_br; 1303*c83a76b0SSuyog Pawar } ctb_node_t; 1304*c83a76b0SSuyog Pawar 1305*c83a76b0SSuyog Pawar /** 1306*c83a76b0SSuyog Pawar ****************************************************************************** 1307*c83a76b0SSuyog Pawar * @struct ctb_mem_mgr_t 1308*c83a76b0SSuyog Pawar * @brief Memory manager structure for CTB level memory allocations of CTB 1309*c83a76b0SSuyog Pawar * nodes 1310*c83a76b0SSuyog Pawar ****************************************************************************** 1311*c83a76b0SSuyog Pawar */ 1312*c83a76b0SSuyog Pawar typedef struct 1313*c83a76b0SSuyog Pawar { 1314*c83a76b0SSuyog Pawar /** Base memory ptr */ 1315*c83a76b0SSuyog Pawar U08 *pu1_mem; 1316*c83a76b0SSuyog Pawar /** Amount used so far (running value) */ 1317*c83a76b0SSuyog Pawar S32 i4_used; 1318*c83a76b0SSuyog Pawar /** Total memory available for this mem mgr */ 1319*c83a76b0SSuyog Pawar S32 i4_tot; 1320*c83a76b0SSuyog Pawar 1321*c83a76b0SSuyog Pawar /** Size of CTB node, and alignment requiremnts */ 1322*c83a76b0SSuyog Pawar S32 i4_size; 1323*c83a76b0SSuyog Pawar S32 i4_align; 1324*c83a76b0SSuyog Pawar } ctb_mem_mgr_t; 1325*c83a76b0SSuyog Pawar 1326*c83a76b0SSuyog Pawar /** 1327*c83a76b0SSuyog Pawar ****************************************************************************** 1328*c83a76b0SSuyog Pawar * @struct buf_mgr_t 1329*c83a76b0SSuyog Pawar * @brief Memory manager structure for CTB level buffer allocations on the 1330*c83a76b0SSuyog Pawar * fly, esp useful for pred bufs and working memory 1331*c83a76b0SSuyog Pawar ****************************************************************************** 1332*c83a76b0SSuyog Pawar */ 1333*c83a76b0SSuyog Pawar typedef struct 1334*c83a76b0SSuyog Pawar { 1335*c83a76b0SSuyog Pawar /** base memory ptr */ 1336*c83a76b0SSuyog Pawar U08 *pu1_wkg_mem; 1337*c83a76b0SSuyog Pawar /** total memory available */ 1338*c83a76b0SSuyog Pawar S32 i4_total; 1339*c83a76b0SSuyog Pawar /** Memory used so far */ 1340*c83a76b0SSuyog Pawar S32 i4_used; 1341*c83a76b0SSuyog Pawar } buf_mgr_t; 1342*c83a76b0SSuyog Pawar 1343*c83a76b0SSuyog Pawar /** 1344*c83a76b0SSuyog Pawar ****************************************************************************** 1345*c83a76b0SSuyog Pawar * @struct pred_candt_nodes_t 1346*c83a76b0SSuyog Pawar * @brief For a given partition and a given CU/blk, this has pointers to 1347*c83a76b0SSuyog Pawar * all the neighbouring and coloc pred candts. All the pred candts 1348*c83a76b0SSuyog Pawar * are stored as search_node_t structures itself. 1349*c83a76b0SSuyog Pawar ****************************************************************************** 1350*c83a76b0SSuyog Pawar */ 1351*c83a76b0SSuyog Pawar typedef struct 1352*c83a76b0SSuyog Pawar { 1353*c83a76b0SSuyog Pawar search_node_t *ps_tl; 1354*c83a76b0SSuyog Pawar search_node_t *ps_t; 1355*c83a76b0SSuyog Pawar search_node_t *ps_tr; 1356*c83a76b0SSuyog Pawar search_node_t *ps_bl; 1357*c83a76b0SSuyog Pawar search_node_t *ps_l; 1358*c83a76b0SSuyog Pawar search_node_t *ps_coloc; 1359*c83a76b0SSuyog Pawar search_node_t *ps_zeromv; 1360*c83a76b0SSuyog Pawar search_node_t **pps_proj_coloc; 1361*c83a76b0SSuyog Pawar 1362*c83a76b0SSuyog Pawar search_node_t *ps_mvp_node; 1363*c83a76b0SSuyog Pawar } pred_candt_nodes_t; 1364*c83a76b0SSuyog Pawar 1365*c83a76b0SSuyog Pawar /** 1366*c83a76b0SSuyog Pawar ****************************************************************************** 1367*c83a76b0SSuyog Pawar * @struct pred_ctxt_t 1368*c83a76b0SSuyog Pawar * @brief For a given CU/blk, has complete prediction information for all 1369*c83a76b0SSuyog Pawar * types of partitions. Note that the pred candts are only pointed 1370*c83a76b0SSuyog Pawar * to, not actually stored here. This indirection is to avoid 1371*c83a76b0SSuyog Pawar * copies after each partition search, this way, the result of 1372*c83a76b0SSuyog Pawar * a partition is updated and the causally next partition 1373*c83a76b0SSuyog Pawar * automatically uses this result 1374*c83a76b0SSuyog Pawar ****************************************************************************** 1375*c83a76b0SSuyog Pawar */ 1376*c83a76b0SSuyog Pawar typedef struct 1377*c83a76b0SSuyog Pawar { 1378*c83a76b0SSuyog Pawar pred_candt_nodes_t as_pred_nodes[TOT_NUM_PARTS]; 1379*c83a76b0SSuyog Pawar 1380*c83a76b0SSuyog Pawar /** 1381*c83a76b0SSuyog Pawar * We use S + lambda * R to evaluate cost. Here S = SAD/SATD and lambda 1382*c83a76b0SSuyog Pawar * is the scaling of bits to S and R is bits of overhead (MV + mode). 1383*c83a76b0SSuyog Pawar * Choice of lambda depends on open loop / closed loop, Qp, temporal id 1384*c83a76b0SSuyog Pawar * and possibly CU depth. It is the caller's responsiblity to pass 1385*c83a76b0SSuyog Pawar * to this module the appropriate lambda. 1386*c83a76b0SSuyog Pawar */ 1387*c83a76b0SSuyog Pawar S32 lambda; 1388*c83a76b0SSuyog Pawar 1389*c83a76b0SSuyog Pawar /** lambda is in Q format, so this is the downshift reqd */ 1390*c83a76b0SSuyog Pawar S32 lambda_q_shift; 1391*c83a76b0SSuyog Pawar 1392*c83a76b0SSuyog Pawar /** Prediction direction : PRED_L0 or PRED_L1 */ 1393*c83a76b0SSuyog Pawar S32 pred_lx; 1394*c83a76b0SSuyog Pawar 1395*c83a76b0SSuyog Pawar /** MV resolution: FPEL, HPEL or QPEL */ 1396*c83a76b0SSuyog Pawar S32 mv_pel; 1397*c83a76b0SSuyog Pawar 1398*c83a76b0SSuyog Pawar /** Points to the ref bits lookup 1 ptr for each PRED_Lx */ 1399*c83a76b0SSuyog Pawar U08 **ppu1_ref_bits_tlu; 1400*c83a76b0SSuyog Pawar 1401*c83a76b0SSuyog Pawar /** 1402*c83a76b0SSuyog Pawar * Points to the ref scale factor, for a given ref id k, 1403*c83a76b0SSuyog Pawar * to scale as per ref id m, we use entry k+MAX_NUM_REF*m 1404*c83a76b0SSuyog Pawar */ 1405*c83a76b0SSuyog Pawar S16 *pi2_ref_scf; 1406*c83a76b0SSuyog Pawar 1407*c83a76b0SSuyog Pawar /** 1408*c83a76b0SSuyog Pawar * Flag that indicates whether T, TR and TL candidates used 1409*c83a76b0SSuyog Pawar * are causal or projected 1410*c83a76b0SSuyog Pawar */ 1411*c83a76b0SSuyog Pawar U08 proj_used; 1412*c83a76b0SSuyog Pawar 1413*c83a76b0SSuyog Pawar } pred_ctxt_t; 1414*c83a76b0SSuyog Pawar 1415*c83a76b0SSuyog Pawar /** 1416*c83a76b0SSuyog Pawar ****************************************************************************** 1417*c83a76b0SSuyog Pawar * @struct search_results_t 1418*c83a76b0SSuyog Pawar * @brief For a given CU/blk, Stores all the results of ME search. Results 1419*c83a76b0SSuyog Pawar * are stored per partition, also the best results for CU are stored 1420*c83a76b0SSuyog Pawar * across partitions. 1421*c83a76b0SSuyog Pawar ****************************************************************************** 1422*c83a76b0SSuyog Pawar */ 1423*c83a76b0SSuyog Pawar typedef struct 1424*c83a76b0SSuyog Pawar { 1425*c83a76b0SSuyog Pawar /** Size of CU for which this structure used */ 1426*c83a76b0SSuyog Pawar CU_SIZE_T e_cu_size; 1427*c83a76b0SSuyog Pawar 1428*c83a76b0SSuyog Pawar /** 1429*c83a76b0SSuyog Pawar * X and y offsets w.r.t. CTB start in encode layers. For non encode 1430*c83a76b0SSuyog Pawar * layers, these may typically be 0 1431*c83a76b0SSuyog Pawar */ 1432*c83a76b0SSuyog Pawar U08 u1_x_off; 1433*c83a76b0SSuyog Pawar U08 u1_y_off; 1434*c83a76b0SSuyog Pawar 1435*c83a76b0SSuyog Pawar /** Number of best results for this CU stored */ 1436*c83a76b0SSuyog Pawar U08 u1_num_best_results; 1437*c83a76b0SSuyog Pawar 1438*c83a76b0SSuyog Pawar /** Number of results stored per partition. */ 1439*c83a76b0SSuyog Pawar U08 u1_num_results_per_part; 1440*c83a76b0SSuyog Pawar 1441*c83a76b0SSuyog Pawar /** 1442*c83a76b0SSuyog Pawar * Number of result planes active. This may be different from total 1443*c83a76b0SSuyog Pawar * number of active references during search. For example, we may 1444*c83a76b0SSuyog Pawar * have 4 active ref, 2 ineach dirn, but active result planes may 1445*c83a76b0SSuyog Pawar * only be 2, one for L0 and 1 for L1 1446*c83a76b0SSuyog Pawar */ 1447*c83a76b0SSuyog Pawar U08 u1_num_active_ref; 1448*c83a76b0SSuyog Pawar /** 1449*c83a76b0SSuyog Pawar * mask of active partitions, Totally 17 bits. For a given partition 1450*c83a76b0SSuyog Pawar * id, as per PART_ID_T enum the corresponding bit position is 1/0 1451*c83a76b0SSuyog Pawar * indicating that partition is active or inactive 1452*c83a76b0SSuyog Pawar */ 1453*c83a76b0SSuyog Pawar S32 i4_part_mask; 1454*c83a76b0SSuyog Pawar 1455*c83a76b0SSuyog Pawar /** Points to partial results for each partition id 1456*c83a76b0SSuyog Pawar * Temporary hack for the bug: If +1 is not kept, 1457*c83a76b0SSuyog Pawar * it doesn't bit match with older version 1458*c83a76b0SSuyog Pawar */ 1459*c83a76b0SSuyog Pawar search_node_t *aps_part_results[MAX_NUM_REF][TOT_NUM_PARTS]; 1460*c83a76b0SSuyog Pawar 1461*c83a76b0SSuyog Pawar /** 1462*c83a76b0SSuyog Pawar * Ptr to best results for the current CU post bi pred evaluation and 1463*c83a76b0SSuyog Pawar * intra mode insertions 1464*c83a76b0SSuyog Pawar */ 1465*c83a76b0SSuyog Pawar inter_cu_results_t *ps_cu_results; 1466*c83a76b0SSuyog Pawar 1467*c83a76b0SSuyog Pawar /** 2 pred ctxts, one for L0 and one for L1 */ 1468*c83a76b0SSuyog Pawar pred_ctxt_t as_pred_ctxt[2]; 1469*c83a76b0SSuyog Pawar 1470*c83a76b0SSuyog Pawar /** 1471*c83a76b0SSuyog Pawar * Pointer to a table that indicates whether the ref id 1472*c83a76b0SSuyog Pawar * corresponds to past or future dirn. Input is ref id Lc form 1473*c83a76b0SSuyog Pawar */ 1474*c83a76b0SSuyog Pawar 1475*c83a76b0SSuyog Pawar U08 *pu1_is_past; 1476*c83a76b0SSuyog Pawar 1477*c83a76b0SSuyog Pawar /** 1478*c83a76b0SSuyog Pawar * Overall best CU cost, while other entries store CU costs 1479*c83a76b0SSuyog Pawar * in single direction, this is best CU cost, where each 1480*c83a76b0SSuyog Pawar * partition cost is evaluated as best of uni/bi 1481*c83a76b0SSuyog Pawar */ 1482*c83a76b0SSuyog Pawar S32 best_cu_cost; 1483*c83a76b0SSuyog Pawar 1484*c83a76b0SSuyog Pawar /** 1485*c83a76b0SSuyog Pawar * Split_flag which is used for deciding if 16x16 CU is split or not 1486*c83a76b0SSuyog Pawar */ 1487*c83a76b0SSuyog Pawar U08 u1_split_flag; 1488*c83a76b0SSuyog Pawar } search_results_t; 1489*c83a76b0SSuyog Pawar 1490*c83a76b0SSuyog Pawar /** 1491*c83a76b0SSuyog Pawar ****************************************************************************** 1492*c83a76b0SSuyog Pawar * @struct ctb_list_t 1493*c83a76b0SSuyog Pawar * @brief Tree structure containing info for entire CTB. At top level 1494*c83a76b0SSuyog Pawar * it points to entire CTB results, with children nodes at each lvl 1495*c83a76b0SSuyog Pawar * being non null if split. 1496*c83a76b0SSuyog Pawar ****************************************************************************** 1497*c83a76b0SSuyog Pawar */ 1498*c83a76b0SSuyog Pawar typedef struct ctb_list_t 1499*c83a76b0SSuyog Pawar { 1500*c83a76b0SSuyog Pawar /** Indicates whether this level split further */ 1501*c83a76b0SSuyog Pawar U08 u1_is_split; 1502*c83a76b0SSuyog Pawar 1503*c83a76b0SSuyog Pawar /** Number of result candts present */ 1504*c83a76b0SSuyog Pawar U08 u1_num_candts; 1505*c83a76b0SSuyog Pawar 1506*c83a76b0SSuyog Pawar /** 1507*c83a76b0SSuyog Pawar * Whether this level valid. E.g. if we are at boundary, where only 1508*c83a76b0SSuyog Pawar * left 2 32x32 are within pic boundary, then the parent is force split 1509*c83a76b0SSuyog Pawar * at the children level, TR and BR are invalid. 1510*c83a76b0SSuyog Pawar */ 1511*c83a76b0SSuyog Pawar U08 u1_is_valid; 1512*c83a76b0SSuyog Pawar 1513*c83a76b0SSuyog Pawar /** 1514*c83a76b0SSuyog Pawar * IF this level is 16x16 then this mask indicates which 8x8 blks 1515*c83a76b0SSuyog Pawar * are valid 1516*c83a76b0SSuyog Pawar */ 1517*c83a76b0SSuyog Pawar U08 u1_8x8_mask; 1518*c83a76b0SSuyog Pawar 1519*c83a76b0SSuyog Pawar /** Search results of this CU */ 1520*c83a76b0SSuyog Pawar search_results_t *ps_search_results; 1521*c83a76b0SSuyog Pawar 1522*c83a76b0SSuyog Pawar /** Search results of this CU */ 1523*c83a76b0SSuyog Pawar inter_cu_results_t *ps_cu_results; 1524*c83a76b0SSuyog Pawar 1525*c83a76b0SSuyog Pawar /** Pointers to leaf nodes, if CU is split further, else null */ 1526*c83a76b0SSuyog Pawar struct ctb_list_t *ps_tl; 1527*c83a76b0SSuyog Pawar struct ctb_list_t *ps_tr; 1528*c83a76b0SSuyog Pawar struct ctb_list_t *ps_bl; 1529*c83a76b0SSuyog Pawar struct ctb_list_t *ps_br; 1530*c83a76b0SSuyog Pawar } ctb_list_t; 1531*c83a76b0SSuyog Pawar 1532*c83a76b0SSuyog Pawar /** 1533*c83a76b0SSuyog Pawar ****************************************************************************** 1534*c83a76b0SSuyog Pawar * @struct layer_mv_t 1535*c83a76b0SSuyog Pawar * @brief mv bank structure for a particular layer 1536*c83a76b0SSuyog Pawar ****************************************************************************** 1537*c83a76b0SSuyog Pawar */ 1538*c83a76b0SSuyog Pawar typedef struct 1539*c83a76b0SSuyog Pawar { 1540*c83a76b0SSuyog Pawar /** Number of mvs for a given ref/pred dirn */ 1541*c83a76b0SSuyog Pawar S32 i4_num_mvs_per_ref; 1542*c83a76b0SSuyog Pawar /** Number of reference for which results stored */ 1543*c83a76b0SSuyog Pawar S32 i4_num_ref; 1544*c83a76b0SSuyog Pawar /** Number of mvs stored per blk. Product of above two */ 1545*c83a76b0SSuyog Pawar S32 i4_num_mvs_per_blk; 1546*c83a76b0SSuyog Pawar /** Block size of the unit for which MVs stored */ 1547*c83a76b0SSuyog Pawar BLK_SIZE_T e_blk_size; 1548*c83a76b0SSuyog Pawar /** Number of blocks present per row */ 1549*c83a76b0SSuyog Pawar S32 i4_num_blks_per_row; 1550*c83a76b0SSuyog Pawar 1551*c83a76b0SSuyog Pawar /** Number of mvs stored every row */ 1552*c83a76b0SSuyog Pawar S32 i4_num_mvs_per_row; 1553*c83a76b0SSuyog Pawar 1554*c83a76b0SSuyog Pawar /** 1555*c83a76b0SSuyog Pawar * Max number of mvs allowed per row. The main purpose of this variable 1556*c83a76b0SSuyog Pawar * is to resolve or detect discrepanceis between allocation time mem 1557*c83a76b0SSuyog Pawar * and run time mem, when alloc time resolution and run time resolution 1558*c83a76b0SSuyog Pawar * may be different 1559*c83a76b0SSuyog Pawar */ 1560*c83a76b0SSuyog Pawar S32 max_num_mvs_per_row; 1561*c83a76b0SSuyog Pawar 1562*c83a76b0SSuyog Pawar /** 1563*c83a76b0SSuyog Pawar * Pointer to mvs of 0, 0 blk, This is different from base since the 1564*c83a76b0SSuyog Pawar * mv bank is padded all sides 1565*c83a76b0SSuyog Pawar */ 1566*c83a76b0SSuyog Pawar hme_mv_t *ps_mv; 1567*c83a76b0SSuyog Pawar 1568*c83a76b0SSuyog Pawar /** Pointer to base of mv bank mvs */ 1569*c83a76b0SSuyog Pawar hme_mv_t *ps_mv_base; 1570*c83a76b0SSuyog Pawar 1571*c83a76b0SSuyog Pawar /** Pointers to ref idx.One to one correspondence between this and ps_mv*/ 1572*c83a76b0SSuyog Pawar S08 *pi1_ref_idx; 1573*c83a76b0SSuyog Pawar /** Base of ref ids just like in case of ps_mv */ 1574*c83a76b0SSuyog Pawar S08 *pi1_ref_idx_base; 1575*c83a76b0SSuyog Pawar 1576*c83a76b0SSuyog Pawar /** Part mask for every blk, if stored, 1 per blk */ 1577*c83a76b0SSuyog Pawar U08 *pu1_part_mask; 1578*c83a76b0SSuyog Pawar } layer_mv_t; 1579*c83a76b0SSuyog Pawar 1580*c83a76b0SSuyog Pawar /** 1581*c83a76b0SSuyog Pawar ****************************************************************************** 1582*c83a76b0SSuyog Pawar * @struct mv_hist_t 1583*c83a76b0SSuyog Pawar * @brief Histogram structure to calculate global mvs 1584*c83a76b0SSuyog Pawar ****************************************************************************** 1585*c83a76b0SSuyog Pawar */ 1586*c83a76b0SSuyog Pawar typedef struct 1587*c83a76b0SSuyog Pawar { 1588*c83a76b0SSuyog Pawar S32 i4_num_rows; 1589*c83a76b0SSuyog Pawar S32 i4_num_cols; 1590*c83a76b0SSuyog Pawar S32 i4_shift_x; 1591*c83a76b0SSuyog Pawar S32 i4_shift_y; 1592*c83a76b0SSuyog Pawar S32 i4_lobe1_size; 1593*c83a76b0SSuyog Pawar S32 i4_lobe2_size; 1594*c83a76b0SSuyog Pawar S32 i4_min_x; 1595*c83a76b0SSuyog Pawar S32 i4_min_y; 1596*c83a76b0SSuyog Pawar S32 i4_num_bins; 1597*c83a76b0SSuyog Pawar S32 ai4_bin_count[MAX_NUM_BINS]; 1598*c83a76b0SSuyog Pawar } mv_hist_t; 1599*c83a76b0SSuyog Pawar 1600*c83a76b0SSuyog Pawar typedef struct 1601*c83a76b0SSuyog Pawar { 1602*c83a76b0SSuyog Pawar U08 u1_is_past; 1603*c83a76b0SSuyog Pawar } ref_attr_t; 1604*c83a76b0SSuyog Pawar 1605*c83a76b0SSuyog Pawar /** 1606*c83a76b0SSuyog Pawar ****************************************************************************** 1607*c83a76b0SSuyog Pawar * @struct layer_ctxt_t 1608*c83a76b0SSuyog Pawar * @brief Complete information for the layer 1609*c83a76b0SSuyog Pawar ****************************************************************************** 1610*c83a76b0SSuyog Pawar */ 1611*c83a76b0SSuyog Pawar typedef struct 1612*c83a76b0SSuyog Pawar { 1613*c83a76b0SSuyog Pawar /** Display Width of this layer */ 1614*c83a76b0SSuyog Pawar S32 i4_disp_wd; 1615*c83a76b0SSuyog Pawar /** Display height of this layer */ 1616*c83a76b0SSuyog Pawar S32 i4_disp_ht; 1617*c83a76b0SSuyog Pawar /** Width of this layer */ 1618*c83a76b0SSuyog Pawar S32 i4_wd; 1619*c83a76b0SSuyog Pawar /** height of this layer */ 1620*c83a76b0SSuyog Pawar S32 i4_ht; 1621*c83a76b0SSuyog Pawar /** Amount of padding of input in x dirn */ 1622*c83a76b0SSuyog Pawar S32 i4_pad_x_inp; 1623*c83a76b0SSuyog Pawar /** Amount of padding of input in y dirn */ 1624*c83a76b0SSuyog Pawar S32 i4_pad_y_inp; 1625*c83a76b0SSuyog Pawar /** Padding amount of recon in x dirn */ 1626*c83a76b0SSuyog Pawar S32 i4_pad_x_rec; 1627*c83a76b0SSuyog Pawar /** padding amt of recon in y dirn */ 1628*c83a76b0SSuyog Pawar S32 i4_pad_y_rec; 1629*c83a76b0SSuyog Pawar 1630*c83a76b0SSuyog Pawar /** 1631*c83a76b0SSuyog Pawar * Offset for recon. Since recon has padding, the 0, 0 start differs 1632*c83a76b0SSuyog Pawar * from base of buffer 1633*c83a76b0SSuyog Pawar */ 1634*c83a76b0SSuyog Pawar S32 i4_rec_offset; 1635*c83a76b0SSuyog Pawar /** Offset for input, same explanation as recon */ 1636*c83a76b0SSuyog Pawar S32 i4_inp_offset; 1637*c83a76b0SSuyog Pawar /** stride of input buffer */ 1638*c83a76b0SSuyog Pawar S32 i4_inp_stride; 1639*c83a76b0SSuyog Pawar /** stride of recon buffer */ 1640*c83a76b0SSuyog Pawar S32 i4_rec_stride; 1641*c83a76b0SSuyog Pawar /** Pic order count */ 1642*c83a76b0SSuyog Pawar S32 i4_poc; 1643*c83a76b0SSuyog Pawar /** input pointer. */ 1644*c83a76b0SSuyog Pawar U08 *pu1_inp; 1645*c83a76b0SSuyog Pawar /** Base of input. Add inp_offset to go to 0, 0 locn */ 1646*c83a76b0SSuyog Pawar U08 *pu1_inp_base; 1647*c83a76b0SSuyog Pawar 1648*c83a76b0SSuyog Pawar /** Pointer to 4 hpel recon planes */ 1649*c83a76b0SSuyog Pawar U08 *pu1_rec_fxfy; 1650*c83a76b0SSuyog Pawar U08 *pu1_rec_hxfy; 1651*c83a76b0SSuyog Pawar U08 *pu1_rec_fxhy; 1652*c83a76b0SSuyog Pawar U08 *pu1_rec_hxhy; 1653*c83a76b0SSuyog Pawar 1654*c83a76b0SSuyog Pawar /** Global mv, one set per reference searched */ 1655*c83a76b0SSuyog Pawar hme_mv_t s_global_mv[MAX_NUM_REF][NUM_GMV_LOBES]; 1656*c83a76b0SSuyog Pawar 1657*c83a76b0SSuyog Pawar /** Layer MV bank */ 1658*c83a76b0SSuyog Pawar layer_mv_t *ps_layer_mvbank; 1659*c83a76b0SSuyog Pawar 1660*c83a76b0SSuyog Pawar /** Pointer to list of recon buffers for each ref id, one ptr per plane */ 1661*c83a76b0SSuyog Pawar U08 **ppu1_list_rec_fxfy; 1662*c83a76b0SSuyog Pawar U08 **ppu1_list_rec_hxfy; 1663*c83a76b0SSuyog Pawar U08 **ppu1_list_rec_fxhy; 1664*c83a76b0SSuyog Pawar U08 **ppu1_list_rec_hxhy; 1665*c83a76b0SSuyog Pawar 1666*c83a76b0SSuyog Pawar void **ppv_dep_mngr_recon; 1667*c83a76b0SSuyog Pawar 1668*c83a76b0SSuyog Pawar /** Pointer to list of input buffers for each ref id, one ptr per plane */ 1669*c83a76b0SSuyog Pawar U08 **ppu1_list_inp; 1670*c83a76b0SSuyog Pawar 1671*c83a76b0SSuyog Pawar /** Max MV in x and y direction supported at this layer resolution */ 1672*c83a76b0SSuyog Pawar S16 i2_max_mv_x; 1673*c83a76b0SSuyog Pawar S16 i2_max_mv_y; 1674*c83a76b0SSuyog Pawar 1675*c83a76b0SSuyog Pawar /** Converts ref id (as per Lc list) to POC */ 1676*c83a76b0SSuyog Pawar S32 ai4_ref_id_to_poc_lc[MAX_NUM_REF]; 1677*c83a76b0SSuyog Pawar 1678*c83a76b0SSuyog Pawar S32 ai4_ref_id_to_disp_num[MAX_NUM_REF]; 1679*c83a76b0SSuyog Pawar 1680*c83a76b0SSuyog Pawar /** status of the buffer */ 1681*c83a76b0SSuyog Pawar S32 i4_is_free; 1682*c83a76b0SSuyog Pawar 1683*c83a76b0SSuyog Pawar /** idr gop number */ 1684*c83a76b0SSuyog Pawar S32 i4_idr_gop_num; 1685*c83a76b0SSuyog Pawar 1686*c83a76b0SSuyog Pawar /** is reference picture */ 1687*c83a76b0SSuyog Pawar S32 i4_is_reference; 1688*c83a76b0SSuyog Pawar 1689*c83a76b0SSuyog Pawar /** is non reference picture processed by me*/ 1690*c83a76b0SSuyog Pawar S32 i4_non_ref_free; 1691*c83a76b0SSuyog Pawar 1692*c83a76b0SSuyog Pawar } layer_ctxt_t; 1693*c83a76b0SSuyog Pawar 1694*c83a76b0SSuyog Pawar typedef S32 (*PF_MV_COST_FXN)(search_node_t *, pred_ctxt_t *, PART_ID_T, S32); 1695*c83a76b0SSuyog Pawar 1696*c83a76b0SSuyog Pawar /** 1697*c83a76b0SSuyog Pawar ****************************************************************************** 1698*c83a76b0SSuyog Pawar * @struct refine_prms_t 1699*c83a76b0SSuyog Pawar * @brief All the configurable input parameters for the refinement layer 1700*c83a76b0SSuyog Pawar * 1701*c83a76b0SSuyog Pawar * @param encode: Whether this layer is encoded or not 1702*c83a76b0SSuyog Pawar * @param explicit_ref: If enabled, then the number of reference frames to 1703*c83a76b0SSuyog Pawar * be searched is a function of coarsest layer num ref 1704*c83a76b0SSuyog Pawar frames. Else, number of references collapsed to 1/2 1705*c83a76b0SSuyog Pawar * @param i4_num_fpel_results : Number of full pel results to be allowed 1706*c83a76b0SSuyog Pawar * @param i4_num_results_per_part: Number of results stored per partition 1707*c83a76b0SSuyog Pawar * @param e_search_complexity: Decides the number of initial candts, refer 1708*c83a76b0SSuyog Pawar * to SEARCH_COMPLEXITY_T 1709*c83a76b0SSuyog Pawar * @param i4_use_rec_in_fpel: Whether to use input buf or recon buf in fpel 1710*c83a76b0SSuyog Pawar * @param i4_enable_4x4_part : if encode is 0, we use 8x8 blks, if this param 1711*c83a76b0SSuyog Pawar enabled, then we do 4x4 partial sad update 1712*c83a76b0SSuyog Pawar * @param i4_layer_id : id of this layer (0 = finest) 1713*c83a76b0SSuyog Pawar * @param i4_num_32x32_merge_results: number of 32x32 merged results stored 1714*c83a76b0SSuyog Pawar * @param i4_num_64x64_merge_results: number of 64x64 merged results stored 1715*c83a76b0SSuyog Pawar * @param i4_use_satd_cu_merge: Use SATD during CU merge 1716*c83a76b0SSuyog Pawar * @param i4_num_steps_hpel_refine : Number of steps during hpel refinement 1717*c83a76b0SSuyog Pawar * @param i4_num_steps_qpel_refine : Same as above but for qpel 1718*c83a76b0SSuyog Pawar * @param i4_use_satd_subpel : Use of SATD or SAD for subpel 1719*c83a76b0SSuyog Pawar ****************************************************************************** 1720*c83a76b0SSuyog Pawar */ 1721*c83a76b0SSuyog Pawar typedef struct 1722*c83a76b0SSuyog Pawar { 1723*c83a76b0SSuyog Pawar /* This array is used to place upper bounds on the number of search candidates */ 1724*c83a76b0SSuyog Pawar /* that can be used per 'search cand location' */ 1725*c83a76b0SSuyog Pawar U08 au1_num_fpel_search_cands[NUM_SEARCH_CAND_LOCATIONS]; 1726*c83a76b0SSuyog Pawar 1727*c83a76b0SSuyog Pawar U08 u1_max_2nx2n_tu_recur_cands; 1728*c83a76b0SSuyog Pawar 1729*c83a76b0SSuyog Pawar U08 u1_max_num_fpel_refine_centers; 1730*c83a76b0SSuyog Pawar 1731*c83a76b0SSuyog Pawar U08 u1_max_num_subpel_refine_centers; 1732*c83a76b0SSuyog Pawar 1733*c83a76b0SSuyog Pawar S32 i4_encode; 1734*c83a76b0SSuyog Pawar S32 explicit_ref; 1735*c83a76b0SSuyog Pawar S32 i4_num_ref_fpel; 1736*c83a76b0SSuyog Pawar S32 i4_num_fpel_results; 1737*c83a76b0SSuyog Pawar 1738*c83a76b0SSuyog Pawar S32 i4_num_results_per_part; 1739*c83a76b0SSuyog Pawar 1740*c83a76b0SSuyog Pawar S32 i4_num_mvbank_results; 1741*c83a76b0SSuyog Pawar SEARCH_COMPLEXITY_T e_search_complexity; 1742*c83a76b0SSuyog Pawar S32 i4_use_rec_in_fpel; 1743*c83a76b0SSuyog Pawar 1744*c83a76b0SSuyog Pawar S32 i4_enable_4x4_part; 1745*c83a76b0SSuyog Pawar S32 i4_layer_id; 1746*c83a76b0SSuyog Pawar 1747*c83a76b0SSuyog Pawar S32 i4_num_32x32_merge_results; 1748*c83a76b0SSuyog Pawar S32 i4_num_64x64_merge_results; 1749*c83a76b0SSuyog Pawar 1750*c83a76b0SSuyog Pawar S32 i4_use_satd_cu_merge; 1751*c83a76b0SSuyog Pawar 1752*c83a76b0SSuyog Pawar S32 i4_num_steps_post_refine_fpel; 1753*c83a76b0SSuyog Pawar S32 i4_num_steps_fpel_refine; 1754*c83a76b0SSuyog Pawar S32 i4_num_steps_hpel_refine; 1755*c83a76b0SSuyog Pawar S32 i4_num_steps_qpel_refine; 1756*c83a76b0SSuyog Pawar S32 i4_use_satd_subpel; 1757*c83a76b0SSuyog Pawar 1758*c83a76b0SSuyog Pawar double *pd_intra_costs; 1759*c83a76b0SSuyog Pawar S32 bidir_enabled; 1760*c83a76b0SSuyog Pawar S32 lambda_inp; 1761*c83a76b0SSuyog Pawar S32 lambda_recon; 1762*c83a76b0SSuyog Pawar S32 lambda_q_shift; 1763*c83a76b0SSuyog Pawar 1764*c83a76b0SSuyog Pawar S32 limit_active_partitions; 1765*c83a76b0SSuyog Pawar 1766*c83a76b0SSuyog Pawar S32 sdi_threshold; 1767*c83a76b0SSuyog Pawar 1768*c83a76b0SSuyog Pawar U08 u1_use_lambda_derived_from_min_8x8_act_in_ctb; 1769*c83a76b0SSuyog Pawar 1770*c83a76b0SSuyog Pawar U08 u1_max_subpel_candts; 1771*c83a76b0SSuyog Pawar 1772*c83a76b0SSuyog Pawar U08 u1_max_subpel_candts_2Nx2N; 1773*c83a76b0SSuyog Pawar U08 u1_max_subpel_candts_NxN; 1774*c83a76b0SSuyog Pawar 1775*c83a76b0SSuyog Pawar U08 u1_subpel_candt_threshold; 1776*c83a76b0SSuyog Pawar 1777*c83a76b0SSuyog Pawar /* Pointer to the array which has num best results for 1778*c83a76b0SSuyog Pawar fpel refinement */ 1779*c83a76b0SSuyog Pawar U08 *pu1_num_best_results; 1780*c83a76b0SSuyog Pawar 1781*c83a76b0SSuyog Pawar } refine_prms_t; 1782*c83a76b0SSuyog Pawar 1783*c83a76b0SSuyog Pawar /** 1784*c83a76b0SSuyog Pawar ****************************************************************************** 1785*c83a76b0SSuyog Pawar * @struct coarse_prms_t 1786*c83a76b0SSuyog Pawar * @brief All the parameters passed to coarse layer search 1787*c83a76b0SSuyog Pawar ****************************************************************************** 1788*c83a76b0SSuyog Pawar */ 1789*c83a76b0SSuyog Pawar typedef struct 1790*c83a76b0SSuyog Pawar { 1791*c83a76b0SSuyog Pawar /** ID of this layer, typically N-1 where N is tot layers */ 1792*c83a76b0SSuyog Pawar S32 i4_layer_id; 1793*c83a76b0SSuyog Pawar 1794*c83a76b0SSuyog Pawar /** Initial step size, valid if full search disabled */ 1795*c83a76b0SSuyog Pawar S32 i4_start_step; 1796*c83a76b0SSuyog Pawar 1797*c83a76b0SSuyog Pawar /** Maximum number of iterations to consider if full search disabled */ 1798*c83a76b0SSuyog Pawar S32 i4_max_iters; 1799*c83a76b0SSuyog Pawar 1800*c83a76b0SSuyog Pawar /** Number of reference frames to search */ 1801*c83a76b0SSuyog Pawar S32 i4_num_ref; 1802*c83a76b0SSuyog Pawar 1803*c83a76b0SSuyog Pawar /** Number of best results to maintain at this layer for projection */ 1804*c83a76b0SSuyog Pawar S32 num_results; 1805*c83a76b0SSuyog Pawar 1806*c83a76b0SSuyog Pawar /** 1807*c83a76b0SSuyog Pawar * Enable or disable full search, if disabled then, we search around initial 1808*c83a76b0SSuyog Pawar * candidates with early exit 1809*c83a76b0SSuyog Pawar */ 1810*c83a76b0SSuyog Pawar S32 do_full_search; 1811*c83a76b0SSuyog Pawar 1812*c83a76b0SSuyog Pawar /** Values of lambda and the Q format */ 1813*c83a76b0SSuyog Pawar S32 lambda; 1814*c83a76b0SSuyog Pawar S32 lambda_q_shift; 1815*c83a76b0SSuyog Pawar 1816*c83a76b0SSuyog Pawar /** Step size for full search 2/4 */ 1817*c83a76b0SSuyog Pawar S32 full_search_step; 1818*c83a76b0SSuyog Pawar 1819*c83a76b0SSuyog Pawar } coarse_prms_t; 1820*c83a76b0SSuyog Pawar 1821*c83a76b0SSuyog Pawar typedef struct 1822*c83a76b0SSuyog Pawar { 1823*c83a76b0SSuyog Pawar /** 1824*c83a76b0SSuyog Pawar * These pointers point to modified input, one each for one ref idx. 1825*c83a76b0SSuyog Pawar * Instead of weighting the reference, we weight the input with inverse 1826*c83a76b0SSuyog Pawar * wt and offset. 1827*c83a76b0SSuyog Pawar * +1 for storing non weighted input 1828*c83a76b0SSuyog Pawar */ 1829*c83a76b0SSuyog Pawar U08 *apu1_wt_inp[MAX_NUM_REF + 1]; 1830*c83a76b0SSuyog Pawar 1831*c83a76b0SSuyog Pawar /* These are allocated once at the start of encoding */ 1832*c83a76b0SSuyog Pawar /* These are necessary only if wt_pred is switched on */ 1833*c83a76b0SSuyog Pawar /* Else, only a single buffer is used to store the */ 1834*c83a76b0SSuyog Pawar /* unweighed input */ 1835*c83a76b0SSuyog Pawar U08 *apu1_wt_inp_buf_array[MAX_NUM_REF + 1]; 1836*c83a76b0SSuyog Pawar 1837*c83a76b0SSuyog Pawar /** Stores the weights and offsets for each ref */ 1838*c83a76b0SSuyog Pawar S32 a_wpred_wt[MAX_NUM_REF]; 1839*c83a76b0SSuyog Pawar S32 a_inv_wpred_wt[MAX_NUM_REF]; 1840*c83a76b0SSuyog Pawar S32 a_wpred_off[MAX_NUM_REF]; 1841*c83a76b0SSuyog Pawar S32 wpred_log_wdc; 1842*c83a76b0SSuyog Pawar 1843*c83a76b0SSuyog Pawar S32 ai4_shift_val[MAX_NUM_REF]; 1844*c83a76b0SSuyog Pawar } wgt_pred_ctxt_t; 1845*c83a76b0SSuyog Pawar 1846*c83a76b0SSuyog Pawar /** 1847*c83a76b0SSuyog Pawar ****************************************************************************** 1848*c83a76b0SSuyog Pawar * @struct mv_refine_ctxt_t 1849*c83a76b0SSuyog Pawar * @brief This structure contains important parameters used motion vector 1850*c83a76b0SSuyog Pawar refinement 1851*c83a76b0SSuyog Pawar ****************************************************************************** 1852*c83a76b0SSuyog Pawar */ 1853*c83a76b0SSuyog Pawar typedef struct 1854*c83a76b0SSuyog Pawar { 1855*c83a76b0SSuyog Pawar /* Added +7 in the array sizes below to make every array dimension 1856*c83a76b0SSuyog Pawar 16-byte aligned */ 1857*c83a76b0SSuyog Pawar /** Cost of best candidate for each partition*/ 1858*c83a76b0SSuyog Pawar MEM_ALIGN16 WORD16 i2_tot_cost[2][TOT_NUM_PARTS + 7]; 1859*c83a76b0SSuyog Pawar 1860*c83a76b0SSuyog Pawar MEM_ALIGN16 WORD16 i2_stim_injected_cost[2][TOT_NUM_PARTS + 7]; 1861*c83a76b0SSuyog Pawar 1862*c83a76b0SSuyog Pawar /** Motion vector cost for the best candidate of each partition*/ 1863*c83a76b0SSuyog Pawar MEM_ALIGN16 WORD16 i2_mv_cost[2][TOT_NUM_PARTS + 7]; 1864*c83a76b0SSuyog Pawar /** X component of the motion vector of the best candidate of each partition*/ 1865*c83a76b0SSuyog Pawar MEM_ALIGN16 WORD16 i2_mv_x[2][TOT_NUM_PARTS + 7]; 1866*c83a76b0SSuyog Pawar /** Y component of the motion vector of the best candidate of each partition*/ 1867*c83a76b0SSuyog Pawar MEM_ALIGN16 WORD16 i2_mv_y[2][TOT_NUM_PARTS + 7]; 1868*c83a76b0SSuyog Pawar /** Reference index of the best candidate of each partition*/ 1869*c83a76b0SSuyog Pawar MEM_ALIGN16 WORD16 i2_ref_idx[2][TOT_NUM_PARTS + 7]; 1870*c83a76b0SSuyog Pawar 1871*c83a76b0SSuyog Pawar /** Partition id for the various partitions*/ 1872*c83a76b0SSuyog Pawar WORD32 ai4_part_id[TOT_NUM_PARTS + 1]; 1873*c83a76b0SSuyog Pawar /** Indicates the total number of valid partitions*/ 1874*c83a76b0SSuyog Pawar WORD32 i4_num_valid_parts; 1875*c83a76b0SSuyog Pawar 1876*c83a76b0SSuyog Pawar /** Number of candidates to refine through*/ 1877*c83a76b0SSuyog Pawar WORD32 i4_num_search_nodes; 1878*c83a76b0SSuyog Pawar 1879*c83a76b0SSuyog Pawar /** Stores the satd at the end of fullpel refinement*/ 1880*c83a76b0SSuyog Pawar WORD16 ai2_fullpel_satd[2][TOT_NUM_PARTS]; 1881*c83a76b0SSuyog Pawar } mv_refine_ctxt_t; 1882*c83a76b0SSuyog Pawar 1883*c83a76b0SSuyog Pawar typedef mv_refine_ctxt_t fullpel_refine_ctxt_t; 1884*c83a76b0SSuyog Pawar typedef mv_refine_ctxt_t subpel_refine_ctxt_t; 1885*c83a76b0SSuyog Pawar /** 1886*c83a76b0SSuyog Pawar ****************************************************************************** 1887*c83a76b0SSuyog Pawar * @struct hme_search_prms_t 1888*c83a76b0SSuyog Pawar * @brief All prms going to any fpel search 1889*c83a76b0SSuyog Pawar ****************************************************************************** 1890*c83a76b0SSuyog Pawar */ 1891*c83a76b0SSuyog Pawar typedef struct 1892*c83a76b0SSuyog Pawar { 1893*c83a76b0SSuyog Pawar /** for explicit search, indicates which ref frm to search */ 1894*c83a76b0SSuyog Pawar /** for implicit search, indicates the prediction direction for search */ 1895*c83a76b0SSuyog Pawar S08 i1_ref_idx; 1896*c83a76b0SSuyog Pawar 1897*c83a76b0SSuyog Pawar /** Blk size used for search, and for which the search is done */ 1898*c83a76b0SSuyog Pawar BLK_SIZE_T e_blk_size; 1899*c83a76b0SSuyog Pawar 1900*c83a76b0SSuyog Pawar /** Number of init candts being searched */ 1901*c83a76b0SSuyog Pawar S32 i4_num_init_candts; 1902*c83a76b0SSuyog Pawar 1903*c83a76b0SSuyog Pawar S32 i4_num_steps_post_refine; 1904*c83a76b0SSuyog Pawar 1905*c83a76b0SSuyog Pawar /** 1906*c83a76b0SSuyog Pawar * For coarser searches, bigger refinement is done around each candt 1907*c83a76b0SSuyog Pawar * in these cases, this prm has start step 1908*c83a76b0SSuyog Pawar */ 1909*c83a76b0SSuyog Pawar S32 i4_start_step; 1910*c83a76b0SSuyog Pawar 1911*c83a76b0SSuyog Pawar /** whether SATD to be used for srch */ 1912*c83a76b0SSuyog Pawar S32 i4_use_satd; 1913*c83a76b0SSuyog Pawar 1914*c83a76b0SSuyog Pawar /** if 1, we use recon frm for search (closed loop ) */ 1915*c83a76b0SSuyog Pawar S32 i4_use_rec; 1916*c83a76b0SSuyog Pawar 1917*c83a76b0SSuyog Pawar /** bitmask of active partitions */ 1918*c83a76b0SSuyog Pawar S32 i4_part_mask; 1919*c83a76b0SSuyog Pawar 1920*c83a76b0SSuyog Pawar /** x and y offset of blk w.r.t. pic start */ 1921*c83a76b0SSuyog Pawar S32 i4_x_off; 1922*c83a76b0SSuyog Pawar S32 i4_y_off; 1923*c83a76b0SSuyog Pawar 1924*c83a76b0SSuyog Pawar /** 1925*c83a76b0SSuyog Pawar * max number of iterations to search if early exit not hit 1926*c83a76b0SSuyog Pawar * relevant only for coarser searches 1927*c83a76b0SSuyog Pawar */ 1928*c83a76b0SSuyog Pawar S32 i4_max_iters; 1929*c83a76b0SSuyog Pawar 1930*c83a76b0SSuyog Pawar /** pointer to str holding all results for this blk */ 1931*c83a76b0SSuyog Pawar search_results_t *ps_search_results; 1932*c83a76b0SSuyog Pawar 1933*c83a76b0SSuyog Pawar /** pts to str having all search candt with refinement info */ 1934*c83a76b0SSuyog Pawar search_candt_t *ps_search_candts; 1935*c83a76b0SSuyog Pawar /** pts to str having valid mv range info for this blk */ 1936*c83a76b0SSuyog Pawar range_prms_t *aps_mv_range[MAX_NUM_REF]; 1937*c83a76b0SSuyog Pawar /** cost compute fxnptr */ 1938*c83a76b0SSuyog Pawar PF_MV_COST_FXN pf_mv_cost_compute; 1939*c83a76b0SSuyog Pawar 1940*c83a76b0SSuyog Pawar /** when this str is set up for full search, indicates step size for same */ 1941*c83a76b0SSuyog Pawar S32 full_search_step; 1942*c83a76b0SSuyog Pawar 1943*c83a76b0SSuyog Pawar /** stride ofinp buffer */ 1944*c83a76b0SSuyog Pawar S32 i4_inp_stride; 1945*c83a76b0SSuyog Pawar 1946*c83a76b0SSuyog Pawar /** x and y offset of cu w.r.t. ctb start, set to 0 for non enc layer */ 1947*c83a76b0SSuyog Pawar S32 i4_cu_x_off; 1948*c83a76b0SSuyog Pawar S32 i4_cu_y_off; 1949*c83a76b0SSuyog Pawar 1950*c83a76b0SSuyog Pawar /** base pointer to the de-duplicated search nodes */ 1951*c83a76b0SSuyog Pawar search_node_t *ps_search_nodes; 1952*c83a76b0SSuyog Pawar 1953*c83a76b0SSuyog Pawar /** number of de-duplicated nodes to be searched */ 1954*c83a76b0SSuyog Pawar S32 i4_num_search_nodes; 1955*c83a76b0SSuyog Pawar 1956*c83a76b0SSuyog Pawar fullpel_refine_ctxt_t *ps_fullpel_refine_ctxt; 1957*c83a76b0SSuyog Pawar 1958*c83a76b0SSuyog Pawar U32 au4_src_variance[TOT_NUM_PARTS]; 1959*c83a76b0SSuyog Pawar 1960*c83a76b0SSuyog Pawar S32 i4_alpha_stim_multiplier; 1961*c83a76b0SSuyog Pawar 1962*c83a76b0SSuyog Pawar U08 u1_is_cu_noisy; 1963*c83a76b0SSuyog Pawar 1964*c83a76b0SSuyog Pawar ULWORD64 *pu8_part_src_sigmaX; 1965*c83a76b0SSuyog Pawar ULWORD64 *pu8_part_src_sigmaXSquared; 1966*c83a76b0SSuyog Pawar 1967*c83a76b0SSuyog Pawar } hme_search_prms_t; 1968*c83a76b0SSuyog Pawar 1969*c83a76b0SSuyog Pawar /** 1970*c83a76b0SSuyog Pawar ****************************************************************************** 1971*c83a76b0SSuyog Pawar * @struct hme_err_prms_t 1972*c83a76b0SSuyog Pawar * @brief This is input prms struct for SAD/SATD computation 1973*c83a76b0SSuyog Pawar ****************************************************************************** 1974*c83a76b0SSuyog Pawar */ 1975*c83a76b0SSuyog Pawar typedef struct 1976*c83a76b0SSuyog Pawar { 1977*c83a76b0SSuyog Pawar /** Ptr to input blk for which err computed */ 1978*c83a76b0SSuyog Pawar U08 *pu1_inp; 1979*c83a76b0SSuyog Pawar 1980*c83a76b0SSuyog Pawar U16 *pu2_inp; 1981*c83a76b0SSuyog Pawar 1982*c83a76b0SSuyog Pawar /** Ptr to ref blk after adjusting for mv and coordinates in pic */ 1983*c83a76b0SSuyog Pawar U08 *pu1_ref; 1984*c83a76b0SSuyog Pawar 1985*c83a76b0SSuyog Pawar U16 *pu2_ref; 1986*c83a76b0SSuyog Pawar 1987*c83a76b0SSuyog Pawar /** Stride of input buffer */ 1988*c83a76b0SSuyog Pawar S32 i4_inp_stride; 1989*c83a76b0SSuyog Pawar /** Stride of ref buffer */ 1990*c83a76b0SSuyog Pawar S32 i4_ref_stride; 1991*c83a76b0SSuyog Pawar /** Mask of active partitions. */ 1992*c83a76b0SSuyog Pawar S32 i4_part_mask; 1993*c83a76b0SSuyog Pawar /** Mask of active grid pts. Refer to GRID_PT_T enum for bit posns */ 1994*c83a76b0SSuyog Pawar S32 i4_grid_mask; 1995*c83a76b0SSuyog Pawar /** 1996*c83a76b0SSuyog Pawar * Pointer to SAD Grid where SADs for each partition are stored. 1997*c83a76b0SSuyog Pawar * The layout is as follows: If there are M total partitions 1998*c83a76b0SSuyog Pawar * and N active pts in the grid, then the first N results contain 1999*c83a76b0SSuyog Pawar * first partition, e.g. 2Nx2N. Next N results contain 2nd partitino 2000*c83a76b0SSuyog Pawar * sad, e.g. 2NxN_T. Totally we have MxN results. 2001*c83a76b0SSuyog Pawar * Note: The active partition count may be lesser than M, still we 2002*c83a76b0SSuyog Pawar * have results for M partitions 2003*c83a76b0SSuyog Pawar */ 2004*c83a76b0SSuyog Pawar S32 *pi4_sad_grid; 2005*c83a76b0SSuyog Pawar 2006*c83a76b0SSuyog Pawar /** Pointer to TU_SPLIT grid flags */ 2007*c83a76b0SSuyog Pawar S32 *pi4_tu_split_flags; 2008*c83a76b0SSuyog Pawar 2009*c83a76b0SSuyog Pawar /** Pointer to the Child's satd cost */ 2010*c83a76b0SSuyog Pawar S32 *pi4_child_cost; 2011*c83a76b0SSuyog Pawar 2012*c83a76b0SSuyog Pawar /** pointer to the child'd TU_split flags */ 2013*c83a76b0SSuyog Pawar S32 *pi4_child_tu_split_flags; 2014*c83a76b0SSuyog Pawar 2015*c83a76b0SSuyog Pawar /** pointer to the child'd TU_early_cbf flags */ 2016*c83a76b0SSuyog Pawar S32 *pi4_child_tu_early_cbf; 2017*c83a76b0SSuyog Pawar 2018*c83a76b0SSuyog Pawar /** Pointer to TU early CBF flags */ 2019*c83a76b0SSuyog Pawar S32 *pi4_tu_early_cbf; 2020*c83a76b0SSuyog Pawar 2021*c83a76b0SSuyog Pawar /** pointer to the early cbf thresholds */ 2022*c83a76b0SSuyog Pawar S32 *pi4_tu_early_cbf_threshold; 2023*c83a76b0SSuyog Pawar 2024*c83a76b0SSuyog Pawar /** store the DC value */ 2025*c83a76b0SSuyog Pawar S32 i4_dc_val; 2026*c83a76b0SSuyog Pawar 2027*c83a76b0SSuyog Pawar /** Block width and ht of the block being evaluated for SAD */ 2028*c83a76b0SSuyog Pawar S32 i4_blk_wd; 2029*c83a76b0SSuyog Pawar S32 i4_blk_ht; 2030*c83a76b0SSuyog Pawar 2031*c83a76b0SSuyog Pawar /** 2032*c83a76b0SSuyog Pawar * Array of valid partition ids. E.g. if 2 partitions active, 2033*c83a76b0SSuyog Pawar * then there will be 3 entries, 3rd entry being -1 2034*c83a76b0SSuyog Pawar */ 2035*c83a76b0SSuyog Pawar S32 *pi4_valid_part_ids; 2036*c83a76b0SSuyog Pawar /** Step size of the grid */ 2037*c83a76b0SSuyog Pawar S32 i4_step; 2038*c83a76b0SSuyog Pawar 2039*c83a76b0SSuyog Pawar /* Number of partitions */ 2040*c83a76b0SSuyog Pawar S32 i4_num_partitions; 2041*c83a76b0SSuyog Pawar 2042*c83a76b0SSuyog Pawar /** Store the tu_spli_flag cost */ 2043*c83a76b0SSuyog Pawar S32 i4_tu_split_cost; 2044*c83a76b0SSuyog Pawar 2045*c83a76b0SSuyog Pawar /** The max_depth for inter tu_tree */ 2046*c83a76b0SSuyog Pawar U08 u1_max_tr_depth; 2047*c83a76b0SSuyog Pawar 2048*c83a76b0SSuyog Pawar U08 u1_max_tr_size; 2049*c83a76b0SSuyog Pawar 2050*c83a76b0SSuyog Pawar /** Scratch memory for Doing hadamard */ 2051*c83a76b0SSuyog Pawar U08 *pu1_wkg_mem; 2052*c83a76b0SSuyog Pawar 2053*c83a76b0SSuyog Pawar ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list; 2054*c83a76b0SSuyog Pawar 2055*c83a76b0SSuyog Pawar } err_prms_t; 2056*c83a76b0SSuyog Pawar 2057*c83a76b0SSuyog Pawar typedef struct grid 2058*c83a76b0SSuyog Pawar { 2059*c83a76b0SSuyog Pawar WORD32 num_grids; /* Number of grid to work with */ 2060*c83a76b0SSuyog Pawar WORD32 ref_buf_stride; /* Buffer stride of reference buffer */ 2061*c83a76b0SSuyog Pawar WORD32 2062*c83a76b0SSuyog Pawar grd_sz_y_x; /* Packed 16 bits indicating grid spacing in y & x direction <--grid-size-y--><--grid-size-x--> */ 2063*c83a76b0SSuyog Pawar UWORD8 **ppu1_ref_ptr; /* Center point for the grid search */ 2064*c83a76b0SSuyog Pawar WORD32 *pi4_grd_mask; /* Mask indicating which grid points need to be evaluated */ 2065*c83a76b0SSuyog Pawar hme_mv_t *p_mv; /* <--MVy--><--MVx--> */ 2066*c83a76b0SSuyog Pawar WORD32 *p_ref_idx; /* Ref idx to which the grid is pointing */ 2067*c83a76b0SSuyog Pawar } grid_ctxt_t; 2068*c83a76b0SSuyog Pawar 2069*c83a76b0SSuyog Pawar typedef struct cand 2070*c83a76b0SSuyog Pawar { 2071*c83a76b0SSuyog Pawar hme_mv_t mv; /* MV corresponding to the candidate <--MVy--><--MVx--> */ 2072*c83a76b0SSuyog Pawar WORD32 ref_idx; /* Ref idx corresponding to the candidate */ 2073*c83a76b0SSuyog Pawar WORD32 grid_ix; /* Grid to which this candidate belongs */ 2074*c83a76b0SSuyog Pawar UWORD8 *pu1_ref_ptr; /* Pointer to the candidate */ 2075*c83a76b0SSuyog Pawar } cand_t; 2076*c83a76b0SSuyog Pawar 2077*c83a76b0SSuyog Pawar /** 2078*c83a76b0SSuyog Pawar ****************************************************************************** 2079*c83a76b0SSuyog Pawar * @struct hme_ctb_prms_t 2080*c83a76b0SSuyog Pawar * @brief Parameters to create the CTB list, which is a tree structure 2081*c83a76b0SSuyog Pawar ****************************************************************************** 2082*c83a76b0SSuyog Pawar */ 2083*c83a76b0SSuyog Pawar typedef struct 2084*c83a76b0SSuyog Pawar { 2085*c83a76b0SSuyog Pawar /** 2086*c83a76b0SSuyog Pawar * These parameters cover number of input 16x16, 32x32 and 64x64 results 2087*c83a76b0SSuyog Pawar * and the number of output results that are mix of all above CU sizes. 2088*c83a76b0SSuyog Pawar * i4_num_kxk_unified_out is relevant only if we are sending multiple CU 2089*c83a76b0SSuyog Pawar * sizes for same region for RD Opt. 2090*c83a76b0SSuyog Pawar */ 2091*c83a76b0SSuyog Pawar S32 i4_num_16x16_in; 2092*c83a76b0SSuyog Pawar S32 i4_num_32x32_in; 2093*c83a76b0SSuyog Pawar S32 i4_num_32x32_unified_out; 2094*c83a76b0SSuyog Pawar S32 i4_num_64x64_in; 2095*c83a76b0SSuyog Pawar S32 i4_num_64x64_unified_out; 2096*c83a76b0SSuyog Pawar 2097*c83a76b0SSuyog Pawar /** Pointers to results at differen CU sizes */ 2098*c83a76b0SSuyog Pawar search_results_t *ps_search_results_16x16; 2099*c83a76b0SSuyog Pawar search_results_t *ps_search_results_32x32; 2100*c83a76b0SSuyog Pawar search_results_t *ps_search_results_64x64; 2101*c83a76b0SSuyog Pawar 2102*c83a76b0SSuyog Pawar S32 i4_num_part_type; 2103*c83a76b0SSuyog Pawar 2104*c83a76b0SSuyog Pawar /** Indicates whether we have split at 64x64 level */ 2105*c83a76b0SSuyog Pawar S32 i4_cu_64x64_split; 2106*c83a76b0SSuyog Pawar /** Indicates whether each of the 32x32 CU is split */ 2107*c83a76b0SSuyog Pawar S32 ai4_cu_32x32_split[4]; 2108*c83a76b0SSuyog Pawar 2109*c83a76b0SSuyog Pawar /** X and y offset of the CTB */ 2110*c83a76b0SSuyog Pawar S32 i4_ctb_x; 2111*c83a76b0SSuyog Pawar S32 i4_ctb_y; 2112*c83a76b0SSuyog Pawar 2113*c83a76b0SSuyog Pawar /** 2114*c83a76b0SSuyog Pawar * Memory manager for the CTB that is responsible for node allocation 2115*c83a76b0SSuyog Pawar * at a CU level 2116*c83a76b0SSuyog Pawar */ 2117*c83a76b0SSuyog Pawar ctb_mem_mgr_t *ps_ctb_mem_mgr; 2118*c83a76b0SSuyog Pawar 2119*c83a76b0SSuyog Pawar /** Buffer manager that is responsible for memory allocation (pred bufs) */ 2120*c83a76b0SSuyog Pawar buf_mgr_t *ps_buf_mgr; 2121*c83a76b0SSuyog Pawar } hme_ctb_prms_t; 2122*c83a76b0SSuyog Pawar 2123*c83a76b0SSuyog Pawar /** 2124*c83a76b0SSuyog Pawar ****************************************************************************** 2125*c83a76b0SSuyog Pawar * @struct result_upd_prms_t 2126*c83a76b0SSuyog Pawar * @brief Updation of results 2127*c83a76b0SSuyog Pawar ****************************************************************************** 2128*c83a76b0SSuyog Pawar */ 2129*c83a76b0SSuyog Pawar typedef struct 2130*c83a76b0SSuyog Pawar { 2131*c83a76b0SSuyog Pawar /** Cost compuatation function ponter */ 2132*c83a76b0SSuyog Pawar PF_MV_COST_FXN pf_mv_cost_compute; 2133*c83a76b0SSuyog Pawar 2134*c83a76b0SSuyog Pawar /** Points to the SAD grid updated during SAD compute fxn */ 2135*c83a76b0SSuyog Pawar S32 *pi4_sad_grid; 2136*c83a76b0SSuyog Pawar 2137*c83a76b0SSuyog Pawar /** Points to the TU_SPLIT grid updates duting the SATD TU REC fxn */ 2138*c83a76b0SSuyog Pawar S32 *pi4_tu_split_flags; 2139*c83a76b0SSuyog Pawar 2140*c83a76b0SSuyog Pawar /** 2141*c83a76b0SSuyog Pawar * This is the central mv of the grid. For e.g. if we have a 3x3 grid, 2142*c83a76b0SSuyog Pawar * this covers the central pt's mv in the grid. 2143*c83a76b0SSuyog Pawar */ 2144*c83a76b0SSuyog Pawar const search_node_t *ps_search_node_base; 2145*c83a76b0SSuyog Pawar 2146*c83a76b0SSuyog Pawar /** Search results structure updated by the result update fxn */ 2147*c83a76b0SSuyog Pawar search_results_t *ps_search_results; 2148*c83a76b0SSuyog Pawar 2149*c83a76b0SSuyog Pawar /** List of active partitions, only these are processed and updated */ 2150*c83a76b0SSuyog Pawar S32 *pi4_valid_part_ids; 2151*c83a76b0SSuyog Pawar 2152*c83a76b0SSuyog Pawar /** Reference id for this candt and grid */ 2153*c83a76b0SSuyog Pawar S08 i1_ref_idx; 2154*c83a76b0SSuyog Pawar 2155*c83a76b0SSuyog Pawar /** Mask of active pts in the grid */ 2156*c83a76b0SSuyog Pawar S32 i4_grid_mask; 2157*c83a76b0SSuyog Pawar 2158*c83a76b0SSuyog Pawar /** 2159*c83a76b0SSuyog Pawar * For early exit reasons we may want to know the id of the least candt 2160*c83a76b0SSuyog Pawar * This will correspond to id of candt with least cost for 2Nx2N part, 2161*c83a76b0SSuyog Pawar * if multiple partitions enabled, or if 1 part enabled, it will be for 2162*c83a76b0SSuyog Pawar * id of candt of that partition 2163*c83a76b0SSuyog Pawar */ 2164*c83a76b0SSuyog Pawar S32 i4_min_id; 2165*c83a76b0SSuyog Pawar 2166*c83a76b0SSuyog Pawar /** Step size of the grid */ 2167*c83a76b0SSuyog Pawar S32 i4_step; 2168*c83a76b0SSuyog Pawar 2169*c83a76b0SSuyog Pawar /** Mask of active partitions */ 2170*c83a76b0SSuyog Pawar S32 i4_part_mask; 2171*c83a76b0SSuyog Pawar 2172*c83a76b0SSuyog Pawar /** Min cost corresponding to min id */ 2173*c83a76b0SSuyog Pawar S32 i4_min_cost; 2174*c83a76b0SSuyog Pawar 2175*c83a76b0SSuyog Pawar /** Store the motion vectors in qpel unit*/ 2176*c83a76b0SSuyog Pawar S16 i2_mv_x; 2177*c83a76b0SSuyog Pawar 2178*c83a76b0SSuyog Pawar S16 i2_mv_y; 2179*c83a76b0SSuyog Pawar 2180*c83a76b0SSuyog Pawar U08 u1_pred_lx; 2181*c83a76b0SSuyog Pawar 2182*c83a76b0SSuyog Pawar subpel_refine_ctxt_t *ps_subpel_refine_ctxt; 2183*c83a76b0SSuyog Pawar 2184*c83a76b0SSuyog Pawar /** Current candidate in the subpel refinement process*/ 2185*c83a76b0SSuyog Pawar search_node_t *ps_search_node; 2186*c83a76b0SSuyog Pawar 2187*c83a76b0SSuyog Pawar } result_upd_prms_t; 2188*c83a76b0SSuyog Pawar 2189*c83a76b0SSuyog Pawar /** 2190*c83a76b0SSuyog Pawar ****************************************************************************** 2191*c83a76b0SSuyog Pawar * @struct mv_grid_t 2192*c83a76b0SSuyog Pawar * @brief Grid of MVs storing results for a CTB and neighbours. For a CTB 2193*c83a76b0SSuyog Pawar * of size 64x64, we may store upto 16x16 mvs (one for each 4x4) 2194*c83a76b0SSuyog Pawar * along with 1 neighbour on each side. Valid only for encode layer 2195*c83a76b0SSuyog Pawar ****************************************************************************** 2196*c83a76b0SSuyog Pawar */ 2197*c83a76b0SSuyog Pawar typedef struct 2198*c83a76b0SSuyog Pawar { 2199*c83a76b0SSuyog Pawar /** All the mvs in the grid */ 2200*c83a76b0SSuyog Pawar search_node_t as_node[NUM_MVS_IN_CTB_GRID]; 2201*c83a76b0SSuyog Pawar 2202*c83a76b0SSuyog Pawar /** Stride of the grid */ 2203*c83a76b0SSuyog Pawar S32 i4_stride; 2204*c83a76b0SSuyog Pawar 2205*c83a76b0SSuyog Pawar /** Start offset of the 0,0 locn in CTB. */ 2206*c83a76b0SSuyog Pawar S32 i4_start_offset; 2207*c83a76b0SSuyog Pawar } mv_grid_t; 2208*c83a76b0SSuyog Pawar 2209*c83a76b0SSuyog Pawar typedef struct 2210*c83a76b0SSuyog Pawar { 2211*c83a76b0SSuyog Pawar /* centroid's (x, y) co-ordinates in Q8 format */ 2212*c83a76b0SSuyog Pawar WORD32 i4_pos_x_q8; 2213*c83a76b0SSuyog Pawar 2214*c83a76b0SSuyog Pawar WORD32 i4_pos_y_q8; 2215*c83a76b0SSuyog Pawar } centroid_t; 2216*c83a76b0SSuyog Pawar 2217*c83a76b0SSuyog Pawar typedef struct 2218*c83a76b0SSuyog Pawar { 2219*c83a76b0SSuyog Pawar S16 min_x; 2220*c83a76b0SSuyog Pawar 2221*c83a76b0SSuyog Pawar S16 min_y; 2222*c83a76b0SSuyog Pawar 2223*c83a76b0SSuyog Pawar S16 max_x; 2224*c83a76b0SSuyog Pawar 2225*c83a76b0SSuyog Pawar S16 max_y; 2226*c83a76b0SSuyog Pawar 2227*c83a76b0SSuyog Pawar /* The cumulative sum of partition sizes of the mvs */ 2228*c83a76b0SSuyog Pawar /* in this cluster */ 2229*c83a76b0SSuyog Pawar S16 area_in_pixels; 2230*c83a76b0SSuyog Pawar 2231*c83a76b0SSuyog Pawar S16 uni_mv_pixel_area; 2232*c83a76b0SSuyog Pawar 2233*c83a76b0SSuyog Pawar S16 bi_mv_pixel_area; 2234*c83a76b0SSuyog Pawar 2235*c83a76b0SSuyog Pawar mv_data_t as_mv[128]; 2236*c83a76b0SSuyog Pawar 2237*c83a76b0SSuyog Pawar U08 num_mvs; 2238*c83a76b0SSuyog Pawar 2239*c83a76b0SSuyog Pawar /* Weighted average of all mvs in the cluster */ 2240*c83a76b0SSuyog Pawar centroid_t s_centroid; 2241*c83a76b0SSuyog Pawar 2242*c83a76b0SSuyog Pawar S08 ref_id; 2243*c83a76b0SSuyog Pawar 2244*c83a76b0SSuyog Pawar S32 max_dist_from_centroid; 2245*c83a76b0SSuyog Pawar 2246*c83a76b0SSuyog Pawar U08 is_valid_cluster; 2247*c83a76b0SSuyog Pawar 2248*c83a76b0SSuyog Pawar } cluster_data_t; 2249*c83a76b0SSuyog Pawar 2250*c83a76b0SSuyog Pawar typedef struct 2251*c83a76b0SSuyog Pawar { 2252*c83a76b0SSuyog Pawar cluster_data_t as_cluster_data[MAX_NUM_CLUSTERS_16x16]; 2253*c83a76b0SSuyog Pawar 2254*c83a76b0SSuyog Pawar U08 num_clusters; 2255*c83a76b0SSuyog Pawar 2256*c83a76b0SSuyog Pawar U08 au1_num_clusters[MAX_NUM_REF]; 2257*c83a76b0SSuyog Pawar 2258*c83a76b0SSuyog Pawar S16 intra_mv_area; 2259*c83a76b0SSuyog Pawar 2260*c83a76b0SSuyog Pawar S32 best_inter_cost; 2261*c83a76b0SSuyog Pawar 2262*c83a76b0SSuyog Pawar } cluster_16x16_blk_t; 2263*c83a76b0SSuyog Pawar 2264*c83a76b0SSuyog Pawar typedef struct 2265*c83a76b0SSuyog Pawar { 2266*c83a76b0SSuyog Pawar cluster_data_t as_cluster_data[MAX_NUM_CLUSTERS_32x32]; 2267*c83a76b0SSuyog Pawar 2268*c83a76b0SSuyog Pawar U08 num_clusters; 2269*c83a76b0SSuyog Pawar 2270*c83a76b0SSuyog Pawar U08 au1_num_clusters[MAX_NUM_REF]; 2271*c83a76b0SSuyog Pawar 2272*c83a76b0SSuyog Pawar S16 intra_mv_area; 2273*c83a76b0SSuyog Pawar 2274*c83a76b0SSuyog Pawar S08 best_uni_ref; 2275*c83a76b0SSuyog Pawar 2276*c83a76b0SSuyog Pawar S08 best_alt_ref; 2277*c83a76b0SSuyog Pawar 2278*c83a76b0SSuyog Pawar S32 best_inter_cost; 2279*c83a76b0SSuyog Pawar 2280*c83a76b0SSuyog Pawar U08 num_refs; 2281*c83a76b0SSuyog Pawar 2282*c83a76b0SSuyog Pawar U08 num_clusters_with_weak_sdi_density; 2283*c83a76b0SSuyog Pawar 2284*c83a76b0SSuyog Pawar } cluster_32x32_blk_t; 2285*c83a76b0SSuyog Pawar 2286*c83a76b0SSuyog Pawar typedef struct 2287*c83a76b0SSuyog Pawar { 2288*c83a76b0SSuyog Pawar cluster_data_t as_cluster_data[MAX_NUM_CLUSTERS_64x64]; 2289*c83a76b0SSuyog Pawar 2290*c83a76b0SSuyog Pawar U08 num_clusters; 2291*c83a76b0SSuyog Pawar 2292*c83a76b0SSuyog Pawar U08 au1_num_clusters[MAX_NUM_REF]; 2293*c83a76b0SSuyog Pawar 2294*c83a76b0SSuyog Pawar S16 intra_mv_area; 2295*c83a76b0SSuyog Pawar 2296*c83a76b0SSuyog Pawar S08 best_uni_ref; 2297*c83a76b0SSuyog Pawar 2298*c83a76b0SSuyog Pawar S08 best_alt_ref; 2299*c83a76b0SSuyog Pawar 2300*c83a76b0SSuyog Pawar S32 best_inter_cost; 2301*c83a76b0SSuyog Pawar 2302*c83a76b0SSuyog Pawar U08 num_refs; 2303*c83a76b0SSuyog Pawar 2304*c83a76b0SSuyog Pawar } cluster_64x64_blk_t; 2305*c83a76b0SSuyog Pawar 2306*c83a76b0SSuyog Pawar typedef struct 2307*c83a76b0SSuyog Pawar { 2308*c83a76b0SSuyog Pawar cluster_16x16_blk_t *ps_16x16_blk; 2309*c83a76b0SSuyog Pawar 2310*c83a76b0SSuyog Pawar cluster_32x32_blk_t *ps_32x32_blk; 2311*c83a76b0SSuyog Pawar 2312*c83a76b0SSuyog Pawar cluster_64x64_blk_t *ps_64x64_blk; 2313*c83a76b0SSuyog Pawar 2314*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_cu_tree_root; 2315*c83a76b0SSuyog Pawar ipe_l0_ctb_analyse_for_me_t *ps_cur_ipe_ctb; 2316*c83a76b0SSuyog Pawar S32 nodes_created_in_cu_tree; 2317*c83a76b0SSuyog Pawar 2318*c83a76b0SSuyog Pawar S32 *pi4_blk_8x8_mask; 2319*c83a76b0SSuyog Pawar 2320*c83a76b0SSuyog Pawar S32 blk_32x32_mask; 2321*c83a76b0SSuyog Pawar 2322*c83a76b0SSuyog Pawar S32 sdi_threshold; 2323*c83a76b0SSuyog Pawar 2324*c83a76b0SSuyog Pawar S32 i4_frame_qstep; 2325*c83a76b0SSuyog Pawar 2326*c83a76b0SSuyog Pawar S32 i4_frame_qstep_multiplier; 2327*c83a76b0SSuyog Pawar 2328*c83a76b0SSuyog Pawar U08 au1_is_16x16_blk_split[16]; 2329*c83a76b0SSuyog Pawar 2330*c83a76b0SSuyog Pawar S32 ai4_part_mask[16]; 2331*c83a76b0SSuyog Pawar 2332*c83a76b0SSuyog Pawar } ctb_cluster_info_t; 2333*c83a76b0SSuyog Pawar 2334*c83a76b0SSuyog Pawar /** 2335*c83a76b0SSuyog Pawar ****************************************************************************** 2336*c83a76b0SSuyog Pawar * @struct hme_merge_prms_t 2337*c83a76b0SSuyog Pawar * @brief All parameters related to the merge process 2338*c83a76b0SSuyog Pawar ****************************************************************************** 2339*c83a76b0SSuyog Pawar */ 2340*c83a76b0SSuyog Pawar typedef struct 2341*c83a76b0SSuyog Pawar { 2342*c83a76b0SSuyog Pawar /** 2343*c83a76b0SSuyog Pawar * MV Range prms for the merged CU, this may have to be conservative 2344*c83a76b0SSuyog Pawar * in comparison to individual CUs 2345*c83a76b0SSuyog Pawar */ 2346*c83a76b0SSuyog Pawar range_prms_t *aps_mv_range[MAX_NUM_REF]; 2347*c83a76b0SSuyog Pawar 2348*c83a76b0SSuyog Pawar /** Pointers to search results of 4 children CUs to be merged */ 2349*c83a76b0SSuyog Pawar search_results_t *ps_results_tl; 2350*c83a76b0SSuyog Pawar search_results_t *ps_results_tr; 2351*c83a76b0SSuyog Pawar search_results_t *ps_results_bl; 2352*c83a76b0SSuyog Pawar search_results_t *ps_results_br; 2353*c83a76b0SSuyog Pawar 2354*c83a76b0SSuyog Pawar search_results_t *ps_results_grandchild; 2355*c83a76b0SSuyog Pawar 2356*c83a76b0SSuyog Pawar /** Pointer to search results of the parent CU updated during merge */ 2357*c83a76b0SSuyog Pawar search_results_t *ps_results_merge; 2358*c83a76b0SSuyog Pawar 2359*c83a76b0SSuyog Pawar inter_cu_results_t *ps_8x8_cu_results; 2360*c83a76b0SSuyog Pawar 2361*c83a76b0SSuyog Pawar /** Layer related context */ 2362*c83a76b0SSuyog Pawar layer_ctxt_t *ps_layer_ctxt; 2363*c83a76b0SSuyog Pawar 2364*c83a76b0SSuyog Pawar inter_ctb_prms_t *ps_inter_ctb_prms; 2365*c83a76b0SSuyog Pawar 2366*c83a76b0SSuyog Pawar /** 2367*c83a76b0SSuyog Pawar * Points to an array of pointers. This array in turn points to 2368*c83a76b0SSuyog Pawar * the active mv grid in each direction (L0/L1) 2369*c83a76b0SSuyog Pawar */ 2370*c83a76b0SSuyog Pawar mv_grid_t **pps_mv_grid; 2371*c83a76b0SSuyog Pawar 2372*c83a76b0SSuyog Pawar ctb_cluster_info_t *ps_cluster_info; 2373*c83a76b0SSuyog Pawar 2374*c83a76b0SSuyog Pawar S08 *pi1_past_list; 2375*c83a76b0SSuyog Pawar 2376*c83a76b0SSuyog Pawar S08 *pi1_future_list; 2377*c83a76b0SSuyog Pawar 2378*c83a76b0SSuyog Pawar /** MV cost compute function */ 2379*c83a76b0SSuyog Pawar PF_MV_COST_FXN pf_mv_cost_compute; 2380*c83a76b0SSuyog Pawar 2381*c83a76b0SSuyog Pawar /** If segmentation info available for the parent block */ 2382*c83a76b0SSuyog Pawar S32 i4_seg_info_avail; 2383*c83a76b0SSuyog Pawar 2384*c83a76b0SSuyog Pawar /** Partition mask (if segmentation info available) */ 2385*c83a76b0SSuyog Pawar S32 i4_part_mask; 2386*c83a76b0SSuyog Pawar 2387*c83a76b0SSuyog Pawar /** Number of input results available for the merge proc from children*/ 2388*c83a76b0SSuyog Pawar S32 i4_num_inp_results; 2389*c83a76b0SSuyog Pawar 2390*c83a76b0SSuyog Pawar /** Whether SATD to be used for fpel searches */ 2391*c83a76b0SSuyog Pawar S32 i4_use_satd; 2392*c83a76b0SSuyog Pawar 2393*c83a76b0SSuyog Pawar /** 2394*c83a76b0SSuyog Pawar * Number of result planes valid for this merge process. For example, 2395*c83a76b0SSuyog Pawar * for fpel search in encode layer, we may have only L0 and L1 2396*c83a76b0SSuyog Pawar */ 2397*c83a76b0SSuyog Pawar S32 i4_num_ref; 2398*c83a76b0SSuyog Pawar 2399*c83a76b0SSuyog Pawar /** Whether to use input or recon frm for search */ 2400*c83a76b0SSuyog Pawar S32 i4_use_rec; 2401*c83a76b0SSuyog Pawar 2402*c83a76b0SSuyog Pawar /** optimized mv grid flag : indicates if same mvgrid is used for both fpel and qpel 2403*c83a76b0SSuyog Pawar * This helps in copying fpel and qpel mv grid in pred context mv grid 2404*c83a76b0SSuyog Pawar */ 2405*c83a76b0SSuyog Pawar S32 i4_mv_grid_opt; 2406*c83a76b0SSuyog Pawar 2407*c83a76b0SSuyog Pawar /** ctb size, typically 32 or 64 */ 2408*c83a76b0SSuyog Pawar S32 log_ctb_size; 2409*c83a76b0SSuyog Pawar 2410*c83a76b0SSuyog Pawar S32 i4_ctb_x_off; 2411*c83a76b0SSuyog Pawar 2412*c83a76b0SSuyog Pawar S32 i4_ctb_y_off; 2413*c83a76b0SSuyog Pawar 2414*c83a76b0SSuyog Pawar ME_QUALITY_PRESETS_T e_quality_preset; 2415*c83a76b0SSuyog Pawar 2416*c83a76b0SSuyog Pawar S32 i4_num_pred_dir_actual; 2417*c83a76b0SSuyog Pawar 2418*c83a76b0SSuyog Pawar U08 au1_pred_dir_searched[2]; 2419*c83a76b0SSuyog Pawar 2420*c83a76b0SSuyog Pawar S32 i4_alpha_stim_multiplier; 2421*c83a76b0SSuyog Pawar 2422*c83a76b0SSuyog Pawar U08 u1_is_cu_noisy; 2423*c83a76b0SSuyog Pawar 2424*c83a76b0SSuyog Pawar } hme_merge_prms_t; 2425*c83a76b0SSuyog Pawar 2426*c83a76b0SSuyog Pawar /** 2427*c83a76b0SSuyog Pawar ****************************************************************************** 2428*c83a76b0SSuyog Pawar * @struct mvbank_update_prms_t 2429*c83a76b0SSuyog Pawar * @brief Useful prms for updating the mv bank 2430*c83a76b0SSuyog Pawar ****************************************************************************** 2431*c83a76b0SSuyog Pawar */ 2432*c83a76b0SSuyog Pawar typedef struct 2433*c83a76b0SSuyog Pawar { 2434*c83a76b0SSuyog Pawar /** Number of references for which update to be done */ 2435*c83a76b0SSuyog Pawar S32 i4_num_ref; 2436*c83a76b0SSuyog Pawar 2437*c83a76b0SSuyog Pawar /** 2438*c83a76b0SSuyog Pawar * Search blk size that was used, if this is different from the blk 2439*c83a76b0SSuyog Pawar * size used in mv bank, then some replications or reductions may 2440*c83a76b0SSuyog Pawar * have to be done. E.g. if search blk size is 8x8 and result blk 2441*c83a76b0SSuyog Pawar * size is 4x4, then we have to update part NxN results to be 2442*c83a76b0SSuyog Pawar * used for update along with replication of 2Nx2N result in each 2443*c83a76b0SSuyog Pawar * of the 4 4x4 blk. 2444*c83a76b0SSuyog Pawar */ 2445*c83a76b0SSuyog Pawar BLK_SIZE_T e_search_blk_size; 2446*c83a76b0SSuyog Pawar 2447*c83a76b0SSuyog Pawar /** 2448*c83a76b0SSuyog Pawar * Redundant prm as it reflects differences between search blk size 2449*c83a76b0SSuyog Pawar * and mv blk size if any 2450*c83a76b0SSuyog Pawar */ 2451*c83a76b0SSuyog Pawar S32 i4_shift; 2452*c83a76b0SSuyog Pawar 2453*c83a76b0SSuyog Pawar S32 i4_num_active_ref_l0; 2454*c83a76b0SSuyog Pawar 2455*c83a76b0SSuyog Pawar S32 i4_num_active_ref_l1; 2456*c83a76b0SSuyog Pawar 2457*c83a76b0SSuyog Pawar S32 i4_num_results_to_store; 2458*c83a76b0SSuyog Pawar } mvbank_update_prms_t; 2459*c83a76b0SSuyog Pawar 2460*c83a76b0SSuyog Pawar /** 2461*c83a76b0SSuyog Pawar ****************************************************************************** 2462*c83a76b0SSuyog Pawar * @struct hme_subpel_prms_t 2463*c83a76b0SSuyog Pawar * @brief input and control prms for subpel refinement 2464*c83a76b0SSuyog Pawar ****************************************************************************** 2465*c83a76b0SSuyog Pawar */ 2466*c83a76b0SSuyog Pawar typedef struct 2467*c83a76b0SSuyog Pawar { 2468*c83a76b0SSuyog Pawar /** Relevant only for the case where we mix up results of diff cu sizes */ 2469*c83a76b0SSuyog Pawar S32 i4_num_16x16_candts; 2470*c83a76b0SSuyog Pawar S32 i4_num_32x32_candts; 2471*c83a76b0SSuyog Pawar S32 i4_num_64x64_candts; 2472*c83a76b0SSuyog Pawar 2473*c83a76b0SSuyog Pawar /** X and y offset of ctb w.r.t. start of pic */ 2474*c83a76b0SSuyog Pawar S32 i4_ctb_x_off; 2475*c83a76b0SSuyog Pawar S32 i4_ctb_y_off; 2476*c83a76b0SSuyog Pawar 2477*c83a76b0SSuyog Pawar /** Max Number of diamond steps for hpel and qpel refinement */ 2478*c83a76b0SSuyog Pawar S32 i4_num_steps_hpel_refine; 2479*c83a76b0SSuyog Pawar S32 i4_num_steps_qpel_refine; 2480*c83a76b0SSuyog Pawar 2481*c83a76b0SSuyog Pawar /** Whether SATD to be used or SAD to be used */ 2482*c83a76b0SSuyog Pawar S32 i4_use_satd; 2483*c83a76b0SSuyog Pawar 2484*c83a76b0SSuyog Pawar /** 2485*c83a76b0SSuyog Pawar * Input ptr. This is updated inside the subpel refinement by picking 2486*c83a76b0SSuyog Pawar * up correct adress 2487*c83a76b0SSuyog Pawar */ 2488*c83a76b0SSuyog Pawar void *pv_inp; 2489*c83a76b0SSuyog Pawar 2490*c83a76b0SSuyog Pawar /** 2491*c83a76b0SSuyog Pawar * Pred buffer ptr, updated inside subpel refinement process. This 2492*c83a76b0SSuyog Pawar * location passed to the leaf fxn for copying the winner pred buf 2493*c83a76b0SSuyog Pawar */ 2494*c83a76b0SSuyog Pawar U08 *pu1_pred; 2495*c83a76b0SSuyog Pawar 2496*c83a76b0SSuyog Pawar /** Interpolation fxn sent by top layer, should exact qpel be desired */ 2497*c83a76b0SSuyog Pawar PF_INTERP_FXN_T pf_qpel_interp; 2498*c83a76b0SSuyog Pawar 2499*c83a76b0SSuyog Pawar /** Working mem passed to leaf fxns */ 2500*c83a76b0SSuyog Pawar U08 *pu1_wkg_mem; 2501*c83a76b0SSuyog Pawar 2502*c83a76b0SSuyog Pawar /** prediction buffer stride fo rleaf fxns to copy the pred winner buf */ 2503*c83a76b0SSuyog Pawar S32 i4_pred_stride; 2504*c83a76b0SSuyog Pawar 2505*c83a76b0SSuyog Pawar /** Type of input ; sizeof(UWORD8) => unidir refinement, else BIDIR */ 2506*c83a76b0SSuyog Pawar S32 i4_inp_type; 2507*c83a76b0SSuyog Pawar 2508*c83a76b0SSuyog Pawar /** Stride of input buf, updated inside subpel fxn */ 2509*c83a76b0SSuyog Pawar S32 i4_inp_stride; 2510*c83a76b0SSuyog Pawar 2511*c83a76b0SSuyog Pawar /** 2512*c83a76b0SSuyog Pawar * Pointer to the backward input ptr. This is also updated inside 2513*c83a76b0SSuyog Pawar * the subpel fxn. Needed for BIDIR refinement where modified inpu 2514*c83a76b0SSuyog Pawar * is 2I - P0 2515*c83a76b0SSuyog Pawar */ 2516*c83a76b0SSuyog Pawar S16 *pi2_inp_bck; 2517*c83a76b0SSuyog Pawar 2518*c83a76b0SSuyog Pawar /** Indicates if CU merge uses SATD / SAD */ 2519*c83a76b0SSuyog Pawar S32 i4_use_satd_cu_merge; 2520*c83a76b0SSuyog Pawar 2521*c83a76b0SSuyog Pawar /** valid MV range in hpel and qpel units */ 2522*c83a76b0SSuyog Pawar range_prms_t *aps_mv_range_hpel[MAX_NUM_REF]; 2523*c83a76b0SSuyog Pawar range_prms_t *aps_mv_range_qpel[MAX_NUM_REF]; 2524*c83a76b0SSuyog Pawar /** Relevant only for mixed CU cases */ 2525*c83a76b0SSuyog Pawar search_results_t *ps_search_results_16x16; 2526*c83a76b0SSuyog Pawar search_results_t *ps_search_results_32x32; 2527*c83a76b0SSuyog Pawar search_results_t *ps_search_results_64x64; 2528*c83a76b0SSuyog Pawar 2529*c83a76b0SSuyog Pawar /** Cost computatino fxn ptr */ 2530*c83a76b0SSuyog Pawar PF_MV_COST_FXN pf_mv_cost_compute; 2531*c83a76b0SSuyog Pawar 2532*c83a76b0SSuyog Pawar /** Whether BI mode is allowed for this pic (not allowed in P) */ 2533*c83a76b0SSuyog Pawar S32 bidir_enabled; 2534*c83a76b0SSuyog Pawar 2535*c83a76b0SSuyog Pawar /** 2536*c83a76b0SSuyog Pawar * Total number of references of current picture which is enocded 2537*c83a76b0SSuyog Pawar */ 2538*c83a76b0SSuyog Pawar U08 u1_num_ref; 2539*c83a76b0SSuyog Pawar 2540*c83a76b0SSuyog Pawar /** 2541*c83a76b0SSuyog Pawar * Number of candidates used for refinement 2542*c83a76b0SSuyog Pawar * If given 1 candidate, then 2Nx2N is chosen as the best candidate 2543*c83a76b0SSuyog Pawar */ 2544*c83a76b0SSuyog Pawar U08 u1_max_subpel_candts; 2545*c83a76b0SSuyog Pawar 2546*c83a76b0SSuyog Pawar U08 u1_subpel_candt_threshold; 2547*c83a76b0SSuyog Pawar 2548*c83a76b0SSuyog Pawar ME_QUALITY_PRESETS_T e_me_quality_presets; 2549*c83a76b0SSuyog Pawar 2550*c83a76b0SSuyog Pawar U08 u1_max_subpel_candts_2Nx2N; 2551*c83a76b0SSuyog Pawar U08 u1_max_subpel_candts_NxN; 2552*c83a76b0SSuyog Pawar 2553*c83a76b0SSuyog Pawar U08 u1_max_num_subpel_refine_centers; 2554*c83a76b0SSuyog Pawar 2555*c83a76b0SSuyog Pawar subpel_refine_ctxt_t *ps_subpel_refine_ctxt; 2556*c83a76b0SSuyog Pawar 2557*c83a76b0SSuyog Pawar S32 i4_num_act_ref_l0; 2558*c83a76b0SSuyog Pawar 2559*c83a76b0SSuyog Pawar S32 i4_num_act_ref_l1; 2560*c83a76b0SSuyog Pawar 2561*c83a76b0SSuyog Pawar U08 u1_is_cu_noisy; 2562*c83a76b0SSuyog Pawar } hme_subpel_prms_t; 2563*c83a76b0SSuyog Pawar 2564*c83a76b0SSuyog Pawar /** 2565*c83a76b0SSuyog Pawar ****************************************************************************** 2566*c83a76b0SSuyog Pawar * @struct layers_descr_t 2567*c83a76b0SSuyog Pawar * @brief One such str exists for each ref and curr input in the me ctxt 2568*c83a76b0SSuyog Pawar * Has ctxt handles for all layers of a given POC 2569*c83a76b0SSuyog Pawar ****************************************************************************** 2570*c83a76b0SSuyog Pawar */ 2571*c83a76b0SSuyog Pawar typedef struct 2572*c83a76b0SSuyog Pawar { 2573*c83a76b0SSuyog Pawar /** Handles for all layers. Entry 0 is finest layer */ 2574*c83a76b0SSuyog Pawar layer_ctxt_t *aps_layers[MAX_NUM_LAYERS]; 2575*c83a76b0SSuyog Pawar } layers_descr_t; 2576*c83a76b0SSuyog Pawar 2577*c83a76b0SSuyog Pawar /** 2578*c83a76b0SSuyog Pawar ****************************************************************************** 2579*c83a76b0SSuyog Pawar * @struct blk_ctb_attrs_t 2580*c83a76b0SSuyog Pawar * @brief The CTB is split into 16x16 blks. For each such blk, this str 2581*c83a76b0SSuyog Pawar * stores attributes of this blk w.r.t. ctb 2582*c83a76b0SSuyog Pawar ****************************************************************************** 2583*c83a76b0SSuyog Pawar */ 2584*c83a76b0SSuyog Pawar typedef struct 2585*c83a76b0SSuyog Pawar { 2586*c83a76b0SSuyog Pawar /** 2587*c83a76b0SSuyog Pawar * ID of the blk in the full ctb. Assuming the full ctb were coded, 2588*c83a76b0SSuyog Pawar * this indicates what is the blk num of this blk (in encode order) 2589*c83a76b0SSuyog Pawar * within the full ctb 2590*c83a76b0SSuyog Pawar */ 2591*c83a76b0SSuyog Pawar U08 u1_blk_id_in_full_ctb; 2592*c83a76b0SSuyog Pawar 2593*c83a76b0SSuyog Pawar /** x and y coordinates of this blk w.r.t. ctb base */ 2594*c83a76b0SSuyog Pawar U08 u1_blk_x; 2595*c83a76b0SSuyog Pawar U08 u1_blk_y; 2596*c83a76b0SSuyog Pawar /** 2597*c83a76b0SSuyog Pawar * Mask of 8x8 blks that are active. Bits 0-3 for blks 0-3 in raster order 2598*c83a76b0SSuyog Pawar * within a 16x16 blk. This will be 0xf in interiors and < 0xf at rt/bot 2599*c83a76b0SSuyog Pawar * boundaries or at bot rt corners, where we may not have full 16x16 blk 2600*c83a76b0SSuyog Pawar */ 2601*c83a76b0SSuyog Pawar U08 u1_blk_8x8_mask; 2602*c83a76b0SSuyog Pawar } blk_ctb_attrs_t; 2603*c83a76b0SSuyog Pawar 2604*c83a76b0SSuyog Pawar /** 2605*c83a76b0SSuyog Pawar ****************************************************************************** 2606*c83a76b0SSuyog Pawar * @struct ctb_boundary_attrs_t 2607*c83a76b0SSuyog Pawar * @brief Depending on the location of ctb (rt boundary, bot boundary, 2608*c83a76b0SSuyog Pawar * bot rt corner, elsewhere) this picks out the appropriate 2609*c83a76b0SSuyog Pawar * attributes of the ctb 2610*c83a76b0SSuyog Pawar ****************************************************************************** 2611*c83a76b0SSuyog Pawar */ 2612*c83a76b0SSuyog Pawar typedef struct 2613*c83a76b0SSuyog Pawar { 2614*c83a76b0SSuyog Pawar /** 2615*c83a76b0SSuyog Pawar * 4 bit variable, one for each of the 4 possible 32x32s in a full ctb 2616*c83a76b0SSuyog Pawar * If any 32x32 is partially present / not present at boundaries, that 2617*c83a76b0SSuyog Pawar * bit posn will be 0 2618*c83a76b0SSuyog Pawar */ 2619*c83a76b0SSuyog Pawar U08 u1_merge_to_32x32_flag; 2620*c83a76b0SSuyog Pawar 2621*c83a76b0SSuyog Pawar /** 2622*c83a76b0SSuyog Pawar * 1 bit flag indicating whether it is a complete ctb or not, and 2623*c83a76b0SSuyog Pawar * consequently whether it can be merged to a full 64x64 2624*c83a76b0SSuyog Pawar */ 2625*c83a76b0SSuyog Pawar U08 u1_merge_to_64x64_flag; 2626*c83a76b0SSuyog Pawar 2627*c83a76b0SSuyog Pawar /** Number of valid 16x16 blks (includes those partially/fully present*/ 2628*c83a76b0SSuyog Pawar U08 u1_num_blks_in_ctb; 2629*c83a76b0SSuyog Pawar 2630*c83a76b0SSuyog Pawar /** 16 bit variable indicating whether the corresponding 16x16 is valid */ 2631*c83a76b0SSuyog Pawar S32 cu_16x16_valid_flag; 2632*c83a76b0SSuyog Pawar 2633*c83a76b0SSuyog Pawar /** 2634*c83a76b0SSuyog Pawar * For possible 16 16x16 blks in a CTB, we have one attribute str for 2635*c83a76b0SSuyog Pawar * every valid blk. Tightly packed structure. For example, 2636*c83a76b0SSuyog Pawar * 0 1 4 5 2637*c83a76b0SSuyog Pawar * 2 3 6 7 2638*c83a76b0SSuyog Pawar * 8 9 12 13 2639*c83a76b0SSuyog Pawar * 10 11 14 15 2640*c83a76b0SSuyog Pawar * Assuming the ctb width is only 48, blks 5,7,13,15 are invalid 2641*c83a76b0SSuyog Pawar * Then We store attributes in the order: 0,1,2,3,4,6,8,9,10,11,12,14 2642*c83a76b0SSuyog Pawar */ 2643*c83a76b0SSuyog Pawar blk_ctb_attrs_t as_blk_attrs[16]; 2644*c83a76b0SSuyog Pawar } ctb_boundary_attrs_t; 2645*c83a76b0SSuyog Pawar 2646*c83a76b0SSuyog Pawar typedef struct 2647*c83a76b0SSuyog Pawar { 2648*c83a76b0SSuyog Pawar S32 sdi; 2649*c83a76b0SSuyog Pawar 2650*c83a76b0SSuyog Pawar S32 ref_idx; 2651*c83a76b0SSuyog Pawar 2652*c83a76b0SSuyog Pawar S32 cluster_id; 2653*c83a76b0SSuyog Pawar } outlier_data_t; 2654*c83a76b0SSuyog Pawar 2655*c83a76b0SSuyog Pawar /** 2656*c83a76b0SSuyog Pawar ****************************************************************************** 2657*c83a76b0SSuyog Pawar * @struct coarse_dyn_range_prms_t 2658*c83a76b0SSuyog Pawar * @brief The parameters for Dyn. Search Range in coarse ME 2659*c83a76b0SSuyog Pawar ****************************************************************************** 2660*c83a76b0SSuyog Pawar */ 2661*c83a76b0SSuyog Pawar 2662*c83a76b0SSuyog Pawar typedef struct 2663*c83a76b0SSuyog Pawar { 2664*c83a76b0SSuyog Pawar /* TO DO : size can be reduced, as not getting used for L0 */ 2665*c83a76b0SSuyog Pawar 2666*c83a76b0SSuyog Pawar /** Dynamical Search Range parameters per layer & ref_pic */ 2667*c83a76b0SSuyog Pawar dyn_range_prms_t as_dyn_range_prms[MAX_NUM_LAYERS][MAX_NUM_REF]; 2668*c83a76b0SSuyog Pawar 2669*c83a76b0SSuyog Pawar /** Min y value Normalized per POC distance */ 2670*c83a76b0SSuyog Pawar WORD16 i2_dyn_min_y_per_poc[MAX_NUM_LAYERS]; 2671*c83a76b0SSuyog Pawar /** Max y value Normalized per POC distance */ 2672*c83a76b0SSuyog Pawar WORD16 i2_dyn_max_y_per_poc[MAX_NUM_LAYERS]; 2673*c83a76b0SSuyog Pawar 2674*c83a76b0SSuyog Pawar } coarse_dyn_range_prms_t; 2675*c83a76b0SSuyog Pawar 2676*c83a76b0SSuyog Pawar /** 2677*c83a76b0SSuyog Pawar ****************************************************************************** 2678*c83a76b0SSuyog Pawar * @struct coarse_me_ctxt_t 2679*c83a76b0SSuyog Pawar * @brief Handle for Coarse ME 2680*c83a76b0SSuyog Pawar ****************************************************************************** 2681*c83a76b0SSuyog Pawar */ 2682*c83a76b0SSuyog Pawar typedef struct 2683*c83a76b0SSuyog Pawar { 2684*c83a76b0SSuyog Pawar /** Init search candts, 2 sets, one for 4x8 and one for 8x4 */ 2685*c83a76b0SSuyog Pawar search_node_t s_init_search_node[MAX_INIT_CANDTS * 2]; 2686*c83a76b0SSuyog Pawar 2687*c83a76b0SSuyog Pawar /** For non enc layer, we search 8x8 blks and store results here */ 2688*c83a76b0SSuyog Pawar search_results_t s_search_results_8x8; 2689*c83a76b0SSuyog Pawar /** 2690*c83a76b0SSuyog Pawar * Below arays store input planes for each ref pic. 2691*c83a76b0SSuyog Pawar * These are duplications, and are present within layer ctxts, but 2692*c83a76b0SSuyog Pawar * kept here together for faster indexing during search 2693*c83a76b0SSuyog Pawar */ 2694*c83a76b0SSuyog Pawar U08 *apu1_list_inp[MAX_NUM_LAYERS][MAX_NUM_REF]; 2695*c83a76b0SSuyog Pawar 2696*c83a76b0SSuyog Pawar /** Ptr to all layer context placeholder for curr pic encoded */ 2697*c83a76b0SSuyog Pawar layers_descr_t *ps_curr_descr; 2698*c83a76b0SSuyog Pawar 2699*c83a76b0SSuyog Pawar /** Ptr to all layer ctxt place holder for all pics */ 2700*c83a76b0SSuyog Pawar layers_descr_t as_ref_descr[MAX_NUM_REF + 1 + NUM_BUFS_DECOMP_HME]; 2701*c83a76b0SSuyog Pawar 2702*c83a76b0SSuyog Pawar /** 2703*c83a76b0SSuyog Pawar * ME uses ref id lc to search multi ref. This TLU gets POC of 2704*c83a76b0SSuyog Pawar * the pic w.r.t. a given ref id 2705*c83a76b0SSuyog Pawar */ 2706*c83a76b0SSuyog Pawar S32 ai4_ref_idx_to_poc_lc[MAX_NUM_REF]; 2707*c83a76b0SSuyog Pawar 2708*c83a76b0SSuyog Pawar /** use this array to get disp num from ref_idx. Used for L1 traqo **/ 2709*c83a76b0SSuyog Pawar S32 ai4_ref_idx_to_disp_num[MAX_NUM_REF]; 2710*c83a76b0SSuyog Pawar 2711*c83a76b0SSuyog Pawar /** POC of pic encoded just before current */ 2712*c83a76b0SSuyog Pawar S32 i4_prev_poc; 2713*c83a76b0SSuyog Pawar 2714*c83a76b0SSuyog Pawar /** POC of curret pic being encoded */ 2715*c83a76b0SSuyog Pawar S32 i4_curr_poc; 2716*c83a76b0SSuyog Pawar 2717*c83a76b0SSuyog Pawar /** Number of HME layers encode + non encode */ 2718*c83a76b0SSuyog Pawar S32 num_layers; 2719*c83a76b0SSuyog Pawar 2720*c83a76b0SSuyog Pawar /** Alloc time parameter, max ref frms used for this session */ 2721*c83a76b0SSuyog Pawar S32 max_num_ref; 2722*c83a76b0SSuyog Pawar 2723*c83a76b0SSuyog Pawar /** 2724*c83a76b0SSuyog Pawar * Number of layers that use explicit search. Explicit search means 2725*c83a76b0SSuyog Pawar * that each ref id is searched separately 2726*c83a76b0SSuyog Pawar */ 2727*c83a76b0SSuyog Pawar S32 num_layers_explicit_search; 2728*c83a76b0SSuyog Pawar 2729*c83a76b0SSuyog Pawar /** 2730*c83a76b0SSuyog Pawar * Maximum number of results maintained at any refinement layer 2731*c83a76b0SSuyog Pawar * search. Important from mem alloc perspective 2732*c83a76b0SSuyog Pawar */ 2733*c83a76b0SSuyog Pawar S32 max_num_results; 2734*c83a76b0SSuyog Pawar 2735*c83a76b0SSuyog Pawar /** Same as above but for coarse layer */ 2736*c83a76b0SSuyog Pawar S32 max_num_results_coarse; 2737*c83a76b0SSuyog Pawar 2738*c83a76b0SSuyog Pawar /** Array of flags, one per layer indicating hwether layer is encoded */ 2739*c83a76b0SSuyog Pawar U08 u1_encode[MAX_NUM_LAYERS]; 2740*c83a76b0SSuyog Pawar 2741*c83a76b0SSuyog Pawar /** Init prms send by encoder during create time */ 2742*c83a76b0SSuyog Pawar hme_init_prms_t s_init_prms; 2743*c83a76b0SSuyog Pawar 2744*c83a76b0SSuyog Pawar /** 2745*c83a76b0SSuyog Pawar * Array look up created each frm, maintaining the corresponding 2746*c83a76b0SSuyog Pawar * layer descr look up for each ref id 2747*c83a76b0SSuyog Pawar */ 2748*c83a76b0SSuyog Pawar S32 a_ref_to_descr_id[MAX_NUM_REF]; 2749*c83a76b0SSuyog Pawar 2750*c83a76b0SSuyog Pawar /** 2751*c83a76b0SSuyog Pawar * Array lookup created each frame that maps a given ref id 2752*c83a76b0SSuyog Pawar * pertaining to unified list to a L0/L1 list. Encoder searches in terms 2753*c83a76b0SSuyog Pawar * of LC list or in other words does not differentiate between L0 2754*c83a76b0SSuyog Pawar * and L1 frames for most of search. Finally to report results to 2755*c83a76b0SSuyog Pawar * encoder, the ref id has to be remapped to suitable list 2756*c83a76b0SSuyog Pawar */ 2757*c83a76b0SSuyog Pawar S32 a_ref_idx_lc_to_l0[MAX_NUM_REF]; 2758*c83a76b0SSuyog Pawar S32 a_ref_idx_lc_to_l1[MAX_NUM_REF]; 2759*c83a76b0SSuyog Pawar 2760*c83a76b0SSuyog Pawar /** Width and ht of each layer */ 2761*c83a76b0SSuyog Pawar S32 a_wd[MAX_NUM_LAYERS]; 2762*c83a76b0SSuyog Pawar S32 a_ht[MAX_NUM_LAYERS]; 2763*c83a76b0SSuyog Pawar 2764*c83a76b0SSuyog Pawar /** Histogram, one for each ref, allocated during craete time */ 2765*c83a76b0SSuyog Pawar mv_hist_t *aps_mv_hist[MAX_NUM_REF]; 2766*c83a76b0SSuyog Pawar 2767*c83a76b0SSuyog Pawar /** Whether a given ref id in Lc list is past frm or future frm */ 2768*c83a76b0SSuyog Pawar U08 au1_is_past[MAX_NUM_REF]; 2769*c83a76b0SSuyog Pawar 2770*c83a76b0SSuyog Pawar /** These are L0 and L1 lists, storing ref id Lc in them */ 2771*c83a76b0SSuyog Pawar S08 ai1_past_list[MAX_NUM_REF]; 2772*c83a76b0SSuyog Pawar S08 ai1_future_list[MAX_NUM_REF]; 2773*c83a76b0SSuyog Pawar 2774*c83a76b0SSuyog Pawar /** Number of past and future ref pics sent this frm */ 2775*c83a76b0SSuyog Pawar S32 num_ref_past; 2776*c83a76b0SSuyog Pawar S32 num_ref_future; 2777*c83a76b0SSuyog Pawar 2778*c83a76b0SSuyog Pawar void *pv_ext_frm_prms; 2779*c83a76b0SSuyog Pawar 2780*c83a76b0SSuyog Pawar hme_frm_prms_t *ps_hme_frm_prms; 2781*c83a76b0SSuyog Pawar 2782*c83a76b0SSuyog Pawar hme_ref_map_t *ps_hme_ref_map; 2783*c83a76b0SSuyog Pawar /** 2784*c83a76b0SSuyog Pawar * Scale factor of any given ref lc to another ref in Q8 2785*c83a76b0SSuyog Pawar * First MAX_NUM_REF entries are to scale an mv of ref id k 2786*c83a76b0SSuyog Pawar * w.r.t. ref id 0 (approx 256 * POC delta(0) / POC delta(k)) 2787*c83a76b0SSuyog Pawar * Next MAX_NUM_REF entreis are to scale mv of ref id 1 w.r.t. 0 2788*c83a76b0SSuyog Pawar * And so on 2789*c83a76b0SSuyog Pawar */ 2790*c83a76b0SSuyog Pawar S16 ai2_ref_scf[MAX_NUM_REF * MAX_NUM_REF]; 2791*c83a76b0SSuyog Pawar 2792*c83a76b0SSuyog Pawar /** bits for a given ref id, in either list L0/L1 */ 2793*c83a76b0SSuyog Pawar U08 au1_ref_bits_tlu_lc[2][MAX_NUM_REF]; 2794*c83a76b0SSuyog Pawar 2795*c83a76b0SSuyog Pawar /** Points to above: 1 ptr for each list */ 2796*c83a76b0SSuyog Pawar U08 *apu1_ref_bits_tlu_lc[2]; 2797*c83a76b0SSuyog Pawar 2798*c83a76b0SSuyog Pawar /** number of b fraems between P, depends on number of hierarchy layers */ 2799*c83a76b0SSuyog Pawar S32 num_b_frms; 2800*c83a76b0SSuyog Pawar 2801*c83a76b0SSuyog Pawar /** Frame level qp passed every frame by ME's caller */ 2802*c83a76b0SSuyog Pawar S32 frm_qstep; 2803*c83a76b0SSuyog Pawar 2804*c83a76b0SSuyog Pawar /** Backup of frame parameters */ 2805*c83a76b0SSuyog Pawar hme_frm_prms_t s_frm_prms; 2806*c83a76b0SSuyog Pawar 2807*c83a76b0SSuyog Pawar /** Weighted prediction parameters for all references are stored 2808*c83a76b0SSuyog Pawar * Scratch buffers for populated widgted inputs are also stored in this 2809*c83a76b0SSuyog Pawar */ 2810*c83a76b0SSuyog Pawar wgt_pred_ctxt_t s_wt_pred; 2811*c83a76b0SSuyog Pawar 2812*c83a76b0SSuyog Pawar /** Weighted pred enable flag */ 2813*c83a76b0SSuyog Pawar S32 i4_wt_pred_enable_flag; 2814*c83a76b0SSuyog Pawar 2815*c83a76b0SSuyog Pawar /* Pointer to hold 5 rows of best search node information */ 2816*c83a76b0SSuyog Pawar search_node_t *aps_best_search_nodes_4x8_n_rows[MAX_NUM_REF]; 2817*c83a76b0SSuyog Pawar 2818*c83a76b0SSuyog Pawar search_node_t *aps_best_search_nodes_8x4_n_rows[MAX_NUM_REF]; 2819*c83a76b0SSuyog Pawar 2820*c83a76b0SSuyog Pawar /* Pointer to hold 5 rows of best search node information */ 2821*c83a76b0SSuyog Pawar S16 *api2_sads_4x4_n_rows[MAX_NUM_REF]; 2822*c83a76b0SSuyog Pawar 2823*c83a76b0SSuyog Pawar /* Number of row buffers to store SADs and best search nodes */ 2824*c83a76b0SSuyog Pawar S32 i4_num_row_bufs; 2825*c83a76b0SSuyog Pawar 2826*c83a76b0SSuyog Pawar /* (HEVCE_MAX_HEIGHT>>1) assuming layer 1 is coarse layer and >>2 assuming block size is 4x4*/ 2827*c83a76b0SSuyog Pawar S32 ai4_row_index[(HEVCE_MAX_HEIGHT >> 1) >> 2]; 2828*c83a76b0SSuyog Pawar 2829*c83a76b0SSuyog Pawar /* store L1 cost required for rate control for enc decision*/ 2830*c83a76b0SSuyog Pawar S32 i4_L1_hme_best_cost; 2831*c83a76b0SSuyog Pawar 2832*c83a76b0SSuyog Pawar /* store L1 cost required for modulation index calc*/ 2833*c83a76b0SSuyog Pawar //S32 i4_L1_hme_best_cost_for_ref; 2834*c83a76b0SSuyog Pawar 2835*c83a76b0SSuyog Pawar /* store L1 satd */ 2836*c83a76b0SSuyog Pawar S32 i4_L1_hme_sad; 2837*c83a76b0SSuyog Pawar /* EIID: layer1 buffer to store the early inter intra costs and decisions */ 2838*c83a76b0SSuyog Pawar /* pic_level pointer stored here */ 2839*c83a76b0SSuyog Pawar ihevce_ed_blk_t *ps_ed_blk; 2840*c83a76b0SSuyog Pawar /* EIID: layer1 buffer to store the sad/cost information for rate control 2841*c83a76b0SSuyog Pawar or cu level qp modulation*/ 2842*c83a76b0SSuyog Pawar ihevce_ed_ctb_l1_t *ps_ed_ctb_l1; 2843*c83a76b0SSuyog Pawar /** Dynamical Search Range parameters */ 2844*c83a76b0SSuyog Pawar coarse_dyn_range_prms_t s_coarse_dyn_range_prms; 2845*c83a76b0SSuyog Pawar 2846*c83a76b0SSuyog Pawar /** Dependency manager for Row level sync in HME pass */ 2847*c83a76b0SSuyog Pawar void *apv_dep_mngr_hme_sync[MAX_NUM_HME_LAYERS - 1]; 2848*c83a76b0SSuyog Pawar 2849*c83a76b0SSuyog Pawar /* pointer buffers for memory mapping */ 2850*c83a76b0SSuyog Pawar UWORD8 *pu1_me_reverse_map_info; 2851*c83a76b0SSuyog Pawar 2852*c83a76b0SSuyog Pawar /*blk count which has higher SAD*/ 2853*c83a76b0SSuyog Pawar S32 i4_num_blks_high_sad; 2854*c83a76b0SSuyog Pawar 2855*c83a76b0SSuyog Pawar /*num of 8x8 blocks in nearest poc*/ 2856*c83a76b0SSuyog Pawar S32 i4_num_blks; 2857*c83a76b0SSuyog Pawar 2858*c83a76b0SSuyog Pawar /* thread id of the current context */ 2859*c83a76b0SSuyog Pawar WORD32 thrd_id; 2860*c83a76b0SSuyog Pawar 2861*c83a76b0SSuyog Pawar /* Should be typecast to a struct of type 'ihevce_me_optimised_function_list_t' */ 2862*c83a76b0SSuyog Pawar void *pv_me_optimised_function_list; 2863*c83a76b0SSuyog Pawar 2864*c83a76b0SSuyog Pawar ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list; 2865*c83a76b0SSuyog Pawar 2866*c83a76b0SSuyog Pawar } coarse_me_ctxt_t; 2867*c83a76b0SSuyog Pawar 2868*c83a76b0SSuyog Pawar /** 2869*c83a76b0SSuyog Pawar ****************************************************************************** 2870*c83a76b0SSuyog Pawar * @struct coarse_dyn_range_prms_t 2871*c83a76b0SSuyog Pawar * @brief The parameters for Dyn. Search Range in coarse ME 2872*c83a76b0SSuyog Pawar ****************************************************************************** 2873*c83a76b0SSuyog Pawar */ 2874*c83a76b0SSuyog Pawar typedef struct 2875*c83a76b0SSuyog Pawar { 2876*c83a76b0SSuyog Pawar /** Dynamical Search Range parameters per ref_pic */ 2877*c83a76b0SSuyog Pawar dyn_range_prms_t as_dyn_range_prms[MAX_NUM_REF]; 2878*c83a76b0SSuyog Pawar 2879*c83a76b0SSuyog Pawar /** Min y value Normalized per POC distance */ 2880*c83a76b0SSuyog Pawar WORD16 i2_dyn_min_y_per_poc; 2881*c83a76b0SSuyog Pawar /** Max y value Normalized per POC distance */ 2882*c83a76b0SSuyog Pawar WORD16 i2_dyn_max_y_per_poc; 2883*c83a76b0SSuyog Pawar 2884*c83a76b0SSuyog Pawar /* The number of ref. pic. actually used in L0. Used to communicate */ 2885*c83a76b0SSuyog Pawar /* to ihevce_l0_me_frame_end and frame process */ 2886*c83a76b0SSuyog Pawar WORD32 i4_num_act_ref_in_l0; 2887*c83a76b0SSuyog Pawar 2888*c83a76b0SSuyog Pawar /*display number*/ 2889*c83a76b0SSuyog Pawar WORD32 i4_display_num; 2890*c83a76b0SSuyog Pawar 2891*c83a76b0SSuyog Pawar } l0_dyn_range_prms_t; 2892*c83a76b0SSuyog Pawar 2893*c83a76b0SSuyog Pawar /** 2894*c83a76b0SSuyog Pawar ****************************************************************************** 2895*c83a76b0SSuyog Pawar * @brief inter prediction (MC) context for me loop 2896*c83a76b0SSuyog Pawar ****************************************************************************** 2897*c83a76b0SSuyog Pawar */ 2898*c83a76b0SSuyog Pawar /*IMPORTANT please keep inter_pred_ctxt_t and inter_pred_me_ctxt_t as identical*/ 2899*c83a76b0SSuyog Pawar typedef struct 2900*c83a76b0SSuyog Pawar { 2901*c83a76b0SSuyog Pawar /** pointer to reference lists */ 2902*c83a76b0SSuyog Pawar recon_pic_buf_t *(*ps_ref_list)[HEVCE_MAX_REF_PICS * 2]; 2903*c83a76b0SSuyog Pawar 2904*c83a76b0SSuyog Pawar /** scratch buffer for horizontal interpolation destination */ 2905*c83a76b0SSuyog Pawar WORD16 MEM_ALIGN16 ai2_horz_scratch[MAX_CTB_SIZE * (MAX_CTB_SIZE + 8)]; 2906*c83a76b0SSuyog Pawar 2907*c83a76b0SSuyog Pawar /** scratch 16 bit buffer for interpolation in l0 direction */ 2908*c83a76b0SSuyog Pawar WORD16 MEM_ALIGN16 ai2_scratch_buf_l0[MAX_CTB_SIZE * MAX_CTB_SIZE]; 2909*c83a76b0SSuyog Pawar 2910*c83a76b0SSuyog Pawar /** scratch 16 bit buffer for interpolation in l1 direction */ 2911*c83a76b0SSuyog Pawar WORD16 MEM_ALIGN16 ai2_scratch_buf_l1[MAX_CTB_SIZE * MAX_CTB_SIZE]; 2912*c83a76b0SSuyog Pawar 2913*c83a76b0SSuyog Pawar /** Pointer to struct containing function pointers to 2914*c83a76b0SSuyog Pawar functions in the 'common' library' */ 2915*c83a76b0SSuyog Pawar func_selector_t *ps_func_selector; 2916*c83a76b0SSuyog Pawar 2917*c83a76b0SSuyog Pawar /** common denominator used for luma weights */ 2918*c83a76b0SSuyog Pawar WORD32 i4_log2_luma_wght_denom; 2919*c83a76b0SSuyog Pawar 2920*c83a76b0SSuyog Pawar /** common denominator used for chroma weights */ 2921*c83a76b0SSuyog Pawar WORD32 i4_log2_chroma_wght_denom; 2922*c83a76b0SSuyog Pawar 2923*c83a76b0SSuyog Pawar /** offset w.r.t frame start in horz direction (pels) */ 2924*c83a76b0SSuyog Pawar WORD32 i4_ctb_frm_pos_x; 2925*c83a76b0SSuyog Pawar 2926*c83a76b0SSuyog Pawar /** offset w.r.t frame start in vert direction (pels) */ 2927*c83a76b0SSuyog Pawar WORD32 i4_ctb_frm_pos_y; 2928*c83a76b0SSuyog Pawar 2929*c83a76b0SSuyog Pawar /* Bit Depth of Input */ 2930*c83a76b0SSuyog Pawar WORD32 i4_bit_depth; 2931*c83a76b0SSuyog Pawar 2932*c83a76b0SSuyog Pawar /* 0 - 400; 1 - 420; 2 - 422; 3 - 444 */ 2933*c83a76b0SSuyog Pawar UWORD8 u1_chroma_array_type; 2934*c83a76b0SSuyog Pawar 2935*c83a76b0SSuyog Pawar /** weighted_pred_flag */ 2936*c83a76b0SSuyog Pawar WORD8 i1_weighted_pred_flag; 2937*c83a76b0SSuyog Pawar 2938*c83a76b0SSuyog Pawar /** weighted_bipred_flag */ 2939*c83a76b0SSuyog Pawar WORD8 i1_weighted_bipred_flag; 2940*c83a76b0SSuyog Pawar 2941*c83a76b0SSuyog Pawar /** Structure to describe extra CTBs around frame due to search 2942*c83a76b0SSuyog Pawar range associated with distributed-mode. Entries are top, left, 2943*c83a76b0SSuyog Pawar right and bottom */ 2944*c83a76b0SSuyog Pawar WORD32 ai4_tile_xtra_pel[4]; 2945*c83a76b0SSuyog Pawar 2946*c83a76b0SSuyog Pawar } inter_pred_me_ctxt_t; 2947*c83a76b0SSuyog Pawar 2948*c83a76b0SSuyog Pawar typedef void FT_CALC_SATD_AND_RESULT(err_prms_t *ps_prms, result_upd_prms_t *ps_result_prms); 2949*c83a76b0SSuyog Pawar 2950*c83a76b0SSuyog Pawar typedef struct 2951*c83a76b0SSuyog Pawar { 2952*c83a76b0SSuyog Pawar FT_CALC_SATD_AND_RESULT *pf_evalsatd_update_1_best_result_pt_pu_16x16_num_part_eq_1; 2953*c83a76b0SSuyog Pawar FT_CALC_SATD_AND_RESULT *pf_evalsatd_update_1_best_result_pt_pu_16x16_num_part_lt_9; 2954*c83a76b0SSuyog Pawar FT_CALC_SATD_AND_RESULT *pf_evalsatd_update_1_best_result_pt_pu_16x16_num_part_lt_17; 2955*c83a76b0SSuyog Pawar FT_CALC_SATD_AND_RESULT *pf_evalsatd_update_2_best_results_pt_pu_16x16_num_part_eq_1; 2956*c83a76b0SSuyog Pawar FT_CALC_SATD_AND_RESULT *pf_evalsatd_update_2_best_results_pt_pu_16x16_num_part_lt_9; 2957*c83a76b0SSuyog Pawar FT_CALC_SATD_AND_RESULT *pf_evalsatd_update_2_best_results_pt_pu_16x16_num_part_lt_17; 2958*c83a76b0SSuyog Pawar FT_HAD_8X8_USING_4_4X4_R *pf_had_8x8_using_4_4x4_r; 2959*c83a76b0SSuyog Pawar FT_HAD_16X16_R *pf_had_16x16_r; 2960*c83a76b0SSuyog Pawar FT_HAD_32X32_USING_16X16 *pf_compute_32x32HAD_using_16x16; 2961*c83a76b0SSuyog Pawar } me_func_selector_t; 2962*c83a76b0SSuyog Pawar 2963*c83a76b0SSuyog Pawar /** 2964*c83a76b0SSuyog Pawar ****************************************************************************** 2965*c83a76b0SSuyog Pawar * @struct me_frm_ctxt_t 2966*c83a76b0SSuyog Pawar * @brief Handle for ME 2967*c83a76b0SSuyog Pawar ****************************************************************************** 2968*c83a76b0SSuyog Pawar */ 2969*c83a76b0SSuyog Pawar typedef struct 2970*c83a76b0SSuyog Pawar { 2971*c83a76b0SSuyog Pawar /** Init search candts, 2 sets, one for 4x8 and one for 8x4 */ 2972*c83a76b0SSuyog Pawar search_node_t s_init_search_node[MAX_INIT_CANDTS]; 2973*c83a76b0SSuyog Pawar 2974*c83a76b0SSuyog Pawar /** Motion Vectors array */ 2975*c83a76b0SSuyog Pawar mv_t as_search_cand_mv[MAX_INIT_CANDTS]; 2976*c83a76b0SSuyog Pawar 2977*c83a76b0SSuyog Pawar /** Results of 16 16x16 blks within a CTB used in enc layer */ 2978*c83a76b0SSuyog Pawar search_results_t as_search_results_16x16[16]; 2979*c83a76b0SSuyog Pawar 2980*c83a76b0SSuyog Pawar /** Results of 4 32x32 blks in a ctb for enc layer merge stage */ 2981*c83a76b0SSuyog Pawar search_results_t as_search_results_32x32[4]; 2982*c83a76b0SSuyog Pawar 2983*c83a76b0SSuyog Pawar /** Same as above but fo 64x64 blk */ 2984*c83a76b0SSuyog Pawar search_results_t s_search_results_64x64; 2985*c83a76b0SSuyog Pawar 2986*c83a76b0SSuyog Pawar /** 2987*c83a76b0SSuyog Pawar * Below arays store input, 4 recon planes for each ref pic. 2988*c83a76b0SSuyog Pawar * These are duplications, and are present within layer ctxts, but 2989*c83a76b0SSuyog Pawar * kept here together for faster indexing during search 2990*c83a76b0SSuyog Pawar */ 2991*c83a76b0SSuyog Pawar 2992*c83a76b0SSuyog Pawar U08 *apu1_list_rec_fxfy[MAX_NUM_LAYERS][MAX_NUM_REF]; 2993*c83a76b0SSuyog Pawar U08 *apu1_list_rec_hxfy[MAX_NUM_LAYERS][MAX_NUM_REF]; 2994*c83a76b0SSuyog Pawar U08 *apu1_list_rec_fxhy[MAX_NUM_LAYERS][MAX_NUM_REF]; 2995*c83a76b0SSuyog Pawar U08 *apu1_list_rec_hxhy[MAX_NUM_LAYERS][MAX_NUM_REF]; 2996*c83a76b0SSuyog Pawar U08 *apu1_list_inp[MAX_NUM_LAYERS][MAX_NUM_REF]; 2997*c83a76b0SSuyog Pawar 2998*c83a76b0SSuyog Pawar void *apv_list_dep_mngr[MAX_NUM_LAYERS][MAX_NUM_REF]; 2999*c83a76b0SSuyog Pawar 3000*c83a76b0SSuyog Pawar /** Ptr to all layer context placeholder for curr pic encoded */ 3001*c83a76b0SSuyog Pawar layers_descr_t *ps_curr_descr; 3002*c83a76b0SSuyog Pawar 3003*c83a76b0SSuyog Pawar /** 3004*c83a76b0SSuyog Pawar * ME uses ref id lc to search multi ref. This TLU gets POC of 3005*c83a76b0SSuyog Pawar * the pic w.r.t. a given ref id 3006*c83a76b0SSuyog Pawar */ 3007*c83a76b0SSuyog Pawar S32 ai4_ref_idx_to_poc_lc[MAX_NUM_REF]; 3008*c83a76b0SSuyog Pawar 3009*c83a76b0SSuyog Pawar /** POC of pic encoded just before current */ 3010*c83a76b0SSuyog Pawar S32 i4_prev_poc; 3011*c83a76b0SSuyog Pawar 3012*c83a76b0SSuyog Pawar /** POC of curret pic being encoded */ 3013*c83a76b0SSuyog Pawar S32 i4_curr_poc; 3014*c83a76b0SSuyog Pawar 3015*c83a76b0SSuyog Pawar /** Buf mgr for memory allocation */ 3016*c83a76b0SSuyog Pawar buf_mgr_t s_buf_mgr; 3017*c83a76b0SSuyog Pawar 3018*c83a76b0SSuyog Pawar /** MV Grid for L0 and L1, this is active one used */ 3019*c83a76b0SSuyog Pawar mv_grid_t as_mv_grid[2]; 3020*c83a76b0SSuyog Pawar 3021*c83a76b0SSuyog Pawar /** 3022*c83a76b0SSuyog Pawar * MV grid for FPEL and QPEL maintained separately. Depending on the 3023*c83a76b0SSuyog Pawar * correct prediction res. being used, copy appropriate results to 3024*c83a76b0SSuyog Pawar * the as_mv_Grid structure 3025*c83a76b0SSuyog Pawar */ 3026*c83a76b0SSuyog Pawar mv_grid_t as_mv_grid_fpel[2]; 3027*c83a76b0SSuyog Pawar mv_grid_t as_mv_grid_qpel[2]; 3028*c83a76b0SSuyog Pawar 3029*c83a76b0SSuyog Pawar /** Number of HME layers encode + non encode */ 3030*c83a76b0SSuyog Pawar S32 num_layers; 3031*c83a76b0SSuyog Pawar 3032*c83a76b0SSuyog Pawar /** Alloc time parameter, max ref frms used for this session */ 3033*c83a76b0SSuyog Pawar S32 max_num_ref; 3034*c83a76b0SSuyog Pawar 3035*c83a76b0SSuyog Pawar /** 3036*c83a76b0SSuyog Pawar * Number of layers that use explicit search. Explicit search means 3037*c83a76b0SSuyog Pawar * that each ref id is searched separately 3038*c83a76b0SSuyog Pawar */ 3039*c83a76b0SSuyog Pawar S32 num_layers_explicit_search; 3040*c83a76b0SSuyog Pawar 3041*c83a76b0SSuyog Pawar /** 3042*c83a76b0SSuyog Pawar * Maximum number of results maintained at any refinement layer 3043*c83a76b0SSuyog Pawar * search. Important from mem alloc perspective 3044*c83a76b0SSuyog Pawar */ 3045*c83a76b0SSuyog Pawar S32 max_num_results; 3046*c83a76b0SSuyog Pawar 3047*c83a76b0SSuyog Pawar /** Same as above but for coarse layer */ 3048*c83a76b0SSuyog Pawar S32 max_num_results_coarse; 3049*c83a76b0SSuyog Pawar 3050*c83a76b0SSuyog Pawar /** Array of flags, one per layer indicating hwether layer is encoded */ 3051*c83a76b0SSuyog Pawar U08 u1_encode[MAX_NUM_LAYERS]; 3052*c83a76b0SSuyog Pawar 3053*c83a76b0SSuyog Pawar /* Parameters used for lambda computation */ 3054*c83a76b0SSuyog Pawar frm_lambda_ctxt_t s_frm_lambda_ctxt; 3055*c83a76b0SSuyog Pawar 3056*c83a76b0SSuyog Pawar /** 3057*c83a76b0SSuyog Pawar * Array look up created each frm, maintaining the corresponding 3058*c83a76b0SSuyog Pawar * layer descr look up for each ref id 3059*c83a76b0SSuyog Pawar */ 3060*c83a76b0SSuyog Pawar S32 a_ref_to_descr_id[MAX_NUM_REF]; 3061*c83a76b0SSuyog Pawar 3062*c83a76b0SSuyog Pawar /** 3063*c83a76b0SSuyog Pawar * Array lookup created each frame that maps a given ref id 3064*c83a76b0SSuyog Pawar * pertaining to unified list to a L0/L1 list. Encoder searches in terms 3065*c83a76b0SSuyog Pawar * of LC list or in other words does not differentiate between L0 3066*c83a76b0SSuyog Pawar * and L1 frames for most of search. Finally to report results to 3067*c83a76b0SSuyog Pawar * encoder, the ref id has to be remapped to suitable list 3068*c83a76b0SSuyog Pawar */ 3069*c83a76b0SSuyog Pawar S32 a_ref_idx_lc_to_l0[MAX_NUM_REF]; 3070*c83a76b0SSuyog Pawar S32 a_ref_idx_lc_to_l1[MAX_NUM_REF]; 3071*c83a76b0SSuyog Pawar 3072*c83a76b0SSuyog Pawar /** Width and ht of each layer */ 3073*c83a76b0SSuyog Pawar S32 i4_wd; 3074*c83a76b0SSuyog Pawar S32 i4_ht; 3075*c83a76b0SSuyog Pawar 3076*c83a76b0SSuyog Pawar /** Histogram, one for each ref, allocated during craete time */ 3077*c83a76b0SSuyog Pawar mv_hist_t *aps_mv_hist[MAX_NUM_REF]; 3078*c83a76b0SSuyog Pawar 3079*c83a76b0SSuyog Pawar /** 3080*c83a76b0SSuyog Pawar * Back input requiring > 8 bit precision, allocated during 3081*c83a76b0SSuyog Pawar * create time, storing 2I-P0 for Bidir refinement 3082*c83a76b0SSuyog Pawar */ 3083*c83a76b0SSuyog Pawar S16 *pi2_inp_bck; 3084*c83a76b0SSuyog Pawar ctb_boundary_attrs_t as_ctb_bound_attrs[NUM_CTB_BOUNDARY_TYPES]; 3085*c83a76b0SSuyog Pawar 3086*c83a76b0SSuyog Pawar /** Whether a given ref id in Lc list is past frm or future frm */ 3087*c83a76b0SSuyog Pawar U08 au1_is_past[MAX_NUM_REF]; 3088*c83a76b0SSuyog Pawar 3089*c83a76b0SSuyog Pawar /** These are L0 and L1 lists, storing ref id Lc in them */ 3090*c83a76b0SSuyog Pawar S08 ai1_past_list[MAX_NUM_REF]; 3091*c83a76b0SSuyog Pawar S08 ai1_future_list[MAX_NUM_REF]; 3092*c83a76b0SSuyog Pawar 3093*c83a76b0SSuyog Pawar /** Number of past and future ref pics sent this frm */ 3094*c83a76b0SSuyog Pawar S32 num_ref_past; 3095*c83a76b0SSuyog Pawar S32 num_ref_future; 3096*c83a76b0SSuyog Pawar 3097*c83a76b0SSuyog Pawar /** 3098*c83a76b0SSuyog Pawar * Passed by encoder, stored as void to avoid header file inclusion 3099*c83a76b0SSuyog Pawar * of encoder wks into ME, these are frm prms passed by encoder, 3100*c83a76b0SSuyog Pawar * pointers to ctbanalyse_t and cu_analyse_t structures and the 3101*c83a76b0SSuyog Pawar * corresponding running ptrs 3102*c83a76b0SSuyog Pawar */ 3103*c83a76b0SSuyog Pawar 3104*c83a76b0SSuyog Pawar ctb_analyse_t *ps_ctb_analyse_base; 3105*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_cu_tree_base; 3106*c83a76b0SSuyog Pawar me_ctb_data_t *ps_me_ctb_data_base; 3107*c83a76b0SSuyog Pawar 3108*c83a76b0SSuyog Pawar ctb_analyse_t *ps_ctb_analyse_curr_row; 3109*c83a76b0SSuyog Pawar cu_analyse_t *ps_cu_analyse_curr_row; 3110*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_cu_tree_curr_row; 3111*c83a76b0SSuyog Pawar me_ctb_data_t *ps_me_ctb_data_curr_row; 3112*c83a76b0SSuyog Pawar 3113*c83a76b0SSuyog Pawar /** Log2 of ctb size e.g. for 64 size, it will be 6 */ 3114*c83a76b0SSuyog Pawar S32 log_ctb_size; 3115*c83a76b0SSuyog Pawar 3116*c83a76b0SSuyog Pawar hme_frm_prms_t *ps_hme_frm_prms; 3117*c83a76b0SSuyog Pawar 3118*c83a76b0SSuyog Pawar hme_ref_map_t *ps_hme_ref_map; 3119*c83a76b0SSuyog Pawar 3120*c83a76b0SSuyog Pawar /** 3121*c83a76b0SSuyog Pawar * Scale factor of any given ref lc to another ref in Q8 3122*c83a76b0SSuyog Pawar * First MAX_NUM_REF entries are to scale an mv of ref id k 3123*c83a76b0SSuyog Pawar * w.r.t. ref id 0 (approx 256 * POC delta(0) / POC delta(k)) 3124*c83a76b0SSuyog Pawar * Next MAX_NUM_REF entreis are to scale mv of ref id 1 w.r.t. 0 3125*c83a76b0SSuyog Pawar * And so on 3126*c83a76b0SSuyog Pawar */ 3127*c83a76b0SSuyog Pawar S16 ai2_ref_scf[MAX_NUM_REF * MAX_NUM_REF]; 3128*c83a76b0SSuyog Pawar 3129*c83a76b0SSuyog Pawar /** bits for a given ref id, in either list L0/L1 */ 3130*c83a76b0SSuyog Pawar U08 au1_ref_bits_tlu_lc[2][MAX_NUM_REF]; 3131*c83a76b0SSuyog Pawar 3132*c83a76b0SSuyog Pawar /** Points to above: 1 ptr for each list */ 3133*c83a76b0SSuyog Pawar U08 *apu1_ref_bits_tlu_lc[2]; 3134*c83a76b0SSuyog Pawar 3135*c83a76b0SSuyog Pawar /** 3136*c83a76b0SSuyog Pawar * Frame level base pointer to L0 IPE ctb analyze structures. 3137*c83a76b0SSuyog Pawar * This strucutres include the following 3138*c83a76b0SSuyog Pawar * 3139*c83a76b0SSuyog Pawar * 1. Best costs and modes at all levels of CTB (CU=8,16,32,64) 3140*c83a76b0SSuyog Pawar * 2. Recommended IPE intra CU sizes for this CTB size 3141*c83a76b0SSuyog Pawar * 3. Early intra/inter decision structures for all 8x8 blocks of CTB 3142*c83a76b0SSuyog Pawar * populated by L1-ME and L1-IPE 3143*c83a76b0SSuyog Pawar * 3144*c83a76b0SSuyog Pawar */ 3145*c83a76b0SSuyog Pawar ipe_l0_ctb_analyse_for_me_t *ps_ipe_l0_ctb_frm_base; 3146*c83a76b0SSuyog Pawar 3147*c83a76b0SSuyog Pawar /** array of ptrs to intra cost per layer encoded, stored at 8x8 */ 3148*c83a76b0SSuyog Pawar double *apd_intra_cost[MAX_NUM_LAYERS]; 3149*c83a76b0SSuyog Pawar 3150*c83a76b0SSuyog Pawar /** number of b fraems between P, depends on number of hierarchy layers */ 3151*c83a76b0SSuyog Pawar S32 num_b_frms; 3152*c83a76b0SSuyog Pawar 3153*c83a76b0SSuyog Pawar /** Frame level qp passed every frame by ME's caller */ 3154*c83a76b0SSuyog Pawar S32 frm_qstep; 3155*c83a76b0SSuyog Pawar 3156*c83a76b0SSuyog Pawar /** Frame level qp with higher precision : left shifted by 8 */ 3157*c83a76b0SSuyog Pawar S32 qstep_ls8; 3158*c83a76b0SSuyog Pawar 3159*c83a76b0SSuyog Pawar /** Backup of frame parameters */ 3160*c83a76b0SSuyog Pawar hme_frm_prms_t s_frm_prms; 3161*c83a76b0SSuyog Pawar 3162*c83a76b0SSuyog Pawar /** Weighted prediction parameters for all references are stored 3163*c83a76b0SSuyog Pawar * Scratch buffers for populated widgted inputs are also stored in this 3164*c83a76b0SSuyog Pawar */ 3165*c83a76b0SSuyog Pawar wgt_pred_ctxt_t s_wt_pred; 3166*c83a76b0SSuyog Pawar 3167*c83a76b0SSuyog Pawar /** Weighted pred enable flag */ 3168*c83a76b0SSuyog Pawar S32 i4_wt_pred_enable_flag; 3169*c83a76b0SSuyog Pawar 3170*c83a76b0SSuyog Pawar /** Results of 16 16x16 blks within a CTB used in enc layer */ 3171*c83a76b0SSuyog Pawar inter_cu_results_t as_cu16x16_results[16]; 3172*c83a76b0SSuyog Pawar 3173*c83a76b0SSuyog Pawar /** Results of 4 32x32 blks in a ctb for enc layer merge stage */ 3174*c83a76b0SSuyog Pawar inter_cu_results_t as_cu32x32_results[4]; 3175*c83a76b0SSuyog Pawar 3176*c83a76b0SSuyog Pawar /** Same as above but fo 64x64 blk */ 3177*c83a76b0SSuyog Pawar inter_cu_results_t s_cu64x64_results; 3178*c83a76b0SSuyog Pawar 3179*c83a76b0SSuyog Pawar /** Results of 64 8x8 blks within a CTB used in enc layer */ 3180*c83a76b0SSuyog Pawar inter_cu_results_t as_cu8x8_results[64]; 3181*c83a76b0SSuyog Pawar 3182*c83a76b0SSuyog Pawar WORD32 i4_is_prev_frame_reference; 3183*c83a76b0SSuyog Pawar 3184*c83a76b0SSuyog Pawar rc_quant_t *ps_rc_quant_ctxt; 3185*c83a76b0SSuyog Pawar 3186*c83a76b0SSuyog Pawar /** Dynamical Search Range parameters */ 3187*c83a76b0SSuyog Pawar l0_dyn_range_prms_t as_l0_dyn_range_prms[NUM_SG_INTERLEAVED]; 3188*c83a76b0SSuyog Pawar 3189*c83a76b0SSuyog Pawar /** Dependency manager for Row level sync in L0 ME pass */ 3190*c83a76b0SSuyog Pawar void *pv_dep_mngr_l0_me_sync; 3191*c83a76b0SSuyog Pawar 3192*c83a76b0SSuyog Pawar /** Pointer to structure containing function pointers of encoder*/ 3193*c83a76b0SSuyog Pawar me_func_selector_t *ps_func_selector; 3194*c83a76b0SSuyog Pawar 3195*c83a76b0SSuyog Pawar cluster_16x16_blk_t *ps_blk_16x16; 3196*c83a76b0SSuyog Pawar 3197*c83a76b0SSuyog Pawar cluster_32x32_blk_t *ps_blk_32x32; 3198*c83a76b0SSuyog Pawar 3199*c83a76b0SSuyog Pawar cluster_64x64_blk_t *ps_blk_64x64; 3200*c83a76b0SSuyog Pawar 3201*c83a76b0SSuyog Pawar ctb_cluster_info_t *ps_ctb_cluster_info; 3202*c83a76b0SSuyog Pawar 3203*c83a76b0SSuyog Pawar fullpel_refine_ctxt_t *ps_fullpel_refine_ctxt; 3204*c83a76b0SSuyog Pawar 3205*c83a76b0SSuyog Pawar /* thread id of the current context */ 3206*c83a76b0SSuyog Pawar WORD32 thrd_id; 3207*c83a76b0SSuyog Pawar 3208*c83a76b0SSuyog Pawar /* dependency manager for froward ME sync */ 3209*c83a76b0SSuyog Pawar void *pv_dep_mngr_encloop_dep_me; 3210*c83a76b0SSuyog Pawar WORD32 i4_l0me_qp_mod; 3211*c83a76b0SSuyog Pawar 3212*c83a76b0SSuyog Pawar /*mc ctxt to reuse lume inter pred fucntion 3213*c83a76b0SSuyog Pawar for the purpose of TRAQO*/ 3214*c83a76b0SSuyog Pawar inter_pred_me_ctxt_t s_mc_ctxt; 3215*c83a76b0SSuyog Pawar 3216*c83a76b0SSuyog Pawar WORD32 i4_rc_pass; 3217*c83a76b0SSuyog Pawar /*pic type*/ 3218*c83a76b0SSuyog Pawar WORD32 i4_pic_type; 3219*c83a76b0SSuyog Pawar 3220*c83a76b0SSuyog Pawar WORD32 i4_temporal_layer; 3221*c83a76b0SSuyog Pawar 3222*c83a76b0SSuyog Pawar WORD32 i4_count; 3223*c83a76b0SSuyog Pawar 3224*c83a76b0SSuyog Pawar WORD32 i4_use_const_lamda_modifier; 3225*c83a76b0SSuyog Pawar 3226*c83a76b0SSuyog Pawar double f_i_pic_lamda_modifier; 3227*c83a76b0SSuyog Pawar 3228*c83a76b0SSuyog Pawar UWORD8 u1_is_curFrame_a_refFrame; 3229*c83a76b0SSuyog Pawar 3230*c83a76b0SSuyog Pawar /* src_var related variables */ 3231*c83a76b0SSuyog Pawar U32 au4_4x4_src_sigmaX[MAX_NUM_SIGMAS_4x4]; 3232*c83a76b0SSuyog Pawar U32 au4_4x4_src_sigmaXSquared[MAX_NUM_SIGMAS_4x4]; 3233*c83a76b0SSuyog Pawar } me_frm_ctxt_t; 3234*c83a76b0SSuyog Pawar 3235*c83a76b0SSuyog Pawar /** 3236*c83a76b0SSuyog Pawar ****************************************************************************** 3237*c83a76b0SSuyog Pawar * @struct me_ctxt_t 3238*c83a76b0SSuyog Pawar * @brief Handle for ME 3239*c83a76b0SSuyog Pawar ****************************************************************************** 3240*c83a76b0SSuyog Pawar */ 3241*c83a76b0SSuyog Pawar typedef struct 3242*c83a76b0SSuyog Pawar { 3243*c83a76b0SSuyog Pawar /** Init prms send by encoder during create time */ 3244*c83a76b0SSuyog Pawar hme_init_prms_t s_init_prms; 3245*c83a76b0SSuyog Pawar 3246*c83a76b0SSuyog Pawar /** Not used in encoder, relevant to test bench */ 3247*c83a76b0SSuyog Pawar U08 *pu1_debug_out; 3248*c83a76b0SSuyog Pawar 3249*c83a76b0SSuyog Pawar void *pv_ext_frm_prms; 3250*c83a76b0SSuyog Pawar 3251*c83a76b0SSuyog Pawar /* Frame level ME ctxt */ 3252*c83a76b0SSuyog Pawar me_frm_ctxt_t *aps_me_frm_prms[MAX_NUM_ME_PARALLEL]; 3253*c83a76b0SSuyog Pawar 3254*c83a76b0SSuyog Pawar /** Ptr to all layer ctxt place holder for all pics */ 3255*c83a76b0SSuyog Pawar /** number of reference descriptors should be equal to max number of active references **/ 3256*c83a76b0SSuyog Pawar layers_descr_t as_ref_descr[((DEFAULT_MAX_REFERENCE_PICS << 1) * MAX_NUM_ME_PARALLEL) + 1]; 3257*c83a76b0SSuyog Pawar 3258*c83a76b0SSuyog Pawar /* Should be typecast to a struct of type 'ihevce_me_optimised_function_list_t' */ 3259*c83a76b0SSuyog Pawar void *pv_me_optimised_function_list; 3260*c83a76b0SSuyog Pawar 3261*c83a76b0SSuyog Pawar ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list; 3262*c83a76b0SSuyog Pawar 3263*c83a76b0SSuyog Pawar /* Pointer to Tile params base */ 3264*c83a76b0SSuyog Pawar void *pv_tile_params_base; 3265*c83a76b0SSuyog Pawar 3266*c83a76b0SSuyog Pawar } me_ctxt_t; 3267*c83a76b0SSuyog Pawar 3268*c83a76b0SSuyog Pawar typedef struct 3269*c83a76b0SSuyog Pawar { 3270*c83a76b0SSuyog Pawar /** array of context for each thread */ 3271*c83a76b0SSuyog Pawar coarse_me_ctxt_t *aps_me_ctxt[MAX_NUM_FRM_PROC_THRDS_PRE_ENC]; 3272*c83a76b0SSuyog Pawar 3273*c83a76b0SSuyog Pawar /** memtabs storage memory */ 3274*c83a76b0SSuyog Pawar hme_memtab_t as_memtabs[HME_COARSE_TOT_MEMTABS]; 3275*c83a76b0SSuyog Pawar 3276*c83a76b0SSuyog Pawar /** Frame level parameters for ME */ 3277*c83a76b0SSuyog Pawar hme_frm_prms_t s_frm_prms; 3278*c83a76b0SSuyog Pawar 3279*c83a76b0SSuyog Pawar /** Holds all reference mapping */ 3280*c83a76b0SSuyog Pawar hme_ref_map_t s_ref_map; 3281*c83a76b0SSuyog Pawar 3282*c83a76b0SSuyog Pawar /** number of threads created run time */ 3283*c83a76b0SSuyog Pawar WORD32 i4_num_proc_thrds; 3284*c83a76b0SSuyog Pawar 3285*c83a76b0SSuyog Pawar /** Dependency manager for Row level sync in HME pass */ 3286*c83a76b0SSuyog Pawar /* Note : Indexing should be like layer_id - 1 */ 3287*c83a76b0SSuyog Pawar void *apv_dep_mngr_hme_sync[MAX_NUM_HME_LAYERS - 1]; 3288*c83a76b0SSuyog Pawar /* Should be typecast to a struct of type 'ihevce_me_optimised_function_list_t' */ 3289*c83a76b0SSuyog Pawar void *pv_me_optimised_function_list; 3290*c83a76b0SSuyog Pawar 3291*c83a76b0SSuyog Pawar ihevce_cmn_opt_func_t s_cmn_opt_func; 3292*c83a76b0SSuyog Pawar } coarse_me_master_ctxt_t; 3293*c83a76b0SSuyog Pawar 3294*c83a76b0SSuyog Pawar typedef struct 3295*c83a76b0SSuyog Pawar { 3296*c83a76b0SSuyog Pawar /** array of context for each thread */ 3297*c83a76b0SSuyog Pawar me_ctxt_t *aps_me_ctxt[MAX_NUM_FRM_PROC_THRDS_ENC]; 3298*c83a76b0SSuyog Pawar 3299*c83a76b0SSuyog Pawar /** memtabs storage memory */ 3300*c83a76b0SSuyog Pawar hme_memtab_t as_memtabs[MAX_HME_ENC_TOT_MEMTABS]; 3301*c83a76b0SSuyog Pawar 3302*c83a76b0SSuyog Pawar /** Frame level parameters for ME */ 3303*c83a76b0SSuyog Pawar hme_frm_prms_t as_frm_prms[MAX_NUM_ME_PARALLEL]; 3304*c83a76b0SSuyog Pawar 3305*c83a76b0SSuyog Pawar /** Holds all reference mapping */ 3306*c83a76b0SSuyog Pawar hme_ref_map_t as_ref_map[MAX_NUM_ME_PARALLEL]; 3307*c83a76b0SSuyog Pawar 3308*c83a76b0SSuyog Pawar /** number of threads created run time */ 3309*c83a76b0SSuyog Pawar WORD32 i4_num_proc_thrds; 3310*c83a76b0SSuyog Pawar 3311*c83a76b0SSuyog Pawar /** number of me frames running in parallel */ 3312*c83a76b0SSuyog Pawar WORD32 i4_num_me_frm_pllel; 3313*c83a76b0SSuyog Pawar 3314*c83a76b0SSuyog Pawar /** Pointer to structure containing function pointers of encoder*/ 3315*c83a76b0SSuyog Pawar me_func_selector_t s_func_selector; 3316*c83a76b0SSuyog Pawar /* Should be typecast to a struct of type 'ihevce_me_optimised_function_list_t' */ 3317*c83a76b0SSuyog Pawar void *pv_me_optimised_function_list; 3318*c83a76b0SSuyog Pawar 3319*c83a76b0SSuyog Pawar ihevce_cmn_opt_func_t s_cmn_opt_func; 3320*c83a76b0SSuyog Pawar 3321*c83a76b0SSuyog Pawar /* Pointer to Tile params base */ 3322*c83a76b0SSuyog Pawar void *pv_tile_params_base; 3323*c83a76b0SSuyog Pawar 3324*c83a76b0SSuyog Pawar } me_master_ctxt_t; 3325*c83a76b0SSuyog Pawar 3326*c83a76b0SSuyog Pawar typedef struct 3327*c83a76b0SSuyog Pawar { 3328*c83a76b0SSuyog Pawar S16 i2_mv_x; 3329*c83a76b0SSuyog Pawar 3330*c83a76b0SSuyog Pawar S16 i2_mv_y; 3331*c83a76b0SSuyog Pawar 3332*c83a76b0SSuyog Pawar U08 u1_ref_idx; 3333*c83a76b0SSuyog Pawar 3334*c83a76b0SSuyog Pawar U32 au4_node_map[2 * MAP_Y_MAX]; 3335*c83a76b0SSuyog Pawar 3336*c83a76b0SSuyog Pawar } subpel_dedup_enabler_t; 3337*c83a76b0SSuyog Pawar 3338*c83a76b0SSuyog Pawar typedef subpel_dedup_enabler_t hme_dedup_enabler_t; 3339*c83a76b0SSuyog Pawar 3340*c83a76b0SSuyog Pawar typedef struct 3341*c83a76b0SSuyog Pawar { 3342*c83a76b0SSuyog Pawar layer_ctxt_t *ps_curr_layer; 3343*c83a76b0SSuyog Pawar 3344*c83a76b0SSuyog Pawar layer_ctxt_t *ps_coarse_layer; 3345*c83a76b0SSuyog Pawar 3346*c83a76b0SSuyog Pawar U08 *pu1_num_fpel_search_cands; 3347*c83a76b0SSuyog Pawar 3348*c83a76b0SSuyog Pawar S32 *pi4_ref_id_lc_to_l0_map; 3349*c83a76b0SSuyog Pawar 3350*c83a76b0SSuyog Pawar S32 *pi4_ref_id_lc_to_l1_map; 3351*c83a76b0SSuyog Pawar 3352*c83a76b0SSuyog Pawar S32 i4_pos_x; 3353*c83a76b0SSuyog Pawar 3354*c83a76b0SSuyog Pawar S32 i4_pos_y; 3355*c83a76b0SSuyog Pawar 3356*c83a76b0SSuyog Pawar S32 i4_num_act_ref_l0; 3357*c83a76b0SSuyog Pawar 3358*c83a76b0SSuyog Pawar S32 i4_num_act_ref_l1; 3359*c83a76b0SSuyog Pawar 3360*c83a76b0SSuyog Pawar search_candt_t *ps_search_cands; 3361*c83a76b0SSuyog Pawar 3362*c83a76b0SSuyog Pawar U08 u1_search_candidate_list_index; 3363*c83a76b0SSuyog Pawar 3364*c83a76b0SSuyog Pawar S32 i4_max_num_init_cands; 3365*c83a76b0SSuyog Pawar 3366*c83a76b0SSuyog Pawar U08 u1_pred_dir; 3367*c83a76b0SSuyog Pawar 3368*c83a76b0SSuyog Pawar /* Indicates the position of the current predDir in the processing order of predDir */ 3369*c83a76b0SSuyog Pawar U08 u1_pred_dir_ctr; 3370*c83a76b0SSuyog Pawar 3371*c83a76b0SSuyog Pawar /* The following 4 flags apply exclusively to spatial candidates */ 3372*c83a76b0SSuyog Pawar U08 u1_is_topRight_available; 3373*c83a76b0SSuyog Pawar 3374*c83a76b0SSuyog Pawar U08 u1_is_topLeft_available; 3375*c83a76b0SSuyog Pawar 3376*c83a76b0SSuyog Pawar U08 u1_is_top_available; 3377*c83a76b0SSuyog Pawar 3378*c83a76b0SSuyog Pawar U08 u1_is_left_available; 3379*c83a76b0SSuyog Pawar 3380*c83a76b0SSuyog Pawar S08 i1_default_ref_id; 3381*c83a76b0SSuyog Pawar 3382*c83a76b0SSuyog Pawar S08 i1_alt_default_ref_id; 3383*c83a76b0SSuyog Pawar 3384*c83a76b0SSuyog Pawar U08 u1_num_results_in_mvbank; 3385*c83a76b0SSuyog Pawar 3386*c83a76b0SSuyog Pawar BLK_SIZE_T e_search_blk_size; 3387*c83a76b0SSuyog Pawar 3388*c83a76b0SSuyog Pawar } fpel_srch_cand_init_data_t; 3389*c83a76b0SSuyog Pawar 3390*c83a76b0SSuyog Pawar typedef struct 3391*c83a76b0SSuyog Pawar { 3392*c83a76b0SSuyog Pawar U08 *pu1_pred; 3393*c83a76b0SSuyog Pawar 3394*c83a76b0SSuyog Pawar S32 i4_pred_stride; 3395*c83a76b0SSuyog Pawar 3396*c83a76b0SSuyog Pawar U08 u1_pred_buf_array_id; 3397*c83a76b0SSuyog Pawar 3398*c83a76b0SSuyog Pawar } hme_pred_buf_info_t; 3399*c83a76b0SSuyog Pawar 3400*c83a76b0SSuyog Pawar /*****************************************************************************/ 3401*c83a76b0SSuyog Pawar /* Typedefs */ 3402*c83a76b0SSuyog Pawar /*****************************************************************************/ 3403*c83a76b0SSuyog Pawar typedef void (*PF_SAD_FXN_T)(err_prms_t *); 3404*c83a76b0SSuyog Pawar 3405*c83a76b0SSuyog Pawar typedef void (*PF_SAD_RESULT_FXN_T)(err_prms_t *, result_upd_prms_t *ps_result_prms); 3406*c83a76b0SSuyog Pawar 3407*c83a76b0SSuyog Pawar typedef WORD32 (*PF_SAD_FXN_TU_REC)( 3408*c83a76b0SSuyog Pawar err_prms_t *, 3409*c83a76b0SSuyog Pawar WORD32 lambda, 3410*c83a76b0SSuyog Pawar WORD32 lamda_q_shift, 3411*c83a76b0SSuyog Pawar WORD32 i4_frm_qstep, 3412*c83a76b0SSuyog Pawar me_func_selector_t *ps_func_selector); 3413*c83a76b0SSuyog Pawar 3414*c83a76b0SSuyog Pawar typedef void (*PF_RESULT_FXN_T)(result_upd_prms_t *); 3415*c83a76b0SSuyog Pawar 3416*c83a76b0SSuyog Pawar typedef void (*PF_CALC_SAD_AND_RESULT)( 3417*c83a76b0SSuyog Pawar hme_search_prms_t *, wgt_pred_ctxt_t *, err_prms_t *, result_upd_prms_t *, U08 **, S32); 3418*c83a76b0SSuyog Pawar 3419*c83a76b0SSuyog Pawar #endif /* _HME_DEFS_H_ */ 3420