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