xref: /aosp_15_r20/external/libhevc/encoder/hme_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 * \file hme_defs.h
23*c83a76b0SSuyog Pawar *
24*c83a76b0SSuyog Pawar * \brief
25*c83a76b0SSuyog Pawar *    Important definitions, enumerations, macros and structures used by ME
26*c83a76b0SSuyog Pawar *
27*c83a76b0SSuyog Pawar * \date
28*c83a76b0SSuyog Pawar *    18/09/2012
29*c83a76b0SSuyog Pawar *
30*c83a76b0SSuyog Pawar * \author
31*c83a76b0SSuyog Pawar *    Ittiam
32*c83a76b0SSuyog Pawar *
33*c83a76b0SSuyog Pawar ******************************************************************************
34*c83a76b0SSuyog Pawar */
35*c83a76b0SSuyog Pawar 
36*c83a76b0SSuyog Pawar #ifndef _HME_DEFS_H_
37*c83a76b0SSuyog Pawar #define _HME_DEFS_H_
38*c83a76b0SSuyog Pawar 
39*c83a76b0SSuyog Pawar /*****************************************************************************/
40*c83a76b0SSuyog Pawar /* Constant Macros                                                           */
41*c83a76b0SSuyog Pawar /*****************************************************************************/
42*c83a76b0SSuyog Pawar /**
43*c83a76b0SSuyog Pawar *******************************************************************************
44*c83a76b0SSuyog Pawar @brief Blk size of the CTB in the max possible case
45*c83a76b0SSuyog Pawar *******************************************************************************
46*c83a76b0SSuyog Pawar  */
47*c83a76b0SSuyog Pawar #define CTB_BLK_SIZE 64
48*c83a76b0SSuyog Pawar 
49*c83a76b0SSuyog Pawar /**
50*c83a76b0SSuyog Pawar *******************************************************************************
51*c83a76b0SSuyog Pawar @brief Maximun number of results per partition
52*c83a76b0SSuyog Pawar *******************************************************************************
53*c83a76b0SSuyog Pawar  */
54*c83a76b0SSuyog Pawar #define MAX_RESULTS_PER_PART 2
55*c83a76b0SSuyog Pawar 
56*c83a76b0SSuyog Pawar /**
57*c83a76b0SSuyog Pawar *******************************************************************************
58*c83a76b0SSuyog Pawar @brief Not used currently
59*c83a76b0SSuyog Pawar *******************************************************************************
60*c83a76b0SSuyog Pawar  */
61*c83a76b0SSuyog Pawar #define MAX_NUM_UNIFIED_RESULTS 10
62*c83a76b0SSuyog Pawar #define MAX_NUM_CTB_NODES 10
63*c83a76b0SSuyog Pawar 
64*c83a76b0SSuyog Pawar /**
65*c83a76b0SSuyog Pawar *******************************************************************************
66*c83a76b0SSuyog Pawar @brief For 64x64 CTB, we have 16x16 MV grid for prediction purposes (cost calc)
67*c83a76b0SSuyog Pawar This has 1 padding at boundaries for causal neighbours
68*c83a76b0SSuyog Pawar *******************************************************************************
69*c83a76b0SSuyog Pawar  */
70*c83a76b0SSuyog Pawar #define CTB_MV_GRID_PAD 1
71*c83a76b0SSuyog Pawar 
72*c83a76b0SSuyog Pawar /**
73*c83a76b0SSuyog Pawar *******************************************************************************
74*c83a76b0SSuyog Pawar @brief number of bits per bin
75*c83a76b0SSuyog Pawar *******************************************************************************
76*c83a76b0SSuyog Pawar  */
77*c83a76b0SSuyog Pawar #define HME_CABAC_BITS_PER_BIN 0.5
78*c83a76b0SSuyog Pawar 
79*c83a76b0SSuyog Pawar /**
80*c83a76b0SSuyog Pawar *******************************************************************************
81*c83a76b0SSuyog Pawar @brief bin count to bit count conversion
82*c83a76b0SSuyog Pawar *******************************************************************************
83*c83a76b0SSuyog Pawar  */
84*c83a76b0SSuyog Pawar #define HME_GET_CAB_BIT(x) (U08(((x)*HME_CABAC_BITS_PER_BIN + 0.5)))
85*c83a76b0SSuyog Pawar 
86*c83a76b0SSuyog Pawar /**
87*c83a76b0SSuyog Pawar *******************************************************************************
88*c83a76b0SSuyog Pawar @brief Columns in the MV grid
89*c83a76b0SSuyog Pawar *******************************************************************************
90*c83a76b0SSuyog Pawar  */
91*c83a76b0SSuyog Pawar #define NUM_COLUMNS_IN_CTB_GRID (((CTB_BLK_SIZE) >> 2) + (2 * CTB_MV_GRID_PAD))
92*c83a76b0SSuyog Pawar 
93*c83a76b0SSuyog Pawar /**
94*c83a76b0SSuyog Pawar *******************************************************************************
95*c83a76b0SSuyog Pawar @brief Rows in MV grid
96*c83a76b0SSuyog Pawar *******************************************************************************
97*c83a76b0SSuyog Pawar  */
98*c83a76b0SSuyog Pawar #define NUM_ROWS_IN_CTB_GRID (NUM_COLUMNS_IN_CTB_GRID)
99*c83a76b0SSuyog Pawar 
100*c83a76b0SSuyog Pawar /**
101*c83a76b0SSuyog Pawar *******************************************************************************
102*c83a76b0SSuyog Pawar @brief Total number of MVs held in CTB grid for prediction pourposes
103*c83a76b0SSuyog Pawar *******************************************************************************
104*c83a76b0SSuyog Pawar  */
105*c83a76b0SSuyog Pawar #define NUM_MVS_IN_CTB_GRID ((NUM_COLUMNS_IN_CTB_GRID) * (NUM_ROWS_IN_CTB_GRID))
106*c83a76b0SSuyog Pawar 
107*c83a76b0SSuyog Pawar /**
108*c83a76b0SSuyog Pawar *******************************************************************************
109*c83a76b0SSuyog Pawar @brief Max number of candidates used for refinement during CU merge stage
110*c83a76b0SSuyog Pawar *******************************************************************************
111*c83a76b0SSuyog Pawar  */
112*c83a76b0SSuyog Pawar #define MAX_MERGE_CANDTS 64
113*c83a76b0SSuyog Pawar 
114*c83a76b0SSuyog Pawar /**
115*c83a76b0SSuyog Pawar *******************************************************************************
116*c83a76b0SSuyog Pawar @brief For BIDIR refinement, we use 2I-P0 as input, done max at CTB level, so
117*c83a76b0SSuyog Pawar stride for this input is 64
118*c83a76b0SSuyog Pawar *******************************************************************************
119*c83a76b0SSuyog Pawar  */
120*c83a76b0SSuyog Pawar #define BACK_PREDICTION_INPUT_STRIDE 64
121*c83a76b0SSuyog Pawar 
122*c83a76b0SSuyog Pawar /**
123*c83a76b0SSuyog Pawar *******************************************************************************
124*c83a76b0SSuyog Pawar @brief We basically store an impossible and unique MV to identify intra blks
125*c83a76b0SSuyog Pawar or CUs
126*c83a76b0SSuyog Pawar *******************************************************************************
127*c83a76b0SSuyog Pawar  */
128*c83a76b0SSuyog Pawar #define INTRA_MV 0x4000
129*c83a76b0SSuyog Pawar 
130*c83a76b0SSuyog Pawar /**
131*c83a76b0SSuyog Pawar *******************************************************************************
132*c83a76b0SSuyog Pawar @brief Defines the largest CTB supported by HME
133*c83a76b0SSuyog Pawar *******************************************************************************
134*c83a76b0SSuyog Pawar  */
135*c83a76b0SSuyog Pawar #define HME_MAX_CTB_SIZE 64
136*c83a76b0SSuyog Pawar 
137*c83a76b0SSuyog Pawar /**
138*c83a76b0SSuyog Pawar *******************************************************************************
139*c83a76b0SSuyog Pawar @brief Maximum number of 16x16 blks possible in a CTB. The basic search unit
140*c83a76b0SSuyog Pawar in the encode layer is 16x16
141*c83a76b0SSuyog Pawar *******************************************************************************
142*c83a76b0SSuyog Pawar  */
143*c83a76b0SSuyog Pawar #define HME_MAX_16x16_IN_CTB ((HME_MAX_CTB_SIZE >> 4) * (HME_MAX_CTB_SIZE >> 4))
144*c83a76b0SSuyog Pawar 
145*c83a76b0SSuyog Pawar /**
146*c83a76b0SSuyog Pawar *******************************************************************************
147*c83a76b0SSuyog Pawar @brief Max number of 8x8s possible in a CTB, this in other words is also the
148*c83a76b0SSuyog Pawar maximum number of CUs possible in a CTB
149*c83a76b0SSuyog Pawar *******************************************************************************
150*c83a76b0SSuyog Pawar  */
151*c83a76b0SSuyog Pawar #define HME_MAX_8x8_IN_CTB ((HME_MAX_CTB_SIZE >> 3) * (HME_MAX_CTB_SIZE >> 3))
152*c83a76b0SSuyog Pawar 
153*c83a76b0SSuyog Pawar /**
154*c83a76b0SSuyog Pawar *******************************************************************************
155*c83a76b0SSuyog Pawar @brief Maximum number of init candts supported for refinement search.
156*c83a76b0SSuyog Pawar *******************************************************************************
157*c83a76b0SSuyog Pawar  */
158*c83a76b0SSuyog Pawar #define MAX_INIT_CANDTS 60
159*c83a76b0SSuyog Pawar 
160*c83a76b0SSuyog Pawar /**
161*c83a76b0SSuyog Pawar *******************************************************************************
162*c83a76b0SSuyog Pawar @brief Maximum MV in X and Y directions in fullpel units allowed in any layer
163*c83a76b0SSuyog Pawar Any computed range for MV hasto be within this
164*c83a76b0SSuyog Pawar *******************************************************************************
165*c83a76b0SSuyog Pawar  */
166*c83a76b0SSuyog Pawar #define MAX_MV_X_FINEST 1024
167*c83a76b0SSuyog Pawar #define MAX_MV_Y_FINEST 512
168*c83a76b0SSuyog Pawar 
169*c83a76b0SSuyog Pawar #define MAX_NUM_RESULTS 10
170*c83a76b0SSuyog Pawar 
171*c83a76b0SSuyog Pawar #define USE_MODIFIED 1
172*c83a76b0SSuyog Pawar 
173*c83a76b0SSuyog Pawar #define ENABLE_EXPLICIT_SEARCH_IN_P_IN_L0 1
174*c83a76b0SSuyog Pawar 
175*c83a76b0SSuyog Pawar #define ENABLE_EXPLICIT_SEARCH_IN_PQ 0
176*c83a76b0SSuyog Pawar 
177*c83a76b0SSuyog Pawar /**
178*c83a76b0SSuyog Pawar *******************************************************************************
179*c83a76b0SSuyog Pawar @brief Driven by reasoning that we can tolerate an error of 4 in global mv
180*c83a76b0SSuyog Pawar  in coarsest layer per comp, assuming we have search range of 1024x512, the mv
181*c83a76b0SSuyog Pawar  range in coarse layer is 128x64, total bins is then 256/4 x 128/4 or 2K bins
182*c83a76b0SSuyog Pawar *******************************************************************************
183*c83a76b0SSuyog Pawar  */
184*c83a76b0SSuyog Pawar #define LOG_MAX_NUM_BINS 11
185*c83a76b0SSuyog Pawar #define MAX_NUM_BINS (1 << LOG_MAX_NUM_BINS)
186*c83a76b0SSuyog Pawar 
187*c83a76b0SSuyog Pawar #define NEXT_BLOCK_OFFSET_IN_L0_ME 22
188*c83a76b0SSuyog Pawar 
189*c83a76b0SSuyog Pawar #define PREV_BLOCK_OFFSET_IN_L0_ME 6
190*c83a76b0SSuyog Pawar 
191*c83a76b0SSuyog Pawar #define COLOCATED_BLOCK_OFFSET 2
192*c83a76b0SSuyog Pawar 
193*c83a76b0SSuyog Pawar #define COLOCATED_4X4_NEXT_BLOCK_OFFSET 14
194*c83a76b0SSuyog Pawar 
195*c83a76b0SSuyog Pawar #define MAP_X_MAX 16
196*c83a76b0SSuyog Pawar 
197*c83a76b0SSuyog Pawar #define MAP_Y_MAX 16
198*c83a76b0SSuyog Pawar 
199*c83a76b0SSuyog Pawar #define NUM_POINTS_IN_RECTANGULAR_GRID 9
200*c83a76b0SSuyog Pawar 
201*c83a76b0SSuyog Pawar /*
202*c83a76b0SSuyog Pawar ******************************************************************************
203*c83a76b0SSuyog Pawar @brief Maximum number of elements in the sigmaX and sigmaX-Square array
204*c83a76b0SSuyog Pawar computed at 4x4 level for any CU size
205*c83a76b0SSuyog Pawar ******************************************************************************
206*c83a76b0SSuyog Pawar */
207*c83a76b0SSuyog Pawar #define MAX_NUM_SIGMAS_4x4 256
208*c83a76b0SSuyog Pawar 
209*c83a76b0SSuyog Pawar /*****************************************************************************/
210*c83a76b0SSuyog Pawar /* Function Macros                                                           */
211*c83a76b0SSuyog Pawar /*****************************************************************************/
212*c83a76b0SSuyog Pawar 
213*c83a76b0SSuyog Pawar /**
214*c83a76b0SSuyog Pawar *******************************************************************************
215*c83a76b0SSuyog Pawar @brief Calculates number of blks in picture, given width, ht, and a variable
216*c83a76b0SSuyog Pawar shift that controls basic blk size
217*c83a76b0SSuyog Pawar *******************************************************************************
218*c83a76b0SSuyog Pawar  */
219*c83a76b0SSuyog Pawar #define GET_NUM_BLKS_IN_PIC(wd, ht, shift, num_cols, num_blks)                                     \
220*c83a76b0SSuyog Pawar     {                                                                                              \
221*c83a76b0SSuyog Pawar         S32 y, rnd;                                                                                \
222*c83a76b0SSuyog Pawar         rnd = (1 << shift) - 1;                                                                    \
223*c83a76b0SSuyog Pawar         num_cols = (wd + rnd) >> shift;                                                            \
224*c83a76b0SSuyog Pawar         y = (ht + rnd) >> shift;                                                                   \
225*c83a76b0SSuyog Pawar         num_blks = num_cols * y;                                                                   \
226*c83a76b0SSuyog Pawar     }
227*c83a76b0SSuyog Pawar 
228*c83a76b0SSuyog Pawar #define COUNT_CANDS(a, b)                                                                          \
229*c83a76b0SSuyog Pawar     {                                                                                              \
230*c83a76b0SSuyog Pawar         b = (((a) & (1))) + (((a >> 1) & (1))) + (((a >> 2) & (1))) + (((a >> 3) & (1))) +         \
231*c83a76b0SSuyog Pawar             (((a >> 4) & (1))) + (((a >> 5) & (1))) + (((a >> 6) & (1))) + (((a >> 7) & (1))) +    \
232*c83a76b0SSuyog Pawar             (((a >> 8) & (1)));                                                                    \
233*c83a76b0SSuyog Pawar     }
234*c83a76b0SSuyog Pawar 
235*c83a76b0SSuyog Pawar #define COPY_MV_TO_SEARCH_NODE(node, mv, pref, refid, shift)                                       \
236*c83a76b0SSuyog Pawar     {                                                                                              \
237*c83a76b0SSuyog Pawar         (node)->s_mv.i2_mvx = (mv)->i2_mv_x;                                                       \
238*c83a76b0SSuyog Pawar         (node)->s_mv.i2_mvy = (mv)->i2_mv_y;                                                       \
239*c83a76b0SSuyog Pawar         (node)->i1_ref_idx = *pref;                                                                \
240*c83a76b0SSuyog Pawar         (node)->u1_is_avail = 1;                                                                   \
241*c83a76b0SSuyog Pawar                                                                                                    \
242*c83a76b0SSuyog Pawar         /* Can set the availability flag for MV Pred purposes */                                   \
243*c83a76b0SSuyog Pawar         if(((node)->i1_ref_idx < 0) || ((node)->s_mv.i2_mvx == INTRA_MV))                          \
244*c83a76b0SSuyog Pawar         {                                                                                          \
245*c83a76b0SSuyog Pawar             (node)->u1_is_avail = 0;                                                               \
246*c83a76b0SSuyog Pawar             (node)->i1_ref_idx = refid;                                                            \
247*c83a76b0SSuyog Pawar             (node)->s_mv.i2_mvx = 0;                                                               \
248*c83a76b0SSuyog Pawar             (node)->s_mv.i2_mvy = 0;                                                               \
249*c83a76b0SSuyog Pawar         }                                                                                          \
250*c83a76b0SSuyog Pawar         (node)->s_mv.i2_mvx >>= (shift);                                                           \
251*c83a76b0SSuyog Pawar         (node)->s_mv.i2_mvy >>= (shift);                                                           \
252*c83a76b0SSuyog Pawar         (node)->u1_subpel_done = (shift) ? 0 : 1;                                                  \
253*c83a76b0SSuyog Pawar     }
254*c83a76b0SSuyog Pawar 
255*c83a76b0SSuyog Pawar #define COMPUTE_MVD(ps_mv, ps_data, cumulative_mv_distance)                                        \
256*c83a76b0SSuyog Pawar     {                                                                                              \
257*c83a76b0SSuyog Pawar         S32 mvx_q8 = (ps_mv)->mvx << 8;                                                            \
258*c83a76b0SSuyog Pawar         S32 mvy_q8 = (ps_mv)->mvy << 8;                                                            \
259*c83a76b0SSuyog Pawar         S32 mvcx_q8 = (ps_data)->s_centroid.i4_pos_x_q8;                                           \
260*c83a76b0SSuyog Pawar         S32 mvcy_q8 = (ps_data)->s_centroid.i4_pos_y_q8;                                           \
261*c83a76b0SSuyog Pawar                                                                                                    \
262*c83a76b0SSuyog Pawar         S32 mvdx_q8 = mvx_q8 - mvcx_q8;                                                            \
263*c83a76b0SSuyog Pawar         S32 mvdy_q8 = mvy_q8 - mvcy_q8;                                                            \
264*c83a76b0SSuyog Pawar                                                                                                    \
265*c83a76b0SSuyog Pawar         S32 mvdx = (mvdx_q8 + (1 << 7)) >> 8;                                                      \
266*c83a76b0SSuyog Pawar         S32 mvdy = (mvdy_q8 + (1 << 7)) >> 8;                                                      \
267*c83a76b0SSuyog Pawar                                                                                                    \
268*c83a76b0SSuyog Pawar         S32 mvd = ABS(mvdx) + ABS(mvdy);                                                           \
269*c83a76b0SSuyog Pawar                                                                                                    \
270*c83a76b0SSuyog Pawar         cumulative_mv_distance += mvd;                                                             \
271*c83a76b0SSuyog Pawar     }
272*c83a76b0SSuyog Pawar 
273*c83a76b0SSuyog Pawar #define STATS_COLLECTOR_MV_INSERT(                                                                 \
274*c83a76b0SSuyog Pawar     ps_mv_store, num_mvs_stored, mvx_cur, mvy_cur, stats_struct, check_for_duplicate, ref_idx)     \
275*c83a76b0SSuyog Pawar     {                                                                                              \
276*c83a76b0SSuyog Pawar         S32 i4_j;                                                                                  \
277*c83a76b0SSuyog Pawar         (stats_struct).f_num_cands_being_processed++;                                              \
278*c83a76b0SSuyog Pawar         check_for_duplicate = 0;                                                                   \
279*c83a76b0SSuyog Pawar                                                                                                    \
280*c83a76b0SSuyog Pawar         for(i4_j = 0; i4_j < (num_mvs_stored); i4_j++)                                             \
281*c83a76b0SSuyog Pawar         {                                                                                          \
282*c83a76b0SSuyog Pawar             if(((ps_mv_store)[i4_j].s_mv.i2_mvx == (mvx_cur)) &&                                   \
283*c83a76b0SSuyog Pawar                ((ps_mv_store)[i4_j].s_mv.i2_mvy == (mvy_cur)) &&                                   \
284*c83a76b0SSuyog Pawar                ((ps_mv_store)[i4_j].i1_ref_idx == ref_idx))                                        \
285*c83a76b0SSuyog Pawar             {                                                                                      \
286*c83a76b0SSuyog Pawar                 (stats_struct).f_num_duplicates_amongst_processed++;                               \
287*c83a76b0SSuyog Pawar                 check_for_duplicate = 0;                                                           \
288*c83a76b0SSuyog Pawar                 break;                                                                             \
289*c83a76b0SSuyog Pawar             }                                                                                      \
290*c83a76b0SSuyog Pawar         }                                                                                          \
291*c83a76b0SSuyog Pawar                                                                                                    \
292*c83a76b0SSuyog Pawar         if(i4_j == (num_mvs_stored))                                                               \
293*c83a76b0SSuyog Pawar         {                                                                                          \
294*c83a76b0SSuyog Pawar             (ps_mv_store)[i4_j].s_mv.i2_mvx = (mvx_cur);                                           \
295*c83a76b0SSuyog Pawar             (ps_mv_store)[i4_j].s_mv.i2_mvy = (mvy_cur);                                           \
296*c83a76b0SSuyog Pawar             (ps_mv_store)[i4_j].i1_ref_idx = ref_idx;                                              \
297*c83a76b0SSuyog Pawar             (num_mvs_stored)++;                                                                    \
298*c83a76b0SSuyog Pawar         }                                                                                          \
299*c83a76b0SSuyog Pawar     }
300*c83a76b0SSuyog Pawar 
301*c83a76b0SSuyog Pawar #define UPDATE_CLUSTER_METADATA_POST_MERGE(ps_cluster)                                             \
302*c83a76b0SSuyog Pawar     {                                                                                              \
303*c83a76b0SSuyog Pawar         S32 m;                                                                                     \
304*c83a76b0SSuyog Pawar                                                                                                    \
305*c83a76b0SSuyog Pawar         S32 num_clusters_evaluated = 0;                                                            \
306*c83a76b0SSuyog Pawar                                                                                                    \
307*c83a76b0SSuyog Pawar         for(m = 0; num_clusters_evaluated < (ps_cluster)->num_clusters; m++)                       \
308*c83a76b0SSuyog Pawar         {                                                                                          \
309*c83a76b0SSuyog Pawar             if(!((ps_cluster)->as_cluster_data[m].is_valid_cluster))                               \
310*c83a76b0SSuyog Pawar             {                                                                                      \
311*c83a76b0SSuyog Pawar                 if(-1 != (ps_cluster)->as_cluster_data[m].ref_id)                                  \
312*c83a76b0SSuyog Pawar                 {                                                                                  \
313*c83a76b0SSuyog Pawar                     (ps_cluster)->au1_num_clusters[(ps_cluster)->as_cluster_data[m].ref_id]--;     \
314*c83a76b0SSuyog Pawar                 }                                                                                  \
315*c83a76b0SSuyog Pawar             }                                                                                      \
316*c83a76b0SSuyog Pawar             else                                                                                   \
317*c83a76b0SSuyog Pawar             {                                                                                      \
318*c83a76b0SSuyog Pawar                 num_clusters_evaluated++;                                                          \
319*c83a76b0SSuyog Pawar             }                                                                                      \
320*c83a76b0SSuyog Pawar         }                                                                                          \
321*c83a76b0SSuyog Pawar     }
322*c83a76b0SSuyog Pawar 
323*c83a76b0SSuyog Pawar #define SET_VALUES_FOR_TOP_REF_IDS(ps_cluster_blk, best_uni_ref, best_alt_ref, num_ref)            \
324*c83a76b0SSuyog Pawar     {                                                                                              \
325*c83a76b0SSuyog Pawar         ps_cluster_blk->best_uni_ref = best_uni_ref;                                               \
326*c83a76b0SSuyog Pawar         ps_cluster_blk->best_alt_ref = best_alt_ref;                                               \
327*c83a76b0SSuyog Pawar         ps_cluster_blk->num_refs = num_ref;                                                        \
328*c83a76b0SSuyog Pawar     }
329*c83a76b0SSuyog Pawar 
330*c83a76b0SSuyog Pawar #define MAP_X_MAX 16
331*c83a76b0SSuyog Pawar #define MAP_Y_MAX 16
332*c83a76b0SSuyog Pawar 
333*c83a76b0SSuyog Pawar #define CHECK_FOR_DUPES_AND_INSERT_UNIQUE_NODES(                                                   \
334*c83a76b0SSuyog Pawar     ps_dedup_enabler, num_cands, mvx, mvy, check_for_duplicate)                                    \
335*c83a76b0SSuyog Pawar     {                                                                                              \
336*c83a76b0SSuyog Pawar         S32 center_mvx;                                                                            \
337*c83a76b0SSuyog Pawar         S32 center_mvy;                                                                            \
338*c83a76b0SSuyog Pawar         S32 mvdx;                                                                                  \
339*c83a76b0SSuyog Pawar         S32 mvdy;                                                                                  \
340*c83a76b0SSuyog Pawar         U32 *pu4_node_map;                                                                         \
341*c83a76b0SSuyog Pawar         S32 columnar_presence;                                                                     \
342*c83a76b0SSuyog Pawar                                                                                                    \
343*c83a76b0SSuyog Pawar         (check_for_duplicate) = 0;                                                                 \
344*c83a76b0SSuyog Pawar         {                                                                                          \
345*c83a76b0SSuyog Pawar             subpel_dedup_enabler_t *ps_dedup = &(ps_dedup_enabler)[0];                             \
346*c83a76b0SSuyog Pawar             center_mvx = ps_dedup->i2_mv_x;                                                        \
347*c83a76b0SSuyog Pawar             center_mvy = ps_dedup->i2_mv_y;                                                        \
348*c83a76b0SSuyog Pawar             pu4_node_map = ps_dedup->au4_node_map;                                                 \
349*c83a76b0SSuyog Pawar                                                                                                    \
350*c83a76b0SSuyog Pawar             mvdx = (mvx)-center_mvx;                                                               \
351*c83a76b0SSuyog Pawar             mvdy = (mvy)-center_mvy;                                                               \
352*c83a76b0SSuyog Pawar                                                                                                    \
353*c83a76b0SSuyog Pawar             if(((mvdx < MAP_X_MAX) && (mvdx >= -MAP_X_MAX)) &&                                     \
354*c83a76b0SSuyog Pawar                ((mvdy < MAP_Y_MAX) && (mvdy >= -MAP_Y_MAX)))                                       \
355*c83a76b0SSuyog Pawar             {                                                                                      \
356*c83a76b0SSuyog Pawar                 columnar_presence = pu4_node_map[MAP_X_MAX + mvdx];                                \
357*c83a76b0SSuyog Pawar                                                                                                    \
358*c83a76b0SSuyog Pawar                 if(0 == (columnar_presence & (1U << (MAP_Y_MAX + mvdy))))                          \
359*c83a76b0SSuyog Pawar                 {                                                                                  \
360*c83a76b0SSuyog Pawar                     columnar_presence |= (1U << (MAP_Y_MAX + mvdy));                               \
361*c83a76b0SSuyog Pawar                     pu4_node_map[MAP_X_MAX + mvdx] = columnar_presence;                            \
362*c83a76b0SSuyog Pawar                 }                                                                                  \
363*c83a76b0SSuyog Pawar                 else                                                                               \
364*c83a76b0SSuyog Pawar                 {                                                                                  \
365*c83a76b0SSuyog Pawar                     (check_for_duplicate) = 1;                                                     \
366*c83a76b0SSuyog Pawar                 }                                                                                  \
367*c83a76b0SSuyog Pawar             }                                                                                      \
368*c83a76b0SSuyog Pawar         }                                                                                          \
369*c83a76b0SSuyog Pawar     }
370*c83a76b0SSuyog Pawar 
371*c83a76b0SSuyog Pawar #define BUMP_OUTLIER_CLUSTERS(ps_cluster_blk, sdi_threshold)                                       \
372*c83a76b0SSuyog Pawar     {                                                                                              \
373*c83a76b0SSuyog Pawar         outlier_data_t as_outliers[MAX_NUM_CLUSTERS_64x64 + 1];                                    \
374*c83a76b0SSuyog Pawar                                                                                                    \
375*c83a76b0SSuyog Pawar         S32 j, k;                                                                                  \
376*c83a76b0SSuyog Pawar                                                                                                    \
377*c83a76b0SSuyog Pawar         S32 num_clusters_evaluated = 0;                                                            \
378*c83a76b0SSuyog Pawar         S32 num_clusters = ps_cluster_blk->num_clusters;                                           \
379*c83a76b0SSuyog Pawar         S32 num_outliers_present = 0;                                                              \
380*c83a76b0SSuyog Pawar                                                                                                    \
381*c83a76b0SSuyog Pawar         for(j = 0; num_clusters_evaluated < num_clusters; j++)                                     \
382*c83a76b0SSuyog Pawar         {                                                                                          \
383*c83a76b0SSuyog Pawar             cluster_data_t *ps_data = &ps_cluster_blk->as_cluster_data[j];                         \
384*c83a76b0SSuyog Pawar                                                                                                    \
385*c83a76b0SSuyog Pawar             if(!ps_data->is_valid_cluster)                                                         \
386*c83a76b0SSuyog Pawar             {                                                                                      \
387*c83a76b0SSuyog Pawar                 continue;                                                                          \
388*c83a76b0SSuyog Pawar             }                                                                                      \
389*c83a76b0SSuyog Pawar                                                                                                    \
390*c83a76b0SSuyog Pawar             num_clusters_evaluated++;                                                              \
391*c83a76b0SSuyog Pawar                                                                                                    \
392*c83a76b0SSuyog Pawar             if((ps_data->num_mvs == 1) && (ps_data->as_mv[0].sdi < sdi_threshold) &&               \
393*c83a76b0SSuyog Pawar                (ps_cluster_blk->au1_num_clusters[ps_data->ref_id] >                                \
394*c83a76b0SSuyog Pawar                 MAX_NUM_CLUSTERS_IN_ONE_REF_IDX))                                                  \
395*c83a76b0SSuyog Pawar             {                                                                                      \
396*c83a76b0SSuyog Pawar                 as_outliers[num_outliers_present].cluster_id = j;                                  \
397*c83a76b0SSuyog Pawar                 as_outliers[num_outliers_present].ref_idx = ps_data->ref_id;                       \
398*c83a76b0SSuyog Pawar                 as_outliers[num_outliers_present].sdi = ps_data->as_mv[0].sdi;                     \
399*c83a76b0SSuyog Pawar                 num_outliers_present++;                                                            \
400*c83a76b0SSuyog Pawar             }                                                                                      \
401*c83a76b0SSuyog Pawar         }                                                                                          \
402*c83a76b0SSuyog Pawar                                                                                                    \
403*c83a76b0SSuyog Pawar         for(j = 0; j < (num_outliers_present - 1); j++)                                            \
404*c83a76b0SSuyog Pawar         {                                                                                          \
405*c83a76b0SSuyog Pawar             for(k = (j + 1); k < num_outliers_present; k++)                                        \
406*c83a76b0SSuyog Pawar             {                                                                                      \
407*c83a76b0SSuyog Pawar                 if(as_outliers[j].sdi > as_outliers[k].sdi)                                        \
408*c83a76b0SSuyog Pawar                 {                                                                                  \
409*c83a76b0SSuyog Pawar                     as_outliers[MAX_NUM_CLUSTERS_64x64] = as_outliers[j];                          \
410*c83a76b0SSuyog Pawar                     as_outliers[j] = as_outliers[k];                                               \
411*c83a76b0SSuyog Pawar                     as_outliers[k] = as_outliers[MAX_NUM_CLUSTERS_64x64];                          \
412*c83a76b0SSuyog Pawar                 }                                                                                  \
413*c83a76b0SSuyog Pawar             }                                                                                      \
414*c83a76b0SSuyog Pawar         }                                                                                          \
415*c83a76b0SSuyog Pawar                                                                                                    \
416*c83a76b0SSuyog Pawar         for(j = 0; j < (num_outliers_present); j++)                                                \
417*c83a76b0SSuyog Pawar         {                                                                                          \
418*c83a76b0SSuyog Pawar             S32 ref_idx = as_outliers[j].ref_idx;                                                  \
419*c83a76b0SSuyog Pawar                                                                                                    \
420*c83a76b0SSuyog Pawar             if((ps_cluster_blk->au1_num_clusters[ref_idx] > MAX_NUM_CLUSTERS_IN_ONE_REF_IDX))      \
421*c83a76b0SSuyog Pawar             {                                                                                      \
422*c83a76b0SSuyog Pawar                 ps_cluster_blk->as_cluster_data[as_outliers[j].cluster_id].is_valid_cluster = 0;   \
423*c83a76b0SSuyog Pawar                 ps_cluster_blk->num_clusters--;                                                    \
424*c83a76b0SSuyog Pawar                 ps_cluster_blk->au1_num_clusters[ref_idx]--;                                       \
425*c83a76b0SSuyog Pawar             }                                                                                      \
426*c83a76b0SSuyog Pawar         }                                                                                          \
427*c83a76b0SSuyog Pawar     }
428*c83a76b0SSuyog Pawar 
429*c83a76b0SSuyog Pawar #define ADD_CLUSTER_CENTROID_AS_CANDS_FOR_BLK_MERGE(                                               \
430*c83a76b0SSuyog Pawar     ps_cluster_data, ps_range_prms, ps_list, ps_mv, is_ref_in_l0, ref_idx)                         \
431*c83a76b0SSuyog Pawar     {                                                                                              \
432*c83a76b0SSuyog Pawar         ps_list = &(ps_cluster_data)->as_mv_list[!(is_ref_in_l0)][(ref_idx)];                      \
433*c83a76b0SSuyog Pawar         ps_mv = &ps_list->as_mv[ps_list->num_mvs];                                                 \
434*c83a76b0SSuyog Pawar                                                                                                    \
435*c83a76b0SSuyog Pawar         ps_mv->i2_mvx = (ps_centroid->i4_pos_x_q8 + (1 << 7)) >> 8;                                \
436*c83a76b0SSuyog Pawar         ps_mv->i2_mvy = (ps_centroid->i4_pos_y_q8 + (1 << 7)) >> 8;                                \
437*c83a76b0SSuyog Pawar                                                                                                    \
438*c83a76b0SSuyog Pawar         CLIP_MV_WITHIN_RANGE(ps_mv->i2_mvx, ps_mv->i2_mvy, (ps_range_prms), 0, 0, 0);              \
439*c83a76b0SSuyog Pawar                                                                                                    \
440*c83a76b0SSuyog Pawar         ps_cluster_data->ai4_ref_id_valid[!(is_ref_in_l0)][(ref_idx)] = 1;                         \
441*c83a76b0SSuyog Pawar                                                                                                    \
442*c83a76b0SSuyog Pawar         ps_list->num_mvs++;                                                                        \
443*c83a76b0SSuyog Pawar     }
444*c83a76b0SSuyog Pawar 
445*c83a76b0SSuyog Pawar #define COPY_SEARCH_CANDIDATE_DATA(node, mv, pref, refid, shift)                                   \
446*c83a76b0SSuyog Pawar     {                                                                                              \
447*c83a76b0SSuyog Pawar         (node)->ps_mv->i2_mvx = (mv)->i2_mv_x;                                                     \
448*c83a76b0SSuyog Pawar         (node)->ps_mv->i2_mvy = (mv)->i2_mv_y;                                                     \
449*c83a76b0SSuyog Pawar         (node)->i1_ref_idx = *pref;                                                                \
450*c83a76b0SSuyog Pawar         (node)->u1_is_avail = 1;                                                                   \
451*c83a76b0SSuyog Pawar                                                                                                    \
452*c83a76b0SSuyog Pawar         /* Can set the availability flag for MV Pred purposes */                                   \
453*c83a76b0SSuyog Pawar         if(((node)->i1_ref_idx < 0) || ((node)->ps_mv->i2_mvx == INTRA_MV))                        \
454*c83a76b0SSuyog Pawar         {                                                                                          \
455*c83a76b0SSuyog Pawar             (node)->u1_is_avail = 0;                                                               \
456*c83a76b0SSuyog Pawar             (node)->i1_ref_idx = refid;                                                            \
457*c83a76b0SSuyog Pawar             (node)->ps_mv->i2_mvx = 0;                                                             \
458*c83a76b0SSuyog Pawar             (node)->ps_mv->i2_mvy = 0;                                                             \
459*c83a76b0SSuyog Pawar         }                                                                                          \
460*c83a76b0SSuyog Pawar         (node)->ps_mv->i2_mvx >>= (shift);                                                         \
461*c83a76b0SSuyog Pawar         (node)->ps_mv->i2_mvy >>= (shift);                                                         \
462*c83a76b0SSuyog Pawar         (node)->u1_subpel_done = (shift) ? 0 : 1;                                                  \
463*c83a76b0SSuyog Pawar     }
464*c83a76b0SSuyog Pawar /**
465*c83a76b0SSuyog Pawar *******************************************************************************
466*c83a76b0SSuyog Pawar * @macro MIN_NODE
467*c83a76b0SSuyog Pawar * @brief Returns the search node with lesser cost
468*c83a76b0SSuyog Pawar *******************************************************************************
469*c83a76b0SSuyog Pawar  */
470*c83a76b0SSuyog Pawar #define MIN_NODE(a, b) (((a)->i4_tot_cost < (b)->i4_tot_cost) ? (a) : (b))
471*c83a76b0SSuyog Pawar 
472*c83a76b0SSuyog Pawar /**
473*c83a76b0SSuyog Pawar *******************************************************************************
474*c83a76b0SSuyog Pawar * @macro MAX_NODE
475*c83a76b0SSuyog Pawar * @brief Returns search node with higher cost
476*c83a76b0SSuyog Pawar *******************************************************************************
477*c83a76b0SSuyog Pawar  */
478*c83a76b0SSuyog Pawar #define MAX_NODE(a, b) (((a)->i4_tot_cost >= (b)->i4_tot_cost) ? (a) : (b))
479*c83a76b0SSuyog Pawar 
480*c83a76b0SSuyog Pawar /**
481*c83a76b0SSuyog Pawar ******************************************************************************
482*c83a76b0SSuyog Pawar  *  @macro  HME_INV_WT_PRED
483*c83a76b0SSuyog Pawar  *  @brief Implements inverse of wt pred formula. Actual wt pred formula is
484*c83a76b0SSuyog Pawar  *  ((input * wt) + rnd) >> shift) + offset
485*c83a76b0SSuyog Pawar ******************************************************************************
486*c83a76b0SSuyog Pawar */
487*c83a76b0SSuyog Pawar #define HME_INV_WT_PRED(inp, wt, off, shift) (((((inp) - (off)) << (shift)) + ((wt) >> 1)) / (wt))
488*c83a76b0SSuyog Pawar #define HME_INV_WT_PRED1(inp, wt, off, shift)                                                      \
489*c83a76b0SSuyog Pawar     (((((inp) - (off)) << (shift)) * wt + (1 << 14)) >> 15)
490*c83a76b0SSuyog Pawar 
491*c83a76b0SSuyog Pawar /**
492*c83a76b0SSuyog Pawar ******************************************************************************
493*c83a76b0SSuyog Pawar  *  @macro  HME_WT_PRED
494*c83a76b0SSuyog Pawar  *  @brief Implements wt pred formula as per spec
495*c83a76b0SSuyog Pawar ******************************************************************************
496*c83a76b0SSuyog Pawar */
497*c83a76b0SSuyog Pawar #define HME_WT_PRED(p0, p1, w0, w1, rnd, shift)                                                    \
498*c83a76b0SSuyog Pawar     (((((S32)w0) * ((S32)p0) + ((S32)w1) * ((S32)p1)) >> shift) + rnd)
499*c83a76b0SSuyog Pawar 
500*c83a76b0SSuyog Pawar /**
501*c83a76b0SSuyog Pawar ******************************************************************************
502*c83a76b0SSuyog Pawar  *  @macro PREFETCH_BLK
503*c83a76b0SSuyog Pawar  *  @brief Prefetches a block of data into cahce before hand
504*c83a76b0SSuyog Pawar ******************************************************************************
505*c83a76b0SSuyog Pawar */
506*c83a76b0SSuyog Pawar 
507*c83a76b0SSuyog Pawar /**
508*c83a76b0SSuyog Pawar ******************************************************************************
509*c83a76b0SSuyog Pawar  *  @macro INSERT_NEW_NODE
510*c83a76b0SSuyog Pawar  *  @brief Inserts a new search node in a list if it is unique; helps in
511*c83a76b0SSuyog Pawar            removing duplicate nodes/candidates
512*c83a76b0SSuyog Pawar ******************************************************************************
513*c83a76b0SSuyog Pawar */
514*c83a76b0SSuyog Pawar #define PREFETCH_BLK(pu1_src, src_stride, lines, type)                                             \
515*c83a76b0SSuyog Pawar     {                                                                                              \
516*c83a76b0SSuyog Pawar         WORD32 ctr;                                                                                \
517*c83a76b0SSuyog Pawar         for(ctr = 0; ctr < lines; ctr++)                                                           \
518*c83a76b0SSuyog Pawar         {                                                                                          \
519*c83a76b0SSuyog Pawar             PREFETCH((char const *)pu1_src, type);                                                 \
520*c83a76b0SSuyog Pawar             pu1_src += src_stride;                                                                 \
521*c83a76b0SSuyog Pawar         }                                                                                          \
522*c83a76b0SSuyog Pawar     }
523*c83a76b0SSuyog Pawar 
524*c83a76b0SSuyog Pawar #define INSERT_UNIQUE_NODE(                                                                        \
525*c83a76b0SSuyog Pawar     as_nodes, num_nodes, new_node, au4_map, center_x, center_y, use_hashing)                       \
526*c83a76b0SSuyog Pawar     {                                                                                              \
527*c83a76b0SSuyog Pawar         WORD32 k;                                                                                  \
528*c83a76b0SSuyog Pawar         UWORD32 map;                                                                               \
529*c83a76b0SSuyog Pawar         WORD32 delta_x, delta_y;                                                                   \
530*c83a76b0SSuyog Pawar         delta_x = (new_node).ps_mv->i2_mvx - (center_x);                                           \
531*c83a76b0SSuyog Pawar         delta_y = (new_node).ps_mv->i2_mvy - (center_y);                                           \
532*c83a76b0SSuyog Pawar         map = 0;                                                                                   \
533*c83a76b0SSuyog Pawar                                                                                                    \
534*c83a76b0SSuyog Pawar         if((use_hashing) && (delta_x < MAP_X_MAX) && (delta_x >= (-MAP_X_MAX)) &&                  \
535*c83a76b0SSuyog Pawar            (delta_y < MAP_Y_MAX) && (delta_y >= (-MAP_Y_MAX)))                                     \
536*c83a76b0SSuyog Pawar         {                                                                                          \
537*c83a76b0SSuyog Pawar             map = (au4_map)[delta_x + MAP_X_MAX];                                                  \
538*c83a76b0SSuyog Pawar             if(0 == (map & (1U << (delta_y + MAP_Y_MAX))))                                         \
539*c83a76b0SSuyog Pawar             {                                                                                      \
540*c83a76b0SSuyog Pawar                 (new_node).s_mv = (new_node).ps_mv[0];                                             \
541*c83a76b0SSuyog Pawar                 (as_nodes)[(num_nodes)] = (new_node);                                              \
542*c83a76b0SSuyog Pawar                 ((num_nodes))++;                                                                   \
543*c83a76b0SSuyog Pawar                 map |= 1U << (delta_y + MAP_Y_MAX);                                                \
544*c83a76b0SSuyog Pawar                 (au4_map)[delta_x + MAP_X_MAX] = map;                                              \
545*c83a76b0SSuyog Pawar             }                                                                                      \
546*c83a76b0SSuyog Pawar         }                                                                                          \
547*c83a76b0SSuyog Pawar         else                                                                                       \
548*c83a76b0SSuyog Pawar         {                                                                                          \
549*c83a76b0SSuyog Pawar             for(k = 0; k < ((num_nodes)); k++)                                                     \
550*c83a76b0SSuyog Pawar             {                                                                                      \
551*c83a76b0SSuyog Pawar                 /* Search is this node is already present in unique list */                        \
552*c83a76b0SSuyog Pawar                 if(((as_nodes)[k].s_mv.i2_mvx == (new_node).ps_mv->i2_mvx) &&                      \
553*c83a76b0SSuyog Pawar                    ((as_nodes)[k].s_mv.i2_mvy == (new_node).ps_mv->i2_mvy) &&                      \
554*c83a76b0SSuyog Pawar                    ((as_nodes)[k].i1_ref_idx == (new_node).i1_ref_idx))                            \
555*c83a76b0SSuyog Pawar                 {                                                                                  \
556*c83a76b0SSuyog Pawar                     /* This is duplicate node; need not be inserted */                             \
557*c83a76b0SSuyog Pawar                     break;                                                                         \
558*c83a76b0SSuyog Pawar                 }                                                                                  \
559*c83a76b0SSuyog Pawar             }                                                                                      \
560*c83a76b0SSuyog Pawar             if(k == ((num_nodes)))                                                                 \
561*c83a76b0SSuyog Pawar             {                                                                                      \
562*c83a76b0SSuyog Pawar                 /* Insert new node only if it is not duplicate node */                             \
563*c83a76b0SSuyog Pawar                 (new_node).s_mv = (new_node).ps_mv[0];                                             \
564*c83a76b0SSuyog Pawar                 (as_nodes)[k] = (new_node);                                                        \
565*c83a76b0SSuyog Pawar                 ((num_nodes))++;                                                                   \
566*c83a76b0SSuyog Pawar             }                                                                                      \
567*c83a76b0SSuyog Pawar         }                                                                                          \
568*c83a76b0SSuyog Pawar     }
569*c83a76b0SSuyog Pawar 
570*c83a76b0SSuyog Pawar /**
571*c83a76b0SSuyog Pawar ******************************************************************************
572*c83a76b0SSuyog Pawar  *  @macro INSERT_NEW_NODE
573*c83a76b0SSuyog Pawar  *  @brief Inserts a new search node in a list if it is unique; helps in
574*c83a76b0SSuyog Pawar            removing duplicate nodes/candidates
575*c83a76b0SSuyog Pawar ******************************************************************************
576*c83a76b0SSuyog Pawar */
577*c83a76b0SSuyog Pawar #define INSERT_NEW_NODE_NOMAP(as_nodes, num_nodes, new_node, implicit_layer)                       \
578*c83a76b0SSuyog Pawar     {                                                                                              \
579*c83a76b0SSuyog Pawar         WORD32 k;                                                                                  \
580*c83a76b0SSuyog Pawar         if(!implicit_layer)                                                                        \
581*c83a76b0SSuyog Pawar         {                                                                                          \
582*c83a76b0SSuyog Pawar             for(k = 0; k < (num_nodes); k++)                                                       \
583*c83a76b0SSuyog Pawar             {                                                                                      \
584*c83a76b0SSuyog Pawar                 /* Search is this node is already present in unique list */                        \
585*c83a76b0SSuyog Pawar                 if((as_nodes[k].s_mv.i2_mvx == new_node.s_mv.i2_mvx) &&                            \
586*c83a76b0SSuyog Pawar                    (as_nodes[k].s_mv.i2_mvy == new_node.s_mv.i2_mvy))                              \
587*c83a76b0SSuyog Pawar                 {                                                                                  \
588*c83a76b0SSuyog Pawar                     /* This is duplicate node; need not be inserted */                             \
589*c83a76b0SSuyog Pawar                     break;                                                                         \
590*c83a76b0SSuyog Pawar                 }                                                                                  \
591*c83a76b0SSuyog Pawar             }                                                                                      \
592*c83a76b0SSuyog Pawar         }                                                                                          \
593*c83a76b0SSuyog Pawar         else                                                                                       \
594*c83a76b0SSuyog Pawar         {                                                                                          \
595*c83a76b0SSuyog Pawar             for(k = 0; k < (num_nodes); k++)                                                       \
596*c83a76b0SSuyog Pawar             {                                                                                      \
597*c83a76b0SSuyog Pawar                 /* Search is this node is already present in unique list */                        \
598*c83a76b0SSuyog Pawar                 if((as_nodes[k].s_mv.i2_mvx == new_node.s_mv.i2_mvx) &&                            \
599*c83a76b0SSuyog Pawar                    (as_nodes[k].s_mv.i2_mvy == new_node.s_mv.i2_mvy) &&                            \
600*c83a76b0SSuyog Pawar                    (as_nodes[k].i1_ref_idx == new_node.i1_ref_idx))                                \
601*c83a76b0SSuyog Pawar                 {                                                                                  \
602*c83a76b0SSuyog Pawar                     /* This is duplicate node; need not be inserted */                             \
603*c83a76b0SSuyog Pawar                     break;                                                                         \
604*c83a76b0SSuyog Pawar                 }                                                                                  \
605*c83a76b0SSuyog Pawar             }                                                                                      \
606*c83a76b0SSuyog Pawar         }                                                                                          \
607*c83a76b0SSuyog Pawar                                                                                                    \
608*c83a76b0SSuyog Pawar         if(k == (num_nodes))                                                                       \
609*c83a76b0SSuyog Pawar         {                                                                                          \
610*c83a76b0SSuyog Pawar             /* Insert new node only if it is not duplicate node */                                 \
611*c83a76b0SSuyog Pawar             as_nodes[k] = new_node;                                                                \
612*c83a76b0SSuyog Pawar             (num_nodes)++;                                                                         \
613*c83a76b0SSuyog Pawar         }                                                                                          \
614*c83a76b0SSuyog Pawar     }
615*c83a76b0SSuyog Pawar /**
616*c83a76b0SSuyog Pawar ******************************************************************************
617*c83a76b0SSuyog Pawar  *  @macro INSERT_NEW_NODE_NOMAP_ALTERNATE
618*c83a76b0SSuyog Pawar  *  @brief Inserts a new search node in a list if it is unique; helps in
619*c83a76b0SSuyog Pawar            removing duplicate nodes/candidates
620*c83a76b0SSuyog Pawar ******************************************************************************
621*c83a76b0SSuyog Pawar */
622*c83a76b0SSuyog Pawar #define INSERT_NEW_NODE_NOMAP_ALTERNATE(as_nodes, num_nodes, new_node, result_num, part_id)        \
623*c83a76b0SSuyog Pawar     {                                                                                              \
624*c83a76b0SSuyog Pawar         WORD32 k;                                                                                  \
625*c83a76b0SSuyog Pawar         WORD32 part_id_1 = (new_node->i4_num_valid_parts > 8) ? new_node->ai4_part_id[part_id]     \
626*c83a76b0SSuyog Pawar                                                               : part_id;                           \
627*c83a76b0SSuyog Pawar         for(k = 0; k < (num_nodes); k++)                                                           \
628*c83a76b0SSuyog Pawar         {                                                                                          \
629*c83a76b0SSuyog Pawar             /* Search is this node is already present in unique list */                            \
630*c83a76b0SSuyog Pawar             if((as_nodes[k].s_mv.i2_mvx == new_node->i2_mv_x[result_num][part_id_1]) &&            \
631*c83a76b0SSuyog Pawar                (as_nodes[k].s_mv.i2_mvy == new_node->i2_mv_y[result_num][part_id_1]) &&            \
632*c83a76b0SSuyog Pawar                (as_nodes[k].i1_ref_idx == new_node->i2_ref_idx[result_num][part_id_1]))            \
633*c83a76b0SSuyog Pawar             {                                                                                      \
634*c83a76b0SSuyog Pawar                 /* This is duplicate node; need not be inserted */                                 \
635*c83a76b0SSuyog Pawar                 break;                                                                             \
636*c83a76b0SSuyog Pawar             }                                                                                      \
637*c83a76b0SSuyog Pawar         }                                                                                          \
638*c83a76b0SSuyog Pawar                                                                                                    \
639*c83a76b0SSuyog Pawar         if(k == (num_nodes))                                                                       \
640*c83a76b0SSuyog Pawar         {                                                                                          \
641*c83a76b0SSuyog Pawar             /* Insert new node only if it is not duplicate node */                                 \
642*c83a76b0SSuyog Pawar             as_nodes[k].i4_tot_cost = (WORD32)new_node->i2_tot_cost[result_num][part_id_1];        \
643*c83a76b0SSuyog Pawar             as_nodes[k].i4_mv_cost = (WORD32)new_node->i2_mv_cost[result_num][part_id_1];          \
644*c83a76b0SSuyog Pawar             as_nodes[k].s_mv.i2_mvx = new_node->i2_mv_x[result_num][part_id_1];                    \
645*c83a76b0SSuyog Pawar             as_nodes[k].s_mv.i2_mvy = new_node->i2_mv_y[result_num][part_id_1];                    \
646*c83a76b0SSuyog Pawar             as_nodes[k].i1_ref_idx = (WORD8)new_node->i2_ref_idx[result_num][part_id_1];           \
647*c83a76b0SSuyog Pawar             as_nodes[k].u1_part_id = new_node->ai4_part_id[part_id];                               \
648*c83a76b0SSuyog Pawar             (num_nodes)++;                                                                         \
649*c83a76b0SSuyog Pawar         }                                                                                          \
650*c83a76b0SSuyog Pawar     }
651*c83a76b0SSuyog Pawar 
652*c83a76b0SSuyog Pawar #define INSERT_NEW_NODE(                                                                           \
653*c83a76b0SSuyog Pawar     as_nodes, num_nodes, new_node, implicit_layer, au4_map, center_x, center_y, use_hashing)       \
654*c83a76b0SSuyog Pawar     {                                                                                              \
655*c83a76b0SSuyog Pawar         WORD32 k;                                                                                  \
656*c83a76b0SSuyog Pawar         UWORD32 map;                                                                               \
657*c83a76b0SSuyog Pawar         WORD32 delta_x, delta_y;                                                                   \
658*c83a76b0SSuyog Pawar         delta_x = (new_node).s_mv.i2_mvx - center_x;                                               \
659*c83a76b0SSuyog Pawar         delta_y = (new_node).s_mv.i2_mvy - center_y;                                               \
660*c83a76b0SSuyog Pawar         map = 0;                                                                                   \
661*c83a76b0SSuyog Pawar         if((delta_x < MAP_X_MAX) && (delta_x >= (-MAP_X_MAX)) && (delta_y < MAP_Y_MAX) &&          \
662*c83a76b0SSuyog Pawar            (delta_y >= (-MAP_Y_MAX)) && (use_hashing))                                             \
663*c83a76b0SSuyog Pawar         {                                                                                          \
664*c83a76b0SSuyog Pawar             map = (au4_map)[delta_x + MAP_X_MAX];                                                  \
665*c83a76b0SSuyog Pawar             if(0 == (map & (1U << (delta_y + MAP_Y_MAX))))                                         \
666*c83a76b0SSuyog Pawar             {                                                                                      \
667*c83a76b0SSuyog Pawar                 (as_nodes)[(num_nodes)] = (new_node);                                              \
668*c83a76b0SSuyog Pawar                 (num_nodes)++;                                                                     \
669*c83a76b0SSuyog Pawar                 map |= 1U << (delta_y + MAP_Y_MAX);                                                \
670*c83a76b0SSuyog Pawar                 (au4_map)[delta_x + MAP_X_MAX] = map;                                              \
671*c83a76b0SSuyog Pawar             }                                                                                      \
672*c83a76b0SSuyog Pawar         }                                                                                          \
673*c83a76b0SSuyog Pawar         else if(!(implicit_layer))                                                                 \
674*c83a76b0SSuyog Pawar         {                                                                                          \
675*c83a76b0SSuyog Pawar             for(k = 0; k < (num_nodes); k++)                                                       \
676*c83a76b0SSuyog Pawar             {                                                                                      \
677*c83a76b0SSuyog Pawar                 /* Search is this node is already present in unique list */                        \
678*c83a76b0SSuyog Pawar                 if(((as_nodes)[k].s_mv.i2_mvx == (new_node).s_mv.i2_mvx) &&                        \
679*c83a76b0SSuyog Pawar                    ((as_nodes)[k].s_mv.i2_mvy == (new_node).s_mv.i2_mvy))                          \
680*c83a76b0SSuyog Pawar                 {                                                                                  \
681*c83a76b0SSuyog Pawar                     /* This is duplicate node; need not be inserted */                             \
682*c83a76b0SSuyog Pawar                     break;                                                                         \
683*c83a76b0SSuyog Pawar                 }                                                                                  \
684*c83a76b0SSuyog Pawar             }                                                                                      \
685*c83a76b0SSuyog Pawar             if(k == (num_nodes))                                                                   \
686*c83a76b0SSuyog Pawar             {                                                                                      \
687*c83a76b0SSuyog Pawar                 /* Insert new node only if it is not duplicate node */                             \
688*c83a76b0SSuyog Pawar                 (as_nodes)[k] = (new_node);                                                        \
689*c83a76b0SSuyog Pawar                 (num_nodes)++;                                                                     \
690*c83a76b0SSuyog Pawar             }                                                                                      \
691*c83a76b0SSuyog Pawar         }                                                                                          \
692*c83a76b0SSuyog Pawar         else                                                                                       \
693*c83a76b0SSuyog Pawar         {                                                                                          \
694*c83a76b0SSuyog Pawar             for(k = 0; k < (num_nodes); k++)                                                       \
695*c83a76b0SSuyog Pawar             {                                                                                      \
696*c83a76b0SSuyog Pawar                 /* Search is this node is already present in unique list */                        \
697*c83a76b0SSuyog Pawar                 if(((as_nodes)[k].s_mv.i2_mvx == (new_node).s_mv.i2_mvx) &&                        \
698*c83a76b0SSuyog Pawar                    ((as_nodes)[k].s_mv.i2_mvy == (new_node).s_mv.i2_mvy) &&                        \
699*c83a76b0SSuyog Pawar                    ((as_nodes)[k].i1_ref_idx == (new_node).i1_ref_idx))                            \
700*c83a76b0SSuyog Pawar                 {                                                                                  \
701*c83a76b0SSuyog Pawar                     /* This is duplicate node; need not be inserted */                             \
702*c83a76b0SSuyog Pawar                     break;                                                                         \
703*c83a76b0SSuyog Pawar                 }                                                                                  \
704*c83a76b0SSuyog Pawar             }                                                                                      \
705*c83a76b0SSuyog Pawar             if(k == (num_nodes))                                                                   \
706*c83a76b0SSuyog Pawar             {                                                                                      \
707*c83a76b0SSuyog Pawar                 /* Insert new node only if it is not duplicate node */                             \
708*c83a76b0SSuyog Pawar                 (as_nodes)[k] = (new_node);                                                        \
709*c83a76b0SSuyog Pawar                 (num_nodes)++;                                                                     \
710*c83a76b0SSuyog Pawar             }                                                                                      \
711*c83a76b0SSuyog Pawar         }                                                                                          \
712*c83a76b0SSuyog Pawar     }
713*c83a76b0SSuyog Pawar 
714*c83a76b0SSuyog Pawar #define COMPUTE_DIFF_MV(mvdx, mvdy, inp_node, mv_p_x, mv_p_y, inp_sh, pred_sh)                     \
715*c83a76b0SSuyog Pawar     {                                                                                              \
716*c83a76b0SSuyog Pawar         mvdx = (inp_node)->s_mv.i2_mvx << (inp_sh);                                                \
717*c83a76b0SSuyog Pawar         mvdy = (inp_node)->s_mv.i2_mvy << (inp_sh);                                                \
718*c83a76b0SSuyog Pawar         mvdx -= ((mv_p_x) << (pred_sh));                                                           \
719*c83a76b0SSuyog Pawar         mvdy -= ((mv_p_y) << (pred_sh));                                                           \
720*c83a76b0SSuyog Pawar     }
721*c83a76b0SSuyog Pawar 
722*c83a76b0SSuyog Pawar #define COMPUTE_MV_DIFFERENCE(mvdx, mvdy, inp_node, mv_p_x, mv_p_y, inp_sh, pred_sh)               \
723*c83a76b0SSuyog Pawar     {                                                                                              \
724*c83a76b0SSuyog Pawar         mvdx = (inp_node)->ps_mv->i2_mvx << (inp_sh);                                              \
725*c83a76b0SSuyog Pawar         mvdy = (inp_node)->ps_mv->i2_mvy << (inp_sh);                                              \
726*c83a76b0SSuyog Pawar         mvdx -= ((mv_p_x) << (pred_sh));                                                           \
727*c83a76b0SSuyog Pawar         mvdy -= ((mv_p_y) << (pred_sh));                                                           \
728*c83a76b0SSuyog Pawar     }
729*c83a76b0SSuyog Pawar 
730*c83a76b0SSuyog Pawar /**
731*c83a76b0SSuyog Pawar ******************************************************************************
732*c83a76b0SSuyog Pawar  *  @enum  CU_MERGE_RESULT_T
733*c83a76b0SSuyog Pawar  *  @brief Describes the results of merge, whether successful or not
734*c83a76b0SSuyog Pawar ******************************************************************************
735*c83a76b0SSuyog Pawar */
736*c83a76b0SSuyog Pawar typedef enum
737*c83a76b0SSuyog Pawar {
738*c83a76b0SSuyog Pawar     CU_MERGED,
739*c83a76b0SSuyog Pawar     CU_SPLIT
740*c83a76b0SSuyog Pawar } CU_MERGE_RESULT_T;
741*c83a76b0SSuyog Pawar 
742*c83a76b0SSuyog Pawar /**
743*c83a76b0SSuyog Pawar ******************************************************************************
744*c83a76b0SSuyog Pawar  *  @enum  PART_ORIENT_T
745*c83a76b0SSuyog Pawar  *  @brief Describes the orientation of partition (vert/horz, left/rt)
746*c83a76b0SSuyog Pawar ******************************************************************************
747*c83a76b0SSuyog Pawar */
748*c83a76b0SSuyog Pawar typedef enum
749*c83a76b0SSuyog Pawar {
750*c83a76b0SSuyog Pawar     VERT_LEFT,
751*c83a76b0SSuyog Pawar     VERT_RIGHT,
752*c83a76b0SSuyog Pawar     HORZ_TOP,
753*c83a76b0SSuyog Pawar     HORZ_BOT
754*c83a76b0SSuyog Pawar } PART_ORIENT_T;
755*c83a76b0SSuyog Pawar 
756*c83a76b0SSuyog Pawar /**
757*c83a76b0SSuyog Pawar ******************************************************************************
758*c83a76b0SSuyog Pawar  *  @enum  GRID_PT_T
759*c83a76b0SSuyog Pawar  *  @brief For a  3x3 rect grid, nubers each pt as shown
760*c83a76b0SSuyog Pawar *     5   2   6
761*c83a76b0SSuyog Pawar *     1   0   3
762*c83a76b0SSuyog Pawar *     7   4   8
763*c83a76b0SSuyog Pawar ******************************************************************************
764*c83a76b0SSuyog Pawar */
765*c83a76b0SSuyog Pawar typedef enum
766*c83a76b0SSuyog Pawar {
767*c83a76b0SSuyog Pawar     PT_C = 0,
768*c83a76b0SSuyog Pawar     PT_L = 1,
769*c83a76b0SSuyog Pawar     PT_T = 2,
770*c83a76b0SSuyog Pawar     PT_R = 3,
771*c83a76b0SSuyog Pawar     PT_B = 4,
772*c83a76b0SSuyog Pawar     PT_TL = 5,
773*c83a76b0SSuyog Pawar     PT_TR = 6,
774*c83a76b0SSuyog Pawar     PT_BL = 7,
775*c83a76b0SSuyog Pawar     PT_BR = 8,
776*c83a76b0SSuyog Pawar     NUM_GRID_PTS
777*c83a76b0SSuyog Pawar } GRID_PT_T;
778*c83a76b0SSuyog Pawar 
779*c83a76b0SSuyog Pawar /**
780*c83a76b0SSuyog Pawar ******************************************************************************
781*c83a76b0SSuyog Pawar  *  @macro  IS_POW
782*c83a76b0SSuyog Pawar  *  @brief Returns whwehter a number is power of 2
783*c83a76b0SSuyog Pawar ******************************************************************************
784*c83a76b0SSuyog Pawar */
785*c83a76b0SSuyog Pawar #define IS_POW_2(x) (!((x) & ((x)-1)))
786*c83a76b0SSuyog Pawar 
787*c83a76b0SSuyog Pawar /**
788*c83a76b0SSuyog Pawar ******************************************************************************
789*c83a76b0SSuyog Pawar  *  @macro  GRID_ALL_PTS_VALID
790*c83a76b0SSuyog Pawar  *  @brief For a 3x3 rect grid, this can be used to enable all pts in grid
791*c83a76b0SSuyog Pawar ******************************************************************************
792*c83a76b0SSuyog Pawar */
793*c83a76b0SSuyog Pawar #define GRID_ALL_PTS_VALID 0x1ff
794*c83a76b0SSuyog Pawar 
795*c83a76b0SSuyog Pawar /**
796*c83a76b0SSuyog Pawar ******************************************************************************
797*c83a76b0SSuyog Pawar  *  @macro  GRID_DIAMOND_ENABLE_ALL
798*c83a76b0SSuyog Pawar  *  @brief If we search diamond, this enables all 5 pts of diamond (including centre)
799*c83a76b0SSuyog Pawar ******************************************************************************
800*c83a76b0SSuyog Pawar */
801*c83a76b0SSuyog Pawar #define GRID_DIAMOND_ENABLE_ALL                                                                    \
802*c83a76b0SSuyog Pawar     (BIT_EN(PT_C) | BIT_EN(PT_L) | BIT_EN(PT_T) | BIT_EN(PT_R) | BIT_EN(PT_B))
803*c83a76b0SSuyog Pawar 
804*c83a76b0SSuyog Pawar /**
805*c83a76b0SSuyog Pawar ******************************************************************************
806*c83a76b0SSuyog Pawar  *  @macro  GRID_RT_3_INVALID, GRID_LT_3_INVALID,GRID_TOP_3_INVALID,GRID_BOT_3_INVALID
807*c83a76b0SSuyog Pawar  *  @brief For a square grid search, depending on where the best result is
808*c83a76b0SSuyog Pawar  *  we can optimise search for next iteration by invalidating some pts
809*c83a76b0SSuyog Pawar ******************************************************************************
810*c83a76b0SSuyog Pawar */
811*c83a76b0SSuyog Pawar #define GRID_RT_3_INVALID ((GRID_ALL_PTS_VALID) ^ (BIT_EN(PT_TR) | BIT_EN(PT_R) | BIT_EN(PT_BR)))
812*c83a76b0SSuyog Pawar #define GRID_LT_3_INVALID ((GRID_ALL_PTS_VALID) ^ (BIT_EN(PT_TL) | BIT_EN(PT_L) | BIT_EN(PT_BL)))
813*c83a76b0SSuyog Pawar #define GRID_TOP_3_INVALID ((GRID_ALL_PTS_VALID) ^ (BIT_EN(PT_TL) | BIT_EN(PT_T) | BIT_EN(PT_TR)))
814*c83a76b0SSuyog Pawar #define GRID_BOT_3_INVALID ((GRID_ALL_PTS_VALID) ^ (BIT_EN(PT_BL) | BIT_EN(PT_B) | BIT_EN(PT_BR)))
815*c83a76b0SSuyog Pawar 
816*c83a76b0SSuyog Pawar /**
817*c83a76b0SSuyog Pawar ******************************************************************************
818*c83a76b0SSuyog Pawar  *  @enum  GMV_MVTYPE_T
819*c83a76b0SSuyog Pawar  *  @brief Defines what type of GMV we need (thin lobe for a very spiky
820*c83a76b0SSuyog Pawar  * distribution of mv or thick lobe for a blurred distrib of mvs
821*c83a76b0SSuyog Pawar ******************************************************************************
822*c83a76b0SSuyog Pawar */
823*c83a76b0SSuyog Pawar typedef enum
824*c83a76b0SSuyog Pawar {
825*c83a76b0SSuyog Pawar     GMV_THICK_LOBE,
826*c83a76b0SSuyog Pawar     GMV_THIN_LOBE,
827*c83a76b0SSuyog Pawar     NUM_GMV_LOBES
828*c83a76b0SSuyog Pawar } GMV_MVTYPE_T;
829*c83a76b0SSuyog Pawar 
830*c83a76b0SSuyog Pawar /**
831*c83a76b0SSuyog Pawar ******************************************************************************
832*c83a76b0SSuyog Pawar  *  @enum  BLK_TYPE_T
833*c83a76b0SSuyog Pawar  *  @brief Defines all possible inter blks possible
834*c83a76b0SSuyog Pawar ******************************************************************************
835*c83a76b0SSuyog Pawar */
836*c83a76b0SSuyog Pawar typedef enum
837*c83a76b0SSuyog Pawar {
838*c83a76b0SSuyog Pawar     BLK_INVALID = -1,
839*c83a76b0SSuyog Pawar     BLK_4x4 = 0,
840*c83a76b0SSuyog Pawar     BLK_4x8,
841*c83a76b0SSuyog Pawar     BLK_8x4,
842*c83a76b0SSuyog Pawar     BLK_8x8,
843*c83a76b0SSuyog Pawar     BLK_4x16,
844*c83a76b0SSuyog Pawar     BLK_8x16,
845*c83a76b0SSuyog Pawar     BLK_12x16,
846*c83a76b0SSuyog Pawar     BLK_16x4,
847*c83a76b0SSuyog Pawar     BLK_16x8,
848*c83a76b0SSuyog Pawar     BLK_16x12,
849*c83a76b0SSuyog Pawar     BLK_16x16,
850*c83a76b0SSuyog Pawar     BLK_8x32,
851*c83a76b0SSuyog Pawar     BLK_16x32,
852*c83a76b0SSuyog Pawar     BLK_24x32,
853*c83a76b0SSuyog Pawar     BLK_32x8,
854*c83a76b0SSuyog Pawar     BLK_32x16,
855*c83a76b0SSuyog Pawar     BLK_32x24,
856*c83a76b0SSuyog Pawar     BLK_32x32,
857*c83a76b0SSuyog Pawar     BLK_16x64,
858*c83a76b0SSuyog Pawar     BLK_32x64,
859*c83a76b0SSuyog Pawar     BLK_48x64,
860*c83a76b0SSuyog Pawar     BLK_64x16,
861*c83a76b0SSuyog Pawar     BLK_64x32,
862*c83a76b0SSuyog Pawar     BLK_64x48,
863*c83a76b0SSuyog Pawar     BLK_64x64,
864*c83a76b0SSuyog Pawar     NUM_BLK_SIZES
865*c83a76b0SSuyog Pawar } BLK_SIZE_T;
866*c83a76b0SSuyog Pawar 
867*c83a76b0SSuyog Pawar /**
868*c83a76b0SSuyog Pawar ******************************************************************************
869*c83a76b0SSuyog Pawar  *  @enum  SEARCH_COMPLEXITY_T
870*c83a76b0SSuyog Pawar  *  @brief For refinement layer, this decides the number of refinement candts
871*c83a76b0SSuyog Pawar ******************************************************************************
872*c83a76b0SSuyog Pawar */
873*c83a76b0SSuyog Pawar typedef enum
874*c83a76b0SSuyog Pawar {
875*c83a76b0SSuyog Pawar     SEARCH_CX_LOW = 0,
876*c83a76b0SSuyog Pawar     SEARCH_CX_MED = 1,
877*c83a76b0SSuyog Pawar     SEARCH_CX_HIGH = 2
878*c83a76b0SSuyog Pawar } SEARCH_COMPLEXITY_T;
879*c83a76b0SSuyog Pawar 
880*c83a76b0SSuyog Pawar /**
881*c83a76b0SSuyog Pawar ******************************************************************************
882*c83a76b0SSuyog Pawar  *  @enum  CTB_BOUNDARY_TYPES_T
883*c83a76b0SSuyog Pawar  *  @brief For pictures not a multiples of CTB horizontally or vertically, we
884*c83a76b0SSuyog Pawar  *  define 4 unique cases, centre (full ctbs), bottom boundary (64x8k CTBs),
885*c83a76b0SSuyog Pawar  *  right boundary (8mx64 CTBs), and bottom rt corner (8mx8k CTB)
886*c83a76b0SSuyog Pawar ******************************************************************************
887*c83a76b0SSuyog Pawar */
888*c83a76b0SSuyog Pawar typedef enum
889*c83a76b0SSuyog Pawar {
890*c83a76b0SSuyog Pawar     CTB_CENTRE,
891*c83a76b0SSuyog Pawar     CTB_BOT_PIC_BOUNDARY,
892*c83a76b0SSuyog Pawar     CTB_RT_PIC_BOUNDARY,
893*c83a76b0SSuyog Pawar     CTB_BOT_RT_PIC_BOUNDARY,
894*c83a76b0SSuyog Pawar     NUM_CTB_BOUNDARY_TYPES,
895*c83a76b0SSuyog Pawar } CTB_BOUNDARY_TYPES_T;
896*c83a76b0SSuyog Pawar 
897*c83a76b0SSuyog Pawar /**
898*c83a76b0SSuyog Pawar ******************************************************************************
899*c83a76b0SSuyog Pawar  *  @enum  SEARCH_CANDIDATE_TYPE_T
900*c83a76b0SSuyog Pawar  *  @brief Monikers for all sorts of search candidates used in ME
901*c83a76b0SSuyog Pawar ******************************************************************************
902*c83a76b0SSuyog Pawar */
903*c83a76b0SSuyog Pawar typedef enum
904*c83a76b0SSuyog Pawar {
905*c83a76b0SSuyog Pawar     ILLUSORY_CANDIDATE = -1,
906*c83a76b0SSuyog Pawar     ZERO_MV = 0,
907*c83a76b0SSuyog Pawar     ZERO_MV_ALTREF,
908*c83a76b0SSuyog Pawar     SPATIAL_LEFT0,
909*c83a76b0SSuyog Pawar     SPATIAL_TOP0,
910*c83a76b0SSuyog Pawar     SPATIAL_TOP_RIGHT0,
911*c83a76b0SSuyog Pawar     SPATIAL_TOP_LEFT0,
912*c83a76b0SSuyog Pawar     SPATIAL_LEFT1,
913*c83a76b0SSuyog Pawar     SPATIAL_TOP1,
914*c83a76b0SSuyog Pawar     SPATIAL_TOP_RIGHT1,
915*c83a76b0SSuyog Pawar     SPATIAL_TOP_LEFT1,
916*c83a76b0SSuyog Pawar     PROJECTED_COLOC0,
917*c83a76b0SSuyog Pawar     PROJECTED_COLOC1,
918*c83a76b0SSuyog Pawar     PROJECTED_COLOC2,
919*c83a76b0SSuyog Pawar     PROJECTED_COLOC3,
920*c83a76b0SSuyog Pawar     PROJECTED_COLOC4,
921*c83a76b0SSuyog Pawar     PROJECTED_COLOC5,
922*c83a76b0SSuyog Pawar     PROJECTED_COLOC6,
923*c83a76b0SSuyog Pawar     PROJECTED_COLOC7,
924*c83a76b0SSuyog Pawar     PROJECTED_COLOC_TR0,
925*c83a76b0SSuyog Pawar     PROJECTED_COLOC_TR1,
926*c83a76b0SSuyog Pawar     PROJECTED_COLOC_BL0,
927*c83a76b0SSuyog Pawar     PROJECTED_COLOC_BL1,
928*c83a76b0SSuyog Pawar     PROJECTED_COLOC_BR0,
929*c83a76b0SSuyog Pawar     PROJECTED_COLOC_BR1,
930*c83a76b0SSuyog Pawar     PROJECTED_TOP0,
931*c83a76b0SSuyog Pawar     PROJECTED_TOP1,
932*c83a76b0SSuyog Pawar     PROJECTED_TOP_RIGHT0,
933*c83a76b0SSuyog Pawar     PROJECTED_TOP_RIGHT1,
934*c83a76b0SSuyog Pawar     PROJECTED_TOP_LEFT0,
935*c83a76b0SSuyog Pawar     PROJECTED_TOP_LEFT1,
936*c83a76b0SSuyog Pawar     PROJECTED_RIGHT0,
937*c83a76b0SSuyog Pawar     PROJECTED_RIGHT1,
938*c83a76b0SSuyog Pawar     PROJECTED_BOTTOM0,
939*c83a76b0SSuyog Pawar     PROJECTED_BOTTOM1,
940*c83a76b0SSuyog Pawar     PROJECTED_BOTTOM_RIGHT0,
941*c83a76b0SSuyog Pawar     PROJECTED_BOTTOM_RIGHT1,
942*c83a76b0SSuyog Pawar     PROJECTED_BOTTOM_LEFT0,
943*c83a76b0SSuyog Pawar     PROJECTED_BOTTOM_LEFT1,
944*c83a76b0SSuyog Pawar     COLOCATED_GLOBAL_MV0,
945*c83a76b0SSuyog Pawar     COLOCATED_GLOBAL_MV1,
946*c83a76b0SSuyog Pawar     PROJECTED_TOP2,
947*c83a76b0SSuyog Pawar     PROJECTED_TOP3,
948*c83a76b0SSuyog Pawar     PROJECTED_TOP_RIGHT2,
949*c83a76b0SSuyog Pawar     PROJECTED_TOP_RIGHT3,
950*c83a76b0SSuyog Pawar     PROJECTED_TOP_LEFT2,
951*c83a76b0SSuyog Pawar     PROJECTED_TOP_LEFT3,
952*c83a76b0SSuyog Pawar     PROJECTED_RIGHT2,
953*c83a76b0SSuyog Pawar     PROJECTED_RIGHT3,
954*c83a76b0SSuyog Pawar     PROJECTED_BOTTOM2,
955*c83a76b0SSuyog Pawar     PROJECTED_BOTTOM3,
956*c83a76b0SSuyog Pawar     PROJECTED_BOTTOM_RIGHT2,
957*c83a76b0SSuyog Pawar     PROJECTED_BOTTOM_RIGHT3,
958*c83a76b0SSuyog Pawar     PROJECTED_BOTTOM_LEFT2,
959*c83a76b0SSuyog Pawar     PROJECTED_BOTTOM_LEFT3,
960*c83a76b0SSuyog Pawar     NUM_SEARCH_CAND_TYPES
961*c83a76b0SSuyog Pawar } SEARCH_CANDIDATE_TYPE_T;
962*c83a76b0SSuyog Pawar 
963*c83a76b0SSuyog Pawar typedef enum
964*c83a76b0SSuyog Pawar {
965*c83a76b0SSuyog Pawar     ILLUSORY_LOCATION = -1,
966*c83a76b0SSuyog Pawar     COLOCATED,
967*c83a76b0SSuyog Pawar     COLOCATED_4x4_TR,
968*c83a76b0SSuyog Pawar     COLOCATED_4x4_BL,
969*c83a76b0SSuyog Pawar     COLOCATED_4x4_BR,
970*c83a76b0SSuyog Pawar     LEFT,
971*c83a76b0SSuyog Pawar     TOPLEFT,
972*c83a76b0SSuyog Pawar     TOP,
973*c83a76b0SSuyog Pawar     TOPRIGHT,
974*c83a76b0SSuyog Pawar     RIGHT,
975*c83a76b0SSuyog Pawar     BOTTOMRIGHT,
976*c83a76b0SSuyog Pawar     BOTTOM,
977*c83a76b0SSuyog Pawar     BOTTOMLEFT,
978*c83a76b0SSuyog Pawar     NUM_SEARCH_CAND_LOCATIONS
979*c83a76b0SSuyog Pawar } SEARCH_CAND_LOCATIONS_T;
980*c83a76b0SSuyog Pawar 
981*c83a76b0SSuyog Pawar /**
982*c83a76b0SSuyog Pawar ******************************************************************************
983*c83a76b0SSuyog Pawar  *  @macros  ENABLE_mxn
984*c83a76b0SSuyog Pawar  *  @brief Enables a type or a group of partitions. ENABLE_ALL_PARTS, enables all
985*c83a76b0SSuyog Pawar  *  partitions, while others enable selected partitions. These can be used
986*c83a76b0SSuyog Pawar  *  to set the mask of active partitions
987*c83a76b0SSuyog Pawar ******************************************************************************
988*c83a76b0SSuyog Pawar */
989*c83a76b0SSuyog Pawar #define ENABLE_2Nx2N (BIT_EN(PART_ID_2Nx2N))
990*c83a76b0SSuyog Pawar #define ENABLE_2NxN (BIT_EN(PART_ID_2NxN_T) | BIT_EN(PART_ID_2NxN_B))
991*c83a76b0SSuyog Pawar #define ENABLE_Nx2N (BIT_EN(PART_ID_Nx2N_L) | BIT_EN(PART_ID_Nx2N_R))
992*c83a76b0SSuyog Pawar #define ENABLE_NxN                                                                                 \
993*c83a76b0SSuyog Pawar     (BIT_EN(PART_ID_NxN_TL) | BIT_EN(PART_ID_NxN_TR) | BIT_EN(PART_ID_NxN_BL) |                    \
994*c83a76b0SSuyog Pawar      BIT_EN(PART_ID_NxN_BR))
995*c83a76b0SSuyog Pawar #define ENABLE_2NxnU (BIT_EN(PART_ID_2NxnU_T) | BIT_EN(PART_ID_2NxnU_B))
996*c83a76b0SSuyog Pawar #define ENABLE_2NxnD (BIT_EN(PART_ID_2NxnD_T) | BIT_EN(PART_ID_2NxnD_B))
997*c83a76b0SSuyog Pawar #define ENABLE_nLx2N (BIT_EN(PART_ID_nLx2N_L) | BIT_EN(PART_ID_nLx2N_R))
998*c83a76b0SSuyog Pawar #define ENABLE_nRx2N (BIT_EN(PART_ID_nRx2N_L) | BIT_EN(PART_ID_nRx2N_R))
999*c83a76b0SSuyog Pawar #define ENABLE_AMP ((ENABLE_2NxnU) | (ENABLE_2NxnD) | (ENABLE_nLx2N) | (ENABLE_nRx2N))
1000*c83a76b0SSuyog Pawar #define ENABLE_SMP ((ENABLE_2NxN) | (ENABLE_Nx2N))
1001*c83a76b0SSuyog Pawar #define ENABLE_ALL_PARTS                                                                           \
1002*c83a76b0SSuyog Pawar     ((ENABLE_2Nx2N) | (ENABLE_NxN) | (ENABLE_2NxN) | (ENABLE_Nx2N) | (ENABLE_AMP))
1003*c83a76b0SSuyog Pawar #define ENABLE_SQUARE_PARTS ((ENABLE_2Nx2N) | (ENABLE_NxN))
1004*c83a76b0SSuyog Pawar 
1005*c83a76b0SSuyog Pawar /**
1006*c83a76b0SSuyog Pawar ******************************************************************************
1007*c83a76b0SSuyog Pawar  *  @enum  MV_PEL_RES_T
1008*c83a76b0SSuyog Pawar  *  @brief Resolution of MV fpel/hpel/qpel units. Useful for maintaining
1009*c83a76b0SSuyog Pawar  *  predictors. During fpel search, candts, predictors etc are in fpel units,
1010*c83a76b0SSuyog Pawar  *  in subpel search, they are in subpel units
1011*c83a76b0SSuyog Pawar ******************************************************************************
1012*c83a76b0SSuyog Pawar */
1013*c83a76b0SSuyog Pawar typedef enum
1014*c83a76b0SSuyog Pawar {
1015*c83a76b0SSuyog Pawar     MV_RES_FPEL,
1016*c83a76b0SSuyog Pawar     MV_RES_HPEL,
1017*c83a76b0SSuyog Pawar     MV_RES_QPEL
1018*c83a76b0SSuyog Pawar } MV_PEL_RES_T;
1019*c83a76b0SSuyog Pawar 
1020*c83a76b0SSuyog Pawar /**
1021*c83a76b0SSuyog Pawar ******************************************************************************
1022*c83a76b0SSuyog Pawar  *  @enum  HME_SET_MVPRED_RES
1023*c83a76b0SSuyog Pawar  *  @brief Sets resolution for predictor bank (fpel/qpel/hpel units)
1024*c83a76b0SSuyog Pawar ******************************************************************************
1025*c83a76b0SSuyog Pawar */
1026*c83a76b0SSuyog Pawar #define HME_SET_MVPRED_RES(ps_pred_ctxt, mv_pel_res) ((ps_pred_ctxt)->mv_pel = mv_pel_res)
1027*c83a76b0SSuyog Pawar 
1028*c83a76b0SSuyog Pawar /**
1029*c83a76b0SSuyog Pawar ******************************************************************************
1030*c83a76b0SSuyog Pawar  *  @enum  HME_SET_MVPRED_DIR
1031*c83a76b0SSuyog Pawar  *  @brief Sets the direction, meaning L0/L1. Since L0 and L1 use separate
1032*c83a76b0SSuyog Pawar  *  candts, the pred ctxt for them hasto be maintained separately
1033*c83a76b0SSuyog Pawar ******************************************************************************
1034*c83a76b0SSuyog Pawar */
1035*c83a76b0SSuyog Pawar #define HME_SET_MVPRED_DIR(ps_pred_ctxt, pred_lx) ((ps_pred_ctxt)->pred_lx = pred_lx)
1036*c83a76b0SSuyog Pawar 
1037*c83a76b0SSuyog Pawar /**
1038*c83a76b0SSuyog Pawar ******************************************************************************
1039*c83a76b0SSuyog Pawar  *  @brief macros to clip / check mv within specified range
1040*c83a76b0SSuyog Pawar ******************************************************************************
1041*c83a76b0SSuyog Pawar  */
1042*c83a76b0SSuyog Pawar #define CHECK_MV_WITHIN_RANGE(x, y, range)                                                         \
1043*c83a76b0SSuyog Pawar     (((x) > (range)->i2_min_x) && ((x) < (range)->i2_max_x) && ((y) > (range)->i2_min_y) &&        \
1044*c83a76b0SSuyog Pawar      ((y) < (range)->i2_max_y))
1045*c83a76b0SSuyog Pawar 
1046*c83a76b0SSuyog Pawar #define CONVERT_MV_LIMIT_TO_QPEL(range)                                                            \
1047*c83a76b0SSuyog Pawar     {                                                                                              \
1048*c83a76b0SSuyog Pawar         (range)->i2_max_x <<= 2;                                                                   \
1049*c83a76b0SSuyog Pawar         (range)->i2_max_y <<= 2;                                                                   \
1050*c83a76b0SSuyog Pawar         (range)->i2_min_x <<= 2;                                                                   \
1051*c83a76b0SSuyog Pawar         (range)->i2_min_y <<= 2;                                                                   \
1052*c83a76b0SSuyog Pawar     }
1053*c83a76b0SSuyog Pawar 
1054*c83a76b0SSuyog Pawar #define CONVERT_MV_LIMIT_TO_FPEL(range)                                                            \
1055*c83a76b0SSuyog Pawar     {                                                                                              \
1056*c83a76b0SSuyog Pawar         (range)->i2_max_x >>= 2;                                                                   \
1057*c83a76b0SSuyog Pawar         (range)->i2_max_y >>= 2;                                                                   \
1058*c83a76b0SSuyog Pawar         (range)->i2_min_x >>= 2;                                                                   \
1059*c83a76b0SSuyog Pawar         (range)->i2_min_y >>= 2;                                                                   \
1060*c83a76b0SSuyog Pawar     }
1061*c83a76b0SSuyog Pawar 
1062*c83a76b0SSuyog Pawar /**
1063*c83a76b0SSuyog Pawar ******************************************************************************
1064*c83a76b0SSuyog Pawar  *  @brief Swicth to debug the number of subpel search nodes
1065*c83a76b0SSuyog Pawar ******************************************************************************
1066*c83a76b0SSuyog Pawar */
1067*c83a76b0SSuyog Pawar #define DEBUG_SUBPEL_SEARCH_NODE_HS_COUNT 0
1068*c83a76b0SSuyog Pawar 
1069*c83a76b0SSuyog Pawar /**
1070*c83a76b0SSuyog Pawar ******************************************************************************
1071*c83a76b0SSuyog Pawar  *  @typedef  SAD_GRID_T
1072*c83a76b0SSuyog Pawar  *  @brief Defines a 2D array type used to store SADs across grid and across
1073*c83a76b0SSuyog Pawar  * partition types
1074*c83a76b0SSuyog Pawar ******************************************************************************
1075*c83a76b0SSuyog Pawar */
1076*c83a76b0SSuyog Pawar typedef S32 SAD_GRID_T[9][MAX_NUM_PARTS];
1077*c83a76b0SSuyog Pawar 
1078*c83a76b0SSuyog Pawar /*****************************************************************************/
1079*c83a76b0SSuyog Pawar /* Structures                                                                */
1080*c83a76b0SSuyog Pawar /*****************************************************************************/
1081*c83a76b0SSuyog Pawar 
1082*c83a76b0SSuyog Pawar /**
1083*c83a76b0SSuyog Pawar ******************************************************************************
1084*c83a76b0SSuyog Pawar  *  @struct  grid_node_t
1085*c83a76b0SSuyog Pawar  *  @brief stores a complete info for a candt
1086*c83a76b0SSuyog Pawar ******************************************************************************
1087*c83a76b0SSuyog Pawar */
1088*c83a76b0SSuyog Pawar typedef struct
1089*c83a76b0SSuyog Pawar {
1090*c83a76b0SSuyog Pawar     S16 i2_mv_x;
1091*c83a76b0SSuyog Pawar     S16 i2_mv_y;
1092*c83a76b0SSuyog Pawar     S08 i1_ref_idx;
1093*c83a76b0SSuyog Pawar } grid_node_t;
1094*c83a76b0SSuyog Pawar 
1095*c83a76b0SSuyog Pawar /**
1096*c83a76b0SSuyog Pawar ******************************************************************************
1097*c83a76b0SSuyog Pawar  *  @struct  search_node_t
1098*c83a76b0SSuyog Pawar  *  @brief   Basic structure used for storage of search results, specification
1099*c83a76b0SSuyog Pawar  *  of init candidates for search etc. This structure is complete for
1100*c83a76b0SSuyog Pawar  *  specification of mv and cost for a given direction of search (L0/L1) but
1101*c83a76b0SSuyog Pawar  *  does not carry information of what type of partition it represents.
1102*c83a76b0SSuyog Pawar ******************************************************************************
1103*c83a76b0SSuyog Pawar  */
1104*c83a76b0SSuyog Pawar typedef struct
1105*c83a76b0SSuyog Pawar {
1106*c83a76b0SSuyog Pawar     /** Motion vector */
1107*c83a76b0SSuyog Pawar     mv_t s_mv;
1108*c83a76b0SSuyog Pawar 
1109*c83a76b0SSuyog Pawar     /** Used in the hme_mv_clipper function to reduce loads and stores */
1110*c83a76b0SSuyog Pawar     mv_t *ps_mv;
1111*c83a76b0SSuyog Pawar 
1112*c83a76b0SSuyog Pawar     /** Ref id, as specified in terms of Lc, unified list */
1113*c83a76b0SSuyog Pawar     S08 i1_ref_idx;
1114*c83a76b0SSuyog Pawar 
1115*c83a76b0SSuyog Pawar     /** Flag to indicate whether mv is in fpel or QPEL units */
1116*c83a76b0SSuyog Pawar     U08 u1_subpel_done;
1117*c83a76b0SSuyog Pawar 
1118*c83a76b0SSuyog Pawar     /**
1119*c83a76b0SSuyog Pawar      * Indicates whether this node constitutes a valid predictor candt.
1120*c83a76b0SSuyog Pawar      * Since this structure also used for predictor candts, some candts may
1121*c83a76b0SSuyog Pawar      * not be available (anti causal or outside pic boundary). Availabilit
1122*c83a76b0SSuyog Pawar      * can be inferred using this flag.
1123*c83a76b0SSuyog Pawar      */
1124*c83a76b0SSuyog Pawar     U08 u1_is_avail;
1125*c83a76b0SSuyog Pawar 
1126*c83a76b0SSuyog Pawar     /**
1127*c83a76b0SSuyog Pawar      * Indicates partition Id to which this node belongs. Useful during
1128*c83a76b0SSuyog Pawar      * subpel / fullpel refinement search to identify partition whose
1129*c83a76b0SSuyog Pawar      * cost needs to be minimized
1130*c83a76b0SSuyog Pawar      */
1131*c83a76b0SSuyog Pawar     U08 u1_part_id;
1132*c83a76b0SSuyog Pawar 
1133*c83a76b0SSuyog Pawar     /** SAD / SATD stored here */
1134*c83a76b0SSuyog Pawar     S32 i4_sad;
1135*c83a76b0SSuyog Pawar 
1136*c83a76b0SSuyog Pawar     /**
1137*c83a76b0SSuyog Pawar      * Cost related to coding MV, multiplied by lambda
1138*c83a76b0SSuyog Pawar      * TODO : Entry may be redundant, can be removed
1139*c83a76b0SSuyog Pawar      */
1140*c83a76b0SSuyog Pawar     S32 i4_mv_cost;
1141*c83a76b0SSuyog Pawar 
1142*c83a76b0SSuyog Pawar     /** Total cost, (SAD + MV Cost) */
1143*c83a76b0SSuyog Pawar     S32 i4_tot_cost;
1144*c83a76b0SSuyog Pawar 
1145*c83a76b0SSuyog Pawar     /** Subpel_Dist_Improvement.
1146*c83a76b0SSuyog Pawar         It is the reduction in distortion (SAD or SATD) achieved
1147*c83a76b0SSuyog Pawar         from the full-pel stage to the sub-pel stage
1148*c83a76b0SSuyog Pawar     */
1149*c83a76b0SSuyog Pawar     S32 i4_sdi;
1150*c83a76b0SSuyog Pawar 
1151*c83a76b0SSuyog Pawar } search_node_t;
1152*c83a76b0SSuyog Pawar 
1153*c83a76b0SSuyog Pawar /**
1154*c83a76b0SSuyog Pawar ******************************************************************************
1155*c83a76b0SSuyog Pawar  *  @macro  INIT_SEARCH_NODE
1156*c83a76b0SSuyog Pawar  *  @brief   Initializes this search_node_t structure. Can be used to zero
1157*c83a76b0SSuyog Pawar  *          out candts, set max costs in results etc
1158*c83a76b0SSuyog Pawar ******************************************************************************
1159*c83a76b0SSuyog Pawar  */
1160*c83a76b0SSuyog Pawar #define INIT_SEARCH_NODE(x, a)                                                                     \
1161*c83a76b0SSuyog Pawar     {                                                                                              \
1162*c83a76b0SSuyog Pawar         (x)->s_mv.i2_mvx = 0;                                                                      \
1163*c83a76b0SSuyog Pawar         (x)->s_mv.i2_mvy = 0;                                                                      \
1164*c83a76b0SSuyog Pawar         (x)->i1_ref_idx = a;                                                                       \
1165*c83a76b0SSuyog Pawar         (x)->i4_tot_cost = MAX_32BIT_VAL;                                                          \
1166*c83a76b0SSuyog Pawar         (x)->i4_sad = MAX_32BIT_VAL;                                                               \
1167*c83a76b0SSuyog Pawar         (x)->u1_subpel_done = 0;                                                                   \
1168*c83a76b0SSuyog Pawar         (x)->u1_is_avail = 1;                                                                      \
1169*c83a76b0SSuyog Pawar     }
1170*c83a76b0SSuyog Pawar 
1171*c83a76b0SSuyog Pawar /**
1172*c83a76b0SSuyog Pawar ******************************************************************************
1173*c83a76b0SSuyog Pawar  *  @struct  part_attr_t
1174*c83a76b0SSuyog Pawar  *  @brief   Geometric description of a partition w.r.t. CU start. Note that
1175*c83a76b0SSuyog Pawar  *           since this is used across various CU sizes, the inference of
1176*c83a76b0SSuyog Pawar  *           these members is to be done in the context of specific usage
1177*c83a76b0SSuyog Pawar ******************************************************************************
1178*c83a76b0SSuyog Pawar  */
1179*c83a76b0SSuyog Pawar typedef struct
1180*c83a76b0SSuyog Pawar {
1181*c83a76b0SSuyog Pawar     /** Start of partition w.r.t. CU start in x dirn */
1182*c83a76b0SSuyog Pawar     U08 u1_x_start;
1183*c83a76b0SSuyog Pawar     /** Size of partitino w.r.t. CU start in x dirn */
1184*c83a76b0SSuyog Pawar     U08 u1_x_count;
1185*c83a76b0SSuyog Pawar     /** Start of partition w.r.t. CU start in y dirn */
1186*c83a76b0SSuyog Pawar     U08 u1_y_start;
1187*c83a76b0SSuyog Pawar     /** Size of partitino w.r.t. CU start in y dirn */
1188*c83a76b0SSuyog Pawar     U08 u1_y_count;
1189*c83a76b0SSuyog Pawar } part_attr_t;
1190*c83a76b0SSuyog Pawar 
1191*c83a76b0SSuyog Pawar /**
1192*c83a76b0SSuyog Pawar ******************************************************************************
1193*c83a76b0SSuyog Pawar  *  @struct  search_candt_t
1194*c83a76b0SSuyog Pawar  *  @brief   Complete information for a given candt in any refinement srch
1195*c83a76b0SSuyog Pawar ******************************************************************************
1196*c83a76b0SSuyog Pawar  */
1197*c83a76b0SSuyog Pawar typedef struct
1198*c83a76b0SSuyog Pawar {
1199*c83a76b0SSuyog Pawar     /** Points to the mv, ref id info. */
1200*c83a76b0SSuyog Pawar     search_node_t *ps_search_node;
1201*c83a76b0SSuyog Pawar     /** Number of refinemnts to be done for this candt */
1202*c83a76b0SSuyog Pawar     U08 u1_num_steps_refine;
1203*c83a76b0SSuyog Pawar } search_candt_t;
1204*c83a76b0SSuyog Pawar 
1205*c83a76b0SSuyog Pawar /**
1206*c83a76b0SSuyog Pawar ******************************************************************************
1207*c83a76b0SSuyog Pawar  *  @struct  result_node_t
1208*c83a76b0SSuyog Pawar  *  @brief   Contains complete search result for a CU for a given type of
1209*c83a76b0SSuyog Pawar  *           partition split. Holds ptrs to results for each partition, with
1210*c83a76b0SSuyog Pawar  *           information of partition type.
1211*c83a76b0SSuyog Pawar ******************************************************************************
1212*c83a76b0SSuyog Pawar  */
1213*c83a76b0SSuyog Pawar typedef struct
1214*c83a76b0SSuyog Pawar {
1215*c83a76b0SSuyog Pawar     /**
1216*c83a76b0SSuyog Pawar      * Type of partition that the CU is split into, for which this
1217*c83a76b0SSuyog Pawar      * result is relevant
1218*c83a76b0SSuyog Pawar      */
1219*c83a76b0SSuyog Pawar     PART_TYPE_T e_part_type;
1220*c83a76b0SSuyog Pawar 
1221*c83a76b0SSuyog Pawar     /**
1222*c83a76b0SSuyog Pawar      * Total cost of coding the CU (sum of costs of individual partitions
1223*c83a76b0SSuyog Pawar      * plus other possible CU level overheads)
1224*c83a76b0SSuyog Pawar      */
1225*c83a76b0SSuyog Pawar     S32 i4_tot_cost;
1226*c83a76b0SSuyog Pawar 
1227*c83a76b0SSuyog Pawar     /**
1228*c83a76b0SSuyog Pawar      * Pointer to results of each individual partitions. Note that max
1229*c83a76b0SSuyog Pawar      * number of partitions a CU can be split into is MAX_NUM_PARTS
1230*c83a76b0SSuyog Pawar      */
1231*c83a76b0SSuyog Pawar     search_node_t *ps_part_result[MAX_NUM_PARTS];
1232*c83a76b0SSuyog Pawar 
1233*c83a76b0SSuyog Pawar     /* TU split flag : tu_split_flag[0] represents the transform splits
1234*c83a76b0SSuyog Pawar      *  for CU size <= 32, for 64x64 each ai4_tu_split_flag corresponds
1235*c83a76b0SSuyog Pawar      *  to respective 32x32  */
1236*c83a76b0SSuyog Pawar     S32 ai4_tu_split_flag[4];
1237*c83a76b0SSuyog Pawar 
1238*c83a76b0SSuyog Pawar } result_node_t;
1239*c83a76b0SSuyog Pawar 
1240*c83a76b0SSuyog Pawar /**
1241*c83a76b0SSuyog Pawar ******************************************************************************
1242*c83a76b0SSuyog Pawar  *  @struct  ctb_node_t
1243*c83a76b0SSuyog Pawar  *  @brief   Finalized information for a given CU or CTB. This is a recursive
1244*c83a76b0SSuyog Pawar  *           structure and can hence start at CTB level, recursing for every
1245*c83a76b0SSuyog Pawar  *           level of split till we hit leaf CUs in the CTB. At leaf node
1246*c83a76b0SSuyog Pawar  *           it contains info for coded non split CU, with child nodes being
1247*c83a76b0SSuyog Pawar  *           set to NULL
1248*c83a76b0SSuyog Pawar ******************************************************************************
1249*c83a76b0SSuyog Pawar  */
1250*c83a76b0SSuyog Pawar typedef struct ctb_node_t
1251*c83a76b0SSuyog Pawar {
1252*c83a76b0SSuyog Pawar     /** x offset of this CU w.r.t. CTB start (0-63) */
1253*c83a76b0SSuyog Pawar     U08 u1_x_off;
1254*c83a76b0SSuyog Pawar     /** y offset of this C U w.r.t. CTB start (0-63) */
1255*c83a76b0SSuyog Pawar     U08 u1_y_off;
1256*c83a76b0SSuyog Pawar     /** Results of each partition in both directions L0,L1 */
1257*c83a76b0SSuyog Pawar     search_node_t as_part_results[MAX_NUM_PARTS][2];
1258*c83a76b0SSuyog Pawar     /**
1259*c83a76b0SSuyog Pawar      * Pointers to pred buffers. Note that the buffer may be allocated
1260*c83a76b0SSuyog Pawar      * at parent level or at this level
1261*c83a76b0SSuyog Pawar      */
1262*c83a76b0SSuyog Pawar     U08 *apu1_pred[2];
1263*c83a76b0SSuyog Pawar     /** Prediction direction for each partition: 0-L0, 1-L1, 2-BI */
1264*c83a76b0SSuyog Pawar     U08 u1_pred_dir[MAX_NUM_PARTS];
1265*c83a76b0SSuyog Pawar     /**
1266*c83a76b0SSuyog Pawar      * When pred direction is decided to be BI, we still store the best
1267*c83a76b0SSuyog Pawar      * uni pred dir (L0/L1) in this array, for RD Opt purposes
1268*c83a76b0SSuyog Pawar      */
1269*c83a76b0SSuyog Pawar     U08 u1_best_uni_dir[MAX_NUM_PARTS];
1270*c83a76b0SSuyog Pawar     /** Stride of pred buffer pointed to by apu1_pred member */
1271*c83a76b0SSuyog Pawar     S32 i4_pred_stride;
1272*c83a76b0SSuyog Pawar     /** Size of the CU that this node represents */
1273*c83a76b0SSuyog Pawar     CU_SIZE_T e_cu_size;
1274*c83a76b0SSuyog Pawar     /** For leaf CUs, this indicats type of partition (for e.g. PRT_2NxN) */
1275*c83a76b0SSuyog Pawar     PART_TYPE_T e_part_type;
1276*c83a76b0SSuyog Pawar     /** Below entries are for a CU level*/
1277*c83a76b0SSuyog Pawar     S32 i4_sad;
1278*c83a76b0SSuyog Pawar     S32 i4_satd;
1279*c83a76b0SSuyog Pawar     S32 i4_mv_cost;
1280*c83a76b0SSuyog Pawar     S32 i4_rate;
1281*c83a76b0SSuyog Pawar     S32 i4_dist;
1282*c83a76b0SSuyog Pawar     S32 i4_tot_cost;
1283*c83a76b0SSuyog Pawar     /** Best costs of each partitions, if partition is BI, then best cost across uni/bi */
1284*c83a76b0SSuyog Pawar     S32 ai4_part_costs[4];
1285*c83a76b0SSuyog Pawar 
1286*c83a76b0SSuyog Pawar     /* TU split flag : tu_split_flag[0] represents the transform splits
1287*c83a76b0SSuyog Pawar      *  for CU size <= 32, for 64x64 each ai4_tu_split_flag corresponds
1288*c83a76b0SSuyog Pawar      *  to respective 32x32  */
1289*c83a76b0SSuyog Pawar     /* For a 8x8 TU - 1 bit used to indicate split */
1290*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 */
1291*c83a76b0SSuyog Pawar     /* For a 32x32 TU - See above */
1292*c83a76b0SSuyog Pawar     S32 ai4_tu_split_flag[4];
1293*c83a76b0SSuyog Pawar 
1294*c83a76b0SSuyog Pawar     /**
1295*c83a76b0SSuyog Pawar      * pointers to child nodes. If this node is split, then the below point
1296*c83a76b0SSuyog Pawar      * to children nodes (TL, TR, BL, BR) each of quarter size (w/2, h/2)
1297*c83a76b0SSuyog Pawar      * If this node not split, then below point to null
1298*c83a76b0SSuyog Pawar      */
1299*c83a76b0SSuyog Pawar     struct ctb_node_t *ps_tl;
1300*c83a76b0SSuyog Pawar     struct ctb_node_t *ps_tr;
1301*c83a76b0SSuyog Pawar     struct ctb_node_t *ps_bl;
1302*c83a76b0SSuyog Pawar     struct ctb_node_t *ps_br;
1303*c83a76b0SSuyog Pawar } ctb_node_t;
1304*c83a76b0SSuyog Pawar 
1305*c83a76b0SSuyog Pawar /**
1306*c83a76b0SSuyog Pawar ******************************************************************************
1307*c83a76b0SSuyog Pawar  *  @struct  ctb_mem_mgr_t
1308*c83a76b0SSuyog Pawar  *  @brief   Memory manager structure for CTB level memory allocations of CTB
1309*c83a76b0SSuyog Pawar  *           nodes
1310*c83a76b0SSuyog Pawar ******************************************************************************
1311*c83a76b0SSuyog Pawar  */
1312*c83a76b0SSuyog Pawar typedef struct
1313*c83a76b0SSuyog Pawar {
1314*c83a76b0SSuyog Pawar     /** Base memory ptr */
1315*c83a76b0SSuyog Pawar     U08 *pu1_mem;
1316*c83a76b0SSuyog Pawar     /** Amount used so far (running value) */
1317*c83a76b0SSuyog Pawar     S32 i4_used;
1318*c83a76b0SSuyog Pawar     /** Total memory available for this mem mgr */
1319*c83a76b0SSuyog Pawar     S32 i4_tot;
1320*c83a76b0SSuyog Pawar 
1321*c83a76b0SSuyog Pawar     /** Size of CTB node, and alignment requiremnts */
1322*c83a76b0SSuyog Pawar     S32 i4_size;
1323*c83a76b0SSuyog Pawar     S32 i4_align;
1324*c83a76b0SSuyog Pawar } ctb_mem_mgr_t;
1325*c83a76b0SSuyog Pawar 
1326*c83a76b0SSuyog Pawar /**
1327*c83a76b0SSuyog Pawar ******************************************************************************
1328*c83a76b0SSuyog Pawar  *  @struct  buf_mgr_t
1329*c83a76b0SSuyog Pawar  *  @brief   Memory manager structure for CTB level buffer allocations on the
1330*c83a76b0SSuyog Pawar  *           fly, esp useful for pred bufs and working memory
1331*c83a76b0SSuyog Pawar ******************************************************************************
1332*c83a76b0SSuyog Pawar  */
1333*c83a76b0SSuyog Pawar typedef struct
1334*c83a76b0SSuyog Pawar {
1335*c83a76b0SSuyog Pawar     /** base memory ptr */
1336*c83a76b0SSuyog Pawar     U08 *pu1_wkg_mem;
1337*c83a76b0SSuyog Pawar     /** total memory available */
1338*c83a76b0SSuyog Pawar     S32 i4_total;
1339*c83a76b0SSuyog Pawar     /** Memory used so far */
1340*c83a76b0SSuyog Pawar     S32 i4_used;
1341*c83a76b0SSuyog Pawar } buf_mgr_t;
1342*c83a76b0SSuyog Pawar 
1343*c83a76b0SSuyog Pawar /**
1344*c83a76b0SSuyog Pawar ******************************************************************************
1345*c83a76b0SSuyog Pawar  *  @struct  pred_candt_nodes_t
1346*c83a76b0SSuyog Pawar  *  @brief   For a given partition and a given CU/blk, this has pointers to
1347*c83a76b0SSuyog Pawar  *           all the neighbouring and coloc pred candts. All the pred candts
1348*c83a76b0SSuyog Pawar  *           are stored as search_node_t structures itself.
1349*c83a76b0SSuyog Pawar ******************************************************************************
1350*c83a76b0SSuyog Pawar  */
1351*c83a76b0SSuyog Pawar typedef struct
1352*c83a76b0SSuyog Pawar {
1353*c83a76b0SSuyog Pawar     search_node_t *ps_tl;
1354*c83a76b0SSuyog Pawar     search_node_t *ps_t;
1355*c83a76b0SSuyog Pawar     search_node_t *ps_tr;
1356*c83a76b0SSuyog Pawar     search_node_t *ps_bl;
1357*c83a76b0SSuyog Pawar     search_node_t *ps_l;
1358*c83a76b0SSuyog Pawar     search_node_t *ps_coloc;
1359*c83a76b0SSuyog Pawar     search_node_t *ps_zeromv;
1360*c83a76b0SSuyog Pawar     search_node_t **pps_proj_coloc;
1361*c83a76b0SSuyog Pawar 
1362*c83a76b0SSuyog Pawar     search_node_t *ps_mvp_node;
1363*c83a76b0SSuyog Pawar } pred_candt_nodes_t;
1364*c83a76b0SSuyog Pawar 
1365*c83a76b0SSuyog Pawar /**
1366*c83a76b0SSuyog Pawar ******************************************************************************
1367*c83a76b0SSuyog Pawar  *  @struct  pred_ctxt_t
1368*c83a76b0SSuyog Pawar  *  @brief   For a given CU/blk, has complete prediction information for all
1369*c83a76b0SSuyog Pawar  *           types of partitions. Note that the pred candts are only pointed
1370*c83a76b0SSuyog Pawar  *           to, not actually stored here. This indirection is to avoid
1371*c83a76b0SSuyog Pawar  *           copies after each partition search, this way, the result of
1372*c83a76b0SSuyog Pawar  *           a partition is updated and the causally next partition
1373*c83a76b0SSuyog Pawar  *           automatically uses this result
1374*c83a76b0SSuyog Pawar ******************************************************************************
1375*c83a76b0SSuyog Pawar  */
1376*c83a76b0SSuyog Pawar typedef struct
1377*c83a76b0SSuyog Pawar {
1378*c83a76b0SSuyog Pawar     pred_candt_nodes_t as_pred_nodes[TOT_NUM_PARTS];
1379*c83a76b0SSuyog Pawar 
1380*c83a76b0SSuyog Pawar     /**
1381*c83a76b0SSuyog Pawar      *  We use S + lambda * R to evaluate cost. Here S = SAD/SATD and lambda
1382*c83a76b0SSuyog Pawar      *  is the scaling of bits to S and R is bits of overhead (MV + mode).
1383*c83a76b0SSuyog Pawar      *  Choice of lambda depends on open loop / closed loop, Qp, temporal id
1384*c83a76b0SSuyog Pawar      *  and possibly CU depth. It is the caller's responsiblity to pass
1385*c83a76b0SSuyog Pawar      *  to this module the appropriate lambda.
1386*c83a76b0SSuyog Pawar      */
1387*c83a76b0SSuyog Pawar     S32 lambda;
1388*c83a76b0SSuyog Pawar 
1389*c83a76b0SSuyog Pawar     /** lambda is in Q format, so this is the downshift reqd */
1390*c83a76b0SSuyog Pawar     S32 lambda_q_shift;
1391*c83a76b0SSuyog Pawar 
1392*c83a76b0SSuyog Pawar     /** Prediction direction : PRED_L0 or PRED_L1 */
1393*c83a76b0SSuyog Pawar     S32 pred_lx;
1394*c83a76b0SSuyog Pawar 
1395*c83a76b0SSuyog Pawar     /** MV resolution: FPEL, HPEL or QPEL */
1396*c83a76b0SSuyog Pawar     S32 mv_pel;
1397*c83a76b0SSuyog Pawar 
1398*c83a76b0SSuyog Pawar     /** Points to the ref bits lookup 1 ptr for each PRED_Lx */
1399*c83a76b0SSuyog Pawar     U08 **ppu1_ref_bits_tlu;
1400*c83a76b0SSuyog Pawar 
1401*c83a76b0SSuyog Pawar     /**
1402*c83a76b0SSuyog Pawar      *  Points to the ref scale factor, for a given ref id k,
1403*c83a76b0SSuyog Pawar      *  to scale as per ref id m, we use entry k+MAX_NUM_REF*m
1404*c83a76b0SSuyog Pawar      */
1405*c83a76b0SSuyog Pawar     S16 *pi2_ref_scf;
1406*c83a76b0SSuyog Pawar 
1407*c83a76b0SSuyog Pawar     /**
1408*c83a76b0SSuyog Pawar      *  Flag that indicates whether T, TR and TL candidates used
1409*c83a76b0SSuyog Pawar      *  are causal or projected
1410*c83a76b0SSuyog Pawar      */
1411*c83a76b0SSuyog Pawar     U08 proj_used;
1412*c83a76b0SSuyog Pawar 
1413*c83a76b0SSuyog Pawar } pred_ctxt_t;
1414*c83a76b0SSuyog Pawar 
1415*c83a76b0SSuyog Pawar /**
1416*c83a76b0SSuyog Pawar ******************************************************************************
1417*c83a76b0SSuyog Pawar  *  @struct  search_results_t
1418*c83a76b0SSuyog Pawar  *  @brief   For a given CU/blk, Stores all the results of ME search. Results
1419*c83a76b0SSuyog Pawar  *           are stored per partition, also the best results for CU are stored
1420*c83a76b0SSuyog Pawar  *           across partitions.
1421*c83a76b0SSuyog Pawar ******************************************************************************
1422*c83a76b0SSuyog Pawar  */
1423*c83a76b0SSuyog Pawar typedef struct
1424*c83a76b0SSuyog Pawar {
1425*c83a76b0SSuyog Pawar     /** Size of CU for which this structure used */
1426*c83a76b0SSuyog Pawar     CU_SIZE_T e_cu_size;
1427*c83a76b0SSuyog Pawar 
1428*c83a76b0SSuyog Pawar     /**
1429*c83a76b0SSuyog Pawar      * X and y offsets w.r.t. CTB start in encode layers. For non encode
1430*c83a76b0SSuyog Pawar      * layers, these may typically be 0
1431*c83a76b0SSuyog Pawar      */
1432*c83a76b0SSuyog Pawar     U08 u1_x_off;
1433*c83a76b0SSuyog Pawar     U08 u1_y_off;
1434*c83a76b0SSuyog Pawar 
1435*c83a76b0SSuyog Pawar     /** Number of best results for this CU stored */
1436*c83a76b0SSuyog Pawar     U08 u1_num_best_results;
1437*c83a76b0SSuyog Pawar 
1438*c83a76b0SSuyog Pawar     /** Number of results stored per partition. */
1439*c83a76b0SSuyog Pawar     U08 u1_num_results_per_part;
1440*c83a76b0SSuyog Pawar 
1441*c83a76b0SSuyog Pawar     /**
1442*c83a76b0SSuyog Pawar      * Number of result planes active. This may be different from total
1443*c83a76b0SSuyog Pawar      * number of active references during search. For example, we may
1444*c83a76b0SSuyog Pawar      * have 4 active ref, 2 ineach dirn, but active result planes may
1445*c83a76b0SSuyog Pawar      * only be 2, one for L0 and 1 for L1
1446*c83a76b0SSuyog Pawar      */
1447*c83a76b0SSuyog Pawar     U08 u1_num_active_ref;
1448*c83a76b0SSuyog Pawar     /**
1449*c83a76b0SSuyog Pawar      * mask of active partitions, Totally 17 bits. For a given partition
1450*c83a76b0SSuyog Pawar      * id, as per PART_ID_T enum the corresponding bit position is 1/0
1451*c83a76b0SSuyog Pawar      * indicating that partition is active or inactive
1452*c83a76b0SSuyog Pawar      */
1453*c83a76b0SSuyog Pawar     S32 i4_part_mask;
1454*c83a76b0SSuyog Pawar 
1455*c83a76b0SSuyog Pawar     /** Points to partial results for each partition id
1456*c83a76b0SSuyog Pawar      *  Temporary hack for the bug: If +1 is not kept,
1457*c83a76b0SSuyog Pawar      *  it doesn't bit match with older version
1458*c83a76b0SSuyog Pawar      */
1459*c83a76b0SSuyog Pawar     search_node_t *aps_part_results[MAX_NUM_REF][TOT_NUM_PARTS];
1460*c83a76b0SSuyog Pawar 
1461*c83a76b0SSuyog Pawar     /**
1462*c83a76b0SSuyog Pawar      * Ptr to best results for the current CU post bi pred evaluation and
1463*c83a76b0SSuyog Pawar      * intra mode insertions
1464*c83a76b0SSuyog Pawar      */
1465*c83a76b0SSuyog Pawar     inter_cu_results_t *ps_cu_results;
1466*c83a76b0SSuyog Pawar 
1467*c83a76b0SSuyog Pawar     /** 2 pred ctxts, one for L0 and one for L1 */
1468*c83a76b0SSuyog Pawar     pred_ctxt_t as_pred_ctxt[2];
1469*c83a76b0SSuyog Pawar 
1470*c83a76b0SSuyog Pawar     /**
1471*c83a76b0SSuyog Pawar      * Pointer to a table that indicates whether the ref id
1472*c83a76b0SSuyog Pawar      * corresponds to past or future dirn. Input is ref id Lc form
1473*c83a76b0SSuyog Pawar      */
1474*c83a76b0SSuyog Pawar 
1475*c83a76b0SSuyog Pawar     U08 *pu1_is_past;
1476*c83a76b0SSuyog Pawar 
1477*c83a76b0SSuyog Pawar     /**
1478*c83a76b0SSuyog Pawar      * Overall best CU cost, while other entries store CU costs
1479*c83a76b0SSuyog Pawar      * in single direction, this is best CU cost, where each
1480*c83a76b0SSuyog Pawar      * partition cost is evaluated as best of uni/bi
1481*c83a76b0SSuyog Pawar      */
1482*c83a76b0SSuyog Pawar     S32 best_cu_cost;
1483*c83a76b0SSuyog Pawar 
1484*c83a76b0SSuyog Pawar     /**
1485*c83a76b0SSuyog Pawar      * Split_flag which is used for deciding if 16x16 CU is split or not
1486*c83a76b0SSuyog Pawar      */
1487*c83a76b0SSuyog Pawar     U08 u1_split_flag;
1488*c83a76b0SSuyog Pawar } search_results_t;
1489*c83a76b0SSuyog Pawar 
1490*c83a76b0SSuyog Pawar /**
1491*c83a76b0SSuyog Pawar ******************************************************************************
1492*c83a76b0SSuyog Pawar  *  @struct  ctb_list_t
1493*c83a76b0SSuyog Pawar  *  @brief   Tree structure containing info for entire CTB. At top level
1494*c83a76b0SSuyog Pawar  *           it points to entire CTB results, with children nodes at each lvl
1495*c83a76b0SSuyog Pawar  *           being non null if split.
1496*c83a76b0SSuyog Pawar ******************************************************************************
1497*c83a76b0SSuyog Pawar  */
1498*c83a76b0SSuyog Pawar typedef struct ctb_list_t
1499*c83a76b0SSuyog Pawar {
1500*c83a76b0SSuyog Pawar     /** Indicates whether this level split further */
1501*c83a76b0SSuyog Pawar     U08 u1_is_split;
1502*c83a76b0SSuyog Pawar 
1503*c83a76b0SSuyog Pawar     /** Number of result candts present */
1504*c83a76b0SSuyog Pawar     U08 u1_num_candts;
1505*c83a76b0SSuyog Pawar 
1506*c83a76b0SSuyog Pawar     /**
1507*c83a76b0SSuyog Pawar      * Whether this level valid. E.g. if we are at boundary, where only
1508*c83a76b0SSuyog Pawar      * left 2 32x32 are within pic boundary, then the parent is force split
1509*c83a76b0SSuyog Pawar      * at the children level, TR and BR are invalid.
1510*c83a76b0SSuyog Pawar      */
1511*c83a76b0SSuyog Pawar     U08 u1_is_valid;
1512*c83a76b0SSuyog Pawar 
1513*c83a76b0SSuyog Pawar     /**
1514*c83a76b0SSuyog Pawar      * IF this level is 16x16 then this mask indicates which 8x8 blks
1515*c83a76b0SSuyog Pawar      * are valid
1516*c83a76b0SSuyog Pawar      */
1517*c83a76b0SSuyog Pawar     U08 u1_8x8_mask;
1518*c83a76b0SSuyog Pawar 
1519*c83a76b0SSuyog Pawar     /** Search results of this CU */
1520*c83a76b0SSuyog Pawar     search_results_t *ps_search_results;
1521*c83a76b0SSuyog Pawar 
1522*c83a76b0SSuyog Pawar     /** Search results of this CU */
1523*c83a76b0SSuyog Pawar     inter_cu_results_t *ps_cu_results;
1524*c83a76b0SSuyog Pawar 
1525*c83a76b0SSuyog Pawar     /** Pointers to leaf nodes, if CU is split further, else null */
1526*c83a76b0SSuyog Pawar     struct ctb_list_t *ps_tl;
1527*c83a76b0SSuyog Pawar     struct ctb_list_t *ps_tr;
1528*c83a76b0SSuyog Pawar     struct ctb_list_t *ps_bl;
1529*c83a76b0SSuyog Pawar     struct ctb_list_t *ps_br;
1530*c83a76b0SSuyog Pawar } ctb_list_t;
1531*c83a76b0SSuyog Pawar 
1532*c83a76b0SSuyog Pawar /**
1533*c83a76b0SSuyog Pawar ******************************************************************************
1534*c83a76b0SSuyog Pawar  *  @struct  layer_mv_t
1535*c83a76b0SSuyog Pawar  *  @brief   mv bank structure for a particular layer
1536*c83a76b0SSuyog Pawar ******************************************************************************
1537*c83a76b0SSuyog Pawar  */
1538*c83a76b0SSuyog Pawar typedef struct
1539*c83a76b0SSuyog Pawar {
1540*c83a76b0SSuyog Pawar     /** Number of mvs for a given ref/pred dirn */
1541*c83a76b0SSuyog Pawar     S32 i4_num_mvs_per_ref;
1542*c83a76b0SSuyog Pawar     /** Number of reference for which results stored */
1543*c83a76b0SSuyog Pawar     S32 i4_num_ref;
1544*c83a76b0SSuyog Pawar     /** Number of mvs stored per blk. Product of above two */
1545*c83a76b0SSuyog Pawar     S32 i4_num_mvs_per_blk;
1546*c83a76b0SSuyog Pawar     /** Block size of the unit for which MVs stored */
1547*c83a76b0SSuyog Pawar     BLK_SIZE_T e_blk_size;
1548*c83a76b0SSuyog Pawar     /** Number of blocks present per row */
1549*c83a76b0SSuyog Pawar     S32 i4_num_blks_per_row;
1550*c83a76b0SSuyog Pawar 
1551*c83a76b0SSuyog Pawar     /** Number of mvs stored every row */
1552*c83a76b0SSuyog Pawar     S32 i4_num_mvs_per_row;
1553*c83a76b0SSuyog Pawar 
1554*c83a76b0SSuyog Pawar     /**
1555*c83a76b0SSuyog Pawar      * Max number of mvs allowed per row. The main purpose of this variable
1556*c83a76b0SSuyog Pawar      * is to resolve or detect discrepanceis between allocation time mem
1557*c83a76b0SSuyog Pawar      * and run time mem, when alloc time resolution and run time resolution
1558*c83a76b0SSuyog Pawar      * may be different
1559*c83a76b0SSuyog Pawar      */
1560*c83a76b0SSuyog Pawar     S32 max_num_mvs_per_row;
1561*c83a76b0SSuyog Pawar 
1562*c83a76b0SSuyog Pawar     /**
1563*c83a76b0SSuyog Pawar      * Pointer to mvs of 0, 0 blk, This is different from base since the
1564*c83a76b0SSuyog Pawar      * mv bank is padded all sides
1565*c83a76b0SSuyog Pawar     */
1566*c83a76b0SSuyog Pawar     hme_mv_t *ps_mv;
1567*c83a76b0SSuyog Pawar 
1568*c83a76b0SSuyog Pawar     /** Pointer to base of mv bank mvs */
1569*c83a76b0SSuyog Pawar     hme_mv_t *ps_mv_base;
1570*c83a76b0SSuyog Pawar 
1571*c83a76b0SSuyog Pawar     /** Pointers to ref idx.One to one correspondence between this and ps_mv*/
1572*c83a76b0SSuyog Pawar     S08 *pi1_ref_idx;
1573*c83a76b0SSuyog Pawar     /** Base of ref ids just like in case of ps_mv */
1574*c83a76b0SSuyog Pawar     S08 *pi1_ref_idx_base;
1575*c83a76b0SSuyog Pawar 
1576*c83a76b0SSuyog Pawar     /** Part mask for every blk, if stored, 1 per blk */
1577*c83a76b0SSuyog Pawar     U08 *pu1_part_mask;
1578*c83a76b0SSuyog Pawar } layer_mv_t;
1579*c83a76b0SSuyog Pawar 
1580*c83a76b0SSuyog Pawar /**
1581*c83a76b0SSuyog Pawar ******************************************************************************
1582*c83a76b0SSuyog Pawar  *  @struct  mv_hist_t
1583*c83a76b0SSuyog Pawar  *  @brief   Histogram structure to calculate global mvs
1584*c83a76b0SSuyog Pawar ******************************************************************************
1585*c83a76b0SSuyog Pawar  */
1586*c83a76b0SSuyog Pawar typedef struct
1587*c83a76b0SSuyog Pawar {
1588*c83a76b0SSuyog Pawar     S32 i4_num_rows;
1589*c83a76b0SSuyog Pawar     S32 i4_num_cols;
1590*c83a76b0SSuyog Pawar     S32 i4_shift_x;
1591*c83a76b0SSuyog Pawar     S32 i4_shift_y;
1592*c83a76b0SSuyog Pawar     S32 i4_lobe1_size;
1593*c83a76b0SSuyog Pawar     S32 i4_lobe2_size;
1594*c83a76b0SSuyog Pawar     S32 i4_min_x;
1595*c83a76b0SSuyog Pawar     S32 i4_min_y;
1596*c83a76b0SSuyog Pawar     S32 i4_num_bins;
1597*c83a76b0SSuyog Pawar     S32 ai4_bin_count[MAX_NUM_BINS];
1598*c83a76b0SSuyog Pawar } mv_hist_t;
1599*c83a76b0SSuyog Pawar 
1600*c83a76b0SSuyog Pawar typedef struct
1601*c83a76b0SSuyog Pawar {
1602*c83a76b0SSuyog Pawar     U08 u1_is_past;
1603*c83a76b0SSuyog Pawar } ref_attr_t;
1604*c83a76b0SSuyog Pawar 
1605*c83a76b0SSuyog Pawar /**
1606*c83a76b0SSuyog Pawar ******************************************************************************
1607*c83a76b0SSuyog Pawar  *  @struct  layer_ctxt_t
1608*c83a76b0SSuyog Pawar  *  @brief   Complete information for the layer
1609*c83a76b0SSuyog Pawar ******************************************************************************
1610*c83a76b0SSuyog Pawar  */
1611*c83a76b0SSuyog Pawar typedef struct
1612*c83a76b0SSuyog Pawar {
1613*c83a76b0SSuyog Pawar     /** Display Width of this layer */
1614*c83a76b0SSuyog Pawar     S32 i4_disp_wd;
1615*c83a76b0SSuyog Pawar     /** Display height of this layer */
1616*c83a76b0SSuyog Pawar     S32 i4_disp_ht;
1617*c83a76b0SSuyog Pawar     /** Width of this layer */
1618*c83a76b0SSuyog Pawar     S32 i4_wd;
1619*c83a76b0SSuyog Pawar     /** height of this layer */
1620*c83a76b0SSuyog Pawar     S32 i4_ht;
1621*c83a76b0SSuyog Pawar     /** Amount of padding of input in x dirn */
1622*c83a76b0SSuyog Pawar     S32 i4_pad_x_inp;
1623*c83a76b0SSuyog Pawar     /** Amount of padding of input in y dirn */
1624*c83a76b0SSuyog Pawar     S32 i4_pad_y_inp;
1625*c83a76b0SSuyog Pawar     /** Padding amount of recon in x dirn */
1626*c83a76b0SSuyog Pawar     S32 i4_pad_x_rec;
1627*c83a76b0SSuyog Pawar     /** padding amt of recon in y dirn */
1628*c83a76b0SSuyog Pawar     S32 i4_pad_y_rec;
1629*c83a76b0SSuyog Pawar 
1630*c83a76b0SSuyog Pawar     /**
1631*c83a76b0SSuyog Pawar      * Offset for recon. Since recon has padding, the 0, 0 start differs
1632*c83a76b0SSuyog Pawar      * from base of buffer
1633*c83a76b0SSuyog Pawar      */
1634*c83a76b0SSuyog Pawar     S32 i4_rec_offset;
1635*c83a76b0SSuyog Pawar     /** Offset for input, same explanation as recon */
1636*c83a76b0SSuyog Pawar     S32 i4_inp_offset;
1637*c83a76b0SSuyog Pawar     /** stride of input buffer */
1638*c83a76b0SSuyog Pawar     S32 i4_inp_stride;
1639*c83a76b0SSuyog Pawar     /** stride of recon buffer */
1640*c83a76b0SSuyog Pawar     S32 i4_rec_stride;
1641*c83a76b0SSuyog Pawar     /** Pic order count */
1642*c83a76b0SSuyog Pawar     S32 i4_poc;
1643*c83a76b0SSuyog Pawar     /** input pointer. */
1644*c83a76b0SSuyog Pawar     U08 *pu1_inp;
1645*c83a76b0SSuyog Pawar     /** Base of input. Add inp_offset to go to 0, 0 locn */
1646*c83a76b0SSuyog Pawar     U08 *pu1_inp_base;
1647*c83a76b0SSuyog Pawar 
1648*c83a76b0SSuyog Pawar     /** Pointer to 4 hpel recon planes */
1649*c83a76b0SSuyog Pawar     U08 *pu1_rec_fxfy;
1650*c83a76b0SSuyog Pawar     U08 *pu1_rec_hxfy;
1651*c83a76b0SSuyog Pawar     U08 *pu1_rec_fxhy;
1652*c83a76b0SSuyog Pawar     U08 *pu1_rec_hxhy;
1653*c83a76b0SSuyog Pawar 
1654*c83a76b0SSuyog Pawar     /** Global mv, one set per reference searched */
1655*c83a76b0SSuyog Pawar     hme_mv_t s_global_mv[MAX_NUM_REF][NUM_GMV_LOBES];
1656*c83a76b0SSuyog Pawar 
1657*c83a76b0SSuyog Pawar     /** Layer MV bank */
1658*c83a76b0SSuyog Pawar     layer_mv_t *ps_layer_mvbank;
1659*c83a76b0SSuyog Pawar 
1660*c83a76b0SSuyog Pawar     /** Pointer to list of recon buffers for each ref id, one ptr per plane */
1661*c83a76b0SSuyog Pawar     U08 **ppu1_list_rec_fxfy;
1662*c83a76b0SSuyog Pawar     U08 **ppu1_list_rec_hxfy;
1663*c83a76b0SSuyog Pawar     U08 **ppu1_list_rec_fxhy;
1664*c83a76b0SSuyog Pawar     U08 **ppu1_list_rec_hxhy;
1665*c83a76b0SSuyog Pawar 
1666*c83a76b0SSuyog Pawar     void **ppv_dep_mngr_recon;
1667*c83a76b0SSuyog Pawar 
1668*c83a76b0SSuyog Pawar     /** Pointer to list of input buffers for each ref id, one ptr per plane */
1669*c83a76b0SSuyog Pawar     U08 **ppu1_list_inp;
1670*c83a76b0SSuyog Pawar 
1671*c83a76b0SSuyog Pawar     /** Max MV in x and y direction supported at this layer resolution */
1672*c83a76b0SSuyog Pawar     S16 i2_max_mv_x;
1673*c83a76b0SSuyog Pawar     S16 i2_max_mv_y;
1674*c83a76b0SSuyog Pawar 
1675*c83a76b0SSuyog Pawar     /** Converts ref id (as per Lc list) to POC */
1676*c83a76b0SSuyog Pawar     S32 ai4_ref_id_to_poc_lc[MAX_NUM_REF];
1677*c83a76b0SSuyog Pawar 
1678*c83a76b0SSuyog Pawar     S32 ai4_ref_id_to_disp_num[MAX_NUM_REF];
1679*c83a76b0SSuyog Pawar 
1680*c83a76b0SSuyog Pawar     /** status of the buffer */
1681*c83a76b0SSuyog Pawar     S32 i4_is_free;
1682*c83a76b0SSuyog Pawar 
1683*c83a76b0SSuyog Pawar     /** idr gop number */
1684*c83a76b0SSuyog Pawar     S32 i4_idr_gop_num;
1685*c83a76b0SSuyog Pawar 
1686*c83a76b0SSuyog Pawar     /** is reference picture */
1687*c83a76b0SSuyog Pawar     S32 i4_is_reference;
1688*c83a76b0SSuyog Pawar 
1689*c83a76b0SSuyog Pawar     /** is non reference picture processed by me*/
1690*c83a76b0SSuyog Pawar     S32 i4_non_ref_free;
1691*c83a76b0SSuyog Pawar 
1692*c83a76b0SSuyog Pawar } layer_ctxt_t;
1693*c83a76b0SSuyog Pawar 
1694*c83a76b0SSuyog Pawar typedef S32 (*PF_MV_COST_FXN)(search_node_t *, pred_ctxt_t *, PART_ID_T, S32);
1695*c83a76b0SSuyog Pawar 
1696*c83a76b0SSuyog Pawar /**
1697*c83a76b0SSuyog Pawar  ******************************************************************************
1698*c83a76b0SSuyog Pawar  *  @struct refine_prms_t
1699*c83a76b0SSuyog Pawar  *  @brief  All the configurable input parameters for the refinement layer
1700*c83a76b0SSuyog Pawar  *
1701*c83a76b0SSuyog Pawar  *  @param encode: Whether this layer is encoded or not
1702*c83a76b0SSuyog Pawar  *  @param explicit_ref: If enabled, then the number of reference frames to
1703*c83a76b0SSuyog Pawar  *                       be searched is a function of coarsest layer num ref
1704*c83a76b0SSuyog Pawar                          frames. Else, number of references collapsed to 1/2
1705*c83a76b0SSuyog Pawar  *  @param i4_num_fpel_results : Number of full pel results to be allowed
1706*c83a76b0SSuyog Pawar  *  @param i4_num_results_per_part: Number of results stored per partition
1707*c83a76b0SSuyog Pawar  *  @param e_search_complexity: Decides the number of initial candts, refer
1708*c83a76b0SSuyog Pawar  *                               to SEARCH_COMPLEXITY_T
1709*c83a76b0SSuyog Pawar  *  @param i4_use_rec_in_fpel: Whether to use input buf or recon buf in fpel
1710*c83a76b0SSuyog Pawar  *  @param i4_enable_4x4_part : if encode is 0, we use 8x8 blks, if this param
1711*c83a76b0SSuyog Pawar                                 enabled, then we do 4x4 partial sad update
1712*c83a76b0SSuyog Pawar  *  @param i4_layer_id        : id of this layer (0 = finest)
1713*c83a76b0SSuyog Pawar  *  @param i4_num_32x32_merge_results: number of 32x32 merged results stored
1714*c83a76b0SSuyog Pawar  *  @param i4_num_64x64_merge_results: number of 64x64 merged results stored
1715*c83a76b0SSuyog Pawar  *  @param i4_use_satd_cu_merge: Use SATD during CU merge
1716*c83a76b0SSuyog Pawar  *  @param i4_num_steps_hpel_refine : Number of steps during hpel refinement
1717*c83a76b0SSuyog Pawar  *  @param i4_num_steps_qpel_refine : Same as above but for qpel
1718*c83a76b0SSuyog Pawar  *  @param i4_use_satd_subpel : Use of SATD or SAD for subpel
1719*c83a76b0SSuyog Pawar  ******************************************************************************
1720*c83a76b0SSuyog Pawar */
1721*c83a76b0SSuyog Pawar typedef struct
1722*c83a76b0SSuyog Pawar {
1723*c83a76b0SSuyog Pawar     /* This array is used to place upper bounds on the number of search candidates */
1724*c83a76b0SSuyog Pawar     /* that can be used per 'search cand location' */
1725*c83a76b0SSuyog Pawar     U08 au1_num_fpel_search_cands[NUM_SEARCH_CAND_LOCATIONS];
1726*c83a76b0SSuyog Pawar 
1727*c83a76b0SSuyog Pawar     U08 u1_max_2nx2n_tu_recur_cands;
1728*c83a76b0SSuyog Pawar 
1729*c83a76b0SSuyog Pawar     U08 u1_max_num_fpel_refine_centers;
1730*c83a76b0SSuyog Pawar 
1731*c83a76b0SSuyog Pawar     U08 u1_max_num_subpel_refine_centers;
1732*c83a76b0SSuyog Pawar 
1733*c83a76b0SSuyog Pawar     S32 i4_encode;
1734*c83a76b0SSuyog Pawar     S32 explicit_ref;
1735*c83a76b0SSuyog Pawar     S32 i4_num_ref_fpel;
1736*c83a76b0SSuyog Pawar     S32 i4_num_fpel_results;
1737*c83a76b0SSuyog Pawar 
1738*c83a76b0SSuyog Pawar     S32 i4_num_results_per_part;
1739*c83a76b0SSuyog Pawar 
1740*c83a76b0SSuyog Pawar     S32 i4_num_mvbank_results;
1741*c83a76b0SSuyog Pawar     SEARCH_COMPLEXITY_T e_search_complexity;
1742*c83a76b0SSuyog Pawar     S32 i4_use_rec_in_fpel;
1743*c83a76b0SSuyog Pawar 
1744*c83a76b0SSuyog Pawar     S32 i4_enable_4x4_part;
1745*c83a76b0SSuyog Pawar     S32 i4_layer_id;
1746*c83a76b0SSuyog Pawar 
1747*c83a76b0SSuyog Pawar     S32 i4_num_32x32_merge_results;
1748*c83a76b0SSuyog Pawar     S32 i4_num_64x64_merge_results;
1749*c83a76b0SSuyog Pawar 
1750*c83a76b0SSuyog Pawar     S32 i4_use_satd_cu_merge;
1751*c83a76b0SSuyog Pawar 
1752*c83a76b0SSuyog Pawar     S32 i4_num_steps_post_refine_fpel;
1753*c83a76b0SSuyog Pawar     S32 i4_num_steps_fpel_refine;
1754*c83a76b0SSuyog Pawar     S32 i4_num_steps_hpel_refine;
1755*c83a76b0SSuyog Pawar     S32 i4_num_steps_qpel_refine;
1756*c83a76b0SSuyog Pawar     S32 i4_use_satd_subpel;
1757*c83a76b0SSuyog Pawar 
1758*c83a76b0SSuyog Pawar     double *pd_intra_costs;
1759*c83a76b0SSuyog Pawar     S32 bidir_enabled;
1760*c83a76b0SSuyog Pawar     S32 lambda_inp;
1761*c83a76b0SSuyog Pawar     S32 lambda_recon;
1762*c83a76b0SSuyog Pawar     S32 lambda_q_shift;
1763*c83a76b0SSuyog Pawar 
1764*c83a76b0SSuyog Pawar     S32 limit_active_partitions;
1765*c83a76b0SSuyog Pawar 
1766*c83a76b0SSuyog Pawar     S32 sdi_threshold;
1767*c83a76b0SSuyog Pawar 
1768*c83a76b0SSuyog Pawar     U08 u1_use_lambda_derived_from_min_8x8_act_in_ctb;
1769*c83a76b0SSuyog Pawar 
1770*c83a76b0SSuyog Pawar     U08 u1_max_subpel_candts;
1771*c83a76b0SSuyog Pawar 
1772*c83a76b0SSuyog Pawar     U08 u1_max_subpel_candts_2Nx2N;
1773*c83a76b0SSuyog Pawar     U08 u1_max_subpel_candts_NxN;
1774*c83a76b0SSuyog Pawar 
1775*c83a76b0SSuyog Pawar     U08 u1_subpel_candt_threshold;
1776*c83a76b0SSuyog Pawar 
1777*c83a76b0SSuyog Pawar     /* Pointer to the array which has num best results for
1778*c83a76b0SSuyog Pawar         fpel refinement */
1779*c83a76b0SSuyog Pawar     U08 *pu1_num_best_results;
1780*c83a76b0SSuyog Pawar 
1781*c83a76b0SSuyog Pawar } refine_prms_t;
1782*c83a76b0SSuyog Pawar 
1783*c83a76b0SSuyog Pawar /**
1784*c83a76b0SSuyog Pawar ******************************************************************************
1785*c83a76b0SSuyog Pawar  *  @struct  coarse_prms_t
1786*c83a76b0SSuyog Pawar  *  @brief   All the parameters passed to coarse layer search
1787*c83a76b0SSuyog Pawar ******************************************************************************
1788*c83a76b0SSuyog Pawar  */
1789*c83a76b0SSuyog Pawar typedef struct
1790*c83a76b0SSuyog Pawar {
1791*c83a76b0SSuyog Pawar     /** ID of this layer, typically N-1 where N is tot layers */
1792*c83a76b0SSuyog Pawar     S32 i4_layer_id;
1793*c83a76b0SSuyog Pawar 
1794*c83a76b0SSuyog Pawar     /** Initial step size, valid if full search disabled */
1795*c83a76b0SSuyog Pawar     S32 i4_start_step;
1796*c83a76b0SSuyog Pawar 
1797*c83a76b0SSuyog Pawar     /** Maximum number of iterations to consider if full search disabled */
1798*c83a76b0SSuyog Pawar     S32 i4_max_iters;
1799*c83a76b0SSuyog Pawar 
1800*c83a76b0SSuyog Pawar     /** Number of reference frames to search */
1801*c83a76b0SSuyog Pawar     S32 i4_num_ref;
1802*c83a76b0SSuyog Pawar 
1803*c83a76b0SSuyog Pawar     /** Number of best results to maintain at this layer for projection */
1804*c83a76b0SSuyog Pawar     S32 num_results;
1805*c83a76b0SSuyog Pawar 
1806*c83a76b0SSuyog Pawar     /**
1807*c83a76b0SSuyog Pawar      * Enable or disable full search, if disabled then, we search around initial
1808*c83a76b0SSuyog Pawar      * candidates with early exit
1809*c83a76b0SSuyog Pawar      */
1810*c83a76b0SSuyog Pawar     S32 do_full_search;
1811*c83a76b0SSuyog Pawar 
1812*c83a76b0SSuyog Pawar     /** Values of lambda and the Q format */
1813*c83a76b0SSuyog Pawar     S32 lambda;
1814*c83a76b0SSuyog Pawar     S32 lambda_q_shift;
1815*c83a76b0SSuyog Pawar 
1816*c83a76b0SSuyog Pawar     /** Step size for full search 2/4 */
1817*c83a76b0SSuyog Pawar     S32 full_search_step;
1818*c83a76b0SSuyog Pawar 
1819*c83a76b0SSuyog Pawar } coarse_prms_t;
1820*c83a76b0SSuyog Pawar 
1821*c83a76b0SSuyog Pawar typedef struct
1822*c83a76b0SSuyog Pawar {
1823*c83a76b0SSuyog Pawar     /**
1824*c83a76b0SSuyog Pawar      * These pointers point to modified input, one each for one ref idx.
1825*c83a76b0SSuyog Pawar      * Instead of weighting the reference, we weight the input with inverse
1826*c83a76b0SSuyog Pawar      * wt and offset.
1827*c83a76b0SSuyog Pawar      * +1 for storing non weighted input
1828*c83a76b0SSuyog Pawar      */
1829*c83a76b0SSuyog Pawar     U08 *apu1_wt_inp[MAX_NUM_REF + 1];
1830*c83a76b0SSuyog Pawar 
1831*c83a76b0SSuyog Pawar     /* These are allocated once at the start of encoding */
1832*c83a76b0SSuyog Pawar     /* These are necessary only if wt_pred is switched on */
1833*c83a76b0SSuyog Pawar     /* Else, only a single buffer is used to store the */
1834*c83a76b0SSuyog Pawar     /* unweighed input */
1835*c83a76b0SSuyog Pawar     U08 *apu1_wt_inp_buf_array[MAX_NUM_REF + 1];
1836*c83a76b0SSuyog Pawar 
1837*c83a76b0SSuyog Pawar     /** Stores the weights and offsets for each ref */
1838*c83a76b0SSuyog Pawar     S32 a_wpred_wt[MAX_NUM_REF];
1839*c83a76b0SSuyog Pawar     S32 a_inv_wpred_wt[MAX_NUM_REF];
1840*c83a76b0SSuyog Pawar     S32 a_wpred_off[MAX_NUM_REF];
1841*c83a76b0SSuyog Pawar     S32 wpred_log_wdc;
1842*c83a76b0SSuyog Pawar 
1843*c83a76b0SSuyog Pawar     S32 ai4_shift_val[MAX_NUM_REF];
1844*c83a76b0SSuyog Pawar } wgt_pred_ctxt_t;
1845*c83a76b0SSuyog Pawar 
1846*c83a76b0SSuyog Pawar /**
1847*c83a76b0SSuyog Pawar ******************************************************************************
1848*c83a76b0SSuyog Pawar  *  @struct  mv_refine_ctxt_t
1849*c83a76b0SSuyog Pawar  *  @brief   This structure contains important parameters used motion vector
1850*c83a76b0SSuyog Pawar              refinement
1851*c83a76b0SSuyog Pawar ******************************************************************************
1852*c83a76b0SSuyog Pawar  */
1853*c83a76b0SSuyog Pawar typedef struct
1854*c83a76b0SSuyog Pawar {
1855*c83a76b0SSuyog Pawar     /* Added +7 in the array sizes below to make every array dimension
1856*c83a76b0SSuyog Pawar     16-byte aligned */
1857*c83a76b0SSuyog Pawar     /** Cost of best candidate for each partition*/
1858*c83a76b0SSuyog Pawar     MEM_ALIGN16 WORD16 i2_tot_cost[2][TOT_NUM_PARTS + 7];
1859*c83a76b0SSuyog Pawar 
1860*c83a76b0SSuyog Pawar     MEM_ALIGN16 WORD16 i2_stim_injected_cost[2][TOT_NUM_PARTS + 7];
1861*c83a76b0SSuyog Pawar 
1862*c83a76b0SSuyog Pawar     /** Motion vector cost for the best candidate of each partition*/
1863*c83a76b0SSuyog Pawar     MEM_ALIGN16 WORD16 i2_mv_cost[2][TOT_NUM_PARTS + 7];
1864*c83a76b0SSuyog Pawar     /** X component of the motion vector of the best candidate of each partition*/
1865*c83a76b0SSuyog Pawar     MEM_ALIGN16 WORD16 i2_mv_x[2][TOT_NUM_PARTS + 7];
1866*c83a76b0SSuyog Pawar     /** Y component of the motion vector of the best candidate of each partition*/
1867*c83a76b0SSuyog Pawar     MEM_ALIGN16 WORD16 i2_mv_y[2][TOT_NUM_PARTS + 7];
1868*c83a76b0SSuyog Pawar     /** Reference index of the best candidate of each partition*/
1869*c83a76b0SSuyog Pawar     MEM_ALIGN16 WORD16 i2_ref_idx[2][TOT_NUM_PARTS + 7];
1870*c83a76b0SSuyog Pawar 
1871*c83a76b0SSuyog Pawar     /** Partition id for the various partitions*/
1872*c83a76b0SSuyog Pawar     WORD32 ai4_part_id[TOT_NUM_PARTS + 1];
1873*c83a76b0SSuyog Pawar     /** Indicates the total number of valid partitions*/
1874*c83a76b0SSuyog Pawar     WORD32 i4_num_valid_parts;
1875*c83a76b0SSuyog Pawar 
1876*c83a76b0SSuyog Pawar     /** Number of candidates to refine through*/
1877*c83a76b0SSuyog Pawar     WORD32 i4_num_search_nodes;
1878*c83a76b0SSuyog Pawar 
1879*c83a76b0SSuyog Pawar     /** Stores the satd at the end of fullpel refinement*/
1880*c83a76b0SSuyog Pawar     WORD16 ai2_fullpel_satd[2][TOT_NUM_PARTS];
1881*c83a76b0SSuyog Pawar } mv_refine_ctxt_t;
1882*c83a76b0SSuyog Pawar 
1883*c83a76b0SSuyog Pawar typedef mv_refine_ctxt_t fullpel_refine_ctxt_t;
1884*c83a76b0SSuyog Pawar typedef mv_refine_ctxt_t subpel_refine_ctxt_t;
1885*c83a76b0SSuyog Pawar /**
1886*c83a76b0SSuyog Pawar ******************************************************************************
1887*c83a76b0SSuyog Pawar  *  @struct  hme_search_prms_t
1888*c83a76b0SSuyog Pawar  *  @brief   All prms going to any fpel search
1889*c83a76b0SSuyog Pawar ******************************************************************************
1890*c83a76b0SSuyog Pawar  */
1891*c83a76b0SSuyog Pawar typedef struct
1892*c83a76b0SSuyog Pawar {
1893*c83a76b0SSuyog Pawar     /** for explicit search, indicates which ref frm to search */
1894*c83a76b0SSuyog Pawar     /** for implicit search, indicates the prediction direction for search */
1895*c83a76b0SSuyog Pawar     S08 i1_ref_idx;
1896*c83a76b0SSuyog Pawar 
1897*c83a76b0SSuyog Pawar     /** Blk size used for search, and for which the search is done */
1898*c83a76b0SSuyog Pawar     BLK_SIZE_T e_blk_size;
1899*c83a76b0SSuyog Pawar 
1900*c83a76b0SSuyog Pawar     /** Number of init candts being searched */
1901*c83a76b0SSuyog Pawar     S32 i4_num_init_candts;
1902*c83a76b0SSuyog Pawar 
1903*c83a76b0SSuyog Pawar     S32 i4_num_steps_post_refine;
1904*c83a76b0SSuyog Pawar 
1905*c83a76b0SSuyog Pawar     /**
1906*c83a76b0SSuyog Pawar      * For coarser searches, bigger refinement is done around each candt
1907*c83a76b0SSuyog Pawar      * in these cases, this prm has start step
1908*c83a76b0SSuyog Pawar      */
1909*c83a76b0SSuyog Pawar     S32 i4_start_step;
1910*c83a76b0SSuyog Pawar 
1911*c83a76b0SSuyog Pawar     /** whether SATD to be used for srch */
1912*c83a76b0SSuyog Pawar     S32 i4_use_satd;
1913*c83a76b0SSuyog Pawar 
1914*c83a76b0SSuyog Pawar     /** if 1, we use recon frm for search (closed loop ) */
1915*c83a76b0SSuyog Pawar     S32 i4_use_rec;
1916*c83a76b0SSuyog Pawar 
1917*c83a76b0SSuyog Pawar     /** bitmask of active partitions */
1918*c83a76b0SSuyog Pawar     S32 i4_part_mask;
1919*c83a76b0SSuyog Pawar 
1920*c83a76b0SSuyog Pawar     /** x and y offset of blk w.r.t. pic start */
1921*c83a76b0SSuyog Pawar     S32 i4_x_off;
1922*c83a76b0SSuyog Pawar     S32 i4_y_off;
1923*c83a76b0SSuyog Pawar 
1924*c83a76b0SSuyog Pawar     /**
1925*c83a76b0SSuyog Pawar      * max number of iterations to search if early exit not hit
1926*c83a76b0SSuyog Pawar      * relevant only for coarser searches
1927*c83a76b0SSuyog Pawar      */
1928*c83a76b0SSuyog Pawar     S32 i4_max_iters;
1929*c83a76b0SSuyog Pawar 
1930*c83a76b0SSuyog Pawar     /** pointer to str holding all results for this blk */
1931*c83a76b0SSuyog Pawar     search_results_t *ps_search_results;
1932*c83a76b0SSuyog Pawar 
1933*c83a76b0SSuyog Pawar     /** pts to str having all search candt with refinement info */
1934*c83a76b0SSuyog Pawar     search_candt_t *ps_search_candts;
1935*c83a76b0SSuyog Pawar     /** pts to str having valid mv range info for this blk */
1936*c83a76b0SSuyog Pawar     range_prms_t *aps_mv_range[MAX_NUM_REF];
1937*c83a76b0SSuyog Pawar     /** cost compute fxnptr */
1938*c83a76b0SSuyog Pawar     PF_MV_COST_FXN pf_mv_cost_compute;
1939*c83a76b0SSuyog Pawar 
1940*c83a76b0SSuyog Pawar     /** when this str is set up for full search, indicates step size for same */
1941*c83a76b0SSuyog Pawar     S32 full_search_step;
1942*c83a76b0SSuyog Pawar 
1943*c83a76b0SSuyog Pawar     /** stride ofinp buffer */
1944*c83a76b0SSuyog Pawar     S32 i4_inp_stride;
1945*c83a76b0SSuyog Pawar 
1946*c83a76b0SSuyog Pawar     /** x and y offset of cu w.r.t. ctb start, set to 0 for non enc layer */
1947*c83a76b0SSuyog Pawar     S32 i4_cu_x_off;
1948*c83a76b0SSuyog Pawar     S32 i4_cu_y_off;
1949*c83a76b0SSuyog Pawar 
1950*c83a76b0SSuyog Pawar     /** base pointer to the de-duplicated search nodes */
1951*c83a76b0SSuyog Pawar     search_node_t *ps_search_nodes;
1952*c83a76b0SSuyog Pawar 
1953*c83a76b0SSuyog Pawar     /** number of de-duplicated nodes to be searched */
1954*c83a76b0SSuyog Pawar     S32 i4_num_search_nodes;
1955*c83a76b0SSuyog Pawar 
1956*c83a76b0SSuyog Pawar     fullpel_refine_ctxt_t *ps_fullpel_refine_ctxt;
1957*c83a76b0SSuyog Pawar 
1958*c83a76b0SSuyog Pawar     U32 au4_src_variance[TOT_NUM_PARTS];
1959*c83a76b0SSuyog Pawar 
1960*c83a76b0SSuyog Pawar     S32 i4_alpha_stim_multiplier;
1961*c83a76b0SSuyog Pawar 
1962*c83a76b0SSuyog Pawar     U08 u1_is_cu_noisy;
1963*c83a76b0SSuyog Pawar 
1964*c83a76b0SSuyog Pawar     ULWORD64 *pu8_part_src_sigmaX;
1965*c83a76b0SSuyog Pawar     ULWORD64 *pu8_part_src_sigmaXSquared;
1966*c83a76b0SSuyog Pawar 
1967*c83a76b0SSuyog Pawar } hme_search_prms_t;
1968*c83a76b0SSuyog Pawar 
1969*c83a76b0SSuyog Pawar /**
1970*c83a76b0SSuyog Pawar ******************************************************************************
1971*c83a76b0SSuyog Pawar  *  @struct  hme_err_prms_t
1972*c83a76b0SSuyog Pawar  *  @brief   This is input prms struct for SAD/SATD computation
1973*c83a76b0SSuyog Pawar ******************************************************************************
1974*c83a76b0SSuyog Pawar  */
1975*c83a76b0SSuyog Pawar typedef struct
1976*c83a76b0SSuyog Pawar {
1977*c83a76b0SSuyog Pawar     /** Ptr to input blk for which err computed */
1978*c83a76b0SSuyog Pawar     U08 *pu1_inp;
1979*c83a76b0SSuyog Pawar 
1980*c83a76b0SSuyog Pawar     U16 *pu2_inp;
1981*c83a76b0SSuyog Pawar 
1982*c83a76b0SSuyog Pawar     /** Ptr to ref blk after adjusting for mv and coordinates in pic */
1983*c83a76b0SSuyog Pawar     U08 *pu1_ref;
1984*c83a76b0SSuyog Pawar 
1985*c83a76b0SSuyog Pawar     U16 *pu2_ref;
1986*c83a76b0SSuyog Pawar 
1987*c83a76b0SSuyog Pawar     /** Stride of input buffer */
1988*c83a76b0SSuyog Pawar     S32 i4_inp_stride;
1989*c83a76b0SSuyog Pawar     /** Stride of ref buffer */
1990*c83a76b0SSuyog Pawar     S32 i4_ref_stride;
1991*c83a76b0SSuyog Pawar     /** Mask of active partitions. */
1992*c83a76b0SSuyog Pawar     S32 i4_part_mask;
1993*c83a76b0SSuyog Pawar     /** Mask of active grid pts. Refer to GRID_PT_T enum for bit posns */
1994*c83a76b0SSuyog Pawar     S32 i4_grid_mask;
1995*c83a76b0SSuyog Pawar     /**
1996*c83a76b0SSuyog Pawar      * Pointer to SAD Grid where SADs for each partition are stored.
1997*c83a76b0SSuyog Pawar      * The layout is as follows: If there are M total partitions
1998*c83a76b0SSuyog Pawar      * and N active pts in the grid, then the first N results contain
1999*c83a76b0SSuyog Pawar      * first partition, e.g. 2Nx2N. Next N results contain 2nd partitino
2000*c83a76b0SSuyog Pawar      * sad, e.g. 2NxN_T. Totally we have MxN results.
2001*c83a76b0SSuyog Pawar      * Note: The active partition count may be lesser than M, still we
2002*c83a76b0SSuyog Pawar      * have results for M partitions
2003*c83a76b0SSuyog Pawar      */
2004*c83a76b0SSuyog Pawar     S32 *pi4_sad_grid;
2005*c83a76b0SSuyog Pawar 
2006*c83a76b0SSuyog Pawar     /** Pointer to TU_SPLIT grid flags */
2007*c83a76b0SSuyog Pawar     S32 *pi4_tu_split_flags;
2008*c83a76b0SSuyog Pawar 
2009*c83a76b0SSuyog Pawar     /** Pointer to the Child's satd cost */
2010*c83a76b0SSuyog Pawar     S32 *pi4_child_cost;
2011*c83a76b0SSuyog Pawar 
2012*c83a76b0SSuyog Pawar     /** pointer to the child'd TU_split flags */
2013*c83a76b0SSuyog Pawar     S32 *pi4_child_tu_split_flags;
2014*c83a76b0SSuyog Pawar 
2015*c83a76b0SSuyog Pawar     /** pointer to the child'd TU_early_cbf flags */
2016*c83a76b0SSuyog Pawar     S32 *pi4_child_tu_early_cbf;
2017*c83a76b0SSuyog Pawar 
2018*c83a76b0SSuyog Pawar     /** Pointer to TU early CBF flags */
2019*c83a76b0SSuyog Pawar     S32 *pi4_tu_early_cbf;
2020*c83a76b0SSuyog Pawar 
2021*c83a76b0SSuyog Pawar     /** pointer to the early cbf thresholds */
2022*c83a76b0SSuyog Pawar     S32 *pi4_tu_early_cbf_threshold;
2023*c83a76b0SSuyog Pawar 
2024*c83a76b0SSuyog Pawar     /** store the DC value */
2025*c83a76b0SSuyog Pawar     S32 i4_dc_val;
2026*c83a76b0SSuyog Pawar 
2027*c83a76b0SSuyog Pawar     /** Block width and ht of the block being evaluated for SAD */
2028*c83a76b0SSuyog Pawar     S32 i4_blk_wd;
2029*c83a76b0SSuyog Pawar     S32 i4_blk_ht;
2030*c83a76b0SSuyog Pawar 
2031*c83a76b0SSuyog Pawar     /**
2032*c83a76b0SSuyog Pawar      * Array of valid partition ids. E.g. if 2 partitions active,
2033*c83a76b0SSuyog Pawar      * then there will be 3 entries, 3rd entry being -1
2034*c83a76b0SSuyog Pawar      */
2035*c83a76b0SSuyog Pawar     S32 *pi4_valid_part_ids;
2036*c83a76b0SSuyog Pawar     /** Step size of the grid */
2037*c83a76b0SSuyog Pawar     S32 i4_step;
2038*c83a76b0SSuyog Pawar 
2039*c83a76b0SSuyog Pawar     /* Number of partitions */
2040*c83a76b0SSuyog Pawar     S32 i4_num_partitions;
2041*c83a76b0SSuyog Pawar 
2042*c83a76b0SSuyog Pawar     /** Store the tu_spli_flag cost */
2043*c83a76b0SSuyog Pawar     S32 i4_tu_split_cost;
2044*c83a76b0SSuyog Pawar 
2045*c83a76b0SSuyog Pawar     /** The max_depth for inter tu_tree */
2046*c83a76b0SSuyog Pawar     U08 u1_max_tr_depth;
2047*c83a76b0SSuyog Pawar 
2048*c83a76b0SSuyog Pawar     U08 u1_max_tr_size;
2049*c83a76b0SSuyog Pawar 
2050*c83a76b0SSuyog Pawar     /** Scratch memory for Doing hadamard */
2051*c83a76b0SSuyog Pawar     U08 *pu1_wkg_mem;
2052*c83a76b0SSuyog Pawar 
2053*c83a76b0SSuyog Pawar     ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list;
2054*c83a76b0SSuyog Pawar 
2055*c83a76b0SSuyog Pawar } err_prms_t;
2056*c83a76b0SSuyog Pawar 
2057*c83a76b0SSuyog Pawar typedef struct grid
2058*c83a76b0SSuyog Pawar {
2059*c83a76b0SSuyog Pawar     WORD32 num_grids; /* Number of grid to work with */
2060*c83a76b0SSuyog Pawar     WORD32 ref_buf_stride; /* Buffer stride of reference buffer */
2061*c83a76b0SSuyog Pawar     WORD32
2062*c83a76b0SSuyog Pawar         grd_sz_y_x; /* Packed 16 bits indicating grid spacing in y & x direction <--grid-size-y--><--grid-size-x--> */
2063*c83a76b0SSuyog Pawar     UWORD8 **ppu1_ref_ptr; /* Center point for the grid search */
2064*c83a76b0SSuyog Pawar     WORD32 *pi4_grd_mask; /* Mask indicating which grid points need to be evaluated */
2065*c83a76b0SSuyog Pawar     hme_mv_t *p_mv; /* <--MVy--><--MVx--> */
2066*c83a76b0SSuyog Pawar     WORD32 *p_ref_idx; /* Ref idx to which the grid is pointing */
2067*c83a76b0SSuyog Pawar } grid_ctxt_t;
2068*c83a76b0SSuyog Pawar 
2069*c83a76b0SSuyog Pawar typedef struct cand
2070*c83a76b0SSuyog Pawar {
2071*c83a76b0SSuyog Pawar     hme_mv_t mv; /* MV corresponding to the candidate <--MVy--><--MVx--> */
2072*c83a76b0SSuyog Pawar     WORD32 ref_idx; /* Ref idx corresponding to the candidate */
2073*c83a76b0SSuyog Pawar     WORD32 grid_ix; /* Grid to which this candidate belongs */
2074*c83a76b0SSuyog Pawar     UWORD8 *pu1_ref_ptr; /* Pointer to the candidate */
2075*c83a76b0SSuyog Pawar } cand_t;
2076*c83a76b0SSuyog Pawar 
2077*c83a76b0SSuyog Pawar /**
2078*c83a76b0SSuyog Pawar ******************************************************************************
2079*c83a76b0SSuyog Pawar  *  @struct  hme_ctb_prms_t
2080*c83a76b0SSuyog Pawar  *  @brief   Parameters to create the CTB list, which is a tree structure
2081*c83a76b0SSuyog Pawar ******************************************************************************
2082*c83a76b0SSuyog Pawar  */
2083*c83a76b0SSuyog Pawar typedef struct
2084*c83a76b0SSuyog Pawar {
2085*c83a76b0SSuyog Pawar     /**
2086*c83a76b0SSuyog Pawar      * These parameters cover number of input 16x16, 32x32 and 64x64 results
2087*c83a76b0SSuyog Pawar      * and the number of output results that are mix of all above CU sizes.
2088*c83a76b0SSuyog Pawar      * i4_num_kxk_unified_out is relevant only if we are sending multiple CU
2089*c83a76b0SSuyog Pawar      * sizes for same region for RD Opt.
2090*c83a76b0SSuyog Pawar      */
2091*c83a76b0SSuyog Pawar     S32 i4_num_16x16_in;
2092*c83a76b0SSuyog Pawar     S32 i4_num_32x32_in;
2093*c83a76b0SSuyog Pawar     S32 i4_num_32x32_unified_out;
2094*c83a76b0SSuyog Pawar     S32 i4_num_64x64_in;
2095*c83a76b0SSuyog Pawar     S32 i4_num_64x64_unified_out;
2096*c83a76b0SSuyog Pawar 
2097*c83a76b0SSuyog Pawar     /** Pointers to results at differen CU sizes */
2098*c83a76b0SSuyog Pawar     search_results_t *ps_search_results_16x16;
2099*c83a76b0SSuyog Pawar     search_results_t *ps_search_results_32x32;
2100*c83a76b0SSuyog Pawar     search_results_t *ps_search_results_64x64;
2101*c83a76b0SSuyog Pawar 
2102*c83a76b0SSuyog Pawar     S32 i4_num_part_type;
2103*c83a76b0SSuyog Pawar 
2104*c83a76b0SSuyog Pawar     /** Indicates whether we have split at 64x64 level */
2105*c83a76b0SSuyog Pawar     S32 i4_cu_64x64_split;
2106*c83a76b0SSuyog Pawar     /** Indicates whether each of the 32x32 CU is split */
2107*c83a76b0SSuyog Pawar     S32 ai4_cu_32x32_split[4];
2108*c83a76b0SSuyog Pawar 
2109*c83a76b0SSuyog Pawar     /** X and y offset of the CTB */
2110*c83a76b0SSuyog Pawar     S32 i4_ctb_x;
2111*c83a76b0SSuyog Pawar     S32 i4_ctb_y;
2112*c83a76b0SSuyog Pawar 
2113*c83a76b0SSuyog Pawar     /**
2114*c83a76b0SSuyog Pawar      * Memory manager for the CTB that is responsible for node allocation
2115*c83a76b0SSuyog Pawar      * at a CU level
2116*c83a76b0SSuyog Pawar      */
2117*c83a76b0SSuyog Pawar     ctb_mem_mgr_t *ps_ctb_mem_mgr;
2118*c83a76b0SSuyog Pawar 
2119*c83a76b0SSuyog Pawar     /** Buffer manager that is responsible for memory allocation (pred bufs) */
2120*c83a76b0SSuyog Pawar     buf_mgr_t *ps_buf_mgr;
2121*c83a76b0SSuyog Pawar } hme_ctb_prms_t;
2122*c83a76b0SSuyog Pawar 
2123*c83a76b0SSuyog Pawar /**
2124*c83a76b0SSuyog Pawar ******************************************************************************
2125*c83a76b0SSuyog Pawar  *  @struct  result_upd_prms_t
2126*c83a76b0SSuyog Pawar  *  @brief   Updation of results
2127*c83a76b0SSuyog Pawar ******************************************************************************
2128*c83a76b0SSuyog Pawar  */
2129*c83a76b0SSuyog Pawar typedef struct
2130*c83a76b0SSuyog Pawar {
2131*c83a76b0SSuyog Pawar     /** Cost compuatation function ponter */
2132*c83a76b0SSuyog Pawar     PF_MV_COST_FXN pf_mv_cost_compute;
2133*c83a76b0SSuyog Pawar 
2134*c83a76b0SSuyog Pawar     /** Points to the SAD grid updated during SAD compute fxn */
2135*c83a76b0SSuyog Pawar     S32 *pi4_sad_grid;
2136*c83a76b0SSuyog Pawar 
2137*c83a76b0SSuyog Pawar     /** Points to the TU_SPLIT grid updates duting the SATD TU REC fxn */
2138*c83a76b0SSuyog Pawar     S32 *pi4_tu_split_flags;
2139*c83a76b0SSuyog Pawar 
2140*c83a76b0SSuyog Pawar     /**
2141*c83a76b0SSuyog Pawar      * This is the central mv of the grid. For e.g. if we have a 3x3 grid,
2142*c83a76b0SSuyog Pawar      * this covers the central pt's mv in the grid.
2143*c83a76b0SSuyog Pawar      */
2144*c83a76b0SSuyog Pawar     const search_node_t *ps_search_node_base;
2145*c83a76b0SSuyog Pawar 
2146*c83a76b0SSuyog Pawar     /** Search results structure updated by the result update fxn */
2147*c83a76b0SSuyog Pawar     search_results_t *ps_search_results;
2148*c83a76b0SSuyog Pawar 
2149*c83a76b0SSuyog Pawar     /** List of active partitions, only these are processed and updated */
2150*c83a76b0SSuyog Pawar     S32 *pi4_valid_part_ids;
2151*c83a76b0SSuyog Pawar 
2152*c83a76b0SSuyog Pawar     /** Reference id for this candt and grid */
2153*c83a76b0SSuyog Pawar     S08 i1_ref_idx;
2154*c83a76b0SSuyog Pawar 
2155*c83a76b0SSuyog Pawar     /** Mask of active pts in the grid */
2156*c83a76b0SSuyog Pawar     S32 i4_grid_mask;
2157*c83a76b0SSuyog Pawar 
2158*c83a76b0SSuyog Pawar     /**
2159*c83a76b0SSuyog Pawar      * For early exit reasons we may want to know the id of the least candt
2160*c83a76b0SSuyog Pawar      * This will correspond to id of  candt with least cost for 2Nx2N part,
2161*c83a76b0SSuyog Pawar      * if multiple partitions enabled, or if 1 part enabled, it will be for
2162*c83a76b0SSuyog Pawar      * id of candt of that partition
2163*c83a76b0SSuyog Pawar      */
2164*c83a76b0SSuyog Pawar     S32 i4_min_id;
2165*c83a76b0SSuyog Pawar 
2166*c83a76b0SSuyog Pawar     /** Step size of the grid */
2167*c83a76b0SSuyog Pawar     S32 i4_step;
2168*c83a76b0SSuyog Pawar 
2169*c83a76b0SSuyog Pawar     /** Mask of active partitions */
2170*c83a76b0SSuyog Pawar     S32 i4_part_mask;
2171*c83a76b0SSuyog Pawar 
2172*c83a76b0SSuyog Pawar     /** Min cost corresponding to min id */
2173*c83a76b0SSuyog Pawar     S32 i4_min_cost;
2174*c83a76b0SSuyog Pawar 
2175*c83a76b0SSuyog Pawar     /** Store the motion vectors in qpel unit*/
2176*c83a76b0SSuyog Pawar     S16 i2_mv_x;
2177*c83a76b0SSuyog Pawar 
2178*c83a76b0SSuyog Pawar     S16 i2_mv_y;
2179*c83a76b0SSuyog Pawar 
2180*c83a76b0SSuyog Pawar     U08 u1_pred_lx;
2181*c83a76b0SSuyog Pawar 
2182*c83a76b0SSuyog Pawar     subpel_refine_ctxt_t *ps_subpel_refine_ctxt;
2183*c83a76b0SSuyog Pawar 
2184*c83a76b0SSuyog Pawar     /** Current candidate in the subpel refinement process*/
2185*c83a76b0SSuyog Pawar     search_node_t *ps_search_node;
2186*c83a76b0SSuyog Pawar 
2187*c83a76b0SSuyog Pawar } result_upd_prms_t;
2188*c83a76b0SSuyog Pawar 
2189*c83a76b0SSuyog Pawar /**
2190*c83a76b0SSuyog Pawar ******************************************************************************
2191*c83a76b0SSuyog Pawar  *  @struct  mv_grid_t
2192*c83a76b0SSuyog Pawar  *  @brief   Grid of MVs storing results for a CTB and neighbours. For a CTB
2193*c83a76b0SSuyog Pawar  *           of size 64x64, we may store upto 16x16 mvs (one for each 4x4)
2194*c83a76b0SSuyog Pawar  *           along with 1 neighbour on each side. Valid only for encode layer
2195*c83a76b0SSuyog Pawar ******************************************************************************
2196*c83a76b0SSuyog Pawar  */
2197*c83a76b0SSuyog Pawar typedef struct
2198*c83a76b0SSuyog Pawar {
2199*c83a76b0SSuyog Pawar     /** All the mvs in the grid */
2200*c83a76b0SSuyog Pawar     search_node_t as_node[NUM_MVS_IN_CTB_GRID];
2201*c83a76b0SSuyog Pawar 
2202*c83a76b0SSuyog Pawar     /** Stride of the grid */
2203*c83a76b0SSuyog Pawar     S32 i4_stride;
2204*c83a76b0SSuyog Pawar 
2205*c83a76b0SSuyog Pawar     /** Start offset of the 0,0 locn in CTB. */
2206*c83a76b0SSuyog Pawar     S32 i4_start_offset;
2207*c83a76b0SSuyog Pawar } mv_grid_t;
2208*c83a76b0SSuyog Pawar 
2209*c83a76b0SSuyog Pawar typedef struct
2210*c83a76b0SSuyog Pawar {
2211*c83a76b0SSuyog Pawar     /* centroid's (x, y) co-ordinates in Q8 format */
2212*c83a76b0SSuyog Pawar     WORD32 i4_pos_x_q8;
2213*c83a76b0SSuyog Pawar 
2214*c83a76b0SSuyog Pawar     WORD32 i4_pos_y_q8;
2215*c83a76b0SSuyog Pawar } centroid_t;
2216*c83a76b0SSuyog Pawar 
2217*c83a76b0SSuyog Pawar typedef struct
2218*c83a76b0SSuyog Pawar {
2219*c83a76b0SSuyog Pawar     S16 min_x;
2220*c83a76b0SSuyog Pawar 
2221*c83a76b0SSuyog Pawar     S16 min_y;
2222*c83a76b0SSuyog Pawar 
2223*c83a76b0SSuyog Pawar     S16 max_x;
2224*c83a76b0SSuyog Pawar 
2225*c83a76b0SSuyog Pawar     S16 max_y;
2226*c83a76b0SSuyog Pawar 
2227*c83a76b0SSuyog Pawar     /* The cumulative sum of partition sizes of the mvs */
2228*c83a76b0SSuyog Pawar     /* in this cluster */
2229*c83a76b0SSuyog Pawar     S16 area_in_pixels;
2230*c83a76b0SSuyog Pawar 
2231*c83a76b0SSuyog Pawar     S16 uni_mv_pixel_area;
2232*c83a76b0SSuyog Pawar 
2233*c83a76b0SSuyog Pawar     S16 bi_mv_pixel_area;
2234*c83a76b0SSuyog Pawar 
2235*c83a76b0SSuyog Pawar     mv_data_t as_mv[128];
2236*c83a76b0SSuyog Pawar 
2237*c83a76b0SSuyog Pawar     U08 num_mvs;
2238*c83a76b0SSuyog Pawar 
2239*c83a76b0SSuyog Pawar     /* Weighted average of all mvs in the cluster */
2240*c83a76b0SSuyog Pawar     centroid_t s_centroid;
2241*c83a76b0SSuyog Pawar 
2242*c83a76b0SSuyog Pawar     S08 ref_id;
2243*c83a76b0SSuyog Pawar 
2244*c83a76b0SSuyog Pawar     S32 max_dist_from_centroid;
2245*c83a76b0SSuyog Pawar 
2246*c83a76b0SSuyog Pawar     U08 is_valid_cluster;
2247*c83a76b0SSuyog Pawar 
2248*c83a76b0SSuyog Pawar } cluster_data_t;
2249*c83a76b0SSuyog Pawar 
2250*c83a76b0SSuyog Pawar typedef struct
2251*c83a76b0SSuyog Pawar {
2252*c83a76b0SSuyog Pawar     cluster_data_t as_cluster_data[MAX_NUM_CLUSTERS_16x16];
2253*c83a76b0SSuyog Pawar 
2254*c83a76b0SSuyog Pawar     U08 num_clusters;
2255*c83a76b0SSuyog Pawar 
2256*c83a76b0SSuyog Pawar     U08 au1_num_clusters[MAX_NUM_REF];
2257*c83a76b0SSuyog Pawar 
2258*c83a76b0SSuyog Pawar     S16 intra_mv_area;
2259*c83a76b0SSuyog Pawar 
2260*c83a76b0SSuyog Pawar     S32 best_inter_cost;
2261*c83a76b0SSuyog Pawar 
2262*c83a76b0SSuyog Pawar } cluster_16x16_blk_t;
2263*c83a76b0SSuyog Pawar 
2264*c83a76b0SSuyog Pawar typedef struct
2265*c83a76b0SSuyog Pawar {
2266*c83a76b0SSuyog Pawar     cluster_data_t as_cluster_data[MAX_NUM_CLUSTERS_32x32];
2267*c83a76b0SSuyog Pawar 
2268*c83a76b0SSuyog Pawar     U08 num_clusters;
2269*c83a76b0SSuyog Pawar 
2270*c83a76b0SSuyog Pawar     U08 au1_num_clusters[MAX_NUM_REF];
2271*c83a76b0SSuyog Pawar 
2272*c83a76b0SSuyog Pawar     S16 intra_mv_area;
2273*c83a76b0SSuyog Pawar 
2274*c83a76b0SSuyog Pawar     S08 best_uni_ref;
2275*c83a76b0SSuyog Pawar 
2276*c83a76b0SSuyog Pawar     S08 best_alt_ref;
2277*c83a76b0SSuyog Pawar 
2278*c83a76b0SSuyog Pawar     S32 best_inter_cost;
2279*c83a76b0SSuyog Pawar 
2280*c83a76b0SSuyog Pawar     U08 num_refs;
2281*c83a76b0SSuyog Pawar 
2282*c83a76b0SSuyog Pawar     U08 num_clusters_with_weak_sdi_density;
2283*c83a76b0SSuyog Pawar 
2284*c83a76b0SSuyog Pawar } cluster_32x32_blk_t;
2285*c83a76b0SSuyog Pawar 
2286*c83a76b0SSuyog Pawar typedef struct
2287*c83a76b0SSuyog Pawar {
2288*c83a76b0SSuyog Pawar     cluster_data_t as_cluster_data[MAX_NUM_CLUSTERS_64x64];
2289*c83a76b0SSuyog Pawar 
2290*c83a76b0SSuyog Pawar     U08 num_clusters;
2291*c83a76b0SSuyog Pawar 
2292*c83a76b0SSuyog Pawar     U08 au1_num_clusters[MAX_NUM_REF];
2293*c83a76b0SSuyog Pawar 
2294*c83a76b0SSuyog Pawar     S16 intra_mv_area;
2295*c83a76b0SSuyog Pawar 
2296*c83a76b0SSuyog Pawar     S08 best_uni_ref;
2297*c83a76b0SSuyog Pawar 
2298*c83a76b0SSuyog Pawar     S08 best_alt_ref;
2299*c83a76b0SSuyog Pawar 
2300*c83a76b0SSuyog Pawar     S32 best_inter_cost;
2301*c83a76b0SSuyog Pawar 
2302*c83a76b0SSuyog Pawar     U08 num_refs;
2303*c83a76b0SSuyog Pawar 
2304*c83a76b0SSuyog Pawar } cluster_64x64_blk_t;
2305*c83a76b0SSuyog Pawar 
2306*c83a76b0SSuyog Pawar typedef struct
2307*c83a76b0SSuyog Pawar {
2308*c83a76b0SSuyog Pawar     cluster_16x16_blk_t *ps_16x16_blk;
2309*c83a76b0SSuyog Pawar 
2310*c83a76b0SSuyog Pawar     cluster_32x32_blk_t *ps_32x32_blk;
2311*c83a76b0SSuyog Pawar 
2312*c83a76b0SSuyog Pawar     cluster_64x64_blk_t *ps_64x64_blk;
2313*c83a76b0SSuyog Pawar 
2314*c83a76b0SSuyog Pawar     cur_ctb_cu_tree_t *ps_cu_tree_root;
2315*c83a76b0SSuyog Pawar     ipe_l0_ctb_analyse_for_me_t *ps_cur_ipe_ctb;
2316*c83a76b0SSuyog Pawar     S32 nodes_created_in_cu_tree;
2317*c83a76b0SSuyog Pawar 
2318*c83a76b0SSuyog Pawar     S32 *pi4_blk_8x8_mask;
2319*c83a76b0SSuyog Pawar 
2320*c83a76b0SSuyog Pawar     S32 blk_32x32_mask;
2321*c83a76b0SSuyog Pawar 
2322*c83a76b0SSuyog Pawar     S32 sdi_threshold;
2323*c83a76b0SSuyog Pawar 
2324*c83a76b0SSuyog Pawar     S32 i4_frame_qstep;
2325*c83a76b0SSuyog Pawar 
2326*c83a76b0SSuyog Pawar     S32 i4_frame_qstep_multiplier;
2327*c83a76b0SSuyog Pawar 
2328*c83a76b0SSuyog Pawar     U08 au1_is_16x16_blk_split[16];
2329*c83a76b0SSuyog Pawar 
2330*c83a76b0SSuyog Pawar     S32 ai4_part_mask[16];
2331*c83a76b0SSuyog Pawar 
2332*c83a76b0SSuyog Pawar } ctb_cluster_info_t;
2333*c83a76b0SSuyog Pawar 
2334*c83a76b0SSuyog Pawar /**
2335*c83a76b0SSuyog Pawar ******************************************************************************
2336*c83a76b0SSuyog Pawar  *  @struct  hme_merge_prms_t
2337*c83a76b0SSuyog Pawar  *  @brief   All parameters related to the merge process
2338*c83a76b0SSuyog Pawar ******************************************************************************
2339*c83a76b0SSuyog Pawar  */
2340*c83a76b0SSuyog Pawar typedef struct
2341*c83a76b0SSuyog Pawar {
2342*c83a76b0SSuyog Pawar     /**
2343*c83a76b0SSuyog Pawar      * MV Range prms for the merged CU, this may have to be conservative
2344*c83a76b0SSuyog Pawar      * in comparison to individual CUs
2345*c83a76b0SSuyog Pawar      */
2346*c83a76b0SSuyog Pawar     range_prms_t *aps_mv_range[MAX_NUM_REF];
2347*c83a76b0SSuyog Pawar 
2348*c83a76b0SSuyog Pawar     /** Pointers to search results of 4 children CUs to be merged */
2349*c83a76b0SSuyog Pawar     search_results_t *ps_results_tl;
2350*c83a76b0SSuyog Pawar     search_results_t *ps_results_tr;
2351*c83a76b0SSuyog Pawar     search_results_t *ps_results_bl;
2352*c83a76b0SSuyog Pawar     search_results_t *ps_results_br;
2353*c83a76b0SSuyog Pawar 
2354*c83a76b0SSuyog Pawar     search_results_t *ps_results_grandchild;
2355*c83a76b0SSuyog Pawar 
2356*c83a76b0SSuyog Pawar     /** Pointer to search results of the parent CU updated during merge */
2357*c83a76b0SSuyog Pawar     search_results_t *ps_results_merge;
2358*c83a76b0SSuyog Pawar 
2359*c83a76b0SSuyog Pawar     inter_cu_results_t *ps_8x8_cu_results;
2360*c83a76b0SSuyog Pawar 
2361*c83a76b0SSuyog Pawar     /** Layer related context */
2362*c83a76b0SSuyog Pawar     layer_ctxt_t *ps_layer_ctxt;
2363*c83a76b0SSuyog Pawar 
2364*c83a76b0SSuyog Pawar     inter_ctb_prms_t *ps_inter_ctb_prms;
2365*c83a76b0SSuyog Pawar 
2366*c83a76b0SSuyog Pawar     /**
2367*c83a76b0SSuyog Pawar      * Points to an array of pointers. This array in turn points to
2368*c83a76b0SSuyog Pawar      * the active mv grid in each direction (L0/L1)
2369*c83a76b0SSuyog Pawar      */
2370*c83a76b0SSuyog Pawar     mv_grid_t **pps_mv_grid;
2371*c83a76b0SSuyog Pawar 
2372*c83a76b0SSuyog Pawar     ctb_cluster_info_t *ps_cluster_info;
2373*c83a76b0SSuyog Pawar 
2374*c83a76b0SSuyog Pawar     S08 *pi1_past_list;
2375*c83a76b0SSuyog Pawar 
2376*c83a76b0SSuyog Pawar     S08 *pi1_future_list;
2377*c83a76b0SSuyog Pawar 
2378*c83a76b0SSuyog Pawar     /** MV cost compute function */
2379*c83a76b0SSuyog Pawar     PF_MV_COST_FXN pf_mv_cost_compute;
2380*c83a76b0SSuyog Pawar 
2381*c83a76b0SSuyog Pawar     /** If segmentation info available for the parent block */
2382*c83a76b0SSuyog Pawar     S32 i4_seg_info_avail;
2383*c83a76b0SSuyog Pawar 
2384*c83a76b0SSuyog Pawar     /** Partition mask (if segmentation info available) */
2385*c83a76b0SSuyog Pawar     S32 i4_part_mask;
2386*c83a76b0SSuyog Pawar 
2387*c83a76b0SSuyog Pawar     /** Number of input results available for the merge proc from children*/
2388*c83a76b0SSuyog Pawar     S32 i4_num_inp_results;
2389*c83a76b0SSuyog Pawar 
2390*c83a76b0SSuyog Pawar     /** Whether SATD to be used for fpel searches */
2391*c83a76b0SSuyog Pawar     S32 i4_use_satd;
2392*c83a76b0SSuyog Pawar 
2393*c83a76b0SSuyog Pawar     /**
2394*c83a76b0SSuyog Pawar      * Number of result planes valid for this merge process. For example,
2395*c83a76b0SSuyog Pawar      * for fpel search in encode layer, we may have only L0 and L1
2396*c83a76b0SSuyog Pawar      */
2397*c83a76b0SSuyog Pawar     S32 i4_num_ref;
2398*c83a76b0SSuyog Pawar 
2399*c83a76b0SSuyog Pawar     /** Whether to use input or recon frm for search */
2400*c83a76b0SSuyog Pawar     S32 i4_use_rec;
2401*c83a76b0SSuyog Pawar 
2402*c83a76b0SSuyog Pawar     /** optimized mv grid flag : indicates if same mvgrid is used for both fpel and qpel
2403*c83a76b0SSuyog Pawar      *  This helps in copying fpel and qpel mv grid in pred context mv grid
2404*c83a76b0SSuyog Pawar      */
2405*c83a76b0SSuyog Pawar     S32 i4_mv_grid_opt;
2406*c83a76b0SSuyog Pawar 
2407*c83a76b0SSuyog Pawar     /** ctb size, typically 32 or 64 */
2408*c83a76b0SSuyog Pawar     S32 log_ctb_size;
2409*c83a76b0SSuyog Pawar 
2410*c83a76b0SSuyog Pawar     S32 i4_ctb_x_off;
2411*c83a76b0SSuyog Pawar 
2412*c83a76b0SSuyog Pawar     S32 i4_ctb_y_off;
2413*c83a76b0SSuyog Pawar 
2414*c83a76b0SSuyog Pawar     ME_QUALITY_PRESETS_T e_quality_preset;
2415*c83a76b0SSuyog Pawar 
2416*c83a76b0SSuyog Pawar     S32 i4_num_pred_dir_actual;
2417*c83a76b0SSuyog Pawar 
2418*c83a76b0SSuyog Pawar     U08 au1_pred_dir_searched[2];
2419*c83a76b0SSuyog Pawar 
2420*c83a76b0SSuyog Pawar     S32 i4_alpha_stim_multiplier;
2421*c83a76b0SSuyog Pawar 
2422*c83a76b0SSuyog Pawar     U08 u1_is_cu_noisy;
2423*c83a76b0SSuyog Pawar 
2424*c83a76b0SSuyog Pawar } hme_merge_prms_t;
2425*c83a76b0SSuyog Pawar 
2426*c83a76b0SSuyog Pawar /**
2427*c83a76b0SSuyog Pawar ******************************************************************************
2428*c83a76b0SSuyog Pawar  *  @struct  mvbank_update_prms_t
2429*c83a76b0SSuyog Pawar  *  @brief   Useful prms for updating the mv bank
2430*c83a76b0SSuyog Pawar ******************************************************************************
2431*c83a76b0SSuyog Pawar  */
2432*c83a76b0SSuyog Pawar typedef struct
2433*c83a76b0SSuyog Pawar {
2434*c83a76b0SSuyog Pawar     /** Number of references for which update to be done */
2435*c83a76b0SSuyog Pawar     S32 i4_num_ref;
2436*c83a76b0SSuyog Pawar 
2437*c83a76b0SSuyog Pawar     /**
2438*c83a76b0SSuyog Pawar      * Search blk size that was used, if this is different from the blk
2439*c83a76b0SSuyog Pawar      * size used in mv bank, then some replications or reductions may
2440*c83a76b0SSuyog Pawar      * have to be done. E.g. if search blk size is 8x8 and result blk
2441*c83a76b0SSuyog Pawar      * size is 4x4, then we have to update part NxN results to be
2442*c83a76b0SSuyog Pawar      * used for update along with replication of 2Nx2N result in each
2443*c83a76b0SSuyog Pawar      * of the 4 4x4 blk.
2444*c83a76b0SSuyog Pawar      */
2445*c83a76b0SSuyog Pawar     BLK_SIZE_T e_search_blk_size;
2446*c83a76b0SSuyog Pawar 
2447*c83a76b0SSuyog Pawar     /**
2448*c83a76b0SSuyog Pawar      * Redundant prm as it reflects differences between search blk size
2449*c83a76b0SSuyog Pawar      * and mv blk size if any
2450*c83a76b0SSuyog Pawar      */
2451*c83a76b0SSuyog Pawar     S32 i4_shift;
2452*c83a76b0SSuyog Pawar 
2453*c83a76b0SSuyog Pawar     S32 i4_num_active_ref_l0;
2454*c83a76b0SSuyog Pawar 
2455*c83a76b0SSuyog Pawar     S32 i4_num_active_ref_l1;
2456*c83a76b0SSuyog Pawar 
2457*c83a76b0SSuyog Pawar     S32 i4_num_results_to_store;
2458*c83a76b0SSuyog Pawar } mvbank_update_prms_t;
2459*c83a76b0SSuyog Pawar 
2460*c83a76b0SSuyog Pawar /**
2461*c83a76b0SSuyog Pawar ******************************************************************************
2462*c83a76b0SSuyog Pawar  *  @struct  hme_subpel_prms_t
2463*c83a76b0SSuyog Pawar  *  @brief   input and control prms for subpel refinement
2464*c83a76b0SSuyog Pawar ******************************************************************************
2465*c83a76b0SSuyog Pawar  */
2466*c83a76b0SSuyog Pawar typedef struct
2467*c83a76b0SSuyog Pawar {
2468*c83a76b0SSuyog Pawar     /** Relevant only for the case where we mix up results of diff cu sizes */
2469*c83a76b0SSuyog Pawar     S32 i4_num_16x16_candts;
2470*c83a76b0SSuyog Pawar     S32 i4_num_32x32_candts;
2471*c83a76b0SSuyog Pawar     S32 i4_num_64x64_candts;
2472*c83a76b0SSuyog Pawar 
2473*c83a76b0SSuyog Pawar     /** X and y offset of ctb w.r.t. start of pic */
2474*c83a76b0SSuyog Pawar     S32 i4_ctb_x_off;
2475*c83a76b0SSuyog Pawar     S32 i4_ctb_y_off;
2476*c83a76b0SSuyog Pawar 
2477*c83a76b0SSuyog Pawar     /** Max Number of diamond steps for hpel and qpel refinement */
2478*c83a76b0SSuyog Pawar     S32 i4_num_steps_hpel_refine;
2479*c83a76b0SSuyog Pawar     S32 i4_num_steps_qpel_refine;
2480*c83a76b0SSuyog Pawar 
2481*c83a76b0SSuyog Pawar     /** Whether SATD to be used or SAD to be used */
2482*c83a76b0SSuyog Pawar     S32 i4_use_satd;
2483*c83a76b0SSuyog Pawar 
2484*c83a76b0SSuyog Pawar     /**
2485*c83a76b0SSuyog Pawar      * Input ptr. This is updated inside the subpel refinement by picking
2486*c83a76b0SSuyog Pawar      * up correct adress
2487*c83a76b0SSuyog Pawar      */
2488*c83a76b0SSuyog Pawar     void *pv_inp;
2489*c83a76b0SSuyog Pawar 
2490*c83a76b0SSuyog Pawar     /**
2491*c83a76b0SSuyog Pawar      * Pred buffer ptr, updated inside subpel refinement process. This
2492*c83a76b0SSuyog Pawar      * location passed to the leaf fxn for copying the winner pred buf
2493*c83a76b0SSuyog Pawar      */
2494*c83a76b0SSuyog Pawar     U08 *pu1_pred;
2495*c83a76b0SSuyog Pawar 
2496*c83a76b0SSuyog Pawar     /** Interpolation fxn sent by top layer, should exact qpel be desired */
2497*c83a76b0SSuyog Pawar     PF_INTERP_FXN_T pf_qpel_interp;
2498*c83a76b0SSuyog Pawar 
2499*c83a76b0SSuyog Pawar     /** Working mem passed to leaf fxns */
2500*c83a76b0SSuyog Pawar     U08 *pu1_wkg_mem;
2501*c83a76b0SSuyog Pawar 
2502*c83a76b0SSuyog Pawar     /** prediction buffer stride fo rleaf fxns to copy the pred winner buf */
2503*c83a76b0SSuyog Pawar     S32 i4_pred_stride;
2504*c83a76b0SSuyog Pawar 
2505*c83a76b0SSuyog Pawar     /** Type of input ; sizeof(UWORD8) => unidir refinement, else BIDIR */
2506*c83a76b0SSuyog Pawar     S32 i4_inp_type;
2507*c83a76b0SSuyog Pawar 
2508*c83a76b0SSuyog Pawar     /** Stride of input buf, updated inside subpel fxn */
2509*c83a76b0SSuyog Pawar     S32 i4_inp_stride;
2510*c83a76b0SSuyog Pawar 
2511*c83a76b0SSuyog Pawar     /**
2512*c83a76b0SSuyog Pawar      * Pointer to the backward input ptr. This is also updated inside
2513*c83a76b0SSuyog Pawar      * the subpel fxn. Needed for BIDIR refinement where modified inpu
2514*c83a76b0SSuyog Pawar      * is 2I - P0
2515*c83a76b0SSuyog Pawar      */
2516*c83a76b0SSuyog Pawar     S16 *pi2_inp_bck;
2517*c83a76b0SSuyog Pawar 
2518*c83a76b0SSuyog Pawar     /** Indicates if CU merge uses SATD / SAD */
2519*c83a76b0SSuyog Pawar     S32 i4_use_satd_cu_merge;
2520*c83a76b0SSuyog Pawar 
2521*c83a76b0SSuyog Pawar     /** valid MV range in hpel and qpel units */
2522*c83a76b0SSuyog Pawar     range_prms_t *aps_mv_range_hpel[MAX_NUM_REF];
2523*c83a76b0SSuyog Pawar     range_prms_t *aps_mv_range_qpel[MAX_NUM_REF];
2524*c83a76b0SSuyog Pawar     /** Relevant only for mixed CU cases */
2525*c83a76b0SSuyog Pawar     search_results_t *ps_search_results_16x16;
2526*c83a76b0SSuyog Pawar     search_results_t *ps_search_results_32x32;
2527*c83a76b0SSuyog Pawar     search_results_t *ps_search_results_64x64;
2528*c83a76b0SSuyog Pawar 
2529*c83a76b0SSuyog Pawar     /** Cost computatino fxn ptr */
2530*c83a76b0SSuyog Pawar     PF_MV_COST_FXN pf_mv_cost_compute;
2531*c83a76b0SSuyog Pawar 
2532*c83a76b0SSuyog Pawar     /** Whether BI mode is allowed for this pic (not allowed in P) */
2533*c83a76b0SSuyog Pawar     S32 bidir_enabled;
2534*c83a76b0SSuyog Pawar 
2535*c83a76b0SSuyog Pawar     /**
2536*c83a76b0SSuyog Pawar      * Total number of references of current picture which is enocded
2537*c83a76b0SSuyog Pawar      */
2538*c83a76b0SSuyog Pawar     U08 u1_num_ref;
2539*c83a76b0SSuyog Pawar 
2540*c83a76b0SSuyog Pawar     /**
2541*c83a76b0SSuyog Pawar      * Number of candidates used for refinement
2542*c83a76b0SSuyog Pawar      * If given 1 candidate, then 2Nx2N is chosen as the best candidate
2543*c83a76b0SSuyog Pawar      */
2544*c83a76b0SSuyog Pawar     U08 u1_max_subpel_candts;
2545*c83a76b0SSuyog Pawar 
2546*c83a76b0SSuyog Pawar     U08 u1_subpel_candt_threshold;
2547*c83a76b0SSuyog Pawar 
2548*c83a76b0SSuyog Pawar     ME_QUALITY_PRESETS_T e_me_quality_presets;
2549*c83a76b0SSuyog Pawar 
2550*c83a76b0SSuyog Pawar     U08 u1_max_subpel_candts_2Nx2N;
2551*c83a76b0SSuyog Pawar     U08 u1_max_subpel_candts_NxN;
2552*c83a76b0SSuyog Pawar 
2553*c83a76b0SSuyog Pawar     U08 u1_max_num_subpel_refine_centers;
2554*c83a76b0SSuyog Pawar 
2555*c83a76b0SSuyog Pawar     subpel_refine_ctxt_t *ps_subpel_refine_ctxt;
2556*c83a76b0SSuyog Pawar 
2557*c83a76b0SSuyog Pawar     S32 i4_num_act_ref_l0;
2558*c83a76b0SSuyog Pawar 
2559*c83a76b0SSuyog Pawar     S32 i4_num_act_ref_l1;
2560*c83a76b0SSuyog Pawar 
2561*c83a76b0SSuyog Pawar     U08 u1_is_cu_noisy;
2562*c83a76b0SSuyog Pawar } hme_subpel_prms_t;
2563*c83a76b0SSuyog Pawar 
2564*c83a76b0SSuyog Pawar /**
2565*c83a76b0SSuyog Pawar ******************************************************************************
2566*c83a76b0SSuyog Pawar  *  @struct  layers_descr_t
2567*c83a76b0SSuyog Pawar  *  @brief   One such str exists for each ref and curr input in the me ctxt
2568*c83a76b0SSuyog Pawar  *           Has ctxt handles for all layers of a given POC
2569*c83a76b0SSuyog Pawar ******************************************************************************
2570*c83a76b0SSuyog Pawar  */
2571*c83a76b0SSuyog Pawar typedef struct
2572*c83a76b0SSuyog Pawar {
2573*c83a76b0SSuyog Pawar     /** Handles for all layers. Entry 0 is finest layer */
2574*c83a76b0SSuyog Pawar     layer_ctxt_t *aps_layers[MAX_NUM_LAYERS];
2575*c83a76b0SSuyog Pawar } layers_descr_t;
2576*c83a76b0SSuyog Pawar 
2577*c83a76b0SSuyog Pawar /**
2578*c83a76b0SSuyog Pawar ******************************************************************************
2579*c83a76b0SSuyog Pawar  *  @struct  blk_ctb_attrs_t
2580*c83a76b0SSuyog Pawar  *  @brief   The CTB is split into 16x16 blks. For each such blk, this str
2581*c83a76b0SSuyog Pawar  *           stores attributes of this blk w.r.t. ctb
2582*c83a76b0SSuyog Pawar ******************************************************************************
2583*c83a76b0SSuyog Pawar  */
2584*c83a76b0SSuyog Pawar typedef struct
2585*c83a76b0SSuyog Pawar {
2586*c83a76b0SSuyog Pawar     /**
2587*c83a76b0SSuyog Pawar      * ID of the blk in the full ctb. Assuming the full ctb were coded,
2588*c83a76b0SSuyog Pawar      * this indicates what is the blk num of this blk (in encode order)
2589*c83a76b0SSuyog Pawar      * within the full ctb
2590*c83a76b0SSuyog Pawar      */
2591*c83a76b0SSuyog Pawar     U08 u1_blk_id_in_full_ctb;
2592*c83a76b0SSuyog Pawar 
2593*c83a76b0SSuyog Pawar     /** x and y coordinates of this blk w.r.t. ctb base */
2594*c83a76b0SSuyog Pawar     U08 u1_blk_x;
2595*c83a76b0SSuyog Pawar     U08 u1_blk_y;
2596*c83a76b0SSuyog Pawar     /**
2597*c83a76b0SSuyog Pawar      * Mask of 8x8 blks that are active. Bits 0-3 for blks 0-3 in raster order
2598*c83a76b0SSuyog Pawar      * within a 16x16 blk. This will be 0xf in interiors and < 0xf at rt/bot
2599*c83a76b0SSuyog Pawar      * boundaries or at bot rt corners, where we may not have full 16x16 blk
2600*c83a76b0SSuyog Pawar      */
2601*c83a76b0SSuyog Pawar     U08 u1_blk_8x8_mask;
2602*c83a76b0SSuyog Pawar } blk_ctb_attrs_t;
2603*c83a76b0SSuyog Pawar 
2604*c83a76b0SSuyog Pawar /**
2605*c83a76b0SSuyog Pawar ******************************************************************************
2606*c83a76b0SSuyog Pawar  *  @struct  ctb_boundary_attrs_t
2607*c83a76b0SSuyog Pawar  *  @brief   Depending on the location of ctb (rt boundary, bot boundary,
2608*c83a76b0SSuyog Pawar  *           bot rt corner, elsewhere) this picks out the appropriate
2609*c83a76b0SSuyog Pawar  *           attributes of the ctb
2610*c83a76b0SSuyog Pawar ******************************************************************************
2611*c83a76b0SSuyog Pawar  */
2612*c83a76b0SSuyog Pawar typedef struct
2613*c83a76b0SSuyog Pawar {
2614*c83a76b0SSuyog Pawar     /**
2615*c83a76b0SSuyog Pawar      * 4 bit variable, one for each of the 4 possible 32x32s in a full ctb
2616*c83a76b0SSuyog Pawar      * If any 32x32 is partially present / not present at boundaries, that
2617*c83a76b0SSuyog Pawar      * bit posn will be 0
2618*c83a76b0SSuyog Pawar      */
2619*c83a76b0SSuyog Pawar     U08 u1_merge_to_32x32_flag;
2620*c83a76b0SSuyog Pawar 
2621*c83a76b0SSuyog Pawar     /**
2622*c83a76b0SSuyog Pawar      * 1 bit flag indicating whether it is a complete ctb or not, and
2623*c83a76b0SSuyog Pawar      * consequently whether it can be merged to a full 64x64
2624*c83a76b0SSuyog Pawar      */
2625*c83a76b0SSuyog Pawar     U08 u1_merge_to_64x64_flag;
2626*c83a76b0SSuyog Pawar 
2627*c83a76b0SSuyog Pawar     /** Number of valid 16x16 blks (includes those partially/fully present*/
2628*c83a76b0SSuyog Pawar     U08 u1_num_blks_in_ctb;
2629*c83a76b0SSuyog Pawar 
2630*c83a76b0SSuyog Pawar     /** 16 bit variable indicating whether the corresponding 16x16 is valid */
2631*c83a76b0SSuyog Pawar     S32 cu_16x16_valid_flag;
2632*c83a76b0SSuyog Pawar 
2633*c83a76b0SSuyog Pawar     /**
2634*c83a76b0SSuyog Pawar      * For possible 16 16x16 blks in a CTB, we have one attribute str for
2635*c83a76b0SSuyog Pawar      * every valid blk. Tightly packed structure. For example,
2636*c83a76b0SSuyog Pawar      *  0  1  4  5
2637*c83a76b0SSuyog Pawar      *  2  3  6  7
2638*c83a76b0SSuyog Pawar      *  8  9 12 13
2639*c83a76b0SSuyog Pawar      * 10 11 14 15
2640*c83a76b0SSuyog Pawar      * Assuming the ctb width is only 48, blks 5,7,13,15 are invalid
2641*c83a76b0SSuyog Pawar      * Then We store attributes in the order: 0,1,2,3,4,6,8,9,10,11,12,14
2642*c83a76b0SSuyog Pawar      */
2643*c83a76b0SSuyog Pawar     blk_ctb_attrs_t as_blk_attrs[16];
2644*c83a76b0SSuyog Pawar } ctb_boundary_attrs_t;
2645*c83a76b0SSuyog Pawar 
2646*c83a76b0SSuyog Pawar typedef struct
2647*c83a76b0SSuyog Pawar {
2648*c83a76b0SSuyog Pawar     S32 sdi;
2649*c83a76b0SSuyog Pawar 
2650*c83a76b0SSuyog Pawar     S32 ref_idx;
2651*c83a76b0SSuyog Pawar 
2652*c83a76b0SSuyog Pawar     S32 cluster_id;
2653*c83a76b0SSuyog Pawar } outlier_data_t;
2654*c83a76b0SSuyog Pawar 
2655*c83a76b0SSuyog Pawar /**
2656*c83a76b0SSuyog Pawar ******************************************************************************
2657*c83a76b0SSuyog Pawar  *  @struct  coarse_dyn_range_prms_t
2658*c83a76b0SSuyog Pawar  *  @brief   The parameters for Dyn. Search Range in coarse ME
2659*c83a76b0SSuyog Pawar ******************************************************************************
2660*c83a76b0SSuyog Pawar  */
2661*c83a76b0SSuyog Pawar 
2662*c83a76b0SSuyog Pawar typedef struct
2663*c83a76b0SSuyog Pawar {
2664*c83a76b0SSuyog Pawar     /* TO DO : size can be reduced, as not getting used for L0 */
2665*c83a76b0SSuyog Pawar 
2666*c83a76b0SSuyog Pawar     /** Dynamical Search Range parameters per layer & ref_pic */
2667*c83a76b0SSuyog Pawar     dyn_range_prms_t as_dyn_range_prms[MAX_NUM_LAYERS][MAX_NUM_REF];
2668*c83a76b0SSuyog Pawar 
2669*c83a76b0SSuyog Pawar     /** Min y value Normalized per POC distance */
2670*c83a76b0SSuyog Pawar     WORD16 i2_dyn_min_y_per_poc[MAX_NUM_LAYERS];
2671*c83a76b0SSuyog Pawar     /** Max y value Normalized per POC distance */
2672*c83a76b0SSuyog Pawar     WORD16 i2_dyn_max_y_per_poc[MAX_NUM_LAYERS];
2673*c83a76b0SSuyog Pawar 
2674*c83a76b0SSuyog Pawar } coarse_dyn_range_prms_t;
2675*c83a76b0SSuyog Pawar 
2676*c83a76b0SSuyog Pawar /**
2677*c83a76b0SSuyog Pawar ******************************************************************************
2678*c83a76b0SSuyog Pawar  *  @struct  coarse_me_ctxt_t
2679*c83a76b0SSuyog Pawar  *  @brief   Handle for Coarse ME
2680*c83a76b0SSuyog Pawar ******************************************************************************
2681*c83a76b0SSuyog Pawar  */
2682*c83a76b0SSuyog Pawar typedef struct
2683*c83a76b0SSuyog Pawar {
2684*c83a76b0SSuyog Pawar     /** Init search candts, 2 sets, one for 4x8 and one for 8x4 */
2685*c83a76b0SSuyog Pawar     search_node_t s_init_search_node[MAX_INIT_CANDTS * 2];
2686*c83a76b0SSuyog Pawar 
2687*c83a76b0SSuyog Pawar     /** For non enc layer, we search 8x8 blks and store results here */
2688*c83a76b0SSuyog Pawar     search_results_t s_search_results_8x8;
2689*c83a76b0SSuyog Pawar     /**
2690*c83a76b0SSuyog Pawar      * Below arays store input planes for each ref pic.
2691*c83a76b0SSuyog Pawar      * These are duplications, and are present within layer ctxts, but
2692*c83a76b0SSuyog Pawar      * kept here together for faster indexing during search
2693*c83a76b0SSuyog Pawar      */
2694*c83a76b0SSuyog Pawar     U08 *apu1_list_inp[MAX_NUM_LAYERS][MAX_NUM_REF];
2695*c83a76b0SSuyog Pawar 
2696*c83a76b0SSuyog Pawar     /** Ptr to all layer context placeholder for curr pic encoded */
2697*c83a76b0SSuyog Pawar     layers_descr_t *ps_curr_descr;
2698*c83a76b0SSuyog Pawar 
2699*c83a76b0SSuyog Pawar     /** Ptr to all layer ctxt place holder for all pics */
2700*c83a76b0SSuyog Pawar     layers_descr_t as_ref_descr[MAX_NUM_REF + 1 + NUM_BUFS_DECOMP_HME];
2701*c83a76b0SSuyog Pawar 
2702*c83a76b0SSuyog Pawar     /**
2703*c83a76b0SSuyog Pawar      * ME uses ref id lc to search multi ref. This TLU gets POC of
2704*c83a76b0SSuyog Pawar      * the pic w.r.t. a given ref id
2705*c83a76b0SSuyog Pawar      */
2706*c83a76b0SSuyog Pawar     S32 ai4_ref_idx_to_poc_lc[MAX_NUM_REF];
2707*c83a76b0SSuyog Pawar 
2708*c83a76b0SSuyog Pawar     /** use this array to get disp num from ref_idx. Used for L1 traqo **/
2709*c83a76b0SSuyog Pawar     S32 ai4_ref_idx_to_disp_num[MAX_NUM_REF];
2710*c83a76b0SSuyog Pawar 
2711*c83a76b0SSuyog Pawar     /** POC of pic encoded just before current */
2712*c83a76b0SSuyog Pawar     S32 i4_prev_poc;
2713*c83a76b0SSuyog Pawar 
2714*c83a76b0SSuyog Pawar     /** POC of curret pic being encoded */
2715*c83a76b0SSuyog Pawar     S32 i4_curr_poc;
2716*c83a76b0SSuyog Pawar 
2717*c83a76b0SSuyog Pawar     /** Number of HME layers encode + non encode */
2718*c83a76b0SSuyog Pawar     S32 num_layers;
2719*c83a76b0SSuyog Pawar 
2720*c83a76b0SSuyog Pawar     /** Alloc time parameter, max ref frms used for this session */
2721*c83a76b0SSuyog Pawar     S32 max_num_ref;
2722*c83a76b0SSuyog Pawar 
2723*c83a76b0SSuyog Pawar     /**
2724*c83a76b0SSuyog Pawar      * Number of layers that use explicit search. Explicit search means
2725*c83a76b0SSuyog Pawar      * that each ref id is searched separately
2726*c83a76b0SSuyog Pawar      */
2727*c83a76b0SSuyog Pawar     S32 num_layers_explicit_search;
2728*c83a76b0SSuyog Pawar 
2729*c83a76b0SSuyog Pawar     /**
2730*c83a76b0SSuyog Pawar      * Maximum number of results maintained at any refinement layer
2731*c83a76b0SSuyog Pawar      * search. Important from mem alloc perspective
2732*c83a76b0SSuyog Pawar      */
2733*c83a76b0SSuyog Pawar     S32 max_num_results;
2734*c83a76b0SSuyog Pawar 
2735*c83a76b0SSuyog Pawar     /** Same as above but for coarse layer */
2736*c83a76b0SSuyog Pawar     S32 max_num_results_coarse;
2737*c83a76b0SSuyog Pawar 
2738*c83a76b0SSuyog Pawar     /** Array of flags, one per layer indicating hwether layer is encoded */
2739*c83a76b0SSuyog Pawar     U08 u1_encode[MAX_NUM_LAYERS];
2740*c83a76b0SSuyog Pawar 
2741*c83a76b0SSuyog Pawar     /** Init prms send by encoder during create time */
2742*c83a76b0SSuyog Pawar     hme_init_prms_t s_init_prms;
2743*c83a76b0SSuyog Pawar 
2744*c83a76b0SSuyog Pawar     /**
2745*c83a76b0SSuyog Pawar      * Array look up created each frm, maintaining the corresponding
2746*c83a76b0SSuyog Pawar      * layer descr look up for each ref id
2747*c83a76b0SSuyog Pawar      */
2748*c83a76b0SSuyog Pawar     S32 a_ref_to_descr_id[MAX_NUM_REF];
2749*c83a76b0SSuyog Pawar 
2750*c83a76b0SSuyog Pawar     /**
2751*c83a76b0SSuyog Pawar      * Array lookup created each frame that maps a given ref id
2752*c83a76b0SSuyog Pawar      * pertaining to unified list to a L0/L1 list. Encoder searches in terms
2753*c83a76b0SSuyog Pawar      * of LC list or in other words does not differentiate between L0
2754*c83a76b0SSuyog Pawar      * and L1 frames for most of search. Finally to report results to
2755*c83a76b0SSuyog Pawar      * encoder, the ref id has to be remapped to suitable list
2756*c83a76b0SSuyog Pawar      */
2757*c83a76b0SSuyog Pawar     S32 a_ref_idx_lc_to_l0[MAX_NUM_REF];
2758*c83a76b0SSuyog Pawar     S32 a_ref_idx_lc_to_l1[MAX_NUM_REF];
2759*c83a76b0SSuyog Pawar 
2760*c83a76b0SSuyog Pawar     /** Width and ht of each layer */
2761*c83a76b0SSuyog Pawar     S32 a_wd[MAX_NUM_LAYERS];
2762*c83a76b0SSuyog Pawar     S32 a_ht[MAX_NUM_LAYERS];
2763*c83a76b0SSuyog Pawar 
2764*c83a76b0SSuyog Pawar     /** Histogram, one for each ref, allocated during craete time */
2765*c83a76b0SSuyog Pawar     mv_hist_t *aps_mv_hist[MAX_NUM_REF];
2766*c83a76b0SSuyog Pawar 
2767*c83a76b0SSuyog Pawar     /** Whether a given ref id in Lc list is past frm or future frm */
2768*c83a76b0SSuyog Pawar     U08 au1_is_past[MAX_NUM_REF];
2769*c83a76b0SSuyog Pawar 
2770*c83a76b0SSuyog Pawar     /** These are L0 and L1 lists, storing ref id Lc in them */
2771*c83a76b0SSuyog Pawar     S08 ai1_past_list[MAX_NUM_REF];
2772*c83a76b0SSuyog Pawar     S08 ai1_future_list[MAX_NUM_REF];
2773*c83a76b0SSuyog Pawar 
2774*c83a76b0SSuyog Pawar     /** Number of past and future ref pics sent this frm */
2775*c83a76b0SSuyog Pawar     S32 num_ref_past;
2776*c83a76b0SSuyog Pawar     S32 num_ref_future;
2777*c83a76b0SSuyog Pawar 
2778*c83a76b0SSuyog Pawar     void *pv_ext_frm_prms;
2779*c83a76b0SSuyog Pawar 
2780*c83a76b0SSuyog Pawar     hme_frm_prms_t *ps_hme_frm_prms;
2781*c83a76b0SSuyog Pawar 
2782*c83a76b0SSuyog Pawar     hme_ref_map_t *ps_hme_ref_map;
2783*c83a76b0SSuyog Pawar     /**
2784*c83a76b0SSuyog Pawar      *  Scale factor of any given ref lc to another ref in Q8
2785*c83a76b0SSuyog Pawar      *  First MAX_NUM_REF entries are to scale an mv of ref id k
2786*c83a76b0SSuyog Pawar      *  w.r.t. ref id 0 (approx 256 * POC delta(0) / POC delta(k))
2787*c83a76b0SSuyog Pawar      *  Next MAX_NUM_REF entreis are to scale mv of ref id 1 w.r.t. 0
2788*c83a76b0SSuyog Pawar      *  And so on
2789*c83a76b0SSuyog Pawar      */
2790*c83a76b0SSuyog Pawar     S16 ai2_ref_scf[MAX_NUM_REF * MAX_NUM_REF];
2791*c83a76b0SSuyog Pawar 
2792*c83a76b0SSuyog Pawar     /** bits for a given ref id, in either list L0/L1 */
2793*c83a76b0SSuyog Pawar     U08 au1_ref_bits_tlu_lc[2][MAX_NUM_REF];
2794*c83a76b0SSuyog Pawar 
2795*c83a76b0SSuyog Pawar     /** Points to above: 1 ptr for each list */
2796*c83a76b0SSuyog Pawar     U08 *apu1_ref_bits_tlu_lc[2];
2797*c83a76b0SSuyog Pawar 
2798*c83a76b0SSuyog Pawar     /** number of b fraems between P, depends on number of hierarchy layers */
2799*c83a76b0SSuyog Pawar     S32 num_b_frms;
2800*c83a76b0SSuyog Pawar 
2801*c83a76b0SSuyog Pawar     /** Frame level qp passed every frame by ME's caller */
2802*c83a76b0SSuyog Pawar     S32 frm_qstep;
2803*c83a76b0SSuyog Pawar 
2804*c83a76b0SSuyog Pawar     /** Backup of frame parameters */
2805*c83a76b0SSuyog Pawar     hme_frm_prms_t s_frm_prms;
2806*c83a76b0SSuyog Pawar 
2807*c83a76b0SSuyog Pawar     /** Weighted prediction parameters for all references are stored
2808*c83a76b0SSuyog Pawar      *  Scratch buffers for populated widgted inputs are also stored in this
2809*c83a76b0SSuyog Pawar      */
2810*c83a76b0SSuyog Pawar     wgt_pred_ctxt_t s_wt_pred;
2811*c83a76b0SSuyog Pawar 
2812*c83a76b0SSuyog Pawar     /** Weighted pred enable flag */
2813*c83a76b0SSuyog Pawar     S32 i4_wt_pred_enable_flag;
2814*c83a76b0SSuyog Pawar 
2815*c83a76b0SSuyog Pawar     /* Pointer to hold 5 rows of best search node information */
2816*c83a76b0SSuyog Pawar     search_node_t *aps_best_search_nodes_4x8_n_rows[MAX_NUM_REF];
2817*c83a76b0SSuyog Pawar 
2818*c83a76b0SSuyog Pawar     search_node_t *aps_best_search_nodes_8x4_n_rows[MAX_NUM_REF];
2819*c83a76b0SSuyog Pawar 
2820*c83a76b0SSuyog Pawar     /* Pointer to hold 5 rows of best search node information */
2821*c83a76b0SSuyog Pawar     S16 *api2_sads_4x4_n_rows[MAX_NUM_REF];
2822*c83a76b0SSuyog Pawar 
2823*c83a76b0SSuyog Pawar     /*  Number of row buffers to store SADs and best search nodes */
2824*c83a76b0SSuyog Pawar     S32 i4_num_row_bufs;
2825*c83a76b0SSuyog Pawar 
2826*c83a76b0SSuyog Pawar     /* (HEVCE_MAX_HEIGHT>>1) assuming layer 1 is coarse layer and >>2 assuming block size is 4x4*/
2827*c83a76b0SSuyog Pawar     S32 ai4_row_index[(HEVCE_MAX_HEIGHT >> 1) >> 2];
2828*c83a76b0SSuyog Pawar 
2829*c83a76b0SSuyog Pawar     /* store L1 cost required for rate control for enc decision*/
2830*c83a76b0SSuyog Pawar     S32 i4_L1_hme_best_cost;
2831*c83a76b0SSuyog Pawar 
2832*c83a76b0SSuyog Pawar     /* store L1 cost required for modulation index calc*/
2833*c83a76b0SSuyog Pawar     //S32 i4_L1_hme_best_cost_for_ref;
2834*c83a76b0SSuyog Pawar 
2835*c83a76b0SSuyog Pawar     /* store L1 satd */
2836*c83a76b0SSuyog Pawar     S32 i4_L1_hme_sad;
2837*c83a76b0SSuyog Pawar     /* EIID: layer1 buffer to store the early inter intra costs and decisions */
2838*c83a76b0SSuyog Pawar     /* pic_level pointer stored here */
2839*c83a76b0SSuyog Pawar     ihevce_ed_blk_t *ps_ed_blk;
2840*c83a76b0SSuyog Pawar     /* EIID: layer1 buffer to store the sad/cost information for rate control
2841*c83a76b0SSuyog Pawar     or cu level qp modulation*/
2842*c83a76b0SSuyog Pawar     ihevce_ed_ctb_l1_t *ps_ed_ctb_l1;
2843*c83a76b0SSuyog Pawar     /** Dynamical Search Range parameters */
2844*c83a76b0SSuyog Pawar     coarse_dyn_range_prms_t s_coarse_dyn_range_prms;
2845*c83a76b0SSuyog Pawar 
2846*c83a76b0SSuyog Pawar     /** Dependency manager for Row level sync in HME pass */
2847*c83a76b0SSuyog Pawar     void *apv_dep_mngr_hme_sync[MAX_NUM_HME_LAYERS - 1];
2848*c83a76b0SSuyog Pawar 
2849*c83a76b0SSuyog Pawar     /* pointer buffers for memory mapping */
2850*c83a76b0SSuyog Pawar     UWORD8 *pu1_me_reverse_map_info;
2851*c83a76b0SSuyog Pawar 
2852*c83a76b0SSuyog Pawar     /*blk count which has higher SAD*/
2853*c83a76b0SSuyog Pawar     S32 i4_num_blks_high_sad;
2854*c83a76b0SSuyog Pawar 
2855*c83a76b0SSuyog Pawar     /*num of 8x8 blocks in nearest poc*/
2856*c83a76b0SSuyog Pawar     S32 i4_num_blks;
2857*c83a76b0SSuyog Pawar 
2858*c83a76b0SSuyog Pawar     /* thread id of the current context */
2859*c83a76b0SSuyog Pawar     WORD32 thrd_id;
2860*c83a76b0SSuyog Pawar 
2861*c83a76b0SSuyog Pawar     /* Should be typecast to a struct of type 'ihevce_me_optimised_function_list_t' */
2862*c83a76b0SSuyog Pawar     void *pv_me_optimised_function_list;
2863*c83a76b0SSuyog Pawar 
2864*c83a76b0SSuyog Pawar     ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list;
2865*c83a76b0SSuyog Pawar 
2866*c83a76b0SSuyog Pawar } coarse_me_ctxt_t;
2867*c83a76b0SSuyog Pawar 
2868*c83a76b0SSuyog Pawar /**
2869*c83a76b0SSuyog Pawar ******************************************************************************
2870*c83a76b0SSuyog Pawar  *  @struct  coarse_dyn_range_prms_t
2871*c83a76b0SSuyog Pawar  *  @brief   The parameters for Dyn. Search Range in coarse ME
2872*c83a76b0SSuyog Pawar ******************************************************************************
2873*c83a76b0SSuyog Pawar  */
2874*c83a76b0SSuyog Pawar typedef struct
2875*c83a76b0SSuyog Pawar {
2876*c83a76b0SSuyog Pawar     /** Dynamical Search Range parameters per ref_pic */
2877*c83a76b0SSuyog Pawar     dyn_range_prms_t as_dyn_range_prms[MAX_NUM_REF];
2878*c83a76b0SSuyog Pawar 
2879*c83a76b0SSuyog Pawar     /** Min y value Normalized per POC distance */
2880*c83a76b0SSuyog Pawar     WORD16 i2_dyn_min_y_per_poc;
2881*c83a76b0SSuyog Pawar     /** Max y value Normalized per POC distance */
2882*c83a76b0SSuyog Pawar     WORD16 i2_dyn_max_y_per_poc;
2883*c83a76b0SSuyog Pawar 
2884*c83a76b0SSuyog Pawar     /* The number of ref. pic. actually used in L0. Used to communicate */
2885*c83a76b0SSuyog Pawar     /* to ihevce_l0_me_frame_end and frame process                      */
2886*c83a76b0SSuyog Pawar     WORD32 i4_num_act_ref_in_l0;
2887*c83a76b0SSuyog Pawar 
2888*c83a76b0SSuyog Pawar     /*display number*/
2889*c83a76b0SSuyog Pawar     WORD32 i4_display_num;
2890*c83a76b0SSuyog Pawar 
2891*c83a76b0SSuyog Pawar } l0_dyn_range_prms_t;
2892*c83a76b0SSuyog Pawar 
2893*c83a76b0SSuyog Pawar /**
2894*c83a76b0SSuyog Pawar ******************************************************************************
2895*c83a76b0SSuyog Pawar  *  @brief inter prediction (MC) context for me loop
2896*c83a76b0SSuyog Pawar ******************************************************************************
2897*c83a76b0SSuyog Pawar  */
2898*c83a76b0SSuyog Pawar /*IMPORTANT please keep inter_pred_ctxt_t and inter_pred_me_ctxt_t as identical*/
2899*c83a76b0SSuyog Pawar typedef struct
2900*c83a76b0SSuyog Pawar {
2901*c83a76b0SSuyog Pawar     /** pointer to reference lists */
2902*c83a76b0SSuyog Pawar     recon_pic_buf_t *(*ps_ref_list)[HEVCE_MAX_REF_PICS * 2];
2903*c83a76b0SSuyog Pawar 
2904*c83a76b0SSuyog Pawar     /** scratch buffer for horizontal interpolation destination */
2905*c83a76b0SSuyog Pawar     WORD16 MEM_ALIGN16 ai2_horz_scratch[MAX_CTB_SIZE * (MAX_CTB_SIZE + 8)];
2906*c83a76b0SSuyog Pawar 
2907*c83a76b0SSuyog Pawar     /** scratch 16 bit buffer for interpolation in l0 direction */
2908*c83a76b0SSuyog Pawar     WORD16 MEM_ALIGN16 ai2_scratch_buf_l0[MAX_CTB_SIZE * MAX_CTB_SIZE];
2909*c83a76b0SSuyog Pawar 
2910*c83a76b0SSuyog Pawar     /** scratch 16 bit buffer for interpolation in l1 direction */
2911*c83a76b0SSuyog Pawar     WORD16 MEM_ALIGN16 ai2_scratch_buf_l1[MAX_CTB_SIZE * MAX_CTB_SIZE];
2912*c83a76b0SSuyog Pawar 
2913*c83a76b0SSuyog Pawar     /** Pointer to struct containing function pointers to
2914*c83a76b0SSuyog Pawar         functions in the 'common' library' */
2915*c83a76b0SSuyog Pawar     func_selector_t *ps_func_selector;
2916*c83a76b0SSuyog Pawar 
2917*c83a76b0SSuyog Pawar     /** common denominator used for luma weights */
2918*c83a76b0SSuyog Pawar     WORD32 i4_log2_luma_wght_denom;
2919*c83a76b0SSuyog Pawar 
2920*c83a76b0SSuyog Pawar     /** common denominator used for chroma weights */
2921*c83a76b0SSuyog Pawar     WORD32 i4_log2_chroma_wght_denom;
2922*c83a76b0SSuyog Pawar 
2923*c83a76b0SSuyog Pawar     /**  offset w.r.t frame start in horz direction (pels) */
2924*c83a76b0SSuyog Pawar     WORD32 i4_ctb_frm_pos_x;
2925*c83a76b0SSuyog Pawar 
2926*c83a76b0SSuyog Pawar     /**  offset w.r.t frame start in vert direction (pels) */
2927*c83a76b0SSuyog Pawar     WORD32 i4_ctb_frm_pos_y;
2928*c83a76b0SSuyog Pawar 
2929*c83a76b0SSuyog Pawar     /* Bit Depth of Input */
2930*c83a76b0SSuyog Pawar     WORD32 i4_bit_depth;
2931*c83a76b0SSuyog Pawar 
2932*c83a76b0SSuyog Pawar     /* 0 - 400; 1 - 420; 2 - 422; 3 - 444 */
2933*c83a76b0SSuyog Pawar     UWORD8 u1_chroma_array_type;
2934*c83a76b0SSuyog Pawar 
2935*c83a76b0SSuyog Pawar     /** weighted_pred_flag      */
2936*c83a76b0SSuyog Pawar     WORD8 i1_weighted_pred_flag;
2937*c83a76b0SSuyog Pawar 
2938*c83a76b0SSuyog Pawar     /** weighted_bipred_flag    */
2939*c83a76b0SSuyog Pawar     WORD8 i1_weighted_bipred_flag;
2940*c83a76b0SSuyog Pawar 
2941*c83a76b0SSuyog Pawar     /** Structure to describe extra CTBs around frame due to search
2942*c83a76b0SSuyog Pawar         range associated with distributed-mode. Entries are top, left,
2943*c83a76b0SSuyog Pawar         right and bottom */
2944*c83a76b0SSuyog Pawar     WORD32 ai4_tile_xtra_pel[4];
2945*c83a76b0SSuyog Pawar 
2946*c83a76b0SSuyog Pawar } inter_pred_me_ctxt_t;
2947*c83a76b0SSuyog Pawar 
2948*c83a76b0SSuyog Pawar typedef void FT_CALC_SATD_AND_RESULT(err_prms_t *ps_prms, result_upd_prms_t *ps_result_prms);
2949*c83a76b0SSuyog Pawar 
2950*c83a76b0SSuyog Pawar typedef struct
2951*c83a76b0SSuyog Pawar {
2952*c83a76b0SSuyog Pawar     FT_CALC_SATD_AND_RESULT *pf_evalsatd_update_1_best_result_pt_pu_16x16_num_part_eq_1;
2953*c83a76b0SSuyog Pawar     FT_CALC_SATD_AND_RESULT *pf_evalsatd_update_1_best_result_pt_pu_16x16_num_part_lt_9;
2954*c83a76b0SSuyog Pawar     FT_CALC_SATD_AND_RESULT *pf_evalsatd_update_1_best_result_pt_pu_16x16_num_part_lt_17;
2955*c83a76b0SSuyog Pawar     FT_CALC_SATD_AND_RESULT *pf_evalsatd_update_2_best_results_pt_pu_16x16_num_part_eq_1;
2956*c83a76b0SSuyog Pawar     FT_CALC_SATD_AND_RESULT *pf_evalsatd_update_2_best_results_pt_pu_16x16_num_part_lt_9;
2957*c83a76b0SSuyog Pawar     FT_CALC_SATD_AND_RESULT *pf_evalsatd_update_2_best_results_pt_pu_16x16_num_part_lt_17;
2958*c83a76b0SSuyog Pawar     FT_HAD_8X8_USING_4_4X4_R *pf_had_8x8_using_4_4x4_r;
2959*c83a76b0SSuyog Pawar     FT_HAD_16X16_R *pf_had_16x16_r;
2960*c83a76b0SSuyog Pawar     FT_HAD_32X32_USING_16X16 *pf_compute_32x32HAD_using_16x16;
2961*c83a76b0SSuyog Pawar } me_func_selector_t;
2962*c83a76b0SSuyog Pawar 
2963*c83a76b0SSuyog Pawar /**
2964*c83a76b0SSuyog Pawar ******************************************************************************
2965*c83a76b0SSuyog Pawar  *  @struct  me_frm_ctxt_t
2966*c83a76b0SSuyog Pawar  *  @brief   Handle for ME
2967*c83a76b0SSuyog Pawar ******************************************************************************
2968*c83a76b0SSuyog Pawar  */
2969*c83a76b0SSuyog Pawar typedef struct
2970*c83a76b0SSuyog Pawar {
2971*c83a76b0SSuyog Pawar     /** Init search candts, 2 sets, one for 4x8 and one for 8x4 */
2972*c83a76b0SSuyog Pawar     search_node_t s_init_search_node[MAX_INIT_CANDTS];
2973*c83a76b0SSuyog Pawar 
2974*c83a76b0SSuyog Pawar     /** Motion Vectors array */
2975*c83a76b0SSuyog Pawar     mv_t as_search_cand_mv[MAX_INIT_CANDTS];
2976*c83a76b0SSuyog Pawar 
2977*c83a76b0SSuyog Pawar     /** Results of 16 16x16 blks within a CTB used in enc layer */
2978*c83a76b0SSuyog Pawar     search_results_t as_search_results_16x16[16];
2979*c83a76b0SSuyog Pawar 
2980*c83a76b0SSuyog Pawar     /** Results of 4 32x32 blks in a ctb for enc layer merge stage */
2981*c83a76b0SSuyog Pawar     search_results_t as_search_results_32x32[4];
2982*c83a76b0SSuyog Pawar 
2983*c83a76b0SSuyog Pawar     /** Same as above but fo 64x64 blk */
2984*c83a76b0SSuyog Pawar     search_results_t s_search_results_64x64;
2985*c83a76b0SSuyog Pawar 
2986*c83a76b0SSuyog Pawar     /**
2987*c83a76b0SSuyog Pawar      * Below arays store input, 4 recon planes for each ref pic.
2988*c83a76b0SSuyog Pawar      * These are duplications, and are present within layer ctxts, but
2989*c83a76b0SSuyog Pawar      * kept here together for faster indexing during search
2990*c83a76b0SSuyog Pawar      */
2991*c83a76b0SSuyog Pawar 
2992*c83a76b0SSuyog Pawar     U08 *apu1_list_rec_fxfy[MAX_NUM_LAYERS][MAX_NUM_REF];
2993*c83a76b0SSuyog Pawar     U08 *apu1_list_rec_hxfy[MAX_NUM_LAYERS][MAX_NUM_REF];
2994*c83a76b0SSuyog Pawar     U08 *apu1_list_rec_fxhy[MAX_NUM_LAYERS][MAX_NUM_REF];
2995*c83a76b0SSuyog Pawar     U08 *apu1_list_rec_hxhy[MAX_NUM_LAYERS][MAX_NUM_REF];
2996*c83a76b0SSuyog Pawar     U08 *apu1_list_inp[MAX_NUM_LAYERS][MAX_NUM_REF];
2997*c83a76b0SSuyog Pawar 
2998*c83a76b0SSuyog Pawar     void *apv_list_dep_mngr[MAX_NUM_LAYERS][MAX_NUM_REF];
2999*c83a76b0SSuyog Pawar 
3000*c83a76b0SSuyog Pawar     /** Ptr to all layer context placeholder for curr pic encoded */
3001*c83a76b0SSuyog Pawar     layers_descr_t *ps_curr_descr;
3002*c83a76b0SSuyog Pawar 
3003*c83a76b0SSuyog Pawar     /**
3004*c83a76b0SSuyog Pawar      * ME uses ref id lc to search multi ref. This TLU gets POC of
3005*c83a76b0SSuyog Pawar      * the pic w.r.t. a given ref id
3006*c83a76b0SSuyog Pawar      */
3007*c83a76b0SSuyog Pawar     S32 ai4_ref_idx_to_poc_lc[MAX_NUM_REF];
3008*c83a76b0SSuyog Pawar 
3009*c83a76b0SSuyog Pawar     /** POC of pic encoded just before current */
3010*c83a76b0SSuyog Pawar     S32 i4_prev_poc;
3011*c83a76b0SSuyog Pawar 
3012*c83a76b0SSuyog Pawar     /** POC of curret pic being encoded */
3013*c83a76b0SSuyog Pawar     S32 i4_curr_poc;
3014*c83a76b0SSuyog Pawar 
3015*c83a76b0SSuyog Pawar     /** Buf mgr for memory allocation */
3016*c83a76b0SSuyog Pawar     buf_mgr_t s_buf_mgr;
3017*c83a76b0SSuyog Pawar 
3018*c83a76b0SSuyog Pawar     /** MV Grid for L0 and L1, this is active one used */
3019*c83a76b0SSuyog Pawar     mv_grid_t as_mv_grid[2];
3020*c83a76b0SSuyog Pawar 
3021*c83a76b0SSuyog Pawar     /**
3022*c83a76b0SSuyog Pawar      * MV grid for FPEL and QPEL maintained separately. Depending on the
3023*c83a76b0SSuyog Pawar      * correct prediction res. being used, copy appropriate results to
3024*c83a76b0SSuyog Pawar      * the as_mv_Grid structure
3025*c83a76b0SSuyog Pawar      */
3026*c83a76b0SSuyog Pawar     mv_grid_t as_mv_grid_fpel[2];
3027*c83a76b0SSuyog Pawar     mv_grid_t as_mv_grid_qpel[2];
3028*c83a76b0SSuyog Pawar 
3029*c83a76b0SSuyog Pawar     /** Number of HME layers encode + non encode */
3030*c83a76b0SSuyog Pawar     S32 num_layers;
3031*c83a76b0SSuyog Pawar 
3032*c83a76b0SSuyog Pawar     /** Alloc time parameter, max ref frms used for this session */
3033*c83a76b0SSuyog Pawar     S32 max_num_ref;
3034*c83a76b0SSuyog Pawar 
3035*c83a76b0SSuyog Pawar     /**
3036*c83a76b0SSuyog Pawar      * Number of layers that use explicit search. Explicit search means
3037*c83a76b0SSuyog Pawar      * that each ref id is searched separately
3038*c83a76b0SSuyog Pawar      */
3039*c83a76b0SSuyog Pawar     S32 num_layers_explicit_search;
3040*c83a76b0SSuyog Pawar 
3041*c83a76b0SSuyog Pawar     /**
3042*c83a76b0SSuyog Pawar      * Maximum number of results maintained at any refinement layer
3043*c83a76b0SSuyog Pawar      * search. Important from mem alloc perspective
3044*c83a76b0SSuyog Pawar      */
3045*c83a76b0SSuyog Pawar     S32 max_num_results;
3046*c83a76b0SSuyog Pawar 
3047*c83a76b0SSuyog Pawar     /** Same as above but for coarse layer */
3048*c83a76b0SSuyog Pawar     S32 max_num_results_coarse;
3049*c83a76b0SSuyog Pawar 
3050*c83a76b0SSuyog Pawar     /** Array of flags, one per layer indicating hwether layer is encoded */
3051*c83a76b0SSuyog Pawar     U08 u1_encode[MAX_NUM_LAYERS];
3052*c83a76b0SSuyog Pawar 
3053*c83a76b0SSuyog Pawar     /* Parameters used for lambda computation */
3054*c83a76b0SSuyog Pawar     frm_lambda_ctxt_t s_frm_lambda_ctxt;
3055*c83a76b0SSuyog Pawar 
3056*c83a76b0SSuyog Pawar     /**
3057*c83a76b0SSuyog Pawar      * Array look up created each frm, maintaining the corresponding
3058*c83a76b0SSuyog Pawar      * layer descr look up for each ref id
3059*c83a76b0SSuyog Pawar      */
3060*c83a76b0SSuyog Pawar     S32 a_ref_to_descr_id[MAX_NUM_REF];
3061*c83a76b0SSuyog Pawar 
3062*c83a76b0SSuyog Pawar     /**
3063*c83a76b0SSuyog Pawar      * Array lookup created each frame that maps a given ref id
3064*c83a76b0SSuyog Pawar      * pertaining to unified list to a L0/L1 list. Encoder searches in terms
3065*c83a76b0SSuyog Pawar      * of LC list or in other words does not differentiate between L0
3066*c83a76b0SSuyog Pawar      * and L1 frames for most of search. Finally to report results to
3067*c83a76b0SSuyog Pawar      * encoder, the ref id has to be remapped to suitable list
3068*c83a76b0SSuyog Pawar      */
3069*c83a76b0SSuyog Pawar     S32 a_ref_idx_lc_to_l0[MAX_NUM_REF];
3070*c83a76b0SSuyog Pawar     S32 a_ref_idx_lc_to_l1[MAX_NUM_REF];
3071*c83a76b0SSuyog Pawar 
3072*c83a76b0SSuyog Pawar     /** Width and ht of each layer */
3073*c83a76b0SSuyog Pawar     S32 i4_wd;
3074*c83a76b0SSuyog Pawar     S32 i4_ht;
3075*c83a76b0SSuyog Pawar 
3076*c83a76b0SSuyog Pawar     /** Histogram, one for each ref, allocated during craete time */
3077*c83a76b0SSuyog Pawar     mv_hist_t *aps_mv_hist[MAX_NUM_REF];
3078*c83a76b0SSuyog Pawar 
3079*c83a76b0SSuyog Pawar     /**
3080*c83a76b0SSuyog Pawar      * Back input requiring > 8  bit precision, allocated during
3081*c83a76b0SSuyog Pawar      * create time, storing 2I-P0 for Bidir refinement
3082*c83a76b0SSuyog Pawar      */
3083*c83a76b0SSuyog Pawar     S16 *pi2_inp_bck;
3084*c83a76b0SSuyog Pawar     ctb_boundary_attrs_t as_ctb_bound_attrs[NUM_CTB_BOUNDARY_TYPES];
3085*c83a76b0SSuyog Pawar 
3086*c83a76b0SSuyog Pawar     /** Whether a given ref id in Lc list is past frm or future frm */
3087*c83a76b0SSuyog Pawar     U08 au1_is_past[MAX_NUM_REF];
3088*c83a76b0SSuyog Pawar 
3089*c83a76b0SSuyog Pawar     /** These are L0 and L1 lists, storing ref id Lc in them */
3090*c83a76b0SSuyog Pawar     S08 ai1_past_list[MAX_NUM_REF];
3091*c83a76b0SSuyog Pawar     S08 ai1_future_list[MAX_NUM_REF];
3092*c83a76b0SSuyog Pawar 
3093*c83a76b0SSuyog Pawar     /** Number of past and future ref pics sent this frm */
3094*c83a76b0SSuyog Pawar     S32 num_ref_past;
3095*c83a76b0SSuyog Pawar     S32 num_ref_future;
3096*c83a76b0SSuyog Pawar 
3097*c83a76b0SSuyog Pawar     /**
3098*c83a76b0SSuyog Pawar      * Passed by encoder, stored as void to avoid header file inclusion
3099*c83a76b0SSuyog Pawar      * of encoder wks into ME, these are frm prms passed by encoder,
3100*c83a76b0SSuyog Pawar      * pointers to ctbanalyse_t and cu_analyse_t structures and the
3101*c83a76b0SSuyog Pawar      * corresponding running ptrs
3102*c83a76b0SSuyog Pawar      */
3103*c83a76b0SSuyog Pawar 
3104*c83a76b0SSuyog Pawar     ctb_analyse_t *ps_ctb_analyse_base;
3105*c83a76b0SSuyog Pawar     cur_ctb_cu_tree_t *ps_cu_tree_base;
3106*c83a76b0SSuyog Pawar     me_ctb_data_t *ps_me_ctb_data_base;
3107*c83a76b0SSuyog Pawar 
3108*c83a76b0SSuyog Pawar     ctb_analyse_t *ps_ctb_analyse_curr_row;
3109*c83a76b0SSuyog Pawar     cu_analyse_t *ps_cu_analyse_curr_row;
3110*c83a76b0SSuyog Pawar     cur_ctb_cu_tree_t *ps_cu_tree_curr_row;
3111*c83a76b0SSuyog Pawar     me_ctb_data_t *ps_me_ctb_data_curr_row;
3112*c83a76b0SSuyog Pawar 
3113*c83a76b0SSuyog Pawar     /** Log2 of ctb size e.g. for 64 size, it will be 6 */
3114*c83a76b0SSuyog Pawar     S32 log_ctb_size;
3115*c83a76b0SSuyog Pawar 
3116*c83a76b0SSuyog Pawar     hme_frm_prms_t *ps_hme_frm_prms;
3117*c83a76b0SSuyog Pawar 
3118*c83a76b0SSuyog Pawar     hme_ref_map_t *ps_hme_ref_map;
3119*c83a76b0SSuyog Pawar 
3120*c83a76b0SSuyog Pawar     /**
3121*c83a76b0SSuyog Pawar      *  Scale factor of any given ref lc to another ref in Q8
3122*c83a76b0SSuyog Pawar      *  First MAX_NUM_REF entries are to scale an mv of ref id k
3123*c83a76b0SSuyog Pawar      *  w.r.t. ref id 0 (approx 256 * POC delta(0) / POC delta(k))
3124*c83a76b0SSuyog Pawar      *  Next MAX_NUM_REF entreis are to scale mv of ref id 1 w.r.t. 0
3125*c83a76b0SSuyog Pawar      *  And so on
3126*c83a76b0SSuyog Pawar      */
3127*c83a76b0SSuyog Pawar     S16 ai2_ref_scf[MAX_NUM_REF * MAX_NUM_REF];
3128*c83a76b0SSuyog Pawar 
3129*c83a76b0SSuyog Pawar     /** bits for a given ref id, in either list L0/L1 */
3130*c83a76b0SSuyog Pawar     U08 au1_ref_bits_tlu_lc[2][MAX_NUM_REF];
3131*c83a76b0SSuyog Pawar 
3132*c83a76b0SSuyog Pawar     /** Points to above: 1 ptr for each list */
3133*c83a76b0SSuyog Pawar     U08 *apu1_ref_bits_tlu_lc[2];
3134*c83a76b0SSuyog Pawar 
3135*c83a76b0SSuyog Pawar     /**
3136*c83a76b0SSuyog Pawar      *  Frame level base pointer to L0 IPE ctb analyze structures.
3137*c83a76b0SSuyog Pawar      *  This strucutres include the following
3138*c83a76b0SSuyog Pawar      *
3139*c83a76b0SSuyog Pawar      *  1. Best costs and modes at all levels of CTB (CU=8,16,32,64)
3140*c83a76b0SSuyog Pawar      *  2. Recommended IPE intra CU sizes for this CTB size
3141*c83a76b0SSuyog Pawar      *  3. Early intra/inter decision structures for all 8x8 blocks of CTB
3142*c83a76b0SSuyog Pawar      *     populated by L1-ME and L1-IPE
3143*c83a76b0SSuyog Pawar      *
3144*c83a76b0SSuyog Pawar      */
3145*c83a76b0SSuyog Pawar     ipe_l0_ctb_analyse_for_me_t *ps_ipe_l0_ctb_frm_base;
3146*c83a76b0SSuyog Pawar 
3147*c83a76b0SSuyog Pawar     /** array of ptrs to intra cost per layer encoded, stored at 8x8 */
3148*c83a76b0SSuyog Pawar     double *apd_intra_cost[MAX_NUM_LAYERS];
3149*c83a76b0SSuyog Pawar 
3150*c83a76b0SSuyog Pawar     /** number of b fraems between P, depends on number of hierarchy layers */
3151*c83a76b0SSuyog Pawar     S32 num_b_frms;
3152*c83a76b0SSuyog Pawar 
3153*c83a76b0SSuyog Pawar     /** Frame level qp passed every frame by ME's caller */
3154*c83a76b0SSuyog Pawar     S32 frm_qstep;
3155*c83a76b0SSuyog Pawar 
3156*c83a76b0SSuyog Pawar     /** Frame level qp with higher precision : left shifted by 8 */
3157*c83a76b0SSuyog Pawar     S32 qstep_ls8;
3158*c83a76b0SSuyog Pawar 
3159*c83a76b0SSuyog Pawar     /** Backup of frame parameters */
3160*c83a76b0SSuyog Pawar     hme_frm_prms_t s_frm_prms;
3161*c83a76b0SSuyog Pawar 
3162*c83a76b0SSuyog Pawar     /** Weighted prediction parameters for all references are stored
3163*c83a76b0SSuyog Pawar      *  Scratch buffers for populated widgted inputs are also stored in this
3164*c83a76b0SSuyog Pawar      */
3165*c83a76b0SSuyog Pawar     wgt_pred_ctxt_t s_wt_pred;
3166*c83a76b0SSuyog Pawar 
3167*c83a76b0SSuyog Pawar     /** Weighted pred enable flag */
3168*c83a76b0SSuyog Pawar     S32 i4_wt_pred_enable_flag;
3169*c83a76b0SSuyog Pawar 
3170*c83a76b0SSuyog Pawar     /** Results of 16 16x16 blks within a CTB used in enc layer */
3171*c83a76b0SSuyog Pawar     inter_cu_results_t as_cu16x16_results[16];
3172*c83a76b0SSuyog Pawar 
3173*c83a76b0SSuyog Pawar     /** Results of 4 32x32 blks in a ctb for enc layer merge stage */
3174*c83a76b0SSuyog Pawar     inter_cu_results_t as_cu32x32_results[4];
3175*c83a76b0SSuyog Pawar 
3176*c83a76b0SSuyog Pawar     /** Same as above but fo 64x64 blk */
3177*c83a76b0SSuyog Pawar     inter_cu_results_t s_cu64x64_results;
3178*c83a76b0SSuyog Pawar 
3179*c83a76b0SSuyog Pawar     /** Results of 64 8x8 blks within a CTB used in enc layer */
3180*c83a76b0SSuyog Pawar     inter_cu_results_t as_cu8x8_results[64];
3181*c83a76b0SSuyog Pawar 
3182*c83a76b0SSuyog Pawar     WORD32 i4_is_prev_frame_reference;
3183*c83a76b0SSuyog Pawar 
3184*c83a76b0SSuyog Pawar     rc_quant_t *ps_rc_quant_ctxt;
3185*c83a76b0SSuyog Pawar 
3186*c83a76b0SSuyog Pawar     /** Dynamical Search Range parameters */
3187*c83a76b0SSuyog Pawar     l0_dyn_range_prms_t as_l0_dyn_range_prms[NUM_SG_INTERLEAVED];
3188*c83a76b0SSuyog Pawar 
3189*c83a76b0SSuyog Pawar     /** Dependency manager for Row level sync in L0 ME pass */
3190*c83a76b0SSuyog Pawar     void *pv_dep_mngr_l0_me_sync;
3191*c83a76b0SSuyog Pawar 
3192*c83a76b0SSuyog Pawar     /** Pointer to structure containing function pointers of encoder*/
3193*c83a76b0SSuyog Pawar     me_func_selector_t *ps_func_selector;
3194*c83a76b0SSuyog Pawar 
3195*c83a76b0SSuyog Pawar     cluster_16x16_blk_t *ps_blk_16x16;
3196*c83a76b0SSuyog Pawar 
3197*c83a76b0SSuyog Pawar     cluster_32x32_blk_t *ps_blk_32x32;
3198*c83a76b0SSuyog Pawar 
3199*c83a76b0SSuyog Pawar     cluster_64x64_blk_t *ps_blk_64x64;
3200*c83a76b0SSuyog Pawar 
3201*c83a76b0SSuyog Pawar     ctb_cluster_info_t *ps_ctb_cluster_info;
3202*c83a76b0SSuyog Pawar 
3203*c83a76b0SSuyog Pawar     fullpel_refine_ctxt_t *ps_fullpel_refine_ctxt;
3204*c83a76b0SSuyog Pawar 
3205*c83a76b0SSuyog Pawar     /* thread id of the current context */
3206*c83a76b0SSuyog Pawar     WORD32 thrd_id;
3207*c83a76b0SSuyog Pawar 
3208*c83a76b0SSuyog Pawar     /* dependency manager for froward ME sync */
3209*c83a76b0SSuyog Pawar     void *pv_dep_mngr_encloop_dep_me;
3210*c83a76b0SSuyog Pawar     WORD32 i4_l0me_qp_mod;
3211*c83a76b0SSuyog Pawar 
3212*c83a76b0SSuyog Pawar     /*mc ctxt to reuse lume inter pred fucntion
3213*c83a76b0SSuyog Pawar     for the purpose of TRAQO*/
3214*c83a76b0SSuyog Pawar     inter_pred_me_ctxt_t s_mc_ctxt;
3215*c83a76b0SSuyog Pawar 
3216*c83a76b0SSuyog Pawar     WORD32 i4_rc_pass;
3217*c83a76b0SSuyog Pawar     /*pic type*/
3218*c83a76b0SSuyog Pawar     WORD32 i4_pic_type;
3219*c83a76b0SSuyog Pawar 
3220*c83a76b0SSuyog Pawar     WORD32 i4_temporal_layer;
3221*c83a76b0SSuyog Pawar 
3222*c83a76b0SSuyog Pawar     WORD32 i4_count;
3223*c83a76b0SSuyog Pawar 
3224*c83a76b0SSuyog Pawar     WORD32 i4_use_const_lamda_modifier;
3225*c83a76b0SSuyog Pawar 
3226*c83a76b0SSuyog Pawar     double f_i_pic_lamda_modifier;
3227*c83a76b0SSuyog Pawar 
3228*c83a76b0SSuyog Pawar     UWORD8 u1_is_curFrame_a_refFrame;
3229*c83a76b0SSuyog Pawar 
3230*c83a76b0SSuyog Pawar     /* src_var related variables */
3231*c83a76b0SSuyog Pawar     U32 au4_4x4_src_sigmaX[MAX_NUM_SIGMAS_4x4];
3232*c83a76b0SSuyog Pawar     U32 au4_4x4_src_sigmaXSquared[MAX_NUM_SIGMAS_4x4];
3233*c83a76b0SSuyog Pawar } me_frm_ctxt_t;
3234*c83a76b0SSuyog Pawar 
3235*c83a76b0SSuyog Pawar /**
3236*c83a76b0SSuyog Pawar ******************************************************************************
3237*c83a76b0SSuyog Pawar  *  @struct  me_ctxt_t
3238*c83a76b0SSuyog Pawar  *  @brief   Handle for ME
3239*c83a76b0SSuyog Pawar ******************************************************************************
3240*c83a76b0SSuyog Pawar  */
3241*c83a76b0SSuyog Pawar typedef struct
3242*c83a76b0SSuyog Pawar {
3243*c83a76b0SSuyog Pawar     /** Init prms send by encoder during create time */
3244*c83a76b0SSuyog Pawar     hme_init_prms_t s_init_prms;
3245*c83a76b0SSuyog Pawar 
3246*c83a76b0SSuyog Pawar     /** Not used in encoder, relevant to test bench */
3247*c83a76b0SSuyog Pawar     U08 *pu1_debug_out;
3248*c83a76b0SSuyog Pawar 
3249*c83a76b0SSuyog Pawar     void *pv_ext_frm_prms;
3250*c83a76b0SSuyog Pawar 
3251*c83a76b0SSuyog Pawar     /* Frame level ME ctxt */
3252*c83a76b0SSuyog Pawar     me_frm_ctxt_t *aps_me_frm_prms[MAX_NUM_ME_PARALLEL];
3253*c83a76b0SSuyog Pawar 
3254*c83a76b0SSuyog Pawar     /** Ptr to all layer ctxt place holder for all pics */
3255*c83a76b0SSuyog Pawar     /** number of reference descriptors should be equal to max number of active references **/
3256*c83a76b0SSuyog Pawar     layers_descr_t as_ref_descr[((DEFAULT_MAX_REFERENCE_PICS << 1) * MAX_NUM_ME_PARALLEL) + 1];
3257*c83a76b0SSuyog Pawar 
3258*c83a76b0SSuyog Pawar     /* Should be typecast to a struct of type 'ihevce_me_optimised_function_list_t' */
3259*c83a76b0SSuyog Pawar     void *pv_me_optimised_function_list;
3260*c83a76b0SSuyog Pawar 
3261*c83a76b0SSuyog Pawar     ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list;
3262*c83a76b0SSuyog Pawar 
3263*c83a76b0SSuyog Pawar     /* Pointer to Tile params base */
3264*c83a76b0SSuyog Pawar     void *pv_tile_params_base;
3265*c83a76b0SSuyog Pawar 
3266*c83a76b0SSuyog Pawar } me_ctxt_t;
3267*c83a76b0SSuyog Pawar 
3268*c83a76b0SSuyog Pawar typedef struct
3269*c83a76b0SSuyog Pawar {
3270*c83a76b0SSuyog Pawar     /** array of context for each thread */
3271*c83a76b0SSuyog Pawar     coarse_me_ctxt_t *aps_me_ctxt[MAX_NUM_FRM_PROC_THRDS_PRE_ENC];
3272*c83a76b0SSuyog Pawar 
3273*c83a76b0SSuyog Pawar     /** memtabs storage memory */
3274*c83a76b0SSuyog Pawar     hme_memtab_t as_memtabs[HME_COARSE_TOT_MEMTABS];
3275*c83a76b0SSuyog Pawar 
3276*c83a76b0SSuyog Pawar     /** Frame level parameters for ME */
3277*c83a76b0SSuyog Pawar     hme_frm_prms_t s_frm_prms;
3278*c83a76b0SSuyog Pawar 
3279*c83a76b0SSuyog Pawar     /** Holds all reference mapping */
3280*c83a76b0SSuyog Pawar     hme_ref_map_t s_ref_map;
3281*c83a76b0SSuyog Pawar 
3282*c83a76b0SSuyog Pawar     /** number of threads created run time */
3283*c83a76b0SSuyog Pawar     WORD32 i4_num_proc_thrds;
3284*c83a76b0SSuyog Pawar 
3285*c83a76b0SSuyog Pawar     /** Dependency manager for Row level sync in HME pass */
3286*c83a76b0SSuyog Pawar     /* Note : Indexing should be like layer_id - 1        */
3287*c83a76b0SSuyog Pawar     void *apv_dep_mngr_hme_sync[MAX_NUM_HME_LAYERS - 1];
3288*c83a76b0SSuyog Pawar     /* Should be typecast to a struct of type 'ihevce_me_optimised_function_list_t' */
3289*c83a76b0SSuyog Pawar     void *pv_me_optimised_function_list;
3290*c83a76b0SSuyog Pawar 
3291*c83a76b0SSuyog Pawar     ihevce_cmn_opt_func_t s_cmn_opt_func;
3292*c83a76b0SSuyog Pawar } coarse_me_master_ctxt_t;
3293*c83a76b0SSuyog Pawar 
3294*c83a76b0SSuyog Pawar typedef struct
3295*c83a76b0SSuyog Pawar {
3296*c83a76b0SSuyog Pawar     /** array of context for each thread */
3297*c83a76b0SSuyog Pawar     me_ctxt_t *aps_me_ctxt[MAX_NUM_FRM_PROC_THRDS_ENC];
3298*c83a76b0SSuyog Pawar 
3299*c83a76b0SSuyog Pawar     /** memtabs storage memory */
3300*c83a76b0SSuyog Pawar     hme_memtab_t as_memtabs[MAX_HME_ENC_TOT_MEMTABS];
3301*c83a76b0SSuyog Pawar 
3302*c83a76b0SSuyog Pawar     /** Frame level parameters for ME */
3303*c83a76b0SSuyog Pawar     hme_frm_prms_t as_frm_prms[MAX_NUM_ME_PARALLEL];
3304*c83a76b0SSuyog Pawar 
3305*c83a76b0SSuyog Pawar     /** Holds all reference mapping */
3306*c83a76b0SSuyog Pawar     hme_ref_map_t as_ref_map[MAX_NUM_ME_PARALLEL];
3307*c83a76b0SSuyog Pawar 
3308*c83a76b0SSuyog Pawar     /** number of threads created run time */
3309*c83a76b0SSuyog Pawar     WORD32 i4_num_proc_thrds;
3310*c83a76b0SSuyog Pawar 
3311*c83a76b0SSuyog Pawar     /** number of me frames running in parallel */
3312*c83a76b0SSuyog Pawar     WORD32 i4_num_me_frm_pllel;
3313*c83a76b0SSuyog Pawar 
3314*c83a76b0SSuyog Pawar     /** Pointer to structure containing function pointers of encoder*/
3315*c83a76b0SSuyog Pawar     me_func_selector_t s_func_selector;
3316*c83a76b0SSuyog Pawar     /* Should be typecast to a struct of type 'ihevce_me_optimised_function_list_t' */
3317*c83a76b0SSuyog Pawar     void *pv_me_optimised_function_list;
3318*c83a76b0SSuyog Pawar 
3319*c83a76b0SSuyog Pawar     ihevce_cmn_opt_func_t s_cmn_opt_func;
3320*c83a76b0SSuyog Pawar 
3321*c83a76b0SSuyog Pawar     /* Pointer to Tile params base */
3322*c83a76b0SSuyog Pawar     void *pv_tile_params_base;
3323*c83a76b0SSuyog Pawar 
3324*c83a76b0SSuyog Pawar } me_master_ctxt_t;
3325*c83a76b0SSuyog Pawar 
3326*c83a76b0SSuyog Pawar typedef struct
3327*c83a76b0SSuyog Pawar {
3328*c83a76b0SSuyog Pawar     S16 i2_mv_x;
3329*c83a76b0SSuyog Pawar 
3330*c83a76b0SSuyog Pawar     S16 i2_mv_y;
3331*c83a76b0SSuyog Pawar 
3332*c83a76b0SSuyog Pawar     U08 u1_ref_idx;
3333*c83a76b0SSuyog Pawar 
3334*c83a76b0SSuyog Pawar     U32 au4_node_map[2 * MAP_Y_MAX];
3335*c83a76b0SSuyog Pawar 
3336*c83a76b0SSuyog Pawar } subpel_dedup_enabler_t;
3337*c83a76b0SSuyog Pawar 
3338*c83a76b0SSuyog Pawar typedef subpel_dedup_enabler_t hme_dedup_enabler_t;
3339*c83a76b0SSuyog Pawar 
3340*c83a76b0SSuyog Pawar typedef struct
3341*c83a76b0SSuyog Pawar {
3342*c83a76b0SSuyog Pawar     layer_ctxt_t *ps_curr_layer;
3343*c83a76b0SSuyog Pawar 
3344*c83a76b0SSuyog Pawar     layer_ctxt_t *ps_coarse_layer;
3345*c83a76b0SSuyog Pawar 
3346*c83a76b0SSuyog Pawar     U08 *pu1_num_fpel_search_cands;
3347*c83a76b0SSuyog Pawar 
3348*c83a76b0SSuyog Pawar     S32 *pi4_ref_id_lc_to_l0_map;
3349*c83a76b0SSuyog Pawar 
3350*c83a76b0SSuyog Pawar     S32 *pi4_ref_id_lc_to_l1_map;
3351*c83a76b0SSuyog Pawar 
3352*c83a76b0SSuyog Pawar     S32 i4_pos_x;
3353*c83a76b0SSuyog Pawar 
3354*c83a76b0SSuyog Pawar     S32 i4_pos_y;
3355*c83a76b0SSuyog Pawar 
3356*c83a76b0SSuyog Pawar     S32 i4_num_act_ref_l0;
3357*c83a76b0SSuyog Pawar 
3358*c83a76b0SSuyog Pawar     S32 i4_num_act_ref_l1;
3359*c83a76b0SSuyog Pawar 
3360*c83a76b0SSuyog Pawar     search_candt_t *ps_search_cands;
3361*c83a76b0SSuyog Pawar 
3362*c83a76b0SSuyog Pawar     U08 u1_search_candidate_list_index;
3363*c83a76b0SSuyog Pawar 
3364*c83a76b0SSuyog Pawar     S32 i4_max_num_init_cands;
3365*c83a76b0SSuyog Pawar 
3366*c83a76b0SSuyog Pawar     U08 u1_pred_dir;
3367*c83a76b0SSuyog Pawar 
3368*c83a76b0SSuyog Pawar     /* Indicates the position of the current predDir in the processing order of predDir */
3369*c83a76b0SSuyog Pawar     U08 u1_pred_dir_ctr;
3370*c83a76b0SSuyog Pawar 
3371*c83a76b0SSuyog Pawar     /* The following 4 flags apply exclusively to spatial candidates */
3372*c83a76b0SSuyog Pawar     U08 u1_is_topRight_available;
3373*c83a76b0SSuyog Pawar 
3374*c83a76b0SSuyog Pawar     U08 u1_is_topLeft_available;
3375*c83a76b0SSuyog Pawar 
3376*c83a76b0SSuyog Pawar     U08 u1_is_top_available;
3377*c83a76b0SSuyog Pawar 
3378*c83a76b0SSuyog Pawar     U08 u1_is_left_available;
3379*c83a76b0SSuyog Pawar 
3380*c83a76b0SSuyog Pawar     S08 i1_default_ref_id;
3381*c83a76b0SSuyog Pawar 
3382*c83a76b0SSuyog Pawar     S08 i1_alt_default_ref_id;
3383*c83a76b0SSuyog Pawar 
3384*c83a76b0SSuyog Pawar     U08 u1_num_results_in_mvbank;
3385*c83a76b0SSuyog Pawar 
3386*c83a76b0SSuyog Pawar     BLK_SIZE_T e_search_blk_size;
3387*c83a76b0SSuyog Pawar 
3388*c83a76b0SSuyog Pawar } fpel_srch_cand_init_data_t;
3389*c83a76b0SSuyog Pawar 
3390*c83a76b0SSuyog Pawar typedef struct
3391*c83a76b0SSuyog Pawar {
3392*c83a76b0SSuyog Pawar     U08 *pu1_pred;
3393*c83a76b0SSuyog Pawar 
3394*c83a76b0SSuyog Pawar     S32 i4_pred_stride;
3395*c83a76b0SSuyog Pawar 
3396*c83a76b0SSuyog Pawar     U08 u1_pred_buf_array_id;
3397*c83a76b0SSuyog Pawar 
3398*c83a76b0SSuyog Pawar } hme_pred_buf_info_t;
3399*c83a76b0SSuyog Pawar 
3400*c83a76b0SSuyog Pawar /*****************************************************************************/
3401*c83a76b0SSuyog Pawar /* Typedefs                                                                  */
3402*c83a76b0SSuyog Pawar /*****************************************************************************/
3403*c83a76b0SSuyog Pawar typedef void (*PF_SAD_FXN_T)(err_prms_t *);
3404*c83a76b0SSuyog Pawar 
3405*c83a76b0SSuyog Pawar typedef void (*PF_SAD_RESULT_FXN_T)(err_prms_t *, result_upd_prms_t *ps_result_prms);
3406*c83a76b0SSuyog Pawar 
3407*c83a76b0SSuyog Pawar typedef WORD32 (*PF_SAD_FXN_TU_REC)(
3408*c83a76b0SSuyog Pawar     err_prms_t *,
3409*c83a76b0SSuyog Pawar     WORD32 lambda,
3410*c83a76b0SSuyog Pawar     WORD32 lamda_q_shift,
3411*c83a76b0SSuyog Pawar     WORD32 i4_frm_qstep,
3412*c83a76b0SSuyog Pawar     me_func_selector_t *ps_func_selector);
3413*c83a76b0SSuyog Pawar 
3414*c83a76b0SSuyog Pawar typedef void (*PF_RESULT_FXN_T)(result_upd_prms_t *);
3415*c83a76b0SSuyog Pawar 
3416*c83a76b0SSuyog Pawar typedef void (*PF_CALC_SAD_AND_RESULT)(
3417*c83a76b0SSuyog Pawar     hme_search_prms_t *, wgt_pred_ctxt_t *, err_prms_t *, result_upd_prms_t *, U08 **, S32);
3418*c83a76b0SSuyog Pawar 
3419*c83a76b0SSuyog Pawar #endif /* _HME_DEFS_H_ */
3420