• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  *******************************************************************************
23  * @file
24  *  ih264e_me.h
25  *
26  * @brief
27  *  Contains declarations of global variables for H264 encoder
28  *
29  * @author
30  *  ittiam
31  *
32  * @remarks
33  *
34  *******************************************************************************
35  */
36 
37 #ifndef IH264E_ME_H_
38 #define IH264E_ME_H_
39 
40 /*****************************************************************************/
41 /* Constant Macros                                                           */
42 /*****************************************************************************/
43 
44 /**
45 ******************************************************************************
46  *  @brief     Skip Bias value for P slice
47 ******************************************************************************
48  */
49 #define SKIP_BIAS_P 0
50 
51 /**
52 ******************************************************************************
53  *  @brief     Skip Bias value for B slice
54 ******************************************************************************
55  */
56 #define SKIP_BIAS_B 0
57 
58 
59 /*****************************************************************************/
60 /* Function Macros                                                           */
61 /*****************************************************************************/
62 
63 /**
64  ******************************************************************************
65  *  @brief      compute median of 3 elements (a, b, c) and store the output
66  *  in to result. This is used for mv prediction
67  ******************************************************************************
68  */
69 
70 #define MEDIAN(a, b, c, result) if (a > b){\
71                                     if (b > c)\
72                                         result = b;\
73                                     else {\
74                                         if (a > c)\
75                                             result = c;\
76                                         else \
77                                             result = a;\
78                                     }\
79                                 }\
80                                 else {\
81                                     if (c > b)\
82                                         result = b;\
83                                     else {\
84                                         if (c > a)\
85                                             result = c;\
86                                         else \
87                                             result = a;\
88                                     }\
89                                 }
90 
91 /*****************************************************************************/
92 /* Extern Function Declarations                                              */
93 /*****************************************************************************/
94 
95 /**
96  *******************************************************************************
97  *
98  * @brief
99  *  This function populates the length of the codewords for motion vectors in the
100  *  range (-search range, search range) in pixels
101  *
102  * @param[in] ps_me
103  *  Pointer to me ctxt
104  *
105  * @param[out] pu1_mv_bits
106  *  length of the codeword for all mv's
107  *
108  * @remarks The length of the code words are derived from signed exponential
109  * goloumb codes.
110  *
111  *******************************************************************************
112  */
113 void ih264e_init_mv_bits(me_ctxt_t *ps_me);
114 
115 /**
116  *******************************************************************************
117  *
118  * @brief The function computes the parameters for a P skip MB
119  *
120  * @par Description:
121  *  The function computes the parameters for a P skip MB
122  *
123  * @param[in] ps_proc
124  *  Process context
125  *
126  * @param[in] u4_for_me
127  *  Flag to indicate the purpose of computing skip
128  *
129  * @param[out] ps_pred_mv
130  *  Flag to indicate the current active refernce list
131  *
132  * @returns
133  *       1) Updates skip MV in proc
134  *       2) Returns if the current MB can be coded as skip or not
135  *
136  * @remarks The code implements the logic as described in sec 8.4.1.1 in H264
137  *   specification.
138  *
139  *******************************************************************************
140 */
141 ih264e_skip_params_ft  ih264e_find_pskip_params;
142 
143 /**
144  *******************************************************************************
145  *
146  * @brief The function computes the parameters for a P skip MB
147  *
148  * @par Description:
149  *  The function computes the parameters for a P skip MB
150  *
151  * @param[in] ps_proc
152  *  Process context
153  *
154  * @param[in] u4_for_me
155  *  Flag to indicate the purpose of computing skip
156  *
157  * @param[out] ps_pred_mv
158  *  Flag to indicate the current active refernce list
159  *
160  * @returns
161  *       1) Updates skip MV in proc
162  *       2) Returns if the current MB can be coded as skip or not
163  *
164  * @remarks The code implements the logic as described in sec 8.4.1.1 in H264
165  *   specification.
166  *
167  *******************************************************************************
168 */
169 ih264e_skip_params_ft  ih264e_find_pskip_params_me;
170 
171 /**
172  *******************************************************************************
173  *
174  * @brief The function computes the parameters for a B skip MB
175  *
176  * @par Description:
177  *  The function computes the parameters for a B skip MB
178  *
179  * @param[in] ps_proc
180  *  Process context
181  *
182  * @param[in] u4_for_me
183  *  Flag to indicate the purpose of computing skip
184  *
185  * @param[out] ps_pred_mv
186  *  Flag to indicate the current active refernce list
187  *
188  * @returns
189  *       1) Updates skip MV in proc
190  *       2) Returns if the current MB can be coded as skip or not
191  *
192  * @remarks The code implements the logic as described in sec 8.4.1.1 in H264
193  *   specification.
194  *
195  *******************************************************************************
196 */
197 ih264e_skip_params_ft  ih264e_find_bskip_params;
198 
199 /**
200  *******************************************************************************
201  *
202  * @brief The function computes the parameters for a B skip MB
203  *
204  * @par Description:
205  *  The function computes the parameters for a B skip MB
206  *
207  * @param[in] ps_proc
208  *  Process context
209  *
210  * @param[in] u4_for_me
211  *  Flag to indicate the purpose of computing skip
212  *
213  * @param[out] ps_pred_mv
214  *  Flag to indicate the current active refernce list
215  *
216  * @returns
217  *       1) Updates skip MV in proc
218  *       2) The type of SKIP [L0/L1/BI]
219  *
220  * @remarks
221  *******************************************************************************
222 */
223 ih264e_skip_params_ft  ih264e_find_bskip_params_me;
224 
225 /**
226  *******************************************************************************
227  *
228  * @brief motion vector predictor
229  *
230  * @par Description:
231  *  The routine calculates the motion vector predictor for a given block,
232  *  given the candidate MV predictors.
233  *
234  * @param[in] ps_left_mb_pu
235  *  pointer to left mb motion vector info
236  *
237  * @param[in] ps_top_row_pu
238  *  pointer to top & top right mb motion vector info
239  *
240  * @param[out] ps_pred_mv
241  *  pointer to candidate predictors for the current block
242  *
243  * @returns  The x & y components of the MV predictor.
244  *
245  * @remarks The code implements the logic as described in sec 8.4.1.3 in H264
246  *   specification.
247  *   Assumptions : 1. Assumes Only partition of size 16x16
248  *
249  *******************************************************************************
250  */
251 void ih264e_get_mv_predictor(enc_pu_t *ps_left_mb_pu, enc_pu_t *ps_top_row_pu,
252                              enc_pu_mv_t *ps_pred_mv, WORD32 i4_ref_list);
253 
254 /**
255  *******************************************************************************
256  *
257  * @brief This fucntion evalues ME for 2 reference lists
258  *
259  * @par Description:
260  *  It evaluates skip, full-pel an half-pel and assigns the correct MV in proc
261  *
262  * @param[in] ps_proc
263  *  Process context corresponding to the job
264  *
265  * @returns  none
266  *
267  * @remarks none
268  *
269  *******************************************************************************
270  */
271 ih264e_compute_me_ft  ih264e_compute_me_multi_reflist;
272 
273 /**
274  *******************************************************************************
275  *
276  * @brief This fucntion evalues ME for single reflist [Pred L0]
277  *
278  * @par Description:
279  *  It evaluates skip, full-pel an half-pel and assigns the correct MV in proc
280  *
281  * @param[in] ps_proc
282  *  Process context corresponding to the job
283  *
284  * @returns  none
285  *
286  * @remarks none
287  *
288  *******************************************************************************
289  */
290 ih264e_compute_me_ft  ih264e_compute_me_single_reflist;
291 
292 /**
293  *******************************************************************************
294  *
295  * @brief This function initializes me ctxt
296  *
297  * @par Description:
298  *  Before dispatching the current job to me thread, the me context associated
299  *  with the job is initialized.
300  *
301  * @param[in] ps_proc
302  *  Process context corresponding to the job
303  *
304  * @returns  none
305  *
306  * @remarks none
307  *
308  *******************************************************************************
309  */
310 void ih264e_init_me(process_ctxt_t *ps_proc);
311 
312 /**
313  *******************************************************************************
314  *
315  * @brief This function performs motion estimation for the current NMB
316  *
317  * @par Description:
318  *  Intializes input and output pointers required by the function ih264e_compute_me
319  *  and calls the function ih264e_compute_me in a loop to process NMBs.
320  *
321  * @param[in] ps_proc
322  *  Process context corresponding to the job
323  *
324  * @returns
325  *
326  * @remarks none
327  *
328  *******************************************************************************
329  */
330 void ih264e_compute_me_nmb(process_ctxt_t *ps_proc, UWORD32 u4_nmb_count);
331 
332 /**
333  *******************************************************************************
334  *
335  * @brief This function performs MV prediction
336  *
337  * @par Description:
338  *
339  * @param[in] ps_proc
340  *  Process context corresponding to the job
341  *
342  * @returns  none
343  *
344  * @remarks none
345  *  This function will update the MB availability since intra inter decision
346  *  should be done before the call
347  *
348  *******************************************************************************
349  */
350 void ih264e_mv_pred(process_ctxt_t *ps_proc, WORD32 i4_reflist);
351 
352 /**
353  *******************************************************************************
354  *
355  * @brief This function approximates Pred. MV
356  *
357  * @par Description:
358  *
359  * @param[in] ps_proc
360  *  Process context corresponding to the job
361  *
362  * @returns  none
363  *
364  * @remarks none
365  *  Motion estimation happens at nmb level. For cost calculations, mv is appro
366  *  ximated using this function
367  *
368  *******************************************************************************
369  */
370 void ih264e_mv_pred_me(process_ctxt_t *ps_proc, WORD32 i4_ref_list);
371 
372 #endif /* IH264E_ME_H_ */
373