ih264d_parse_cabac.c revision 8d3d303c7942ced6a987a52db8977d768dc3605f
1/****************************************************************************** 2 * 3 * Copyright (C) 2015 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ***************************************************************************** 18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19*/ 20/*! 21 *************************************************************************** 22 * \file ih264d_parse_cabac.c 23 * 24 * \brief 25 * This file contains cabac Residual decoding routines. 26 * 27 * \date 28 * 20/03/2003 29 * 30 * \author NS 31 *************************************************************************** 32 */ 33 34#include "ih264_typedefs.h" 35#include "ih264_macros.h" 36#include "ih264_platform_macros.h" 37#include "ih264d_defs.h" 38#include "ih264d_structs.h" 39 40#include "ih264d_cabac.h" 41#include "ih264d_bitstrm.h" 42#include "ih264d_parse_mb_header.h" 43#include "ih264d_debug.h" 44#include "ih264d_tables.h" 45#include "ih264d_error_handler.h" 46#include "ih264d_parse_cabac.h" 47#include "ih264d_parse_slice.h" 48#include "ih264d_tables.h" 49#include "ih264d_mb_utils.h" 50#include "ih264d_utils.h" 51 52/*! 53 ******************************************************************************** 54 * \if Function name : ih264d_read_coeff4x4_cabac \endif 55 * 56 * \brief This function encodes residual_block_cabac as defined in 7.3.5.3.2. 57 * 58 * \return 59 * Returns the index of last significant coeff. 60 * 61 ******************************************************************************** 62 */ 63 64UWORD8 ih264d_read_coeff4x4_cabac(dec_bit_stream_t *ps_bitstrm, 65 UWORD32 u4_ctxcat, 66 bin_ctxt_model_t *ps_ctxt_sig_coeff, 67 dec_struct_t *ps_dec, /*!< pointer to access global variables*/ 68 bin_ctxt_model_t *ps_ctxt_coded) 69{ 70 71 decoding_envirnoment_t *ps_cab_env = &ps_dec->s_cab_dec_env; 72 UWORD32 u4_coded_flag; 73 UWORD32 u4_offset, *pu4_buffer; 74 UWORD32 u4_code_int_range, u4_code_int_val_ofst; 75 tu_sblk4x4_coeff_data_t *ps_tu_4x4; 76 WORD16 *pi2_coeff_data; 77 WORD32 num_sig_coeffs = 0; 78 79 /*loading from strcuctures*/ 80 81 ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data; 82 ps_tu_4x4->u2_sig_coeff_map = 0; 83 pi2_coeff_data = &ps_tu_4x4->ai2_level[0]; 84 85 u4_offset = ps_bitstrm->u4_ofst; 86 pu4_buffer = ps_bitstrm->pu4_buffer; 87 88 u4_code_int_range = ps_cab_env->u4_code_int_range; 89 u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst; 90 91 { 92 93 /*inilined DecodeDecision_onebin begins*/ 94 95 { 96 97 UWORD32 u4_qnt_int_range, u4_int_range_lps; 98 UWORD32 u4_symbol, u1_mps_state; 99 100 UWORD32 table_lookup; 101 const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table; 102 UWORD32 u4_clz; 103 104 u1_mps_state = (ps_ctxt_coded->u1_mps_state); 105 u4_clz = CLZ(u4_code_int_range); 106 u4_qnt_int_range = u4_code_int_range << u4_clz; 107 u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3; 108 table_lookup = 109 pu4_table[(u1_mps_state << 2) + u4_qnt_int_range]; 110 u4_int_range_lps = table_lookup & 0xff; 111 u4_int_range_lps = u4_int_range_lps << (23 - u4_clz); 112 u4_code_int_range = u4_code_int_range - u4_int_range_lps; 113 u4_symbol = ((u1_mps_state >> 6) & 0x1); 114 u1_mps_state = (table_lookup >> 8) & 0x7F; 115 116 CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol, 117 u4_int_range_lps, u1_mps_state, table_lookup) 118 119 if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_8) 120 { 121 122 RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, 123 u4_offset, pu4_buffer) 124 } 125 126 ps_ctxt_coded->u1_mps_state = u1_mps_state; 127 u4_coded_flag = u4_symbol; 128 129 /*inilined DecodeDecision_onebin ends*/ 130 131 } 132 133 } 134 135 if(u4_coded_flag) 136 { 137 138 { 139 bin_ctxt_model_t *p_binCtxt_last, *p_binCtxt_last_org; 140 UWORD32 uc_last_coeff_idx; 141 UWORD32 uc_bin; 142 UWORD32 i; 143 WORD32 first_coeff_offset = 0; 144 145 if((u4_ctxcat == CHROMA_AC_CTXCAT) || (u4_ctxcat == LUMA_AC_CTXCAT)) 146 { 147 first_coeff_offset = 1; 148 } 149 150 i = 0; 151 if(u4_ctxcat == CHROMA_DC_CTXCAT) 152 { 153 uc_last_coeff_idx = 3; 154 } 155 else 156 { 157 UWORD32 u4_start; 158 u4_start = (u4_ctxcat & 1) + (u4_ctxcat >> 2); 159 uc_last_coeff_idx = 15 - u4_start; 160 } 161 p_binCtxt_last_org = ps_ctxt_sig_coeff 162 + LAST_COEFF_CTXT_MINUS_SIG_COEFF_CTXT; 163 164 do 165 { 166 167 /*inilined DecodeDecision_onebin begins*/ 168 { 169 170 UWORD32 u4_qnt_int_range, u4_int_range_lps; 171 UWORD32 u4_symbol, u1_mps_state; 172 UWORD32 table_lookup; 173 const UWORD32 *pu4_table = 174 (const UWORD32 *)ps_cab_env->cabac_table; 175 UWORD32 u4_clz; 176 177 u1_mps_state = (ps_ctxt_sig_coeff->u1_mps_state); 178 179 u4_clz = CLZ(u4_code_int_range); 180 181 u4_qnt_int_range = u4_code_int_range << u4_clz; 182 u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3; 183 184 table_lookup = pu4_table[(u1_mps_state << 2) 185 + u4_qnt_int_range]; 186 187 u4_int_range_lps = table_lookup & 0xff; 188 189 u4_int_range_lps = u4_int_range_lps << (23 - u4_clz); 190 u4_code_int_range = u4_code_int_range - u4_int_range_lps; 191 u4_symbol = ((u1_mps_state >> 6) & 0x1); 192 u1_mps_state = (table_lookup >> 8) & 0x7F; 193 194 CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, 195 u4_symbol, u4_int_range_lps, u1_mps_state, 196 table_lookup) 197 198 if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_14) 199 { 200 201 UWORD32 read_bits, u4_clz; 202 u4_clz = CLZ(u4_code_int_range); 203 NEXTBITS(read_bits, (u4_offset + 23), pu4_buffer, 204 u4_clz) 205 FLUSHBITS(u4_offset, (u4_clz)) 206 u4_code_int_range = u4_code_int_range << u4_clz; 207 u4_code_int_val_ofst = (u4_code_int_val_ofst << u4_clz) 208 | read_bits; 209 } 210 211 INC_BIN_COUNT( 212 ps_cab_env) 213 214 ps_ctxt_sig_coeff->u1_mps_state = u1_mps_state; 215 uc_bin = u4_symbol; 216 217 } 218 /*incrementing pointer to point to the context of the next bin*/ 219 ps_ctxt_sig_coeff++; 220 221 /*inilined DecodeDecision_onebin ends*/ 222 223 if(uc_bin) 224 { 225 num_sig_coeffs++; 226 SET_BIT(ps_tu_4x4->u2_sig_coeff_map, (i + first_coeff_offset)); 227 228 p_binCtxt_last = p_binCtxt_last_org + i; 229 230 /*inilined DecodeDecision_onebin begins*/ 231 232 { 233 234 UWORD32 u4_qnt_int_range, u4_int_range_lps; 235 UWORD32 u4_symbol, u1_mps_state; 236 UWORD32 table_lookup; 237 const UWORD32 *pu4_table = 238 (const UWORD32 *)ps_cab_env->cabac_table; 239 UWORD32 u4_clz; 240 241 u1_mps_state = (p_binCtxt_last->u1_mps_state); 242 243 u4_clz = CLZ(u4_code_int_range); 244 u4_qnt_int_range = u4_code_int_range << u4_clz; 245 u4_qnt_int_range = (u4_qnt_int_range >> 29) 246 & 0x3; 247 248 table_lookup = pu4_table[(u1_mps_state << 2) 249 + u4_qnt_int_range]; 250 u4_int_range_lps = table_lookup & 0xff; 251 252 u4_int_range_lps = u4_int_range_lps 253 << (23 - u4_clz); 254 255 u4_code_int_range = u4_code_int_range 256 - u4_int_range_lps; 257 u4_symbol = ((u1_mps_state >> 6) & 0x1); 258 u1_mps_state = (table_lookup >> 8) & 0x7F; 259 260 CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, 261 u4_symbol, u4_int_range_lps, 262 u1_mps_state, table_lookup) 263 264 INC_BIN_COUNT(ps_cab_env) 265 266 p_binCtxt_last->u1_mps_state = u1_mps_state; 267 uc_bin = u4_symbol; 268 269 } 270 271 /*inilined DecodeDecision_onebin ends*/ 272 if(uc_bin == 1) 273 goto label_read_levels; 274 275 } 276 277 i = i + 1; 278 279 } 280 while(i < uc_last_coeff_idx); 281 282 num_sig_coeffs++; 283 SET_BIT(ps_tu_4x4->u2_sig_coeff_map, (i + first_coeff_offset)); 284 285 label_read_levels: ; 286 287 } 288 289 /// VALUE of No of Coeff in BLOCK = i + 1 for second case else i; 290 291 /* Decode coeff_abs_level_minus1 and coeff_sign_flag */ 292 { 293 294 WORD32 i2_abs_lvl; 295 UWORD32 u1_abs_level_equal1 = 1, u1_abs_level_gt1 = 0; 296 297 UWORD32 u4_ctx_inc; 298 UWORD32 ui_prefix; 299 bin_ctxt_model_t *p_ctxt_abs_level; 300 301 302 p_ctxt_abs_level = ps_dec->p_coeff_abs_level_minus1_t[u4_ctxcat]; 303 u4_ctx_inc = ((0x51)); 304 305 /*****************************************************/ 306 /* Main Loop runs for no. of Significant coefficient */ 307 /*****************************************************/ 308 309 310 do 311 { 312 313 { 314 INC_SYM_COUNT(&(ps_dec.s_cab_dec_env)); 315 316 /*****************************************************/ 317 /* inilining a modified ih264d_decode_bins_unary */ 318 /*****************************************************/ 319 320 { 321 UWORD32 u4_value; 322 UWORD32 u4_symbol; 323 bin_ctxt_model_t *ps_bin_ctxt; 324 UWORD32 u4_ctx_Inc; 325 326 u4_value = 0; 327 328 u4_ctx_Inc = u4_ctx_inc & 0xf; 329 ps_bin_ctxt = p_ctxt_abs_level + u4_ctx_Inc; 330 331 do 332 { 333 334 { 335 336 UWORD32 u4_qnt_int_range, 337 u4_int_range_lps; 338 UWORD32 u1_mps_state; 339 UWORD32 table_lookup; 340 const UWORD32 *pu4_table = 341 (const UWORD32 *)ps_cab_env->cabac_table; 342 UWORD32 u4_clz; 343 344 u1_mps_state = (ps_bin_ctxt->u1_mps_state); 345 u4_clz = CLZ(u4_code_int_range); 346 u4_qnt_int_range = u4_code_int_range 347 << u4_clz; 348 u4_qnt_int_range = (u4_qnt_int_range 349 >> 29) & 0x3; 350 table_lookup = pu4_table[(u1_mps_state << 2) 351 + u4_qnt_int_range]; 352 u4_int_range_lps = table_lookup & 0xff; 353 354 u4_int_range_lps = u4_int_range_lps 355 << (23 - u4_clz); 356 u4_code_int_range = u4_code_int_range 357 - u4_int_range_lps; 358 u4_symbol = ((u1_mps_state >> 6) & 0x1); 359 u1_mps_state = (table_lookup >> 8) & 0x7F; 360 361 CHECK_IF_LPS(u4_code_int_range, 362 u4_code_int_val_ofst, u4_symbol, 363 u4_int_range_lps, u1_mps_state, 364 table_lookup) 365 366 if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9) 367 { 368 369 RENORM_RANGE_OFFSET(u4_code_int_range, 370 u4_code_int_val_ofst, 371 u4_offset, pu4_buffer) 372 } 373 374 INC_BIN_COUNT(ps_cab_env); 375 376 ps_bin_ctxt->u1_mps_state = u1_mps_state; 377 } 378 379 INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env); 380 381 u4_value++; 382 ps_bin_ctxt = p_ctxt_abs_level + (u4_ctx_inc >> 4); 383 384 } 385 while(u4_symbol && (u4_value < UCOFF_LEVEL)); 386 387 ui_prefix = u4_value - 1 + u4_symbol; 388 389 } 390 391 if(ui_prefix == UCOFF_LEVEL) 392 { 393 UWORD32 ui16_sufS = 0; 394 UWORD32 u1_max_bins; 395 UWORD32 u4_value; 396 397 i2_abs_lvl = UCOFF_LEVEL; 398 /*inlining ih264d_decode_bypass_bins_unary begins*/ 399 400 { 401 UWORD32 uc_bin; 402 UWORD32 bits_to_flush; 403 UWORD32 max_bits = 32; 404 405 bits_to_flush = 0; 406 /*renormalize to ensure there 23 bits more in the u4_code_int_val_ofst*/ 407 { 408 UWORD32 u4_clz, read_bits; 409 410 u4_clz = CLZ(u4_code_int_range); 411 FLUSHBITS(u4_offset, u4_clz) 412 NEXTBITS(read_bits, u4_offset, pu4_buffer, 23) 413 u4_code_int_range = u4_code_int_range << u4_clz; 414 u4_code_int_val_ofst = (u4_code_int_val_ofst 415 << u4_clz) | read_bits; 416 417 } 418 419 do 420 { 421 bits_to_flush++; 422 423 u4_code_int_range = u4_code_int_range >> 1; 424 425 if(u4_code_int_val_ofst >= u4_code_int_range) 426 { 427 /* S=1 */ 428 uc_bin = 1; 429 u4_code_int_val_ofst -= u4_code_int_range; 430 } 431 else 432 { 433 /* S=0 */ 434 uc_bin = 0; 435 } 436 437 INC_BIN_COUNT( 438 ps_cab_env);INC_BYPASS_BINS(ps_cab_env); 439 440 } 441 while(uc_bin && (bits_to_flush < max_bits)); 442 443 u4_value = (bits_to_flush - 1); 444 445 } 446 /*inlining ih264d_decode_bypass_bins_unary ends*/ 447 448 ui16_sufS = (1 << u4_value); 449 u1_max_bins = u4_value; 450 451 if(u4_value > 0) 452 { 453 454 /*inline bypassbins_flc begins*/ 455 456 if(u4_value > 10) 457 { 458 UWORD32 u4_clz, read_bits; 459 460 u4_clz = CLZ(u4_code_int_range); 461 FLUSHBITS(u4_offset, u4_clz) 462 NEXTBITS(read_bits, u4_offset, pu4_buffer, 23) 463 u4_code_int_range = u4_code_int_range << u4_clz; 464 u4_code_int_val_ofst = (u4_code_int_val_ofst 465 << u4_clz) | read_bits; 466 } 467 468 { 469 UWORD32 ui_bins; 470 UWORD32 uc_bin; 471 UWORD32 bits_to_flush; 472 473 ui_bins = 0; 474 bits_to_flush = 0; 475 476 do 477 { 478 bits_to_flush++; 479 480 u4_code_int_range = u4_code_int_range >> 1; 481 482 if(u4_code_int_val_ofst 483 >= u4_code_int_range) 484 { 485 /* S=1 */ 486 uc_bin = 1; 487 u4_code_int_val_ofst -= 488 u4_code_int_range; 489 } 490 else 491 { 492 /* S=0 */ 493 uc_bin = 0; 494 } 495 496 INC_BIN_COUNT( 497 ps_cab_env);INC_BYPASS_BINS(ps_cab_env); 498 499 ui_bins = ((ui_bins << 1) | uc_bin); 500 501 } 502 while(bits_to_flush < u1_max_bins); 503 504 u4_value = ui_bins; 505 } 506 507 /*inline bypassbins_flc ends*/ 508 509 } 510 511 //Value of K 512 ui16_sufS += u4_value; 513 i2_abs_lvl += ui16_sufS; 514 515 } 516 else 517 i2_abs_lvl = 1 + ui_prefix; 518 519 if(i2_abs_lvl > 1) 520 { 521 u1_abs_level_gt1++; 522 } 523 if(!u1_abs_level_gt1) 524 { 525 u1_abs_level_equal1++; 526 u4_ctx_inc = (5 << 4) + MIN(u1_abs_level_equal1, 4); 527 } 528 else 529 u4_ctx_inc = (5 + MIN(u1_abs_level_gt1, 4)) << 4; 530 531 /*u4_ctx_inc = g_table_temp[u1_abs_level_gt1][u1_abs_level_equal1];*/ 532 533 /* encode coeff_sign_flag[i] */ 534 535 { 536 u4_code_int_range = u4_code_int_range >> 1; 537 538 if(u4_code_int_val_ofst >= (u4_code_int_range)) 539 { 540 /* S=1 */ 541 u4_code_int_val_ofst -= u4_code_int_range; 542 i2_abs_lvl = (-i2_abs_lvl); 543 } 544 545 } 546 num_sig_coeffs--; 547 *pi2_coeff_data++ = i2_abs_lvl; 548 } 549 } 550 while(num_sig_coeffs > 0); 551 } 552 } 553 554 if(u4_coded_flag) 555 { 556 WORD32 offset; 557 offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4; 558 offset = ALIGN4(offset); 559 ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset); 560 } 561 562 563 /*updating structures*/ 564 ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst; 565 ps_cab_env->u4_code_int_range = u4_code_int_range; 566 ps_bitstrm->u4_ofst = u4_offset; 567 return (u4_coded_flag); 568} 569/*! 570 ******************************************************************************** 571 * \if Function name : ih264d_read_coeff8x8_cabac \endif 572 * 573 * \brief This function encodes residual_block_cabac as defined in 7.3.5.3.2. 574 when transform_8x8_flag = 1 575 * 576 * \return 577 * Returns the index of last significant coeff. 578 * 579 ******************************************************************************** 580 */ 581 582void ih264d_read_coeff8x8_cabac(dec_bit_stream_t *ps_bitstrm, 583 dec_struct_t *ps_dec, /*!< pointer to access global variables*/ 584 dec_mb_info_t *ps_cur_mb_info) 585{ 586 decoding_envirnoment_t *ps_cab_env = &ps_dec->s_cab_dec_env; 587 UWORD32 u4_offset, *pu4_buffer; 588 UWORD32 u4_code_int_range, u4_code_int_val_ofst; 589 590 /* High profile related declarations */ 591 UWORD8 u1_field_coding_flag = ps_cur_mb_info->ps_curmb->u1_mb_fld; 592 const UWORD8 *pu1_lastcoeff_context_inc = 593 (UWORD8 *)gau1_ih264d_lastcoeff_context_inc; 594 const UWORD8 *pu1_sigcoeff_context_inc; 595 bin_ctxt_model_t *ps_ctxt_sig_coeff; 596 WORD32 num_sig_coeffs = 0; 597 tu_blk8x8_coeff_data_t *ps_tu_8x8; 598 WORD16 *pi2_coeff_data; 599 600 /*loading from strcuctures*/ 601 602 ps_tu_8x8 = (tu_blk8x8_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data; 603 ps_tu_8x8->au4_sig_coeff_map[0] = 0; 604 ps_tu_8x8->au4_sig_coeff_map[1] = 0; 605 pi2_coeff_data = &ps_tu_8x8->ai2_level[0]; 606 607 608 if(!u1_field_coding_flag) 609 { 610 pu1_sigcoeff_context_inc = 611 (UWORD8 *)gau1_ih264d_sigcoeff_context_inc_frame; 612 613 /*******************************************************************/ 614 /* last coefficient context is derived from significant coeff u4_flag */ 615 /* only significant coefficient matrix need to be initialized */ 616 /*******************************************************************/ 617 ps_ctxt_sig_coeff = ps_dec->s_high_profile.ps_sigcoeff_8x8_frame; 618 } 619 else 620 { 621 pu1_sigcoeff_context_inc = 622 (UWORD8 *)gau1_ih264d_sigcoeff_context_inc_field; 623 624 /*******************************************************************/ 625 /* last coefficient context is derived from significant coeff u4_flag */ 626 /* only significant coefficient matrix need to be initialized */ 627 /*******************************************************************/ 628 ps_ctxt_sig_coeff = ps_dec->s_high_profile.ps_sigcoeff_8x8_field; 629 } 630 631 /*loading from strcuctures*/ 632 633 u4_offset = ps_bitstrm->u4_ofst; 634 pu4_buffer = ps_bitstrm->pu4_buffer; 635 636 u4_code_int_range = ps_cab_env->u4_code_int_range; 637 u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst; 638 639 { 640 { 641 bin_ctxt_model_t *p_binCtxt_last, *p_binCtxt_last_org, 642 *p_ctxt_sig_coeff_org; 643 UWORD32 uc_last_coeff_idx; 644 UWORD32 uc_bin; 645 UWORD32 i; 646 647 i = 0; 648 649 uc_last_coeff_idx = 63; 650 651 p_binCtxt_last_org = ps_ctxt_sig_coeff 652 + LAST_COEFF_CTXT_MINUS_SIG_COEFF_CTXT_8X8; 653 654 p_ctxt_sig_coeff_org = ps_ctxt_sig_coeff; 655 656 do 657 { 658 /*inilined DecodeDecision_onebin begins*/ 659 { 660 UWORD32 u4_qnt_int_range, u4_int_range_lps; 661 UWORD32 u4_symbol, u1_mps_state; 662 UWORD32 table_lookup; 663 const UWORD32 *pu4_table = 664 (const UWORD32 *)ps_cab_env->cabac_table; 665 UWORD32 u4_clz; 666 667 u1_mps_state = (ps_ctxt_sig_coeff->u1_mps_state); 668 669 u4_clz = CLZ(u4_code_int_range); 670 671 u4_qnt_int_range = u4_code_int_range << u4_clz; 672 u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3; 673 674 table_lookup = pu4_table[(u1_mps_state << 2) 675 + u4_qnt_int_range]; 676 677 u4_int_range_lps = table_lookup & 0xff; 678 679 u4_int_range_lps = u4_int_range_lps << (23 - u4_clz); 680 u4_code_int_range = u4_code_int_range - u4_int_range_lps; 681 u4_symbol = ((u1_mps_state >> 6) & 0x1); 682 u1_mps_state = (table_lookup >> 8) & 0x7F; 683 684 CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, 685 u4_symbol, u4_int_range_lps, u1_mps_state, 686 table_lookup) 687 688 if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_14) 689 { 690 UWORD32 read_bits, u4_clz; 691 u4_clz = CLZ(u4_code_int_range); 692 NEXTBITS(read_bits, (u4_offset + 23), pu4_buffer, 693 u4_clz) 694 FLUSHBITS(u4_offset, (u4_clz)) 695 u4_code_int_range = u4_code_int_range << u4_clz; 696 u4_code_int_val_ofst = (u4_code_int_val_ofst << u4_clz) 697 | read_bits; 698 } 699 700 ps_ctxt_sig_coeff->u1_mps_state = u1_mps_state; 701 uc_bin = u4_symbol; 702 } 703 /*incrementing pointer to point to the context of the next bin*/ 704 ps_ctxt_sig_coeff = p_ctxt_sig_coeff_org 705 + pu1_sigcoeff_context_inc[i + 1]; 706 707 /*inilined DecodeDecision_onebin ends*/ 708 if(uc_bin) 709 { 710 num_sig_coeffs++; 711 SET_BIT(ps_tu_8x8->au4_sig_coeff_map[i>31], (i > 31 ? i - 32:i)); 712 713 p_binCtxt_last = p_binCtxt_last_org 714 + pu1_lastcoeff_context_inc[i]; 715 716 /*inilined DecodeDecision_onebin begins*/ 717 718 { 719 UWORD32 u4_qnt_int_range, u4_int_range_lps; 720 UWORD32 u4_symbol, u1_mps_state; 721 UWORD32 table_lookup; 722 const UWORD32 *pu4_table = 723 (const UWORD32 *)ps_cab_env->cabac_table; 724 UWORD32 u4_clz; 725 726 u1_mps_state = (p_binCtxt_last->u1_mps_state); 727 728 u4_clz = CLZ(u4_code_int_range); 729 u4_qnt_int_range = u4_code_int_range << u4_clz; 730 u4_qnt_int_range = (u4_qnt_int_range >> 29) 731 & 0x3; 732 733 table_lookup = pu4_table[(u1_mps_state << 2) 734 + u4_qnt_int_range]; 735 u4_int_range_lps = table_lookup & 0xff; 736 737 u4_int_range_lps = u4_int_range_lps 738 << (23 - u4_clz); 739 740 u4_code_int_range = u4_code_int_range 741 - u4_int_range_lps; 742 u4_symbol = ((u1_mps_state >> 6) & 0x1); 743 u1_mps_state = (table_lookup >> 8) & 0x7F; 744 745 CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, 746 u4_symbol, u4_int_range_lps, 747 u1_mps_state, table_lookup) 748 749 p_binCtxt_last->u1_mps_state = u1_mps_state; 750 uc_bin = u4_symbol; 751 } 752 753 /*inilined DecodeDecision_onebin ends*/ 754 if(uc_bin == 1) 755 goto label_read_levels; 756 757 } 758 759 i = i + 1; 760 761 } 762 while(i < uc_last_coeff_idx); 763 764 num_sig_coeffs++; 765 SET_BIT(ps_tu_8x8->au4_sig_coeff_map[i>31], (i > 31 ? i - 32:i)); 766 767 label_read_levels: ; 768 } 769 770 /// VALUE of No of Coeff in BLOCK = i + 1 for second case else i; 771 772 /* Decode coeff_abs_level_minus1 and coeff_sign_flag */ 773 { 774 WORD32 i2_abs_lvl; 775 UWORD32 u1_abs_level_equal1 = 1, u1_abs_level_gt1 = 0; 776 777 UWORD32 u4_ctx_inc; 778 UWORD32 ui_prefix; 779 bin_ctxt_model_t *p_ctxt_abs_level; 780 781 p_ctxt_abs_level = 782 ps_dec->p_coeff_abs_level_minus1_t[LUMA_8X8_CTXCAT]; 783 u4_ctx_inc = ((0x51)); 784 785 /*****************************************************/ 786 /* Main Loop runs for no. of Significant coefficient */ 787 /*****************************************************/ 788 do 789 { 790 { 791 792 /*****************************************************/ 793 /* inilining a modified ih264d_decode_bins_unary */ 794 /*****************************************************/ 795 796 { 797 UWORD32 u4_value; 798 UWORD32 u4_symbol; 799 bin_ctxt_model_t *ps_bin_ctxt; 800 UWORD32 u4_ctx_Inc; 801 u4_value = 0; 802 803 u4_ctx_Inc = u4_ctx_inc & 0xf; 804 ps_bin_ctxt = p_ctxt_abs_level + u4_ctx_Inc; 805 806 do 807 { 808 { 809 UWORD32 u4_qnt_int_range, 810 u4_int_range_lps; 811 UWORD32 u1_mps_state; 812 UWORD32 table_lookup; 813 const UWORD32 *pu4_table = 814 (const UWORD32 *)ps_cab_env->cabac_table; 815 UWORD32 u4_clz; 816 817 u1_mps_state = (ps_bin_ctxt->u1_mps_state); 818 u4_clz = CLZ(u4_code_int_range); 819 u4_qnt_int_range = u4_code_int_range 820 << u4_clz; 821 u4_qnt_int_range = (u4_qnt_int_range 822 >> 29) & 0x3; 823 table_lookup = pu4_table[(u1_mps_state << 2) 824 + u4_qnt_int_range]; 825 u4_int_range_lps = table_lookup & 0xff; 826 827 u4_int_range_lps = u4_int_range_lps 828 << (23 - u4_clz); 829 u4_code_int_range = u4_code_int_range 830 - u4_int_range_lps; 831 u4_symbol = ((u1_mps_state >> 6) & 0x1); 832 u1_mps_state = (table_lookup >> 8) & 0x7F; 833 834 CHECK_IF_LPS(u4_code_int_range, 835 u4_code_int_val_ofst, u4_symbol, 836 u4_int_range_lps, u1_mps_state, 837 table_lookup) 838 839 if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9) 840 { 841 842 RENORM_RANGE_OFFSET(u4_code_int_range, 843 u4_code_int_val_ofst, 844 u4_offset, pu4_buffer) 845 } 846 847 ps_bin_ctxt->u1_mps_state = u1_mps_state; 848 } 849 850 u4_value++; 851 ps_bin_ctxt = p_ctxt_abs_level + (u4_ctx_inc >> 4); 852 853 } 854 while(u4_symbol && (u4_value < UCOFF_LEVEL)); 855 856 ui_prefix = u4_value - 1 + u4_symbol; 857 } 858 859 if(ui_prefix == UCOFF_LEVEL) 860 { 861 UWORD32 ui16_sufS = 0; 862 UWORD32 u1_max_bins; 863 UWORD32 u4_value; 864 865 i2_abs_lvl = UCOFF_LEVEL; 866 /*inlining ih264d_decode_bypass_bins_unary begins*/ 867 868 { 869 UWORD32 uc_bin; 870 UWORD32 bits_to_flush; 871 UWORD32 max_bits = 32; 872 873 bits_to_flush = 0; 874 /*renormalize to ensure there 23 bits more in the u4_code_int_val_ofst*/ 875 { 876 UWORD32 u4_clz, read_bits; 877 878 u4_clz = CLZ(u4_code_int_range); 879 FLUSHBITS(u4_offset, u4_clz) 880 NEXTBITS(read_bits, u4_offset, pu4_buffer, 23) 881 u4_code_int_range = u4_code_int_range << u4_clz; 882 u4_code_int_val_ofst = (u4_code_int_val_ofst 883 << u4_clz) | read_bits; 884 } 885 886 do 887 { 888 bits_to_flush++; 889 890 u4_code_int_range = u4_code_int_range >> 1; 891 892 if(u4_code_int_val_ofst >= u4_code_int_range) 893 { 894 /* S=1 */ 895 uc_bin = 1; 896 u4_code_int_val_ofst -= u4_code_int_range; 897 } 898 else 899 { 900 /* S=0 */ 901 uc_bin = 0; 902 } 903 904 } 905 while(uc_bin && (bits_to_flush < max_bits)); 906 907 u4_value = (bits_to_flush - 1); 908 } 909 /*inlining ih264d_decode_bypass_bins_unary ends*/ 910 911 ui16_sufS = (1 << u4_value); 912 u1_max_bins = u4_value; 913 914 if(u4_value > 0) 915 { 916 /*inline bypassbins_flc begins*/ 917 918 if(u4_value > 10) 919 { 920 UWORD32 u4_clz, read_bits; 921 922 u4_clz = CLZ(u4_code_int_range); 923 FLUSHBITS(u4_offset, u4_clz) 924 NEXTBITS(read_bits, u4_offset, pu4_buffer, 23) 925 u4_code_int_range = u4_code_int_range << u4_clz; 926 u4_code_int_val_ofst = (u4_code_int_val_ofst 927 << u4_clz) | read_bits; 928 } 929 930 { 931 UWORD32 ui_bins; 932 UWORD32 uc_bin; 933 UWORD32 bits_to_flush; 934 935 ui_bins = 0; 936 bits_to_flush = 0; 937 938 do 939 { 940 bits_to_flush++; 941 942 u4_code_int_range = u4_code_int_range >> 1; 943 944 if(u4_code_int_val_ofst 945 >= u4_code_int_range) 946 { 947 /* S=1 */ 948 uc_bin = 1; 949 u4_code_int_val_ofst -= 950 u4_code_int_range; 951 } 952 else 953 { 954 /* S=0 */ 955 uc_bin = 0; 956 } 957 958 ui_bins = ((ui_bins << 1) | uc_bin); 959 960 } 961 while(bits_to_flush < u1_max_bins); 962 963 u4_value = ui_bins; 964 } 965 /*inline bypassbins_flc ends*/ 966 } 967 968 //Value of K 969 ui16_sufS += u4_value; 970 i2_abs_lvl += ui16_sufS; 971 } 972 else 973 { 974 i2_abs_lvl = 1 + ui_prefix; 975 } 976 977 if(i2_abs_lvl > 1) 978 { 979 u1_abs_level_gt1++; 980 } 981 if(!u1_abs_level_gt1) 982 { 983 u1_abs_level_equal1++; 984 u4_ctx_inc = (5 << 4) + MIN(u1_abs_level_equal1, 4); 985 } 986 else 987 { 988 u4_ctx_inc = (5 + MIN(u1_abs_level_gt1, 4)) << 4; 989 } 990 991 /*u4_ctx_inc = g_table_temp[u1_abs_level_gt1][u1_abs_level_equal1];*/ 992 993 /* encode coeff_sign_flag[i] */ 994 995 { 996 u4_code_int_range = u4_code_int_range >> 1; 997 998 if(u4_code_int_val_ofst >= (u4_code_int_range)) 999 { 1000 /* S=1 */ 1001 u4_code_int_val_ofst -= u4_code_int_range; 1002 i2_abs_lvl = (-i2_abs_lvl); 1003 } 1004 } 1005 1006 *pi2_coeff_data++ = i2_abs_lvl; 1007 num_sig_coeffs--; 1008 } 1009 } 1010 while(num_sig_coeffs > 0); 1011 } 1012 } 1013 1014 { 1015 WORD32 offset; 1016 offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_8x8; 1017 offset = ALIGN4(offset); 1018 ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset); 1019 } 1020 1021 /*updating structures*/ 1022 ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst; 1023 ps_cab_env->u4_code_int_range = u4_code_int_range; 1024 ps_bitstrm->u4_ofst = u4_offset; 1025} 1026 1027/*****************************************************************************/ 1028/* */ 1029/* Function Name : ih264d_cabac_parse_8x8block */ 1030/* */ 1031/* Description : This function does the residual parsing of 4 subblocks */ 1032/* in a 8x8 block. */ 1033/* */ 1034/* Inputs : pi2_coeff_block : pointer to residual block where */ 1035/* decoded and inverse scan coefficients are updated */ 1036/* */ 1037/* u4_sub_block_strd : indicates the number of sublocks */ 1038/* in a row. It is 4 for luma and 2 for chroma. */ 1039/* */ 1040/* u4_ctx_cat : inidicates context category for residual */ 1041/* decoding. */ 1042/* */ 1043/* ps_dec : pointer to Decstruct (decoder context) */ 1044/* */ 1045/* pu1_top_nnz : top nnz pointer */ 1046/* */ 1047/* pu1_left_nnz : left nnz pointer */ 1048/* */ 1049/* Globals : No */ 1050/* Processing : Parsing for four subblocks in unrolled, top and left nnz */ 1051/* are updated on the fly. csbp is set in accordance to */ 1052/* decoded numcoeff for the subblock index in raster order */ 1053/* */ 1054/* Outputs : The updated residue buffer, nnzs and csbp current block */ 1055/* */ 1056/* Returns : Returns the coded sub block pattern csbp for the block */ 1057/* */ 1058/* Issues : <List any issues or problems with this function> */ 1059/* */ 1060/* Revision History: */ 1061/* */ 1062/* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1063/* 09 10 2008 Jay Draft */ 1064/* */ 1065/*****************************************************************************/ 1066UWORD32 ih264d_cabac_parse_8x8block(WORD16 *pi2_coeff_block, 1067 UWORD32 u4_sub_block_strd, 1068 UWORD32 u4_ctx_cat, 1069 dec_struct_t * ps_dec, 1070 UWORD8 *pu1_top_nnz, 1071 UWORD8 *pu1_left_nnz) 1072{ 1073 UWORD32 u4_ctxinc, u4_subblock_coded; 1074 UWORD32 u4_top0, u4_top1; 1075 UWORD32 u4_csbp = 0; 1076 UWORD32 u4_idx = 0; 1077 dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; 1078 bin_ctxt_model_t * const ps_cbf = ps_dec->p_cbf_t[u4_ctx_cat]; 1079 bin_ctxt_model_t *ps_src_bin_ctxt; 1080 bin_ctxt_model_t * const ps_sig_coeff_flag = 1081 ps_dec->p_significant_coeff_flag_t[u4_ctx_cat]; 1082 1083 UWORD8 *pu1_inv_scan = ps_dec->pu1_inv_scan; 1084 1085 /*------------------------------------------------------*/ 1086 /* Residual 4x4 decoding: SubBlock 0 */ 1087 /*------------------------------------------------------*/ 1088 u4_ctxinc = ((!!pu1_top_nnz[0]) << 1) + (!!pu1_left_nnz[0]); 1089 1090 ps_src_bin_ctxt = ps_cbf + u4_ctxinc; 1091 1092 u4_top0 = ih264d_read_coeff4x4_cabac( ps_bitstrm, 1093 u4_ctx_cat, ps_sig_coeff_flag, ps_dec, 1094 ps_src_bin_ctxt); 1095 1096 INSERT_BIT(u4_csbp, u4_idx, u4_top0); 1097 1098 /*------------------------------------------------------*/ 1099 /* Residual 4x4 decoding: SubBlock 1 */ 1100 /*------------------------------------------------------*/ 1101 u4_idx++; 1102 pi2_coeff_block += NUM_COEFFS_IN_4x4BLK; 1103 u4_ctxinc = ((!!pu1_top_nnz[1]) << 1) + u4_top0; 1104 1105 ps_src_bin_ctxt = ps_cbf + u4_ctxinc; 1106 1107 u4_top1 = ih264d_read_coeff4x4_cabac(ps_bitstrm, 1108 u4_ctx_cat, ps_sig_coeff_flag, ps_dec, 1109 ps_src_bin_ctxt); 1110 1111 INSERT_BIT(u4_csbp, u4_idx, u4_top1); 1112 pu1_left_nnz[0] = u4_top1; 1113 1114 /*------------------------------------------------------*/ 1115 /* Residual 4x4 decoding: SubBlock 2 */ 1116 /*------------------------------------------------------*/ 1117 u4_idx += (u4_sub_block_strd - 1); 1118 pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK); 1119 u4_ctxinc = (u4_top0 << 1) + (!!pu1_left_nnz[1]); 1120 1121 ps_src_bin_ctxt = ps_cbf + u4_ctxinc; 1122 1123 u4_subblock_coded = ih264d_read_coeff4x4_cabac(ps_bitstrm, u4_ctx_cat, 1124 ps_sig_coeff_flag, ps_dec, 1125 ps_src_bin_ctxt); 1126 1127 INSERT_BIT(u4_csbp, u4_idx, u4_subblock_coded); 1128 pu1_top_nnz[0] = u4_subblock_coded; 1129 1130 /*------------------------------------------------------*/ 1131 /* Residual 4x4 decoding: SubBlock 3 */ 1132 /*------------------------------------------------------*/ 1133 u4_idx++; 1134 pi2_coeff_block += NUM_COEFFS_IN_4x4BLK; 1135 u4_ctxinc = (u4_top1 << 1) + u4_subblock_coded; 1136 1137 ps_src_bin_ctxt = ps_cbf + u4_ctxinc; 1138 1139 u4_subblock_coded = ih264d_read_coeff4x4_cabac(ps_bitstrm, u4_ctx_cat, 1140 ps_sig_coeff_flag, ps_dec, 1141 ps_src_bin_ctxt); 1142 1143 INSERT_BIT(u4_csbp, u4_idx, u4_subblock_coded); 1144 pu1_top_nnz[1] = pu1_left_nnz[1] = u4_subblock_coded; 1145 1146 return (u4_csbp); 1147} 1148 1149/*! 1150 ************************************************************************** 1151 * \if Function name : ih264d_parse_residual4x4_cabac \endif 1152 * 1153 * \brief 1154 * This function parses CABAC syntax of a Luma and Chroma AC Residuals. 1155 * 1156 * \return 1157 * 0 on Success and Error code otherwise 1158 ************************************************************************** 1159 */ 1160 1161WORD32 ih264d_parse_residual4x4_cabac(dec_struct_t * ps_dec, 1162 dec_mb_info_t *ps_cur_mb_info, 1163 UWORD8 u1_offset) 1164{ 1165 UWORD8 u1_cbp = ps_cur_mb_info->u1_cbp; 1166 UWORD16 ui16_csbp = 0; 1167 WORD16 *pi2_residual_buf; 1168 UWORD8 uc_ctx_cat; 1169 UWORD8 *pu1_top_nnz = ps_cur_mb_info->ps_curmb->pu1_nnz_y; 1170 UWORD8 *pu1_left_nnz = ps_dec->pu1_left_nnz_y; 1171 UWORD8 *pu1_top_nnz_uv = ps_cur_mb_info->ps_curmb->pu1_nnz_uv; 1172 ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info; 1173 ctxt_inc_mb_info_t *ps_top_ctxt = ps_dec->p_top_ctxt_mb_info; 1174 dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; 1175 UWORD32 u4_nbr_avail = ps_dec->u1_mb_ngbr_availablity; 1176 WORD16 *pi2_coeff_block = NULL; 1177 bin_ctxt_model_t *ps_src_bin_ctxt; 1178 1179 UWORD8 u1_top_dc_csbp = (ps_top_ctxt->u1_yuv_dc_csbp) >> 1; 1180 UWORD8 u1_left_dc_csbp = (ps_dec->pu1_left_yuv_dc_csbp[0]) >> 1; 1181 1182 1183 if(!(u4_nbr_avail & TOP_MB_AVAILABLE_MASK)) 1184 { 1185 if(p_curr_ctxt->u1_mb_type & CAB_INTRA_MASK) 1186 { 1187 *(UWORD32 *)pu1_top_nnz = 0; 1188 u1_top_dc_csbp = 0; 1189 *(UWORD32 *)pu1_top_nnz_uv = 0; 1190 } 1191 else 1192 { 1193 *(UWORD32 *)pu1_top_nnz = 0x01010101; 1194 u1_top_dc_csbp = 0x3; 1195 *(UWORD32 *)pu1_top_nnz_uv = 0x01010101; 1196 } 1197 } 1198 else 1199 { 1200 UWORD32 *pu4_buf; 1201 UWORD8 *pu1_buf; 1202 pu1_buf = ps_cur_mb_info->ps_top_mb->pu1_nnz_y; 1203 pu4_buf = (UWORD32 *)pu1_buf; 1204 *(UWORD32 *)(pu1_top_nnz) = *pu4_buf; 1205 1206 pu1_buf = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv; 1207 pu4_buf = (UWORD32 *)pu1_buf; 1208 *(UWORD32 *)(pu1_top_nnz_uv) = *pu4_buf; 1209 1210 } 1211 1212 if(!(u4_nbr_avail & LEFT_MB_AVAILABLE_MASK)) 1213 { 1214 if(p_curr_ctxt->u1_mb_type & CAB_INTRA_MASK) 1215 { 1216 UWORD32 *pu4_buf; 1217 UWORD8 *pu1_buf; 1218 *(UWORD32 *)pu1_left_nnz = 0; 1219 u1_left_dc_csbp = 0; 1220 pu1_buf = ps_dec->pu1_left_nnz_uv; 1221 pu4_buf = (UWORD32 *)pu1_buf; 1222 *pu4_buf = 0; 1223 } 1224 else 1225 { 1226 UWORD32 *pu4_buf; 1227 UWORD8 *pu1_buf; 1228 *(UWORD32 *)pu1_left_nnz = 0x01010101; 1229 u1_left_dc_csbp = 0x3; 1230 pu1_buf = ps_dec->pu1_left_nnz_uv; 1231 pu4_buf = (UWORD32 *)pu1_buf; 1232 *pu4_buf = 0x01010101; 1233 } 1234 } 1235 1236 uc_ctx_cat = u1_offset ? LUMA_AC_CTXCAT : LUMA_4X4_CTXCAT; 1237 1238 ps_cur_mb_info->u1_qp_div6 = ps_dec->u1_qp_y_div6; 1239 ps_cur_mb_info->u1_qpc_div6 = ps_dec->u1_qp_u_div6; 1240 ps_cur_mb_info->u1_qp_rem6 = ps_dec->u1_qp_y_rem6; 1241 ps_cur_mb_info->u1_qpc_rem6 = ps_dec->u1_qp_u_rem6; 1242 // CHECK_THIS 1243 ps_cur_mb_info->u1_qpcr_div6 = ps_dec->u1_qp_v_div6; 1244 ps_cur_mb_info->u1_qpcr_rem6 = ps_dec->u1_qp_v_rem6; 1245 1246 if(u1_cbp & 0x0f) 1247 { 1248 if(ps_cur_mb_info->u1_tran_form8x8 == 0) 1249 { 1250 /*******************************************************************/ 1251 /* Block 0 residual decoding, check cbp and proceed (subblock = 0) */ 1252 /*******************************************************************/ 1253 if(!(u1_cbp & 0x1)) 1254 { 1255 *(UWORD16 *)(pu1_top_nnz) = 0; 1256 *(UWORD16 *)(pu1_left_nnz) = 0; 1257 } 1258 else 1259 { 1260 ui16_csbp = ih264d_cabac_parse_8x8block(pi2_coeff_block, 4, 1261 uc_ctx_cat, ps_dec, 1262 pu1_top_nnz, 1263 pu1_left_nnz); 1264 } 1265 1266 /*******************************************************************/ 1267 /* Block 1 residual decoding, check cbp and proceed (subblock = 2) */ 1268 /*******************************************************************/ 1269 pi2_coeff_block += (2 * NUM_COEFFS_IN_4x4BLK); 1270 if(!(u1_cbp & 0x2)) 1271 { 1272 *(UWORD16 *)(pu1_top_nnz + 2) = 0; 1273 *(UWORD16 *)(pu1_left_nnz) = 0; 1274 } 1275 else 1276 { 1277 UWORD32 u4_temp = ih264d_cabac_parse_8x8block(pi2_coeff_block, 1278 4, uc_ctx_cat, 1279 ps_dec, 1280 (pu1_top_nnz + 2), 1281 pu1_left_nnz); 1282 ui16_csbp |= (u4_temp << 2); 1283 } 1284 1285 /*******************************************************************/ 1286 /* Block 2 residual decoding, check cbp and proceed (subblock = 8) */ 1287 /*******************************************************************/ 1288 pi2_coeff_block += (6 * NUM_COEFFS_IN_4x4BLK); 1289 if(!(u1_cbp & 0x4)) 1290 { 1291 *(UWORD16 *)(pu1_top_nnz) = 0; 1292 *(UWORD16 *)(pu1_left_nnz + 2) = 0; 1293 } 1294 else 1295 { 1296 UWORD32 u4_temp = ih264d_cabac_parse_8x8block( 1297 pi2_coeff_block, 4, uc_ctx_cat, ps_dec, 1298 pu1_top_nnz, (pu1_left_nnz + 2)); 1299 ui16_csbp |= (u4_temp << 8); 1300 } 1301 1302 /*******************************************************************/ 1303 /* Block 3 residual decoding, check cbp and proceed (subblock = 10)*/ 1304 /*******************************************************************/ 1305 pi2_coeff_block += (2 * NUM_COEFFS_IN_4x4BLK); 1306 if(!(u1_cbp & 0x8)) 1307 { 1308 *(UWORD16 *)(pu1_top_nnz + 2) = 0; 1309 *(UWORD16 *)(pu1_left_nnz + 2) = 0; 1310 } 1311 else 1312 { 1313 UWORD32 u4_temp = ih264d_cabac_parse_8x8block( 1314 pi2_coeff_block, 4, uc_ctx_cat, ps_dec, 1315 (pu1_top_nnz + 2), (pu1_left_nnz + 2)); 1316 ui16_csbp |= (u4_temp << 10); 1317 } 1318 1319 } 1320 else 1321 { 1322 ui16_csbp = 0; 1323 1324 /*******************************************************************/ 1325 /* Block 0 residual decoding, check cbp and proceed (subblock = 0) */ 1326 /*******************************************************************/ 1327 if(!(u1_cbp & 0x1)) 1328 { 1329 *(UWORD16 *)(pu1_top_nnz) = 0; 1330 *(UWORD16 *)(pu1_left_nnz) = 0; 1331 } 1332 else 1333 { 1334 1335 dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; 1336 1337 ih264d_read_coeff8x8_cabac( ps_bitstrm, 1338 ps_dec, ps_cur_mb_info); 1339 1340 pu1_left_nnz[0] = 1; 1341 pu1_left_nnz[1] = 1; 1342 1343 pu1_top_nnz[0] = 1; 1344 pu1_top_nnz[1] = 1; 1345 1346 /* added to be used by BS computation module */ 1347 ui16_csbp |= 0x0033; 1348 } 1349 1350 /*******************************************************************/ 1351 /* Block 1 residual decoding, check cbp and proceed (subblock = 2) */ 1352 /*******************************************************************/ 1353 pi2_coeff_block += 64; 1354 1355 if(!(u1_cbp & 0x2)) 1356 { 1357 *(UWORD16 *)(pu1_top_nnz + 2) = 0; 1358 *(UWORD16 *)(pu1_left_nnz) = 0; 1359 } 1360 else 1361 { 1362 1363 1364 dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; 1365 1366 ih264d_read_coeff8x8_cabac(ps_bitstrm, 1367 ps_dec, ps_cur_mb_info); 1368 1369 pu1_left_nnz[0] = 1; 1370 pu1_left_nnz[1] = 1; 1371 1372 pu1_top_nnz[2] = 1; 1373 pu1_top_nnz[3] = 1; 1374 1375 /* added to be used by BS computation module */ 1376 ui16_csbp |= 0x00CC; 1377 1378 } 1379 1380 /*******************************************************************/ 1381 /* Block 2 residual decoding, check cbp and proceed (subblock = 8) */ 1382 /*******************************************************************/ 1383 pi2_coeff_block += 64; 1384 if(!(u1_cbp & 0x4)) 1385 { 1386 *(UWORD16 *)(pu1_top_nnz) = 0; 1387 *(UWORD16 *)(pu1_left_nnz + 2) = 0; 1388 } 1389 else 1390 { 1391 1392 dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; 1393 1394 ih264d_read_coeff8x8_cabac(ps_bitstrm, 1395 ps_dec, ps_cur_mb_info); 1396 1397 pu1_left_nnz[2] = 1; 1398 pu1_left_nnz[3] = 1; 1399 1400 pu1_top_nnz[0] = 1; 1401 pu1_top_nnz[1] = 1; 1402 1403 /* added to be used by BS computation module */ 1404 ui16_csbp |= 0x3300; 1405 } 1406 1407 /*******************************************************************/ 1408 /* Block 3 residual decoding, check cbp and proceed (subblock = 10)*/ 1409 /*******************************************************************/ 1410 pi2_coeff_block += 64; 1411 1412 if(!(u1_cbp & 0x8)) 1413 { 1414 *(UWORD16 *)(pu1_top_nnz + 2) = 0; 1415 *(UWORD16 *)(pu1_left_nnz + 2) = 0; 1416 } 1417 else 1418 { 1419 1420 dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; 1421 1422 ih264d_read_coeff8x8_cabac(ps_bitstrm, 1423 ps_dec, ps_cur_mb_info); 1424 1425 pu1_left_nnz[2] = 1; 1426 pu1_left_nnz[3] = 1; 1427 1428 pu1_top_nnz[2] = 1; 1429 pu1_top_nnz[3] = 1; 1430 1431 /* added to be used by BS computation module */ 1432 ui16_csbp |= 0xCC00; 1433 } 1434 } 1435 } 1436 else 1437 { 1438 *(UWORD32 *)(pu1_top_nnz) = 0; 1439 *(UWORD32 *)(pu1_left_nnz) = 0; 1440 } 1441 /*--------------------------------------------------------------------*/ 1442 /* Store the last row of N values to top row */ 1443 /*--------------------------------------------------------------------*/ 1444 ps_cur_mb_info->u2_luma_csbp = ui16_csbp; 1445 ps_cur_mb_info->ps_curmb->u2_luma_csbp = ui16_csbp; 1446 { 1447 WORD8 i; 1448 UWORD16 u2_chroma_csbp = 0; 1449 ps_cur_mb_info->u2_chroma_csbp = 0; 1450 1451 u1_cbp >>= 4; 1452 pu1_top_nnz = pu1_top_nnz_uv; 1453 pu1_left_nnz = ps_dec->pu1_left_nnz_uv; 1454 /*--------------------------------------------------------------------*/ 1455 /* if Chroma Component not present OR no ac values present */ 1456 /* Set the values of N to zero */ 1457 /*--------------------------------------------------------------------*/ 1458 if(u1_cbp == CBPC_ALLZERO) 1459 { 1460 ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x1; 1461 *(UWORD32 *)(pu1_top_nnz) = 0; 1462 *(UWORD32 *)(pu1_left_nnz) = 0; 1463 p_curr_ctxt->u1_yuv_dc_csbp &= 0x1; 1464 return (0); 1465 } 1466 1467 /*--------------------------------------------------------------------*/ 1468 /* Decode Chroma DC values */ 1469 /*--------------------------------------------------------------------*/ 1470 for(i = 0; i < 2; i++) 1471 { 1472 UWORD8 uc_a = 1, uc_b = 1; 1473 UWORD32 u4_ctx_inc; 1474 UWORD8 uc_codedBlockFlag; 1475 UWORD8 pu1_inv_scan[4] = 1476 { 0, 1, 2, 3 }; 1477 WORD32 u4_scale; 1478 WORD32 i4_mb_inter_inc; 1479 tu_sblk4x4_coeff_data_t *ps_tu_4x4 = 1480 (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data; 1481 WORD16 *pi2_coeff_data = 1482 (WORD16 *)ps_dec->pv_parse_tu_coeff_data; 1483 WORD16 ai2_dc_coef[4]; 1484 1485 INC_SYM_COUNT(&(ps_dec->s_cab_dec_env)); 1486 u4_scale = (i) ? 1487 (ps_dec->pu2_quant_scale_v[0] 1488 << ps_dec->u1_qp_v_div6) : 1489 (ps_dec->pu2_quant_scale_u[0] 1490 << ps_dec->u1_qp_u_div6); 1491 1492 /*--------------------------------------------------------------------*/ 1493 /* Decode Bitstream to get the DC coeff */ 1494 /*--------------------------------------------------------------------*/ 1495 uc_a = (u1_left_dc_csbp >> i) & 0x01; 1496 uc_b = (u1_top_dc_csbp >> i) & 0x01; 1497 u4_ctx_inc = (uc_a + (uc_b << 1)); 1498 1499 ps_src_bin_ctxt = (ps_dec->p_cbf_t[CHROMA_DC_CTXCAT]) + u4_ctx_inc; 1500 1501 uc_codedBlockFlag = 1502 ih264d_read_coeff4x4_cabac(ps_bitstrm, 1503 CHROMA_DC_CTXCAT, 1504 ps_dec->p_significant_coeff_flag_t[CHROMA_DC_CTXCAT], 1505 ps_dec, ps_src_bin_ctxt); 1506 1507 i4_mb_inter_inc = (!((ps_cur_mb_info->ps_curmb->u1_mb_type == I_4x4_MB) 1508 || (ps_cur_mb_info->ps_curmb->u1_mb_type == I_16x16_MB))) 1509 * 3; 1510 1511 if(ps_dec->s_high_profile.u1_scaling_present) 1512 { 1513 u4_scale *= 1514 ps_dec->s_high_profile.i2_scalinglist4x4[i4_mb_inter_inc 1515 + 1 + i][0]; 1516 1517 } 1518 else 1519 { 1520 u4_scale <<= 4; 1521 } 1522 1523 if(uc_codedBlockFlag) 1524 { 1525 WORD32 i_z0, i_z1, i_z2, i_z3; 1526 WORD32 *pi4_scale; 1527 1528 SET_BIT(u1_top_dc_csbp, i); 1529 SET_BIT(u1_left_dc_csbp, i); 1530 1531 ai2_dc_coef[0] = 0; 1532 ai2_dc_coef[1] = 0; 1533 ai2_dc_coef[2] = 0; 1534 ai2_dc_coef[3] = 0; 1535 1536 ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4, 1537 ai2_dc_coef, 1538 pu1_inv_scan); 1539 i_z0 = (ai2_dc_coef[0] + ai2_dc_coef[2]); 1540 i_z1 = (ai2_dc_coef[0] - ai2_dc_coef[2]); 1541 i_z2 = (ai2_dc_coef[1] - ai2_dc_coef[3]); 1542 i_z3 = (ai2_dc_coef[1] + ai2_dc_coef[3]); 1543 1544 /*-----------------------------------------------------------*/ 1545 /* Scaling and storing the values back */ 1546 /*-----------------------------------------------------------*/ 1547 *pi2_coeff_data++ = ((i_z0 + i_z3) * u4_scale) >> 5; 1548 *pi2_coeff_data++ = ((i_z0 - i_z3) * u4_scale) >> 5; 1549 *pi2_coeff_data++ = ((i_z1 + i_z2) * u4_scale) >> 5; 1550 *pi2_coeff_data++ = ((i_z1 - i_z2) * u4_scale) >> 5; 1551 1552 ps_dec->pv_parse_tu_coeff_data = (void *)pi2_coeff_data; 1553 1554 SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag,(i+1)); 1555 } 1556 else 1557 { 1558 CLEARBIT(u1_top_dc_csbp, i); 1559 CLEARBIT(u1_left_dc_csbp, i); 1560 } 1561 } 1562 1563 /*********************************************************************/ 1564 /* Update the DC csbp */ 1565 /*********************************************************************/ 1566 ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x1; 1567 p_curr_ctxt->u1_yuv_dc_csbp &= 0x1; 1568 ps_dec->pu1_left_yuv_dc_csbp[0] |= (u1_left_dc_csbp << 1); 1569 p_curr_ctxt->u1_yuv_dc_csbp |= (u1_top_dc_csbp << 1); 1570 if(u1_cbp == CBPC_ACZERO) 1571 { 1572 *(UWORD32 *)(pu1_top_nnz) = 0; 1573 *(UWORD32 *)(pu1_left_nnz) = 0; 1574 return (0); 1575 } 1576 /*--------------------------------------------------------------------*/ 1577 /* Decode Chroma AC values */ 1578 /*--------------------------------------------------------------------*/ 1579 { 1580 UWORD32 u4_temp; 1581 /*****************************************************************/ 1582 /* U Block residual decoding, check cbp and proceed (subblock=0)*/ 1583 /*****************************************************************/ 1584 u2_chroma_csbp = ih264d_cabac_parse_8x8block(pi2_coeff_block, 2, 1585 CHROMA_AC_CTXCAT, 1586 ps_dec, pu1_top_nnz, 1587 pu1_left_nnz); 1588 1589 pi2_coeff_block += MB_CHROM_SIZE; 1590 /*****************************************************************/ 1591 /* V Block residual decoding, check cbp and proceed (subblock=1)*/ 1592 /*****************************************************************/ 1593 u4_temp = ih264d_cabac_parse_8x8block(pi2_coeff_block, 2, 1594 CHROMA_AC_CTXCAT, 1595 ps_dec, (pu1_top_nnz + 2), 1596 (pu1_left_nnz + 2)); 1597 u2_chroma_csbp |= (u4_temp << 4); 1598 } 1599 /*********************************************************************/ 1600 /* Update the AC csbp */ 1601 /*********************************************************************/ 1602 ps_cur_mb_info->u2_chroma_csbp = u2_chroma_csbp; 1603 } 1604 1605 return (0); 1606} 1607 1608