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_utils.h 23*c83a76b0SSuyog Pawar * 24*c83a76b0SSuyog Pawar * \brief 25*c83a76b0SSuyog Pawar * Prototypes for various utilities used by coarse/refinement/subpel fxns 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_UTILS_H_ 37*c83a76b0SSuyog Pawar #define _HME_UTILS_H_ 38*c83a76b0SSuyog Pawar 39*c83a76b0SSuyog Pawar /*****************************************************************************/ 40*c83a76b0SSuyog Pawar /* Functions */ 41*c83a76b0SSuyog Pawar /*****************************************************************************/ 42*c83a76b0SSuyog Pawar 43*c83a76b0SSuyog Pawar /** 44*c83a76b0SSuyog Pawar ******************************************************************************** 45*c83a76b0SSuyog Pawar * @fn hme_init_histogram( 46*c83a76b0SSuyog Pawar * 47*c83a76b0SSuyog Pawar * @brief Top level entry point for Coarse ME. Runs across blocks and does the 48*c83a76b0SSuyog Pawar * needful by calling other low level routines. 49*c83a76b0SSuyog Pawar * 50*c83a76b0SSuyog Pawar * @param[in,out] ps_hist : the histogram structure 51*c83a76b0SSuyog Pawar * 52*c83a76b0SSuyog Pawar * @param[in] i4_max_mv_x : Maximum mv allowed in x direction (fpel units) 53*c83a76b0SSuyog Pawar * 54*c83a76b0SSuyog Pawar * @param[in] i4_max_mv_y : Maximum mv allowed in y direction (fpel units) 55*c83a76b0SSuyog Pawar * 56*c83a76b0SSuyog Pawar * @return None 57*c83a76b0SSuyog Pawar ******************************************************************************** 58*c83a76b0SSuyog Pawar */ 59*c83a76b0SSuyog Pawar void hme_init_histogram(mv_hist_t *ps_hist, S32 i4_max_mv_x, S32 i4_max_mv_y); 60*c83a76b0SSuyog Pawar 61*c83a76b0SSuyog Pawar /** 62*c83a76b0SSuyog Pawar ******************************************************************************** 63*c83a76b0SSuyog Pawar * @fn hme_update_histogram( 64*c83a76b0SSuyog Pawar * 65*c83a76b0SSuyog Pawar * @brief Updates the histogram given an mv entry 66*c83a76b0SSuyog Pawar * 67*c83a76b0SSuyog Pawar * @param[in,out] ps_hist : the histogram structure 68*c83a76b0SSuyog Pawar * 69*c83a76b0SSuyog Pawar * @param[in] i4_mv_x : x component of the mv (fpel units) 70*c83a76b0SSuyog Pawar * 71*c83a76b0SSuyog Pawar * @param[in] i4_mv_y : y component of the mv (fpel units) 72*c83a76b0SSuyog Pawar * 73*c83a76b0SSuyog Pawar * @return None 74*c83a76b0SSuyog Pawar ******************************************************************************** 75*c83a76b0SSuyog Pawar */ 76*c83a76b0SSuyog Pawar void hme_update_histogram(mv_hist_t *ps_hist, S32 i4_mv_x, S32 i4_mv_y); 77*c83a76b0SSuyog Pawar 78*c83a76b0SSuyog Pawar /** 79*c83a76b0SSuyog Pawar ******************************************************************************** 80*c83a76b0SSuyog Pawar * @fn hme_get_global_mv( 81*c83a76b0SSuyog Pawar * 82*c83a76b0SSuyog Pawar * @brief returns the global mv of a previous picture. Accounts for the fact 83*c83a76b0SSuyog Pawar * that the delta poc of the previous picture may have been different 84*c83a76b0SSuyog Pawar * from delta poc of current picture. Delta poc is POC difference 85*c83a76b0SSuyog Pawar * between a picture and its reference. 86*c83a76b0SSuyog Pawar * 87*c83a76b0SSuyog Pawar * @param[out] ps_mv: mv_t structure where the motion vector is returned 88*c83a76b0SSuyog Pawar * 89*c83a76b0SSuyog Pawar * @param[in] i4_delta_poc: the delta poc for the current pic w.r.t. reference 90*c83a76b0SSuyog Pawar * 91*c83a76b0SSuyog Pawar * @return None 92*c83a76b0SSuyog Pawar ******************************************************************************** 93*c83a76b0SSuyog Pawar */ 94*c83a76b0SSuyog Pawar void hme_get_global_mv(layer_ctxt_t *ps_prev_layer, hme_mv_t *ps_mv, S32 i4_delta_poc); 95*c83a76b0SSuyog Pawar 96*c83a76b0SSuyog Pawar /** 97*c83a76b0SSuyog Pawar ******************************************************************************** 98*c83a76b0SSuyog Pawar * @fn hme_calculate_global_mv( 99*c83a76b0SSuyog Pawar * 100*c83a76b0SSuyog Pawar * @brief Calculates global mv for a given histogram 101*c83a76b0SSuyog Pawar * 102*c83a76b0SSuyog Pawar * @param[in] ps_hist : the histogram structure 103*c83a76b0SSuyog Pawar * 104*c83a76b0SSuyog Pawar * @param[in] ps_mv : used to return the global mv 105*c83a76b0SSuyog Pawar * 106*c83a76b0SSuyog Pawar * @param[in] e_lobe_type : refer to GMV_MVTYPE_T 107*c83a76b0SSuyog Pawar * 108*c83a76b0SSuyog Pawar * @return None 109*c83a76b0SSuyog Pawar ******************************************************************************** 110*c83a76b0SSuyog Pawar */ 111*c83a76b0SSuyog Pawar void hme_calculate_global_mv(mv_hist_t *ps_hist, hme_mv_t *ps_mv, GMV_MVTYPE_T e_lobe_type); 112*c83a76b0SSuyog Pawar 113*c83a76b0SSuyog Pawar /** 114*c83a76b0SSuyog Pawar ******************************************************************************** 115*c83a76b0SSuyog Pawar * @fn hme_collate_fpel_results(search_results_t *ps_search_results, 116*c83a76b0SSuyog Pawar * S32 i1_ref_idx, S32 i1_idx_to_merge) 117*c83a76b0SSuyog Pawar * 118*c83a76b0SSuyog Pawar * @brief After full pel search and result seeding in every search iteration 119*c83a76b0SSuyog Pawar * results, this function called to collapse a given search iteration 120*c83a76b0SSuyog Pawar * results into another. 121*c83a76b0SSuyog Pawar * 122*c83a76b0SSuyog Pawar * @param[in,out] ps_search_results : Search results data structure 123*c83a76b0SSuyog Pawar * @param[in] i1_ref_idx: id of the search iteration where the results 124*c83a76b0SSuyog Pawar will be collapsed 125*c83a76b0SSuyog Pawar * @param[in] i1_idx_to_merge : id of the search iteration from which the 126*c83a76b0SSuyog Pawar * results are picked up. 127*c83a76b0SSuyog Pawar 128*c83a76b0SSuyog Pawar * 129*c83a76b0SSuyog Pawar * @return None 130*c83a76b0SSuyog Pawar ******************************************************************************** 131*c83a76b0SSuyog Pawar */ 132*c83a76b0SSuyog Pawar void hme_collate_fpel_results( 133*c83a76b0SSuyog Pawar search_results_t *ps_search_results, S08 i1_ref_idx, S08 i1_idx_to_merge); 134*c83a76b0SSuyog Pawar 135*c83a76b0SSuyog Pawar /** 136*c83a76b0SSuyog Pawar ******************************************************************************** 137*c83a76b0SSuyog Pawar * @fn hme_map_mvs_to_grid(mv_grid_t **pps_mv_grid, 138*c83a76b0SSuyog Pawar search_results_t *ps_search_results, S32 i4_num_ref) 139*c83a76b0SSuyog Pawar * 140*c83a76b0SSuyog Pawar * @brief For a given CU whose results are in ps_search_results, the 17x17 141*c83a76b0SSuyog Pawar * mv grid is updated for future use within the CTB 142*c83a76b0SSuyog Pawar * 143*c83a76b0SSuyog Pawar * @param[in] ps_search_results : Search results data structure 144*c83a76b0SSuyog Pawar * 145*c83a76b0SSuyog Pawar * @param[out] pps_mv_grid: The mv grid (as many as num ref) 146*c83a76b0SSuyog Pawar * 147*c83a76b0SSuyog Pawar * @param[in] i4_num_ref: nuber of search iterations to update 148*c83a76b0SSuyog Pawar * 149*c83a76b0SSuyog Pawar * @param[in] mv_res_shift: Shift for resolution of mv (fpel/qpel) 150*c83a76b0SSuyog Pawar * 151*c83a76b0SSuyog Pawar * @return None 152*c83a76b0SSuyog Pawar ******************************************************************************** 153*c83a76b0SSuyog Pawar */ 154*c83a76b0SSuyog Pawar void hme_map_mvs_to_grid( 155*c83a76b0SSuyog Pawar mv_grid_t **pps_mv_grid, 156*c83a76b0SSuyog Pawar search_results_t *ps_search_results, 157*c83a76b0SSuyog Pawar U08 *pu1_pred_dir_searched, 158*c83a76b0SSuyog Pawar S32 i4_num_pred_dir); 159*c83a76b0SSuyog Pawar 160*c83a76b0SSuyog Pawar /** 161*c83a76b0SSuyog Pawar ******************************************************************************** 162*c83a76b0SSuyog Pawar * @fn hme_create_valid_part_ids(S32 i4_part_mask, S32 *pi4_valid_part_ids) 163*c83a76b0SSuyog Pawar * 164*c83a76b0SSuyog Pawar * @brief Expands the part mask to a list of valid part ids terminated by -1 165*c83a76b0SSuyog Pawar * 166*c83a76b0SSuyog Pawar * @param[in] i4_part_mask : bit mask of active partitino ids 167*c83a76b0SSuyog Pawar * 168*c83a76b0SSuyog Pawar * @param[out] pi4_valid_part_ids : array, each entry has one valid part id 169*c83a76b0SSuyog Pawar * Terminated by -1 to signal end. 170*c83a76b0SSuyog Pawar * 171*c83a76b0SSuyog Pawar * @return number of partitions 172*c83a76b0SSuyog Pawar ******************************************************************************** 173*c83a76b0SSuyog Pawar */ 174*c83a76b0SSuyog Pawar S32 hme_create_valid_part_ids(S32 i4_part_mask, S32 *pi4_valid_part_ids); 175*c83a76b0SSuyog Pawar 176*c83a76b0SSuyog Pawar /** 177*c83a76b0SSuyog Pawar ******************************************************************************** 178*c83a76b0SSuyog Pawar * @fn get_num_blks_in_ctb(S32 i4_ctb_x, 179*c83a76b0SSuyog Pawar S32 i4_ctb_y, 180*c83a76b0SSuyog Pawar S32 i4_pic_wd, 181*c83a76b0SSuyog Pawar S32 i4_pic_ht, 182*c83a76b0SSuyog Pawar S32 i4_blk_size) 183*c83a76b0SSuyog Pawar * 184*c83a76b0SSuyog Pawar * @brief returns the number of blks in the ctb (64x64 ctb) 185*c83a76b0SSuyog Pawar * 186*c83a76b0SSuyog Pawar * @param[in] i4_ctb_x : pixel x offset of the top left corner of ctb in pic 187*c83a76b0SSuyog Pawar * 188*c83a76b0SSuyog Pawar * @param[in] i4_ctb_y : pixel y offset of the top left corner of ctb in pic 189*c83a76b0SSuyog Pawar * 190*c83a76b0SSuyog Pawar * @param[in] i4_ctb_x : width of the picture in pixels 191*c83a76b0SSuyog Pawar * 192*c83a76b0SSuyog Pawar * @param[in] i4_pic_ht : height of hte picture in pixels 193*c83a76b0SSuyog Pawar * 194*c83a76b0SSuyog Pawar * @param[in] i4_blk_size : Size of the blk in pixels 195*c83a76b0SSuyog Pawar * 196*c83a76b0SSuyog Pawar * @return number of blks in the ctb 197*c83a76b0SSuyog Pawar ******************************************************************************** 198*c83a76b0SSuyog Pawar */ 199*c83a76b0SSuyog Pawar S32 get_num_blks_in_ctb(S32 i4_ctb_x, S32 i4_ctb_y, S32 i4_pic_wd, S32 i4_pic_ht, S32 i4_blk_size); 200*c83a76b0SSuyog Pawar 201*c83a76b0SSuyog Pawar /** 202*c83a76b0SSuyog Pawar ******************************************************************************** 203*c83a76b0SSuyog Pawar * @fn hevc_avg_2d(U08 *pu1_src1, 204*c83a76b0SSuyog Pawar * U08 *pu1_src2, 205*c83a76b0SSuyog Pawar * S32 i4_src1_stride, 206*c83a76b0SSuyog Pawar * S32 i4_src2_stride, 207*c83a76b0SSuyog Pawar * S32 i4_blk_wd, 208*c83a76b0SSuyog Pawar * S32 i4_blk_ht, 209*c83a76b0SSuyog Pawar * U08 *pu1_dst, 210*c83a76b0SSuyog Pawar * S32 i4_dst_stride) 211*c83a76b0SSuyog Pawar * 212*c83a76b0SSuyog Pawar * 213*c83a76b0SSuyog Pawar * @brief point wise average of two buffers into a third buffer 214*c83a76b0SSuyog Pawar * 215*c83a76b0SSuyog Pawar * @param[in] pu1_src1 : first source buffer 216*c83a76b0SSuyog Pawar * 217*c83a76b0SSuyog Pawar * @param[in] pu1_src2 : 2nd source buffer 218*c83a76b0SSuyog Pawar * 219*c83a76b0SSuyog Pawar * @param[in] i4_src1_stride : stride of source 1 buffer 220*c83a76b0SSuyog Pawar * 221*c83a76b0SSuyog Pawar * @param[in] i4_src2_stride : stride of source 2 buffer 222*c83a76b0SSuyog Pawar * 223*c83a76b0SSuyog Pawar * @param[in] i4_blk_wd : block width 224*c83a76b0SSuyog Pawar * 225*c83a76b0SSuyog Pawar * @param[in] i4_blk_ht : block height 226*c83a76b0SSuyog Pawar * 227*c83a76b0SSuyog Pawar * @param[out] pu1_dst : destination buffer 228*c83a76b0SSuyog Pawar * 229*c83a76b0SSuyog Pawar * @param[in] i4_dst_stride : stride of the destination buffer 230*c83a76b0SSuyog Pawar * 231*c83a76b0SSuyog Pawar * @return void 232*c83a76b0SSuyog Pawar ******************************************************************************** 233*c83a76b0SSuyog Pawar */ 234*c83a76b0SSuyog Pawar void hevc_avg_2d( 235*c83a76b0SSuyog Pawar U08 *pu1_src1, 236*c83a76b0SSuyog Pawar U08 *pu1_src2, 237*c83a76b0SSuyog Pawar S32 i4_src1_stride, 238*c83a76b0SSuyog Pawar S32 i4_src2_stride, 239*c83a76b0SSuyog Pawar S32 i4_blk_wd, 240*c83a76b0SSuyog Pawar S32 i4_blk_ht, 241*c83a76b0SSuyog Pawar U08 *pu1_dst, 242*c83a76b0SSuyog Pawar S32 i4_dst_stride); 243*c83a76b0SSuyog Pawar 244*c83a76b0SSuyog Pawar /** 245*c83a76b0SSuyog Pawar ******************************************************************************** 246*c83a76b0SSuyog Pawar * @fn hme_pick_back_search_node(search_results_t *ps_search_results, 247*c83a76b0SSuyog Pawar * search_node_t *ps_search_node_fwd, 248*c83a76b0SSuyog Pawar * S32 i4_part_idx, 249*c83a76b0SSuyog Pawar * layer_ctxt_t *ps_curr_layer) 250*c83a76b0SSuyog Pawar * 251*c83a76b0SSuyog Pawar * 252*c83a76b0SSuyog Pawar * @brief returns the search node corresponding to a ref idx in same or 253*c83a76b0SSuyog Pawar * opp direction. Preference is given to opp direction, but if that 254*c83a76b0SSuyog Pawar * does not yield results, same direction is attempted. 255*c83a76b0SSuyog Pawar * 256*c83a76b0SSuyog Pawar * @param[in] ps_search_results: search results overall 257*c83a76b0SSuyog Pawar * 258*c83a76b0SSuyog Pawar * @param[in] ps_search_node_fwd: search node corresponding to "fwd" direction 259*c83a76b0SSuyog Pawar * 260*c83a76b0SSuyog Pawar * @param[in] i4_part_idx : partition id 261*c83a76b0SSuyog Pawar * 262*c83a76b0SSuyog Pawar * @param[in] ps_curr_layer : layer context for current layer. 263*c83a76b0SSuyog Pawar * 264*c83a76b0SSuyog Pawar * @return search node corresponding to hte "other direction" 265*c83a76b0SSuyog Pawar ******************************************************************************** 266*c83a76b0SSuyog Pawar */ 267*c83a76b0SSuyog Pawar search_node_t *hme_pick_back_search_node( 268*c83a76b0SSuyog Pawar search_results_t *ps_search_results, 269*c83a76b0SSuyog Pawar search_node_t *ps_search_node_fwd, 270*c83a76b0SSuyog Pawar S32 i4_part_idx, 271*c83a76b0SSuyog Pawar layer_ctxt_t *ps_curr_layer); 272*c83a76b0SSuyog Pawar 273*c83a76b0SSuyog Pawar /** 274*c83a76b0SSuyog Pawar ******************************************************************************** 275*c83a76b0SSuyog Pawar * @fn hme_study_input_segmentation(U08 *pu1_inp, 276*c83a76b0SSuyog Pawar * S32 i4_inp_stride, 277*c83a76b0SSuyog Pawar * S32 limit_active_partitions) 278*c83a76b0SSuyog Pawar * 279*c83a76b0SSuyog Pawar * 280*c83a76b0SSuyog Pawar * @brief Examines input 16x16 for possible edges and orientations of those, 281*c83a76b0SSuyog Pawar * and returns a bit mask of partitions that should be searched for 282*c83a76b0SSuyog Pawar * 283*c83a76b0SSuyog Pawar * @param[in] pu1_inp : input buffer 284*c83a76b0SSuyog Pawar * 285*c83a76b0SSuyog Pawar * @param[in] i4_inp_stride: input stride 286*c83a76b0SSuyog Pawar * 287*c83a76b0SSuyog Pawar * @param[in] limit_active_partitions : 1: Edge algo done and partitions are 288*c83a76b0SSuyog Pawar * limited, 0 : Brute force, all partitions considered 289*c83a76b0SSuyog Pawar * 290*c83a76b0SSuyog Pawar * @return part mask (bit mask of active partitions to search) 291*c83a76b0SSuyog Pawar ******************************************************************************** 292*c83a76b0SSuyog Pawar */ 293*c83a76b0SSuyog Pawar S32 hme_study_input_segmentation(U08 *pu1_inp, S32 i4_inp_stride, S32 limit_active_partitions); 294*c83a76b0SSuyog Pawar 295*c83a76b0SSuyog Pawar /** 296*c83a76b0SSuyog Pawar ******************************************************************************** 297*c83a76b0SSuyog Pawar * @fn hme_init_search_results(search_results_t *ps_search_results, 298*c83a76b0SSuyog Pawar * S32 i4_num_ref, 299*c83a76b0SSuyog Pawar * S32 i4_num_best_results, 300*c83a76b0SSuyog Pawar * S32 i4_num_results_per_part, 301*c83a76b0SSuyog Pawar * BLK_SIZE_T e_blk_size, 302*c83a76b0SSuyog Pawar * S32 i4_x_off, 303*c83a76b0SSuyog Pawar * S32 i4_y_off) 304*c83a76b0SSuyog Pawar * 305*c83a76b0SSuyog Pawar * @brief Initializes the search results structure with some key attributes 306*c83a76b0SSuyog Pawar * 307*c83a76b0SSuyog Pawar * @param[out] ps_search_results : search results structure to initialise 308*c83a76b0SSuyog Pawar * 309*c83a76b0SSuyog Pawar * @param[in] i4_num_Ref: corresponds to the number of ref ids searched 310*c83a76b0SSuyog Pawar * 311*c83a76b0SSuyog Pawar * @param[in] i4_num_best_results: Number of best results for the CU to 312*c83a76b0SSuyog Pawar * be maintained in the result structure 313*c83a76b0SSuyog Pawar * 314*c83a76b0SSuyog Pawar * @param[in] i4_num_results_per_part: Per active partition the number of best 315*c83a76b0SSuyog Pawar * results to be maintained 316*c83a76b0SSuyog Pawar * 317*c83a76b0SSuyog Pawar * @param[in] e_blk_size: blk size of the CU for which this structure used 318*c83a76b0SSuyog Pawar * 319*c83a76b0SSuyog Pawar * @param[in] i4_x_off: x offset of the top left of CU from CTB top left 320*c83a76b0SSuyog Pawar * 321*c83a76b0SSuyog Pawar * @param[in] i4_y_off: y offset of the top left of CU from CTB top left 322*c83a76b0SSuyog Pawar * 323*c83a76b0SSuyog Pawar * @return void 324*c83a76b0SSuyog Pawar ******************************************************************************** 325*c83a76b0SSuyog Pawar */ 326*c83a76b0SSuyog Pawar void hme_init_search_results( 327*c83a76b0SSuyog Pawar search_results_t *ps_search_results, 328*c83a76b0SSuyog Pawar S32 i4_num_ref, 329*c83a76b0SSuyog Pawar S32 i4_num_best_results, 330*c83a76b0SSuyog Pawar S32 i4_num_results_per_part, 331*c83a76b0SSuyog Pawar BLK_SIZE_T e_blk_size, 332*c83a76b0SSuyog Pawar S32 i4_x_off, 333*c83a76b0SSuyog Pawar S32 i4_y_off, 334*c83a76b0SSuyog Pawar U08 *pu1_is_past); 335*c83a76b0SSuyog Pawar 336*c83a76b0SSuyog Pawar /** 337*c83a76b0SSuyog Pawar ******************************************************************************** 338*c83a76b0SSuyog Pawar * @fn hme_reset_search_results((search_results_t *ps_search_results, 339*c83a76b0SSuyog Pawar * S32 i4_part_mask) 340*c83a76b0SSuyog Pawar * 341*c83a76b0SSuyog Pawar * 342*c83a76b0SSuyog Pawar * @brief Resets the best results to maximum values, so as to allow search 343*c83a76b0SSuyog Pawar * for the new CU's partitions. The existing results may be from an 344*c83a76b0SSuyog Pawar * older CU using same structure. 345*c83a76b0SSuyog Pawar * 346*c83a76b0SSuyog Pawar * @param[in] ps_search_results: search results structure 347*c83a76b0SSuyog Pawar * 348*c83a76b0SSuyog Pawar * @param[in] i4_part_mask : bit mask of active partitions 349*c83a76b0SSuyog Pawar * 350*c83a76b0SSuyog Pawar * @param[in] mv_res : Resolution of the mv predictors (fpel/qpel) 351*c83a76b0SSuyog Pawar * 352*c83a76b0SSuyog Pawar * @return void 353*c83a76b0SSuyog Pawar ******************************************************************************** 354*c83a76b0SSuyog Pawar */ 355*c83a76b0SSuyog Pawar void hme_reset_search_results(search_results_t *ps_search_results, S32 i4_part_mask, S32 mv_res); 356*c83a76b0SSuyog Pawar 357*c83a76b0SSuyog Pawar /** 358*c83a76b0SSuyog Pawar ******************************************************************************** 359*c83a76b0SSuyog Pawar * @fn hme_clamp_grid_by_mvrange(search_node_t *ps_search_node, 360*c83a76b0SSuyog Pawar * S32 i4_step, 361*c83a76b0SSuyog Pawar * range_prms_t *ps_mvrange) 362*c83a76b0SSuyog Pawar * 363*c83a76b0SSuyog Pawar * @brief Given a central pt within mv range, and a grid of points surrounding 364*c83a76b0SSuyog Pawar * this pt, this function returns a grid mask of pts within search rng 365*c83a76b0SSuyog Pawar * 366*c83a76b0SSuyog Pawar * @param[in] ps_search_node: the centre pt of the grid 367*c83a76b0SSuyog Pawar * 368*c83a76b0SSuyog Pawar * @param[in] i4_step: step size of grid 369*c83a76b0SSuyog Pawar * 370*c83a76b0SSuyog Pawar * @param[in] ps_mvrange: structure containing the current mv range 371*c83a76b0SSuyog Pawar * 372*c83a76b0SSuyog Pawar * @return bitmask of the pts in grid within search range 373*c83a76b0SSuyog Pawar ******************************************************************************** 374*c83a76b0SSuyog Pawar */ 375*c83a76b0SSuyog Pawar S32 hme_clamp_grid_by_mvrange(search_node_t *ps_search_node, S32 i4_step, range_prms_t *ps_mvrange); 376*c83a76b0SSuyog Pawar 377*c83a76b0SSuyog Pawar /** 378*c83a76b0SSuyog Pawar ******************************************************************************** 379*c83a76b0SSuyog Pawar * @fn layer_ctxt_t *hme_get_past_layer_ctxt(me_ctxt_t *ps_ctxt, 380*c83a76b0SSuyog Pawar S32 i4_layer_id) 381*c83a76b0SSuyog Pawar * 382*c83a76b0SSuyog Pawar * @brief returns the layer ctxt of the layer with given id from the temporally 383*c83a76b0SSuyog Pawar * previous frame 384*c83a76b0SSuyog Pawar * 385*c83a76b0SSuyog Pawar * @param[in] ps_ctxt : ME context 386*c83a76b0SSuyog Pawar * 387*c83a76b0SSuyog Pawar * @param[in] i4_layer_id : id of layer required 388*c83a76b0SSuyog Pawar * 389*c83a76b0SSuyog Pawar * @return layer ctxt of given layer id in temporally previous frame 390*c83a76b0SSuyog Pawar ******************************************************************************** 391*c83a76b0SSuyog Pawar */ 392*c83a76b0SSuyog Pawar layer_ctxt_t *hme_get_past_layer_ctxt( 393*c83a76b0SSuyog Pawar me_ctxt_t *ps_ctxt, me_frm_ctxt_t *ps_frm_ctxt, S32 i4_layer_id, S32 i4_num_me_frm_pllel); 394*c83a76b0SSuyog Pawar 395*c83a76b0SSuyog Pawar layer_ctxt_t *hme_coarse_get_past_layer_ctxt(coarse_me_ctxt_t *ps_ctxt, S32 i4_layer_id); 396*c83a76b0SSuyog Pawar 397*c83a76b0SSuyog Pawar /** 398*c83a76b0SSuyog Pawar ******************************************************************************** 399*c83a76b0SSuyog Pawar * @fn void hme_init_mv_bank(layer_ctxt_t *ps_layer_ctxt, 400*c83a76b0SSuyog Pawar BLK_SIZE_T e_blk_size, 401*c83a76b0SSuyog Pawar S32 i4_num_ref, 402*c83a76b0SSuyog Pawar S32 i4_num_results_per_part) 403*c83a76b0SSuyog Pawar * 404*c83a76b0SSuyog Pawar * @brief Given a blk size to be used for this layer, this function initialize 405*c83a76b0SSuyog Pawar * the mv bank to make it ready to store and return results. 406*c83a76b0SSuyog Pawar * 407*c83a76b0SSuyog Pawar * @param[in, out] ps_layer_ctxt: pointer to layer ctxt 408*c83a76b0SSuyog Pawar * 409*c83a76b0SSuyog Pawar * @param[in] e_blk_size : resolution at which mvs are stored 410*c83a76b0SSuyog Pawar * 411*c83a76b0SSuyog Pawar * @param[in] i4_num_ref: number of reference frames corresponding to which 412*c83a76b0SSuyog Pawar * results are stored. 413*c83a76b0SSuyog Pawar * 414*c83a76b0SSuyog Pawar * @param[in] e_blk_size : resolution at which mvs are stored 415*c83a76b0SSuyog Pawar * 416*c83a76b0SSuyog Pawar * @param[in] i4_num_results_per_part : Number of results to be stored per 417*c83a76b0SSuyog Pawar * ref idx. So these many best results stored 418*c83a76b0SSuyog Pawar * 419*c83a76b0SSuyog Pawar * @return void 420*c83a76b0SSuyog Pawar ******************************************************************************** 421*c83a76b0SSuyog Pawar */ 422*c83a76b0SSuyog Pawar void hme_init_mv_bank( 423*c83a76b0SSuyog Pawar layer_ctxt_t *ps_layer_ctxt, 424*c83a76b0SSuyog Pawar BLK_SIZE_T e_blk_size, 425*c83a76b0SSuyog Pawar S32 i4_num_ref, 426*c83a76b0SSuyog Pawar S32 i4_num_results_per_part, 427*c83a76b0SSuyog Pawar U08 u1_enc); 428*c83a76b0SSuyog Pawar 429*c83a76b0SSuyog Pawar /** 430*c83a76b0SSuyog Pawar ******************************************************************************** 431*c83a76b0SSuyog Pawar * @fn void hme_derive_search_range(range_prms_t *ps_range, 432*c83a76b0SSuyog Pawar * range_prms_t *ps_pic_limit, 433*c83a76b0SSuyog Pawar * range_prms_t *ps_mv_limit, 434*c83a76b0SSuyog Pawar * S32 i4_x, 435*c83a76b0SSuyog Pawar * S32 i4_y, 436*c83a76b0SSuyog Pawar * S32 blk_wd, 437*c83a76b0SSuyog Pawar * S32 blk_ht) 438*c83a76b0SSuyog Pawar * 439*c83a76b0SSuyog Pawar * @brief given picture limits and blk dimensions and mv search limits, obtains 440*c83a76b0SSuyog Pawar * teh valid search range such that the blk stays within pic boundaries, 441*c83a76b0SSuyog Pawar * where picture boundaries include padded portions of picture 442*c83a76b0SSuyog Pawar * 443*c83a76b0SSuyog Pawar * @param[out] ps_range: updated with actual search range 444*c83a76b0SSuyog Pawar * 445*c83a76b0SSuyog Pawar * @param[in] ps_pic_limit : picture boundaries 446*c83a76b0SSuyog Pawar * 447*c83a76b0SSuyog Pawar * @param[in] ps_mv_limit: Search range limits for the mvs 448*c83a76b0SSuyog Pawar * 449*c83a76b0SSuyog Pawar * @param[in] i4_x : x coordinate of the blk 450*c83a76b0SSuyog Pawar * 451*c83a76b0SSuyog Pawar * @param[in] i4_y : y coordinate of the blk 452*c83a76b0SSuyog Pawar * 453*c83a76b0SSuyog Pawar * @param[in] blk_wd : blk width 454*c83a76b0SSuyog Pawar * 455*c83a76b0SSuyog Pawar * @param[in] blk_ht : blk height 456*c83a76b0SSuyog Pawar * 457*c83a76b0SSuyog Pawar * @return void 458*c83a76b0SSuyog Pawar ******************************************************************************** 459*c83a76b0SSuyog Pawar */ 460*c83a76b0SSuyog Pawar void hme_derive_search_range( 461*c83a76b0SSuyog Pawar range_prms_t *ps_range, 462*c83a76b0SSuyog Pawar range_prms_t *ps_pic_limit, 463*c83a76b0SSuyog Pawar range_prms_t *ps_mv_limit, 464*c83a76b0SSuyog Pawar S32 i4_x, 465*c83a76b0SSuyog Pawar S32 i4_y, 466*c83a76b0SSuyog Pawar S32 blk_wd, 467*c83a76b0SSuyog Pawar S32 blk_ht); 468*c83a76b0SSuyog Pawar 469*c83a76b0SSuyog Pawar /** 470*c83a76b0SSuyog Pawar ******************************************************************************** 471*c83a76b0SSuyog Pawar * @fn void hme_get_spatial_candt(layer_ctxt_t *ps_curr_layer, 472*c83a76b0SSuyog Pawar * BLK_SIZE_T e_search_blk_size, 473*c83a76b0SSuyog Pawar * S32 blk_x, 474*c83a76b0SSuyog Pawar * S32 blk_y, 475*c83a76b0SSuyog Pawar * S08 i1_ref_idx, 476*c83a76b0SSuyog Pawar * search_node_t *ps_top_neighbours, 477*c83a76b0SSuyog Pawar * search_node_t *ps_left_neighbours, 478*c83a76b0SSuyog Pawar * S32 i4_result_id); 479*c83a76b0SSuyog Pawar * 480*c83a76b0SSuyog Pawar * @brief Obtains top, top left, top right and left adn bottom left candts 481*c83a76b0SSuyog Pawar * 482*c83a76b0SSuyog Pawar * @param[in] ps_curr_layer: layer ctxt, has the mv bank structure pointer 483*c83a76b0SSuyog Pawar * 484*c83a76b0SSuyog Pawar * @param[in] e_search_blk_size : search blk size of current layer 485*c83a76b0SSuyog Pawar * 486*c83a76b0SSuyog Pawar * @param[in] i4_blk_x : x coordinate of the block in mv bank 487*c83a76b0SSuyog Pawar * 488*c83a76b0SSuyog Pawar * @param[in] i4_blk_y : y coordinate of the block in mv bank 489*c83a76b0SSuyog Pawar * 490*c83a76b0SSuyog Pawar * @param[in] i1_ref_idx : Corresponds to ref idx from which to pick up mv 491*c83a76b0SSuyog Pawar * results, useful if multiple ref idx candts maintained separately. 492*c83a76b0SSuyog Pawar * 493*c83a76b0SSuyog Pawar * @param[out] ps_top_neighbours : T, TL, TR candts are output here 494*c83a76b0SSuyog Pawar * 495*c83a76b0SSuyog Pawar * @param[out] ps_left_neighbours : L BL candts outptu here 496*c83a76b0SSuyog Pawar * 497*c83a76b0SSuyog Pawar * @param[in] i4_result_id : If multiple results stored per ref idx, this 498*c83a76b0SSuyog Pawar * pts to the id of the result 499*c83a76b0SSuyog Pawar * 500*c83a76b0SSuyog Pawar * @return void 501*c83a76b0SSuyog Pawar ******************************************************************************** 502*c83a76b0SSuyog Pawar */ 503*c83a76b0SSuyog Pawar void hme_get_spatial_candt( 504*c83a76b0SSuyog Pawar layer_ctxt_t *ps_curr_layer, 505*c83a76b0SSuyog Pawar BLK_SIZE_T e_search_blk_size, 506*c83a76b0SSuyog Pawar S32 blk_x, 507*c83a76b0SSuyog Pawar S32 blk_y, 508*c83a76b0SSuyog Pawar S08 i1_ref_idx, 509*c83a76b0SSuyog Pawar search_node_t *ps_top_neighbours, 510*c83a76b0SSuyog Pawar search_node_t *ps_left_neighbours, 511*c83a76b0SSuyog Pawar S32 i4_result_id, 512*c83a76b0SSuyog Pawar S32 i4_tr_avail, 513*c83a76b0SSuyog Pawar S32 i4_bl_avail, 514*c83a76b0SSuyog Pawar S32 encode); 515*c83a76b0SSuyog Pawar 516*c83a76b0SSuyog Pawar void hme_get_spatial_candt_in_l1_me( 517*c83a76b0SSuyog Pawar layer_ctxt_t *ps_curr_layer, 518*c83a76b0SSuyog Pawar BLK_SIZE_T e_search_blk_size, 519*c83a76b0SSuyog Pawar S32 i4_blk_x, 520*c83a76b0SSuyog Pawar S32 i4_blk_y, 521*c83a76b0SSuyog Pawar S08 i1_ref_idx, 522*c83a76b0SSuyog Pawar U08 u1_pred_dir, 523*c83a76b0SSuyog Pawar search_node_t *ps_top_neighbours, 524*c83a76b0SSuyog Pawar search_node_t *ps_left_neighbours, 525*c83a76b0SSuyog Pawar S32 i4_result_id, 526*c83a76b0SSuyog Pawar S32 tr_avail, 527*c83a76b0SSuyog Pawar S32 bl_avail, 528*c83a76b0SSuyog Pawar S32 i4_num_act_ref_l0, 529*c83a76b0SSuyog Pawar S32 i4_num_act_ref_l1); 530*c83a76b0SSuyog Pawar 531*c83a76b0SSuyog Pawar /** 532*c83a76b0SSuyog Pawar ******************************************************************************** 533*c83a76b0SSuyog Pawar * @fn void hme_fill_ctb_neighbour_mvs(layer_ctxt_t *ps_curr_layer, 534*c83a76b0SSuyog Pawar * S32 i4_blk_x, 535*c83a76b0SSuyog Pawar * S32 i4_blk_y, 536*c83a76b0SSuyog Pawar * mvgrid_t *ps_mv_grid , 537*c83a76b0SSuyog Pawar * S32 i1_ref_id) 538*c83a76b0SSuyog Pawar * 539*c83a76b0SSuyog Pawar * @brief The 18x18 MV grid for a ctb, is filled in first row and 1st col 540*c83a76b0SSuyog Pawar * this corresponds to neighbours (TL, T, TR, L, BL) 541*c83a76b0SSuyog Pawar * 542*c83a76b0SSuyog Pawar * @param[in] ps_curr_layer: layer ctxt, has the mv bank structure pointer 543*c83a76b0SSuyog Pawar * 544*c83a76b0SSuyog Pawar * @param[in] blk_x : x coordinate of the block in mv bank 545*c83a76b0SSuyog Pawar * 546*c83a76b0SSuyog Pawar * @param[in] blk_y : y coordinate of the block in mv bank 547*c83a76b0SSuyog Pawar * 548*c83a76b0SSuyog Pawar * @param[in] ps_mv_grid : Grid (18x18 mvs at 4x4 level) 549*c83a76b0SSuyog Pawar * 550*c83a76b0SSuyog Pawar * @param[in] u1_pred_lx : Corresponds to pred dir from which to pick up mv 551*c83a76b0SSuyog Pawar * results 552*c83a76b0SSuyog Pawar * 553*c83a76b0SSuyog Pawar * @return void 554*c83a76b0SSuyog Pawar ******************************************************************************** 555*c83a76b0SSuyog Pawar */ 556*c83a76b0SSuyog Pawar void hme_fill_ctb_neighbour_mvs( 557*c83a76b0SSuyog Pawar layer_ctxt_t *ps_curr_layer, 558*c83a76b0SSuyog Pawar S32 blk_x, 559*c83a76b0SSuyog Pawar S32 blk_y, 560*c83a76b0SSuyog Pawar mv_grid_t *ps_mv_grid, 561*c83a76b0SSuyog Pawar U08 u1_pred_dir_ctr, 562*c83a76b0SSuyog Pawar U08 u1_default_ref_id, 563*c83a76b0SSuyog Pawar S32 i4_num_act_ref_l0); 564*c83a76b0SSuyog Pawar 565*c83a76b0SSuyog Pawar /** 566*c83a76b0SSuyog Pawar ******************************************************************************** 567*c83a76b0SSuyog Pawar * @fn void *hme_get_wkg_mem(buf_mgr_t *ps_buf_mgr, S32 i4_size) 568*c83a76b0SSuyog Pawar * 569*c83a76b0SSuyog Pawar * @brief Allocates a block of size = i4_size from working memory and returns 570*c83a76b0SSuyog Pawar * 571*c83a76b0SSuyog Pawar * @param[in,out] ps_buf_mgr: Buffer manager for wkg memory 572*c83a76b0SSuyog Pawar * 573*c83a76b0SSuyog Pawar * @param[in] i4_size : size required 574*c83a76b0SSuyog Pawar * 575*c83a76b0SSuyog Pawar * @return void pointer to allocated memory, NULL if failure 576*c83a76b0SSuyog Pawar ******************************************************************************** 577*c83a76b0SSuyog Pawar */ 578*c83a76b0SSuyog Pawar void *hme_get_wkg_mem(buf_mgr_t *ps_buf_mgr, S32 i4_size); 579*c83a76b0SSuyog Pawar 580*c83a76b0SSuyog Pawar void hme_reset_wkg_mem(buf_mgr_t *ps_buf_mgr); 581*c83a76b0SSuyog Pawar 582*c83a76b0SSuyog Pawar void hme_init_wkg_mem(buf_mgr_t *ps_buf_mgr, U08 *pu1_mem, S32 size); 583*c83a76b0SSuyog Pawar 584*c83a76b0SSuyog Pawar void hme_reset_ctb_mem_mgr(ctb_mem_mgr_t *ps_ctb_mem_mgr); 585*c83a76b0SSuyog Pawar 586*c83a76b0SSuyog Pawar void hme_init_ctb_mem_mgr(ctb_mem_mgr_t *ps_ctb_mem_mgr, U08 *pu1_mem, S32 size); 587*c83a76b0SSuyog Pawar 588*c83a76b0SSuyog Pawar void hme_fill_mvbank_intra(layer_ctxt_t *ps_layer_ctxt); 589*c83a76b0SSuyog Pawar 590*c83a76b0SSuyog Pawar void hme_scale_mv_grid(mv_grid_t *ps_mv_grid); 591*c83a76b0SSuyog Pawar 592*c83a76b0SSuyog Pawar void hme_downscale_mv_grid(mv_grid_t *ps_mv_grid); 593*c83a76b0SSuyog Pawar 594*c83a76b0SSuyog Pawar void hme_create_parent_ctb( 595*c83a76b0SSuyog Pawar ctb_node_t *ps_ctb_node_parent, 596*c83a76b0SSuyog Pawar ctb_node_t *ps_ctb_child_tl, 597*c83a76b0SSuyog Pawar ctb_node_t *ps_ctb_child_tr, 598*c83a76b0SSuyog Pawar ctb_node_t *ps_ctb_child_bl, 599*c83a76b0SSuyog Pawar ctb_node_t *ps_ctb_child_br, 600*c83a76b0SSuyog Pawar CU_SIZE_T e_cu_size_parent, 601*c83a76b0SSuyog Pawar buf_mgr_t *ps_buf_mgr); 602*c83a76b0SSuyog Pawar 603*c83a76b0SSuyog Pawar void hme_create_merged_ctbs( 604*c83a76b0SSuyog Pawar search_results_t *ps_results_merged, 605*c83a76b0SSuyog Pawar ctb_mem_mgr_t *ps_ctb_mem_mgr, 606*c83a76b0SSuyog Pawar buf_mgr_t *ps_buf_mgr, 607*c83a76b0SSuyog Pawar ctb_node_t **pps_ctb_list_unified, 608*c83a76b0SSuyog Pawar S32 num_candts); 609*c83a76b0SSuyog Pawar 610*c83a76b0SSuyog Pawar void hme_init_mv_grid(mv_grid_t *ps_mv_grid); 611*c83a76b0SSuyog Pawar 612*c83a76b0SSuyog Pawar typedef void (*pf_get_wt_inp)( 613*c83a76b0SSuyog Pawar layer_ctxt_t *ps_curr_layer, 614*c83a76b0SSuyog Pawar wgt_pred_ctxt_t *ps_wt_inp_prms, 615*c83a76b0SSuyog Pawar S32 dst_stride, 616*c83a76b0SSuyog Pawar S32 pos_x, 617*c83a76b0SSuyog Pawar S32 pos_y, 618*c83a76b0SSuyog Pawar S32 size, 619*c83a76b0SSuyog Pawar S32 num_ref, 620*c83a76b0SSuyog Pawar U08 u1_is_wt_pred_on); 621*c83a76b0SSuyog Pawar 622*c83a76b0SSuyog Pawar /** 623*c83a76b0SSuyog Pawar ******************************************************************************** 624*c83a76b0SSuyog Pawar * @fn void hme_pad_left(U08 *pu1_dst, S32 stride, S32 pad_wd, S32 pad_ht) 625*c83a76b0SSuyog Pawar * 626*c83a76b0SSuyog Pawar * @brief Pads horizontally to left side. Each pixel replicated across a line 627*c83a76b0SSuyog Pawar * 628*c83a76b0SSuyog Pawar * @param[in] pu1_dst : destination pointer. Points to the pixel to be repeated 629*c83a76b0SSuyog Pawar * 630*c83a76b0SSuyog Pawar * @param[in] stride : stride of destination buffer 631*c83a76b0SSuyog Pawar * 632*c83a76b0SSuyog Pawar * @param[in] pad_wd : Amt of horizontal padding to be done 633*c83a76b0SSuyog Pawar * 634*c83a76b0SSuyog Pawar * @param[in] pad_ht : Number of lines for which horizontal padding to be done 635*c83a76b0SSuyog Pawar * 636*c83a76b0SSuyog Pawar * @return void 637*c83a76b0SSuyog Pawar ******************************************************************************** 638*c83a76b0SSuyog Pawar */ 639*c83a76b0SSuyog Pawar void hme_pad_left(U08 *pu1_dst, S32 stride, S32 pad_wd, S32 pad_ht); 640*c83a76b0SSuyog Pawar 641*c83a76b0SSuyog Pawar /** 642*c83a76b0SSuyog Pawar ******************************************************************************** 643*c83a76b0SSuyog Pawar * @fn void hme_pad_right(U08 *pu1_dst, S32 stride, S32 pad_wd, S32 pad_ht) 644*c83a76b0SSuyog Pawar * 645*c83a76b0SSuyog Pawar * @brief Pads horizontally to rt side. Each pixel replicated across a line 646*c83a76b0SSuyog Pawar * 647*c83a76b0SSuyog Pawar * @param[in] pu1_dst : destination pointer. Points to the pixel to be repeated 648*c83a76b0SSuyog Pawar * 649*c83a76b0SSuyog Pawar * @param[in] stride : stride of destination buffer 650*c83a76b0SSuyog Pawar * 651*c83a76b0SSuyog Pawar * @param[in] pad_wd : Amt of horizontal padding to be done 652*c83a76b0SSuyog Pawar * 653*c83a76b0SSuyog Pawar * @param[in] pad_ht : Number of lines for which horizontal padding to be done 654*c83a76b0SSuyog Pawar * 655*c83a76b0SSuyog Pawar * @return void 656*c83a76b0SSuyog Pawar ******************************************************************************** 657*c83a76b0SSuyog Pawar */ 658*c83a76b0SSuyog Pawar void hme_pad_right(U08 *pu1_dst, S32 stride, S32 pad_wd, S32 pad_ht); 659*c83a76b0SSuyog Pawar 660*c83a76b0SSuyog Pawar /** 661*c83a76b0SSuyog Pawar ******************************************************************************** 662*c83a76b0SSuyog Pawar * @fn void hme_pad_top(U08 *pu1_dst, S32 stride, S32 pad_ht, S32 pad_wd) 663*c83a76b0SSuyog Pawar * 664*c83a76b0SSuyog Pawar * @brief Pads vertically on the top. Repeats the top line for top padding 665*c83a76b0SSuyog Pawar * 666*c83a76b0SSuyog Pawar * @param[in] pu1_dst : destination pointer. Points to the line to be repeated 667*c83a76b0SSuyog Pawar * 668*c83a76b0SSuyog Pawar * @param[in] stride : stride of destination buffer 669*c83a76b0SSuyog Pawar * 670*c83a76b0SSuyog Pawar * @param[in] pad_ht : Amt of vertical padding to be done 671*c83a76b0SSuyog Pawar * 672*c83a76b0SSuyog Pawar * @param[in] pad_wd : Number of columns for which vertical padding to be done 673*c83a76b0SSuyog Pawar * 674*c83a76b0SSuyog Pawar * @return void 675*c83a76b0SSuyog Pawar ******************************************************************************** 676*c83a76b0SSuyog Pawar */ 677*c83a76b0SSuyog Pawar void hme_pad_top(U08 *pu1_dst, S32 stride, S32 pad_ht, S32 pad_wd); 678*c83a76b0SSuyog Pawar 679*c83a76b0SSuyog Pawar /** 680*c83a76b0SSuyog Pawar ******************************************************************************** 681*c83a76b0SSuyog Pawar * @fn void hme_pad_bot(U08 *pu1_dst, S32 stride, S32 pad_ht, S32 pad_wd) 682*c83a76b0SSuyog Pawar * 683*c83a76b0SSuyog Pawar * @brief Pads vertically on the bot. Repeats the top line for top padding 684*c83a76b0SSuyog Pawar * 685*c83a76b0SSuyog Pawar * @param[in] pu1_dst : destination pointer. Points to the line to be repeated 686*c83a76b0SSuyog Pawar * 687*c83a76b0SSuyog Pawar * @param[in] stride : stride of destination buffer 688*c83a76b0SSuyog Pawar * 689*c83a76b0SSuyog Pawar * @param[in] pad_ht : Amt of vertical padding to be done 690*c83a76b0SSuyog Pawar * 691*c83a76b0SSuyog Pawar * @param[in] pad_wd : Number of columns for which vertical padding to be done 692*c83a76b0SSuyog Pawar * 693*c83a76b0SSuyog Pawar * @return void 694*c83a76b0SSuyog Pawar ******************************************************************************** 695*c83a76b0SSuyog Pawar */ 696*c83a76b0SSuyog Pawar void hme_pad_bot(U08 *pu1_dst, S32 stride, S32 pad_ht, S32 pad_wd); 697*c83a76b0SSuyog Pawar 698*c83a76b0SSuyog Pawar /** 699*c83a76b0SSuyog Pawar ************************************************************************************************** 700*c83a76b0SSuyog Pawar * @fn hme_populate_pus(search_results_t *ps_search_results, inter_cu_results_t *ps_cu_results) 701*c83a76b0SSuyog Pawar * 702*c83a76b0SSuyog Pawar * @brief Population the pu_results structure with the results after the subpel refinement 703*c83a76b0SSuyog Pawar * 704*c83a76b0SSuyog Pawar * This is called post subpel refinmenent for 16x16s, 8x8s and 705*c83a76b0SSuyog Pawar * for post merge evaluation for 32x32,64x64 CUs 706*c83a76b0SSuyog Pawar * 707*c83a76b0SSuyog Pawar * @param[in,out] ps_search_results : Search results data structure 708*c83a76b0SSuyog Pawar * - ps_cu_results : cu_results data structure 709*c83a76b0SSuyog Pawar * ps_pu_result : Pointer to the memory for storing PU's 710*c83a76b0SSuyog Pawar * 711*c83a76b0SSuyog Pawar **************************************************************************************************** 712*c83a76b0SSuyog Pawar */ 713*c83a76b0SSuyog Pawar void hme_populate_pus( 714*c83a76b0SSuyog Pawar me_ctxt_t *ps_thrd_ctxt, 715*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_ctxt, 716*c83a76b0SSuyog Pawar hme_subpel_prms_t *ps_subpel_prms, 717*c83a76b0SSuyog Pawar search_results_t *ps_search_results, 718*c83a76b0SSuyog Pawar inter_cu_results_t *ps_cu_results, 719*c83a76b0SSuyog Pawar inter_pu_results_t *ps_pu_results, 720*c83a76b0SSuyog Pawar pu_result_t *ps_pu_result, 721*c83a76b0SSuyog Pawar inter_ctb_prms_t *ps_inter_ctb_prms, 722*c83a76b0SSuyog Pawar wgt_pred_ctxt_t *ps_wt_prms, 723*c83a76b0SSuyog Pawar layer_ctxt_t *ps_curr_layer, 724*c83a76b0SSuyog Pawar U08 *pu1_pred_dir_searched, 725*c83a76b0SSuyog Pawar WORD32 i4_num_active_ref); 726*c83a76b0SSuyog Pawar 727*c83a76b0SSuyog Pawar void hme_populate_pus_8x8_cu( 728*c83a76b0SSuyog Pawar me_ctxt_t *ps_thrd_ctxt, 729*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_ctxt, 730*c83a76b0SSuyog Pawar hme_subpel_prms_t *ps_subpel_prms, 731*c83a76b0SSuyog Pawar search_results_t *ps_search_results, 732*c83a76b0SSuyog Pawar inter_cu_results_t *ps_cu_results, 733*c83a76b0SSuyog Pawar inter_pu_results_t *ps_pu_results, 734*c83a76b0SSuyog Pawar pu_result_t *ps_pu_result, 735*c83a76b0SSuyog Pawar inter_ctb_prms_t *ps_inter_ctb_prms, 736*c83a76b0SSuyog Pawar U08 *pu1_pred_dir_searched, 737*c83a76b0SSuyog Pawar WORD32 i4_num_active_ref, 738*c83a76b0SSuyog Pawar U08 u1_blk_8x8_mask); 739*c83a76b0SSuyog Pawar 740*c83a76b0SSuyog Pawar S32 hme_recompute_lambda_from_min_8x8_act_in_ctb( 741*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_ctxt, ipe_l0_ctb_analyse_for_me_t *ps_cur_ipe_ctb); 742*c83a76b0SSuyog Pawar 743*c83a76b0SSuyog Pawar /** 744*c83a76b0SSuyog Pawar ******************************************************************************** 745*c83a76b0SSuyog Pawar * @fn hme_update_dynamic_search_params 746*c83a76b0SSuyog Pawar * 747*c83a76b0SSuyog Pawar * @brief Update the Dynamic search params based on the current MVs 748*c83a76b0SSuyog Pawar * 749*c83a76b0SSuyog Pawar * @param[in,out] ps_dyn_range_prms [inout] : Dyn. Range Param str. 750*c83a76b0SSuyog Pawar * i2_mvy [in] : current MV y comp. 751*c83a76b0SSuyog Pawar * 752*c83a76b0SSuyog Pawar * @return None 753*c83a76b0SSuyog Pawar ******************************************************************************** 754*c83a76b0SSuyog Pawar */ 755*c83a76b0SSuyog Pawar void hme_update_dynamic_search_params(dyn_range_prms_t *ps_dyn_range_prms, WORD16 i2_mvy); 756*c83a76b0SSuyog Pawar 757*c83a76b0SSuyog Pawar S32 hme_create_child_nodes_cu_tree( 758*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_cu_tree_root, 759*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_cu_tree_cur_node, 760*c83a76b0SSuyog Pawar S32 nodes_already_created); 761*c83a76b0SSuyog Pawar 762*c83a76b0SSuyog Pawar void hme_add_new_node_to_a_sorted_array( 763*c83a76b0SSuyog Pawar search_node_t *ps_result_node, 764*c83a76b0SSuyog Pawar search_node_t **pps_sorted_array, 765*c83a76b0SSuyog Pawar U08 *pu1_shifts, 766*c83a76b0SSuyog Pawar U32 u4_num_results_updated, 767*c83a76b0SSuyog Pawar U08 u1_shift); 768*c83a76b0SSuyog Pawar 769*c83a76b0SSuyog Pawar S32 hme_find_pos_of_implicitly_stored_ref_id( 770*c83a76b0SSuyog Pawar S08 *pi1_ref_idx, S08 i1_ref_idx, S32 i4_result_id, S32 i4_num_results); 771*c83a76b0SSuyog Pawar 772*c83a76b0SSuyog Pawar S32 hme_populate_search_candidates(fpel_srch_cand_init_data_t *ps_ctxt); 773*c83a76b0SSuyog Pawar 774*c83a76b0SSuyog Pawar void hme_init_pred_buf_info( 775*c83a76b0SSuyog Pawar hme_pred_buf_info_t (*ps_info)[MAX_NUM_INTER_PARTS], 776*c83a76b0SSuyog Pawar hme_pred_buf_mngr_t *ps_buf_mngr, 777*c83a76b0SSuyog Pawar U08 u1_pu1_wd, 778*c83a76b0SSuyog Pawar U08 u1_pu1_ht, 779*c83a76b0SSuyog Pawar PART_TYPE_T e_part_type); 780*c83a76b0SSuyog Pawar 781*c83a76b0SSuyog Pawar void hme_debrief_bipred_eval( 782*c83a76b0SSuyog Pawar part_type_results_t *ps_part_type_result, 783*c83a76b0SSuyog Pawar hme_pred_buf_info_t (*ps_pred_buf_info)[MAX_NUM_INTER_PARTS], 784*c83a76b0SSuyog Pawar hme_pred_buf_mngr_t *ps_pred_buf_mngr, 785*c83a76b0SSuyog Pawar U08 *pu1_allocated_pred_buf_array_indixes, 786*c83a76b0SSuyog Pawar ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list); 787*c83a76b0SSuyog Pawar 788*c83a76b0SSuyog Pawar U08 hme_decide_search_candidate_priority_in_l1_and_l2_me( 789*c83a76b0SSuyog Pawar SEARCH_CANDIDATE_TYPE_T e_cand_type, ME_QUALITY_PRESETS_T e_quality_preset); 790*c83a76b0SSuyog Pawar 791*c83a76b0SSuyog Pawar U08 hme_decide_search_candidate_priority_in_l0_me(SEARCH_CANDIDATE_TYPE_T e_cand_type, U08 u1_index); 792*c83a76b0SSuyog Pawar 793*c83a76b0SSuyog Pawar void hme_search_cand_data_init( 794*c83a76b0SSuyog Pawar S32 *pi4_id_Z, 795*c83a76b0SSuyog Pawar S32 *pi4_id_coloc, 796*c83a76b0SSuyog Pawar S32 *pi4_num_coloc_cands, 797*c83a76b0SSuyog Pawar U08 *pu1_search_candidate_list_index, 798*c83a76b0SSuyog Pawar S32 i4_num_act_ref_l0, 799*c83a76b0SSuyog Pawar S32 i4_num_act_ref_l1, 800*c83a76b0SSuyog Pawar U08 u1_is_bidir_enabled, 801*c83a76b0SSuyog Pawar U08 u1_4x4_blk_in_l1me); 802*c83a76b0SSuyog Pawar 803*c83a76b0SSuyog Pawar void hme_compute_variance_for_all_parts( 804*c83a76b0SSuyog Pawar U08 *pu1_data, 805*c83a76b0SSuyog Pawar S32 i4_data_stride, 806*c83a76b0SSuyog Pawar S32 *pi4_valid_part_array, 807*c83a76b0SSuyog Pawar U32 *pu4_variance, 808*c83a76b0SSuyog Pawar S32 i4_num_valid_parts, 809*c83a76b0SSuyog Pawar U08 u1_cu_size); 810*c83a76b0SSuyog Pawar 811*c83a76b0SSuyog Pawar void hme_compute_sigmaX_and_sigmaXSquared( 812*c83a76b0SSuyog Pawar U08 *pu1_data, 813*c83a76b0SSuyog Pawar S32 i4_buf_stride, 814*c83a76b0SSuyog Pawar void *pv_sigmaX, 815*c83a76b0SSuyog Pawar void *pv_sigmaXSquared, 816*c83a76b0SSuyog Pawar U08 u1_base_blk_wd, 817*c83a76b0SSuyog Pawar U08 u1_base_blk_ht, 818*c83a76b0SSuyog Pawar U08 u1_blk_wd, 819*c83a76b0SSuyog Pawar U08 u1_blk_ht, 820*c83a76b0SSuyog Pawar U08 u1_is_sigma_pointer_size_32_bit, 821*c83a76b0SSuyog Pawar U08 u1_array_stride); 822*c83a76b0SSuyog Pawar 823*c83a76b0SSuyog Pawar void hme_compute_final_sigma_of_pu_from_base_blocks( 824*c83a76b0SSuyog Pawar U32 *pu4_SigmaX, 825*c83a76b0SSuyog Pawar U32 *pu4_SigmaXSquared, 826*c83a76b0SSuyog Pawar ULWORD64 *pu8_final_sigmaX, 827*c83a76b0SSuyog Pawar ULWORD64 *pu8_final_sigmaX_Squared, 828*c83a76b0SSuyog Pawar U08 u1_cu_size, 829*c83a76b0SSuyog Pawar U08 u1_base_block_size, 830*c83a76b0SSuyog Pawar S32 i4_part_id, 831*c83a76b0SSuyog Pawar U08 u1_base_blk_array_stride); 832*c83a76b0SSuyog Pawar 833*c83a76b0SSuyog Pawar void hme_compute_stim_injected_distortion_for_all_parts( 834*c83a76b0SSuyog Pawar U08 *pu1_pred, 835*c83a76b0SSuyog Pawar S32 i4_pred_stride, 836*c83a76b0SSuyog Pawar S32 *pi4_valid_part_array, 837*c83a76b0SSuyog Pawar ULWORD64 *pu8_src_sigmaX, 838*c83a76b0SSuyog Pawar ULWORD64 *pu8_src_sigmaXSquared, 839*c83a76b0SSuyog Pawar S32 *pi4_sad_array, 840*c83a76b0SSuyog Pawar S32 i4_alpha_stim_multiplier, 841*c83a76b0SSuyog Pawar S32 i4_inv_wt, 842*c83a76b0SSuyog Pawar S32 i4_inv_wt_shift_val, 843*c83a76b0SSuyog Pawar S32 i4_num_valid_parts, 844*c83a76b0SSuyog Pawar S32 i4_wpred_log_wdc, 845*c83a76b0SSuyog Pawar U08 u1_cu_size); 846*c83a76b0SSuyog Pawar 847*c83a76b0SSuyog Pawar void sigma_for_cusize_16_and_baseblock_size_16( 848*c83a76b0SSuyog Pawar U08 *pu1_data, S32 i4_data_stride, U32 *pu4_sigmaX, U32 *pu4_sigmaXSquared); 849*c83a76b0SSuyog Pawar 850*c83a76b0SSuyog Pawar void sigma_for_cusize_16_and_baseblock_size_8( 851*c83a76b0SSuyog Pawar U08 *pu1_data, S32 i4_data_stride, U32 *pu4_sigmaX, U32 *pu4_sigmaXSquared, U08 diff_cu_size); 852*c83a76b0SSuyog Pawar 853*c83a76b0SSuyog Pawar void sigma_for_cusize_16_and_baseblock_size_4( 854*c83a76b0SSuyog Pawar U08 *pu1_data, S32 i4_data_stride, U32 *pu4_sigmaX, U32 *pu4_sigmaXSquared); 855*c83a76b0SSuyog Pawar 856*c83a76b0SSuyog Pawar void sigma_for_cusize_32_and_baseblock_size_32( 857*c83a76b0SSuyog Pawar U08 *pu1_data, S32 i4_data_stride, U32 *pu4_sigmaX, U32 *pu4_sigmaXSquared); 858*c83a76b0SSuyog Pawar 859*c83a76b0SSuyog Pawar void sigma_for_cusize_64_and_baseblock_size_64( 860*c83a76b0SSuyog Pawar U08 *pu1_data, S32 i4_data_stride, U32 *pu4_sigmaX, U32 *pu4_sigmaXSquared); 861*c83a76b0SSuyog Pawar 862*c83a76b0SSuyog Pawar void hme_choose_best_noise_preserver_amongst_fpel_and_subpel_winners( 863*c83a76b0SSuyog Pawar fullpel_refine_ctxt_t *ps_fullpel_winner_data, 864*c83a76b0SSuyog Pawar search_node_t **pps_part_results, 865*c83a76b0SSuyog Pawar layer_ctxt_t *ps_curr_layer, 866*c83a76b0SSuyog Pawar wgt_pred_ctxt_t *ps_wt_inp_prms, 867*c83a76b0SSuyog Pawar U32 *pu4_src_variance, 868*c83a76b0SSuyog Pawar S32 i4_cu_x_off_in_ctb, 869*c83a76b0SSuyog Pawar S32 i4_cu_y_off_in_ctb, 870*c83a76b0SSuyog Pawar S32 i4_ctb_x_off, 871*c83a76b0SSuyog Pawar S32 i4_ctb_y_off, 872*c83a76b0SSuyog Pawar S32 i4_inp_stride, 873*c83a76b0SSuyog Pawar S32 i4_alpha_stim_multiplier, 874*c83a76b0SSuyog Pawar U08 u1_subpel_uses_satd); 875*c83a76b0SSuyog Pawar 876*c83a76b0SSuyog Pawar #if TEMPORAL_NOISE_DETECT 877*c83a76b0SSuyog Pawar WORD32 ihevce_16x16block_temporal_noise_detect( 878*c83a76b0SSuyog Pawar WORD32 had_block_size, 879*c83a76b0SSuyog Pawar WORD32 ctb_width, 880*c83a76b0SSuyog Pawar WORD32 ctb_height, 881*c83a76b0SSuyog Pawar ihevce_ctb_noise_params *ps_ctb_noise_params, 882*c83a76b0SSuyog Pawar fpel_srch_cand_init_data_t *s_proj_srch_cand_init_data, 883*c83a76b0SSuyog Pawar hme_search_prms_t *s_search_prms_blk, 884*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_ctxt, 885*c83a76b0SSuyog Pawar WORD32 num_pred_dir, 886*c83a76b0SSuyog Pawar WORD32 i4_num_act_ref_l0, 887*c83a76b0SSuyog Pawar WORD32 i4_num_act_ref_l1, 888*c83a76b0SSuyog Pawar WORD32 i4_cu_x_off, 889*c83a76b0SSuyog Pawar WORD32 i4_cu_y_off, 890*c83a76b0SSuyog Pawar wgt_pred_ctxt_t *ps_wt_inp_prms, 891*c83a76b0SSuyog Pawar WORD32 input_stride, 892*c83a76b0SSuyog Pawar WORD32 index_8x8_block, 893*c83a76b0SSuyog Pawar WORD32 num_horz_blocks, 894*c83a76b0SSuyog Pawar WORD32 num_8x8_in_ctb_row, 895*c83a76b0SSuyog Pawar WORD32 i4_index_variance); 896*c83a76b0SSuyog Pawar #endif 897*c83a76b0SSuyog Pawar 898*c83a76b0SSuyog Pawar /** 899*c83a76b0SSuyog Pawar ******************************************************************************** 900*c83a76b0SSuyog Pawar * @fn hme_decide_part_types(search_results_t *ps_search_results) 901*c83a76b0SSuyog Pawar * 902*c83a76b0SSuyog Pawar * @brief Does uni/bi evaluation accross various partition types, 903*c83a76b0SSuyog Pawar * decides best inter partition types for the CU, compares 904*c83a76b0SSuyog Pawar * intra cost and decides the best K results for the CU 905*c83a76b0SSuyog Pawar * 906*c83a76b0SSuyog Pawar * This is called post subpel refinmenent for 16x16s, 8x8s and 907*c83a76b0SSuyog Pawar * for post merge evaluation for 32x32,64x64 CUs 908*c83a76b0SSuyog Pawar * 909*c83a76b0SSuyog Pawar * @param[in,out] ps_search_results : Search results data structure 910*c83a76b0SSuyog Pawar * - In : 2 lists of upto 2mvs & refids, active partition mask 911*c83a76b0SSuyog Pawar * - Out: Best results for final rdo evaluation of the cu 912*c83a76b0SSuyog Pawar * 913*c83a76b0SSuyog Pawar * @param[in] ps_subpel_prms : Sub pel params data structure 914*c83a76b0SSuyog Pawar 915*c83a76b0SSuyog Pawar * 916*c83a76b0SSuyog Pawar * @par Description 917*c83a76b0SSuyog Pawar * -------------------------------------------------------------------------------- 918*c83a76b0SSuyog Pawar * Flow: 919*c83a76b0SSuyog Pawar * for each category (SMP,AMP,2Nx2N based on part mask) 920*c83a76b0SSuyog Pawar * { 921*c83a76b0SSuyog Pawar * for each part_type 922*c83a76b0SSuyog Pawar * { 923*c83a76b0SSuyog Pawar * for each part 924*c83a76b0SSuyog Pawar * pick best candidate from each list 925*c83a76b0SSuyog Pawar * combine uni part type 926*c83a76b0SSuyog Pawar * update best results for part type 927*c83a76b0SSuyog Pawar * } 928*c83a76b0SSuyog Pawar * pick the best part type for given category (for SMP & AMP) 929*c83a76b0SSuyog Pawar * } 930*c83a76b0SSuyog Pawar * || 931*c83a76b0SSuyog Pawar * || 932*c83a76b0SSuyog Pawar * \/ 933*c83a76b0SSuyog Pawar * for upto 3 best part types 934*c83a76b0SSuyog Pawar * { 935*c83a76b0SSuyog Pawar * for each part 936*c83a76b0SSuyog Pawar * { 937*c83a76b0SSuyog Pawar * compute fixed size had for all uni and remember coeffs 938*c83a76b0SSuyog Pawar * compute bisatd 939*c83a76b0SSuyog Pawar * uni vs bi and gives upto two results 940*c83a76b0SSuyog Pawar * also gives the pt level pred buffer 941*c83a76b0SSuyog Pawar * } 942*c83a76b0SSuyog Pawar * } 943*c83a76b0SSuyog Pawar * || 944*c83a76b0SSuyog Pawar * || 945*c83a76b0SSuyog Pawar * \/ 946*c83a76b0SSuyog Pawar * select X candidates for tu recursion as per the Note below 947*c83a76b0SSuyog Pawar * tu_rec_on_part_type (reuse transform coeffs) 948*c83a76b0SSuyog Pawar * || 949*c83a76b0SSuyog Pawar * || 950*c83a76b0SSuyog Pawar * \/ 951*c83a76b0SSuyog Pawar * insert intra nodes at appropriate result id 952*c83a76b0SSuyog Pawar * || 953*c83a76b0SSuyog Pawar * || 954*c83a76b0SSuyog Pawar * \/ 955*c83a76b0SSuyog Pawar * populate y best resuls for rdo based on preset 956*c83a76b0SSuyog Pawar * 957*c83a76b0SSuyog Pawar * Note : 958*c83a76b0SSuyog Pawar * number of TU rec for P pics : 2 2nx2n + 1 smp + 1 amp for ms or 9 for hq 959*c83a76b0SSuyog Pawar * number of TU rec for B pics : 1 2nx2n + 1 smp + 1 amp for ms or 2 uni 2nx2n + 1 smp + 1 amp for ms or 9 for hq 960*c83a76b0SSuyog Pawar * -------------------------------------------------------------------------------- 961*c83a76b0SSuyog Pawar * 962*c83a76b0SSuyog Pawar * @return None 963*c83a76b0SSuyog Pawar ******************************************************************************** 964*c83a76b0SSuyog Pawar */ 965*c83a76b0SSuyog Pawar void hme_decide_part_types( 966*c83a76b0SSuyog Pawar inter_cu_results_t *ps_cu_results, 967*c83a76b0SSuyog Pawar inter_pu_results_t *ps_pu_results, 968*c83a76b0SSuyog Pawar inter_ctb_prms_t *ps_inter_ctb_prms, 969*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_ctxt, 970*c83a76b0SSuyog Pawar ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list, 971*c83a76b0SSuyog Pawar ihevce_me_optimised_function_list_t *ps_me_optimised_function_list); 972*c83a76b0SSuyog Pawar 973*c83a76b0SSuyog Pawar void hme_compute_pred_and_evaluate_bi( 974*c83a76b0SSuyog Pawar inter_cu_results_t *ps_cu_results, 975*c83a76b0SSuyog Pawar inter_pu_results_t *ps_pu_results, 976*c83a76b0SSuyog Pawar inter_ctb_prms_t *ps_inter_ctb_prms, 977*c83a76b0SSuyog Pawar part_type_results_t *ps_part_type_result, 978*c83a76b0SSuyog Pawar ULWORD64 *pu8_winning_pred_sigmaXSquare, 979*c83a76b0SSuyog Pawar ULWORD64 *pu8_winning_pred_sigmaX, 980*c83a76b0SSuyog Pawar ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list, 981*c83a76b0SSuyog Pawar ihevce_me_optimised_function_list_t *ps_me_optimised_function_list); 982*c83a76b0SSuyog Pawar 983*c83a76b0SSuyog Pawar /** 984*c83a76b0SSuyog Pawar ******************************************************************************** 985*c83a76b0SSuyog Pawar * @fn hme_insert_intra_nodes_post_bipred 986*c83a76b0SSuyog Pawar * 987*c83a76b0SSuyog Pawar * @brief Compares intra costs (populated by IPE) with the best inter costs 988*c83a76b0SSuyog Pawar * (populated after evaluating bi-pred) and updates the best results 989*c83a76b0SSuyog Pawar * if intra cost is better 990*c83a76b0SSuyog Pawar * 991*c83a76b0SSuyog Pawar * @param[in,out] ps_cu_results [inout] : Best results structure of CU 992*c83a76b0SSuyog Pawar * ps_cur_ipe_ctb [in] : intra results for the current CTB 993*c83a76b0SSuyog Pawar * i4_frm_qstep [in] : current frame quantizer(qscale)* 994*c83a76b0SSuyog Pawar * 995*c83a76b0SSuyog Pawar * @return None 996*c83a76b0SSuyog Pawar ******************************************************************************** 997*c83a76b0SSuyog Pawar */ 998*c83a76b0SSuyog Pawar void hme_insert_intra_nodes_post_bipred( 999*c83a76b0SSuyog Pawar inter_cu_results_t *ps_cu_results, 1000*c83a76b0SSuyog Pawar ipe_l0_ctb_analyse_for_me_t *ps_cur_ipe_ctb, 1001*c83a76b0SSuyog Pawar WORD32 i4_frm_qstep); 1002*c83a76b0SSuyog Pawar 1003*c83a76b0SSuyog Pawar void hme_set_mv_limit_using_dvsr_data( 1004*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_ctxt, 1005*c83a76b0SSuyog Pawar layer_ctxt_t *ps_curr_layer, 1006*c83a76b0SSuyog Pawar range_prms_t *ps_mv_limit, 1007*c83a76b0SSuyog Pawar S16 *pi2_prev_enc_frm_max_mv_y, 1008*c83a76b0SSuyog Pawar U08 u1_num_act_ref_pics); 1009*c83a76b0SSuyog Pawar 1010*c83a76b0SSuyog Pawar S32 hme_part_mask_populator( 1011*c83a76b0SSuyog Pawar U08 *pu1_inp, 1012*c83a76b0SSuyog Pawar S32 i4_inp_stride, 1013*c83a76b0SSuyog Pawar U08 u1_limit_active_partitions, 1014*c83a76b0SSuyog Pawar U08 u1_is_bPic, 1015*c83a76b0SSuyog Pawar U08 u1_is_refPic, 1016*c83a76b0SSuyog Pawar U08 u1_blk_8x8_mask, 1017*c83a76b0SSuyog Pawar ME_QUALITY_PRESETS_T e_me_quality_preset); 1018*c83a76b0SSuyog Pawar 1019*c83a76b0SSuyog Pawar #endif /* #ifndef _HME_UTILS_H_ */ 1020