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