1 /****************************************************************************** 2 * 3 * Copyright (C) 2015 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ***************************************************************************** 18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19 */ 20 21 /*! 22 ************************************************************************** 23 * \file ih264d_parse_pslice.c 24 * 25 * \brief 26 * Contains routines that decode a I slice type 27 * 28 * Detailed_description 29 * 30 * \date 31 * 07/07/2003 32 * 33 * \author NS 34 ************************************************************************** 35 */ 36 37 #include <string.h> 38 #include "ih264d_bitstrm.h" 39 #include "ih264d_defs.h" 40 #include "ih264d_debug.h" 41 #include "ih264d_tables.h" 42 #include "ih264d_structs.h" 43 #include "ih264d_defs.h" 44 #include "ih264d_parse_cavlc.h" 45 #include "ih264d_mb_utils.h" 46 #include "ih264d_parse_slice.h" 47 #include "ih264d_mvpred.h" 48 #include "ih264d_parse_islice.h" 49 #include "ih264d_process_intra_mb.h" 50 #include "ih264d_inter_pred.h" 51 #include "ih264d_process_pslice.h" 52 #include "ih264d_deblocking.h" 53 #include "ih264d_cabac.h" 54 #include "ih264d_parse_mb_header.h" 55 #include "ih264d_error_handler.h" 56 #include "ih264d_defs.h" 57 #include "ih264d_format_conv.h" 58 #include "ih264d_quant_scaling.h" 59 #include "ih264d_thread_parse_decode.h" 60 #include "ih264d_thread_compute_bs.h" 61 #include "ih264d_process_bslice.h" 62 #include "ithread.h" 63 #include "ih264d_utils.h" 64 #include "ih264d_format_conv.h" 65 66 void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec); 67 void ih264d_deblock_mb_level(dec_struct_t *ps_dec, 68 dec_mb_info_t *ps_cur_mb_info, 69 UWORD32 nmb_index); 70 71 /*! 72 ************************************************************************** 73 * \if Function name : ih264d_parse_pmb_cavlc \endif 74 * 75 * \brief 76 * This function parses CAVLC syntax of a P MB. 77 * 78 * \return 79 * 0 on Success and Error code otherwise 80 ************************************************************************** 81 */ 82 WORD32 ih264d_parse_pmb_cavlc(dec_struct_t * ps_dec, 83 dec_mb_info_t * ps_cur_mb_info, 84 UWORD8 u1_mb_num, 85 UWORD8 u1_num_mbsNby2) 86 { 87 UWORD32 u1_num_mb_part; 88 UWORD32 uc_sub_mb; 89 dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; 90 UWORD32 * const pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 91 UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; 92 93 parse_pmbarams_t * ps_parse_mb_data = ps_dec->ps_parse_mb_data 94 + u1_num_mbsNby2; 95 WORD8 * pi1_ref_idx = ps_parse_mb_data->i1_ref_idx[0]; 96 const UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; 97 const UWORD8 * pu1_num_mb_part = (const UWORD8 *)gau1_ih264d_num_mb_part; 98 UWORD8 * pu1_col_info = ps_parse_mb_data->u1_col_info; 99 100 UWORD32 u1_mb_type = ps_cur_mb_info->u1_mb_type; 101 UWORD32 u4_sum_mb_mode_pack = 0; 102 WORD32 ret; 103 104 UWORD8 u1_no_submb_part_size_lt8x8_flag = 1; 105 ps_cur_mb_info->u1_tran_form8x8 = 0; 106 ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; 107 108 ps_cur_mb_info->u1_yuv_dc_block_flag = 0; 109 110 ps_cur_mb_info->u1_mb_mc_mode = u1_mb_type; 111 uc_sub_mb = ((u1_mb_type == PRED_8x8) | (u1_mb_type == PRED_8x8R0)); 112 113 /* Reading the subMB type */ 114 if(uc_sub_mb) 115 { 116 WORD32 i; 117 UWORD8 u1_colz = (PRED_8x8 << 6); 118 119 for(i = 0; i < 4; i++) 120 { 121 UWORD32 ui_sub_mb_mode; 122 123 //Inlined ih264d_uev 124 UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; 125 UWORD32 u4_word, u4_ldz; 126 127 /***************************************************************/ 128 /* Find leading zeros in next 32 bits */ 129 /***************************************************************/ 130 NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); 131 u4_ldz = CLZ(u4_word); 132 /* Flush the ps_bitstrm */ 133 u4_bitstream_offset += (u4_ldz + 1); 134 /* Read the suffix from the ps_bitstrm */ 135 u4_word = 0; 136 if(u4_ldz) 137 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, 138 u4_ldz); 139 *pu4_bitstrm_ofst = u4_bitstream_offset; 140 ui_sub_mb_mode = ((1 << u4_ldz) + u4_word - 1); 141 //Inlined ih264d_uev 142 143 if(ui_sub_mb_mode > 3) 144 { 145 return ERROR_SUB_MB_TYPE; 146 } 147 else 148 { 149 u4_sum_mb_mode_pack = (u4_sum_mb_mode_pack << 8) | ui_sub_mb_mode; 150 /* Storing collocated information */ 151 *pu1_col_info++ = u1_colz | (UWORD8)(ui_sub_mb_mode << 4); 152 153 COPYTHECONTEXT("sub_mb_type", ui_sub_mb_mode); 154 } 155 156 /* check if Motion compensation is done below 8x8 */ 157 if(ui_sub_mb_mode != P_L0_8x8) 158 { 159 u1_no_submb_part_size_lt8x8_flag = 0; 160 } 161 } 162 163 // 164 u1_num_mb_part = 4; 165 } 166 else 167 { 168 *pu1_col_info++ = (u1_mb_type << 6); 169 if(u1_mb_type) 170 *pu1_col_info++ = (u1_mb_type << 6); 171 u1_num_mb_part = pu1_num_mb_part[u1_mb_type]; 172 173 } 174 175 /* Decoding reference index 0: For simple profile the following */ 176 /* conditions are always true (mb_field_decoding_flag == 0); */ 177 /* (MbPartPredMode != PredL1) */ 178 179 { 180 181 UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag; 182 UWORD8 uc_num_ref_idx_l0_active_minus1 = 183 (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0] 184 << (u1_mbaff & uc_field)) - 1; 185 186 if((uc_num_ref_idx_l0_active_minus1 > 0) & (u1_mb_type != PRED_8x8R0)) 187 { 188 if(1 == uc_num_ref_idx_l0_active_minus1) 189 ih264d_parse_pmb_ref_index_cavlc_range1( 190 u1_num_mb_part, ps_bitstrm, pi1_ref_idx, 191 uc_num_ref_idx_l0_active_minus1); 192 else 193 { 194 ret = ih264d_parse_pmb_ref_index_cavlc( 195 u1_num_mb_part, ps_bitstrm, pi1_ref_idx, 196 uc_num_ref_idx_l0_active_minus1); 197 if(ret != OK) 198 return ret; 199 } 200 } 201 else 202 { 203 /* When there exists only a single frame to predict from */ 204 UWORD8 uc_i; 205 for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++) 206 /* Storing Reference Idx Information */ 207 pi1_ref_idx[uc_i] = 0; 208 } 209 } 210 211 { 212 UWORD8 u1_p_idx, uc_i; 213 parse_part_params_t * ps_part = ps_dec->ps_part; 214 UWORD8 u1_sub_mb_mode, u1_num_subpart, u1_mb_part_width, u1_mb_part_height; 215 UWORD8 u1_sub_mb_num; 216 const UWORD8 * pu1_top_left_sub_mb_indx; 217 mv_pred_t * ps_mv, *ps_mv_start = ps_dec->ps_mv_cur + (u1_mb_num << 4); 218 /* Loading the table pointers */ 219 const UWORD8 * pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw; 220 const UWORD8 * pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth; 221 const UWORD8 * pu1_sub_mb_indx_mod = 222 (const UWORD8 *)(gau1_ih264d_submb_indx_mod) 223 + (uc_sub_mb * 6); 224 const UWORD8 * pu1_sub_mb_partw = (const UWORD8 *)gau1_ih264d_submb_partw; 225 const UWORD8 * pu1_sub_mb_parth = (const UWORD8 *)gau1_ih264d_submb_parth; 226 const UWORD8 * pu1_num_sub_mb_part = 227 (const UWORD8 *)gau1_ih264d_num_submb_part; 228 229 UWORD16 u2_sub_mb_num = 0x028A; 230 231 /*********************************************************/ 232 /* default initialisations for condition (uc_sub_mb == 0) */ 233 /* i.e. all are subpartitions of 8x8 */ 234 /*********************************************************/ 235 u1_sub_mb_mode = 0; 236 u1_num_subpart = 1; 237 u1_mb_part_width = pu1_mb_partw[u1_mb_type]; 238 u1_mb_part_height = pu1_mb_parth[u1_mb_type]; 239 pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_type << 1); 240 u1_sub_mb_num = 0; 241 242 /* Loop on number of partitions */ 243 for(uc_i = 0, u1_p_idx = 0; uc_i < u1_num_mb_part; uc_i++) 244 { 245 UWORD8 uc_j; 246 if(uc_sub_mb) 247 { 248 u1_sub_mb_mode = u4_sum_mb_mode_pack >> 24; 249 u1_num_subpart = pu1_num_sub_mb_part[u1_sub_mb_mode]; 250 u1_mb_part_width = pu1_sub_mb_partw[u1_sub_mb_mode]; 251 u1_mb_part_height = pu1_sub_mb_parth[u1_sub_mb_mode]; 252 pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_sub_mb_mode << 1); 253 u1_sub_mb_num = u2_sub_mb_num >> 12; 254 u4_sum_mb_mode_pack <<= 8; 255 u2_sub_mb_num <<= 4; 256 } 257 258 /* Loop on Number of sub-partitions */ 259 for(uc_j = 0; uc_j < u1_num_subpart; uc_j++, pu1_top_left_sub_mb_indx++) 260 { 261 WORD16 i2_mvx, i2_mvy; 262 u1_sub_mb_num += *pu1_top_left_sub_mb_indx; 263 ps_mv = ps_mv_start + u1_sub_mb_num; 264 265 /* Reading the differential Mv from the bitstream */ 266 //i2_mvx = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); 267 //inlining ih264d_sev 268 { 269 UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; 270 UWORD32 u4_word, u4_ldz, u4_abs_val; 271 272 /***************************************************************/ 273 /* Find leading zeros in next 32 bits */ 274 /***************************************************************/ 275 NEXTBITS_32(u4_word, u4_bitstream_offset, 276 pu4_bitstrm_buf); 277 u4_ldz = CLZ(u4_word); 278 279 /* Flush the ps_bitstrm */ 280 u4_bitstream_offset += (u4_ldz + 1); 281 282 /* Read the suffix from the ps_bitstrm */ 283 u4_word = 0; 284 if(u4_ldz) 285 GETBITS(u4_word, u4_bitstream_offset, 286 pu4_bitstrm_buf, u4_ldz); 287 288 *pu4_bitstrm_ofst = u4_bitstream_offset; 289 u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1; 290 291 if(u4_word & 0x1) 292 i2_mvx = (-(WORD32)u4_abs_val); 293 else 294 i2_mvx = (u4_abs_val); 295 } 296 //inlinined ih264d_sev 297 COPYTHECONTEXT("MVD", i2_mvx); 298 i2_mvy = ih264d_sev(pu4_bitstrm_ofst, 299 pu4_bitstrm_buf); 300 COPYTHECONTEXT("MVD", i2_mvy); 301 302 /* Storing Info for partitions */ 303 ps_part->u1_is_direct = PART_NOT_DIRECT; 304 ps_part->u1_sub_mb_num = u1_sub_mb_num; 305 ps_part->u1_partheight = u1_mb_part_height; 306 ps_part->u1_partwidth = u1_mb_part_width; 307 308 /* Storing Mv residuals */ 309 ps_mv->i2_mv[0] = i2_mvx; 310 ps_mv->i2_mv[1] = i2_mvy; 311 312 /* Increment partition Index */ 313 u1_p_idx++; 314 ps_part++; 315 } 316 } 317 ps_parse_mb_data->u1_num_part = u1_p_idx; 318 ps_dec->ps_part = ps_part; 319 } 320 321 { 322 UWORD32 u4_cbp; 323 324 /* Read the Coded block pattern */ 325 UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; 326 UWORD32 u4_word, u4_ldz; 327 328 /***************************************************************/ 329 /* Find leading zeros in next 32 bits */ 330 /***************************************************************/ 331 NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); 332 u4_ldz = CLZ(u4_word); 333 /* Flush the ps_bitstrm */ 334 u4_bitstream_offset += (u4_ldz + 1); 335 /* Read the suffix from the ps_bitstrm */ 336 u4_word = 0; 337 if(u4_ldz) 338 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); 339 *pu4_bitstrm_ofst = u4_bitstream_offset; 340 u4_cbp = ((1 << u4_ldz) + u4_word - 1); 341 342 if(u4_cbp > 47) 343 return ERROR_CBP; 344 345 u4_cbp = *((UWORD8*)gau1_ih264d_cbp_inter + u4_cbp); 346 COPYTHECONTEXT("coded_block_pattern", u4_cbp); 347 ps_cur_mb_info->u1_cbp = u4_cbp; 348 349 /* Read the transform8x8 u4_flag if present */ 350 if((ps_dec->s_high_profile.u1_transform8x8_present) && (u4_cbp & 0xf) 351 && u1_no_submb_part_size_lt8x8_flag) 352 { 353 ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm); 354 COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8); 355 ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8; 356 } 357 358 /* Read mb_qp_delta */ 359 if(u4_cbp) 360 { 361 WORD32 i_temp; 362 363 UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; 364 UWORD32 u4_word, u4_ldz, u4_abs_val; 365 366 /***************************************************************/ 367 /* Find leading zeros in next 32 bits */ 368 /***************************************************************/ 369 NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); 370 u4_ldz = CLZ(u4_word); 371 372 /* Flush the ps_bitstrm */ 373 u4_bitstream_offset += (u4_ldz + 1); 374 375 /* Read the suffix from the ps_bitstrm */ 376 u4_word = 0; 377 if(u4_ldz) 378 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, 379 u4_ldz); 380 381 *pu4_bitstrm_ofst = u4_bitstream_offset; 382 u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1; 383 384 if(u4_word & 0x1) 385 i_temp = (-(WORD32)u4_abs_val); 386 else 387 i_temp = (u4_abs_val); 388 389 if((i_temp < -26) || (i_temp > 25)) 390 return ERROR_INV_RANGE_QP_T; 391 //inlinined ih264d_sev 392 393 COPYTHECONTEXT("mb_qp_delta", i_temp); 394 if(i_temp) 395 { 396 ret = ih264d_update_qp(ps_dec, (WORD8)i_temp); 397 if(ret != OK) 398 return ret; 399 } 400 401 ret = ih264d_parse_residual4x4_cavlc(ps_dec, ps_cur_mb_info, 0); 402 if(ret != OK) 403 return ret; 404 if(EXCEED_OFFSET(ps_bitstrm)) 405 return ERROR_EOB_TERMINATE_T; 406 } 407 else 408 { 409 ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC); 410 } 411 412 413 414 } 415 416 return OK; 417 } 418 419 /*! 420 ************************************************************************** 421 * \if Function name : ih264d_parse_pmb_cabac \endif 422 * 423 * \brief 424 * This function parses CABAC syntax of a P MB. 425 * 426 * \return 427 * 0 on Success and Error code otherwise 428 ************************************************************************** 429 */ 430 WORD32 ih264d_parse_pmb_cabac(dec_struct_t * ps_dec, 431 dec_mb_info_t * ps_cur_mb_info, 432 UWORD8 u1_mb_num, 433 UWORD8 u1_num_mbsNby2) 434 { 435 UWORD32 u1_num_mb_part; 436 UWORD32 uc_sub_mb; 437 parse_pmbarams_t * ps_parse_mb_data = ps_dec->ps_parse_mb_data 438 + u1_num_mbsNby2; 439 WORD8 * pi1_ref_idx = ps_parse_mb_data->i1_ref_idx[0]; 440 const UWORD8 * pu1_num_mb_part = (const UWORD8 *)gau1_ih264d_num_mb_part; 441 const UWORD32 u1_mb_type = ps_cur_mb_info->u1_mb_type; 442 UWORD8 * pu1_col_info = ps_parse_mb_data->u1_col_info; 443 UWORD32 u1_mb_mc_mode = u1_mb_type; 444 ctxt_inc_mb_info_t * p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info; 445 decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env; 446 dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; 447 UWORD32 u4_sub_mb_pack = 0; 448 WORD32 ret; 449 450 UWORD8 u1_no_submb_part_size_lt8x8_flag = 1; 451 ps_cur_mb_info->u1_tran_form8x8 = 0; 452 ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; 453 454 ps_cur_mb_info->u1_yuv_dc_block_flag = 0; 455 456 p_curr_ctxt->u1_mb_type = CAB_P; 457 ps_cur_mb_info->u1_mb_mc_mode = u1_mb_type; 458 uc_sub_mb = ((u1_mb_type == PRED_8x8) | (u1_mb_type == PRED_8x8R0)); 459 460 /* Reading the subMB type */ 461 if(uc_sub_mb) 462 { 463 464 UWORD8 u1_colz = (PRED_8x8 << 6); 465 u1_mb_mc_mode = 0; 466 467 { 468 UWORD8 u1_sub_mb_mode; 469 u1_sub_mb_mode = ih264d_parse_submb_type_cabac( 470 0, ps_cab_env, ps_bitstrm, 471 ps_dec->p_sub_mb_type_t); 472 if(u1_sub_mb_mode > 3) 473 return ERROR_SUB_MB_TYPE; 474 475 u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode; 476 /* Storing collocated information */ 477 *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4)); 478 COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode); 479 /* check if Motion compensation is done below 8x8 */ 480 if(u1_sub_mb_mode != P_L0_8x8) 481 { 482 u1_no_submb_part_size_lt8x8_flag = 0; 483 } 484 } 485 { 486 UWORD8 u1_sub_mb_mode; 487 u1_sub_mb_mode = ih264d_parse_submb_type_cabac( 488 0, ps_cab_env, ps_bitstrm, 489 ps_dec->p_sub_mb_type_t); 490 if(u1_sub_mb_mode > 3) 491 return ERROR_SUB_MB_TYPE; 492 493 u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode; 494 /* Storing collocated information */ 495 *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4)); 496 COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode); 497 /* check if Motion compensation is done below 8x8 */ 498 if(u1_sub_mb_mode != P_L0_8x8) 499 { 500 u1_no_submb_part_size_lt8x8_flag = 0; 501 } 502 } 503 { 504 UWORD8 u1_sub_mb_mode; 505 u1_sub_mb_mode = ih264d_parse_submb_type_cabac( 506 0, ps_cab_env, ps_bitstrm, 507 ps_dec->p_sub_mb_type_t); 508 if(u1_sub_mb_mode > 3) 509 return ERROR_SUB_MB_TYPE; 510 511 u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode; 512 /* Storing collocated information */ 513 *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4)); 514 COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode); 515 /* check if Motion compensation is done below 8x8 */ 516 if(u1_sub_mb_mode != P_L0_8x8) 517 { 518 u1_no_submb_part_size_lt8x8_flag = 0; 519 } 520 } 521 { 522 UWORD8 u1_sub_mb_mode; 523 u1_sub_mb_mode = ih264d_parse_submb_type_cabac( 524 0, ps_cab_env, ps_bitstrm, 525 ps_dec->p_sub_mb_type_t); 526 if(u1_sub_mb_mode > 3) 527 return ERROR_SUB_MB_TYPE; 528 529 u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode; 530 /* Storing collocated information */ 531 *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4)); 532 COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode); 533 /* check if Motion compensation is done below 8x8 */ 534 if(u1_sub_mb_mode != P_L0_8x8) 535 { 536 u1_no_submb_part_size_lt8x8_flag = 0; 537 } 538 } 539 u1_num_mb_part = 4; 540 } 541 else 542 { 543 u1_num_mb_part = pu1_num_mb_part[u1_mb_type]; 544 /* Storing collocated Mb and SubMb mode information */ 545 *pu1_col_info++ = (u1_mb_type << 6); 546 if(u1_mb_type) 547 *pu1_col_info++ = (u1_mb_type << 6); 548 } 549 /* Decoding reference index 0: For simple profile the following */ 550 /* conditions are always true (mb_field_decoding_flag == 0); */ 551 /* (MbPartPredMode != PredL1) */ 552 { 553 WORD8 * pi1_top_ref_idx_ctx_inc_arr = p_curr_ctxt->i1_ref_idx; 554 WORD8 * pi1_left_ref_idx_ctxt_inc = ps_dec->pi1_left_ref_idx_ctxt_inc; 555 UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; 556 UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag; 557 UWORD8 uc_num_ref_idx_l0_active_minus1 = 558 (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0] 559 << (u1_mbaff & uc_field)) - 1; 560 561 if((uc_num_ref_idx_l0_active_minus1 > 0) & (u1_mb_type != PRED_8x8R0)) 562 { 563 /* force the routine to decode ref idx for each partition */ 564 *((UWORD32 *)pi1_ref_idx) = 0x01010101; 565 ret = ih264d_parse_ref_idx_cabac(u1_num_mb_part, 0, 566 uc_num_ref_idx_l0_active_minus1, 567 u1_mb_mc_mode, pi1_ref_idx, 568 pi1_left_ref_idx_ctxt_inc, 569 pi1_top_ref_idx_ctx_inc_arr, ps_cab_env, 570 ps_bitstrm, ps_dec->p_ref_idx_t); 571 if(ret != OK) 572 return ret; 573 } 574 else 575 { 576 /* When there exists only a single frame to predict from */ 577 pi1_left_ref_idx_ctxt_inc[0] = 0; 578 pi1_left_ref_idx_ctxt_inc[1] = 0; 579 pi1_top_ref_idx_ctx_inc_arr[0] = 0; 580 pi1_top_ref_idx_ctx_inc_arr[1] = 0; 581 *((UWORD32 *)pi1_ref_idx) = 0; 582 } 583 } 584 585 { 586 UWORD8 u1_p_idx, uc_i; 587 parse_part_params_t * ps_part = ps_dec->ps_part; 588 UWORD8 u1_sub_mb_mode, u1_num_subpart, u1_mb_part_width, u1_mb_part_height; 589 UWORD8 u1_sub_mb_num; 590 const UWORD8 * pu1_top_left_sub_mb_indx; 591 mv_pred_t *ps_mv_start = ps_dec->ps_mv_cur + (u1_mb_num << 4); 592 UWORD16 u2_sub_mb_num_pack = 0x028A; 593 594 /* Loading the table pointers */ 595 const UWORD8 * pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw; 596 const UWORD8 * pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth; 597 const UWORD8 * pu1_sub_mb_indx_mod = 598 (const UWORD8 *)(gau1_ih264d_submb_indx_mod) 599 + (uc_sub_mb * 6); 600 const UWORD8 * pu1_sub_mb_partw = (const UWORD8 *)gau1_ih264d_submb_partw; 601 const UWORD8 * pu1_sub_mb_parth = (const UWORD8 *)gau1_ih264d_submb_parth; 602 const UWORD8 * pu1_num_sub_mb_part = 603 (const UWORD8 *)gau1_ih264d_num_submb_part; 604 605 /*********************************************************/ 606 /* default initialisations for condition (uc_sub_mb == 0) */ 607 /* i.e. all are subpartitions of 8x8 */ 608 /*********************************************************/ 609 u1_sub_mb_mode = 0; 610 u1_num_subpart = 1; 611 u1_mb_part_width = pu1_mb_partw[u1_mb_type]; 612 u1_mb_part_height = pu1_mb_parth[u1_mb_type]; 613 pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_type << 1); 614 u1_sub_mb_num = 0; 615 616 /* Loop on number of partitions */ 617 for(uc_i = 0, u1_p_idx = 0; uc_i < u1_num_mb_part; uc_i++) 618 { 619 UWORD8 uc_j; 620 if(uc_sub_mb) 621 { 622 u1_sub_mb_mode = u4_sub_mb_pack >> 24; 623 u1_num_subpart = pu1_num_sub_mb_part[u1_sub_mb_mode]; 624 u1_mb_part_width = pu1_sub_mb_partw[u1_sub_mb_mode]; 625 u1_mb_part_height = pu1_sub_mb_parth[u1_sub_mb_mode]; 626 pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_sub_mb_mode << 1); 627 u1_sub_mb_num = u2_sub_mb_num_pack >> 12; 628 u4_sub_mb_pack <<= 8; 629 u2_sub_mb_num_pack <<= 4; 630 } 631 /* Loop on Number of sub-partitions */ 632 for(uc_j = 0; uc_j < u1_num_subpart; uc_j++, pu1_top_left_sub_mb_indx++) 633 { 634 mv_pred_t * ps_mv; 635 636 u1_sub_mb_num += *pu1_top_left_sub_mb_indx; 637 ps_mv = ps_mv_start + u1_sub_mb_num; 638 639 /* Storing Info for partitions */ 640 ps_part->u1_is_direct = PART_NOT_DIRECT; 641 ps_part->u1_sub_mb_num = u1_sub_mb_num; 642 ps_part->u1_partheight = u1_mb_part_height; 643 ps_part->u1_partwidth = u1_mb_part_width; 644 645 /* Increment partition Index */ 646 u1_p_idx++; 647 ps_part++; 648 649 ih264d_get_mvd_cabac(u1_sub_mb_num, 0, u1_mb_part_width, 650 u1_mb_part_height, 1, ps_dec, ps_mv); 651 } 652 } 653 ps_parse_mb_data->u1_num_part = u1_p_idx; 654 ps_dec->ps_part = ps_part; 655 } 656 { 657 UWORD8 u1_cbp; 658 659 /* Read the Coded block pattern */ 660 u1_cbp = (WORD8)ih264d_parse_ctx_cbp_cabac(ps_dec); 661 COPYTHECONTEXT("coded_block_pattern", u1_cbp); 662 ps_cur_mb_info->u1_cbp = u1_cbp; 663 p_curr_ctxt->u1_cbp = u1_cbp; 664 p_curr_ctxt->u1_intra_chroma_pred_mode = 0; 665 p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE; 666 ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6; 667 668 if(u1_cbp > 47) 669 return ERROR_CBP; 670 671 ps_cur_mb_info->u1_tran_form8x8 = 0; 672 ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; 673 674 /* Read the transform8x8 u4_flag if present */ 675 if((ps_dec->s_high_profile.u1_transform8x8_present) && (u1_cbp & 0xf) 676 && u1_no_submb_part_size_lt8x8_flag) 677 { 678 ps_cur_mb_info->u1_tran_form8x8 = ih264d_parse_transform8x8flag_cabac( 679 ps_dec, ps_cur_mb_info); 680 COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8); 681 p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8; 682 ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8; 683 684 } 685 else 686 { 687 p_curr_ctxt->u1_transform8x8_ctxt = 0; 688 } 689 690 /* Read mb_qp_delta */ 691 if(u1_cbp) 692 { 693 WORD8 c_temp; 694 ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &c_temp); 695 if(ret != OK) 696 return ret; 697 COPYTHECONTEXT("mb_qp_delta", c_temp); 698 if(c_temp != 0) 699 { 700 ret = ih264d_update_qp(ps_dec, c_temp); 701 if(ret != OK) 702 return ret; 703 } 704 } 705 else 706 ps_dec->i1_prev_mb_qp_delta = 0; 707 708 709 710 ih264d_parse_residual4x4_cabac(ps_dec, ps_cur_mb_info, 0); 711 if(EXCEED_OFFSET(ps_dec->ps_bitstrm)) 712 return ERROR_EOB_TERMINATE_T; 713 } 714 return OK; 715 } 716 717 /*! 718 ************************************************************************** 719 * \if Function name : parsePSliceData \endif 720 * 721 * \brief 722 * This function parses CAVLC syntax of N MB's of a P slice. 723 * 1. After parsing syntax of N MB's, for those N MB's (less than N, incase 724 * of end of slice or end of row), MB is decoded. This process is carried 725 * for one complete MB row or till end of slice. 726 * 2. Bottom one row of current MB is copied to IntraPredLine buffers. 727 * IntraPredLine buffers are used for Intra prediction of next row. 728 * 3. Current MB row along with previous 4 rows of Luma (and 2 of Chroma) are 729 * deblocked. 730 * 4. 4 rows (2 for Chroma) previous row and 12 rows (6 for Chroma) are 731 * DMA'ed to picture buffers. 732 * 733 * \return 734 * 0 on Success and Error code otherwise 735 ************************************************************************** 736 */ 737 738 /*! 739 ************************************************************************** 740 * \if Function name : ih264d_update_nnz_for_skipmb \endif 741 * 742 * \brief 743 * 744 * \return 745 * None 746 * 747 ************************************************************************** 748 */ 749 void ih264d_update_nnz_for_skipmb(dec_struct_t * ps_dec, 750 dec_mb_info_t * ps_cur_mb_info, 751 UWORD8 u1_entrpy) 752 { 753 UWORD32 *pu4_buf; 754 UWORD8 *pu1_buf; 755 UNUSED(u1_entrpy); 756 pu1_buf = ps_dec->pu1_left_nnz_y; 757 pu4_buf = (UWORD32 *)pu1_buf; 758 *pu4_buf = 0; 759 pu1_buf = ps_dec->pu1_left_nnz_uv; 760 pu4_buf = (UWORD32 *)pu1_buf; 761 *pu4_buf = 0; 762 pu1_buf = ps_cur_mb_info->ps_curmb->pu1_nnz_y; 763 pu4_buf = (UWORD32 *)pu1_buf; 764 *pu4_buf = 0; 765 pu1_buf = ps_cur_mb_info->ps_curmb->pu1_nnz_uv; 766 pu4_buf = (UWORD32 *)pu1_buf; 767 *pu4_buf = 0; 768 ps_cur_mb_info->ps_curmb->u2_luma_csbp = 0; 769 ps_cur_mb_info->u2_luma_csbp = 0; 770 ps_cur_mb_info->u2_chroma_csbp = 0; 771 } 772 773 774 775 /*****************************************************************************/ 776 /* */ 777 /* Function Name : ih264d_parse_inter_slice_data_cabac */ 778 /* */ 779 /* Description : This function parses cabac syntax of a inter slice on */ 780 /* N MB basis. */ 781 /* */ 782 /* Inputs : ps_dec */ 783 /* sliceparams */ 784 /* firstMbInSlice */ 785 /* */ 786 /* Processing : 1. After parsing syntax for N MBs those N MBs are */ 787 /* decoded till the end of slice. */ 788 /* 2. MV prediction and DMA happens on a N/2 MB basis. */ 789 /* */ 790 /* Returns : 0 */ 791 /* */ 792 /* Issues : <List any issues or problems with this function> */ 793 /* */ 794 /* Revision History: */ 795 /* */ 796 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 797 /* 13 07 2002 Jay Draft */ 798 /* */ 799 /*****************************************************************************/ 800 WORD32 ih264d_parse_inter_slice_data_cabac(dec_struct_t * ps_dec, 801 dec_slice_params_t * ps_slice, 802 UWORD16 u2_first_mb_in_slice) 803 { 804 UWORD32 uc_more_data_flag; 805 WORD32 i2_cur_mb_addr; 806 UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx; 807 UWORD32 u1_mbaff; 808 UWORD32 u1_num_mbs_next, u1_end_of_row; 809 const UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs; 810 UWORD32 u1_slice_end = 0; 811 UWORD32 u1_tfr_n_mb = 0; 812 UWORD32 u1_decode_nmb = 0; 813 814 815 deblk_mb_t *ps_cur_deblk_mb; 816 dec_mb_info_t *ps_cur_mb_info; 817 818 parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data; 819 UWORD32 u1_inter_mb_skip_type; 820 UWORD32 u1_inter_mb_type; 821 UWORD32 u1_deblk_mb_type; 822 UWORD32 u1_mb_threshold; 823 dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; 824 WORD32 ret = OK; 825 826 /******************************************************/ 827 /* Initialisations specific to B or P slice */ 828 /******************************************************/ 829 if(ps_slice->u1_slice_type == P_SLICE) 830 { 831 u1_inter_mb_skip_type = CAB_P_SKIP; 832 u1_inter_mb_type = P_MB; 833 u1_deblk_mb_type = D_INTER_MB; 834 u1_mb_threshold = 5; 835 } 836 else // B_SLICE 837 { 838 u1_inter_mb_skip_type = CAB_B_SKIP; 839 u1_inter_mb_type = B_MB; 840 u1_deblk_mb_type = D_B_SLICE; 841 u1_mb_threshold = 23; 842 } 843 844 /******************************************************/ 845 /* Slice Level Initialisations */ 846 /******************************************************/ 847 i2_cur_mb_addr = u2_first_mb_in_slice; 848 ps_dec->u1_qp = ps_slice->u1_slice_qp; 849 ih264d_update_qp(ps_dec, 0); 850 u1_mb_idx = ps_dec->u1_mb_idx; 851 u1_num_mbs = u1_mb_idx; 852 u1_num_mbsNby2 = 0; 853 u1_mbaff = ps_slice->u1_mbaff_frame_flag; 854 i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff; 855 uc_more_data_flag = 1; 856 857 /* Initialisations specific to cabac */ 858 if(ps_bitstrm->u4_ofst & 0x07) 859 { 860 ps_bitstrm->u4_ofst += 8; 861 ps_bitstrm->u4_ofst &= 0xFFFFFFF8; 862 } 863 864 ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm); 865 if(ret != OK) 866 return ret; 867 868 ps_dec->i1_prev_mb_qp_delta = 0; 869 870 while(!u1_slice_end) 871 { 872 UWORD8 u1_mb_type; 873 UWORD32 u4_mb_skip; 874 875 ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data; 876 877 if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr) 878 { 879 break; 880 } 881 882 ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs; 883 ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs; 884 885 ps_cur_mb_info->u1_Mux = 0; 886 ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff); 887 ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs; 888 889 ps_cur_mb_info->u1_end_of_slice = 0; 890 891 /* Storing Default partition info */ 892 ps_parse_mb_data->u1_num_part = 1; 893 ps_parse_mb_data->u1_isI_mb = 0; 894 895 /***************************************************************/ 896 /* Get the required information for decoding of MB */ 897 /* mb_x, mb_y , neighbour availablity, */ 898 /***************************************************************/ 899 u4_mb_skip = ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 1); 900 901 /*********************************************************************/ 902 /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */ 903 /*********************************************************************/ 904 ps_cur_mb_info->u1_tran_form8x8 = 0; 905 ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; 906 907 /***************************************************************/ 908 /* Set the deblocking parameters for this MB */ 909 /***************************************************************/ 910 if(ps_dec->u4_app_disable_deblk_frm == 0) 911 ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice, 912 ps_dec->u1_mb_ngbr_availablity, 913 ps_dec->u1_cur_mb_fld_dec_flag); 914 915 if(u4_mb_skip) 916 { 917 918 /* Set appropriate flags in ps_cur_mb_info and ps_dec */ 919 memset(ps_dec->ps_curr_ctxt_mb_info, 0, sizeof(ctxt_inc_mb_info_t)); 920 ps_dec->ps_curr_ctxt_mb_info->u1_mb_type = u1_inter_mb_skip_type; 921 922 MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0); 923 924 *((UWORD32 *)ps_dec->pi1_left_ref_idx_ctxt_inc) = 0; 925 *(ps_dec->pu1_left_yuv_dc_csbp) = 0; 926 927 ps_dec->i1_prev_mb_qp_delta = 0; 928 ps_cur_mb_info->u1_mb_type = MB_SKIP; 929 ps_cur_mb_info->u1_cbp = 0; 930 931 { 932 /* Storing Skip partition info */ 933 parse_part_params_t *ps_part_info = ps_dec->ps_part; 934 ps_part_info->u1_is_direct = PART_DIRECT_16x16; 935 ps_part_info->u1_sub_mb_num = 0; 936 ps_dec->ps_part++; 937 } 938 939 /* Update Nnzs */ 940 ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CABAC); 941 942 ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type; 943 ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type; 944 ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; 945 946 } 947 else 948 { 949 950 /* Macroblock Layer Begins */ 951 /* Decode the u1_mb_type */ 952 u1_mb_type = ih264d_parse_mb_type_cabac(ps_dec); 953 ps_cur_mb_info->u1_mb_type = u1_mb_type; 954 if(u1_mb_type > (25 + u1_mb_threshold)) 955 return ERROR_MB_TYPE; 956 957 /* Parse Macroblock Data */ 958 if(u1_mb_type < u1_mb_threshold) 959 { 960 ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type; 961 *(ps_dec->pu1_left_yuv_dc_csbp) &= 0x6; 962 963 ret = ps_dec->pf_parse_inter_mb(ps_dec, ps_cur_mb_info, u1_num_mbs, 964 u1_num_mbsNby2); 965 if(ret != OK) 966 return ret; 967 ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; 968 ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type; 969 } 970 else 971 { 972 /* Storing Intra partition info */ 973 ps_parse_mb_data->u1_num_part = 0; 974 ps_parse_mb_data->u1_isI_mb = 1; 975 976 if((25 + u1_mb_threshold) == u1_mb_type) 977 { 978 /* I_PCM_MB */ 979 ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB; 980 ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs); 981 if(ret != OK) 982 return ret; 983 ps_cur_deblk_mb->u1_mb_qp = 0; 984 } 985 else 986 { 987 if(u1_mb_type == u1_mb_threshold) 988 ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB; 989 else 990 ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB; 991 992 ret = ih264d_parse_imb_cabac( 993 ps_dec, ps_cur_mb_info, 994 (UWORD8)(u1_mb_type - u1_mb_threshold)); 995 if(ret != OK) 996 return ret; 997 ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; 998 } 999 ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB; 1000 1001 } 1002 1003 } 1004 1005 if(u1_mbaff) 1006 { 1007 ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info); 1008 } 1009 /* Next macroblock information */ 1010 i2_cur_mb_addr++; 1011 1012 if(ps_cur_mb_info->u1_topmb && u1_mbaff) 1013 uc_more_data_flag = 1; 1014 else 1015 { 1016 uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env, 1017 ps_bitstrm); 1018 uc_more_data_flag = !uc_more_data_flag; 1019 COPYTHECONTEXT("Decode Sliceterm",!uc_more_data_flag); 1020 } 1021 1022 u1_num_mbs++; 1023 u1_num_mbsNby2++; 1024 ps_parse_mb_data++; 1025 1026 /****************************************************************/ 1027 /* Check for End Of Row and other flags that determine when to */ 1028 /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for */ 1029 /* N-Mb */ 1030 /****************************************************************/ 1031 u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1; 1032 u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01))); 1033 u1_slice_end = !uc_more_data_flag; 1034 u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row 1035 || u1_slice_end; 1036 u1_decode_nmb = u1_tfr_n_mb || u1_slice_end; 1037 ps_cur_mb_info->u1_end_of_slice = u1_slice_end; 1038 /*u1_dma_nby2mb = u1_decode_nmb || 1039 (u1_num_mbsNby2 == ps_dec->u1_recon_mb_grp_pair);*/ 1040 1041 //if(u1_dma_nby2mb) 1042 if(u1_decode_nmb) 1043 { 1044 1045 ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs); 1046 u1_num_mbsNby2 = 0; 1047 1048 { 1049 ps_parse_mb_data = ps_dec->ps_parse_mb_data; 1050 ps_dec->ps_part = ps_dec->ps_parse_part_params; 1051 } 1052 } 1053 1054 /*H264_DEC_DEBUG_PRINT("Pic: %d Mb_X=%d Mb_Y=%d", 1055 ps_slice->i4_poc >> ps_slice->u1_field_pic_flag, 1056 ps_dec->u2_mbx,ps_dec->u2_mby + (1 - ps_cur_mb_info->u1_topmb)); 1057 H264_DEC_DEBUG_PRINT("u1_decode_nmb: %d, u1_num_mbs: %d", u1_decode_nmb, u1_num_mbs);*/ 1058 if(u1_decode_nmb) 1059 { 1060 1061 if(ps_dec->u1_separate_parse) 1062 { 1063 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, 1064 u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row); 1065 ps_dec->ps_nmb_info += u1_num_mbs; 1066 } 1067 else 1068 { 1069 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, 1070 u1_num_mbs_next, u1_tfr_n_mb, 1071 u1_end_of_row); 1072 } 1073 ps_dec->u2_total_mbs_coded += u1_num_mbs; 1074 if(u1_tfr_n_mb) 1075 u1_num_mbs = 0; 1076 u1_mb_idx = u1_num_mbs; 1077 ps_dec->u1_mb_idx = u1_num_mbs; 1078 1079 } 1080 } 1081 1082 1083 ps_dec->u4_num_mbs_cur_nmb = 0; 1084 ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr 1085 1086 - (u2_first_mb_in_slice << u1_mbaff); 1087 1088 return ret; 1089 } 1090 1091 /*****************************************************************************/ 1092 /* */ 1093 /* Function Name : ih264d_parse_inter_slice_data_cavlc */ 1094 /* */ 1095 /* Description : This function parses cavlc syntax of a inter slice on */ 1096 /* N MB basis. */ 1097 /* */ 1098 /* Inputs : ps_dec */ 1099 /* sliceparams */ 1100 /* firstMbInSlice */ 1101 /* */ 1102 /* Processing : 1. After parsing syntax for N MBs those N MBs are */ 1103 /* decoded till the end of slice. */ 1104 /* 2. MV prediction and DMA happens on a N/2 MB basis. */ 1105 /* */ 1106 /* Returns : 0 */ 1107 /* */ 1108 /* Issues : <List any issues or problems with this function> */ 1109 /* */ 1110 /* Revision History: */ 1111 /* */ 1112 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1113 /* 13 07 2002 Jay Draft */ 1114 /* */ 1115 /*****************************************************************************/ 1116 1117 WORD32 ih264d_parse_inter_slice_data_cavlc(dec_struct_t * ps_dec, 1118 dec_slice_params_t * ps_slice, 1119 UWORD16 u2_first_mb_in_slice) 1120 { 1121 UWORD32 uc_more_data_flag; 1122 WORD32 i2_cur_mb_addr; 1123 UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx; 1124 UWORD32 i2_mb_skip_run; 1125 UWORD32 u1_read_mb_type; 1126 1127 UWORD32 u1_mbaff; 1128 UWORD32 u1_num_mbs_next, u1_end_of_row; 1129 const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs; 1130 UWORD32 u1_slice_end = 0; 1131 UWORD32 u1_tfr_n_mb = 0; 1132 UWORD32 u1_decode_nmb = 0; 1133 1134 dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; 1135 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 1136 UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; 1137 deblk_mb_t *ps_cur_deblk_mb; 1138 dec_mb_info_t *ps_cur_mb_info; 1139 parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data; 1140 UWORD32 u1_inter_mb_type; 1141 UWORD32 u1_deblk_mb_type; 1142 UWORD32 u1_mb_threshold; 1143 WORD32 ret = OK; 1144 1145 /******************************************************/ 1146 /* Initialisations specific to B or P slice */ 1147 /******************************************************/ 1148 1149 if(ps_slice->u1_slice_type == P_SLICE) 1150 { 1151 u1_inter_mb_type = P_MB; 1152 u1_deblk_mb_type = D_INTER_MB; 1153 u1_mb_threshold = 5; 1154 } 1155 else // B_SLICE 1156 { 1157 u1_inter_mb_type = B_MB; 1158 u1_deblk_mb_type = D_B_SLICE; 1159 u1_mb_threshold = 23; 1160 } 1161 /******************************************************/ 1162 /* Slice Level Initialisations */ 1163 /******************************************************/ 1164 ps_dec->u1_qp = ps_slice->u1_slice_qp; 1165 ih264d_update_qp(ps_dec, 0); 1166 u1_mb_idx = ps_dec->u1_mb_idx; 1167 u1_num_mbs = u1_mb_idx; 1168 1169 u1_num_mbsNby2 = 0; 1170 u1_mbaff = ps_slice->u1_mbaff_frame_flag; 1171 i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff; 1172 i2_mb_skip_run = 0; 1173 uc_more_data_flag = 1; 1174 u1_read_mb_type = 0; 1175 1176 while(!u1_slice_end) 1177 { 1178 UWORD8 u1_mb_type; 1179 1180 ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data; 1181 1182 if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr) 1183 { 1184 break; 1185 } 1186 1187 1188 ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs; 1189 ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs; 1190 1191 ps_cur_mb_info->u1_Mux = 0; 1192 ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff); 1193 ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs; 1194 1195 ps_cur_mb_info->u1_end_of_slice = 0; 1196 1197 /* Storing Default partition info */ 1198 ps_parse_mb_data->u1_num_part = 1; 1199 ps_parse_mb_data->u1_isI_mb = 0; 1200 1201 if((!i2_mb_skip_run) && (!u1_read_mb_type)) 1202 { 1203 1204 //Inlined ih264d_uev 1205 UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; 1206 UWORD32 u4_word, u4_ldz; 1207 1208 /***************************************************************/ 1209 /* Find leading zeros in next 32 bits */ 1210 /***************************************************************/ 1211 NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); 1212 1213 u4_ldz = CLZ(u4_word); 1214 1215 /* Flush the ps_bitstrm */ 1216 u4_bitstream_offset += (u4_ldz + 1); 1217 /* Read the suffix from the ps_bitstrm */ 1218 u4_word = 0; 1219 if(u4_ldz) 1220 { 1221 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, 1222 u4_ldz); 1223 } 1224 *pu4_bitstrm_ofst = u4_bitstream_offset; 1225 i2_mb_skip_run = ((1 << u4_ldz) + u4_word - 1); 1226 //Inlined ih264d_uev 1227 COPYTHECONTEXT("mb_skip_run", i2_mb_skip_run); 1228 uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm); 1229 u1_read_mb_type = uc_more_data_flag; 1230 } 1231 1232 /***************************************************************/ 1233 /* Get the required information for decoding of MB */ 1234 /* mb_x, mb_y , neighbour availablity, */ 1235 /***************************************************************/ 1236 ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run); 1237 1238 /***************************************************************/ 1239 /* Set the deblocking parameters for this MB */ 1240 /***************************************************************/ 1241 if(ps_dec->u4_app_disable_deblk_frm == 0) 1242 ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice, 1243 ps_dec->u1_mb_ngbr_availablity, 1244 ps_dec->u1_cur_mb_fld_dec_flag); 1245 1246 if(i2_mb_skip_run) 1247 { 1248 /* Set appropriate flags in ps_cur_mb_info and ps_dec */ 1249 ps_dec->i1_prev_mb_qp_delta = 0; 1250 ps_dec->u1_sub_mb_num = 0; 1251 ps_cur_mb_info->u1_mb_type = MB_SKIP; 1252 ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16; 1253 ps_cur_mb_info->u1_cbp = 0; 1254 1255 { 1256 /* Storing Skip partition info */ 1257 parse_part_params_t *ps_part_info = ps_dec->ps_part; 1258 ps_part_info->u1_is_direct = PART_DIRECT_16x16; 1259 ps_part_info->u1_sub_mb_num = 0; 1260 ps_dec->ps_part++; 1261 } 1262 1263 /* Update Nnzs */ 1264 ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC); 1265 1266 ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type; 1267 ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type; 1268 1269 i2_mb_skip_run--; 1270 } 1271 else 1272 { 1273 u1_read_mb_type = 0; 1274 /**************************************************************/ 1275 /* Macroblock Layer Begins, Decode the u1_mb_type */ 1276 /**************************************************************/ 1277 { 1278 UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; 1279 UWORD32 u4_word, u4_ldz, u4_temp; 1280 1281 1282 //Inlined ih264d_uev 1283 /***************************************************************/ 1284 /* Find leading zeros in next 32 bits */ 1285 /***************************************************************/ 1286 NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); 1287 u4_ldz = CLZ(u4_word); 1288 /* Flush the ps_bitstrm */ 1289 u4_bitstream_offset += (u4_ldz + 1); 1290 /* Read the suffix from the ps_bitstrm */ 1291 u4_word = 0; 1292 if(u4_ldz) 1293 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, 1294 u4_ldz); 1295 *pu4_bitstrm_ofst = u4_bitstream_offset; 1296 u4_temp = ((1 << u4_ldz) + u4_word - 1); 1297 //Inlined ih264d_uev 1298 if(u4_temp > (UWORD32)(25 + u1_mb_threshold)) 1299 return ERROR_MB_TYPE; 1300 u1_mb_type = u4_temp; 1301 COPYTHECONTEXT("u1_mb_type", u1_mb_type); 1302 } 1303 ps_cur_mb_info->u1_mb_type = u1_mb_type; 1304 1305 /**************************************************************/ 1306 /* Parse Macroblock data */ 1307 /**************************************************************/ 1308 if(u1_mb_type < u1_mb_threshold) 1309 { 1310 ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type; 1311 1312 ret = ps_dec->pf_parse_inter_mb(ps_dec, ps_cur_mb_info, u1_num_mbs, 1313 u1_num_mbsNby2); 1314 if(ret != OK) 1315 return ret; 1316 ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type; 1317 } 1318 else 1319 { 1320 /* Storing Intra partition info */ 1321 ps_parse_mb_data->u1_num_part = 0; 1322 ps_parse_mb_data->u1_isI_mb = 1; 1323 1324 if((25 + u1_mb_threshold) == u1_mb_type) 1325 { 1326 /* I_PCM_MB */ 1327 ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB; 1328 ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs); 1329 if(ret != OK) 1330 return ret; 1331 ps_dec->u1_qp = 0; 1332 } 1333 else 1334 { 1335 ret = ih264d_parse_imb_cavlc( 1336 ps_dec, ps_cur_mb_info, u1_num_mbs, 1337 (UWORD8)(u1_mb_type - u1_mb_threshold)); 1338 if(ret != OK) 1339 return ret; 1340 } 1341 1342 ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB; 1343 } 1344 uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm); 1345 } 1346 ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; 1347 1348 if(u1_mbaff) 1349 { 1350 ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info); 1351 } 1352 /**************************************************************/ 1353 /* Get next Macroblock address */ 1354 /**************************************************************/ 1355 i2_cur_mb_addr++; 1356 1357 u1_num_mbs++; 1358 u1_num_mbsNby2++; 1359 ps_parse_mb_data++; 1360 1361 /****************************************************************/ 1362 /* Check for End Of Row and other flags that determine when to */ 1363 /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for */ 1364 /* N-Mb */ 1365 /****************************************************************/ 1366 u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1; 1367 u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01))); 1368 u1_slice_end = (!(uc_more_data_flag || i2_mb_skip_run)); 1369 u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row 1370 || u1_slice_end; 1371 u1_decode_nmb = u1_tfr_n_mb || u1_slice_end; 1372 ps_cur_mb_info->u1_end_of_slice = u1_slice_end; 1373 1374 /*u1_dma_nby2mb = u1_decode_nmb || 1375 (u1_num_mbsNby2 == ps_dec->u1_recon_mb_grp_pair);*/ 1376 1377 //if(u1_dma_nby2mb) 1378 if(u1_decode_nmb) 1379 { 1380 ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs); 1381 u1_num_mbsNby2 = 0; 1382 1383 { 1384 ps_parse_mb_data = ps_dec->ps_parse_mb_data; 1385 ps_dec->ps_part = ps_dec->ps_parse_part_params; 1386 } 1387 } 1388 1389 /*H264_DEC_DEBUG_PRINT("Pic: %d Mb_X=%d Mb_Y=%d", 1390 ps_slice->i4_poc >> ps_slice->u1_field_pic_flag, 1391 ps_dec->u2_mbx,ps_dec->u2_mby + (1 - ps_cur_mb_info->u1_topmb)); 1392 H264_DEC_DEBUG_PRINT("u1_decode_nmb: %d", u1_decode_nmb);*/ 1393 if(u1_decode_nmb) 1394 { 1395 1396 1397 1398 if(ps_dec->u1_separate_parse) 1399 { 1400 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, 1401 u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row); 1402 ps_dec->ps_nmb_info += u1_num_mbs; 1403 } 1404 else 1405 { 1406 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, 1407 u1_num_mbs_next, u1_tfr_n_mb, 1408 u1_end_of_row); 1409 } 1410 ps_dec->u2_total_mbs_coded += u1_num_mbs; 1411 if(u1_tfr_n_mb) 1412 u1_num_mbs = 0; 1413 u1_mb_idx = u1_num_mbs; 1414 ps_dec->u1_mb_idx = u1_num_mbs; 1415 1416 } 1417 //ps_dec->ps_pred++; 1418 } 1419 1420 ps_dec->u4_num_mbs_cur_nmb = 0; 1421 ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr 1422 - (u2_first_mb_in_slice << u1_mbaff); 1423 1424 1425 return ret; 1426 } 1427 1428 WORD32 ih264d_mark_err_slice_skip(dec_struct_t * ps_dec, 1429 WORD32 num_mb_skip, 1430 UWORD8 u1_is_idr_slice, 1431 UWORD16 u2_frame_num, 1432 pocstruct_t *ps_cur_poc, 1433 WORD32 prev_slice_err) 1434 { 1435 WORD32 i2_cur_mb_addr; 1436 UWORD32 u1_num_mbs, u1_num_mbsNby2; 1437 UWORD32 u1_mb_idx = ps_dec->u1_mb_idx; 1438 UWORD32 i2_mb_skip_run; 1439 1440 UWORD32 u1_num_mbs_next, u1_end_of_row; 1441 const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs; 1442 UWORD32 u1_slice_end; 1443 UWORD32 u1_tfr_n_mb; 1444 UWORD32 u1_decode_nmb; 1445 dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; 1446 dec_slice_params_t * ps_slice = ps_dec->ps_cur_slice; 1447 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 1448 UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; 1449 deblk_mb_t *ps_cur_deblk_mb; 1450 dec_mb_info_t *ps_cur_mb_info; 1451 parse_pmbarams_t *ps_parse_mb_data; 1452 UWORD32 u1_inter_mb_type; 1453 UWORD32 u1_deblk_mb_type; 1454 UWORD16 u2_total_mbs_coded; 1455 UWORD32 u1_mbaff = ps_slice->u1_mbaff_frame_flag; 1456 parse_part_params_t *ps_part_info; 1457 WORD32 ret; 1458 1459 1460 if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC) 1461 { 1462 ih264d_err_pic_dispbuf_mgr(ps_dec); 1463 return 0; 1464 } 1465 ps_dec->ps_dpb_cmds->u1_long_term_reference_flag = 0; 1466 if(prev_slice_err == 1) 1467 { 1468 /* first slice - missing/header corruption */ 1469 ps_dec->ps_cur_slice->u2_frame_num = u2_frame_num; 1470 1471 1472 if(!ps_dec->u1_first_slice_in_stream) 1473 { 1474 ih264d_end_of_pic(ps_dec, u1_is_idr_slice, 1475 ps_dec->ps_cur_slice->u2_frame_num); 1476 ps_dec->s_cur_pic_poc.u2_frame_num = 1477 ps_dec->ps_cur_slice->u2_frame_num; 1478 } 1479 1480 { 1481 WORD32 i, j, poc = 0; 1482 1483 ps_dec->ps_cur_slice->u2_first_mb_in_slice = 0; 1484 1485 ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff; 1486 ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp; 1487 ps_dec->p_motion_compensate = ih264d_motion_compensate_bp; 1488 1489 if(ps_dec->ps_cur_pic != NULL) 1490 poc = ps_dec->ps_cur_pic->i4_poc + 2; 1491 1492 j = 0; 1493 for(i = 0; i < MAX_NUM_PIC_PARAMS; i++) 1494 if(ps_dec->ps_pps[i].u1_is_valid == TRUE) 1495 j = i; 1496 { 1497 //initialize slice params required by ih264d_start_of_pic to valid values 1498 ps_dec->ps_cur_slice->u1_slice_type = P_SLICE; 1499 ps_dec->ps_cur_slice->u1_nal_ref_idc = 1; 1500 ps_dec->ps_cur_slice->u1_nal_unit_type = 1; 1501 ret = ih264d_start_of_pic(ps_dec, poc, ps_cur_poc, 1502 ps_dec->ps_cur_slice->u2_frame_num, 1503 &ps_dec->ps_pps[j]); 1504 1505 if(ret != OK) 1506 { 1507 return ret; 1508 } 1509 } 1510 1511 ps_dec->ps_ref_pic_buf_lx[0][0]->u1_pic_buf_id = 0; 1512 1513 ps_dec->u4_output_present = 0; 1514 1515 { 1516 ih264d_get_next_display_field(ps_dec, 1517 ps_dec->ps_out_buffer, 1518 &(ps_dec->s_disp_op)); 1519 /* If error code is non-zero then there is no buffer available for display, 1520 hence avoid format conversion */ 1521 1522 if(0 != ps_dec->s_disp_op.u4_error_code) 1523 { 1524 ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht; 1525 } 1526 else 1527 ps_dec->u4_output_present = 1; 1528 } 1529 1530 if(ps_dec->u1_separate_parse == 1) 1531 { 1532 if(ps_dec->u4_dec_thread_created == 0) 1533 { 1534 ithread_create(ps_dec->pv_dec_thread_handle, NULL, 1535 (void *)ih264d_decode_picture_thread, 1536 (void *)ps_dec); 1537 1538 ps_dec->u4_dec_thread_created = 1; 1539 } 1540 1541 if((ps_dec->u4_num_cores == 3) && 1542 ((ps_dec->u4_app_disable_deblk_frm == 0) || ps_dec->i1_recon_in_thread3_flag) 1543 && (ps_dec->u4_bs_deblk_thread_created == 0)) 1544 { 1545 ps_dec->u4_start_recon_deblk = 0; 1546 ithread_create(ps_dec->pv_bs_deblk_thread_handle, NULL, 1547 (void *)ih264d_recon_deblk_thread, 1548 (void *)ps_dec); 1549 ps_dec->u4_bs_deblk_thread_created = 1; 1550 } 1551 } 1552 } 1553 ps_dec->u4_first_slice_in_pic = 0; 1554 } 1555 else 1556 { 1557 // Middle / last slice 1558 1559 dec_slice_struct_t *ps_parse_cur_slice; 1560 ps_parse_cur_slice = ps_dec->ps_dec_slice_buf + ps_dec->u2_cur_slice_num; 1561 1562 if(ps_dec->u1_slice_header_done 1563 && ps_parse_cur_slice == ps_dec->ps_parse_cur_slice) 1564 { 1565 // Slice data corrupted 1566 u1_num_mbs = ps_dec->u4_num_mbs_cur_nmb; 1567 1568 if(u1_num_mbs) 1569 { 1570 ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs - 1; 1571 } 1572 else 1573 { 1574 if(ps_dec->u1_separate_parse) 1575 { 1576 ps_cur_mb_info = ps_dec->ps_nmb_info - 1; 1577 } 1578 else 1579 { 1580 ps_cur_mb_info = ps_dec->ps_nmb_info 1581 + ps_dec->u4_num_mbs_prev_nmb - 1; 1582 } 1583 } 1584 1585 ps_dec->u2_mby = ps_cur_mb_info->u2_mby; 1586 ps_dec->u2_mbx = ps_cur_mb_info->u2_mbx; 1587 1588 ps_dec->u1_mb_ngbr_availablity = 1589 ps_cur_mb_info->u1_mb_ngbr_availablity; 1590 1591 // Going back 1 mb 1592 ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_prev_mb_parse_tu_coeff_data; 1593 ps_dec->u2_cur_mb_addr--; 1594 ps_dec->i4_submb_ofst -= SUB_BLK_SIZE; 1595 1596 if(u1_num_mbs) 1597 { 1598 // Parse/decode N-MB left unparsed 1599 if (ps_dec->u1_pr_sl_type == P_SLICE 1600 || ps_dec->u1_pr_sl_type == B_SLICE) 1601 { 1602 ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs); 1603 ps_dec->ps_part = ps_dec->ps_parse_part_params; 1604 } 1605 1606 u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1; 1607 u1_end_of_row = (!u1_num_mbs_next) 1608 && (!(u1_mbaff && (u1_num_mbs & 0x01))); 1609 u1_slice_end = 1; 1610 u1_tfr_n_mb = 1; 1611 ps_cur_mb_info->u1_end_of_slice = u1_slice_end; 1612 1613 if(ps_dec->u1_separate_parse) 1614 { 1615 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, 1616 u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row); 1617 ps_dec->ps_nmb_info += u1_num_mbs; 1618 } 1619 else 1620 { 1621 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, 1622 u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row); 1623 } 1624 ps_dec->u2_total_mbs_coded += u1_num_mbs; 1625 ps_dec->u1_mb_idx = 0; 1626 ps_dec->u4_num_mbs_cur_nmb = 0; 1627 } 1628 1629 if(ps_dec->u2_total_mbs_coded 1630 >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) 1631 { 1632 ps_dec->u1_pic_decode_done = 1; 1633 return 0; 1634 } 1635 1636 // Inserting new slice 1637 ps_dec->u2_cur_slice_num++; 1638 ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx; 1639 ps_dec->i2_prev_slice_mby = ps_dec->u2_mby; 1640 ps_dec->ps_parse_cur_slice++; 1641 1642 } 1643 else 1644 { 1645 // Slice missing / header corrupted 1646 ps_dec->ps_parse_cur_slice = ps_dec->ps_dec_slice_buf 1647 + ps_dec->u2_cur_slice_num; 1648 } 1649 } 1650 1651 /******************************************************/ 1652 /* Initializations to new slice */ 1653 /******************************************************/ 1654 { 1655 WORD32 num_entries; 1656 WORD32 size; 1657 UWORD8 *pu1_buf; 1658 1659 num_entries = MAX_FRAMES; 1660 if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) && 1661 (0 == ps_dec->i4_display_delay)) 1662 { 1663 num_entries = 1; 1664 } 1665 num_entries = ((2 * num_entries) + 1); 1666 if(BASE_PROFILE_IDC != ps_dec->ps_cur_sps->u1_profile_idc) 1667 { 1668 num_entries *= 2; 1669 } 1670 size = num_entries * sizeof(void *); 1671 size += PAD_MAP_IDX_POC * sizeof(void *); 1672 1673 pu1_buf = (UWORD8 *)ps_dec->pv_map_ref_idx_to_poc_buf; 1674 pu1_buf += size * ps_dec->u2_cur_slice_num; 1675 ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = (volatile void **)pu1_buf; 1676 } 1677 1678 ps_dec->ps_cur_slice->u2_first_mb_in_slice = ps_dec->u2_total_mbs_coded << u1_mbaff; 1679 ps_dec->ps_cur_slice->i1_slice_alpha_c0_offset = 0; 1680 ps_dec->ps_cur_slice->i1_slice_beta_offset = 0; 1681 1682 if(ps_dec->ps_cur_slice->u1_field_pic_flag) 1683 ps_dec->u2_prv_frame_num = ps_dec->ps_cur_slice->u2_frame_num; 1684 1685 ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice = ps_dec->u2_total_mbs_coded << u1_mbaff; 1686 ps_dec->ps_parse_cur_slice->u2_log2Y_crwd = ps_dec->ps_cur_slice->u2_log2Y_crwd; 1687 1688 1689 if(ps_dec->u1_separate_parse) 1690 { 1691 ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data; 1692 } 1693 else 1694 { 1695 ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data; 1696 } 1697 1698 /******************************************************/ 1699 /* Initializations specific to P slice */ 1700 /******************************************************/ 1701 u1_inter_mb_type = P_MB; 1702 u1_deblk_mb_type = D_INTER_MB; 1703 1704 ps_dec->ps_cur_slice->u1_slice_type = P_SLICE; 1705 ps_dec->ps_parse_cur_slice->slice_type = P_SLICE; 1706 ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb; 1707 ps_dec->ps_part = ps_dec->ps_parse_part_params; 1708 1709 /******************************************************/ 1710 /* Parsing / decoding the slice */ 1711 /******************************************************/ 1712 ps_dec->u1_slice_header_done = 2; 1713 ps_dec->u1_qp = ps_slice->u1_slice_qp; 1714 ih264d_update_qp(ps_dec, 0); 1715 u1_mb_idx = ps_dec->u1_mb_idx; 1716 ps_parse_mb_data = ps_dec->ps_parse_mb_data; 1717 u1_num_mbs = u1_mb_idx; 1718 1719 u1_slice_end = 0; 1720 u1_tfr_n_mb = 0; 1721 u1_decode_nmb = 0; 1722 u1_num_mbsNby2 = 0; 1723 i2_cur_mb_addr = ps_dec->u2_total_mbs_coded; 1724 i2_mb_skip_run = num_mb_skip; 1725 1726 while(!u1_slice_end) 1727 { 1728 UWORD8 u1_mb_type; 1729 1730 if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr) 1731 break; 1732 1733 ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs; 1734 ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs; 1735 1736 ps_cur_mb_info->u1_Mux = 0; 1737 ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff); 1738 ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs; 1739 1740 ps_cur_mb_info->u1_end_of_slice = 0; 1741 1742 /* Storing Default partition info */ 1743 ps_parse_mb_data->u1_num_part = 1; 1744 ps_parse_mb_data->u1_isI_mb = 0; 1745 1746 /**************************************************************/ 1747 /* Get the required information for decoding of MB */ 1748 /**************************************************************/ 1749 /* mb_x, mb_y, neighbor availablity, */ 1750 if (u1_mbaff) 1751 ih264d_get_mb_info_cavlc_mbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run); 1752 else 1753 ih264d_get_mb_info_cavlc_nonmbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run); 1754 1755 /* Set the deblocking parameters for this MB */ 1756 if(ps_dec->u4_app_disable_deblk_frm == 0) 1757 { 1758 ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice, 1759 ps_dec->u1_mb_ngbr_availablity, 1760 ps_dec->u1_cur_mb_fld_dec_flag); 1761 } 1762 1763 /* Set appropriate flags in ps_cur_mb_info and ps_dec */ 1764 ps_dec->i1_prev_mb_qp_delta = 0; 1765 ps_dec->u1_sub_mb_num = 0; 1766 ps_cur_mb_info->u1_mb_type = MB_SKIP; 1767 ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16; 1768 ps_cur_mb_info->u1_cbp = 0; 1769 1770 /* Storing Skip partition info */ 1771 ps_part_info = ps_dec->ps_part; 1772 ps_part_info->u1_is_direct = PART_DIRECT_16x16; 1773 ps_part_info->u1_sub_mb_num = 0; 1774 ps_dec->ps_part++; 1775 1776 /* Update Nnzs */ 1777 ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC); 1778 1779 ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type; 1780 ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type; 1781 1782 i2_mb_skip_run--; 1783 1784 ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; 1785 1786 if (u1_mbaff) 1787 { 1788 ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info); 1789 } 1790 1791 /**************************************************************/ 1792 /* Get next Macroblock address */ 1793 /**************************************************************/ 1794 i2_cur_mb_addr++; 1795 1796 u1_num_mbs++; 1797 u1_num_mbsNby2++; 1798 ps_parse_mb_data++; 1799 1800 /****************************************************************/ 1801 /* Check for End Of Row and other flags that determine when to */ 1802 /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for */ 1803 /* N-Mb */ 1804 /****************************************************************/ 1805 u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1; 1806 u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01))); 1807 u1_slice_end = !i2_mb_skip_run; 1808 u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row 1809 || u1_slice_end; 1810 u1_decode_nmb = u1_tfr_n_mb || u1_slice_end; 1811 ps_cur_mb_info->u1_end_of_slice = u1_slice_end; 1812 1813 if(u1_decode_nmb) 1814 { 1815 ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs); 1816 u1_num_mbsNby2 = 0; 1817 1818 ps_parse_mb_data = ps_dec->ps_parse_mb_data; 1819 ps_dec->ps_part = ps_dec->ps_parse_part_params; 1820 1821 if(ps_dec->u1_separate_parse) 1822 { 1823 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, 1824 u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row); 1825 ps_dec->ps_nmb_info += u1_num_mbs; 1826 } 1827 else 1828 { 1829 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, 1830 u1_tfr_n_mb, u1_end_of_row); 1831 } 1832 ps_dec->u2_total_mbs_coded += u1_num_mbs; 1833 if(u1_tfr_n_mb) 1834 u1_num_mbs = 0; 1835 u1_mb_idx = u1_num_mbs; 1836 ps_dec->u1_mb_idx = u1_num_mbs; 1837 } 1838 } 1839 1840 ps_dec->u4_num_mbs_cur_nmb = 0; 1841 ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr 1842 - ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice; 1843 1844 H264_DEC_DEBUG_PRINT("Mbs in slice: %d\n", ps_dec->ps_cur_slice->u4_mbs_in_slice); 1845 1846 1847 /* incremented here only if first slice is inserted */ 1848 if(ps_dec->u4_first_slice_in_pic != 0) 1849 { 1850 ps_dec->ps_parse_cur_slice++; 1851 ps_dec->u2_cur_slice_num++; 1852 } 1853 1854 ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx; 1855 ps_dec->i2_prev_slice_mby = ps_dec->u2_mby; 1856 1857 if(ps_dec->u2_total_mbs_coded 1858 >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) 1859 { 1860 ps_dec->u1_pic_decode_done = 1; 1861 } 1862 1863 return 0; 1864 1865 } 1866 1867 /*! 1868 ************************************************************************** 1869 * \if Function name : ih264d_decode_pslice \endif 1870 * 1871 * \brief 1872 * Decodes a P Slice 1873 * 1874 * 1875 * \return 1876 * 0 on Success and Error code otherwise 1877 ************************************************************************** 1878 */ 1879 WORD32 ih264d_parse_pslice(dec_struct_t *ps_dec, UWORD16 u2_first_mb_in_slice) 1880 { 1881 dec_pic_params_t * ps_pps = ps_dec->ps_cur_pps; 1882 dec_slice_params_t * ps_cur_slice = ps_dec->ps_cur_slice; 1883 dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm; 1884 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 1885 UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; 1886 UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; //ps_dec->ps_cur_sps->u1_mb_aff_flag; 1887 UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag; 1888 1889 UWORD32 u4_temp; 1890 WORD32 i_temp; 1891 WORD32 ret; 1892 1893 /*--------------------------------------------------------------------*/ 1894 /* Read remaining contents of the slice header */ 1895 /*--------------------------------------------------------------------*/ 1896 { 1897 WORD8 *pi1_buf; 1898 WORD16 *pi2_mv = ps_dec->s_default_mv_pred.i2_mv; 1899 WORD32 *pi4_mv = (WORD32*)pi2_mv; 1900 WORD16 *pi16_refFrame; 1901 1902 pi1_buf = ps_dec->s_default_mv_pred.i1_ref_frame; 1903 pi16_refFrame = (WORD16*)pi1_buf; 1904 *pi4_mv = 0; 1905 *(pi4_mv + 1) = 0; 1906 *pi16_refFrame = OUT_OF_RANGE_REF; 1907 ps_dec->s_default_mv_pred.u1_col_ref_pic_idx = (UWORD8)-1; 1908 ps_dec->s_default_mv_pred.u1_pic_type = (UWORD8)-1; 1909 } 1910 1911 ps_cur_slice->u1_num_ref_idx_active_override_flag = ih264d_get_bit_h264( 1912 ps_bitstrm); 1913 1914 COPYTHECONTEXT("SH: num_ref_idx_override_flag", 1915 ps_cur_slice->u1_num_ref_idx_active_override_flag); 1916 1917 u4_temp = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[0]; 1918 if(ps_cur_slice->u1_num_ref_idx_active_override_flag) 1919 { 1920 u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf) + 1; 1921 } 1922 1923 { 1924 1925 1926 1927 UWORD8 u1_max_ref_idx = MAX_FRAMES << u1_field_pic_flag; 1928 if(u4_temp > u1_max_ref_idx) 1929 { 1930 return ERROR_NUM_REF; 1931 } 1932 ps_cur_slice->u1_num_ref_idx_lx_active[0] = u4_temp; 1933 COPYTHECONTEXT("SH: num_ref_idx_l0_active_minus1", 1934 ps_cur_slice->u1_num_ref_idx_lx_active[0] - 1); 1935 1936 } 1937 1938 { 1939 UWORD8 uc_refIdxReFlagL0 = ih264d_get_bit_h264(ps_bitstrm); 1940 COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l0",uc_refIdxReFlagL0); 1941 1942 /* Initialize the Reference list once in Picture if the slice type */ 1943 /* of first slice is between 5 to 9 defined in table 7.3 of standard */ 1944 /* If picture contains both P & B slices then Initialize the Reference*/ 1945 /* List only when it switches from P to B and B to P */ 1946 { 1947 UWORD8 init_idx_flg = (ps_dec->u1_pr_sl_type 1948 != ps_dec->ps_cur_slice->u1_slice_type); 1949 if(ps_dec->u1_first_pb_nal_in_pic 1950 || (init_idx_flg & !ps_dec->u1_sl_typ_5_9) 1951 || ps_dec->u1_num_ref_idx_lx_active_prev 1952 != ps_cur_slice->u1_num_ref_idx_lx_active[0]) 1953 { 1954 ih264d_init_ref_idx_lx_p(ps_dec); 1955 } 1956 if(ps_dec->u1_first_pb_nal_in_pic & ps_dec->u1_sl_typ_5_9) 1957 ps_dec->u1_first_pb_nal_in_pic = 0; 1958 } 1959 /* Store the value for future slices in the same picture */ 1960 ps_dec->u1_num_ref_idx_lx_active_prev = 1961 ps_cur_slice->u1_num_ref_idx_lx_active[0]; 1962 1963 /* Modified temporarily */ 1964 if(uc_refIdxReFlagL0) 1965 { 1966 WORD8 ret; 1967 ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0]; 1968 ret = ih264d_ref_idx_reordering(ps_dec, 0); 1969 if(ret == -1) 1970 return ERROR_REFIDX_ORDER_T; 1971 ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0]; 1972 } 1973 else 1974 ps_dec->ps_ref_pic_buf_lx[0] = 1975 ps_dec->ps_dpb_mgr->ps_init_dpb[0]; 1976 } 1977 /* Create refIdx to POC mapping */ 1978 { 1979 void **pui_map_ref_idx_to_poc_lx0, **pui_map_ref_idx_to_poc_lx1; 1980 WORD8 idx; 1981 struct pic_buffer_t *ps_pic; 1982 1983 pui_map_ref_idx_to_poc_lx0 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L0; 1984 pui_map_ref_idx_to_poc_lx0[0] = 0; //For ref_idx = -1 1985 pui_map_ref_idx_to_poc_lx0++; 1986 for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++) 1987 { 1988 ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx]; 1989 pui_map_ref_idx_to_poc_lx0[idx] = (ps_pic->pu1_buf1); 1990 } 1991 1992 /* Bug Fix Deblocking */ 1993 pui_map_ref_idx_to_poc_lx1 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L1; 1994 pui_map_ref_idx_to_poc_lx1[0] = 0; 1995 1996 if(u1_mbaff) 1997 { 1998 void **ppv_map_ref_idx_to_poc_lx_t, **ppv_map_ref_idx_to_poc_lx_b; 1999 void **ppv_map_ref_idx_to_poc_lx_t1, **ppv_map_ref_idx_to_poc_lx_b1; 2000 ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc 2001 + TOP_LIST_FLD_L0; 2002 ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc 2003 + BOT_LIST_FLD_L0; 2004 2005 ppv_map_ref_idx_to_poc_lx_t[0] = 0; // For ref_idx = -1 2006 ppv_map_ref_idx_to_poc_lx_t++; 2007 ppv_map_ref_idx_to_poc_lx_b[0] = 0; // For ref_idx = -1 2008 ppv_map_ref_idx_to_poc_lx_b++; 2009 2010 idx = 0; 2011 for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++) 2012 { 2013 ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx]; 2014 ppv_map_ref_idx_to_poc_lx_t[0] = (ps_pic->pu1_buf1); 2015 ppv_map_ref_idx_to_poc_lx_b[1] = (ps_pic->pu1_buf1); 2016 2017 ppv_map_ref_idx_to_poc_lx_b[0] = (ps_pic->pu1_buf1) + 1; 2018 ppv_map_ref_idx_to_poc_lx_t[1] = (ps_pic->pu1_buf1) + 1; 2019 2020 ppv_map_ref_idx_to_poc_lx_t += 2; 2021 ppv_map_ref_idx_to_poc_lx_b += 2; 2022 } 2023 ppv_map_ref_idx_to_poc_lx_t1 = ps_dec->ppv_map_ref_idx_to_poc 2024 + TOP_LIST_FLD_L1; 2025 ppv_map_ref_idx_to_poc_lx_t1[0] = 0; 2026 ppv_map_ref_idx_to_poc_lx_b1 = ps_dec->ppv_map_ref_idx_to_poc 2027 + BOT_LIST_FLD_L1; 2028 ppv_map_ref_idx_to_poc_lx_b1[0] = 0; 2029 2030 } 2031 2032 if(ps_dec->u4_num_cores >= 3) 2033 { 2034 WORD32 num_entries; 2035 WORD32 size; 2036 2037 num_entries = MAX_FRAMES; 2038 if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) && 2039 (0 == ps_dec->i4_display_delay)) 2040 { 2041 num_entries = 1; 2042 } 2043 num_entries = ((2 * num_entries) + 1); 2044 if(BASE_PROFILE_IDC != ps_dec->ps_cur_sps->u1_profile_idc) 2045 { 2046 num_entries *= 2; 2047 } 2048 2049 size = num_entries * sizeof(void *); 2050 size += PAD_MAP_IDX_POC * sizeof(void *); 2051 2052 memcpy((void *)ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc, 2053 ps_dec->ppv_map_ref_idx_to_poc, 2054 size); 2055 } 2056 2057 2058 } 2059 if(ps_pps->u1_wted_pred_flag) 2060 { 2061 ret = ih264d_parse_pred_weight_table(ps_cur_slice, ps_bitstrm); 2062 if(ret != OK) 2063 return ret; 2064 ih264d_form_pred_weight_matrix(ps_dec); 2065 ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat; 2066 } 2067 else 2068 { 2069 ps_dec->ps_cur_slice->u2_log2Y_crwd = 0; 2070 ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat; 2071 } 2072 2073 ps_dec->ps_parse_cur_slice->u2_log2Y_crwd = 2074 ps_dec->ps_cur_slice->u2_log2Y_crwd; 2075 2076 if(u1_mbaff && (u1_field_pic_flag == 0)) 2077 { 2078 ih264d_convert_frm_mbaff_list(ps_dec); 2079 } 2080 2081 /* G050 */ 2082 if(ps_cur_slice->u1_nal_ref_idc != 0) 2083 { 2084 if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read) 2085 { 2086 i_temp = ih264d_read_mmco_commands(ps_dec); 2087 if (i_temp < 0) 2088 { 2089 return ERROR_DBP_MANAGER_T; 2090 } 2091 ps_dec->u4_bitoffset = i_temp; 2092 } 2093 else 2094 ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset; 2095 2096 } 2097 /* G050 */ 2098 2099 if(ps_pps->u1_entropy_coding_mode == CABAC) 2100 { 2101 u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); 2102 2103 if(u4_temp > MAX_CABAC_INIT_IDC) 2104 { 2105 return ERROR_INV_SLICE_HDR_T; 2106 } 2107 ps_cur_slice->u1_cabac_init_idc = u4_temp; 2108 COPYTHECONTEXT("SH: cabac_init_idc",ps_cur_slice->u1_cabac_init_idc); 2109 } 2110 2111 /* Read slice_qp_delta */ 2112 i_temp = ps_pps->u1_pic_init_qp 2113 + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); 2114 if((i_temp < 0) || (i_temp > 51)) 2115 { 2116 return ERROR_INV_RANGE_QP_T; 2117 } 2118 ps_cur_slice->u1_slice_qp = i_temp; 2119 COPYTHECONTEXT("SH: slice_qp_delta", 2120 (WORD8)(ps_cur_slice->u1_slice_qp - ps_pps->u1_pic_init_qp)); 2121 2122 if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1) 2123 { 2124 u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); 2125 if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED) 2126 { 2127 return ERROR_INV_SLICE_HDR_T; 2128 } 2129 2130 COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp); 2131 ps_cur_slice->u1_disable_dblk_filter_idc = u4_temp; 2132 if(u4_temp != 1) 2133 { 2134 i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) 2135 << 1; 2136 if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF)) 2137 { 2138 return ERROR_INV_SLICE_HDR_T; 2139 } 2140 ps_cur_slice->i1_slice_alpha_c0_offset = i_temp; 2141 COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2", 2142 ps_cur_slice->i1_slice_alpha_c0_offset >> 1); 2143 2144 i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) 2145 << 1; 2146 if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF)) 2147 { 2148 return ERROR_INV_SLICE_HDR_T; 2149 } 2150 ps_cur_slice->i1_slice_beta_offset = i_temp; 2151 COPYTHECONTEXT("SH: slice_beta_offset_div2", 2152 ps_cur_slice->i1_slice_beta_offset >> 1); 2153 } 2154 else 2155 { 2156 ps_cur_slice->i1_slice_alpha_c0_offset = 0; 2157 ps_cur_slice->i1_slice_beta_offset = 0; 2158 } 2159 } 2160 else 2161 { 2162 ps_cur_slice->u1_disable_dblk_filter_idc = 0; 2163 ps_cur_slice->i1_slice_alpha_c0_offset = 0; 2164 ps_cur_slice->i1_slice_beta_offset = 0; 2165 } 2166 2167 ps_dec->u1_slice_header_done = 2; 2168 2169 if(ps_pps->u1_entropy_coding_mode) 2170 { 2171 SWITCHOFFTRACE; SWITCHONTRACECABAC; 2172 ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cabac; 2173 ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cabac; 2174 ih264d_init_cabac_contexts(P_SLICE, ps_dec); 2175 2176 if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag) 2177 ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff; 2178 else 2179 ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_nonmbaff; 2180 } 2181 else 2182 { 2183 SWITCHONTRACE; SWITCHOFFTRACECABAC; 2184 ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cavlc; 2185 ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cavlc; 2186 if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag) 2187 { 2188 ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff; 2189 } 2190 else 2191 ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_nonmbaff; 2192 } 2193 2194 ps_dec->u1_B = 0; 2195 ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb; 2196 ret = ps_dec->pf_parse_inter_slice(ps_dec, ps_cur_slice, u2_first_mb_in_slice); 2197 if(ret != OK) 2198 return ret; 2199 // ps_dec->curr_slice_in_error = 0 ; 2200 return OK; 2201 } 2202