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 ih264d_mvpred.c 23 * 24 * \brief 25 * This file contains function specific to decoding Motion vector. 26 * 27 * Detailed_description 28 * 29 * \date 30 * 10-12-2002 31 * 32 * \author Arvind Raman 33 ************************************************************************** 34 */ 35 #include <string.h> 36 #include "ih264d_parse_cavlc.h" 37 #include "ih264d_error_handler.h" 38 #include "ih264d_structs.h" 39 #include "ih264d_defs.h" 40 #include "ih264_typedefs.h" 41 #include "ih264_macros.h" 42 #include "ih264_platform_macros.h" 43 #include "ih264d_mb_utils.h" 44 #include "ih264d_defs.h" 45 #include "ih264d_debug.h" 46 #include "ih264d_tables.h" 47 #include "ih264d_process_bslice.h" 48 #include "ih264d_mvpred.h" 49 #include "ih264d_inter_pred.h" 50 #include "ih264d_tables.h" 51 52 /*! 53 ************************************************************************** 54 * \if ih264d_get_motion_vector_predictor name : Name \endif 55 * 56 * \brief 57 * The routine calculates the motion vector predictor for a given block, 58 * given the candidate MV predictors. 59 * 60 * \param ps_mv_pred: Candidate predictors for the current block 61 * \param ps_currMv: Pointer to the left top edge of the current block in 62 * the MV bank 63 * 64 * \return 65 * _mvPred: The x & y components of the MV predictor. 66 * 67 * \note 68 * The code implements the logic as described in sec 8.4.1.2.1. Given 69 * the candidate predictors and the pointer to the top left edge of the 70 * block in the MV bank. 71 * 72 ************************************************************************** 73 */ 74 75 void ih264d_get_motion_vector_predictor(mv_pred_t * ps_result, 76 mv_pred_t **ps_mv_pred, 77 UWORD8 u1_ref_idx, 78 UWORD8 u1_B, 79 const UWORD8 *pu1_mv_pred_condition) 80 { 81 WORD8 c_temp; 82 UWORD8 uc_B2 = (u1_B << 1); 83 84 /* If only one of the candidate blocks has a reference frame equal to 85 the current block then use the same block as the final predictor */ 86 c_temp = 87 (ps_mv_pred[LEFT]->i1_ref_frame[u1_B] == u1_ref_idx) 88 | ((ps_mv_pred[TOP]->i1_ref_frame[u1_B] 89 == u1_ref_idx) << 1) 90 | ((ps_mv_pred[TOP_R]->i1_ref_frame[u1_B] 91 == u1_ref_idx) << 2); 92 c_temp = pu1_mv_pred_condition[c_temp]; 93 94 if(c_temp != -1) 95 { 96 /* Case when only when one of the cadidate block has the same 97 reference frame as the current block */ 98 ps_result->i2_mv[uc_B2 + 0] = ps_mv_pred[c_temp]->i2_mv[uc_B2 + 0]; 99 ps_result->i2_mv[uc_B2 + 1] = ps_mv_pred[c_temp]->i2_mv[uc_B2 + 1]; 100 } 101 else 102 { 103 WORD32 D0, D1; 104 D0 = MIN(ps_mv_pred[0]->i2_mv[uc_B2 + 0], 105 ps_mv_pred[1]->i2_mv[uc_B2 + 0]); 106 D1 = MAX(ps_mv_pred[0]->i2_mv[uc_B2 + 0], 107 ps_mv_pred[1]->i2_mv[uc_B2 + 0]); 108 D1 = MIN(D1, ps_mv_pred[2]->i2_mv[uc_B2 + 0]); 109 ps_result->i2_mv[uc_B2 + 0] = (WORD16)(MAX(D0, D1)); 110 111 D0 = MIN(ps_mv_pred[0]->i2_mv[uc_B2 + 1], 112 ps_mv_pred[1]->i2_mv[uc_B2 + 1]); 113 D1 = MAX(ps_mv_pred[0]->i2_mv[uc_B2 + 1], 114 ps_mv_pred[1]->i2_mv[uc_B2 + 1]); 115 D1 = MIN(D1, ps_mv_pred[2]->i2_mv[uc_B2 + 1]); 116 ps_result->i2_mv[uc_B2 + 1] = (WORD16)(MAX(D0, D1)); 117 118 } 119 } 120 121 /*! 122 ************************************************************************** 123 * \if ih264d_mbaff_mv_pred name : Name \endif 124 * 125 * \brief 126 * The routine calculates the motion vector predictor for a given block, 127 * given the candidate MV predictors. 128 * 129 * \param ps_mv_pred: Candidate predictors for the current block 130 * \param ps_currMv: Pointer to the left top edge of the current block in 131 * the MV bank 132 * 133 * \return 134 * _mvPred: The x & y components of the MV predictor. 135 * 136 * \note 137 * The code implements the logic as described in sec 8.4.1.2.1. Given 138 * the candidate predictors and the pointer to the top left edge of the 139 * block in the MV bank. 140 * 141 ************************************************************************** 142 */ 143 144 void ih264d_mbaff_mv_pred(mv_pred_t **ps_mv_pred, 145 UWORD8 u1_sub_mb_num, 146 mv_pred_t *ps_mv_nmb, 147 mv_pred_t *ps_mv_ntop, 148 dec_struct_t *ps_dec, 149 UWORD8 uc_mb_part_width, 150 dec_mb_info_t *ps_cur_mb_info, 151 UWORD8* pu0_scale) 152 { 153 UWORD16 u2_a_in = 0, u2_b_in = 0, u2_c_in = 0, u2_d_in = 0; 154 mv_pred_t *ps_mvpred_l, *ps_mvpred_tmp; 155 UWORD8 u1_sub_mb_x = (u1_sub_mb_num & 3), uc_sub_mb_y = (u1_sub_mb_num >> 2); 156 UWORD8 u1_is_cur_mb_fld, u1_is_left_mb_fld, u1_is_top_mb_fld; 157 UWORD8 u1_is_cur_mb_top; 158 159 u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag; 160 u1_is_cur_mb_top = ps_cur_mb_info->u1_topmb; 161 162 u1_is_left_mb_fld = ps_cur_mb_info->ps_left_mb->u1_mb_fld; 163 u1_is_top_mb_fld = ps_cur_mb_info->ps_top_mb->u1_mb_fld; 164 165 /* Checking in the subMB exists, calculating their motion vectors to be 166 used as predictors and the reference frames of those subMBs */ 167 ps_mv_pred[LEFT] = &ps_dec->s_default_mv_pred; 168 ps_mv_pred[TOP] = &(ps_dec->s_default_mv_pred); 169 ps_mv_pred[TOP_R] = &(ps_dec->s_default_mv_pred); 170 171 /* Check if the left subMb is available */ 172 if(u1_sub_mb_x) 173 { 174 u2_a_in = 1; 175 ps_mv_pred[LEFT] = (ps_mv_nmb - 1); 176 } 177 else 178 { 179 UWORD8 uc_temp; 180 u2_a_in = (ps_cur_mb_info->u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK); 181 if(u2_a_in) 182 { 183 ps_mvpred_l = (ps_dec->u4_num_pmbair) ? 184 ps_mv_nmb : 185 (ps_dec->ps_mv_left + (uc_sub_mb_y << 2) + 48 186 - (u1_is_cur_mb_top << 4)); 187 uc_temp = 29; 188 if(u1_is_cur_mb_fld ^ u1_is_left_mb_fld) 189 { 190 if(u1_is_left_mb_fld) 191 { 192 uc_temp += 193 (((uc_sub_mb_y & 1) << 2) 194 + ((uc_sub_mb_y & 2) << 1)); 195 uc_temp += ((u1_is_cur_mb_top) ? 0 : 8); 196 } 197 else 198 { 199 uc_temp = uc_temp - (uc_sub_mb_y << 2); 200 uc_temp += ((u1_is_cur_mb_top) ? 0 : 16); 201 } 202 } 203 ps_mv_pred[LEFT] = (ps_mvpred_l - uc_temp); 204 pu0_scale[LEFT] = u1_is_cur_mb_fld - u1_is_left_mb_fld; 205 } 206 } 207 208 /* Check if the top subMB is available */ 209 if((uc_sub_mb_y > 0) || ((u1_is_cur_mb_top | u1_is_cur_mb_fld) == 0)) 210 { 211 u2_b_in = 1; 212 ps_mv_pred[TOP] = ps_mv_nmb - 4; 213 } 214 else 215 { 216 u2_b_in = (ps_cur_mb_info->u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK); 217 if(u2_b_in) 218 { 219 /* CHANGED CODE */ 220 221 if(u1_is_top_mb_fld && u1_is_cur_mb_fld) 222 ps_mvpred_tmp = ps_mv_ntop; 223 else 224 { 225 ps_mvpred_tmp = ps_mv_ntop; 226 if(u1_is_cur_mb_top) 227 ps_mvpred_tmp += 16; 228 } 229 230 ps_mv_pred[TOP] = ps_mvpred_tmp; 231 pu0_scale[TOP] = u1_is_cur_mb_fld - u1_is_top_mb_fld; 232 } 233 } 234 235 /* Check if the top right subMb is available. The top right subMb is 236 defined as the top right subMb at the top right corner of the MB 237 partition. The top right subMb index starting from the top left 238 corner of the MB partition is given by 239 TopRightSubMbIndx = TopLeftSubMbIndx + (WidthOfMbPartition - 6) / 2 240 */ 241 u2_c_in = CHECKBIT(ps_cur_mb_info->u2_top_right_avail_mask, 242 (u1_sub_mb_num + uc_mb_part_width - 1)); 243 if(u2_c_in) 244 { 245 ps_mv_pred[TOP_R] = ps_mv_pred[TOP] + uc_mb_part_width; 246 pu0_scale[TOP_R] = pu0_scale[TOP]; 247 if((uc_sub_mb_y == 0) && ((u1_sub_mb_x + uc_mb_part_width) > 3)) 248 { 249 UWORD8 uc_isTopRtMbFld; 250 uc_isTopRtMbFld = ps_cur_mb_info->ps_top_right_mb->u1_mb_fld; 251 /* CHANGED CODE */ 252 ps_mvpred_tmp = ps_mv_ntop + uc_mb_part_width + 12; 253 ps_mvpred_tmp += (u1_is_cur_mb_top) ? 16 : 0; 254 ps_mvpred_tmp += (u1_is_cur_mb_fld && u1_is_cur_mb_top && uc_isTopRtMbFld) ? 255 0 : 16; 256 ps_mv_pred[TOP_R] = ps_mvpred_tmp; 257 pu0_scale[TOP_R] = u1_is_cur_mb_fld - uc_isTopRtMbFld; 258 } 259 } 260 else 261 { 262 u2_d_in = CHECKBIT(ps_cur_mb_info->u2_top_left_avail_mask, u1_sub_mb_num); 263 264 /* Check if the the top left subMB is available */ 265 if(u2_d_in) 266 { 267 UWORD8 uc_isTopLtMbFld; 268 269 ps_mv_pred[TOP_R] = ps_mv_pred[TOP] - 1; 270 pu0_scale[TOP_R] = pu0_scale[TOP]; 271 272 if(u1_sub_mb_x == 0) 273 { 274 if((uc_sub_mb_y > 0) || ((u1_is_cur_mb_top | u1_is_cur_mb_fld) == 0)) 275 { 276 uc_isTopLtMbFld = u1_is_left_mb_fld; 277 ps_mvpred_tmp = ps_mv_pred[LEFT] - 4; 278 279 if((u1_is_cur_mb_fld == 0) && uc_isTopLtMbFld) 280 { 281 ps_mvpred_tmp = ps_mv_pred[LEFT] + 16; 282 ps_mvpred_tmp -= (uc_sub_mb_y & 1) ? 0 : 4; 283 } 284 } 285 else 286 { 287 UWORD32 u4_cond = ps_dec->u4_num_pmbair; 288 uc_isTopLtMbFld = ps_cur_mb_info->u1_topleft_mb_fld; 289 290 /* CHANGED CODE */ 291 ps_mvpred_tmp = ps_mv_ntop - 29; 292 ps_mvpred_tmp += (u1_is_cur_mb_top) ? 16 : 0; 293 if(u1_is_cur_mb_fld && u1_is_cur_mb_top) 294 ps_mvpred_tmp -= (uc_isTopLtMbFld) ? 16 : 0; 295 } 296 ps_mv_pred[TOP_R] = ps_mvpred_tmp; 297 pu0_scale[TOP_R] = u1_is_cur_mb_fld - uc_isTopLtMbFld; 298 } 299 } 300 else if(u2_b_in == 0) 301 { 302 /* If all the subMBs B, C, D are all out of the frame then their MV 303 and their reference picture is equal to that of A */ 304 ps_mv_pred[TOP] = ps_mv_pred[LEFT]; 305 ps_mv_pred[TOP_R] = ps_mv_pred[LEFT]; 306 pu0_scale[TOP] = pu0_scale[LEFT]; 307 pu0_scale[TOP_R] = pu0_scale[LEFT]; 308 } 309 } 310 } 311 312 /*! 313 ************************************************************************** 314 * \if ih264d_non_mbaff_mv_pred name : Name \endif 315 * 316 * \brief 317 * The routine calculates the motion vector predictor for a given block, 318 * given the candidate MV predictors. 319 * 320 * \param ps_mv_pred: Candidate predictors for the current block 321 * \param ps_currMv: Pointer to the left top edge of the current block in 322 * the MV bank 323 * 324 * \return 325 * _mvPred: The x & y components of the MV predictor. 326 * 327 * \note 328 * The code implements the logic as described in sec 8.4.1.2.1. Given 329 * the candidate predictors and the pointer to the top left edge of the 330 * block in the MV bank. 331 * 332 ************************************************************************** 333 */ 334 #if(!MVPRED_NONMBAFF) 335 void ih264d_non_mbaff_mv_pred(mv_pred_t **ps_mv_pred, 336 UWORD8 u1_sub_mb_num, 337 mv_pred_t *ps_mv_nmb, 338 mv_pred_t *ps_mv_ntop, 339 dec_struct_t *ps_dec, 340 UWORD8 uc_mb_part_width, 341 dec_mb_info_t *ps_cur_mb_info) 342 { 343 UWORD16 u2_b_in = 0, u2_c_in = 0, u2_d_in = 0; 344 UWORD8 u1_sub_mb_x = (u1_sub_mb_num & 3), uc_sub_mb_y = (u1_sub_mb_num >> 2); 345 346 /* Checking in the subMB exists, calculating their motion vectors to be 347 used as predictors and the reference frames of those subMBs */ 348 349 ps_mv_pred[LEFT] = &ps_dec->s_default_mv_pred; 350 ps_mv_pred[TOP] = &(ps_dec->s_default_mv_pred); 351 ps_mv_pred[TOP_R] = &(ps_dec->s_default_mv_pred); 352 /* Check if the left subMb is available */ 353 354 if(u1_sub_mb_x) 355 { 356 ps_mv_pred[LEFT] = (ps_mv_nmb - 1); 357 } 358 else 359 { 360 if(ps_cur_mb_info->u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK) 361 { 362 ps_mv_pred[LEFT] = (ps_mv_nmb - 13); 363 } 364 } 365 366 /* Check if the top subMB is available */ 367 if(uc_sub_mb_y) 368 { 369 u2_b_in = 1; 370 ps_mv_ntop = ps_mv_nmb - 4; 371 ps_mv_pred[TOP] = ps_mv_ntop; 372 373 } 374 else 375 { 376 u2_b_in = (ps_cur_mb_info->u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK); 377 if(u2_b_in) 378 { 379 ps_mv_pred[TOP] = ps_mv_ntop; 380 } 381 } 382 383 /* Check if the top right subMb is available. The top right subMb is 384 defined as the top right subMb at the top right corner of the MB 385 partition. The top right subMb index starting from the top left 386 corner of the MB partition is given by 387 TopRightSubMbIndx = TopLeftSubMbIndx + (WidthOfMbPartition - 6) / 2 388 */ 389 u2_c_in = CHECKBIT(ps_cur_mb_info->u2_top_right_avail_mask, 390 (u1_sub_mb_num + uc_mb_part_width - 1)); 391 if(u2_c_in) 392 { 393 ps_mv_pred[TOP_R] = (ps_mv_ntop + uc_mb_part_width); 394 395 if(uc_sub_mb_y == 0) 396 { 397 /* CHANGED CODE */ 398 if((u1_sub_mb_x + uc_mb_part_width) > 3) 399 ps_mv_pred[TOP_R] += 12; 400 } 401 } 402 else 403 { 404 u2_d_in = CHECKBIT(ps_cur_mb_info->u2_top_left_avail_mask, u1_sub_mb_num); 405 /* Check if the the top left subMB is available */ 406 if(u2_d_in) 407 { 408 /* CHANGED CODE */ 409 ps_mv_pred[TOP_R] = (ps_mv_ntop - 1); 410 if(u1_sub_mb_x == 0) 411 { 412 if(uc_sub_mb_y) 413 { 414 ps_mv_pred[TOP_R] = (ps_mv_nmb - 17); 415 } 416 else 417 { 418 /* CHANGED CODE */ 419 ps_mv_pred[TOP_R] -= 12; 420 } 421 } 422 } 423 else if(u2_b_in == 0) 424 { 425 /* If all the subMBs B, C, D are all out of the frame then their MV 426 and their reference picture is equal to that of A */ 427 ps_mv_pred[TOP] = ps_mv_pred[LEFT]; 428 ps_mv_pred[TOP_R] = ps_mv_pred[LEFT]; 429 } 430 } 431 } 432 #endif 433 434 /*****************************************************************************/ 435 /* */ 436 /* Function Name : ih264d_mvpred_nonmbaffB */ 437 /* */ 438 /* Description : This function calculates the motion vector predictor, */ 439 /* for B-Slices */ 440 /* Inputs : <What inputs does the function take?> */ 441 /* Globals : None */ 442 /* Processing : The neighbours A(Left),B(Top),C(TopRight) are calculated */ 443 /* and based on the type of Mb the prediction is */ 444 /* appropriately done */ 445 /* Outputs : populates ps_mv_final_pred structure */ 446 /* Returns : u1_direct_zero_pred_flag which is used only in */ 447 /* decodeSpatialdirect() */ 448 /* */ 449 /* Issues : <List any issues or problems with this function> */ 450 /* */ 451 /* Revision History: */ 452 /* */ 453 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 454 /* 03 05 2005 TA First Draft */ 455 /* */ 456 /*****************************************************************************/ 457 #if(!MVPRED_NONMBAFF) 458 UWORD8 ih264d_mvpred_nonmbaffB(dec_struct_t *ps_dec, 459 dec_mb_info_t *ps_cur_mb_info, 460 mv_pred_t *ps_mv_nmb, 461 mv_pred_t *ps_mv_ntop, 462 mv_pred_t *ps_mv_final_pred, 463 UWORD8 u1_sub_mb_num, 464 UWORD8 uc_mb_part_width, 465 UWORD8 u1_lx_start, 466 UWORD8 u1_lxend, 467 UWORD8 u1_mb_mc_mode) 468 { 469 UWORD8 u1_a_in, u1_b_in, uc_temp1, uc_temp2, uc_temp3; 470 mv_pred_t *ps_mv_pred[3]; 471 UWORD8 uc_B2, uc_lx, u1_ref_idx; 472 UWORD8 u1_direct_zero_pred_flag = 0; 473 474 ih264d_non_mbaff_mv_pred(ps_mv_pred, u1_sub_mb_num, ps_mv_nmb, ps_mv_ntop, 475 ps_dec, uc_mb_part_width, ps_cur_mb_info); 476 477 for(uc_lx = u1_lx_start; uc_lx < u1_lxend; uc_lx++) 478 { 479 u1_ref_idx = ps_mv_final_pred->i1_ref_frame[uc_lx]; 480 uc_B2 = (uc_lx << 1); 481 switch(u1_mb_mc_mode) 482 { 483 case PRED_16x8: 484 /* Directional prediction for a 16x8 MB partition */ 485 if(u1_sub_mb_num == 0) 486 { 487 /* Calculating the MV pred for the top 16x8 block */ 488 if(ps_mv_pred[TOP]->i1_ref_frame[uc_lx] == u1_ref_idx) 489 { 490 /* If the reference frame used by the top subMB is same as the 491 reference frame used by the current block then MV predictor to 492 be used for the current block is same as the MV of the top 493 subMB */ 494 ps_mv_final_pred->i2_mv[uc_B2 + 0] = 495 ps_mv_pred[TOP]->i2_mv[uc_B2 + 0]; 496 ps_mv_final_pred->i2_mv[uc_B2 + 1] = 497 ps_mv_pred[TOP]->i2_mv[uc_B2 + 1]; 498 } 499 else 500 { 501 /* The MV predictor is calculated according to the process 502 defined in 8.4.1.2.1 */ 503 ih264d_get_motion_vector_predictor( 504 ps_mv_final_pred, 505 ps_mv_pred, 506 u1_ref_idx, 507 uc_lx, 508 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 509 } 510 } 511 else 512 { 513 if(ps_mv_pred[LEFT]->i1_ref_frame[uc_lx] == u1_ref_idx) 514 { 515 /* If the reference frame used by the left subMB is same as the 516 reference frame used by the current block then MV predictor to 517 be used for the current block is same as the MV of the left 518 subMB */ 519 ps_mv_final_pred->i2_mv[uc_B2 + 0] = 520 ps_mv_pred[LEFT]->i2_mv[uc_B2 + 0]; 521 ps_mv_final_pred->i2_mv[uc_B2 + 1] = 522 ps_mv_pred[LEFT]->i2_mv[uc_B2 + 1]; 523 } 524 else 525 { 526 /* The MV predictor is calculated according to the process 527 defined in 8.4.1.2.1 */ 528 ih264d_get_motion_vector_predictor( 529 ps_mv_final_pred, 530 ps_mv_pred, 531 u1_ref_idx, 532 uc_lx, 533 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 534 } 535 } 536 break; 537 case PRED_8x16: 538 /* Directional prediction for a 8x16 MB partition */ 539 if(u1_sub_mb_num == 0) 540 { 541 if(ps_mv_pred[LEFT]->i1_ref_frame[uc_lx] == u1_ref_idx) 542 { 543 /* If the reference frame used by the left subMB is same as the 544 reference frame used by the current block then MV predictor to 545 be used for the current block is same as the MV of the left 546 subMB */ 547 ps_mv_final_pred->i2_mv[uc_B2 + 0] = 548 ps_mv_pred[LEFT]->i2_mv[uc_B2 + 0]; 549 ps_mv_final_pred->i2_mv[uc_B2 + 1] = 550 ps_mv_pred[LEFT]->i2_mv[uc_B2 + 1]; 551 } 552 else 553 { 554 /* The MV predictor is calculated according to the process 555 defined in 8.4.1.2.1 */ 556 ih264d_get_motion_vector_predictor( 557 ps_mv_final_pred, 558 ps_mv_pred, 559 u1_ref_idx, 560 uc_lx, 561 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 562 } 563 } 564 else 565 { 566 if(ps_mv_pred[TOP_R]->i1_ref_frame[uc_lx] == u1_ref_idx) 567 { 568 /* If the reference frame used by the top right subMB is same as 569 the reference frame used by the current block then MV 570 predictor to be used for the current block is same as the MV 571 of the left subMB */ 572 ps_mv_final_pred->i2_mv[uc_B2 + 0] = 573 ps_mv_pred[TOP_R]->i2_mv[uc_B2 + 0]; 574 ps_mv_final_pred->i2_mv[uc_B2 + 1] = 575 ps_mv_pred[TOP_R]->i2_mv[uc_B2 + 1]; 576 } 577 else 578 { 579 /* The MV predictor is calculated according to the process 580 defined in 8.4.1.2.1 */ 581 ih264d_get_motion_vector_predictor( 582 ps_mv_final_pred, 583 ps_mv_pred, 584 u1_ref_idx, 585 uc_lx, 586 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 587 } 588 } 589 break; 590 case B_DIRECT_SPATIAL: 591 /* Case when the MB has been skipped */ 592 /* If either of left or the top subMB is not present 593 OR 594 If both the MV components of either the left or the top subMB are 595 zero and their reference frame pointer pointing to 0 596 then MV for the skipped MB is zero 597 else the Median of the mv_pred_t is used */ 598 uc_temp1 = (UWORD8)ps_mv_pred[LEFT]->i1_ref_frame[0]; 599 uc_temp2 = (UWORD8)ps_mv_pred[TOP]->i1_ref_frame[0]; 600 uc_temp3 = (UWORD8)ps_mv_pred[TOP_R]->i1_ref_frame[0]; 601 602 ps_mv_final_pred->i1_ref_frame[0] = MIN(uc_temp1, 603 MIN(uc_temp2, uc_temp3)); 604 605 uc_temp1 = (UWORD8)ps_mv_pred[LEFT]->i1_ref_frame[1]; 606 uc_temp2 = (UWORD8)ps_mv_pred[TOP]->i1_ref_frame[1]; 607 uc_temp3 = (UWORD8)ps_mv_pred[TOP_R]->i1_ref_frame[1]; 608 609 ps_mv_final_pred->i1_ref_frame[1] = MIN(uc_temp1, 610 MIN(uc_temp2, uc_temp3)); 611 612 if((ps_mv_final_pred->i1_ref_frame[0] < 0) 613 && (ps_mv_final_pred->i1_ref_frame[1] < 0)) 614 { 615 u1_direct_zero_pred_flag = 1; 616 ps_mv_final_pred->i1_ref_frame[0] = 0; 617 ps_mv_final_pred->i1_ref_frame[1] = 0; 618 } 619 ih264d_get_motion_vector_predictor( 620 ps_mv_final_pred, ps_mv_pred, 621 ps_mv_final_pred->i1_ref_frame[0], 0, 622 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 623 624 ih264d_get_motion_vector_predictor( 625 ps_mv_final_pred, ps_mv_pred, 626 ps_mv_final_pred->i1_ref_frame[1], 1, 627 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 628 629 break; 630 case MB_SKIP: 631 /* Case when the MB has been skipped */ 632 /* If either of left or the top subMB is not present 633 OR 634 If both the MV components of either the left or the top subMB are 635 zero and their reference frame pointer pointing to 0 636 then MV for the skipped MB is zero 637 else the Median of the mv_pred_t is used */ 638 u1_a_in = (ps_cur_mb_info->u1_mb_ngbr_availablity & 639 LEFT_MB_AVAILABLE_MASK); 640 u1_b_in = (ps_cur_mb_info->u1_mb_ngbr_availablity & 641 TOP_MB_AVAILABLE_MASK); 642 if(((u1_a_in * u1_b_in) == 0) 643 || ((ps_mv_pred[LEFT]->i2_mv[0] 644 | ps_mv_pred[LEFT]->i2_mv[1] 645 | ps_mv_pred[LEFT]->i1_ref_frame[0]) 646 == 0) 647 || ((ps_mv_pred[TOP]->i2_mv[0] 648 | ps_mv_pred[TOP]->i2_mv[1] 649 | ps_mv_pred[TOP]->i1_ref_frame[0]) 650 == 0)) 651 { 652 ps_mv_final_pred->i2_mv[0] = 0; 653 ps_mv_final_pred->i2_mv[1] = 0; 654 break; 655 } 656 /* If the condition above is not true calculate the MV predictor 657 according to the process defined in sec 8.4.1.2.1 */ 658 default: 659 ih264d_get_motion_vector_predictor( 660 ps_mv_final_pred, ps_mv_pred, u1_ref_idx, uc_lx, 661 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 662 break; 663 } 664 } 665 return (u1_direct_zero_pred_flag); 666 } 667 #endif 668 669 /*****************************************************************************/ 670 /* */ 671 /* Function Name : ih264d_mvpred_nonmbaff */ 672 /* */ 673 /* Description : This function calculates the motion vector predictor, */ 674 /* for all the slice types other than B_SLICE */ 675 /* Inputs : <What inputs does the function take?> */ 676 /* Globals : None */ 677 /* Processing : The neighbours A(Left),B(Top),C(TopRight) are calculated */ 678 /* and based on the type of Mb the prediction is */ 679 /* appropriately done */ 680 /* Outputs : populates ps_mv_final_pred structure */ 681 /* Returns : u1_direct_zero_pred_flag which is used only in */ 682 /* decodeSpatialdirect() */ 683 /* */ 684 /* Issues : <List any issues or problems with this function> */ 685 /* */ 686 /* Revision History: */ 687 /* */ 688 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 689 /* 03 05 2005 TA First Draft */ 690 /* */ 691 /*****************************************************************************/ 692 #if(!MVPRED_NONMBAFF) 693 UWORD8 ih264d_mvpred_nonmbaff(dec_struct_t *ps_dec, 694 dec_mb_info_t *ps_cur_mb_info, 695 mv_pred_t *ps_mv_nmb, 696 mv_pred_t *ps_mv_ntop, 697 mv_pred_t *ps_mv_final_pred, 698 UWORD8 u1_sub_mb_num, 699 UWORD8 uc_mb_part_width, 700 UWORD8 u1_lx_start, 701 UWORD8 u1_lxend, 702 UWORD8 u1_mb_mc_mode) 703 { 704 UWORD8 u1_a_in, u1_b_in, uc_temp1, uc_temp2, uc_temp3; 705 mv_pred_t *ps_mv_pred[3]; 706 UWORD8 u1_ref_idx; 707 UWORD8 u1_direct_zero_pred_flag = 0; 708 UNUSED(u1_lx_start); 709 UNUSED(u1_lxend); 710 ih264d_non_mbaff_mv_pred(ps_mv_pred, u1_sub_mb_num, ps_mv_nmb, ps_mv_ntop, 711 ps_dec, uc_mb_part_width, ps_cur_mb_info); 712 713 u1_ref_idx = ps_mv_final_pred->i1_ref_frame[0]; 714 715 switch(u1_mb_mc_mode) 716 { 717 case PRED_16x8: 718 /* Directional prediction for a 16x8 MB partition */ 719 if(u1_sub_mb_num == 0) 720 { 721 /* Calculating the MV pred for the top 16x8 block */ 722 if(ps_mv_pred[TOP]->i1_ref_frame[0] == u1_ref_idx) 723 { 724 /* If the reference frame used by the top subMB is same as the 725 reference frame used by the current block then MV predictor to 726 be used for the current block is same as the MV of the top 727 subMB */ 728 729 ps_mv_final_pred->i2_mv[0] = ps_mv_pred[TOP]->i2_mv[0]; 730 ps_mv_final_pred->i2_mv[1] = ps_mv_pred[TOP]->i2_mv[1]; 731 } 732 else 733 { 734 /* The MV predictor is calculated according to the process 735 defined in 8.4.1.2.1 */ 736 ih264d_get_motion_vector_predictor( 737 ps_mv_final_pred, 738 ps_mv_pred, 739 u1_ref_idx, 740 0, 741 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 742 } 743 } 744 else 745 { 746 if(ps_mv_pred[LEFT]->i1_ref_frame[0] == u1_ref_idx) 747 { 748 /* If the reference frame used by the left subMB is same as the 749 reference frame used by the current block then MV predictor to 750 be used for the current block is same as the MV of the left 751 subMB */ 752 753 ps_mv_final_pred->i2_mv[0] = ps_mv_pred[LEFT]->i2_mv[0]; 754 ps_mv_final_pred->i2_mv[1] = ps_mv_pred[LEFT]->i2_mv[1]; 755 } 756 else 757 { 758 /* The MV predictor is calculated according to the process 759 defined in 8.4.1.2.1 */ 760 ih264d_get_motion_vector_predictor( 761 ps_mv_final_pred, 762 ps_mv_pred, 763 u1_ref_idx, 764 0, 765 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 766 } 767 } 768 break; 769 case PRED_8x16: 770 /* Directional prediction for a 8x16 MB partition */ 771 if(u1_sub_mb_num == 0) 772 { 773 if(ps_mv_pred[LEFT]->i1_ref_frame[0] == u1_ref_idx) 774 { 775 /* If the reference frame used by the left subMB is same as the 776 reference frame used by the current block then MV predictor to 777 be used for the current block is same as the MV of the left 778 subMB */ 779 780 ps_mv_final_pred->i2_mv[0] = ps_mv_pred[LEFT]->i2_mv[0]; 781 ps_mv_final_pred->i2_mv[1] = ps_mv_pred[LEFT]->i2_mv[1]; 782 } 783 else 784 { 785 /* The MV predictor is calculated according to the process 786 defined in 8.4.1.2.1 */ 787 ih264d_get_motion_vector_predictor( 788 ps_mv_final_pred, 789 ps_mv_pred, 790 u1_ref_idx, 791 0, 792 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 793 } 794 } 795 else 796 { 797 if(ps_mv_pred[TOP_R]->i1_ref_frame[0] == u1_ref_idx) 798 { 799 /* If the reference frame used by the top right subMB is same as 800 the reference frame used by the current block then MV 801 predictor to be used for the current block is same as the MV 802 of the left subMB */ 803 804 ps_mv_final_pred->i2_mv[0] = ps_mv_pred[TOP_R]->i2_mv[0]; 805 ps_mv_final_pred->i2_mv[1] = ps_mv_pred[TOP_R]->i2_mv[1]; 806 } 807 else 808 { 809 /* The MV predictor is calculated according to the process 810 defined in 8.4.1.2.1 */ 811 ih264d_get_motion_vector_predictor( 812 ps_mv_final_pred, 813 ps_mv_pred, 814 u1_ref_idx, 815 0, 816 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 817 } 818 } 819 break; 820 case B_DIRECT_SPATIAL: 821 /* Case when the MB has been skipped */ 822 /* If either of left or the top subMB is not present 823 OR 824 If both the MV components of either the left or the top subMB are 825 zero and their reference frame pointer pointing to 0 826 then MV for the skipped MB is zero 827 else the Median of the mv_pred_t is used */ 828 uc_temp1 = (UWORD8)ps_mv_pred[LEFT]->i1_ref_frame[0]; 829 uc_temp2 = (UWORD8)ps_mv_pred[TOP]->i1_ref_frame[0]; 830 uc_temp3 = (UWORD8)ps_mv_pred[TOP_R]->i1_ref_frame[0]; 831 832 ps_mv_final_pred->i1_ref_frame[0] = MIN(uc_temp1, 833 MIN(uc_temp2, uc_temp3)); 834 835 uc_temp1 = (UWORD8)ps_mv_pred[LEFT]->i1_ref_frame[1]; 836 uc_temp2 = (UWORD8)ps_mv_pred[TOP]->i1_ref_frame[1]; 837 uc_temp3 = (UWORD8)ps_mv_pred[TOP_R]->i1_ref_frame[1]; 838 839 ps_mv_final_pred->i1_ref_frame[1] = MIN(uc_temp1, 840 MIN(uc_temp2, uc_temp3)); 841 842 if((ps_mv_final_pred->i1_ref_frame[0] < 0) 843 && (ps_mv_final_pred->i1_ref_frame[1] < 0)) 844 { 845 u1_direct_zero_pred_flag = 1; 846 ps_mv_final_pred->i1_ref_frame[0] = 0; 847 ps_mv_final_pred->i1_ref_frame[1] = 0; 848 } 849 ih264d_get_motion_vector_predictor( 850 ps_mv_final_pred, ps_mv_pred, 851 ps_mv_final_pred->i1_ref_frame[0], 0, 852 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 853 854 ih264d_get_motion_vector_predictor( 855 ps_mv_final_pred, ps_mv_pred, 856 ps_mv_final_pred->i1_ref_frame[1], 1, 857 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 858 859 break; 860 case MB_SKIP: 861 /* Case when the MB has been skipped */ 862 /* If either of left or the top subMB is not present 863 OR 864 If both the MV components of either the left or the top subMB are 865 zero and their reference frame pointer pointing to 0 866 then MV for the skipped MB is zero 867 else the Median of the mv_pred_t is used */ 868 u1_a_in = (ps_cur_mb_info->u1_mb_ngbr_availablity & 869 LEFT_MB_AVAILABLE_MASK); 870 u1_b_in = (ps_cur_mb_info->u1_mb_ngbr_availablity & 871 TOP_MB_AVAILABLE_MASK); 872 if(((u1_a_in * u1_b_in) == 0) 873 || ((ps_mv_pred[LEFT]->i2_mv[0] 874 | ps_mv_pred[LEFT]->i2_mv[1] 875 | ps_mv_pred[LEFT]->i1_ref_frame[0]) 876 == 0) 877 || ((ps_mv_pred[TOP]->i2_mv[0] 878 | ps_mv_pred[TOP]->i2_mv[1] 879 | ps_mv_pred[TOP]->i1_ref_frame[0]) 880 == 0)) 881 { 882 883 ps_mv_final_pred->i2_mv[0] = 0; 884 ps_mv_final_pred->i2_mv[1] = 0; 885 break; 886 } 887 /* If the condition above is not true calculate the MV predictor 888 according to the process defined in sec 8.4.1.2.1 */ 889 default: 890 ih264d_get_motion_vector_predictor( 891 ps_mv_final_pred, ps_mv_pred, u1_ref_idx, 0, 892 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 893 break; 894 } 895 896 return (u1_direct_zero_pred_flag); 897 } 898 #endif 899 900 /*****************************************************************************/ 901 /* */ 902 /* Function Name : ih264d_mvpred_mbaff */ 903 /* */ 904 /* Description : This function calculates the motion vector predictor, */ 905 /* Inputs : <What inputs does the function take?> */ 906 /* Globals : None */ 907 /* Processing : The neighbours A(Left),B(Top),C(TopRight) are calculated */ 908 /* and based on the type of Mb the prediction is */ 909 /* appropriately done */ 910 /* Outputs : populates ps_mv_final_pred structure */ 911 /* Returns : u1_direct_zero_pred_flag which is used only in */ 912 /* decodeSpatialdirect() */ 913 /* */ 914 /* Issues : <List any issues or problems with this function> */ 915 /* */ 916 /* Revision History: */ 917 /* */ 918 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 919 /* 03 05 2005 TA First Draft */ 920 /* */ 921 /*****************************************************************************/ 922 923 UWORD8 ih264d_mvpred_mbaff(dec_struct_t *ps_dec, 924 dec_mb_info_t *ps_cur_mb_info, 925 mv_pred_t *ps_mv_nmb, 926 mv_pred_t *ps_mv_ntop, 927 mv_pred_t *ps_mv_final_pred, 928 UWORD8 u1_sub_mb_num, 929 UWORD8 uc_mb_part_width, 930 UWORD8 u1_lx_start, 931 UWORD8 u1_lxend, 932 UWORD8 u1_mb_mc_mode) 933 { 934 UWORD8 u1_a_in, u1_b_in, uc_temp1, uc_temp2, uc_temp3; 935 mv_pred_t *ps_mv_pred[3], s_mvPred[3]; 936 UWORD8 uc_B2, pu0_scale[3], i, uc_lx, u1_ref_idx; 937 UWORD8 u1_direct_zero_pred_flag = 0; 938 939 pu0_scale[0] = pu0_scale[1] = pu0_scale[2] = 0; 940 ih264d_mbaff_mv_pred(ps_mv_pred, u1_sub_mb_num, ps_mv_nmb, ps_mv_ntop, ps_dec, 941 uc_mb_part_width, ps_cur_mb_info, pu0_scale); 942 for(i = 0; i < 3; i++) 943 { 944 if(pu0_scale[i] != 0) 945 { 946 memcpy(&s_mvPred[i], ps_mv_pred[i], sizeof(mv_pred_t)); 947 if(pu0_scale[i] == 1) 948 { 949 s_mvPred[i].i1_ref_frame[0] = s_mvPred[i].i1_ref_frame[0] << 1; 950 s_mvPred[i].i1_ref_frame[1] = s_mvPred[i].i1_ref_frame[1] << 1; 951 s_mvPred[i].i2_mv[1] = SIGN_POW2_DIV(s_mvPred[i].i2_mv[1], 1); 952 s_mvPred[i].i2_mv[3] = SIGN_POW2_DIV(s_mvPred[i].i2_mv[3], 1); 953 } 954 else 955 { 956 s_mvPred[i].i1_ref_frame[0] = s_mvPred[i].i1_ref_frame[0] >> 1; 957 s_mvPred[i].i1_ref_frame[1] = s_mvPred[i].i1_ref_frame[1] >> 1; 958 s_mvPred[i].i2_mv[1] = s_mvPred[i].i2_mv[1] << 1; 959 s_mvPred[i].i2_mv[3] = s_mvPred[i].i2_mv[3] << 1; 960 } 961 ps_mv_pred[i] = &s_mvPred[i]; 962 } 963 } 964 965 for(uc_lx = u1_lx_start; uc_lx < u1_lxend; uc_lx++) 966 { 967 u1_ref_idx = ps_mv_final_pred->i1_ref_frame[uc_lx]; 968 uc_B2 = (uc_lx << 1); 969 switch(u1_mb_mc_mode) 970 { 971 case PRED_16x8: 972 /* Directional prediction for a 16x8 MB partition */ 973 if(u1_sub_mb_num == 0) 974 { 975 /* Calculating the MV pred for the top 16x8 block */ 976 if(ps_mv_pred[TOP]->i1_ref_frame[uc_lx] == u1_ref_idx) 977 { 978 /* If the reference frame used by the top subMB is same as the 979 reference frame used by the current block then MV predictor to 980 be used for the current block is same as the MV of the top 981 subMB */ 982 ps_mv_final_pred->i2_mv[uc_B2 + 0] = 983 ps_mv_pred[TOP]->i2_mv[uc_B2 + 0]; 984 ps_mv_final_pred->i2_mv[uc_B2 + 1] = 985 ps_mv_pred[TOP]->i2_mv[uc_B2 + 1]; 986 } 987 else 988 { 989 /* The MV predictor is calculated according to the process 990 defined in 8.4.1.2.1 */ 991 ih264d_get_motion_vector_predictor( 992 ps_mv_final_pred, 993 ps_mv_pred, 994 u1_ref_idx, 995 uc_lx, 996 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 997 } 998 } 999 else 1000 { 1001 if(ps_mv_pred[LEFT]->i1_ref_frame[uc_lx] == u1_ref_idx) 1002 { 1003 /* If the reference frame used by the left subMB is same as the 1004 reference frame used by the current block then MV predictor to 1005 be used for the current block is same as the MV of the left 1006 subMB */ 1007 ps_mv_final_pred->i2_mv[uc_B2 + 0] = 1008 ps_mv_pred[LEFT]->i2_mv[uc_B2 + 0]; 1009 ps_mv_final_pred->i2_mv[uc_B2 + 1] = 1010 ps_mv_pred[LEFT]->i2_mv[uc_B2 + 1]; 1011 } 1012 else 1013 { 1014 /* The MV predictor is calculated according to the process 1015 defined in 8.4.1.2.1 */ 1016 ih264d_get_motion_vector_predictor( 1017 ps_mv_final_pred, 1018 ps_mv_pred, 1019 u1_ref_idx, 1020 uc_lx, 1021 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 1022 } 1023 } 1024 break; 1025 case PRED_8x16: 1026 /* Directional prediction for a 8x16 MB partition */ 1027 if(u1_sub_mb_num == 0) 1028 { 1029 if(ps_mv_pred[LEFT]->i1_ref_frame[uc_lx] == u1_ref_idx) 1030 { 1031 /* If the reference frame used by the left subMB is same as the 1032 reference frame used by the current block then MV predictor to 1033 be used for the current block is same as the MV of the left 1034 subMB */ 1035 ps_mv_final_pred->i2_mv[uc_B2 + 0] = 1036 ps_mv_pred[LEFT]->i2_mv[uc_B2 + 0]; 1037 ps_mv_final_pred->i2_mv[uc_B2 + 1] = 1038 ps_mv_pred[LEFT]->i2_mv[uc_B2 + 1]; 1039 } 1040 else 1041 { 1042 /* The MV predictor is calculated according to the process 1043 defined in 8.4.1.2.1 */ 1044 ih264d_get_motion_vector_predictor( 1045 ps_mv_final_pred, 1046 ps_mv_pred, 1047 u1_ref_idx, 1048 uc_lx, 1049 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 1050 } 1051 } 1052 else 1053 { 1054 if(ps_mv_pred[TOP_R]->i1_ref_frame[uc_lx] == u1_ref_idx) 1055 { 1056 /* If the reference frame used by the top right subMB is same as 1057 the reference frame used by the current block then MV 1058 predictor to be used for the current block is same as the MV 1059 of the left subMB */ 1060 ps_mv_final_pred->i2_mv[uc_B2 + 0] = 1061 ps_mv_pred[TOP_R]->i2_mv[uc_B2 + 0]; 1062 ps_mv_final_pred->i2_mv[uc_B2 + 1] = 1063 ps_mv_pred[TOP_R]->i2_mv[uc_B2 + 1]; 1064 } 1065 else 1066 { 1067 /* The MV predictor is calculated according to the process 1068 defined in 8.4.1.2.1 */ 1069 ih264d_get_motion_vector_predictor( 1070 ps_mv_final_pred, 1071 ps_mv_pred, 1072 u1_ref_idx, 1073 uc_lx, 1074 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 1075 } 1076 } 1077 break; 1078 case B_DIRECT_SPATIAL: 1079 /* Case when the MB has been skipped */ 1080 /* If either of left or the top subMB is not present 1081 OR 1082 If both the MV components of either the left or the top subMB are 1083 zero and their reference frame pointer pointing to 0 1084 then MV for the skipped MB is zero 1085 else the Median of the mv_pred_t is used */ 1086 uc_temp1 = (UWORD8)ps_mv_pred[LEFT]->i1_ref_frame[0]; 1087 uc_temp2 = (UWORD8)ps_mv_pred[TOP]->i1_ref_frame[0]; 1088 uc_temp3 = (UWORD8)ps_mv_pred[TOP_R]->i1_ref_frame[0]; 1089 1090 ps_mv_final_pred->i1_ref_frame[0] = MIN(uc_temp1, 1091 MIN(uc_temp2, uc_temp3)); 1092 1093 uc_temp1 = (UWORD8)ps_mv_pred[LEFT]->i1_ref_frame[1]; 1094 uc_temp2 = (UWORD8)ps_mv_pred[TOP]->i1_ref_frame[1]; 1095 uc_temp3 = (UWORD8)ps_mv_pred[TOP_R]->i1_ref_frame[1]; 1096 1097 ps_mv_final_pred->i1_ref_frame[1] = MIN(uc_temp1, 1098 MIN(uc_temp2, uc_temp3)); 1099 1100 /* If the reference indices are negative clip the scaled reference indices to -1 */ 1101 /* i.e invalid reference index */ 1102 1103 /*if(ps_mv_final_pred->i1_ref_frame[0] < 0) 1104 ps_mv_final_pred->i1_ref_frame[0] = -1; 1105 1106 if(ps_mv_final_pred->i1_ref_frame[1] < 0) 1107 ps_mv_final_pred->i1_ref_frame[1] = -1; */ 1108 1109 if((ps_mv_final_pred->i1_ref_frame[0] < 0) 1110 && (ps_mv_final_pred->i1_ref_frame[1] < 0)) 1111 { 1112 u1_direct_zero_pred_flag = 1; 1113 ps_mv_final_pred->i1_ref_frame[0] = 0; 1114 ps_mv_final_pred->i1_ref_frame[1] = 0; 1115 } 1116 ih264d_get_motion_vector_predictor( 1117 ps_mv_final_pred, ps_mv_pred, 1118 ps_mv_final_pred->i1_ref_frame[0], 0, 1119 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 1120 1121 ih264d_get_motion_vector_predictor( 1122 ps_mv_final_pred, ps_mv_pred, 1123 ps_mv_final_pred->i1_ref_frame[1], 1, 1124 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 1125 1126 break; 1127 case MB_SKIP: 1128 /* Case when the MB has been skipped */ 1129 /* If either of left or the top subMB is not present 1130 OR 1131 If both the MV components of either the left or the top subMB are 1132 zero and their reference frame pointer pointing to 0 1133 then MV for the skipped MB is zero 1134 else the Median of the mv_pred_t is used */ 1135 u1_a_in = (ps_cur_mb_info->u1_mb_ngbr_availablity & 1136 LEFT_MB_AVAILABLE_MASK); 1137 u1_b_in = (ps_cur_mb_info->u1_mb_ngbr_availablity & 1138 TOP_MB_AVAILABLE_MASK); 1139 if(((u1_a_in * u1_b_in) == 0) 1140 || ((ps_mv_pred[LEFT]->i2_mv[0] 1141 | ps_mv_pred[LEFT]->i2_mv[1] 1142 | ps_mv_pred[LEFT]->i1_ref_frame[0]) 1143 == 0) 1144 || ((ps_mv_pred[TOP]->i2_mv[0] 1145 | ps_mv_pred[TOP]->i2_mv[1] 1146 | ps_mv_pred[TOP]->i1_ref_frame[0]) 1147 == 0)) 1148 { 1149 ps_mv_final_pred->i2_mv[0] = 0; 1150 ps_mv_final_pred->i2_mv[1] = 0; 1151 break; 1152 } 1153 /* If the condition above is not true calculate the MV predictor 1154 according to the process defined in sec 8.4.1.2.1 */ 1155 default: 1156 ih264d_get_motion_vector_predictor( 1157 ps_mv_final_pred, ps_mv_pred, u1_ref_idx, uc_lx, 1158 (const UWORD8 *)gau1_ih264d_mv_pred_condition); 1159 break; 1160 } 1161 } 1162 return (u1_direct_zero_pred_flag); 1163 } 1164 1165 1166 1167 1168 void ih264d_rep_mv_colz(dec_struct_t *ps_dec, 1169 mv_pred_t *ps_mv_pred_src, 1170 mv_pred_t *ps_mv_pred_dst, 1171 UWORD8 u1_sub_mb_num, 1172 UWORD8 u1_colz, 1173 UWORD8 u1_ht, 1174 UWORD8 u1_wd) 1175 { 1176 1177 UWORD8 k, m; 1178 UWORD8 *pu1_colz = ps_dec->pu1_col_zero_flag + ps_dec->i4_submb_ofst 1179 + u1_sub_mb_num; 1180 1181 for(k = 0; k < u1_ht; k++) 1182 { 1183 for(m = 0; m < u1_wd; m++) 1184 { 1185 *(ps_mv_pred_dst + m) = *(ps_mv_pred_src); 1186 *(pu1_colz + m) = u1_colz; 1187 1188 } 1189 pu1_colz += SUB_BLK_WIDTH; 1190 ps_mv_pred_dst += SUB_BLK_WIDTH; 1191 } 1192 } 1193 1194