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 ret = ERROR_MB_ADDRESS_T; 880 break; 881 } 882 883 ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs; 884 ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs; 885 886 ps_cur_mb_info->u1_Mux = 0; 887 ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff); 888 ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs; 889 890 ps_cur_mb_info->u1_end_of_slice = 0; 891 892 /* Storing Default partition info */ 893 ps_parse_mb_data->u1_num_part = 1; 894 ps_parse_mb_data->u1_isI_mb = 0; 895 896 /***************************************************************/ 897 /* Get the required information for decoding of MB */ 898 /* mb_x, mb_y , neighbour availablity, */ 899 /***************************************************************/ 900 u4_mb_skip = ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 1); 901 902 /*********************************************************************/ 903 /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */ 904 /*********************************************************************/ 905 ps_cur_mb_info->u1_tran_form8x8 = 0; 906 ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; 907 908 /***************************************************************/ 909 /* Set the deblocking parameters for this MB */ 910 /***************************************************************/ 911 if(ps_dec->u4_app_disable_deblk_frm == 0) 912 ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice, 913 ps_dec->u1_mb_ngbr_availablity, 914 ps_dec->u1_cur_mb_fld_dec_flag); 915 916 if(u4_mb_skip) 917 { 918 919 /* Set appropriate flags in ps_cur_mb_info and ps_dec */ 920 memset(ps_dec->ps_curr_ctxt_mb_info, 0, sizeof(ctxt_inc_mb_info_t)); 921 ps_dec->ps_curr_ctxt_mb_info->u1_mb_type = u1_inter_mb_skip_type; 922 923 MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0); 924 925 *((UWORD32 *)ps_dec->pi1_left_ref_idx_ctxt_inc) = 0; 926 *(ps_dec->pu1_left_yuv_dc_csbp) = 0; 927 928 ps_dec->i1_prev_mb_qp_delta = 0; 929 ps_cur_mb_info->u1_mb_type = MB_SKIP; 930 ps_cur_mb_info->u1_cbp = 0; 931 932 { 933 /* Storing Skip partition info */ 934 parse_part_params_t *ps_part_info = ps_dec->ps_part; 935 ps_part_info->u1_is_direct = PART_DIRECT_16x16; 936 ps_part_info->u1_sub_mb_num = 0; 937 ps_dec->ps_part++; 938 } 939 940 /* Update Nnzs */ 941 ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CABAC); 942 943 ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type; 944 ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type; 945 ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; 946 947 } 948 else 949 { 950 951 /* Macroblock Layer Begins */ 952 /* Decode the u1_mb_type */ 953 u1_mb_type = ih264d_parse_mb_type_cabac(ps_dec); 954 ps_cur_mb_info->u1_mb_type = u1_mb_type; 955 if(u1_mb_type > (25 + u1_mb_threshold)) 956 return ERROR_MB_TYPE; 957 958 /* Parse Macroblock Data */ 959 if(u1_mb_type < u1_mb_threshold) 960 { 961 ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type; 962 *(ps_dec->pu1_left_yuv_dc_csbp) &= 0x6; 963 964 ret = ps_dec->pf_parse_inter_mb(ps_dec, ps_cur_mb_info, u1_num_mbs, 965 u1_num_mbsNby2); 966 if(ret != OK) 967 return ret; 968 ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; 969 ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type; 970 } 971 else 972 { 973 /* Storing Intra partition info */ 974 ps_parse_mb_data->u1_num_part = 0; 975 ps_parse_mb_data->u1_isI_mb = 1; 976 977 if((25 + u1_mb_threshold) == u1_mb_type) 978 { 979 /* I_PCM_MB */ 980 ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB; 981 ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs); 982 if(ret != OK) 983 return ret; 984 ps_cur_deblk_mb->u1_mb_qp = 0; 985 } 986 else 987 { 988 if(u1_mb_type == u1_mb_threshold) 989 ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB; 990 else 991 ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB; 992 993 ret = ih264d_parse_imb_cabac( 994 ps_dec, ps_cur_mb_info, 995 (UWORD8)(u1_mb_type - u1_mb_threshold)); 996 if(ret != OK) 997 return ret; 998 ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; 999 } 1000 ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB; 1001 1002 } 1003 1004 } 1005 1006 if(u1_mbaff) 1007 { 1008 ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info); 1009 } 1010 /* Next macroblock information */ 1011 i2_cur_mb_addr++; 1012 1013 if(ps_cur_mb_info->u1_topmb && u1_mbaff) 1014 uc_more_data_flag = 1; 1015 else 1016 { 1017 uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env, 1018 ps_bitstrm); 1019 uc_more_data_flag = !uc_more_data_flag; 1020 COPYTHECONTEXT("Decode Sliceterm",!uc_more_data_flag); 1021 } 1022 1023 u1_num_mbs++; 1024 ps_dec->u2_total_mbs_coded++; 1025 u1_num_mbsNby2++; 1026 ps_parse_mb_data++; 1027 1028 /****************************************************************/ 1029 /* Check for End Of Row and other flags that determine when to */ 1030 /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for */ 1031 /* N-Mb */ 1032 /****************************************************************/ 1033 u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1; 1034 u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01))); 1035 u1_slice_end = !uc_more_data_flag; 1036 u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row 1037 || u1_slice_end; 1038 u1_decode_nmb = u1_tfr_n_mb || u1_slice_end; 1039 ps_cur_mb_info->u1_end_of_slice = u1_slice_end; 1040 /*u1_dma_nby2mb = u1_decode_nmb || 1041 (u1_num_mbsNby2 == ps_dec->u1_recon_mb_grp_pair);*/ 1042 1043 //if(u1_dma_nby2mb) 1044 if(u1_decode_nmb) 1045 { 1046 1047 ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs); 1048 u1_num_mbsNby2 = 0; 1049 1050 { 1051 ps_parse_mb_data = ps_dec->ps_parse_mb_data; 1052 ps_dec->ps_part = ps_dec->ps_parse_part_params; 1053 } 1054 } 1055 1056 /*H264_DEC_DEBUG_PRINT("Pic: %d Mb_X=%d Mb_Y=%d", 1057 ps_slice->i4_poc >> ps_slice->u1_field_pic_flag, 1058 ps_dec->u2_mbx,ps_dec->u2_mby + (1 - ps_cur_mb_info->u1_topmb)); 1059 H264_DEC_DEBUG_PRINT("u1_decode_nmb: %d, u1_num_mbs: %d", u1_decode_nmb, u1_num_mbs);*/ 1060 if(u1_decode_nmb) 1061 { 1062 1063 if(ps_dec->u1_separate_parse) 1064 { 1065 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, 1066 u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row); 1067 ps_dec->ps_nmb_info += u1_num_mbs; 1068 } 1069 else 1070 { 1071 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, 1072 u1_num_mbs_next, u1_tfr_n_mb, 1073 u1_end_of_row); 1074 } 1075 1076 if(u1_tfr_n_mb) 1077 u1_num_mbs = 0; 1078 u1_mb_idx = u1_num_mbs; 1079 ps_dec->u1_mb_idx = u1_num_mbs; 1080 1081 } 1082 } 1083 1084 1085 ps_dec->u4_num_mbs_cur_nmb = 0; 1086 ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr 1087 1088 - (u2_first_mb_in_slice << u1_mbaff); 1089 1090 return ret; 1091 } 1092 1093 /*****************************************************************************/ 1094 /* */ 1095 /* Function Name : ih264d_parse_inter_slice_data_cavlc */ 1096 /* */ 1097 /* Description : This function parses cavlc syntax of a inter slice on */ 1098 /* N MB basis. */ 1099 /* */ 1100 /* Inputs : ps_dec */ 1101 /* sliceparams */ 1102 /* firstMbInSlice */ 1103 /* */ 1104 /* Processing : 1. After parsing syntax for N MBs those N MBs are */ 1105 /* decoded till the end of slice. */ 1106 /* 2. MV prediction and DMA happens on a N/2 MB basis. */ 1107 /* */ 1108 /* Returns : 0 */ 1109 /* */ 1110 /* Issues : <List any issues or problems with this function> */ 1111 /* */ 1112 /* Revision History: */ 1113 /* */ 1114 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1115 /* 13 07 2002 Jay Draft */ 1116 /* */ 1117 /*****************************************************************************/ 1118 1119 WORD32 ih264d_parse_inter_slice_data_cavlc(dec_struct_t * ps_dec, 1120 dec_slice_params_t * ps_slice, 1121 UWORD16 u2_first_mb_in_slice) 1122 { 1123 UWORD32 uc_more_data_flag; 1124 WORD32 i2_cur_mb_addr; 1125 UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx; 1126 UWORD32 i2_mb_skip_run; 1127 UWORD32 u1_read_mb_type; 1128 1129 UWORD32 u1_mbaff; 1130 UWORD32 u1_num_mbs_next, u1_end_of_row; 1131 const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs; 1132 UWORD32 u1_slice_end = 0; 1133 UWORD32 u1_tfr_n_mb = 0; 1134 UWORD32 u1_decode_nmb = 0; 1135 1136 dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; 1137 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 1138 UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; 1139 deblk_mb_t *ps_cur_deblk_mb; 1140 dec_mb_info_t *ps_cur_mb_info; 1141 parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data; 1142 UWORD32 u1_inter_mb_type; 1143 UWORD32 u1_deblk_mb_type; 1144 UWORD32 u1_mb_threshold; 1145 WORD32 ret = OK; 1146 1147 /******************************************************/ 1148 /* Initialisations specific to B or P slice */ 1149 /******************************************************/ 1150 1151 if(ps_slice->u1_slice_type == P_SLICE) 1152 { 1153 u1_inter_mb_type = P_MB; 1154 u1_deblk_mb_type = D_INTER_MB; 1155 u1_mb_threshold = 5; 1156 } 1157 else // B_SLICE 1158 { 1159 u1_inter_mb_type = B_MB; 1160 u1_deblk_mb_type = D_B_SLICE; 1161 u1_mb_threshold = 23; 1162 } 1163 /******************************************************/ 1164 /* Slice Level Initialisations */ 1165 /******************************************************/ 1166 ps_dec->u1_qp = ps_slice->u1_slice_qp; 1167 ih264d_update_qp(ps_dec, 0); 1168 u1_mb_idx = ps_dec->u1_mb_idx; 1169 u1_num_mbs = u1_mb_idx; 1170 1171 u1_num_mbsNby2 = 0; 1172 u1_mbaff = ps_slice->u1_mbaff_frame_flag; 1173 i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff; 1174 i2_mb_skip_run = 0; 1175 uc_more_data_flag = 1; 1176 u1_read_mb_type = 0; 1177 1178 while(!u1_slice_end) 1179 { 1180 UWORD8 u1_mb_type; 1181 1182 ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data; 1183 1184 if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr) 1185 { 1186 ret = ERROR_MB_ADDRESS_T; 1187 break; 1188 } 1189 1190 1191 ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs; 1192 ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs; 1193 1194 ps_cur_mb_info->u1_Mux = 0; 1195 ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff); 1196 ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs; 1197 1198 ps_cur_mb_info->u1_end_of_slice = 0; 1199 1200 /* Storing Default partition info */ 1201 ps_parse_mb_data->u1_num_part = 1; 1202 ps_parse_mb_data->u1_isI_mb = 0; 1203 1204 if((!i2_mb_skip_run) && (!u1_read_mb_type)) 1205 { 1206 1207 //Inlined ih264d_uev 1208 UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; 1209 UWORD32 u4_word, u4_ldz; 1210 1211 /***************************************************************/ 1212 /* Find leading zeros in next 32 bits */ 1213 /***************************************************************/ 1214 NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); 1215 1216 u4_ldz = CLZ(u4_word); 1217 1218 /* Flush the ps_bitstrm */ 1219 u4_bitstream_offset += (u4_ldz + 1); 1220 /* Read the suffix from the ps_bitstrm */ 1221 u4_word = 0; 1222 if(u4_ldz) 1223 { 1224 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, 1225 u4_ldz); 1226 } 1227 *pu4_bitstrm_ofst = u4_bitstream_offset; 1228 i2_mb_skip_run = ((1 << u4_ldz) + u4_word - 1); 1229 //Inlined ih264d_uev 1230 COPYTHECONTEXT("mb_skip_run", i2_mb_skip_run); 1231 uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm); 1232 u1_read_mb_type = uc_more_data_flag; 1233 } 1234 1235 /***************************************************************/ 1236 /* Get the required information for decoding of MB */ 1237 /* mb_x, mb_y , neighbour availablity, */ 1238 /***************************************************************/ 1239 ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run); 1240 1241 /***************************************************************/ 1242 /* Set the deblocking parameters for this MB */ 1243 /***************************************************************/ 1244 if(ps_dec->u4_app_disable_deblk_frm == 0) 1245 ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice, 1246 ps_dec->u1_mb_ngbr_availablity, 1247 ps_dec->u1_cur_mb_fld_dec_flag); 1248 1249 if(i2_mb_skip_run) 1250 { 1251 /* Set appropriate flags in ps_cur_mb_info and ps_dec */ 1252 ps_dec->i1_prev_mb_qp_delta = 0; 1253 ps_dec->u1_sub_mb_num = 0; 1254 ps_cur_mb_info->u1_mb_type = MB_SKIP; 1255 ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16; 1256 ps_cur_mb_info->u1_cbp = 0; 1257 1258 { 1259 /* Storing Skip partition info */ 1260 parse_part_params_t *ps_part_info = ps_dec->ps_part; 1261 ps_part_info->u1_is_direct = PART_DIRECT_16x16; 1262 ps_part_info->u1_sub_mb_num = 0; 1263 ps_dec->ps_part++; 1264 } 1265 1266 /* Update Nnzs */ 1267 ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC); 1268 1269 ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type; 1270 ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type; 1271 1272 i2_mb_skip_run--; 1273 } 1274 else 1275 { 1276 u1_read_mb_type = 0; 1277 /**************************************************************/ 1278 /* Macroblock Layer Begins, Decode the u1_mb_type */ 1279 /**************************************************************/ 1280 { 1281 UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; 1282 UWORD32 u4_word, u4_ldz, u4_temp; 1283 1284 1285 //Inlined ih264d_uev 1286 /***************************************************************/ 1287 /* Find leading zeros in next 32 bits */ 1288 /***************************************************************/ 1289 NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); 1290 u4_ldz = CLZ(u4_word); 1291 /* Flush the ps_bitstrm */ 1292 u4_bitstream_offset += (u4_ldz + 1); 1293 /* Read the suffix from the ps_bitstrm */ 1294 u4_word = 0; 1295 if(u4_ldz) 1296 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, 1297 u4_ldz); 1298 *pu4_bitstrm_ofst = u4_bitstream_offset; 1299 u4_temp = ((1 << u4_ldz) + u4_word - 1); 1300 //Inlined ih264d_uev 1301 if(u4_temp > (UWORD32)(25 + u1_mb_threshold)) 1302 return ERROR_MB_TYPE; 1303 u1_mb_type = u4_temp; 1304 COPYTHECONTEXT("u1_mb_type", u1_mb_type); 1305 } 1306 ps_cur_mb_info->u1_mb_type = u1_mb_type; 1307 1308 /**************************************************************/ 1309 /* Parse Macroblock data */ 1310 /**************************************************************/ 1311 if(u1_mb_type < u1_mb_threshold) 1312 { 1313 ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type; 1314 1315 ret = ps_dec->pf_parse_inter_mb(ps_dec, ps_cur_mb_info, u1_num_mbs, 1316 u1_num_mbsNby2); 1317 if(ret != OK) 1318 return ret; 1319 ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type; 1320 } 1321 else 1322 { 1323 /* Storing Intra partition info */ 1324 ps_parse_mb_data->u1_num_part = 0; 1325 ps_parse_mb_data->u1_isI_mb = 1; 1326 1327 if((25 + u1_mb_threshold) == u1_mb_type) 1328 { 1329 /* I_PCM_MB */ 1330 ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB; 1331 ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs); 1332 if(ret != OK) 1333 return ret; 1334 ps_dec->u1_qp = 0; 1335 } 1336 else 1337 { 1338 ret = ih264d_parse_imb_cavlc( 1339 ps_dec, ps_cur_mb_info, u1_num_mbs, 1340 (UWORD8)(u1_mb_type - u1_mb_threshold)); 1341 if(ret != OK) 1342 return ret; 1343 } 1344 1345 ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB; 1346 } 1347 uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm); 1348 } 1349 ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; 1350 1351 if(u1_mbaff) 1352 { 1353 ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info); 1354 } 1355 /**************************************************************/ 1356 /* Get next Macroblock address */ 1357 /**************************************************************/ 1358 i2_cur_mb_addr++; 1359 1360 u1_num_mbs++; 1361 ps_dec->u2_total_mbs_coded++; 1362 u1_num_mbsNby2++; 1363 ps_parse_mb_data++; 1364 1365 /****************************************************************/ 1366 /* Check for End Of Row and other flags that determine when to */ 1367 /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for */ 1368 /* N-Mb */ 1369 /****************************************************************/ 1370 u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1; 1371 u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01))); 1372 u1_slice_end = (!(uc_more_data_flag || i2_mb_skip_run)); 1373 u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row 1374 || u1_slice_end; 1375 u1_decode_nmb = u1_tfr_n_mb || u1_slice_end; 1376 ps_cur_mb_info->u1_end_of_slice = u1_slice_end; 1377 1378 /*u1_dma_nby2mb = u1_decode_nmb || 1379 (u1_num_mbsNby2 == ps_dec->u1_recon_mb_grp_pair);*/ 1380 1381 //if(u1_dma_nby2mb) 1382 if(u1_decode_nmb) 1383 { 1384 ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs); 1385 u1_num_mbsNby2 = 0; 1386 1387 { 1388 ps_parse_mb_data = ps_dec->ps_parse_mb_data; 1389 ps_dec->ps_part = ps_dec->ps_parse_part_params; 1390 } 1391 } 1392 1393 /*H264_DEC_DEBUG_PRINT("Pic: %d Mb_X=%d Mb_Y=%d", 1394 ps_slice->i4_poc >> ps_slice->u1_field_pic_flag, 1395 ps_dec->u2_mbx,ps_dec->u2_mby + (1 - ps_cur_mb_info->u1_topmb)); 1396 H264_DEC_DEBUG_PRINT("u1_decode_nmb: %d", u1_decode_nmb);*/ 1397 if(u1_decode_nmb) 1398 { 1399 1400 1401 1402 if(ps_dec->u1_separate_parse) 1403 { 1404 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, 1405 u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row); 1406 ps_dec->ps_nmb_info += u1_num_mbs; 1407 } 1408 else 1409 { 1410 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, 1411 u1_num_mbs_next, u1_tfr_n_mb, 1412 u1_end_of_row); 1413 } 1414 1415 if(u1_tfr_n_mb) 1416 u1_num_mbs = 0; 1417 u1_mb_idx = u1_num_mbs; 1418 ps_dec->u1_mb_idx = u1_num_mbs; 1419 1420 } 1421 //ps_dec->ps_pred++; 1422 } 1423 1424 ps_dec->u4_num_mbs_cur_nmb = 0; 1425 ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr 1426 - (u2_first_mb_in_slice << u1_mbaff); 1427 1428 1429 return ret; 1430 } 1431 1432 WORD32 ih264d_mark_err_slice_skip(dec_struct_t * ps_dec, 1433 WORD32 num_mb_skip, 1434 UWORD8 u1_is_idr_slice, 1435 UWORD16 u2_frame_num, 1436 pocstruct_t *ps_cur_poc, 1437 WORD32 prev_slice_err) 1438 { 1439 WORD32 i2_cur_mb_addr; 1440 UWORD32 u1_num_mbs, u1_num_mbsNby2; 1441 UWORD32 u1_mb_idx = ps_dec->u1_mb_idx; 1442 UWORD32 i2_mb_skip_run; 1443 1444 UWORD32 u1_num_mbs_next, u1_end_of_row; 1445 const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs; 1446 UWORD32 u1_slice_end; 1447 UWORD32 u1_tfr_n_mb; 1448 UWORD32 u1_decode_nmb; 1449 dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; 1450 dec_slice_params_t * ps_slice = ps_dec->ps_cur_slice; 1451 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 1452 UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; 1453 deblk_mb_t *ps_cur_deblk_mb; 1454 dec_mb_info_t *ps_cur_mb_info; 1455 parse_pmbarams_t *ps_parse_mb_data; 1456 UWORD32 u1_inter_mb_type; 1457 UWORD32 u1_deblk_mb_type; 1458 UWORD16 u2_total_mbs_coded; 1459 UWORD32 u1_mbaff = ps_slice->u1_mbaff_frame_flag; 1460 parse_part_params_t *ps_part_info; 1461 WORD32 ret; 1462 1463 1464 if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC) 1465 { 1466 ih264d_err_pic_dispbuf_mgr(ps_dec); 1467 return 0; 1468 } 1469 1470 if(prev_slice_err == 1) 1471 { 1472 /* first slice - missing/header corruption */ 1473 ps_dec->ps_cur_slice->u2_frame_num = u2_frame_num; 1474 1475 1476 if(!ps_dec->u1_first_slice_in_stream) 1477 { 1478 ih264d_end_of_pic(ps_dec, u1_is_idr_slice, 1479 ps_dec->ps_cur_slice->u2_frame_num); 1480 ps_dec->s_cur_pic_poc.u2_frame_num = 1481 ps_dec->ps_cur_slice->u2_frame_num; 1482 } 1483 1484 { 1485 WORD32 i, j, poc = 0; 1486 1487 ps_dec->ps_cur_slice->u2_first_mb_in_slice = 0; 1488 1489 ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff; 1490 ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp; 1491 ps_dec->p_motion_compensate = ih264d_motion_compensate_bp; 1492 1493 if(ps_dec->ps_cur_pic != NULL) 1494 poc = ps_dec->ps_cur_pic->i4_poc + 2; 1495 1496 j = 0; 1497 for(i = 0; i < MAX_NUM_PIC_PARAMS; i++) 1498 if(ps_dec->ps_pps[i].u1_is_valid == TRUE) 1499 j = i; 1500 { 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 } 1554 else 1555 { 1556 // Middle / last slice 1557 1558 dec_slice_struct_t *ps_parse_cur_slice; 1559 ps_parse_cur_slice = ps_dec->ps_dec_slice_buf + ps_dec->u2_cur_slice_num; 1560 1561 if(ps_dec->u1_slice_header_done 1562 && ps_parse_cur_slice == ps_dec->ps_parse_cur_slice) 1563 { 1564 // Slice data corrupted 1565 u1_num_mbs = ps_dec->u4_num_mbs_cur_nmb; 1566 1567 if(u1_num_mbs) 1568 { 1569 ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs - 1; 1570 } 1571 else 1572 { 1573 if(ps_dec->u1_separate_parse) 1574 { 1575 ps_cur_mb_info = ps_dec->ps_nmb_info - 1; 1576 } 1577 else 1578 { 1579 ps_cur_mb_info = ps_dec->ps_nmb_info 1580 + ps_dec->u4_num_mbs_prev_nmb - 1; 1581 } 1582 } 1583 1584 ps_dec->u2_mby = ps_cur_mb_info->u2_mby; 1585 ps_dec->u2_mbx = ps_cur_mb_info->u2_mbx; 1586 1587 ps_dec->u1_mb_ngbr_availablity = 1588 ps_cur_mb_info->u1_mb_ngbr_availablity; 1589 1590 // Going back 1 mb 1591 ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_prev_mb_parse_tu_coeff_data; 1592 ps_dec->u2_cur_mb_addr--; 1593 ps_dec->i4_submb_ofst -= SUB_BLK_SIZE; 1594 1595 if(u1_num_mbs) 1596 { 1597 // Parse/decode N-MB left unparsed 1598 if (ps_dec->u1_pr_sl_type == P_SLICE 1599 || ps_dec->u1_pr_sl_type == B_SLICE) 1600 { 1601 ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs); 1602 ps_dec->ps_part = ps_dec->ps_parse_part_params; 1603 } 1604 1605 u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1; 1606 u1_end_of_row = (!u1_num_mbs_next) 1607 && (!(u1_mbaff && (u1_num_mbs & 0x01))); 1608 u1_slice_end = 1; 1609 u1_tfr_n_mb = 1; 1610 ps_cur_mb_info->u1_end_of_slice = u1_slice_end; 1611 1612 if(ps_dec->u1_separate_parse) 1613 { 1614 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, 1615 u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row); 1616 ps_dec->ps_nmb_info += u1_num_mbs; 1617 } 1618 else 1619 { 1620 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, 1621 u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row); 1622 } 1623 1624 ps_dec->u1_mb_idx = 0; 1625 ps_dec->u4_num_mbs_cur_nmb = 0; 1626 } 1627 1628 if(ps_dec->u2_total_mbs_coded 1629 >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) 1630 { 1631 ps_dec->u1_pic_decode_done = 1; 1632 return 0; 1633 } 1634 1635 // Inserting new slice 1636 ps_dec->u2_cur_slice_num++; 1637 ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx; 1638 ps_dec->i2_prev_slice_mby = ps_dec->u2_mby; 1639 ps_dec->ps_parse_cur_slice++; 1640 1641 } 1642 else 1643 { 1644 // Slice missing / header corrupted 1645 ps_dec->ps_parse_cur_slice = ps_dec->ps_dec_slice_buf 1646 + ps_dec->u2_cur_slice_num; 1647 } 1648 } 1649 1650 /******************************************************/ 1651 /* Initializations to new slice */ 1652 /******************************************************/ 1653 { 1654 WORD32 num_entries; 1655 WORD32 size; 1656 UWORD8 *pu1_buf; 1657 1658 num_entries = MIN(MAX_FRAMES, ps_dec->u4_num_ref_frames_at_init); 1659 num_entries = 2 * ((2 * num_entries) + 1); 1660 1661 size = num_entries * sizeof(void *); 1662 size += PAD_MAP_IDX_POC * sizeof(void *); 1663 1664 pu1_buf = (UWORD8 *)ps_dec->pv_map_ref_idx_to_poc_buf; 1665 pu1_buf += size * ps_dec->u2_cur_slice_num; 1666 ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = (volatile void **)pu1_buf; 1667 } 1668 1669 ps_dec->ps_cur_slice->u2_first_mb_in_slice = ps_dec->u2_total_mbs_coded << u1_mbaff; 1670 if(ps_dec->ps_cur_slice->u1_field_pic_flag) 1671 ps_dec->u2_prv_frame_num = ps_dec->ps_cur_slice->u2_frame_num; 1672 1673 ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice = ps_dec->u2_total_mbs_coded << u1_mbaff; 1674 ps_dec->ps_parse_cur_slice->u2_log2Y_crwd = ps_dec->ps_cur_slice->u2_log2Y_crwd; 1675 1676 1677 if(ps_dec->u1_separate_parse) 1678 { 1679 ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data; 1680 } 1681 else 1682 { 1683 ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data; 1684 } 1685 1686 /******************************************************/ 1687 /* Initializations specific to P slice */ 1688 /******************************************************/ 1689 u1_inter_mb_type = P_MB; 1690 u1_deblk_mb_type = D_INTER_MB; 1691 1692 ps_dec->ps_cur_slice->u1_slice_type = P_SLICE; 1693 ps_dec->ps_parse_cur_slice->slice_type = P_SLICE; 1694 ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb; 1695 ps_dec->ps_part = ps_dec->ps_parse_part_params; 1696 1697 /******************************************************/ 1698 /* Parsing / decoding the slice */ 1699 /******************************************************/ 1700 ps_dec->u1_slice_header_done = 2; 1701 ps_dec->u1_qp = ps_slice->u1_slice_qp; 1702 ih264d_update_qp(ps_dec, 0); 1703 u1_mb_idx = ps_dec->u1_mb_idx; 1704 ps_parse_mb_data = ps_dec->ps_parse_mb_data; 1705 u1_num_mbs = u1_mb_idx; 1706 1707 u1_slice_end = 0; 1708 u1_tfr_n_mb = 0; 1709 u1_decode_nmb = 0; 1710 u1_num_mbsNby2 = 0; 1711 i2_cur_mb_addr = ps_dec->u2_total_mbs_coded; 1712 i2_mb_skip_run = num_mb_skip; 1713 1714 while(!u1_slice_end) 1715 { 1716 UWORD8 u1_mb_type; 1717 1718 if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr) 1719 break; 1720 1721 ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs; 1722 ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs; 1723 1724 ps_cur_mb_info->u1_Mux = 0; 1725 ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff); 1726 ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs; 1727 1728 ps_cur_mb_info->u1_end_of_slice = 0; 1729 1730 /* Storing Default partition info */ 1731 ps_parse_mb_data->u1_num_part = 1; 1732 ps_parse_mb_data->u1_isI_mb = 0; 1733 1734 /**************************************************************/ 1735 /* Get the required information for decoding of MB */ 1736 /**************************************************************/ 1737 /* mb_x, mb_y, neighbor availablity, */ 1738 if (u1_mbaff) 1739 ih264d_get_mb_info_cavlc_mbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run); 1740 else 1741 ih264d_get_mb_info_cavlc_nonmbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run); 1742 1743 /* Set the deblocking parameters for this MB */ 1744 if(ps_dec->u4_app_disable_deblk_frm == 0) 1745 { 1746 ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice, 1747 ps_dec->u1_mb_ngbr_availablity, 1748 ps_dec->u1_cur_mb_fld_dec_flag); 1749 } 1750 1751 /* Set appropriate flags in ps_cur_mb_info and ps_dec */ 1752 ps_dec->i1_prev_mb_qp_delta = 0; 1753 ps_dec->u1_sub_mb_num = 0; 1754 ps_cur_mb_info->u1_mb_type = MB_SKIP; 1755 ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16; 1756 ps_cur_mb_info->u1_cbp = 0; 1757 1758 /* Storing Skip partition info */ 1759 ps_part_info = ps_dec->ps_part; 1760 ps_part_info->u1_is_direct = PART_DIRECT_16x16; 1761 ps_part_info->u1_sub_mb_num = 0; 1762 ps_dec->ps_part++; 1763 1764 /* Update Nnzs */ 1765 ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC); 1766 1767 ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type; 1768 ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type; 1769 1770 i2_mb_skip_run--; 1771 1772 ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; 1773 1774 if (u1_mbaff) 1775 { 1776 ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info); 1777 } 1778 1779 /**************************************************************/ 1780 /* Get next Macroblock address */ 1781 /**************************************************************/ 1782 i2_cur_mb_addr++; 1783 1784 u1_num_mbs++; 1785 ps_dec->u2_total_mbs_coded++; 1786 u1_num_mbsNby2++; 1787 ps_parse_mb_data++; 1788 1789 /****************************************************************/ 1790 /* Check for End Of Row and other flags that determine when to */ 1791 /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for */ 1792 /* N-Mb */ 1793 /****************************************************************/ 1794 u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1; 1795 u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01))); 1796 u1_slice_end = !i2_mb_skip_run; 1797 u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row 1798 || u1_slice_end; 1799 u1_decode_nmb = u1_tfr_n_mb || u1_slice_end; 1800 ps_cur_mb_info->u1_end_of_slice = u1_slice_end; 1801 1802 if(u1_decode_nmb) 1803 { 1804 ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs); 1805 u1_num_mbsNby2 = 0; 1806 1807 ps_parse_mb_data = ps_dec->ps_parse_mb_data; 1808 ps_dec->ps_part = ps_dec->ps_parse_part_params; 1809 1810 if(ps_dec->u1_separate_parse) 1811 { 1812 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, 1813 u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row); 1814 ps_dec->ps_nmb_info += u1_num_mbs; 1815 } 1816 else 1817 { 1818 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, 1819 u1_tfr_n_mb, u1_end_of_row); 1820 } 1821 1822 if(u1_tfr_n_mb) 1823 u1_num_mbs = 0; 1824 u1_mb_idx = u1_num_mbs; 1825 ps_dec->u1_mb_idx = u1_num_mbs; 1826 } 1827 } 1828 1829 ps_dec->u4_num_mbs_cur_nmb = 0; 1830 ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr 1831 - ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice; 1832 1833 H264_DEC_DEBUG_PRINT("Mbs in slice: %d\n", ps_dec->ps_cur_slice->u4_mbs_in_slice); 1834 1835 ps_dec->u2_cur_slice_num++; 1836 1837 /* incremented here only if first slice is inserted */ 1838 if(ps_dec->u4_first_slice_in_pic != 0) 1839 ps_dec->ps_parse_cur_slice++; 1840 1841 ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx; 1842 ps_dec->i2_prev_slice_mby = ps_dec->u2_mby; 1843 1844 if(ps_dec->u2_total_mbs_coded 1845 >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) 1846 { 1847 ps_dec->u1_pic_decode_done = 1; 1848 } 1849 1850 return 0; 1851 1852 } 1853 1854 /*! 1855 ************************************************************************** 1856 * \if Function name : ih264d_decode_pslice \endif 1857 * 1858 * \brief 1859 * Decodes a P Slice 1860 * 1861 * 1862 * \return 1863 * 0 on Success and Error code otherwise 1864 ************************************************************************** 1865 */ 1866 WORD32 ih264d_parse_pslice(dec_struct_t *ps_dec, UWORD16 u2_first_mb_in_slice) 1867 { 1868 dec_pic_params_t * ps_pps = ps_dec->ps_cur_pps; 1869 dec_slice_params_t * ps_cur_slice = ps_dec->ps_cur_slice; 1870 dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm; 1871 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 1872 UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; 1873 UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; //ps_dec->ps_cur_sps->u1_mb_aff_flag; 1874 UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag; 1875 1876 UWORD32 u4_temp; 1877 WORD32 i_temp; 1878 WORD32 ret; 1879 1880 /*--------------------------------------------------------------------*/ 1881 /* Read remaining contents of the slice header */ 1882 /*--------------------------------------------------------------------*/ 1883 { 1884 WORD8 *pi1_buf; 1885 WORD16 *pi2_mv = ps_dec->s_default_mv_pred.i2_mv; 1886 WORD32 *pi4_mv = (WORD32*)pi2_mv; 1887 WORD16 *pi16_refFrame; 1888 1889 pi1_buf = ps_dec->s_default_mv_pred.i1_ref_frame; 1890 pi16_refFrame = (WORD16*)pi1_buf; 1891 *pi4_mv = 0; 1892 *(pi4_mv + 1) = 0; 1893 *pi16_refFrame = OUT_OF_RANGE_REF; 1894 ps_dec->s_default_mv_pred.u1_col_ref_pic_idx = (UWORD8)-1; 1895 ps_dec->s_default_mv_pred.u1_pic_type = (UWORD8)-1; 1896 } 1897 1898 ps_cur_slice->u1_num_ref_idx_active_override_flag = ih264d_get_bit_h264( 1899 ps_bitstrm); 1900 1901 COPYTHECONTEXT("SH: num_ref_idx_override_flag", 1902 ps_cur_slice->u1_num_ref_idx_active_override_flag); 1903 1904 u4_temp = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[0]; 1905 if(ps_cur_slice->u1_num_ref_idx_active_override_flag) 1906 { 1907 u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf) + 1; 1908 } 1909 1910 { 1911 1912 1913 1914 UWORD8 u1_max_ref_idx = MAX_FRAMES << u1_field_pic_flag; 1915 if(u4_temp > u1_max_ref_idx) 1916 { 1917 return ERROR_NUM_REF; 1918 } 1919 ps_cur_slice->u1_num_ref_idx_lx_active[0] = u4_temp; 1920 COPYTHECONTEXT("SH: num_ref_idx_l0_active_minus1", 1921 ps_cur_slice->u1_num_ref_idx_lx_active[0] - 1); 1922 1923 } 1924 1925 { 1926 UWORD8 uc_refIdxReFlagL0 = ih264d_get_bit_h264(ps_bitstrm); 1927 COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l0",uc_refIdxReFlagL0); 1928 1929 /* Initialize the Reference list once in Picture if the slice type */ 1930 /* of first slice is between 5 to 9 defined in table 7.3 of standard */ 1931 /* If picture contains both P & B slices then Initialize the Reference*/ 1932 /* List only when it switches from P to B and B to P */ 1933 { 1934 UWORD8 init_idx_flg = (ps_dec->u1_pr_sl_type 1935 != ps_dec->ps_cur_slice->u1_slice_type); 1936 if(ps_dec->u1_first_pb_nal_in_pic 1937 || (init_idx_flg & !ps_dec->u1_sl_typ_5_9) 1938 || ps_dec->u1_num_ref_idx_lx_active_prev 1939 != ps_cur_slice->u1_num_ref_idx_lx_active[0]) 1940 { 1941 ih264d_init_ref_idx_lx_p(ps_dec); 1942 } 1943 if(ps_dec->u1_first_pb_nal_in_pic & ps_dec->u1_sl_typ_5_9) 1944 ps_dec->u1_first_pb_nal_in_pic = 0; 1945 } 1946 /* Store the value for future slices in the same picture */ 1947 ps_dec->u1_num_ref_idx_lx_active_prev = 1948 ps_cur_slice->u1_num_ref_idx_lx_active[0]; 1949 1950 /* Modified temporarily */ 1951 if(uc_refIdxReFlagL0) 1952 { 1953 WORD8 ret; 1954 ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0]; 1955 ret = ih264d_ref_idx_reordering(ps_dec, 0); 1956 if(ret == -1) 1957 return ERROR_REFIDX_ORDER_T; 1958 ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0]; 1959 } 1960 else 1961 ps_dec->ps_ref_pic_buf_lx[0] = 1962 ps_dec->ps_dpb_mgr->ps_init_dpb[0]; 1963 } 1964 /* Create refIdx to POC mapping */ 1965 { 1966 void **pui_map_ref_idx_to_poc_lx0, **pui_map_ref_idx_to_poc_lx1; 1967 WORD8 idx; 1968 struct pic_buffer_t *ps_pic; 1969 1970 pui_map_ref_idx_to_poc_lx0 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L0; 1971 pui_map_ref_idx_to_poc_lx0[0] = 0; //For ref_idx = -1 1972 pui_map_ref_idx_to_poc_lx0++; 1973 for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++) 1974 { 1975 ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx]; 1976 pui_map_ref_idx_to_poc_lx0[idx] = (ps_pic->pu1_buf1); 1977 } 1978 1979 /* Bug Fix Deblocking */ 1980 pui_map_ref_idx_to_poc_lx1 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L1; 1981 pui_map_ref_idx_to_poc_lx1[0] = 0; 1982 1983 if(u1_mbaff) 1984 { 1985 void **ppv_map_ref_idx_to_poc_lx_t, **ppv_map_ref_idx_to_poc_lx_b; 1986 void **ppv_map_ref_idx_to_poc_lx_t1, **ppv_map_ref_idx_to_poc_lx_b1; 1987 ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc 1988 + TOP_LIST_FLD_L0; 1989 ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc 1990 + BOT_LIST_FLD_L0; 1991 1992 ppv_map_ref_idx_to_poc_lx_t[0] = 0; // For ref_idx = -1 1993 ppv_map_ref_idx_to_poc_lx_t++; 1994 ppv_map_ref_idx_to_poc_lx_b[0] = 0; // For ref_idx = -1 1995 ppv_map_ref_idx_to_poc_lx_b++; 1996 1997 idx = 0; 1998 for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++) 1999 { 2000 ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx]; 2001 ppv_map_ref_idx_to_poc_lx_t[0] = (ps_pic->pu1_buf1); 2002 ppv_map_ref_idx_to_poc_lx_b[1] = (ps_pic->pu1_buf1); 2003 2004 ppv_map_ref_idx_to_poc_lx_b[0] = (ps_pic->pu1_buf1) + 1; 2005 ppv_map_ref_idx_to_poc_lx_t[1] = (ps_pic->pu1_buf1) + 1; 2006 2007 ppv_map_ref_idx_to_poc_lx_t += 2; 2008 ppv_map_ref_idx_to_poc_lx_b += 2; 2009 } 2010 ppv_map_ref_idx_to_poc_lx_t1 = ps_dec->ppv_map_ref_idx_to_poc 2011 + TOP_LIST_FLD_L1; 2012 ppv_map_ref_idx_to_poc_lx_t1[0] = 0; 2013 ppv_map_ref_idx_to_poc_lx_b1 = ps_dec->ppv_map_ref_idx_to_poc 2014 + BOT_LIST_FLD_L1; 2015 ppv_map_ref_idx_to_poc_lx_b1[0] = 0; 2016 2017 } 2018 2019 if(ps_dec->u4_num_cores >= 3) 2020 { 2021 WORD32 num_entries; 2022 WORD32 size; 2023 2024 num_entries = MIN(MAX_FRAMES, ps_dec->u4_num_ref_frames_at_init); 2025 num_entries = 2 * ((2 * num_entries) + 1); 2026 2027 size = num_entries * sizeof(void *); 2028 size += PAD_MAP_IDX_POC * sizeof(void *); 2029 2030 memcpy((void *)ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc, 2031 ps_dec->ppv_map_ref_idx_to_poc, 2032 size); 2033 } 2034 2035 2036 } 2037 if(ps_pps->u1_wted_pred_flag) 2038 { 2039 ret = ih264d_parse_pred_weight_table(ps_cur_slice, ps_bitstrm); 2040 if(ret != OK) 2041 return ret; 2042 ih264d_form_pred_weight_matrix(ps_dec); 2043 ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat; 2044 } 2045 else 2046 { 2047 ps_dec->ps_cur_slice->u2_log2Y_crwd = 0; 2048 ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat; 2049 } 2050 2051 ps_dec->ps_parse_cur_slice->u2_log2Y_crwd = 2052 ps_dec->ps_cur_slice->u2_log2Y_crwd; 2053 2054 if(u1_mbaff && (u1_field_pic_flag == 0)) 2055 { 2056 ih264d_convert_frm_mbaff_list(ps_dec); 2057 } 2058 2059 /* G050 */ 2060 if(ps_cur_slice->u1_nal_ref_idc != 0) 2061 { 2062 if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read) 2063 ps_dec->u4_bitoffset = ih264d_read_mmco_commands(ps_dec); 2064 else 2065 ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset; 2066 2067 } 2068 /* G050 */ 2069 2070 if(ps_pps->u1_entropy_coding_mode == CABAC) 2071 { 2072 u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); 2073 2074 if(u4_temp > MAX_CABAC_INIT_IDC) 2075 { 2076 return ERROR_INV_SLICE_HDR_T; 2077 } 2078 ps_cur_slice->u1_cabac_init_idc = u4_temp; 2079 COPYTHECONTEXT("SH: cabac_init_idc",ps_cur_slice->u1_cabac_init_idc); 2080 } 2081 2082 /* Read slice_qp_delta */ 2083 i_temp = ps_pps->u1_pic_init_qp 2084 + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); 2085 if((i_temp < 0) || (i_temp > 51)) 2086 { 2087 return ERROR_INV_RANGE_QP_T; 2088 } 2089 ps_cur_slice->u1_slice_qp = i_temp; 2090 COPYTHECONTEXT("SH: slice_qp_delta", 2091 (WORD8)(ps_cur_slice->u1_slice_qp - ps_pps->u1_pic_init_qp)); 2092 2093 if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1) 2094 { 2095 u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); 2096 if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED) 2097 { 2098 return ERROR_INV_SLICE_HDR_T; 2099 } 2100 2101 COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp); 2102 ps_cur_slice->u1_disable_dblk_filter_idc = u4_temp; 2103 if(u4_temp != 1) 2104 { 2105 i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) 2106 << 1; 2107 if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF)) 2108 { 2109 return ERROR_INV_SLICE_HDR_T; 2110 } 2111 ps_cur_slice->i1_slice_alpha_c0_offset = i_temp; 2112 COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2", 2113 ps_cur_slice->i1_slice_alpha_c0_offset >> 1); 2114 2115 i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) 2116 << 1; 2117 if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF)) 2118 { 2119 return ERROR_INV_SLICE_HDR_T; 2120 } 2121 ps_cur_slice->i1_slice_beta_offset = i_temp; 2122 COPYTHECONTEXT("SH: slice_beta_offset_div2", 2123 ps_cur_slice->i1_slice_beta_offset >> 1); 2124 } 2125 else 2126 { 2127 ps_cur_slice->i1_slice_alpha_c0_offset = 0; 2128 ps_cur_slice->i1_slice_beta_offset = 0; 2129 } 2130 } 2131 else 2132 { 2133 ps_cur_slice->u1_disable_dblk_filter_idc = 0; 2134 ps_cur_slice->i1_slice_alpha_c0_offset = 0; 2135 ps_cur_slice->i1_slice_beta_offset = 0; 2136 } 2137 2138 ps_dec->u1_slice_header_done = 2; 2139 2140 if(ps_pps->u1_entropy_coding_mode) 2141 { 2142 SWITCHOFFTRACE; SWITCHONTRACECABAC; 2143 ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cabac; 2144 ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cabac; 2145 ih264d_init_cabac_contexts(P_SLICE, ps_dec); 2146 2147 if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag) 2148 ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff; 2149 else 2150 ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_nonmbaff; 2151 } 2152 else 2153 { 2154 SWITCHONTRACE; SWITCHOFFTRACECABAC; 2155 ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cavlc; 2156 ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cavlc; 2157 if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag) 2158 { 2159 ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff; 2160 } 2161 else 2162 ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_nonmbaff; 2163 } 2164 2165 ps_dec->u1_B = 0; 2166 ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb; 2167 ret = ps_dec->pf_parse_inter_slice(ps_dec, ps_cur_slice, u2_first_mb_in_slice); 2168 if(ret != OK) 2169 return ret; 2170 // ps_dec->curr_slice_in_error = 0 ; 2171 return OK; 2172 } 2173