xref: /aosp_15_r20/external/libhevc/encoder/hme_utils.h (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
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