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