• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  * Copyright (C) 2018 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************
18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 /*!
21 ******************************************************************************
22 * \file hme_err_compute.h
23 *
24 * \brief
25 *    contains prototypes for functions that compute error or best results or
26 *    return fxn ptrs for the same.
27 *
28 * \date
29 *    18/09/2012
30 *
31 * \author
32 *    Ittiam
33 *
34 ******************************************************************************
35 */
36 
37 #ifndef _HME_ERR_COMPUTE_H_
38 #define _HME_ERR_COMPUTE_H_
39 
40 /*****************************************************************************/
41 /* Constant Macros                                                           */
42 /*****************************************************************************/
43 #define NUM_4X4 16
44 #define NUM_4X4_IN_8x8 4
45 #define NUM_4X4_IN_16x16 16
46 #define NUM_8X8_IN_16x16 4
47 #define NUM_8X8_IN_32x32 16
48 #define NUM_8X8_IN_64x64 64
49 #define NUM_16X16_IN_64x64 16
50 #define NUM_ROWS_IN_4X4 4
51 #define NUM_PIXELS_IN_ROW 4
52 #define NUM_CANDIDATES_IN_GRID 9
53 
54 // 0 => best + good;
55 // 1 => 1st and 2nd best;
56 // good => worse or equal to second best
57 #define BESTEST 0
58 
59 #define COST(a, b, c, d, e) (a)
60 
61 /*****************************************************************************/
62 /* Functions                                                                 */
63 /*****************************************************************************/
64 void hme_evalsad_pt_npu_MxN_16bit(err_prms_t *ps_prms);
65 
66 #define compute_sad_16bit hme_evalsad_pt_npu_MxN_16bit
67 
68 /**
69 ********************************************************************************
70 *  @fn    S32 hme_update_results_grid_pu_bestn(result_upd_prms_t *ps_result_prms);
71 *
72 *  @brief  Updates the best N results based on a grid SAD for enabled partitions
73 *
74 *  @param[in,out]  ps_result_prms : contains parametrs pertaining to the results
75 *
76 *  @return None
77 ********************************************************************************
78 */
79 void hme_update_results_grid_pu_bestn(result_upd_prms_t *ps_result_prms);
80 
81 void hme_update_results_grid_pu_bestn_xtreme_speed(result_upd_prms_t *ps_result_prms);
82 
83 /**
84 ********************************************************************************
85 *  @fn     hme_update_results_grid_pu_bestn_no_encode(result_upd_prms_t *ps_result_prms)
86 *
87 *  @brief  Updates results for the case where 1 best result is to be updated
88 *          for a given pt, for several parts
89 *          Note : The function is replicated for CLIPing the cost to 16bit to make
90 *                  bit match with SIMD version
91 *
92 *  @param[in]  result_upd_prms_t : Contains the input parameters to this fxn
93 *
94 *  @return   The result_upd_prms_t structure is updated for all the active
95 *            parts in case the current candt has results for any given part
96 *             that is the best result for that part
97 ********************************************************************************
98 */
99 void hme_update_results_grid_pu_bestn_no_encode(result_upd_prms_t *ps_result_prms);
100 
101 /**
102 ********************************************************************************
103 *  @fn     hme_get_result_fxn(i4_grid_mask, i4_part_mask, i4_num_results)
104 *
105 *  @brief  Implements predictive search with square grid refinement. In this
106 *           case, the square grid is of step 1 always. since this is considered
107 *           to be more of a refinement search
108 *
109 *  @param[in]  i4_grid_mask : Mask containing which of 9 grid pts active
110 *
111 *  @param[in]  i4_part_mask : Mask containing which of the 17 parts active
112 *
113 *  @param[in]  i4_num_results: Number of active results
114 *
115 *  @return   Pointer to the appropriate result update function
116 *             (type PF_RESULT_FXN_T)
117 ********************************************************************************
118 */
119 PF_RESULT_FXN_T hme_get_result_fxn(S32 i4_grid_mask, S32 i4_part_mask, S32 i4_num_results);
120 
121 void compute_satd_16bit(err_prms_t *ps_prms);
122 
123 void compute_satd_8bit(err_prms_t *ps_prms);
124 
125 void compute_sad_16bit(err_prms_t *ps_prms);
126 
127 S32 compute_mv_cost(search_node_t *ps_search_node, pred_ctxt_t *ps_pred_ctxt, BLK_SIZE_T e_blk_size);
128 
129 void hme_init_pred_ctxt_no_encode(
130     pred_ctxt_t *ps_pred_ctxt,
131     search_results_t *ps_search_results,
132     search_node_t *ps_top_candts,
133     search_node_t *ps_left_candts,
134     search_node_t **pps_proj_coloc_candts,
135     search_node_t *ps_coloc_candts,
136     search_node_t *ps_zeromv_candt,
137     S32 pred_lx,
138     S32 lambda,
139     S32 lambda_q_shift,
140     U08 **ppu1_ref_bits_tlu,
141     S16 *pi2_ref_scf);
142 
143 void hme_init_pred_ctxt_encode(
144     pred_ctxt_t *ps_pred_ctxt,
145     search_results_t *ps_search_results,
146     search_node_t *ps_coloc_candts,
147     search_node_t *ps_zeromv_candt,
148     mv_grid_t *ps_mv_grid,
149     S32 pred_lx,
150     S32 lambda,
151     S32 lambda_q_shift,
152     U08 **ppu1_ref_bits_tlu,
153     S16 *pi2_ref_scf);
154 
155 /**
156 ********************************************************************************
157 *  @fn     compute_mv_cost_coarse(search_node_t *ps_node,
158 *                   pred_ctxt_t *ps_pred_ctxt,
159 *                   PART_ID_T e_part_id)
160 *
161 *  @brief  MV cost for coarse explicit search in coarsest layer
162 *
163 *  @param[in]  ps_node: search node having mv and ref id for which to eval cost
164 *
165 *  @param[in]  ps_pred_ctxt : mv pred context
166 *
167 *  @param[in]  e_part_id : Partition id.
168 *
169 *  @return   Cost value
170 
171 ********************************************************************************
172 */
173 S32 compute_mv_cost_coarse(
174     search_node_t *ps_node, pred_ctxt_t *ps_pred_ctxt, PART_ID_T e_part_id, S32 inp_mv_pel);
175 
176 /**
177 ********************************************************************************
178 *  @fn     compute_mv_cost_coarse(search_node_t *ps_node,
179 *                   pred_ctxt_t *ps_pred_ctxt,
180 *                   PART_ID_T e_part_id)
181 *
182 *  @brief  MV cost for coarse explicit search in coarsest layer
183 *
184 *  @param[in]  ps_node: search node having mv and ref id for which to eval cost
185 *
186 *  @param[in]  ps_pred_ctxt : mv pred context
187 *
188 *  @param[in]  e_part_id : Partition id.
189 *
190 *  @return   Cost value
191 
192 ********************************************************************************
193 */
194 S32 compute_mv_cost_coarse_high_speed(
195     search_node_t *ps_node, pred_ctxt_t *ps_pred_ctxt, PART_ID_T e_part_id, S32 inp_mv_pel);
196 
197 /**
198 ********************************************************************************
199 *  @fn     compute_mv_cost_coarse(search_node_t *ps_node,
200 *                   pred_ctxt_t *ps_pred_ctxt,
201 *                   PART_ID_T e_part_id)
202 *
203 *  @brief  MV cost for coarse explicit search in coarsest layer
204 *
205 *  @param[in]  ps_node: search node having mv and ref id for which to eval cost
206 *
207 *  @param[in]  ps_pred_ctxt : mv pred context
208 *
209 *  @param[in]  e_part_id : Partition id.
210 *
211 *  @return   Cost value
212 
213 ********************************************************************************
214 */
215 S32 compute_mv_cost_refine(
216     search_node_t *ps_node, pred_ctxt_t *ps_pred_ctxt, PART_ID_T e_part_id, S32 inp_mv_pel);
217 
218 /**
219 ********************************************************************************
220 *  @fn     compute_mv_cost_explicit(search_node_t *ps_node,
221 *                   pred_ctxt_t *ps_pred_ctxt,
222 *                   PART_ID_T e_part_id)
223 *
224 *  @brief  MV cost for explicit search in layers not encoded
225 *
226 *  @param[in]  ps_node: search node having mv and ref id for which to eval cost
227 *
228 *  @param[in]  ps_pred_ctxt : mv pred context
229 *
230 *  @param[in]  e_part_id : Partition id.
231 *
232 *  @return   Cost value
233 
234 ********************************************************************************
235 */
236 S32 compute_mv_cost_explicit(
237     search_node_t *ps_node, pred_ctxt_t *ps_pred_ctxt, PART_ID_T e_part_id, S32 inp_mv_pel);
238 
239 S32 compute_mv_cost_implicit(
240     search_node_t *ps_node, pred_ctxt_t *ps_pred_ctxt, PART_ID_T e_part_id, S32 inp_mv_pel);
241 
242 S32 compute_mv_cost_implicit_high_speed(
243     search_node_t *ps_node, pred_ctxt_t *ps_pred_ctxt, PART_ID_T e_part_id, S32 inp_mv_pel);
244 
245 S32 compute_mv_cost_implicit_high_speed_modified(
246     search_node_t *ps_node, pred_ctxt_t *ps_pred_ctxt, PART_ID_T e_part_id, S32 inp_mv_pel);
247 
248 void hme_evalsad_grid_pu_16x16(err_prms_t *ps_prms);
249 
250 void hme_evalsatd_pt_pu_8x8(err_prms_t *ps_prms);
251 
252 WORD32 hme_evalsatd_pt_pu_8x8_tu_rec(
253     err_prms_t *ps_prms,
254     WORD32 lambda,
255     WORD32 lambda_q_shift,
256     WORD32 i4_frm_qstep,
257     me_func_selector_t *ps_func_selector);
258 
259 void hme_evalsatd_update_1_best_result_pt_pu_16x16(
260     err_prms_t *ps_prms, result_upd_prms_t *ps_result_prms);
261 
262 WORD32 hme_evalsatd_pt_pu_32x32_tu_rec(
263     err_prms_t *ps_prms,
264     WORD32 lambda,
265     WORD32 lambda_q_shift,
266     WORD32 i4_frm_qstep,
267     me_func_selector_t *ps_func_selector);
268 
269 void hme_evalsatd_pt_pu_32x32(err_prms_t *ps_prms);
270 
271 void hme_evalsatd_pt_pu_64x64(err_prms_t *ps_prms);
272 
273 WORD32 hme_evalsatd_pt_pu_64x64_tu_rec(
274     err_prms_t *ps_prms,
275     WORD32 lambda,
276     WORD32 lambda_q_shift,
277     WORD32 i4_frm_qstep,
278     me_func_selector_t *ps_func_selector);
279 
280 WORD32 hme_evalsatd_pt_pu_16x16_tu_rec(
281     err_prms_t *ps_prms,
282     WORD32 lambda,
283     WORD32 lambda_q_shift,
284     WORD32 i4_frm_qstep,
285     me_func_selector_t *ps_func_selector);
286 
287 void ihevce_had_32x32_r(
288     UWORD8 *pu1_src,
289     WORD32 src_strd,
290     UWORD8 *pu1_pred,
291     WORD32 pred_strd,
292     WORD16 *pi2_dst,
293     WORD32 dst_strd,
294     WORD32 **ppi4_hsad,
295     WORD32 **ppi4_tu_split,
296     WORD32 **ppi4_tu_early_cbf,
297     WORD32 pos_x_y_4x4,
298     WORD32 num_4x4_in_row,
299     WORD32 lambda,
300     WORD32 lambda_q_shift,
301     WORD32 i4_frm_qstep,
302     WORD32 i4_cur_depth,
303     WORD32 i4_max_depth,
304     WORD32 i4_max_tr_size,
305     WORD32 *pi4_tu_split_cost,
306     me_func_selector_t *ps_func_selector);
307 
308 void hme_update_results_pt_pu_best1_subpel_hs(
309     err_prms_t *ps_err_prms, result_upd_prms_t *ps_result_prms);
310 
311 void hme_set_mvp_node(
312     search_results_t *ps_search_results,
313     search_node_t *ps_candt_prj_coloc,
314     U08 u1_pred_lx,
315     U08 u1_default_ref_id);
316 
317 S32 hme_cmp_nodes(search_node_t *ps_best_node1, search_node_t *ps_best_node2);
318 
319 #endif /* #ifndef _HME_SEARCH_ALGO_H_*/
320