ih264d_process_bslice.c revision a2b49e5f0574dee76f81507f288143d83a4b7c1a
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_process_bslice.c 23 * 24 * \brief 25 * Contains routines that decode B slice type 26 * 27 * Detailed_description 28 * 29 * \date 30 * 21/12/2002 31 * 32 * \author NS 33 ************************************************************************** 34 */ 35#include "ih264_typedefs.h" 36#include "ih264_macros.h" 37#include "ih264_platform_macros.h" 38 39#include <string.h> 40#include "ih264d_structs.h" 41#include "ih264d_bitstrm.h" 42#include "ih264d_parse_cavlc.h" 43#include "ih264d_mb_utils.h" 44#include "ih264d_mvpred.h" 45#include "ih264d_inter_pred.h" 46#include "ih264d_process_pslice.h" 47#include "ih264d_error_handler.h" 48#include "ih264d_tables.h" 49#include "ih264d_parse_slice.h" 50#include "ih264d_process_pslice.h" 51#include "ih264d_process_bslice.h" 52#include "ih264d_tables.h" 53#include "ih264d_parse_islice.h" 54#include "ih264d_mvpred.h" 55 56void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec); 57//UWORD32 g_hits = 0; 58//UWORD32 g_miss = 0; 59/*! 60 ************************************************************************** 61 * \if Function name : ih264d_decode_spatial_direct \endif 62 * 63 * \brief 64 * Decodes spatial direct mode. 65 * 66 * \return 67 * None. 68 * Arunoday T 69 ************************************************************************** 70 */ 71WORD32 ih264d_decode_spatial_direct(dec_struct_t * ps_dec, 72 UWORD8 u1_wd_x, 73 dec_mb_info_t * ps_cur_mb_info, 74 UWORD8 u1_mb_num) 75{ 76 mv_pred_t s_mv_pred, *ps_mv; 77 UWORD8 u1_col_zero_flag, u1_sub_mb_num, u1_direct_zero_pred_flag = 0; 78 UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; 79 mv_pred_t *ps_mv_ntop_start; 80 mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_mb_num << 4); 81 UWORD8 partition_size, sub_partition, u1_mb_partw, u1_mb_parth; 82 UWORD8 i; 83 WORD8 i1_pred, i1_ref_frame0, i1_ref_frame1; 84 struct pic_buffer_t *ps_ref_frame = NULL, *ps_col_pic, *ps_pic_buff0 = NULL, 85 *ps_pic_buff1 = NULL; 86 87 UWORD8 u1_zero_pred_cond_f, u1_zero_pred_cond_b; 88 WORD16 i2_def_mv[2], i2_spat_pred_mv[4], *pi2_final_mv0, *pi2_final_mv1; 89 UWORD16 ui2_mask_fwd = 0, ui2_mask_bwd = 0, u2_mask = 0; 90 UWORD32 *pui32_weight_ofsts = NULL; 91 directmv_t s_mvdirect; 92 UWORD8 u1_colz; 93 UWORD8 u1_final_ref_idx = 0; 94 const UWORD8 *pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth; 95 const UWORD8 *pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw; 96 const UWORD16 sub_mask_table[] = 97 { 0x33, 0x3, 0x11, 0x1 }; 98 const UWORD16 mask_table[] = 99 { 0xffff, /*16x16 NA */ 100 0xff, /* 16x8*/ 101 0x3333, /* 8x16*/ 102 0x33 };/* 8x8*/ 103 mv_pred_t s_temp_mv_pred; 104 WORD32 ret = 0; 105 106 /* CHANGED CODE */ 107 ps_mv_ntop_start = ps_dec->ps_mv_cur + (u1_mb_num << 4) 108 - (ps_dec->u2_frm_wd_in_mbs << (4 + u1_mbaff)) + 12; 109 110 /* assign default values for MotionVector as zero */ 111 i2_def_mv[0] = 0; 112 i2_def_mv[1] = 0; 113 114 u1_direct_zero_pred_flag = ps_dec->pf_mvpred(ps_dec, ps_cur_mb_info, ps_mv_nmb_start, 115 ps_mv_ntop_start, &s_mv_pred, 0, 4, 116 0, 1, B_DIRECT_SPATIAL); 117 118 i2_spat_pred_mv[0] = s_mv_pred.i2_mv[0]; 119 i2_spat_pred_mv[1] = s_mv_pred.i2_mv[1]; 120 i2_spat_pred_mv[2] = s_mv_pred.i2_mv[2]; 121 i2_spat_pred_mv[3] = s_mv_pred.i2_mv[3]; 122 123 i1_ref_frame0 = s_mv_pred.i1_ref_frame[0]; 124 i1_ref_frame1 = s_mv_pred.i1_ref_frame[1]; 125 126 i1_ref_frame0 = (i1_ref_frame0 < 0) ? -1 : i1_ref_frame0; 127 i1_ref_frame1 = (i1_ref_frame1 < 0) ? -1 : i1_ref_frame1; 128 129 i1_pred = 0; 130 131 { 132 WORD8 u1_ref_idx, u1_ref_idx1; 133 UWORD32 uc_Idx, uc_Idx1; 134 UWORD8 u1_scale_ref = (ps_dec->ps_cur_slice->u1_mbaff_frame_flag 135 && ps_cur_mb_info->u1_mb_field_decodingflag); 136 u1_final_ref_idx = i1_ref_frame0; 137 if(i1_ref_frame0 >= 0) 138 { 139 /* convert RefIdx if it is MbAff */ 140 u1_ref_idx = i1_ref_frame0; 141 u1_ref_idx1 = i1_ref_frame0; 142 if(u1_scale_ref) 143 { 144 u1_ref_idx1 = u1_ref_idx >> 1; 145 if((u1_ref_idx & 0x01) != (1 - ps_cur_mb_info->u1_topmb)) 146 u1_ref_idx1 += MAX_REF_BUFS; 147 } 148 /* If i1_ref_frame0 < 0 then refIdxCol is obtained from ps_pic_buff1 */ 149 ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][u1_ref_idx1]; 150 ps_ref_frame = ps_pic_buff0; 151 i1_pred = PRED_L0; 152 } 153 154 if(i1_ref_frame1 >= 0) 155 { 156 /* convert RefIdx if it is MbAff */ 157 u1_ref_idx = i1_ref_frame1; 158 u1_ref_idx1 = i1_ref_frame1; 159 if(u1_scale_ref) 160 { 161 u1_ref_idx1 = u1_ref_idx >> 1; 162 if((u1_ref_idx & 0x01) != (1 - ps_cur_mb_info->u1_topmb)) 163 u1_ref_idx1 += MAX_REF_BUFS; 164 } 165 ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][u1_ref_idx1]; 166 i1_pred = i1_pred | PRED_L1; 167 } 168 if(i1_ref_frame0 < 0) 169 { 170 ps_ref_frame = ps_pic_buff1; 171 u1_final_ref_idx = i1_ref_frame1; 172 } 173 174 u1_zero_pred_cond_f = (u1_direct_zero_pred_flag) || (i1_ref_frame0 < 0); 175 u1_zero_pred_cond_b = (u1_direct_zero_pred_flag) || (i1_ref_frame1 < 0); 176 177 if(ps_dec->ps_cur_pps->u1_wted_bipred_idc) 178 { 179 uc_Idx = ((i1_ref_frame0 < 1) ? 0 : i1_ref_frame0) 180 * ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]; 181 if(u1_scale_ref) 182 uc_Idx >>= 1; 183 uc_Idx1 = (i1_ref_frame1 < 0) ? 0 : i1_ref_frame1; 184 uc_Idx += (u1_scale_ref) ? (uc_Idx1 >> 1) : uc_Idx1; 185 pui32_weight_ofsts = 186 (UWORD32*)&ps_dec->pu4_wt_ofsts[2 * X3(uc_Idx)]; 187 188 if(i1_ref_frame0 < 0) 189 pui32_weight_ofsts += 1; 190 191 if(u1_scale_ref && (ps_dec->ps_cur_pps->u1_wted_bipred_idc == 2)) 192 { 193 WORD16 i2_ref_idx; 194 i2_ref_idx = MAX(i1_ref_frame0, 0); 195 i2_ref_idx *= (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1] 196 << 1); 197 i2_ref_idx += MAX(i1_ref_frame1, 0); 198 if(!ps_cur_mb_info->u1_topmb) 199 i2_ref_idx += 200 (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0] 201 << 1) 202 * (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1] 203 << 1); 204 pui32_weight_ofsts = (UWORD32*)&ps_dec->pu4_mbaff_wt_mat[2 205 * X3(i2_ref_idx)]; 206 } 207 } 208 } 209 210 s_temp_mv_pred.i1_ref_frame[0] = i1_ref_frame0; 211 s_temp_mv_pred.i1_ref_frame[1] = i1_ref_frame1; 212 s_temp_mv_pred.u1_col_ref_pic_idx = ps_ref_frame->u1_mv_buf_id; 213 s_temp_mv_pred.u1_pic_type = ps_ref_frame->u1_pic_type; 214 215 /**********************************************************************/ 216 /* Call the function which gets the number of partitions and */ 217 /* partition info of colocated Mb */ 218 /**********************************************************************/ 219 220 ps_dec->pf_parse_mvdirect(ps_dec, ps_dec->ps_col_pic, &s_mvdirect, u1_wd_x, 221 ps_dec->i4_submb_ofst, ps_cur_mb_info); 222 ps_col_pic = ps_dec->ps_col_pic; 223 if((s_mvdirect.u1_col_zeroflag_change == 0) || u1_direct_zero_pred_flag) 224 { 225 WORD16 i2_mv_x, i2_mv_y, i2_mvX1, i2_mvY1; 226 /* Most probable case */ 227 u1_col_zero_flag = *(ps_col_pic->pu1_col_zero_flag 228 + s_mvdirect.i4_mv_indices[0]); 229 u1_col_zero_flag = u1_col_zero_flag & 0x01; 230 231 if(u1_zero_pred_cond_f || ((i1_ref_frame0 == 0) && (u1_col_zero_flag == 1))) 232 { 233 i2_mv_x = 0; 234 i2_mv_y = 0; 235 } 236 else 237 { 238 i2_mv_x = i2_spat_pred_mv[0]; 239 i2_mv_y = i2_spat_pred_mv[1]; 240 241 } 242 243 if(u1_zero_pred_cond_b || ((i1_ref_frame1 == 0) && (u1_col_zero_flag == 1))) 244 { 245 i2_mvX1 = 0; 246 i2_mvY1 = 0; 247 } 248 else 249 { 250 i2_mvX1 = i2_spat_pred_mv[2]; 251 i2_mvY1 = i2_spat_pred_mv[3]; 252 } 253 254 u1_sub_mb_num = ps_dec->u1_sub_mb_num; 255 u1_mb_partw = (u1_wd_x >> 2); 256 257 258 if(i1_ref_frame0 >= 0) 259 { 260 { 261 pred_info_pkd_t *ps_pred_pkd; 262 WORD16 i2_mv[2]; 263 WORD8 i1_ref_idx= 0; 264 265 i2_mv[0] = i2_mv_x; 266 i2_mv[1] = i2_mv_y; 267 268 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; 269 ih264d_fill_pred_info(i2_mv,u1_mb_partw,u1_mb_partw,u1_sub_mb_num,i1_pred, 270 ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts, 271 ps_pic_buff0->u1_pic_type); 272 ps_dec->u4_pred_info_pkd_idx++; 273 ps_cur_mb_info->u1_num_pred_parts++; 274 275 276 } 277 278 } 279 280 if(i1_ref_frame1 >= 0) 281 { 282 { 283 pred_info_pkd_t *ps_pred_pkd; 284 WORD16 i2_mv[2]; 285 WORD8 i1_ref_idx= 0; 286 287 i2_mv[0] = i2_mvX1; 288 i2_mv[1] = i2_mvY1; 289 290 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; 291 ih264d_fill_pred_info(i2_mv,u1_mb_partw,u1_mb_partw,u1_sub_mb_num,i1_pred, 292 ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts, 293 ps_pic_buff1->u1_pic_type); 294 ps_dec->u4_pred_info_pkd_idx++; 295 ps_cur_mb_info->u1_num_pred_parts++; 296 297 298 } 299 } 300 301 302 /* Replication optimisation */ 303 s_temp_mv_pred.i2_mv[0] = i2_mv_x; 304 s_temp_mv_pred.i2_mv[1] = i2_mv_y; 305 s_temp_mv_pred.i2_mv[2] = i2_mvX1; 306 s_temp_mv_pred.i2_mv[3] = i2_mvY1; 307 308 /* Calculating colocated zero information */ 309 { 310 /*************************************/ 311 /* If(bit2 and bit3 set) */ 312 /* then */ 313 /* (bit0 and bit1) => submmbmode */ 314 /* (bit2 and bit3) => mbmode */ 315 /* else */ 316 /* (bit0 and bit1) => mbmode */ 317 /*************************************/ 318 /*UWORD8 u1_packed_mb_sub_mb_mode = sub_partition ? 319 (s_mvdirect.i1_partitionsize[0]) : ((s_mvdirect.i1_partitionsize[0]) << 2);*/ 320 UWORD8 u1_packed_mb_sub_mb_mode = (u1_mb_partw == 2) ? 0x03 : 0; 321 322 if(i1_ref_frame0 < 0) 323 { 324 i2_mv_x = i2_mvX1; 325 i2_mv_y = i2_mvY1; 326 } 327 328 /* Change from left shift 4 to 6 - Varun */ 329 u1_colz = (ps_cur_mb_info->u1_mb_field_decodingflag << 1) 330 | ((u1_final_ref_idx == 0) && (ABS(i2_mv_x) <= 1) 331 && (ABS(i2_mv_y) <= 1)); 332 u1_colz |= (u1_packed_mb_sub_mb_mode << 6); 333 } 334 ps_mv = ps_mv_nmb_start + u1_sub_mb_num; 335 ih264d_rep_mv_colz(ps_dec, &s_temp_mv_pred, ps_mv, u1_sub_mb_num, u1_colz, 336 u1_mb_partw, u1_mb_partw); 337 if(u1_wd_x == MB_SIZE) 338 ps_dec->u1_currB_type = 0; 339 340 341 342 return OK; 343 } 344 /***************************************************************************/ 345 /* If present MB is 16x16 and the partition of colocated Mb is >= PRED_8x8 */ 346 /* i.e 8x8 or less than 8x8 partitions then set up DMA for (0,0) and */ 347 /* spatially predicted motion vector and do the multiplexing after */ 348 /* motion compensation */ 349 /***************************************************************************/ 350 351 352 if((u1_wd_x == MB_SIZE) && (s_mvdirect.i1_num_partitions > 2)) 353 { 354 ps_cur_mb_info->u1_Mux = 1; 355 if(i1_ref_frame0 >= 0) 356 { 357 358 { 359 pred_info_pkd_t *ps_pred_pkd; 360 WORD8 i1_ref_idx= 0; 361 362 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; 363 ih264d_fill_pred_info(&(i2_spat_pred_mv[0]),4,4,0,i1_pred, 364 ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts, 365 ps_pic_buff0->u1_pic_type); 366 ps_dec->u4_pred_info_pkd_idx++; 367 ps_cur_mb_info->u1_num_pred_parts++; 368 369 370 } 371 372 /****** (0,0) Motion vectors DMA *****/ 373 { 374 pred_info_pkd_t *ps_pred_pkd; 375 WORD16 i2_mv[2]; 376 WORD8 i1_ref_idx= 0; 377 378 i2_mv[0] = 0; 379 i2_mv[1] = 0; 380 381 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; 382 ih264d_fill_pred_info(i2_mv,4,4,0,i1_pred, 383 ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts, 384 ps_pic_buff0->u1_pic_type); 385 ps_dec->u4_pred_info_pkd_idx++; 386 ps_cur_mb_info->u1_num_pred_parts++; 387 388 389 } 390 } 391 if(i1_ref_frame1 >= 0) 392 { 393 { 394 pred_info_pkd_t *ps_pred_pkd; 395 WORD16 i2_mv[2]; 396 WORD8 i1_ref_idx= 0; 397 398 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; 399 ih264d_fill_pred_info(&(i2_spat_pred_mv[2]),4,4,0,i1_pred, 400 ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts, 401 ps_pic_buff1->u1_pic_type); 402 ps_dec->u4_pred_info_pkd_idx++; 403 ps_cur_mb_info->u1_num_pred_parts++; 404 405 406 } 407 408 /****** (0,0) Motion vectors DMA *****/ 409 410 { 411 pred_info_pkd_t *ps_pred_pkd; 412 WORD16 i2_mv[2]; 413 WORD8 i1_ref_idx= 0; 414 415 i2_mv[0] = 0; 416 i2_mv[1] = 0; 417 418 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; 419 ih264d_fill_pred_info(i2_mv,4,4,0,i1_pred, 420 ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts, 421 ps_pic_buff1->u1_pic_type); 422 ps_dec->u4_pred_info_pkd_idx++; 423 ps_cur_mb_info->u1_num_pred_parts++; 424 425 426 } 427 } 428 } 429 430 /*u1_col = *(ps_col_pic->pu1_col_zero_flag + s_mvdirect.i4_mv_indices[0]); 431 u1_col &= 1; 432 u1_init = 0;*/ 433 434 for(i = 0; i < s_mvdirect.i1_num_partitions; i++) 435 { 436 partition_size = s_mvdirect.i1_partitionsize[i]; 437 u1_sub_mb_num = s_mvdirect.i1_submb_num[i]; 438 439 sub_partition = partition_size >> 2; 440 partition_size &= 0x3; 441 u1_mb_partw = pu1_mb_partw[partition_size]; 442 u1_mb_parth = pu1_mb_parth[partition_size]; 443 u2_mask = mask_table[partition_size]; 444 if(sub_partition != 0) 445 { 446 u1_mb_partw >>= 1; 447 u1_mb_parth >>= 1; 448 u2_mask = sub_mask_table[partition_size]; 449 } 450 451 u1_col_zero_flag = *(ps_col_pic->pu1_col_zero_flag 452 + s_mvdirect.i4_mv_indices[i]); 453 u1_col_zero_flag = u1_col_zero_flag & 0x01; 454 455 /*if(u1_col != u1_col_zero_flag) 456 u1_init = 1;*/ 457 458 if(u1_zero_pred_cond_f || ((i1_ref_frame0 == 0) && (u1_col_zero_flag == 1))) 459 { 460 pi2_final_mv0 = &i2_def_mv[0]; 461 ui2_mask_fwd |= (u2_mask << u1_sub_mb_num); 462 } 463 else 464 pi2_final_mv0 = &i2_spat_pred_mv[0]; 465 466 if(u1_zero_pred_cond_b || ((i1_ref_frame1 == 0) && (u1_col_zero_flag == 1))) 467 { 468 pi2_final_mv1 = &i2_def_mv[0]; 469 ui2_mask_bwd |= (u2_mask << u1_sub_mb_num); 470 } 471 else 472 pi2_final_mv1 = &i2_spat_pred_mv[2]; 473 474 if(ps_cur_mb_info->u1_Mux != 1) 475 { 476 /*u1_sub_mb_x = u1_sub_mb_num & 0x03; 477 uc_sub_mb_y = (u1_sub_mb_num >> 2);*/ 478 if(i1_ref_frame0 >= 0) 479 { 480 481 { 482 pred_info_pkd_t *ps_pred_pkd; 483 WORD8 i1_ref_idx= 0; 484 485 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; 486 ih264d_fill_pred_info(pi2_final_mv0,u1_mb_partw,u1_mb_parth,u1_sub_mb_num,i1_pred, 487 ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts, 488 ps_pic_buff0->u1_pic_type); 489 ps_dec->u4_pred_info_pkd_idx++; 490 ps_cur_mb_info->u1_num_pred_parts++; 491 492 493 } 494 495 } 496 497 if(i1_ref_frame1 >= 0) 498 { 499 { 500 pred_info_pkd_t *ps_pred_pkd; 501 WORD8 i1_ref_idx= 0; 502 503 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; 504 ih264d_fill_pred_info(pi2_final_mv1,u1_mb_partw,u1_mb_parth,u1_sub_mb_num,i1_pred, 505 ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts, 506 ps_pic_buff1->u1_pic_type); 507 ps_dec->u4_pred_info_pkd_idx++; 508 ps_cur_mb_info->u1_num_pred_parts++; 509 510 511 } 512 } 513 } 514 515 /* Replication optimisation */ 516 s_temp_mv_pred.i2_mv[0] = pi2_final_mv0[0]; 517 s_temp_mv_pred.i2_mv[1] = pi2_final_mv0[1]; 518 s_temp_mv_pred.i2_mv[2] = pi2_final_mv1[0]; 519 s_temp_mv_pred.i2_mv[3] = pi2_final_mv1[1]; 520 521 /* Calculating colocated zero information */ 522 { 523 WORD16 i2_mv_x = 0, i2_mv_y = 0; 524 /*************************************/ 525 /* If(bit2 and bit3 set) */ 526 /* then */ 527 /* (bit0 and bit1) => submmbmode */ 528 /* (bit2 and bit3) => mbmode */ 529 /* else */ 530 /* (bit0 and bit1) => mbmode */ 531 /*************************************/ 532 UWORD8 u1_packed_mb_sub_mb_mode = 533 sub_partition ? (s_mvdirect.i1_partitionsize[i]) : ((s_mvdirect.i1_partitionsize[i]) 534 << 2); 535 536 if(i1_ref_frame0 >= 0) 537 { 538 i2_mv_x = pi2_final_mv0[0]; 539 i2_mv_y = pi2_final_mv0[1]; 540 } 541 else 542 { 543 i2_mv_x = pi2_final_mv1[0]; 544 i2_mv_y = pi2_final_mv1[1]; 545 } 546 547 u1_colz = (ps_cur_mb_info->u1_mb_field_decodingflag << 1) 548 | ((u1_final_ref_idx == 0) && (ABS(i2_mv_x) <= 1) 549 && (ABS(i2_mv_y) <= 1)); 550 u1_colz |= (u1_packed_mb_sub_mb_mode << 4); 551 } 552 ps_mv = ps_mv_nmb_start + u1_sub_mb_num; 553 ih264d_rep_mv_colz(ps_dec, &s_temp_mv_pred, ps_mv, u1_sub_mb_num, u1_colz, 554 u1_mb_parth, u1_mb_partw); 555 } 556 i = 0; 557 if(i1_ref_frame0 >= 0) 558 ps_cur_mb_info->u2_mask[i++] = ui2_mask_fwd; 559 if(i1_ref_frame1 >= 0) 560 ps_cur_mb_info->u2_mask[i] = ui2_mask_bwd; 561 562 /*if(u1_init) 563 H264_DEC_DEBUG_PRINT("hit\n"); 564 else 565 H264_DEC_DEBUG_PRINT("miss\n");*/ 566 567 return OK; 568} 569 570/*! 571 ************************************************************************** 572 * \if Function name : ih264d_decode_temporal_direct \endif 573 * 574 * \brief 575 * Decodes temporal direct mode. 576 * 577 * \return 578 * None. 579 * 580 ************************************************************************** 581 */ 582WORD32 ih264d_decode_temporal_direct(dec_struct_t * ps_dec, 583 UWORD8 u1_wd_x, 584 dec_mb_info_t * ps_cur_mb_info, 585 UWORD8 u1_mb_num) 586{ 587 struct pic_buffer_t *ps_pic_buff0, *ps_pic_buff1, *ps_col_pic; 588 mv_pred_t *ps_mv, s_temp_mv_pred; 589 UWORD8 u1_sub_mb_num; 590 UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; 591 WORD16 i2_mv_x0, i2_mv_y0, i2_mv_x1, i2_mv_y1; 592 UWORD8 u1_mb_partw, u1_mb_parth; 593 UWORD8 i, partition_size, sub_partition; 594 UWORD32 *pui32_weight_ofsts = NULL; 595 directmv_t s_mvdirect; 596 const UWORD8 *pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth; 597 const UWORD8 *pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw; 598 WORD8 c_refFrm0, c_refFrm1; 599 UWORD8 u1_ref_idx0, u1_is_cur_mb_fld; 600 UWORD32 pic0_poc, pic1_poc, cur_poc; 601 WORD32 ret = 0; 602 603 u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag; 604 ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][0]; 605 606 /**********************************************************************/ 607 /* Call the function which gets the number of partitions and */ 608 /* partition info of colocated Mb */ 609 /**********************************************************************/ 610 ps_dec->pf_parse_mvdirect(ps_dec, ps_dec->ps_col_pic, &s_mvdirect, u1_wd_x, 611 ps_dec->i4_submb_ofst, ps_cur_mb_info); 612 ps_col_pic = ps_dec->ps_col_pic; 613 614 for(i = 0; i < s_mvdirect.i1_num_partitions; i++) 615 { 616 UWORD8 u1_colz; 617 partition_size = s_mvdirect.i1_partitionsize[i]; 618 u1_sub_mb_num = s_mvdirect.i1_submb_num[i]; 619 ps_mv = ps_col_pic->ps_mv + s_mvdirect.i4_mv_indices[i]; 620 621 /* This should be removed to catch unitialized memory read */ 622 u1_ref_idx0 = 0; 623 624 sub_partition = partition_size >> 2; 625 partition_size &= 0x3; 626 u1_mb_partw = pu1_mb_partw[partition_size]; 627 u1_mb_parth = pu1_mb_parth[partition_size]; 628 if(sub_partition != 0) 629 { 630 u1_mb_partw >>= 1; 631 u1_mb_parth >>= 1; 632 } 633 c_refFrm0 = ps_mv->i1_ref_frame[0]; 634 c_refFrm1 = ps_mv->i1_ref_frame[1]; 635 636 if((c_refFrm0 == -1) && (c_refFrm1 == -1)) 637 { 638 u1_ref_idx0 = 0; 639 ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][0]; 640 if(u1_mbaff && u1_is_cur_mb_fld) 641 { 642 if(ps_cur_mb_info->u1_topmb) 643 { 644 pic0_poc = ps_pic_buff0->i4_top_field_order_cnt; 645 pic1_poc = ps_pic_buff1->i4_top_field_order_cnt; 646 cur_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt; 647 } 648 else 649 { 650 pic1_poc = ps_pic_buff1->i4_bottom_field_order_cnt; 651 cur_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt; 652 ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS]; 653 pic0_poc = ps_pic_buff0->i4_bottom_field_order_cnt; 654 ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][MAX_REF_BUFS]; 655 } 656 } 657 else 658 { 659 pic0_poc = ps_pic_buff0->i4_avg_poc; 660 pic1_poc = ps_pic_buff1->i4_avg_poc; 661 cur_poc = ps_dec->ps_cur_pic->i4_poc; 662 } 663 } 664 else 665 { 666 UWORD8 uc_i, u1_num_frw_ref_pics; 667 UWORD8 buf_id, u1_pic_type; 668 buf_id = ps_mv->u1_col_ref_pic_idx; 669 u1_pic_type = ps_mv->u1_pic_type; 670 if(ps_dec->ps_cur_slice->u1_field_pic_flag) 671 { 672 if(s_mvdirect.u1_vert_mv_scale == FRM_TO_FLD) 673 { 674 u1_pic_type = TOP_FLD; 675 if(ps_dec->ps_cur_slice->u1_bottom_field_flag) 676 u1_pic_type = BOT_FLD; 677 } 678 } 679 u1_num_frw_ref_pics = 680 ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]; 681 682 for(uc_i = 0; uc_i < u1_num_frw_ref_pics; uc_i++) 683 { 684 if(ps_dec->ps_cur_slice->u1_field_pic_flag) 685 { 686 if(ps_dec->ps_ref_pic_buf_lx[0][uc_i]->u1_mv_buf_id == buf_id) 687 { 688 if(ps_dec->ps_ref_pic_buf_lx[0][uc_i]->u1_pic_type 689 == u1_pic_type) 690 { 691 u1_ref_idx0 = uc_i; 692 break; 693 } 694 } 695 } 696 else 697 { 698 if(ps_dec->ps_ref_pic_buf_lx[0][uc_i]->u1_mv_buf_id == buf_id) 699 { 700 u1_ref_idx0 = uc_i; 701 break; 702 } 703 } 704 } 705 706 ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][u1_ref_idx0]; 707 ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][0]; 708 709 if(u1_mbaff && u1_is_cur_mb_fld) 710 { 711 pic0_poc = ps_pic_buff0->i4_top_field_order_cnt; 712 u1_ref_idx0 <<= 1; 713 if(s_mvdirect.u1_vert_mv_scale == ONE_TO_ONE) 714 { 715 if(u1_pic_type == BOT_FLD) 716 { 717 pic0_poc = ps_pic_buff0->i4_bottom_field_order_cnt; 718 ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][(u1_ref_idx0 719 >> 1) + MAX_REF_BUFS]; 720 if(ps_cur_mb_info->u1_topmb) 721 u1_ref_idx0++; 722 } 723 else 724 { 725 if(1 - ps_cur_mb_info->u1_topmb) 726 u1_ref_idx0++; 727 } 728 } 729 if(s_mvdirect.u1_vert_mv_scale == FRM_TO_FLD) 730 { 731 if(1 - ps_cur_mb_info->u1_topmb) 732 { 733 pic0_poc = ps_pic_buff0->i4_bottom_field_order_cnt; 734 ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][(u1_ref_idx0 735 >> 1) + MAX_REF_BUFS]; 736 } 737 } 738 if(ps_cur_mb_info->u1_topmb) 739 { 740 pic1_poc = ps_pic_buff1->i4_top_field_order_cnt; 741 cur_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt; 742 } 743 else 744 { 745 pic1_poc = ps_pic_buff1->i4_bottom_field_order_cnt; 746 cur_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt; 747 ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS]; 748 } 749 } 750 else 751 { 752 pic0_poc = ps_pic_buff0->i4_avg_poc; 753 pic1_poc = ps_pic_buff1->i4_avg_poc; 754 cur_poc = ps_dec->ps_cur_pic->i4_poc; 755 } 756 } 757 { 758 WORD16 i16_td; 759 760 if(c_refFrm0 >= 0) 761 { 762 i2_mv_x0 = ps_mv->i2_mv[0]; 763 i2_mv_y0 = ps_mv->i2_mv[1]; 764 } 765 else if(c_refFrm1 >= 0) 766 { 767 i2_mv_x0 = ps_mv->i2_mv[2]; 768 i2_mv_y0 = ps_mv->i2_mv[3]; 769 } 770 else 771 { 772 i2_mv_x0 = 0; 773 i2_mv_y0 = 0; 774 } 775 /* If FRM_TO_FLD or FLD_TO_FRM scale the "y" component of the colocated Mv*/ 776 if(s_mvdirect.u1_vert_mv_scale == FRM_TO_FLD) 777 { 778 i2_mv_y0 /= 2; 779 } 780 else if(s_mvdirect.u1_vert_mv_scale == FLD_TO_FRM) 781 { 782 i2_mv_y0 *= 2; 783 } 784 785 i16_td = pic1_poc - pic0_poc; 786 if((ps_pic_buff0->u1_is_short == 0) || (i16_td == 0)) 787 { 788 i2_mv_x1 = 0; 789 i2_mv_y1 = 0; 790 } 791 else 792 { 793 WORD16 i16_tb, i16_tx, i2_dist_scale_factor, i16_temp; 794 795 i16_td = CLIP3(-128, 127, i16_td); 796 i16_tb = cur_poc - pic0_poc; 797 i16_tb = CLIP3(-128, 127, i16_tb); 798 799 i16_tx = (16384 + ABS(SIGN_POW2_DIV(i16_td, 1))) / i16_td; 800 i2_dist_scale_factor = CLIP3(-1024, 1023, 801 (((i16_tb * i16_tx) + 32) >> 6)); 802 i16_temp = (i2_mv_x0 * i2_dist_scale_factor + 128) >> 8; 803 i2_mv_x1 = i16_temp - i2_mv_x0; 804 i2_mv_x0 = i16_temp; 805 806 i16_temp = (i2_mv_y0 * i2_dist_scale_factor + 128) >> 8; 807 i2_mv_y1 = i16_temp - i2_mv_y0; 808 i2_mv_y0 = i16_temp; 809 } 810 { 811 mv_pred_t *ps_mv; 812 813 /*u1_sub_mb_x = u1_sub_mb_num & 0x03; 814 uc_sub_mb_y = u1_sub_mb_num >> 2;*/ 815 if(ps_dec->ps_cur_pps->u1_wted_bipred_idc) 816 { 817 UWORD8 u1_idx = 818 u1_ref_idx0 819 * ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]; 820 UWORD8 u1_scale_ref = u1_mbaff && u1_is_cur_mb_fld; 821 if(u1_scale_ref) 822 u1_idx >>= 1; 823 pui32_weight_ofsts = (UWORD32*)&ps_dec->pu4_wt_ofsts[2 824 * X3(u1_idx)]; 825 if(u1_scale_ref 826 && (ps_dec->ps_cur_pps->u1_wted_bipred_idc 827 == 2)) 828 { 829 WORD16 i2_ref_idx; 830 i2_ref_idx = u1_ref_idx0; 831 i2_ref_idx *= 832 (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1] 833 << 1); 834 if(!ps_cur_mb_info->u1_topmb) 835 i2_ref_idx += 836 (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0] 837 << 1) 838 * (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1] 839 << 1); 840 pui32_weight_ofsts = 841 (UWORD32*)&ps_dec->pu4_mbaff_wt_mat[2 842 * X3(i2_ref_idx)]; 843 } 844 } 845 { 846 pred_info_pkd_t *ps_pred_pkd; 847 WORD16 i2_mv[2]; 848 WORD8 i1_ref_idx= 0; 849 850 i2_mv[0] = i2_mv_x0; 851 i2_mv[1] = i2_mv_y0; 852 853 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; 854 ih264d_fill_pred_info(i2_mv,u1_mb_partw,u1_mb_parth,u1_sub_mb_num,PRED_L0 | PRED_L1, 855 ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts, 856 ps_pic_buff0->u1_pic_type); 857 ps_dec->u4_pred_info_pkd_idx++; 858 ps_cur_mb_info->u1_num_pred_parts++; 859 860 861 } 862 { 863 pred_info_pkd_t *ps_pred_pkd; 864 WORD16 i2_mv[2]; 865 WORD8 i1_ref_idx= 0; 866 867 i2_mv[0] = i2_mv_x1; 868 i2_mv[1] = i2_mv_y1; 869 870 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; 871 ih264d_fill_pred_info(i2_mv,u1_mb_partw,u1_mb_parth,u1_sub_mb_num,PRED_L0 | PRED_L1, 872 ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts, 873 ps_pic_buff1->u1_pic_type); 874 ps_dec->u4_pred_info_pkd_idx++; 875 ps_cur_mb_info->u1_num_pred_parts++; 876 877 878 } 879 880 /* Replication optimisation */ 881 s_temp_mv_pred.i2_mv[0] = i2_mv_x0; 882 s_temp_mv_pred.i2_mv[1] = i2_mv_y0; 883 s_temp_mv_pred.i2_mv[2] = i2_mv_x1; 884 s_temp_mv_pred.i2_mv[3] = i2_mv_y1; 885 s_temp_mv_pred.i1_ref_frame[0] = u1_ref_idx0; 886 s_temp_mv_pred.i1_ref_frame[1] = 0; 887 s_temp_mv_pred.u1_col_ref_pic_idx = ps_pic_buff0->u1_mv_buf_id; 888 s_temp_mv_pred.u1_pic_type = ps_pic_buff0->u1_pic_type; 889 ps_mv = ps_dec->ps_mv_cur + (u1_mb_num << 4) + u1_sub_mb_num; 890 891 { 892 WORD16 i2_mv_x = 0, i2_mv_y = 0; 893 UWORD8 u1_packed_mb_sub_mb_mode = 894 sub_partition ? (s_mvdirect.i1_partitionsize[i]) : ((s_mvdirect.i1_partitionsize[i]) 895 << 2); 896 897 if(c_refFrm0 >= 0) 898 { 899 i2_mv_x = i2_mv_x0; 900 i2_mv_y = i2_mv_y0; 901 } 902 else 903 { 904 i2_mv_x = i2_mv_x1; 905 i2_mv_y = i2_mv_y1; 906 } 907 908 u1_colz = 909 (ps_cur_mb_info->u1_mb_field_decodingflag << 1) 910 | ((u1_ref_idx0 == 0) 911 && (ABS(i2_mv_x) 912 <= 1) 913 && (ABS(i2_mv_y) 914 <= 1)); 915 u1_colz |= (u1_packed_mb_sub_mb_mode << 4); 916 } 917 ih264d_rep_mv_colz(ps_dec, &s_temp_mv_pred, ps_mv, u1_sub_mb_num, 918 u1_colz, u1_mb_parth, u1_mb_partw); 919 } 920 } 921 } 922 /* return value set to UWORD8 to make it homogeneous */ 923 /* with decodespatialdirect */ 924 return OK; 925} 926 927void ih264d_convert_frm_to_fld_list(struct pic_buffer_t *ps_ref_pic_buf_lx, 928 UWORD8 *pu1_L0, 929 dec_struct_t *ps_dec, 930 UWORD8 u1_num_short_term_bufs) 931{ 932 UWORD8 uc_count = *pu1_L0, i, uc_l1, uc_lx, j; 933 struct pic_buffer_t *ps_ref_lx[2], *ps_ref_pic_lx; 934 UWORD8 u1_bottom_field_flag; 935 dec_slice_params_t *ps_cur_slice; 936 UWORD8 u1_ref[2], u1_fld[2], u1_same_fld, u1_op_fld; 937 UWORD32 ui_half_num_of_sub_mbs; 938 939 uc_l1 = 0; 940 uc_lx = 0; 941 ps_cur_slice = ps_dec->ps_cur_slice; 942 ps_ref_pic_lx = ps_ref_pic_buf_lx - MAX_REF_BUFS; 943 ps_ref_lx[0] = ps_ref_pic_buf_lx; 944 ps_ref_lx[1] = ps_ref_pic_buf_lx; 945 u1_bottom_field_flag = ps_cur_slice->u1_bottom_field_flag; 946 ui_half_num_of_sub_mbs = ((ps_dec->u2_pic_ht * ps_dec->u2_pic_wd) >> 5); 947 if(u1_bottom_field_flag) 948 { 949 u1_ref[0] = BOT_REF; 950 u1_ref[1] = TOP_REF; 951 u1_fld[0] = BOT_FLD; 952 u1_fld[1] = TOP_FLD; 953 u1_same_fld = BOT_FLD; 954 u1_op_fld = TOP_FLD; 955 } 956 else 957 { 958 u1_ref[0] = TOP_REF; 959 u1_ref[1] = BOT_REF; 960 u1_fld[0] = TOP_FLD; 961 u1_fld[1] = BOT_FLD; 962 u1_same_fld = TOP_FLD; 963 u1_op_fld = BOT_FLD; 964 } 965 966 /* Create the field list starting with all the short term */ 967 /* frames followed by all the long term frames. No long term */ 968 /* reference field should have a list idx less than a short */ 969 /* term reference field during initiailization. */ 970 971 for(j = 0; j < 2; j++) 972 { 973 i = ((j == 0) ? 0 : u1_num_short_term_bufs); 974 uc_count = ((j == 0) ? u1_num_short_term_bufs : *pu1_L0); 975 for(; i < uc_count; i++, ps_ref_lx[0]++) 976 { 977 /* Search field of same parity in Frame list */ 978 if((ps_ref_lx[0]->u1_pic_type & u1_ref[0])) // || ((ps_ref_lx[0]->u1_picturetype & 0x3) == 0)) 979 { 980 /* Insert PIC of same parity in RefPicList */ 981 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_lx, ps_ref_lx[0]); 982 ps_ref_pic_lx->i4_pic_num = (ps_ref_pic_lx->i4_pic_num * 2 + 1); 983 ps_ref_pic_lx->u1_long_term_pic_num = 984 (ps_ref_pic_lx->u1_long_term_frm_idx * 2 + 1); 985 ps_ref_pic_lx->u1_pic_type = u1_same_fld; 986 if(u1_fld[0] & BOT_FLD) 987 { 988 ps_ref_pic_lx->u1_pic_type = BOT_FLD; 989 ps_ref_pic_lx->pu1_buf1 += ps_ref_pic_lx->u2_frm_wd_y; 990 ps_ref_pic_lx->pu1_buf2 += ps_ref_pic_lx->u2_frm_wd_uv; 991 ps_ref_pic_lx->pu1_buf3 += ps_ref_pic_lx->u2_frm_wd_uv; 992 if(ps_ref_pic_lx->u1_picturetype & 0x3) 993 { 994 ps_ref_pic_lx->pu1_col_zero_flag += ui_half_num_of_sub_mbs; 995 ps_ref_pic_lx->ps_mv += ui_half_num_of_sub_mbs; 996 } 997 ps_ref_pic_lx->i4_poc = 998 ps_ref_pic_lx->i4_bottom_field_order_cnt; 999 ps_ref_pic_lx->i4_avg_poc = 1000 ps_ref_pic_lx->i4_bottom_field_order_cnt; 1001 } 1002 else 1003 { 1004 ps_ref_pic_lx->u1_pic_type = TOP_FLD; 1005 ps_ref_pic_lx->i4_poc = ps_ref_pic_lx->i4_top_field_order_cnt; 1006 ps_ref_pic_lx->i4_avg_poc = 1007 ps_ref_pic_lx->i4_top_field_order_cnt; 1008 } 1009 1010 ps_ref_pic_lx++; 1011 uc_lx++; 1012 /* Find field of opposite parity */ 1013 if(uc_l1 < uc_count && ps_ref_lx[1]) 1014 { 1015 while(!(ps_ref_lx[1]->u1_pic_type & u1_ref[1])) 1016 { 1017 ps_ref_lx[1]++; 1018 uc_l1++; 1019 if(uc_l1 >= uc_count) 1020 ps_ref_lx[1] = 0; 1021 if(!ps_ref_lx[1]) 1022 break; 1023 } 1024 1025 if(ps_ref_lx[1]) 1026 { 1027 uc_l1++; 1028 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_lx, 1029 ps_ref_lx[1]); 1030 ps_ref_pic_lx->u1_pic_type = u1_op_fld; 1031 ps_ref_pic_lx->i4_pic_num = (ps_ref_pic_lx->i4_pic_num * 2); 1032 ps_ref_pic_lx->u1_long_term_pic_num = 1033 (ps_ref_pic_lx->u1_long_term_frm_idx * 2); 1034 if(u1_fld[1] & BOT_FLD) 1035 { 1036 ps_ref_pic_lx->u1_pic_type = BOT_FLD; 1037 ps_ref_pic_lx->pu1_buf1 += ps_ref_pic_lx->u2_frm_wd_y; 1038 ps_ref_pic_lx->pu1_buf2 += ps_ref_pic_lx->u2_frm_wd_uv; 1039 ps_ref_pic_lx->pu1_buf3 += ps_ref_pic_lx->u2_frm_wd_uv; 1040 if(ps_ref_pic_lx->u1_picturetype & 0x3) 1041 { 1042 ps_ref_pic_lx->pu1_col_zero_flag += 1043 ui_half_num_of_sub_mbs; 1044 ps_ref_pic_lx->ps_mv += ui_half_num_of_sub_mbs; 1045 } 1046 ps_ref_pic_lx->i4_poc = 1047 ps_ref_pic_lx->i4_bottom_field_order_cnt; 1048 ps_ref_pic_lx->i4_avg_poc = 1049 ps_ref_pic_lx->i4_bottom_field_order_cnt; 1050 } 1051 else 1052 { 1053 ps_ref_pic_lx->u1_pic_type = TOP_FLD; 1054 ps_ref_pic_lx->i4_poc = 1055 ps_ref_pic_lx->i4_top_field_order_cnt; 1056 ps_ref_pic_lx->i4_avg_poc = 1057 ps_ref_pic_lx->i4_top_field_order_cnt; 1058 } 1059 ps_ref_pic_lx++; 1060 uc_lx++; 1061 ps_ref_lx[1]++; 1062 } 1063 } 1064 } 1065 } 1066 1067 /* Same parity fields are over, now insert left over opposite parity fields */ 1068 /** Added if(ps_ref_lx[1]) for error checks */ 1069 if(ps_ref_lx[1]) 1070 { 1071 for(; uc_l1 < uc_count; uc_l1++) 1072 { 1073 if(ps_ref_lx[1]->u1_pic_type & u1_ref[1]) 1074 { 1075 /* Insert PIC of opposite parity in RefPicList */ 1076 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_lx, 1077 ps_ref_lx[1]); 1078 ps_ref_pic_lx->u1_pic_type = u1_op_fld; 1079 ps_ref_pic_lx->i4_pic_num = (ps_ref_pic_lx->i4_pic_num * 2); 1080 ps_ref_pic_lx->u1_long_term_pic_num = 1081 (ps_ref_pic_lx->u1_long_term_frm_idx * 2); 1082 if(u1_op_fld == BOT_FLD) 1083 { 1084 ps_ref_pic_lx->u1_pic_type = BOT_FLD; 1085 ps_ref_pic_lx->pu1_buf1 += ps_ref_pic_lx->u2_frm_wd_y; 1086 ps_ref_pic_lx->pu1_buf2 += ps_ref_pic_lx->u2_frm_wd_uv; 1087 ps_ref_pic_lx->pu1_buf3 += ps_ref_pic_lx->u2_frm_wd_uv; 1088 if(ps_ref_pic_lx->u1_picturetype & 0x3) 1089 { 1090 ps_ref_pic_lx->pu1_col_zero_flag += 1091 ui_half_num_of_sub_mbs; 1092 ps_ref_pic_lx->ps_mv += ui_half_num_of_sub_mbs; 1093 } 1094 ps_ref_pic_lx->i4_poc = 1095 ps_ref_pic_lx->i4_bottom_field_order_cnt; 1096 ps_ref_pic_lx->i4_avg_poc = 1097 ps_ref_pic_lx->i4_bottom_field_order_cnt; 1098 } 1099 else 1100 { 1101 ps_ref_pic_lx->i4_poc = 1102 ps_ref_pic_lx->i4_top_field_order_cnt; 1103 ps_ref_pic_lx->i4_avg_poc = 1104 ps_ref_pic_lx->i4_top_field_order_cnt; 1105 } 1106 ps_ref_pic_lx++; 1107 uc_lx++; 1108 ps_ref_lx[1]++; 1109 } 1110 } 1111 } 1112 } 1113 *pu1_L0 = uc_lx; 1114} 1115 1116void ih264d_convert_frm_mbaff_list(dec_struct_t *ps_dec) 1117{ 1118 struct pic_buffer_t **ps_ref_pic_lx; 1119 UWORD8 u1_max_ref_idx, idx; 1120 UWORD16 u2_frm_wd_y, u2_frm_wd_uv; 1121 struct pic_buffer_t **ps_ref_pic_buf_lx; 1122 UWORD32 u4_half_num_of_sub_mbs = ((ps_dec->u2_pic_ht * ps_dec->u2_pic_wd) >> 5); 1123 1124 ps_ref_pic_buf_lx = ps_dec->ps_ref_pic_buf_lx[0]; 1125 ps_ref_pic_lx = ps_dec->ps_ref_pic_buf_lx[0]; 1126 u1_max_ref_idx = ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]; 1127 for(idx = 0; idx < u1_max_ref_idx; idx++) 1128 { 1129 ps_ref_pic_lx[idx]->u1_pic_type = TOP_FLD; 1130 ps_ref_pic_lx[idx]->i4_poc = ps_ref_pic_lx[idx]->i4_top_field_order_cnt; 1131 1132 } 1133 u2_frm_wd_y = ps_dec->u2_frm_wd_y; 1134 u2_frm_wd_uv = ps_dec->u2_frm_wd_uv; 1135 1136 for(idx = 0; idx < u1_max_ref_idx; idx++) 1137 { 1138 *ps_ref_pic_lx[idx + MAX_REF_BUFS] = *ps_ref_pic_buf_lx[idx]; 1139 ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf1 = 1140 ps_ref_pic_buf_lx[idx]->pu1_buf1 + u2_frm_wd_y; 1141 ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf2 = 1142 ps_ref_pic_buf_lx[idx]->pu1_buf2 + u2_frm_wd_uv; 1143 ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf3 = 1144 ps_ref_pic_buf_lx[idx]->pu1_buf3 + u2_frm_wd_uv; 1145 1146 ps_ref_pic_lx[idx + MAX_REF_BUFS]->u1_pic_type = BOT_FLD; 1147 ps_ref_pic_lx[idx + MAX_REF_BUFS]->i4_poc = 1148 ps_ref_pic_buf_lx[idx]->i4_bottom_field_order_cnt; 1149 if(ps_ref_pic_buf_lx[idx]->u1_picturetype & 0x3) 1150 { 1151 ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_col_zero_flag = 1152 ps_ref_pic_buf_lx[idx]->pu1_col_zero_flag 1153 + u4_half_num_of_sub_mbs; 1154 ps_ref_pic_lx[idx + MAX_REF_BUFS]->ps_mv = 1155 ps_ref_pic_buf_lx[idx]->ps_mv + u4_half_num_of_sub_mbs; 1156 } 1157 } 1158 1159 if(ps_dec->u1_B) 1160 { 1161 ps_ref_pic_buf_lx = ps_dec->ps_ref_pic_buf_lx[1]; 1162 ps_ref_pic_lx = ps_dec->ps_ref_pic_buf_lx[1]; 1163 u1_max_ref_idx = ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]; 1164 for(idx = 0; idx < u1_max_ref_idx; idx++) 1165 { 1166 ps_ref_pic_lx[idx]->u1_pic_type = TOP_FLD; 1167 ps_ref_pic_lx[idx]->i4_poc = ps_ref_pic_lx[idx]->i4_top_field_order_cnt; 1168 1169 } 1170 1171 for(idx = 0; idx < u1_max_ref_idx; idx++) 1172 { 1173 *ps_ref_pic_lx[idx + MAX_REF_BUFS] = *ps_ref_pic_buf_lx[idx]; 1174 ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf1 = 1175 ps_ref_pic_buf_lx[idx]->pu1_buf1 + u2_frm_wd_y; 1176 ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf2 = 1177 ps_ref_pic_buf_lx[idx]->pu1_buf2 + u2_frm_wd_uv; 1178 ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf3 = 1179 ps_ref_pic_buf_lx[idx]->pu1_buf3 + u2_frm_wd_uv; 1180 ps_ref_pic_lx[idx + MAX_REF_BUFS]->u1_pic_type = BOT_FLD; 1181 ps_ref_pic_lx[idx + MAX_REF_BUFS]->i4_poc = 1182 ps_ref_pic_buf_lx[idx]->i4_bottom_field_order_cnt; 1183 1184 if(ps_ref_pic_buf_lx[idx]->u1_picturetype & 0x3) 1185 { 1186 ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_col_zero_flag = 1187 ps_ref_pic_buf_lx[idx]->pu1_col_zero_flag 1188 + u4_half_num_of_sub_mbs; 1189 ps_ref_pic_lx[idx + MAX_REF_BUFS]->ps_mv = 1190 ps_ref_pic_buf_lx[idx]->ps_mv 1191 + u4_half_num_of_sub_mbs; 1192 } 1193 } 1194 } 1195} 1196/*! 1197 ************************************************************************** 1198 * \if Function name : ih264d_init_ref_idx_lx_b \endif 1199 * 1200 * \brief 1201 * Initializes forward and backward refernce lists for B slice decoding. 1202 * 1203 * 1204 * \return 1205 * 0 on Success and Error code otherwise 1206 ************************************************************************** 1207 */ 1208void ih264d_init_ref_idx_lx_b(dec_struct_t *ps_dec) 1209{ 1210 struct pic_buffer_t *ps_ref_pic_buf_lx; 1211 dpb_manager_t *ps_dpb_mgr; 1212 struct dpb_info_t *ps_next_dpb; 1213 WORD32 i_cur_poc, i_max_st_poc, i_min_st_poc, i_ref_poc, i_temp_poc; 1214 WORD8 i; 1215 UWORD8 u1_max_lt_index, u1_min_lt_index, u1_lt_index; 1216 UWORD8 u1_field_pic_flag; 1217 dec_slice_params_t *ps_cur_slice; 1218 UWORD8 u1_L0, u1_L1; 1219 UWORD8 u1_num_short_term_bufs; 1220 UWORD8 u1_max_ref_idx_l0, u1_max_ref_idx_l1; 1221 1222 ps_cur_slice = ps_dec->ps_cur_slice; 1223 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag; 1224 u1_max_ref_idx_l0 = ps_cur_slice->u1_num_ref_idx_lx_active[0] 1225 << u1_field_pic_flag; 1226 u1_max_ref_idx_l1 = ps_cur_slice->u1_num_ref_idx_lx_active[1] 1227 << u1_field_pic_flag; 1228 1229 ps_dpb_mgr = ps_dec->ps_dpb_mgr; 1230 /* Get the current POC */ 1231 i_cur_poc = ps_dec->ps_cur_pic->i4_poc; 1232 1233 /* Get MaxStPOC,MinStPOC,MaxLt,MinLt */ 1234 i_max_st_poc = i_cur_poc; 1235 i_min_st_poc = i_cur_poc; 1236 u1_max_lt_index = MAX_REF_BUFS + 1; 1237 u1_min_lt_index = MAX_REF_BUFS + 1; 1238 /* Start from ST head */ 1239 ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head; 1240 for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++) 1241 { 1242 i_ref_poc = ps_next_dpb->ps_pic_buf->i4_poc; 1243 if(i_ref_poc < i_cur_poc) 1244 { 1245 /* RefPic Buf POC is before Current POC in display order */ 1246 i_min_st_poc = MIN(i_min_st_poc, i_ref_poc); 1247 } 1248 else 1249 { 1250 /* RefPic Buf POC is after Current POC in display order */ 1251 i_max_st_poc = MAX(i_max_st_poc, i_ref_poc); 1252 } 1253 1254 /* Chase the next link */ 1255 ps_next_dpb = ps_next_dpb->ps_prev_short; 1256 } 1257 1258 /* Start from LT head */ 1259 ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head; 1260 if(ps_next_dpb) 1261 { 1262 u1_max_lt_index = ps_next_dpb->u1_lt_idx; 1263 u1_min_lt_index = ps_next_dpb->u1_lt_idx; 1264 } 1265 for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++) 1266 { 1267 u1_lt_index = ps_next_dpb->u1_lt_idx; 1268 u1_max_lt_index = (UWORD8)(MAX(u1_max_lt_index, u1_lt_index)); 1269 u1_min_lt_index = (UWORD8)(MIN(u1_min_lt_index, u1_lt_index)); 1270 1271 /* Chase the next link */ 1272 ps_next_dpb = ps_next_dpb->ps_prev_long; 1273 } 1274 1275 /* 1. Initialize refIdxL0 */ 1276 u1_L0 = 0; 1277 if(u1_field_pic_flag) 1278 { 1279 ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[0][0]; 1280 ps_ref_pic_buf_lx += MAX_REF_BUFS; 1281 i_temp_poc = i_cur_poc; 1282 } 1283 else 1284 { 1285 ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[0][0]; 1286 i_temp_poc = i_cur_poc - 1; 1287 } 1288 /* Arrange all short term buffers in output order as given by POC */ 1289 /* 1.1 Arrange POC's less than CurrPOC in the descending POC order starting 1290 from (CurrPOC - 1)*/ 1291 for(; i_temp_poc >= i_min_st_poc; i_temp_poc--) 1292 { 1293 /* Start from ST head */ 1294 ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head; 1295 for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++) 1296 { 1297 if((WORD32)ps_next_dpb->ps_pic_buf->i4_poc == i_temp_poc) 1298 { 1299 /* Copy info in pic buffer */ 1300 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx, 1301 ps_next_dpb->ps_pic_buf); 1302 ps_ref_pic_buf_lx++; 1303 u1_L0++; 1304 break; 1305 } 1306 ps_next_dpb = ps_next_dpb->ps_prev_short; 1307 } 1308 } 1309 1310 { 1311 /* 1.2. Arrange POC's more than CurrPOC in the ascending POC order starting 1312 from (CurrPOC + 1)*/ 1313 for(i_temp_poc = i_cur_poc + 1; i_temp_poc <= i_max_st_poc; i_temp_poc++) 1314 { 1315 /* Start from ST head */ 1316 ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head; 1317 for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++) 1318 { 1319 if((WORD32)ps_next_dpb->ps_pic_buf->i4_poc == i_temp_poc) 1320 { 1321 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx, 1322 ps_next_dpb->ps_pic_buf); 1323 ps_ref_pic_buf_lx++; 1324 u1_L0++; 1325 break; 1326 } 1327 ps_next_dpb = ps_next_dpb->ps_prev_short; 1328 } 1329 } 1330 } 1331 1332 /* 1.3 Arrange all Long term buffers in ascending order, in LongtermIndex */ 1333 /* Start from ST head */ 1334 1335 u1_num_short_term_bufs = u1_L0; 1336 for(u1_lt_index = u1_min_lt_index; u1_lt_index <= u1_max_lt_index; u1_lt_index++) 1337 { 1338 ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head; 1339 for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++) 1340 { 1341 if(ps_next_dpb->u1_lt_idx == u1_lt_index) 1342 { 1343 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx, 1344 ps_next_dpb->ps_pic_buf); 1345 ps_ref_pic_buf_lx->u1_long_term_pic_num = 1346 ps_ref_pic_buf_lx->u1_long_term_frm_idx; 1347 1348 ps_ref_pic_buf_lx++; 1349 u1_L0++; 1350 break; 1351 } 1352 ps_next_dpb = ps_next_dpb->ps_prev_long; 1353 } 1354 } 1355 1356 if(u1_field_pic_flag) 1357 { 1358 /* Initialize the rest of the entries in the */ 1359 /* reference list to handle of errors */ 1360 { 1361 UWORD8 u1_i; 1362 pic_buffer_t *ps_ref_pic; 1363 1364 ps_ref_pic = ps_dpb_mgr->ps_init_dpb[0][0] + MAX_REF_BUFS; 1365 1366 if(NULL == ps_ref_pic->pu1_buf1) 1367 { 1368 ps_ref_pic = ps_dec->ps_cur_pic; 1369 } 1370 for(u1_i = u1_L0; u1_i < u1_max_ref_idx_l0; u1_i++) 1371 { 1372 *ps_ref_pic_buf_lx = *ps_ref_pic; 1373 ps_ref_pic_buf_lx++; 1374 } 1375 } 1376 ih264d_convert_frm_to_fld_list( 1377 ps_dpb_mgr->ps_init_dpb[0][0] + MAX_REF_BUFS, &u1_L0, 1378 ps_dec, u1_num_short_term_bufs); 1379 1380 ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[0][0] + u1_L0; 1381 } 1382 1383 ps_dec->ps_cur_slice->u1_initial_list_size[0] = u1_L0; 1384 1385 /* Initialize the rest of the entries in the */ 1386 /* reference list to handle of errors */ 1387 { 1388 UWORD8 u1_i; 1389 pic_buffer_t *ps_ref_pic; 1390 1391 ps_ref_pic = ps_dpb_mgr->ps_init_dpb[0][0]; 1392 1393 if(NULL == ps_ref_pic->pu1_buf1) 1394 { 1395 ps_ref_pic = ps_dec->ps_cur_pic; 1396 } 1397 for(u1_i = u1_L0; u1_i < u1_max_ref_idx_l0; u1_i++) 1398 { 1399 *ps_ref_pic_buf_lx = *ps_ref_pic; 1400 ps_ref_pic_buf_lx++; 1401 } 1402 } 1403 { 1404 /* 2. Initialize refIdxL1 */ 1405 u1_L1 = 0; 1406 if(u1_field_pic_flag) 1407 { 1408 ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[1][0] + MAX_REF_BUFS; 1409 } 1410 else 1411 { 1412 ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[1][0]; 1413 } 1414 1415 /* 2.1. Arrange POC's more than CurrPOC in the ascending POC order starting 1416 from (CurrPOC + 1)*/ 1417 for(i_temp_poc = i_cur_poc + 1; i_temp_poc <= i_max_st_poc; i_temp_poc++) 1418 { 1419 /* Start from ST head */ 1420 ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head; 1421 for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++) 1422 { 1423 if((WORD32)ps_next_dpb->ps_pic_buf->i4_poc == i_temp_poc) 1424 { 1425 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx, 1426 ps_next_dpb->ps_pic_buf); 1427 ps_ref_pic_buf_lx++; 1428 u1_L1++; 1429 break; 1430 } 1431 ps_next_dpb = ps_next_dpb->ps_prev_short; 1432 } 1433 } 1434 1435 if(u1_field_pic_flag) 1436 { 1437 i_temp_poc = i_cur_poc; 1438 } 1439 else 1440 { 1441 i_temp_poc = i_cur_poc - 1; 1442 } 1443 1444 /* Arrange all short term buffers in output order as given by POC */ 1445 /* 2.2 Arrange POC's less than CurrPOC in the descending POC order starting 1446 from (CurrPOC - 1)*/ 1447 for(; i_temp_poc >= i_min_st_poc; i_temp_poc--) 1448 { 1449 /* Start from ST head */ 1450 ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head; 1451 for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++) 1452 { 1453 if((WORD32)ps_next_dpb->ps_pic_buf->i4_poc == i_temp_poc) 1454 { 1455 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx, 1456 ps_next_dpb->ps_pic_buf); 1457 ps_ref_pic_buf_lx++; 1458 u1_L1++; 1459 break; 1460 } 1461 ps_next_dpb = ps_next_dpb->ps_prev_short; 1462 } 1463 } 1464 1465 /* 2.3 Arrange all Long term buffers in ascending order, in LongtermIndex */ 1466 /* Start from ST head */ 1467 u1_num_short_term_bufs = u1_L1; 1468 ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head; 1469 for(u1_lt_index = u1_min_lt_index; u1_lt_index <= u1_max_lt_index; 1470 u1_lt_index++) 1471 { 1472 for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++) 1473 { 1474 if(ps_next_dpb->u1_lt_idx == u1_lt_index) 1475 { 1476 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx, 1477 ps_next_dpb->ps_pic_buf); 1478 ps_ref_pic_buf_lx->u1_long_term_pic_num = 1479 ps_ref_pic_buf_lx->u1_long_term_frm_idx; 1480 ps_ref_pic_buf_lx++; 1481 u1_L1++; 1482 break; 1483 } 1484 ps_next_dpb = ps_next_dpb->ps_prev_long; 1485 } 1486 } 1487 1488 if(u1_field_pic_flag) 1489 { 1490 /* Initialize the rest of the entries in the */ 1491 /* reference list to handle of errors */ 1492 { 1493 UWORD8 u1_i; 1494 pic_buffer_t *ps_ref_pic; 1495 1496 ps_ref_pic = ps_dpb_mgr->ps_init_dpb[1][0] + MAX_REF_BUFS; 1497 1498 if(NULL == ps_ref_pic->pu1_buf1) 1499 { 1500 ps_ref_pic = ps_dec->ps_cur_pic; 1501 } 1502 for(u1_i = u1_L1; u1_i < u1_max_ref_idx_l1; u1_i++) 1503 { 1504 *ps_ref_pic_buf_lx = *ps_ref_pic; 1505 ps_ref_pic_buf_lx++; 1506 } 1507 } 1508 1509 ih264d_convert_frm_to_fld_list( 1510 ps_dpb_mgr->ps_init_dpb[1][0] + MAX_REF_BUFS, 1511 &u1_L1, ps_dec, u1_num_short_term_bufs); 1512 ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[1][0] + u1_L1; 1513 } 1514 1515 ps_dec->ps_cur_slice->u1_initial_list_size[1] = u1_L1; 1516 1517 /* Initialize the rest of the entries in the */ 1518 /* reference list to handle of errors */ 1519 { 1520 UWORD8 u1_i; 1521 pic_buffer_t *ps_ref_pic; 1522 1523 ps_ref_pic = ps_dpb_mgr->ps_init_dpb[1][0]; 1524 1525 if(NULL == ps_ref_pic->pu1_buf1) 1526 { 1527 ps_ref_pic = ps_dec->ps_cur_pic; 1528 } 1529 for(u1_i = u1_L1; u1_i < u1_max_ref_idx_l1; u1_i++) 1530 { 1531 *ps_ref_pic_buf_lx = *ps_ref_pic; 1532 ps_ref_pic_buf_lx++; 1533 } 1534 } 1535 1536 /* If list0 and list 1 ebtries are same then swap the 0th and 1st entry */ 1537 /* of list 1 */ 1538 { 1539 struct pic_buffer_t *ps_ref_pic1_buf_l0, *ps_ref_pic1_buf_l1; 1540 struct pic_buffer_t s_ref_pic1_buf_temp; 1541 1542 ps_ref_pic1_buf_l0 = ps_dpb_mgr->ps_init_dpb[0][0]; 1543 ps_ref_pic1_buf_l1 = ps_dpb_mgr->ps_init_dpb[1][0]; 1544 1545 if((u1_L0 == u1_L1) && (u1_L0 > 1)) 1546 { 1547 WORD32 i_index, i_swap; 1548 1549 i_swap = 1; 1550 1551 for(i_index = 0; i_index < u1_L0; i_index++) 1552 { 1553 if((ps_ref_pic1_buf_l0[i_index]).pu1_buf1 1554 != (ps_ref_pic1_buf_l1[i_index]).pu1_buf1) 1555 { 1556 i_swap = 0; 1557 break; 1558 } 1559 } 1560 if(1 == i_swap) 1561 { 1562 memcpy(&s_ref_pic1_buf_temp, &ps_ref_pic1_buf_l1[1], 1563 sizeof(struct pic_buffer_t)); 1564 memcpy(&ps_ref_pic1_buf_l1[1], &ps_ref_pic1_buf_l1[0], 1565 sizeof(struct pic_buffer_t)); 1566 memcpy(&ps_ref_pic1_buf_l1[0], &s_ref_pic1_buf_temp, 1567 sizeof(struct pic_buffer_t)); 1568 } 1569 } 1570 } 1571 } 1572} 1573 1574 1575 1576void ih264d_get_implicit_weights(dec_struct_t *ps_dec); 1577 1578/*! 1579 ************************************************************************** 1580 * \if Function name : ih264d_one_to_one \endif 1581 * 1582 * \brief 1583 * Initializes forward and backward refernce lists for B slice decoding. 1584 * 1585 * 1586 * \return 1587 * 0 on Success and Error code otherwise 1588 ************************************************************************** 1589 */ 1590void ih264d_one_to_one(dec_struct_t *ps_dec, 1591 struct pic_buffer_t *ps_col_pic, 1592 directmv_t *ps_direct, 1593 UWORD8 u1_wd_x, 1594 WORD32 u2_sub_mb_ofst, 1595 dec_mb_info_t * ps_cur_mb_info) 1596{ 1597 UWORD8 *pu1_col_zero_flag_start, u1_col_mb_pred_mode, u1_num_blks, u1_sub_mb_num; 1598 UWORD8 u1_init_colzero_flag; 1599 UNUSED(ps_cur_mb_info); 1600 pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst; 1601 u1_col_mb_pred_mode = pu1_col_zero_flag_start[ps_dec->u1_sub_mb_num]; 1602 u1_init_colzero_flag = u1_col_mb_pred_mode & 1; 1603 u1_col_mb_pred_mode >>= 6; 1604 ps_direct->u1_vert_mv_scale = ONE_TO_ONE; 1605 ps_direct->u1_col_zeroflag_change = 0; 1606 1607 if(u1_wd_x == MB_SIZE) 1608 { 1609 ps_dec->u1_currB_type = (!!u1_col_mb_pred_mode); 1610 if(u1_col_mb_pred_mode == PRED_16x16) 1611 { 1612 ps_direct->i1_num_partitions = 1; 1613 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst; 1614 ps_direct->i1_submb_num[0] = 0; 1615 ps_direct->i1_partitionsize[0] = PRED_16x16; 1616 1617 return; 1618 } 1619 else if(u1_col_mb_pred_mode < PRED_8x8) 1620 { 1621 ps_direct->i1_num_partitions = 2; 1622 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst; 1623 ps_direct->i1_submb_num[0] = 0; 1624 ps_direct->i1_partitionsize[0] = u1_col_mb_pred_mode; 1625 u1_sub_mb_num = (u1_col_mb_pred_mode == PRED_16x8) ? 8 : 2; 1626 ps_direct->i1_submb_num[1] = u1_sub_mb_num; 1627 ps_direct->i4_mv_indices[1] = u2_sub_mb_ofst 1628 + ps_direct->i1_submb_num[1]; 1629 ps_direct->i1_partitionsize[1] = u1_col_mb_pred_mode; 1630 if((pu1_col_zero_flag_start[u1_sub_mb_num] & 1) != u1_init_colzero_flag) 1631 ps_direct->u1_col_zeroflag_change = 1; 1632 return; 1633 } 1634 else 1635 { 1636 u1_num_blks = 4; 1637 } 1638 } 1639 else 1640 { 1641 u1_num_blks = 1; 1642 } 1643 1644 { 1645 const UWORD8 *pu1_top_lt_mb_part_idx; 1646 UWORD8 u1_col_sub_mb_pred_mode, uc_blk, u1_sub_blk, u1_submb_col = 0; 1647 UWORD8 u1_num_sub_blks, uc_direct8x8inf, *pu1_col_zero_flag, u1_sub_mb_num; 1648 const UWORD8 *pu1_num_sub_mb_part = 1649 (const UWORD8 *)gau1_ih264d_num_submb_part; 1650 UWORD8 i1_num_partitions = 0, partition_size; 1651 WORD32 mv_index; 1652 const UWORD8 *pu1_top_lt_sub_mb_idx = gau1_ih264d_submb_indx_mod_sp_drct; 1653 1654 u1_sub_mb_num = ps_dec->u1_sub_mb_num; 1655 uc_direct8x8inf = ps_dec->ps_cur_slice->u1_direct_8x8_inference_flag; 1656 pu1_top_lt_mb_part_idx = gau1_ih264d_top_left_mb_part_indx_mod 1657 + (PRED_8x8 << 1) + 1; 1658 1659 for(uc_blk = 0; uc_blk < u1_num_blks; uc_blk++) 1660 { 1661 partition_size = PRED_8x8; 1662 pu1_top_lt_sub_mb_idx = gau1_ih264d_submb_indx_mod_sp_drct; 1663 if(uc_direct8x8inf == 1) 1664 { 1665 u1_submb_col = u1_sub_mb_num | (u1_sub_mb_num >> 1); 1666 mv_index = u2_sub_mb_ofst + u1_submb_col; 1667 u1_num_sub_blks = 1; 1668 } 1669 else 1670 { 1671 /* colMbPart is either 8x8, 8x4, 4x8, 4x4 */ 1672 pu1_col_zero_flag = pu1_col_zero_flag_start + u1_sub_mb_num; 1673 u1_col_sub_mb_pred_mode = *pu1_col_zero_flag; 1674 u1_col_sub_mb_pred_mode = (u1_col_sub_mb_pred_mode & 0x30) >> 4; 1675 partition_size = (UWORD8)((u1_col_sub_mb_pred_mode) 1676 | (PRED_8x8 << 2)); 1677 mv_index = u2_sub_mb_ofst + u1_sub_mb_num; 1678 pu1_top_lt_sub_mb_idx += (u1_col_sub_mb_pred_mode << 1); 1679 u1_num_sub_blks = pu1_num_sub_mb_part[u1_col_sub_mb_pred_mode]; 1680 1681 } 1682 1683 for(u1_sub_blk = 0; u1_sub_blk < u1_num_sub_blks; 1684 u1_sub_blk++, pu1_top_lt_sub_mb_idx++) 1685 { 1686 u1_sub_mb_num += *pu1_top_lt_sub_mb_idx; 1687 mv_index += *pu1_top_lt_sub_mb_idx; 1688 ps_direct->i4_mv_indices[i1_num_partitions] = mv_index; 1689 ps_direct->i1_submb_num[i1_num_partitions] = u1_sub_mb_num; 1690 ps_direct->i1_partitionsize[i1_num_partitions] = partition_size; 1691 i1_num_partitions++; 1692 if(!uc_direct8x8inf) 1693 u1_submb_col = u1_sub_mb_num; 1694 if((pu1_col_zero_flag_start[u1_submb_col] & 1) 1695 != u1_init_colzero_flag) 1696 ps_direct->u1_col_zeroflag_change = 1; 1697 } 1698 u1_sub_mb_num = *pu1_top_lt_mb_part_idx++; 1699 } 1700 ps_direct->i1_num_partitions = i1_num_partitions; 1701 } 1702} 1703/*! 1704 ************************************************************************** 1705 * \if Function name : ih264d_mbaff_cross_pmbair \endif 1706 * 1707 * \brief 1708 * Initializes forward and backward refernce lists for B slice decoding. 1709 * 1710 * 1711 * \return 1712 * 0 on Success and Error code otherwise 1713 ************************************************************************** 1714 */ 1715void ih264d_mbaff_cross_pmbair(dec_struct_t *ps_dec, 1716 struct pic_buffer_t *ps_col_pic, 1717 directmv_t *ps_direct, 1718 UWORD8 u1_wd_x, 1719 WORD32 u2_sub_mb_ofst, 1720 dec_mb_info_t * ps_cur_mb_info) 1721{ 1722 UWORD8 *pu1_col_zero_flag_start, *pu1_col_zero_flag, u1_sub_mb_num, 1723 uc_sub_mb_num_col; 1724 UWORD8 *pu1_col_zero_flag_right_half; 1725 WORD32 i4_force_8X8; 1726 UWORD8 u1_num_blks, u1_col_mb_pred_mode, uc_blk, u1_col_sub_mb_pred_mode, 1727 u1_col_sub_mb_pred_mode_rt; 1728 UWORD8 i1_num_partitions = 0, partition_size; 1729 1730 WORD32 mv_index; 1731 1732 UWORD8 u1_num_sub_blks; 1733 UWORD8 u1_is_cur_mb_fld, i; 1734 UWORD8 u1_init_colzero_flag; 1735 1736 u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag; 1737 u1_sub_mb_num = ps_dec->u1_sub_mb_num; 1738 ps_direct->u1_col_zeroflag_change = 0; 1739 /*pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst; 1740 u1_col_mb_pred_mode = pu1_col_zero_flag_start[u1_sub_mb_num]; 1741 u1_init_colzero_flag = u1_col_mb_pred_mode & 1; 1742 u1_col_mb_pred_mode >>= 6; */ 1743 if(0 == u1_is_cur_mb_fld) 1744 { 1745 ps_direct->u1_vert_mv_scale = FLD_TO_FRM; 1746 if(u1_wd_x == MB_SIZE) 1747 { 1748 pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag 1749 + u2_sub_mb_ofst; 1750 u1_col_mb_pred_mode = pu1_col_zero_flag_start[0]; 1751 u1_init_colzero_flag = u1_col_mb_pred_mode & 1; 1752 u1_col_mb_pred_mode >>= 6; 1753 1754 1755 if(u1_col_mb_pred_mode & 0x2) 1756 { 1757 ps_dec->u1_currB_type = 1; 1758 if(u1_col_mb_pred_mode == PRED_8x16) 1759 { 1760 ps_direct->i1_num_partitions = 2; 1761 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst; 1762 ps_direct->i1_submb_num[0] = 0; 1763 ps_direct->i1_partitionsize[0] = PRED_8x16; 1764 ps_direct->i4_mv_indices[1] = u2_sub_mb_ofst + 2; 1765 ps_direct->i1_submb_num[1] = 2; 1766 ps_direct->i1_partitionsize[1] = PRED_8x16; 1767 if((pu1_col_zero_flag_start[2] & 1) != u1_init_colzero_flag) 1768 ps_direct->u1_col_zeroflag_change = 1; 1769 } 1770 else 1771 { 1772 pu1_col_zero_flag = pu1_col_zero_flag_start + u1_sub_mb_num; 1773 u1_col_sub_mb_pred_mode = (*pu1_col_zero_flag & 0x10);/* 8x4 or 4x4 mode */ 1774 1775 pu1_col_zero_flag_right_half = pu1_col_zero_flag_start 1776 + u1_sub_mb_num + 2; 1777 u1_col_sub_mb_pred_mode_rt = 1778 (*pu1_col_zero_flag_right_half & 0x10);/* 8x4 or 4x4 mode */ 1779 1780 i4_force_8X8 = (u1_col_sub_mb_pred_mode) 1781 || (u1_col_sub_mb_pred_mode_rt); 1782 if(i4_force_8X8) 1783 { 1784 u1_num_sub_blks = 2; 1785 partition_size = PRED_8x8; 1786 } 1787 else 1788 { 1789 partition_size = PRED_8x16; 1790 u1_num_sub_blks = 1; 1791 } 1792 1793 for(i = 0; i < 2; i++) 1794 { 1795 for(uc_blk = 0; uc_blk < u1_num_sub_blks; uc_blk++) 1796 { 1797 uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1); 1798 uc_sub_mb_num_col &= 0x7; 1799 mv_index = u2_sub_mb_ofst + uc_sub_mb_num_col; 1800 1801 ps_direct->i4_mv_indices[i1_num_partitions] = 1802 mv_index; 1803 ps_direct->i1_submb_num[i1_num_partitions] = 1804 u1_sub_mb_num; 1805 ps_direct->i1_partitionsize[i1_num_partitions] = 1806 partition_size; 1807 i1_num_partitions++; 1808 if((pu1_col_zero_flag_start[uc_sub_mb_num_col] & 1) 1809 != u1_init_colzero_flag) 1810 ps_direct->u1_col_zeroflag_change = 1; 1811 u1_sub_mb_num += 8; 1812 } 1813 u1_sub_mb_num = 2; /* move to second half of Cur MB */ 1814 } 1815 ps_direct->i1_num_partitions = i1_num_partitions; 1816 return; 1817 } 1818 } 1819 else 1820 { 1821 ps_direct->i1_num_partitions = 1; 1822 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst; 1823 ps_direct->i1_submb_num[0] = 0; 1824 ps_direct->i1_partitionsize[0] = PRED_16x16; 1825 ps_dec->u1_currB_type = 0; 1826 return; 1827 } 1828 } 1829 else 1830 { 1831 uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1); 1832 uc_sub_mb_num_col &= 0x7; 1833 1834 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst + uc_sub_mb_num_col; 1835 ps_direct->i1_submb_num[0] = u1_sub_mb_num; 1836 ps_direct->i1_partitionsize[0] = PRED_8x8; 1837 ps_direct->i1_num_partitions = 1; 1838 } 1839 } 1840 else 1841 { 1842 ps_direct->u1_vert_mv_scale = FRM_TO_FLD; 1843 pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst; 1844 u1_init_colzero_flag = pu1_col_zero_flag_start[0] & 1; 1845 1846 if(u1_wd_x == MB_SIZE) 1847 { 1848 UWORD8 u1_submb_col; 1849 UWORD8 *puc_colZeroFlagStart_bot_mb, uc_colMbPredMode_bot_mb; 1850 1851 pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag 1852 + u2_sub_mb_ofst; 1853 u1_col_mb_pred_mode = pu1_col_zero_flag_start[u1_sub_mb_num] >> 6; 1854 1855 puc_colZeroFlagStart_bot_mb = ps_col_pic->pu1_col_zero_flag 1856 + u2_sub_mb_ofst + 16; 1857 uc_colMbPredMode_bot_mb = puc_colZeroFlagStart_bot_mb[8] >> 6; 1858 1859 i4_force_8X8 = (u1_col_mb_pred_mode & 0x2) 1860 || (uc_colMbPredMode_bot_mb & 0x2); 1861 if(i4_force_8X8) 1862 { 1863 u1_num_blks = 2; 1864 partition_size = PRED_8x8; 1865 } 1866 else 1867 { 1868 u1_num_blks = 1; 1869 partition_size = PRED_16x8; 1870 } 1871 1872 ps_dec->u1_currB_type = 1; 1873 /*As this mb is derived from 2 Mbs min no of partitions = 2*/ 1874 for(i = 0; i < 2; i++) 1875 { 1876 1877 pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag 1878 + u2_sub_mb_ofst; 1879 u1_col_mb_pred_mode = pu1_col_zero_flag_start[u1_sub_mb_num] >> 6; 1880 1881 for(uc_blk = 0; uc_blk < u1_num_blks; uc_blk++) 1882 { 1883 u1_submb_col = (u1_sub_mb_num & 0x7) ? 1 : 0; 1884 u1_submb_col += u1_sub_mb_num; 1885 mv_index = u2_sub_mb_ofst + u1_submb_col; 1886 1887 1888 ps_direct->i4_mv_indices[i1_num_partitions] = mv_index; 1889 ps_direct->i1_submb_num[i1_num_partitions] = u1_sub_mb_num; 1890 ps_direct->i1_partitionsize[i1_num_partitions] = 1891 partition_size; 1892 i1_num_partitions++; 1893 if((pu1_col_zero_flag_start[u1_submb_col] & 1) 1894 != u1_init_colzero_flag) 1895 ps_direct->u1_col_zeroflag_change = 1; 1896 u1_sub_mb_num += 2; 1897 } 1898 u1_sub_mb_num = 8; /* move to second half of Cur MB */ 1899 u2_sub_mb_ofst += 16;/* move to next Colocated MB */ 1900 } 1901 ps_direct->i1_num_partitions = i1_num_partitions; 1902 return; 1903 } 1904 else 1905 { 1906 uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1); 1907 uc_sub_mb_num_col &= 0xb; 1908 u2_sub_mb_ofst += (u1_sub_mb_num >> 3) ? 16 : 0; 1909 1910 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst + uc_sub_mb_num_col; 1911 ps_direct->i1_submb_num[0] = u1_sub_mb_num; 1912 ps_direct->i1_partitionsize[0] = PRED_8x8; 1913 ps_direct->i1_num_partitions = 1; 1914 return; 1915 } 1916 } 1917} 1918/*! 1919 ************************************************************************** 1920 * \if Function name : ih264d_cal_col_pic \endif 1921 * 1922 * \brief 1923 * Finds the colocated picture. 1924 * 1925 * 1926 * \return 1927 * 0 on Success and Error code otherwise 1928 ************************************************************************** 1929 */ 1930WORD32 ih264d_cal_col_pic(dec_struct_t *ps_dec) 1931{ 1932 struct pic_buffer_t* ps_col_pic = ps_dec->ps_col_pic; 1933 UWORD8 uc_curpictype, uc_colpictype; 1934 ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][0]; 1935 uc_curpictype = (ps_dec->ps_cur_pic->u1_picturetype & 0x7); 1936 uc_colpictype = (ps_col_pic->u1_picturetype & 0x7); 1937 if(uc_curpictype == FRM_PIC) 1938 { 1939 if(uc_colpictype == FRM_PIC) 1940 ps_dec->pf_parse_mvdirect = ih264d_one_to_one; 1941 else if(uc_colpictype == COMP_FLD_PAIR) 1942 { 1943 ps_dec->pf_parse_mvdirect = ih264d_fld_to_frm; 1944 if(ps_col_pic->i4_top_field_order_cnt 1945 >= ps_col_pic->i4_bottom_field_order_cnt) 1946 { 1947 struct pic_buffer_t* ps_tempPic = ps_col_pic; 1948 UWORD32 ui_half_num_of_sub_mbs = ((ps_dec->u2_pic_ht 1949 * ps_dec->u2_pic_wd) >> 5); 1950 ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS]; 1951 /* memcpy ps_tempPic to ps_col_pic */ 1952 *ps_col_pic = *ps_tempPic; 1953 ps_col_pic->pu1_buf1 = ps_tempPic->pu1_buf1 1954 + ps_tempPic->u2_frm_wd_y; 1955 ps_col_pic->pu1_buf2 = ps_tempPic->pu1_buf2 1956 + ps_tempPic->u2_frm_wd_uv; 1957 ps_col_pic->pu1_buf3 = ps_tempPic->pu1_buf3 1958 + ps_tempPic->u2_frm_wd_uv; 1959 ps_col_pic->pu1_col_zero_flag = ps_tempPic->pu1_col_zero_flag 1960 + ui_half_num_of_sub_mbs; 1961 ps_col_pic->ps_mv = ps_tempPic->ps_mv + ui_half_num_of_sub_mbs; 1962 1963 1964 ps_col_pic->u1_pic_type = 0;/*complementary reference field pair-refering as frame */ 1965 1966 1967 1968 } 1969 } 1970 else 1971 { 1972 UWORD32 i4_error_code; 1973 i4_error_code = ERROR_DBP_MANAGER_T; 1974// i4_error_code |= 1<<IVD_CORRUPTEDDATA; 1975 return i4_error_code; 1976 } 1977 } 1978 else if(uc_curpictype == AFRM_PIC) 1979 { 1980 ps_dec->pf_parse_mvdirect = ih264d_fld_to_mbaff; 1981 } 1982 else /* must be a field*/ 1983 { 1984 if(uc_colpictype == FRM_PIC) 1985 ps_dec->pf_parse_mvdirect = ih264d_frm_to_fld; 1986 else if(uc_colpictype == AFRM_PIC) 1987 ps_dec->pf_parse_mvdirect = ih264d_mbaff_to_fld; 1988 else 1989 ps_dec->pf_parse_mvdirect = ih264d_one_to_one; 1990 } 1991 ps_dec->ps_col_pic = ps_col_pic; 1992 return OK; 1993} 1994 1995/*! 1996 ************************************************************************** 1997 * \if Function name : ih264d_frm_to_fld \endif 1998 * 1999 * \brief 2000 * Initializes forward and backward refernce lists for B slice decoding. 2001 * 2002 * 2003 * \return 2004 * 0 on Success and Error code otherwise 2005 ************************************************************************** 2006 */ 2007void ih264d_frm_to_fld(dec_struct_t *ps_dec, 2008 struct pic_buffer_t *ps_col_pic, 2009 directmv_t *ps_direct, 2010 UWORD8 u1_wd_x, 2011 WORD32 u2_sub_mb_ofst, 2012 dec_mb_info_t * ps_cur_mb_info) 2013{ 2014 UWORD8 *pu1_col_zero_flag_start, u1_sub_mb_num; 2015 UWORD8 u1_num_blks, u1_col_mb_pred_mode, uc_blk; 2016 UWORD8 i1_num_partitions = 0, partition_size, i; 2017 WORD32 mv_index; 2018 UWORD32 increment; 2019 WORD32 i4_force_8X8; 2020 UNUSED(ps_cur_mb_info); 2021 ps_direct->u1_col_zeroflag_change = 1; 2022 ps_direct->u1_vert_mv_scale = FRM_TO_FLD; 2023 u1_sub_mb_num = ps_dec->u1_sub_mb_num; 2024 2025 /* new calculation specific to this function */ 2026 if((ps_col_pic->u1_picturetype & 0x7) == FRM_PIC) 2027 { 2028 UWORD16 u2_frm_wd_in_mbs = ps_dec->u2_frm_wd_in_mbs; 2029 increment = (u2_frm_wd_in_mbs << 4); 2030 /*mbAddrCol = mbAddrCol1 */ 2031 u2_sub_mb_ofst = (ps_dec->u2_mbx 2032 + (2 * ps_dec->u2_mby * u2_frm_wd_in_mbs)) << 4; 2033 } 2034 else 2035 increment = 16; 2036 2037 if(u1_wd_x == MB_SIZE) 2038 { 2039 ps_dec->u1_currB_type = 1; 2040 2041 { 2042 UWORD8 *puc_colZeroFlagStart_bot_mb, uc_colMbPredMode_bot_mb; 2043 2044 pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag 2045 + u2_sub_mb_ofst; 2046 u1_col_mb_pred_mode = (*pu1_col_zero_flag_start >> 6); 2047 2048 puc_colZeroFlagStart_bot_mb = ps_col_pic->pu1_col_zero_flag 2049 + u2_sub_mb_ofst + increment; 2050 uc_colMbPredMode_bot_mb = (*puc_colZeroFlagStart_bot_mb >> 6); 2051 2052 i4_force_8X8 = (u1_col_mb_pred_mode & 0x2) 2053 || (uc_colMbPredMode_bot_mb & 0x2); 2054 2055 if(i4_force_8X8) 2056 { 2057 u1_num_blks = 2; 2058 partition_size = PRED_8x8; 2059 } 2060 else 2061 { 2062 partition_size = PRED_16x8; 2063 u1_num_blks = 1; 2064 } 2065 } 2066 2067 /*As this mb is derived from 2 Mbs, min no of partitions = 2*/ 2068 for(i = 0; i < 2; i++) 2069 { 2070 for(uc_blk = 0; uc_blk < u1_num_blks; uc_blk++) 2071 { 2072 mv_index = u2_sub_mb_ofst + u1_sub_mb_num; 2073 mv_index += (u1_sub_mb_num & 0x7) ? 1 : 0; 2074 2075 ps_direct->i4_mv_indices[i1_num_partitions] = mv_index; 2076 ps_direct->i1_submb_num[i1_num_partitions] = u1_sub_mb_num; 2077 ps_direct->i1_partitionsize[i1_num_partitions] = partition_size; 2078 i1_num_partitions++; 2079 2080 u1_sub_mb_num += 2; 2081 } 2082 u1_sub_mb_num = 8; /* move to second half of Cur MB */ 2083 u2_sub_mb_ofst += increment;/* move to next Colocated MB */ 2084 } 2085 ps_direct->i1_num_partitions = i1_num_partitions; 2086 return; 2087 } 2088 else 2089 { 2090 UWORD8 u1_sub_mb_num_col; 2091 u1_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1); 2092 u1_sub_mb_num_col &= 0xb; 2093 u2_sub_mb_ofst += (u1_sub_mb_num >> 3) ? increment : 0; 2094 2095 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst + u1_sub_mb_num_col; 2096 ps_direct->i1_submb_num[0] = u1_sub_mb_num; 2097 ps_direct->i1_partitionsize[0] = PRED_8x8; 2098 ps_direct->i1_num_partitions = 1; 2099 return; 2100 } 2101} 2102/*! 2103 ************************************************************************** 2104 * \if Function name : ih264d_fld_to_frm \endif 2105 * 2106 * \brief 2107 * Initializes forward and backward refernce lists for B slice decoding. 2108 * 2109 * 2110 * \return 2111 * 0 on Success and Error code otherwise 2112 ************************************************************************** 2113 */ 2114void ih264d_fld_to_frm(dec_struct_t *ps_dec, 2115 struct pic_buffer_t *ps_col_pic, 2116 directmv_t *ps_direct, 2117 UWORD8 u1_wd_x, 2118 WORD32 u2_sub_mb_ofst, 2119 dec_mb_info_t * ps_cur_mb_info) 2120{ 2121 UWORD8 *pu1_col_zero_flag_start, *pu1_col_zero_flag, 2122 *pu1_col_zero_flag_right_half, u1_sub_mb_num, uc_sub_mb_num_col; 2123 UWORD8 u1_col_mb_pred_mode, uc_blk; 2124 WORD32 i4_force_8X8; 2125 2126 UNUSED(ps_cur_mb_info); 2127 ps_direct->u1_vert_mv_scale = FLD_TO_FRM; 2128 ps_direct->u1_col_zeroflag_change = 1; 2129 /* new calculation specific to this function for u2_sub_mb_ofst*/ 2130 u2_sub_mb_ofst = (ps_dec->u2_mbx 2131 + ((ps_dec->u2_mby >> 1) * ps_dec->u2_frm_wd_in_mbs)) << 4; 2132 u2_sub_mb_ofst += ((ps_dec->u2_mby & 1) << 3); 2133 2134 if(u1_wd_x == MB_SIZE) 2135 { 2136 pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst; 2137 u1_col_mb_pred_mode = (*pu1_col_zero_flag_start >> 6); 2138 ps_dec->u1_currB_type = (!!u1_col_mb_pred_mode); 2139 2140 if(u1_col_mb_pred_mode & 0x2) 2141 { 2142 if(u1_col_mb_pred_mode == PRED_8x16) 2143 { 2144 ps_direct->i1_num_partitions = 2; 2145 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst; 2146 ps_direct->i1_submb_num[0] = 0; 2147 ps_direct->i1_partitionsize[0] = PRED_8x16; 2148 ps_direct->i4_mv_indices[1] = u2_sub_mb_ofst + 2; 2149 ps_direct->i1_submb_num[1] = 2; 2150 ps_direct->i1_partitionsize[1] = PRED_8x16; 2151 } 2152 else 2153 { 2154 UWORD8 i1_num_partitions = 0, partition_size; 2155 UWORD32 mv_index; 2156 UWORD8 u1_num_sub_blks, i, u1_col_sub_mb_pred_mode, 2157 u1_col_sub_mb_pred_mode_rt; 2158 2159 u1_sub_mb_num = ps_dec->u1_sub_mb_num; 2160 2161 pu1_col_zero_flag = pu1_col_zero_flag_start + u1_sub_mb_num; 2162 u1_col_sub_mb_pred_mode = (*pu1_col_zero_flag & 0x10);/* 8x4 or 4x4 mode */ 2163 2164 pu1_col_zero_flag_right_half = pu1_col_zero_flag_start + u1_sub_mb_num 2165 + 2; 2166 u1_col_sub_mb_pred_mode_rt = (*pu1_col_zero_flag_right_half 2167 & 0x10);/* 8x4 or 4x4 mode */ 2168 2169 i4_force_8X8 = (u1_col_sub_mb_pred_mode) 2170 || (u1_col_sub_mb_pred_mode_rt); 2171 if(i4_force_8X8) 2172 { 2173 u1_num_sub_blks = 2; 2174 partition_size = PRED_8x8; 2175 } 2176 else 2177 { 2178 partition_size = PRED_8x16; 2179 u1_num_sub_blks = 1; 2180 } 2181 2182 for(i = 0; i < 2; i++) 2183 { 2184 for(uc_blk = 0; uc_blk < u1_num_sub_blks; uc_blk++) 2185 { 2186 uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1); 2187 uc_sub_mb_num_col &= 0x7; 2188 mv_index = u2_sub_mb_ofst + uc_sub_mb_num_col; 2189 2190 ps_direct->i4_mv_indices[i1_num_partitions] = mv_index; 2191 ps_direct->i1_submb_num[i1_num_partitions] = 2192 u1_sub_mb_num; 2193 ps_direct->i1_partitionsize[i1_num_partitions] = 2194 partition_size; 2195 i1_num_partitions++; 2196 u1_sub_mb_num += 8; 2197 } 2198 2199 u1_sub_mb_num = 2; /* move to second half of Cur MB */ 2200 2201 } 2202 ps_direct->i1_num_partitions = i1_num_partitions; 2203 return; 2204 } 2205 } 2206 else 2207 { 2208 ps_direct->i1_num_partitions = 1; 2209 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst; 2210 ps_direct->i1_submb_num[0] = 0; 2211 ps_direct->i1_partitionsize[0] = PRED_16x16; 2212 return; 2213 } 2214 } 2215 else 2216 { 2217 u1_sub_mb_num = ps_dec->u1_sub_mb_num; 2218 uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1); 2219 uc_sub_mb_num_col &= 0x7; 2220 2221 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst + uc_sub_mb_num_col; 2222 ps_direct->i1_submb_num[0] = u1_sub_mb_num; 2223 ps_direct->i1_partitionsize[0] = PRED_8x8; 2224 ps_direct->i1_num_partitions = 1; 2225 } 2226} 2227/*! 2228 ************************************************************************** 2229 * \if Function name : ih264d_one_to_one \endif 2230 * 2231 * \brief 2232 * Initializes forward and backward refernce lists for B slice decoding. 2233 * 2234 * 2235 * \return 2236 * 0 on Success and Error code otherwise 2237 ************************************************************************** 2238 */ 2239void ih264d_mbaff_to_fld(dec_struct_t *ps_dec, 2240 struct pic_buffer_t *ps_col_pic, 2241 directmv_t *ps_direct, 2242 UWORD8 u1_wd_x, 2243 WORD32 u2_sub_mb_ofst, 2244 dec_mb_info_t * ps_cur_mb_info) 2245{ 2246 UWORD8* pu1_col_zero_flag, u1_iscol_mb_fld; 2247 u2_sub_mb_ofst <<= 1; 2248 pu1_col_zero_flag = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst; 2249 u1_iscol_mb_fld = (*pu1_col_zero_flag & 0x2) >> 1; 2250 if(u1_iscol_mb_fld) 2251 { 2252 u2_sub_mb_ofst += (ps_dec->ps_cur_slice->u1_bottom_field_flag << 4); 2253 ih264d_one_to_one(ps_dec, ps_col_pic, ps_direct, u1_wd_x, 2254 u2_sub_mb_ofst, ps_cur_mb_info); 2255 } 2256 else 2257 ih264d_frm_to_fld(ps_dec, ps_col_pic, ps_direct, u1_wd_x, 2258 u2_sub_mb_ofst, ps_cur_mb_info); 2259} 2260/*! 2261 ************************************************************************** 2262 * \if Function name : ih264d_one_to_one \endif 2263 * 2264 * \brief 2265 * Initializes forward and backward refernce lists for B slice decoding. 2266 * 2267 * 2268 * \return 2269 * 0 on Success and Error code otherwise 2270 ************************************************************************** 2271 */ 2272void ih264d_fld_to_mbaff(dec_struct_t *ps_dec, 2273 struct pic_buffer_t *ps_col_pic, 2274 directmv_t *ps_direct, 2275 UWORD8 u1_wd_x, 2276 WORD32 u2_sub_mb_ofst, 2277 dec_mb_info_t * ps_cur_mb_info) 2278{ 2279 if((ps_col_pic->u1_picturetype & 0x7) == COMP_FLD_PAIR) 2280 { 2281 /* first calculate the colocated picture which varies with Mb */ 2282 UWORD8 u1_is_cur_mb_fld; 2283 u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag; 2284 u2_sub_mb_ofst = (u2_sub_mb_ofst & 0xffe0); /* mbaddrCol5 = curmbaddr/2;*/ 2285 u2_sub_mb_ofst >>= 1; 2286 2287 ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][0]; 2288 if(u1_is_cur_mb_fld) 2289 { 2290 if(1 - ps_cur_mb_info->u1_topmb) 2291 ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS]; 2292 2293 ih264d_one_to_one(ps_dec, ps_col_pic, ps_direct, u1_wd_x, 2294 u2_sub_mb_ofst, ps_cur_mb_info); 2295 } 2296 else 2297 { 2298 2299 if(ABS(ps_col_pic->i4_top_field_order_cnt 2300 - ps_dec->ps_cur_pic->i4_poc) >= 2301 ABS(ps_dec->ps_cur_pic->i4_poc - ps_col_pic->i4_bottom_field_order_cnt)) 2302 { 2303 ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS]; 2304 } 2305 2306 if(ps_cur_mb_info->u1_topmb == 0) 2307 u2_sub_mb_ofst += 8; 2308 ih264d_mbaff_cross_pmbair(ps_dec, ps_col_pic, ps_direct, u1_wd_x, 2309 u2_sub_mb_ofst, ps_cur_mb_info); 2310 } 2311 ps_dec->ps_col_pic = ps_col_pic; 2312 } 2313 else 2314 { 2315 UWORD8* pu1_col_zero_flag = ps_col_pic->pu1_col_zero_flag 2316 + u2_sub_mb_ofst; 2317 UWORD8 temp, u1_is_cur_mb_fld, u1_iscol_mb_fld; 2318 2319 u1_iscol_mb_fld = (*pu1_col_zero_flag & 0x2) >> 1; 2320 u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag; 2321 temp = (u1_iscol_mb_fld ^ u1_is_cur_mb_fld); 2322 2323 if(temp == 0) 2324 ih264d_one_to_one(ps_dec, ps_col_pic, ps_direct, u1_wd_x, 2325 u2_sub_mb_ofst, ps_cur_mb_info); 2326 else 2327 { 2328 u2_sub_mb_ofst &= 0xffef; 2329 if(u1_is_cur_mb_fld == 0) 2330 { 2331 if(ABS(ps_col_pic->i4_top_field_order_cnt 2332 - ps_dec->ps_cur_pic->i4_poc) >= 2333 ABS(ps_dec->ps_cur_pic->i4_poc - ps_col_pic->i4_bottom_field_order_cnt)) 2334 { 2335 u2_sub_mb_ofst += 0x10; 2336 } 2337 if(ps_cur_mb_info->u1_topmb == 0) 2338 u2_sub_mb_ofst += 8; 2339 } 2340 ih264d_mbaff_cross_pmbair(ps_dec, ps_col_pic, ps_direct, u1_wd_x, 2341 u2_sub_mb_ofst, ps_cur_mb_info); 2342 } 2343 } 2344} 2345 2346