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