1 /******************************************************************************
2  *
3  * Copyright (C) 2015 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************
18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 /**
21  *******************************************************************************
22  * @file
23  *  ih264e_me.h
24  *
25  * @brief
26  *
27  *
28  * @author
29  *  Ittiam
30  *
31  * @par List of Functions:
32  *  -
33  *
34  * @remarks
35  *  None
36  *
37  *******************************************************************************
38  */
39 
40 #ifndef _IME_STRUCTS_H_
41 #define _IME_STRUCTS_H_
42 
43 /**
44  * Motion vector
45  */
46 typedef struct
47 {
48     /**
49      * Horizontal Motion Vector
50      */
51     WORD16 i2_mvx;
52 
53     /**
54      * Vertical Motion Vector
55      */
56     WORD16 i2_mvy;
57 } ime_mv_t;
58 
59 
60 /**
61 **************************************************************************
62 *   @brief   mb_part_ctxt
63 *
64 *   Structure that would hold the information for individual MB partitions
65 *   gathered during the full pel ME stage
66 **************************************************************************
67 */
68 typedef struct
69 {
70     /**
71      * best mvs
72      */
73     ime_mv_t  s_mv_curr;
74 
75     /**
76      * mv predictor
77      */
78     ime_mv_t  s_mv_pred;
79 
80     /**
81      * SAD associated with the MB partition
82      */
83     WORD32 i4_mb_distortion;
84 
85     /**
86      * cost for the MB partition
87      */
88     WORD32 i4_mb_cost;
89 
90     /**
91      * Search position for least cost among the list of candidates
92      */
93     WORD32 i4_srch_pos_idx;
94 
95     /**
96      * Search position for least cost among the list of candidates
97      */
98     UWORD32 u4_exit;
99 
100     /*
101      * Buffer corresponding to best half pel cost
102      */
103     UWORD8 *pu1_best_hpel_buf;
104 
105 } mb_part_ctxt;
106 
107 
108 /**
109 **************************************************************************
110 *   @brief   me_ctxt_t
111 *
112 *   Structure encapsulating the parameters used in the motion estimation
113 *   context
114 **************************************************************************
115 */
116 typedef struct
117 {
118     /**
119      * Ref pointer to current MB luma for each ref list
120      */
121     UWORD8 *apu1_ref_buf_luma[MAX_NUM_REFLIST];
122 
123     /**
124      * Src pointer to current MB luma
125      */
126     UWORD8 *pu1_src_buf_luma;
127 
128     /**
129      * source stride
130      * (strides for luma and chroma are the same)
131      */
132     WORD32 i4_src_strd;
133 
134     /**
135      * recon stride
136      * (strides for luma and chroma are the same)
137      */
138     WORD32 i4_rec_strd;
139 
140     /**
141      * Offset for half pel x plane from the pic buf
142      */
143     UWORD32 u4_half_x_offset;
144 
145     /**
146      * Offset for half pel y plane from half x plane
147      */
148     UWORD32 u4_half_y_offset;
149 
150     /**
151      * Offset for half pel xy plane from half y plane
152      */
153     UWORD32 u4_half_xy_offset;
154 
155     /**
156      *  Search range in the X, Y axis in terms of pixels
157      */
158     WORD32 ai2_srch_boundaries[2];
159 
160     /**
161      *  Search range in the north direction in terms of pixels
162      */
163     WORD32 i4_srch_range_n;
164 
165     /**
166      *  Search range in the south direction in terms of pixels
167      */
168     WORD32 i4_srch_range_s;
169 
170     /**
171      *  Search range in the east direction in terms of pixels
172      */
173     WORD32 i4_srch_range_e;
174 
175     /**
176      *  Search range in the west direction in terms of pixels
177      */
178     WORD32 i4_srch_range_w;
179 
180     /**
181      * left mb motion vector
182      */
183     ime_mv_t s_left_mv;
184 
185     /**
186      * top left mb motion vector
187      */
188     ime_mv_t s_top_left_mv;
189 
190     /**
191      * Number of valid candidates for the Initial search position
192      */
193     UWORD32 u4_num_candidates[MAX_NUM_REFLIST + 1];
194 
195     /**
196      * Motion vector predictors derived from neighboring
197      * blocks for each of the six block partitions
198      */
199     ime_mv_t as_mv_init_search[MAX_NUM_REFLIST + 1][6];
200 
201     /**
202      * mv bits
203      */
204     UWORD8 *pu1_mv_bits;
205 
206     /**
207      * lambda (lagrange multiplier for cost computation)
208      */
209     UWORD32 u4_lambda_motion;
210 
211     /**
212      * enabled fast sad computation
213      */
214     UWORD32 u4_enable_fast_sad;
215 
216     /*
217      * Enable SKIP block prediction based on SATQD
218      */
219     UWORD32 u4_enable_stat_sad;
220 
221     /*
222      * Minimum distortion to search for
223      * */
224     WORD32 i4_min_sad;
225 
226     /*
227      * Signal that minimum sad has been reached in ME
228      * */
229     UWORD32 u4_min_sad_reached;
230 
231     /**
232      * Flag to enable/disbale half pel motion estimation
233      */
234     UWORD32 u4_enable_hpel;
235 
236     /**
237      * Diamond search Iteration Max Cnt
238      */
239     UWORD32 u4_num_layers;
240 
241     /**
242      * encoder me speed
243      */
244     UWORD32 u4_me_speed_preset;
245 
246     UWORD32 u4_left_is_intra;
247 
248     UWORD32 u4_left_is_skip;
249 
250     /* skip_type can be PREDL0, PREDL1 or  BIPRED */
251     WORD32 i4_skip_type;
252 
253     /* Biasing given for skip prediction */
254     WORD32 i4_skip_bias[2];
255 
256     /**
257      * Structure to store the MB partition info
258      * We need 1(L0)+1(L1)+1(bi)
259      */
260     mb_part_ctxt as_mb_part[MAX_NUM_REFLIST + 1];
261     /*
262      * Threshold to compare the sad with
263      */
264     UWORD16 *pu2_sad_thrsh;
265 
266     /**
267      * fn ptrs for compute sad routines
268      */
269     ime_compute_sad_ft *pf_ime_compute_sad_16x16[2];
270     ime_compute_sad_ft *pf_ime_compute_sad_16x8;
271     ime_compute_sad4_diamond *pf_ime_compute_sad4_diamond;
272     ime_compute_sad3_diamond *pf_ime_compute_sad3_diamond;
273     ime_compute_sad2_diamond *pf_ime_compute_sad2_diamond;
274     ime_sub_pel_compute_sad_16x16_ft *pf_ime_sub_pel_compute_sad_16x16;
275 
276     /*
277      * Function poitners for SATQD
278      */
279     ime_compute_sad_stat *pf_ime_compute_sad_stat_luma_16x16;
280 
281     /**
282      * Qp
283      */
284     UWORD8 u1_mb_qp;
285 
286     /*
287      * Buffers for holding subpel and bipred temp buffers
288      */
289     UWORD8 *apu1_subpel_buffs[SUBPEL_BUFF_CNT];
290 
291     WORD32 u4_subpel_buf_strd;
292 
293     /*
294      * Buffers to store the best halfpel plane*
295      */
296     UWORD8 *pu1_hpel_buf;
297 
298 } me_ctxt_t;
299 
300 
301 #endif  // _IME_STRUCTS_H_
302 
303