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_cavlc.c 23 * 24 * \brief 25 * This file contains UVLC related functions. 26 * 27 * \date 28 * 20/11/2002 29 * 30 * \author NS 31 *************************************************************************** 32 */ 33 34 #include <string.h> 35 #include <stdio.h> 36 37 #include "ih264d_bitstrm.h" 38 #include "ih264d_parse_cavlc.h" 39 #include "ih264d_error_handler.h" 40 #include "ih264d_defs.h" 41 #include "ih264d_debug.h" 42 #include "ih264d_cabac.h" 43 #include "ih264d_structs.h" 44 #include "ih264d_tables.h" 45 #include "ih264d_tables.h" 46 #include "ih264d_mb_utils.h" 47 48 void ih264d_unpack_coeff4x4_dc_4x4blk(tu_sblk4x4_coeff_data_t *ps_tu_4x4, 49 WORD16 *pi2_out_coeff_data, 50 UWORD8 *pu1_inv_scan); 51 52 /*****************************************************************************/ 53 /* */ 54 /* Function Name : ih264d_uev */ 55 /* */ 56 /* Description : Reads the unsigned Exp Golomb codec syntax from the */ 57 /* ps_bitstrm as specified in section 9.1 of H264 standard */ 58 /* It also increases bitstream u4_ofst by the number of bits */ 59 /* parsed for UEV decode operation */ 60 /* */ 61 /* Inputs : bitstream base pointer and bitsream u4_ofst in bits */ 62 /* Globals : None */ 63 /* Processing : */ 64 /* Outputs : UEV decoded syntax element and incremented ps_bitstrm u4_ofst */ 65 /* Returns : UEV decoded syntax element */ 66 /* */ 67 /* Issues : Does not check if ps_bitstrm u4_ofst exceeds max ps_bitstrm i4_size */ 68 /* for performamce. Caller might have to do error resilence */ 69 /* check for bitstream overflow */ 70 /* */ 71 /* Revision History: */ 72 /* */ 73 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 74 /* 19 09 2008 Jay Draft */ 75 /* */ 76 /*****************************************************************************/ 77 UWORD32 ih264d_uev(UWORD32 *pu4_bitstrm_ofst, UWORD32 *pu4_bitstrm_buf) 78 { 79 UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; 80 UWORD32 u4_word, u4_ldz; 81 82 /***************************************************************/ 83 /* Find leading zeros in next 32 bits */ 84 /***************************************************************/ 85 NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); 86 u4_ldz = CLZ(u4_word); 87 /* Flush the ps_bitstrm */ 88 u4_bitstream_offset += (u4_ldz + 1); 89 /* Read the suffix from the ps_bitstrm */ 90 u4_word = 0; 91 if(u4_ldz) 92 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); 93 *pu4_bitstrm_ofst = u4_bitstream_offset; 94 return ((1 << u4_ldz) + u4_word - 1); 95 } 96 97 /*****************************************************************************/ 98 /* */ 99 /* Function Name : ih264d_sev */ 100 /* */ 101 /* Description : Reads the signed Exp Golomb codec syntax from the ps_bitstrm */ 102 /* as specified in section 9.1 of H264 standard. */ 103 /* It also increases bitstream u4_ofst by the number of bits */ 104 /* parsed for SEV decode operation */ 105 /* */ 106 /* Inputs : bitstream base pointer and bitsream u4_ofst in bits */ 107 /* Globals : None */ 108 /* Processing : */ 109 /* Outputs : SEV decoded syntax element and incremented ps_bitstrm u4_ofst */ 110 /* Returns : SEV decoded syntax element */ 111 /* */ 112 /* Issues : Does not check if ps_bitstrm u4_ofst exceeds max ps_bitstrm i4_size */ 113 /* for performamce. Caller might have to do error resilence */ 114 /* check for bitstream overflow */ 115 /* */ 116 /* Revision History: */ 117 /* */ 118 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 119 /* 19 09 2008 Jay Draft */ 120 /* */ 121 /*****************************************************************************/ 122 WORD32 ih264d_sev(UWORD32 *pu4_bitstrm_ofst, UWORD32 *pu4_bitstrm_buf) 123 { 124 UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; 125 UWORD32 u4_word, u4_ldz, u4_abs_val; 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 133 /* Flush the ps_bitstrm */ 134 u4_bitstream_offset += (u4_ldz + 1); 135 136 /* Read the suffix from the ps_bitstrm */ 137 u4_word = 0; 138 if(u4_ldz) 139 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); 140 141 *pu4_bitstrm_ofst = u4_bitstream_offset; 142 u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1; 143 144 if(u4_word & 0x1) 145 return (-(WORD32)u4_abs_val); 146 else 147 return (u4_abs_val); 148 } 149 150 /*****************************************************************************/ 151 /* */ 152 /* Function Name : get_tev_range_1 */ 153 /* */ 154 /* Description : Reads the TEV Exp Golomb codec syntax from the ps_bitstrm */ 155 /* as specified in section 9.1 of H264 standard. This will */ 156 /* called only when the input range is 1 for TEV decode. */ 157 /* If range is more than 1, then UEV decode is done */ 158 /* */ 159 /* Inputs : bitstream base pointer and bitsream u4_ofst in bits */ 160 /* Globals : None */ 161 /* Processing : */ 162 /* Outputs : TEV decoded syntax element and incremented ps_bitstrm u4_ofst */ 163 /* Returns : TEV decoded syntax element */ 164 /* */ 165 /* Issues : Does not check if ps_bitstrm u4_ofst exceeds max ps_bitstrm i4_size */ 166 /* for performamce. Caller might have to do error resilence */ 167 /* check for bitstream overflow */ 168 /* */ 169 /* Revision History: */ 170 /* */ 171 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 172 /* 19 09 2008 Jay Draft */ 173 /* */ 174 /*****************************************************************************/ 175 UWORD32 ih264d_tev_range1(UWORD32 *pu4_bitstrm_ofst, UWORD32 *pu4_bitstrm_buf) 176 { 177 UWORD32 u4_code; 178 GETBIT(u4_code, *pu4_bitstrm_ofst, pu4_bitstrm_buf); 179 return (!u4_code); 180 } 181 182 /*! 183 ************************************************************************** 184 * \if Function name : ih264d_uvlc \endif 185 * 186 * \brief 187 * 188 * Reads the unsigned/signed/truncated integer Exp-Golomb-coded syntax element 189 * with the left bit first. The parsing process for this descriptor is specified 190 * in subclause 9.1. 191 * 192 * \param ps_bitstrm : Pointer to Bitstream Structure . 193 * \param u4_range : Range value in case of Truncated Exp-Golomb-code 194 * \param pi_bitstrm_ofst : Pointer to the local copy of Bitstream u4_ofst 195 * \param u1_flag : Flag indicating the case of UEV,SEV or TEV 196 * \param u4_bitstrm_ofst : Local copy of Bitstream u4_ofst 197 * \param pu4_bitstrm_buf : Pointer to the Bitstream buffer 198 * 199 * \return 200 * Returns Code Value. 201 * 202 ************************************************************************** 203 */ 204 205 WORD32 ih264d_uvlc(dec_bit_stream_t *ps_bitstrm, 206 UWORD32 u4_range, 207 UWORD32 *pi_bitstrm_ofst, 208 UWORD8 u1_flag, 209 UWORD32 u4_bitstrm_ofst, 210 UWORD32 *pu4_bitstrm_buf) 211 { 212 UWORD32 word, word2, cur_bit, cur_word, code_val, code_num, clz; 213 214 SWITCHOFFTRACE; 215 cur_bit = u4_bitstrm_ofst & 0x1F; 216 cur_word = u4_bitstrm_ofst >> 5; 217 word = pu4_bitstrm_buf[cur_word]; 218 word2 = pu4_bitstrm_buf[cur_word + 1]; 219 220 if(cur_bit != 0) 221 { 222 word <<= cur_bit; 223 word2 >>= (32 - cur_bit); 224 word |= word2; 225 } 226 227 if(u1_flag == TEV && u4_range == 1) 228 { 229 word >>= 31; 230 word = 1 - word; 231 (*pi_bitstrm_ofst)++; 232 ps_bitstrm->u4_ofst = *pi_bitstrm_ofst; 233 return (WORD32)word; 234 } 235 236 //finding clz 237 { 238 UWORD32 ui32_code, ui32_mask; 239 240 ui32_code = word; 241 ui32_mask = 0x80000000; 242 clz = 0; 243 244 /* DSP implements this with LMBD instruction */ 245 /* so there we don't need to break the loop */ 246 while(!(ui32_code & ui32_mask)) 247 { 248 clz++; 249 ui32_mask >>= 1; 250 if(0 == ui32_mask) 251 break; 252 } 253 } 254 255 if(clz == 0) 256 { 257 *pi_bitstrm_ofst = *pi_bitstrm_ofst + (2 * clz) + 1; 258 ps_bitstrm->u4_ofst = *pi_bitstrm_ofst; 259 return 0; 260 } 261 262 word <<= (clz + 1); 263 word >>= (32 - clz); 264 code_num = (1 << clz) + word - 1; 265 *pi_bitstrm_ofst = *pi_bitstrm_ofst + (2 * clz) + 1; 266 ps_bitstrm->u4_ofst = *pi_bitstrm_ofst; 267 268 if(u1_flag == TEV || u1_flag == UEV) 269 return (WORD32)code_num; 270 271 code_val = (code_num + 1) >> 1; 272 if(!(code_num & 0x01)) 273 return -((WORD32)code_val); 274 return (WORD32)code_val; 275 276 } 277 278 /*****************************************************************************/ 279 /* */ 280 /* Function Name : ih264d_cavlc_4x4res_block_totalcoeff_1 */ 281 /* */ 282 /* Description : This function does cavlc decoding of 4x4 block residual */ 283 /* coefficient when total coeff is equal to 1. The parsing */ 284 /* is done as defined in section 9.2.2 and 9.2.3 of the */ 285 /* H264 standard. */ 286 /* */ 287 /* Inputs : <What inputs does the function take?> */ 288 /* Globals : <Does it use any global variables?> */ 289 /* Processing : <Describe how the function operates - include algorithm */ 290 /* description> */ 291 /* Outputs : <What does the function produce?> */ 292 /* Returns : <What does the function return?> */ 293 /* */ 294 /* Issues : <List any issues or problems with this function> */ 295 /* */ 296 /* Revision History: */ 297 /* */ 298 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 299 /* 25 09 2008 Jay Draft */ 300 /* */ 301 /*****************************************************************************/ 302 WORD32 ih264d_cavlc_4x4res_block_totalcoeff_1(UWORD32 u4_isdc, 303 UWORD32 u4_total_coeff_trail_one, 304 dec_bit_stream_t *ps_bitstrm) 305 { 306 307 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 308 UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst; 309 UWORD32 u4_trailing_ones = u4_total_coeff_trail_one & 0xFFFF; 310 WORD32 i2_level; 311 UWORD32 u4_tot_zero, u4_ldz, u4_scan_pos; 312 313 tu_sblk4x4_coeff_data_t *ps_tu_4x4; 314 WORD16 *pi2_coeff_data; 315 dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle; 316 317 ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data; 318 ps_tu_4x4->u2_sig_coeff_map = 0; 319 pi2_coeff_data = &ps_tu_4x4->ai2_level[0]; 320 321 322 if(u4_trailing_ones) 323 { 324 UWORD32 u4_sign; 325 /****************************************************************/ 326 /* Decode Trailing One as in section 9.2.2 */ 327 /****************************************************************/ 328 GETBIT(u4_sign, u4_bitstream_offset, pu4_bitstrm_buf); 329 i2_level = u4_sign ? -1 : 1; 330 } 331 else 332 { 333 /****************************************************************/ 334 /* Decoding Level based on prefix and suffix as in 9.2.2 */ 335 /****************************************************************/ 336 UWORD32 u4_lev_suffix, u4_lev_suffix_size; 337 WORD32 u2_lev_code, u2_abs_value; 338 UWORD32 u4_lev_prefix; 339 /***************************************************************/ 340 /* Find leading zeros in next 32 bits */ 341 /***************************************************************/ 342 FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset, 343 pu4_bitstrm_buf); 344 u2_lev_code = (2 + MIN(u4_lev_prefix, 15)); 345 346 if(14 == u4_lev_prefix) 347 u4_lev_suffix_size = 4; 348 else if(15 <= u4_lev_prefix) 349 { 350 u2_lev_code += 15; 351 u4_lev_suffix_size = u4_lev_prefix - 3; 352 } 353 else 354 u4_lev_suffix_size = 0; 355 356 //HP_LEVEL_PREFIX 357 if(16 <= u4_lev_prefix) 358 { 359 u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096); 360 } 361 if(u4_lev_suffix_size) 362 { 363 GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf, 364 u4_lev_suffix_size); 365 u2_lev_code += u4_lev_suffix; 366 } 367 368 u2_abs_value = (u2_lev_code + 2) >> 1; 369 /*********************************************************/ 370 /* If Level code is odd, level is negative else positive */ 371 /*********************************************************/ 372 i2_level = (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value; 373 374 } 375 376 /****************************************************************/ 377 /* Decoding total zeros as in section 9.2.3, table 9.7 */ 378 /****************************************************************/ 379 FIND_ONE_IN_STREAM_LEN(u4_ldz, u4_bitstream_offset, pu4_bitstrm_buf, 8); 380 381 if(u4_ldz) 382 { 383 GETBIT(u4_tot_zero, u4_bitstream_offset, pu4_bitstrm_buf); 384 u4_tot_zero = (u4_ldz << 1) - u4_tot_zero; 385 } 386 else 387 u4_tot_zero = 0; 388 389 /***********************************************************************/ 390 /* Inverse scan and store residual coeff. Update the bitstream u4_ofst */ 391 /***********************************************************************/ 392 u4_scan_pos = u4_tot_zero + u4_isdc; 393 if(u4_scan_pos > 15) 394 return -1; 395 396 SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos); 397 *pi2_coeff_data++ = i2_level; 398 399 400 { 401 WORD32 offset; 402 offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4; 403 offset = ALIGN4(offset); 404 ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset); 405 } 406 407 ps_bitstrm->u4_ofst = u4_bitstream_offset; 408 return 0; 409 } 410 411 /*****************************************************************************/ 412 /* */ 413 /* Function Name : ih264d_cavlc_4x4res_block_totalcoeff_2to10 */ 414 /* */ 415 /* Description : This function does cavlc decoding of 4x4 block residual */ 416 /* coefficient when total coeffs are between two and ten */ 417 /* inclusive. Parsing is done as defined in section 9.2.2 */ 418 /* and 9.2.3 the H264 standard. */ 419 /* */ 420 /* Inputs : <What inputs does the function take?> */ 421 /* Globals : <Does it use any global variables?> */ 422 /* Processing : <Describe how the function operates - include algorithm */ 423 /* description> */ 424 /* Outputs : <What does the function produce?> */ 425 /* Returns : <What does the function return?> */ 426 /* */ 427 /* Issues : <List any issues or problems with this function> */ 428 /* */ 429 /* Revision History: */ 430 /* */ 431 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 432 /* 25 09 2008 Jay Draft */ 433 /* */ 434 /*****************************************************************************/ 435 436 WORD32 ih264d_cavlc_4x4res_block_totalcoeff_2to10(UWORD32 u4_isdc, 437 UWORD32 u4_total_coeff_trail_one, /*!<TotalCoefficients<<16+trailingones*/ 438 dec_bit_stream_t *ps_bitstrm) 439 { 440 UWORD32 u4_total_zeroes; 441 WORD32 i; 442 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 443 UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst; 444 UWORD32 u4_trailing_ones = u4_total_coeff_trail_one & 0xFFFF; 445 UWORD32 u4_total_coeff = u4_total_coeff_trail_one >> 16; 446 // To avoid error check at 4x4 level, allocating for 3 extra levels(16+3) 447 // since u4_trailing_ones can at the max be 3. This will be required when 448 // u4_total_coeff is less than u4_trailing_ones 449 WORD16 ai2_level_arr[19]; 450 WORD16 *i2_level_arr = &ai2_level_arr[3]; 451 452 tu_sblk4x4_coeff_data_t *ps_tu_4x4; 453 WORD16 *pi2_coeff_data; 454 dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle; 455 456 ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data; 457 ps_tu_4x4->u2_sig_coeff_map = 0; 458 pi2_coeff_data = &ps_tu_4x4->ai2_level[0]; 459 460 i = u4_total_coeff - 1; 461 462 if(u4_trailing_ones) 463 { 464 /*********************************************************************/ 465 /* Decode Trailing Ones */ 466 /* read the sign of T1's and put them in level array */ 467 /*********************************************************************/ 468 UWORD32 u4_signs, u4_cnt = u4_trailing_ones; 469 WORD16 (*ppi2_trlone_lkup)[3] = 470 (WORD16 (*)[3])gai2_ih264d_trailing_one_level; 471 WORD16 *pi2_trlone_lkup; 472 473 GETBITS(u4_signs, u4_bitstream_offset, pu4_bitstrm_buf, u4_cnt); 474 475 pi2_trlone_lkup = ppi2_trlone_lkup[(1 << u4_cnt) - 2 + u4_signs]; 476 477 while(u4_cnt--) 478 i2_level_arr[i--] = *pi2_trlone_lkup++; 479 } 480 481 /****************************************************************/ 482 /* Decoding Levels Begins */ 483 /****************************************************************/ 484 if(i >= 0) 485 { 486 /****************************************************************/ 487 /* First level is decoded outside the loop as it has lot of */ 488 /* special cases. */ 489 /****************************************************************/ 490 UWORD32 u4_lev_suffix, u4_suffix_len, u4_lev_suffix_size; 491 WORD32 u2_lev_code, u2_abs_value; 492 UWORD32 u4_lev_prefix; 493 494 /***************************************************************/ 495 /* u4_suffix_len = 0, Find leading zeros in next 32 bits */ 496 /***************************************************************/ 497 FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset, 498 pu4_bitstrm_buf); 499 500 /*********************************************************/ 501 /* Special decoding case when trailing ones are 3 */ 502 /*********************************************************/ 503 u2_lev_code = MIN(15, u4_lev_prefix); 504 505 u2_lev_code += (3 == u4_trailing_ones) ? 0 : 2; 506 507 if(14 == u4_lev_prefix) 508 u4_lev_suffix_size = 4; 509 else if(15 <= u4_lev_prefix) 510 { 511 u2_lev_code += 15; 512 u4_lev_suffix_size = u4_lev_prefix - 3; 513 } 514 else 515 u4_lev_suffix_size = 0; 516 517 //HP_LEVEL_PREFIX 518 if(16 <= u4_lev_prefix) 519 { 520 u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096); 521 } 522 if(u4_lev_suffix_size) 523 { 524 GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf, 525 u4_lev_suffix_size); 526 u2_lev_code += u4_lev_suffix; 527 } 528 529 u2_abs_value = (u2_lev_code + 2) >> 1; 530 /*********************************************************/ 531 /* If Level code is odd, level is negative else positive */ 532 /*********************************************************/ 533 i2_level_arr[i--] = (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value; 534 535 u4_suffix_len = (u2_abs_value > 3) ? 2 : 1; 536 537 /*********************************************************/ 538 /* Now loop over the remaining levels */ 539 /*********************************************************/ 540 while(i >= 0) 541 { 542 543 /***************************************************************/ 544 /* Find leading zeros in next 32 bits */ 545 /***************************************************************/ 546 FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset, 547 pu4_bitstrm_buf); 548 549 u4_lev_suffix_size = 550 (15 <= u4_lev_prefix) ? 551 (u4_lev_prefix - 3) : u4_suffix_len; 552 553 /*********************************************************/ 554 /* Compute level code using prefix and suffix */ 555 /*********************************************************/ 556 GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf, 557 u4_lev_suffix_size); 558 u2_lev_code = (MIN(15,u4_lev_prefix) << u4_suffix_len) 559 + u4_lev_suffix; 560 561 //HP_LEVEL_PREFIX 562 if(16 <= u4_lev_prefix) 563 { 564 u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096); 565 } 566 u2_abs_value = (u2_lev_code + 2) >> 1; 567 568 /*********************************************************/ 569 /* If Level code is odd, level is negative else positive */ 570 /*********************************************************/ 571 i2_level_arr[i--] = 572 (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value; 573 574 /*********************************************************/ 575 /* Increment suffix length if required */ 576 /*********************************************************/ 577 u4_suffix_len += 578 (u4_suffix_len < 6) ? 579 (u2_abs_value 580 > (3 581 << (u4_suffix_len 582 - 1))) : 583 0; 584 } 585 586 /****************************************************************/ 587 /* Decoding Levels Ends */ 588 /****************************************************************/ 589 } 590 591 /****************************************************************/ 592 /* Decoding total zeros as in section 9.2.3, table 9.7 */ 593 /****************************************************************/ 594 { 595 UWORD32 u4_index; 596 const UWORD8 (*ppu1_total_zero_lkup)[64] = 597 (const UWORD8 (*)[64])gau1_ih264d_table_total_zero_2to10; 598 599 NEXTBITS(u4_index, u4_bitstream_offset, pu4_bitstrm_buf, 6); 600 u4_total_zeroes = ppu1_total_zero_lkup[u4_total_coeff - 2][u4_index]; 601 602 FLUSHBITS(u4_bitstream_offset, (u4_total_zeroes >> 4)); 603 u4_total_zeroes &= 0xf; 604 } 605 606 /**************************************************************/ 607 /* Decode the runs and form the coefficient buffer */ 608 /**************************************************************/ 609 { 610 const UWORD8 *pu1_table_runbefore; 611 UWORD32 u4_run; 612 WORD32 k; 613 UWORD32 u4_scan_pos = u4_total_coeff + u4_total_zeroes - 1 + u4_isdc; 614 WORD32 u4_zeroes_left = u4_total_zeroes; 615 k = u4_total_coeff - 1; 616 617 /**************************************************************/ 618 /* Decoding Runs Begin for zeros left > 6 */ 619 /**************************************************************/ 620 while((u4_zeroes_left > 6) && k) 621 { 622 UWORD32 u4_code; 623 624 NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 3); 625 626 if(u4_code != 0) 627 { 628 FLUSHBITS(u4_bitstream_offset, 3); 629 u4_run = (7 - u4_code); 630 } 631 else 632 { 633 634 FIND_ONE_IN_STREAM_LEN(u4_code, u4_bitstream_offset, 635 pu4_bitstrm_buf, 11); 636 u4_run = (4 + u4_code); 637 } 638 639 SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos); 640 *pi2_coeff_data++ = i2_level_arr[k--]; 641 u4_zeroes_left -= u4_run; 642 u4_scan_pos -= (u4_run + 1); 643 } 644 645 /**************************************************************/ 646 /* Decoding Runs for 0 < zeros left <=6 */ 647 /**************************************************************/ 648 pu1_table_runbefore = (UWORD8 *)gau1_ih264d_table_run_before; 649 while((u4_zeroes_left > 0) && k) 650 { 651 UWORD32 u4_code; 652 NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 3); 653 654 u4_code = pu1_table_runbefore[u4_code + (u4_zeroes_left << 3)]; 655 u4_run = u4_code >> 2; 656 657 FLUSHBITS(u4_bitstream_offset, (u4_code & 0x03)); 658 659 SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos); 660 *pi2_coeff_data++ = i2_level_arr[k--]; 661 u4_zeroes_left -= u4_run; 662 u4_scan_pos -= (u4_run + 1); 663 } 664 /**************************************************************/ 665 /* Decoding Runs End */ 666 /**************************************************************/ 667 668 /**************************************************************/ 669 /* Copy the remaining coefficients */ 670 /**************************************************************/ 671 if(u4_zeroes_left < 0) 672 return -1; 673 while(k >= 0) 674 { 675 676 SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos); 677 *pi2_coeff_data++ = i2_level_arr[k--]; 678 u4_scan_pos--; 679 } 680 } 681 682 { 683 WORD32 offset; 684 offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4; 685 offset = ALIGN4(offset); 686 ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset); 687 } 688 689 ps_bitstrm->u4_ofst = u4_bitstream_offset; 690 return 0; 691 } 692 693 /*****************************************************************************/ 694 /* */ 695 /* Function Name : ih264d_cavlc_4x4res_block_totalcoeff_11to16 */ 696 /* */ 697 /* Description : This function does cavlc decoding of 4x4 block residual */ 698 /* coefficient when total coeffs are greater than ten. */ 699 /* Parsing is done as defined in section 9.2.2 and 9.2.3 of */ 700 /* the H264 standard. */ 701 /* */ 702 /* Inputs : <What inputs does the function take?> */ 703 /* Globals : <Does it use any global variables?> */ 704 /* Processing : <Describe how the function operates - include algorithm */ 705 /* description> */ 706 /* Outputs : <What does the function produce?> */ 707 /* Returns : <What does the function return?> */ 708 /* */ 709 /* Issues : <List any issues or problems with this function> */ 710 /* */ 711 /* Revision History: */ 712 /* */ 713 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 714 /* 25 09 2008 Jay Draft */ 715 /* */ 716 /*****************************************************************************/ 717 718 WORD32 ih264d_cavlc_4x4res_block_totalcoeff_11to16(UWORD32 u4_isdc, 719 UWORD32 u4_total_coeff_trail_one, /*!<TotalCoefficients<<16+trailingones*/ 720 dec_bit_stream_t *ps_bitstrm ) 721 { 722 UWORD32 u4_total_zeroes; 723 WORD32 i; 724 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 725 UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst; 726 UWORD32 u4_trailing_ones = u4_total_coeff_trail_one & 0xFFFF; 727 UWORD32 u4_total_coeff = u4_total_coeff_trail_one >> 16; 728 // To avoid error check at 4x4 level, allocating for 3 extra levels(16+3) 729 // since u4_trailing_ones can at the max be 3. This will be required when 730 // u4_total_coeff is less than u4_trailing_ones 731 WORD16 ai2_level_arr[19];// 732 WORD16 *i2_level_arr = &ai2_level_arr[3]; 733 734 tu_sblk4x4_coeff_data_t *ps_tu_4x4; 735 WORD16 *pi2_coeff_data; 736 dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle; 737 738 ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data; 739 ps_tu_4x4->u2_sig_coeff_map = 0; 740 pi2_coeff_data = &ps_tu_4x4->ai2_level[0]; 741 742 i = u4_total_coeff - 1; 743 if(u4_trailing_ones) 744 { 745 /*********************************************************************/ 746 /* Decode Trailing Ones */ 747 /* read the sign of T1's and put them in level array */ 748 /*********************************************************************/ 749 UWORD32 u4_signs, u4_cnt = u4_trailing_ones; 750 WORD16 (*ppi2_trlone_lkup)[3] = 751 (WORD16 (*)[3])gai2_ih264d_trailing_one_level; 752 WORD16 *pi2_trlone_lkup; 753 754 GETBITS(u4_signs, u4_bitstream_offset, pu4_bitstrm_buf, u4_cnt); 755 756 pi2_trlone_lkup = ppi2_trlone_lkup[(1 << u4_cnt) - 2 + u4_signs]; 757 758 while(u4_cnt--) 759 i2_level_arr[i--] = *pi2_trlone_lkup++; 760 } 761 762 /****************************************************************/ 763 /* Decoding Levels Begins */ 764 /****************************************************************/ 765 if(i >= 0) 766 { 767 /****************************************************************/ 768 /* First level is decoded outside the loop as it has lot of */ 769 /* special cases. */ 770 /****************************************************************/ 771 UWORD32 u4_lev_suffix, u4_suffix_len, u4_lev_suffix_size; 772 UWORD16 u2_lev_code, u2_abs_value; 773 UWORD32 u4_lev_prefix; 774 775 if(u4_trailing_ones < 3) 776 { 777 /*********************************************************/ 778 /* u4_suffix_len = 1 */ 779 /*********************************************************/ 780 /***************************************************************/ 781 /* Find leading zeros in next 32 bits */ 782 /***************************************************************/ 783 FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset, 784 pu4_bitstrm_buf); 785 786 u4_lev_suffix_size = 787 (15 <= u4_lev_prefix) ? (u4_lev_prefix - 3) : 1; 788 789 GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf, 790 u4_lev_suffix_size); 791 u2_lev_code = 2 + (MIN(u4_lev_prefix,15) << 1) + u4_lev_suffix; 792 793 //HP_LEVEL_PREFIX 794 if(16 <= u4_lev_prefix) 795 { 796 u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096); 797 } 798 } 799 else 800 { 801 /*********************************************************/ 802 /*u4_suffix_len = 0 */ 803 /*********************************************************/ 804 /***************************************************************/ 805 /* Find leading zeros in next 32 bits */ 806 /***************************************************************/ 807 FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset, 808 pu4_bitstrm_buf); 809 810 /*********************************************************/ 811 /* Special decoding case when trailing ones are 3 */ 812 /*********************************************************/ 813 u2_lev_code = MIN(15, u4_lev_prefix); 814 815 u2_lev_code += (3 == u4_trailing_ones) ? 0 : (2); 816 817 if(14 == u4_lev_prefix) 818 u4_lev_suffix_size = 4; 819 else if(15 <= u4_lev_prefix) 820 { 821 u2_lev_code += 15; 822 u4_lev_suffix_size = (u4_lev_prefix - 3); 823 } 824 else 825 u4_lev_suffix_size = 0; 826 827 //HP_LEVEL_PREFIX 828 if(16 <= u4_lev_prefix) 829 { 830 u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096); 831 } 832 if(u4_lev_suffix_size) 833 { 834 GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf, 835 u4_lev_suffix_size); 836 u2_lev_code += u4_lev_suffix; 837 } 838 } 839 840 u2_abs_value = (u2_lev_code + 2) >> 1; 841 /*********************************************************/ 842 /* If Level code is odd, level is negative else positive */ 843 /*********************************************************/ 844 i2_level_arr[i--] = (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value; 845 846 u4_suffix_len = (u2_abs_value > 3) ? 2 : 1; 847 848 /*********************************************************/ 849 /* Now loop over the remaining levels */ 850 /*********************************************************/ 851 while(i >= 0) 852 { 853 854 /***************************************************************/ 855 /* Find leading zeros in next 32 bits */ 856 /***************************************************************/ 857 FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset, 858 pu4_bitstrm_buf); 859 860 u4_lev_suffix_size = 861 (15 <= u4_lev_prefix) ? 862 (u4_lev_prefix - 3) : u4_suffix_len; 863 864 /*********************************************************/ 865 /* Compute level code using prefix and suffix */ 866 /*********************************************************/ 867 GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf, 868 u4_lev_suffix_size); 869 u2_lev_code = (MIN(15,u4_lev_prefix) << u4_suffix_len) 870 + u4_lev_suffix; 871 872 //HP_LEVEL_PREFIX 873 if(16 <= u4_lev_prefix) 874 { 875 u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096); 876 } 877 u2_abs_value = (u2_lev_code + 2) >> 1; 878 879 /*********************************************************/ 880 /* If Level code is odd, level is negative else positive */ 881 /*********************************************************/ 882 i2_level_arr[i--] = 883 (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value; 884 885 /*********************************************************/ 886 /* Increment suffix length if required */ 887 /*********************************************************/ 888 u4_suffix_len += 889 (u4_suffix_len < 6) ? 890 (u2_abs_value 891 > (3 892 << (u4_suffix_len 893 - 1))) : 894 0; 895 } 896 897 /****************************************************************/ 898 /* Decoding Levels Ends */ 899 /****************************************************************/ 900 } 901 902 if(u4_total_coeff < (16 - u4_isdc)) 903 { 904 UWORD32 u4_index; 905 const UWORD8 (*ppu1_total_zero_lkup)[16] = 906 (const UWORD8 (*)[16])gau1_ih264d_table_total_zero_11to15; 907 908 NEXTBITS(u4_index, u4_bitstream_offset, pu4_bitstrm_buf, 4); 909 u4_total_zeroes = ppu1_total_zero_lkup[u4_total_coeff - 11][u4_index]; 910 911 FLUSHBITS(u4_bitstream_offset, (u4_total_zeroes >> 4)); 912 u4_total_zeroes &= 0xf; 913 } 914 else 915 u4_total_zeroes = 0; 916 917 /**************************************************************/ 918 /* Decode the runs and form the coefficient buffer */ 919 /**************************************************************/ 920 { 921 const UWORD8 *pu1_table_runbefore; 922 UWORD32 u4_run; 923 WORD32 k; 924 UWORD32 u4_scan_pos = u4_total_coeff + u4_total_zeroes - 1 + u4_isdc; 925 WORD32 u4_zeroes_left = u4_total_zeroes; 926 k = u4_total_coeff - 1; 927 928 /**************************************************************/ 929 /* Decoding Runs for 0 < zeros left <=6 */ 930 /**************************************************************/ 931 pu1_table_runbefore = (UWORD8 *)gau1_ih264d_table_run_before; 932 while((u4_zeroes_left > 0) && k) 933 { 934 UWORD32 u4_code; 935 NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 3); 936 937 u4_code = pu1_table_runbefore[u4_code + (u4_zeroes_left << 3)]; 938 u4_run = u4_code >> 2; 939 940 FLUSHBITS(u4_bitstream_offset, (u4_code & 0x03)); 941 SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos); 942 *pi2_coeff_data++ = i2_level_arr[k--]; 943 u4_zeroes_left -= u4_run; 944 u4_scan_pos -= (u4_run + 1); 945 } 946 /**************************************************************/ 947 /* Decoding Runs End */ 948 /**************************************************************/ 949 950 /**************************************************************/ 951 /* Copy the remaining coefficients */ 952 /**************************************************************/ 953 if(u4_zeroes_left < 0) 954 return -1; 955 while(k >= 0) 956 { 957 SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos); 958 *pi2_coeff_data++ = i2_level_arr[k--]; 959 u4_scan_pos--; 960 } 961 } 962 963 { 964 WORD32 offset; 965 offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4; 966 offset = ALIGN4(offset); 967 ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset); 968 } 969 970 ps_bitstrm->u4_ofst = u4_bitstream_offset; 971 return 0; 972 } 973 974 /*****************************************************************************/ 975 /* */ 976 /* Function Name : ih264d_rest_of_residual_cav_chroma_dc_block */ 977 /* */ 978 /* Description : This function does the Cavlc parsing of the bitstream */ 979 /* for chroma dc coefficients */ 980 /* Inputs : <What inputs does the function take?> */ 981 /* Globals : <Does it use any global variables?> */ 982 /* Processing : <Describe how the function operates - include algorithm */ 983 /* description> */ 984 /* Outputs : <What does the function produce?> */ 985 /* Returns : <What does the function return?> */ 986 /* */ 987 /* Issues : <List any issues or problems with this function> */ 988 /* */ 989 /* Revision History: */ 990 /* */ 991 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 992 /* 15 09 2008 Jay Draft */ 993 /* */ 994 /*****************************************************************************/ 995 void ih264d_rest_of_residual_cav_chroma_dc_block(UWORD32 u4_total_coeff_trail_one, 996 dec_bit_stream_t *ps_bitstrm) 997 { 998 UWORD32 u4_total_zeroes; 999 WORD16 i; 1000 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 1001 UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst; 1002 UWORD32 u4_trailing_ones = u4_total_coeff_trail_one & 0xFFFF; 1003 UWORD32 u4_total_coeff = u4_total_coeff_trail_one >> 16; 1004 // To avoid error check at 4x4 level, allocating for 3 extra levels(4+3) 1005 // since u4_trailing_ones can at the max be 3. This will be required when 1006 // u4_total_coeff is less than u4_trailing_ones 1007 WORD16 ai2_level_arr[7];// 1008 WORD16 *i2_level_arr = &ai2_level_arr[3]; 1009 1010 tu_sblk4x4_coeff_data_t *ps_tu_4x4; 1011 WORD16 *pi2_coeff_data; 1012 dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle; 1013 1014 ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data; 1015 ps_tu_4x4->u2_sig_coeff_map = 0; 1016 pi2_coeff_data = &ps_tu_4x4->ai2_level[0]; 1017 1018 i = u4_total_coeff - 1; 1019 if(u4_trailing_ones) 1020 { 1021 /*********************************************************************/ 1022 /* Decode Trailing Ones */ 1023 /* read the sign of T1's and put them in level array */ 1024 /*********************************************************************/ 1025 UWORD32 u4_signs, u4_cnt = u4_trailing_ones; 1026 WORD16 (*ppi2_trlone_lkup)[3] = 1027 (WORD16 (*)[3])gai2_ih264d_trailing_one_level; 1028 WORD16 *pi2_trlone_lkup; 1029 1030 GETBITS(u4_signs, u4_bitstream_offset, pu4_bitstrm_buf, u4_cnt); 1031 1032 pi2_trlone_lkup = ppi2_trlone_lkup[(1 << u4_cnt) - 2 + u4_signs]; 1033 1034 while(u4_cnt--) 1035 i2_level_arr[i--] = *pi2_trlone_lkup++; 1036 } 1037 1038 /****************************************************************/ 1039 /* Decoding Levels Begins */ 1040 /****************************************************************/ 1041 if(i >= 0) 1042 { 1043 /****************************************************************/ 1044 /* First level is decoded outside the loop as it has lot of */ 1045 /* special cases. */ 1046 /****************************************************************/ 1047 UWORD32 u4_lev_suffix, u4_suffix_len, u4_lev_suffix_size; 1048 UWORD16 u2_lev_code, u2_abs_value; 1049 UWORD32 u4_lev_prefix; 1050 1051 /***************************************************************/ 1052 /* u4_suffix_len = 0, Find leading zeros in next 32 bits */ 1053 /***************************************************************/ 1054 FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset, 1055 pu4_bitstrm_buf); 1056 1057 /*********************************************************/ 1058 /* Special decoding case when trailing ones are 3 */ 1059 /*********************************************************/ 1060 u2_lev_code = MIN(15, u4_lev_prefix); 1061 1062 u2_lev_code += (3 == u4_trailing_ones) ? 0 : (2); 1063 1064 if(14 == u4_lev_prefix) 1065 u4_lev_suffix_size = 4; 1066 else if(15 <= u4_lev_prefix) 1067 { 1068 u2_lev_code += 15; 1069 u4_lev_suffix_size = u4_lev_prefix - 3; 1070 } 1071 else 1072 u4_lev_suffix_size = 0; 1073 1074 //HP_LEVEL_PREFIX 1075 if(16 <= u4_lev_prefix) 1076 { 1077 u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096); 1078 } 1079 if(u4_lev_suffix_size) 1080 { 1081 GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf, 1082 u4_lev_suffix_size); 1083 u2_lev_code += u4_lev_suffix; 1084 } 1085 1086 u2_abs_value = (u2_lev_code + 2) >> 1; 1087 /*********************************************************/ 1088 /* If Level code is odd, level is negative else positive */ 1089 /*********************************************************/ 1090 i2_level_arr[i--] = (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value; 1091 1092 u4_suffix_len = (u2_abs_value > 3) ? 2 : 1; 1093 1094 /*********************************************************/ 1095 /* Now loop over the remaining levels */ 1096 /*********************************************************/ 1097 while(i >= 0) 1098 { 1099 1100 /***************************************************************/ 1101 /* Find leading zeros in next 32 bits */ 1102 /***************************************************************/ 1103 FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset, 1104 pu4_bitstrm_buf); 1105 1106 u4_lev_suffix_size = 1107 (15 <= u4_lev_prefix) ? 1108 (u4_lev_prefix - 3) : u4_suffix_len; 1109 1110 /*********************************************************/ 1111 /* Compute level code using prefix and suffix */ 1112 /*********************************************************/ 1113 GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf, 1114 u4_lev_suffix_size); 1115 u2_lev_code = (MIN(u4_lev_prefix,15) << u4_suffix_len) 1116 + u4_lev_suffix; 1117 1118 //HP_LEVEL_PREFIX 1119 if(16 <= u4_lev_prefix) 1120 { 1121 u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096); 1122 } 1123 u2_abs_value = (u2_lev_code + 2) >> 1; 1124 1125 /*********************************************************/ 1126 /* If Level code is odd, level is negative else positive */ 1127 /*********************************************************/ 1128 i2_level_arr[i--] = 1129 (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value; 1130 1131 /*********************************************************/ 1132 /* Increment suffix length if required */ 1133 /*********************************************************/ 1134 u4_suffix_len += (u2_abs_value > (3 << (u4_suffix_len - 1))); 1135 } 1136 1137 /****************************************************************/ 1138 /* Decoding Levels Ends */ 1139 /****************************************************************/ 1140 } 1141 1142 if(u4_total_coeff < 4) 1143 { 1144 UWORD32 u4_max_ldz = (4 - u4_total_coeff); 1145 FIND_ONE_IN_STREAM_LEN(u4_total_zeroes, u4_bitstream_offset, 1146 pu4_bitstrm_buf, u4_max_ldz); 1147 } 1148 else 1149 u4_total_zeroes = 0; 1150 1151 /**************************************************************/ 1152 /* Decode the runs and form the coefficient buffer */ 1153 /**************************************************************/ 1154 { 1155 const UWORD8 *pu1_table_runbefore; 1156 UWORD32 u4_run; 1157 UWORD32 u4_scan_pos = (u4_total_coeff + u4_total_zeroes - 1); 1158 UWORD32 u4_zeroes_left = u4_total_zeroes; 1159 i = u4_total_coeff - 1; 1160 1161 /**************************************************************/ 1162 /* Decoding Runs for 0 < zeros left <=6 */ 1163 /**************************************************************/ 1164 pu1_table_runbefore = (UWORD8 *)gau1_ih264d_table_run_before; 1165 while(u4_zeroes_left && i) 1166 { 1167 UWORD32 u4_code; 1168 NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 3); 1169 1170 u4_code = pu1_table_runbefore[u4_code + (u4_zeroes_left << 3)]; 1171 u4_run = u4_code >> 2; 1172 1173 FLUSHBITS(u4_bitstream_offset, (u4_code & 0x03)); 1174 SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos); 1175 *pi2_coeff_data++ = i2_level_arr[i--]; 1176 u4_zeroes_left -= u4_run; 1177 u4_scan_pos -= (u4_run + 1); 1178 } 1179 /**************************************************************/ 1180 /* Decoding Runs End */ 1181 /**************************************************************/ 1182 1183 /**************************************************************/ 1184 /* Copy the remaining coefficients */ 1185 /**************************************************************/ 1186 while(i >= 0) 1187 { 1188 SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos); 1189 *pi2_coeff_data++ = i2_level_arr[i--]; 1190 u4_scan_pos--; 1191 } 1192 } 1193 1194 { 1195 WORD32 offset; 1196 offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4; 1197 offset = ALIGN4(offset); 1198 ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset); 1199 } 1200 1201 ps_bitstrm->u4_ofst = u4_bitstream_offset; 1202 } 1203 1204 /*! 1205 ************************************************************************** 1206 * \if Function name : CavlcParsingInvScanInvQuant \endif 1207 * 1208 * \brief 1209 * This function do cavlc parsing of coefficient tokens for any block 1210 * type except chromDc and depending 1211 * on whenther any coefficients to be parsed calls module 1212 * RestOfResidualBlockCavlc. 1213 * 1214 * \return 1215 * Returns total number of non-zero coefficients. 1216 * 1217 ************************************************************************** 1218 */ 1219 1220 WORD32 ih264d_cavlc_parse4x4coeff_n0to7(WORD16 *pi2_coeff_block, 1221 UWORD32 u4_isdc, /* is it a DC block */ 1222 WORD32 u4_n, 1223 dec_struct_t *ps_dec, 1224 UWORD32 *pu4_total_coeff) 1225 { 1226 dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm; 1227 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 1228 UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst; 1229 UWORD32 u4_code, u4_index, u4_ldz; 1230 const UWORD16 *pu2_code = (const UWORD16*)gau2_ih264d_code_gx; 1231 const UWORD16 *pu2_offset_num_vlc = 1232 (const UWORD16 *)gau2_ih264d_offset_num_vlc_tab; 1233 UWORD32 u4_offset_num_vlc = pu2_offset_num_vlc[u4_n]; 1234 1235 1236 UNUSED(pi2_coeff_block); 1237 *pu4_total_coeff = 0; 1238 FIND_ONE_IN_STREAM_32(u4_ldz, u4_bitstream_offset, pu4_bitstrm_buf); 1239 NEXTBITS(u4_index, u4_bitstream_offset, pu4_bitstrm_buf, 3); 1240 u4_index += (u4_ldz << 3); 1241 u4_index += u4_offset_num_vlc; 1242 1243 u4_index = MIN(u4_index, 303); 1244 u4_code = pu2_code[u4_index]; 1245 1246 FLUSHBITS(u4_bitstream_offset, (u4_code & 0x03)); 1247 ps_bitstrm->u4_ofst = u4_bitstream_offset; 1248 *pu4_total_coeff = (u4_code >> 4); 1249 1250 if(*pu4_total_coeff) 1251 { 1252 UWORD32 u4_trailing_ones, u4_offset, u4_total_coeff_tone; 1253 const UWORD8 *pu1_offset = 1254 (UWORD8 *)gau1_ih264d_total_coeff_fn_ptr_offset; 1255 WORD32 ret; 1256 u4_trailing_ones = ((u4_code >> 2) & 0x03); 1257 u4_offset = pu1_offset[*pu4_total_coeff - 1]; 1258 u4_total_coeff_tone = (*pu4_total_coeff << 16) | u4_trailing_ones; 1259 1260 ret = ps_dec->pf_cavlc_4x4res_block[u4_offset](u4_isdc, 1261 u4_total_coeff_tone, 1262 ps_bitstrm); 1263 if(ret != 0) 1264 return ERROR_CAVLC_NUM_COEFF_T; 1265 } 1266 1267 return OK; 1268 } 1269 1270 WORD32 ih264d_cavlc_parse4x4coeff_n8(WORD16 *pi2_coeff_block, 1271 UWORD32 u4_isdc, /* is it a DC block */ 1272 WORD32 u4_n, 1273 dec_struct_t *ps_dec, 1274 UWORD32 *pu4_total_coeff) 1275 { 1276 1277 dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm; 1278 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 1279 UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst; 1280 UWORD32 u4_code; 1281 UNUSED(u4_n); 1282 UNUSED(pi2_coeff_block); 1283 GETBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 6); 1284 ps_bitstrm->u4_ofst = u4_bitstream_offset; 1285 *pu4_total_coeff = 0; 1286 1287 if(u4_code != 3) 1288 { 1289 UWORD8 *pu1_offset = (UWORD8 *)gau1_ih264d_total_coeff_fn_ptr_offset; 1290 UWORD32 u4_trailing_ones, u4_offset, u4_total_coeff_tone; 1291 1292 *pu4_total_coeff = (u4_code >> 2) + 1; 1293 u4_trailing_ones = u4_code & 0x03; 1294 u4_offset = pu1_offset[*pu4_total_coeff - 1]; 1295 u4_total_coeff_tone = (*pu4_total_coeff << 16) | u4_trailing_ones; 1296 1297 ps_dec->pf_cavlc_4x4res_block[u4_offset](u4_isdc, 1298 u4_total_coeff_tone, 1299 ps_bitstrm); 1300 } 1301 1302 return OK; 1303 } 1304 1305 /*! 1306 ************************************************************************** 1307 * \if Function name : ih264d_cavlc_parse_chroma_dc \endif 1308 * 1309 * \brief 1310 * This function do cavlc parsing of coefficient tokens chromDc block 1311 * and depending on whenther any coefficients to be parsed calls module 1312 * ih264d_rest_of_residual_cav_chroma_dc_block. 1313 * 1314 * \return 1315 * Returns total number of non-zero coefficients. 1316 * 1317 ************************************************************************** 1318 */ 1319 1320 void ih264d_cavlc_parse_chroma_dc(dec_mb_info_t *ps_cur_mb_info, 1321 WORD16 *pi2_coeff_block, 1322 dec_bit_stream_t *ps_bitstrm, 1323 UWORD32 u4_scale_u, 1324 UWORD32 u4_scale_v, 1325 WORD32 i4_mb_inter_inc) 1326 { 1327 UWORD32 u4_total_coeff, u4_trailing_ones, u4_total_coeff_tone, u4_code; 1328 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 1329 UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst; 1330 const UWORD8 *pu1_cav_chromdc = (const UWORD8*)gau1_ih264d_cav_chromdc_vld; 1331 UNUSED(i4_mb_inter_inc); 1332 /******************************************************************/ 1333 /* Chroma DC Block for U component */ 1334 /******************************************************************/ 1335 NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 8); 1336 1337 u4_code = pu1_cav_chromdc[u4_code]; 1338 1339 FLUSHBITS(u4_bitstream_offset, ((u4_code & 0x7) + 1)); 1340 ps_bitstrm->u4_ofst = u4_bitstream_offset; 1341 1342 u4_total_coeff = (u4_code >> 5); 1343 1344 if(u4_total_coeff) 1345 { 1346 WORD32 i_z0, i_z1, i_z2, i_z3; 1347 tu_sblk4x4_coeff_data_t *ps_tu_4x4; 1348 dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle; 1349 WORD16 ai2_dc_coef[4]; 1350 UWORD8 pu1_inv_scan[4] = 1351 { 0, 1, 2, 3 }; 1352 WORD16 *pi2_coeff_data = 1353 (WORD16 *)ps_dec->pv_parse_tu_coeff_data; 1354 1355 ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data; 1356 1357 u4_trailing_ones = ((u4_code >> 3) & 0x3); 1358 u4_total_coeff_tone = (u4_total_coeff << 16) | u4_trailing_ones; 1359 ih264d_rest_of_residual_cav_chroma_dc_block(u4_total_coeff_tone, 1360 ps_bitstrm); 1361 1362 ai2_dc_coef[0] = 0; 1363 ai2_dc_coef[1] = 0; 1364 ai2_dc_coef[2] = 0; 1365 ai2_dc_coef[3] = 0; 1366 1367 ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4, 1368 ai2_dc_coef, 1369 pu1_inv_scan); 1370 /*-------------------------------------------------------------------*/ 1371 /* Inverse 2x2 transform and scaling of chroma DC */ 1372 /*-------------------------------------------------------------------*/ 1373 i_z0 = (ai2_dc_coef[0] + ai2_dc_coef[2]); 1374 i_z1 = (ai2_dc_coef[0] - ai2_dc_coef[2]); 1375 i_z2 = (ai2_dc_coef[1] - ai2_dc_coef[3]); 1376 i_z3 = (ai2_dc_coef[1] + ai2_dc_coef[3]); 1377 1378 /*-----------------------------------------------------------*/ 1379 /* Scaling and storing the values back */ 1380 /*-----------------------------------------------------------*/ 1381 *pi2_coeff_data++ = ((i_z0 + i_z3) * u4_scale_u) >> 5; 1382 *pi2_coeff_data++ = ((i_z0 - i_z3) * u4_scale_u) >> 5; 1383 *pi2_coeff_data++ = ((i_z1 + i_z2) * u4_scale_u) >> 5; 1384 *pi2_coeff_data++ = ((i_z1 - i_z2) * u4_scale_u) >> 5; 1385 1386 ps_dec->pv_parse_tu_coeff_data = (void *)pi2_coeff_data; 1387 1388 SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag,1); 1389 } 1390 1391 /******************************************************************/ 1392 /* Chroma DC Block for V component */ 1393 /******************************************************************/ 1394 pi2_coeff_block += 64; 1395 u4_bitstream_offset = ps_bitstrm->u4_ofst; 1396 1397 NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 8); 1398 1399 u4_code = pu1_cav_chromdc[u4_code]; 1400 1401 FLUSHBITS(u4_bitstream_offset, ((u4_code & 0x7) + 1)); 1402 ps_bitstrm->u4_ofst = u4_bitstream_offset; 1403 1404 u4_total_coeff = (u4_code >> 5); 1405 1406 if(u4_total_coeff) 1407 { 1408 WORD32 i_z0, i_z1, i_z2, i_z3; 1409 tu_sblk4x4_coeff_data_t *ps_tu_4x4; 1410 dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle; 1411 WORD16 ai2_dc_coef[4]; 1412 UWORD8 pu1_inv_scan[4] = 1413 { 0, 1, 2, 3 }; 1414 WORD16 *pi2_coeff_data = 1415 (WORD16 *)ps_dec->pv_parse_tu_coeff_data; 1416 1417 ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data; 1418 1419 u4_trailing_ones = ((u4_code >> 3) & 0x3); 1420 u4_total_coeff_tone = (u4_total_coeff << 16) | u4_trailing_ones; 1421 ih264d_rest_of_residual_cav_chroma_dc_block(u4_total_coeff_tone, 1422 ps_bitstrm); 1423 1424 ai2_dc_coef[0] = 0; 1425 ai2_dc_coef[1] = 0; 1426 ai2_dc_coef[2] = 0; 1427 ai2_dc_coef[3] = 0; 1428 1429 ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4, 1430 ai2_dc_coef, 1431 pu1_inv_scan); 1432 1433 /*-------------------------------------------------------------------*/ 1434 /* Inverse 2x2 transform and scaling of chroma DC */ 1435 /*-------------------------------------------------------------------*/ 1436 i_z0 = (ai2_dc_coef[0] + ai2_dc_coef[2]); 1437 i_z1 = (ai2_dc_coef[0] - ai2_dc_coef[2]); 1438 i_z2 = (ai2_dc_coef[1] - ai2_dc_coef[3]); 1439 i_z3 = (ai2_dc_coef[1] + ai2_dc_coef[3]); 1440 1441 /*-----------------------------------------------------------*/ 1442 /* Scaling and storing the values back */ 1443 /*-----------------------------------------------------------*/ 1444 *pi2_coeff_data++ = ((i_z0 + i_z3) * u4_scale_v) >> 5; 1445 *pi2_coeff_data++ = ((i_z0 - i_z3) * u4_scale_v) >> 5; 1446 *pi2_coeff_data++ = ((i_z1 + i_z2) * u4_scale_v) >> 5; 1447 *pi2_coeff_data++ = ((i_z1 - i_z2) * u4_scale_v) >> 5; 1448 1449 ps_dec->pv_parse_tu_coeff_data = (void *)pi2_coeff_data; 1450 1451 SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag,2); 1452 } 1453 } 1454 1455 /*****************************************************************************/ 1456 /* */ 1457 /* Function Name : ih264d_parse_pmb_ref_index_cavlc_range1 */ 1458 /* */ 1459 /* Description : This function does the Cavlc TEV range =1 parsing of */ 1460 /* reference index for a P MB. Range is 1 when */ 1461 /* num_ref_idx_active_minus1 is 0 */ 1462 /* */ 1463 /* Inputs : <What inputs does the function take?> */ 1464 /* Globals : <Does it use any global variables?> */ 1465 /* Processing : <Describe how the function operates - include algorithm */ 1466 /* description> */ 1467 /* Outputs : <What does the function produce?> */ 1468 /* Returns : <What does the function return?> */ 1469 /* */ 1470 /* Issues : <List any issues or problems with this function> */ 1471 /* */ 1472 /* Revision History: */ 1473 /* */ 1474 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1475 /* 19 09 2008 Jay Draft */ 1476 /* */ 1477 /*****************************************************************************/ 1478 void ih264d_parse_pmb_ref_index_cavlc_range1(UWORD32 u4_num_part, /* Number of partitions in MB */ 1479 dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */ 1480 WORD8 *pi1_ref_idx, /* pointer to reference index array */ 1481 UWORD32 u4_num_ref_idx_active_minus1 /* Not used for range 1 */ 1482 ) 1483 { 1484 UWORD32 u4_i; 1485 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 1486 UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst; 1487 UNUSED(u4_num_ref_idx_active_minus1); 1488 for(u4_i = 0; u4_i < u4_num_part; u4_i++) 1489 { 1490 UWORD32 u4_ref_idx; 1491 u4_ref_idx = ih264d_tev_range1(pu4_bitstream_off, pu4_bitstrm_buf); 1492 1493 /* Storing Reference Idx Information */ 1494 pi1_ref_idx[u4_i] = (WORD8)u4_ref_idx; 1495 } 1496 } 1497 1498 /*****************************************************************************/ 1499 /* */ 1500 /* Function Name : ih264d_parse_pmb_ref_index_cavlc */ 1501 /* */ 1502 /* Description : This function does the Cavlc TEV range > 1 parsing of */ 1503 /* reference index for a P MB. */ 1504 /* Range > 1 when num_ref_idx_active_minus1 > 0 */ 1505 /* */ 1506 /* Inputs : <What inputs does the function take?> */ 1507 /* Globals : <Does it use any global variables?> */ 1508 /* Processing : <Describe how the function operates - include algorithm */ 1509 /* description> */ 1510 /* Outputs : <What does the function produce?> */ 1511 /* Returns : <What does the function return?> */ 1512 /* */ 1513 /* Issues : <List any issues or problems with this function> */ 1514 /* */ 1515 /* Revision History: */ 1516 /* */ 1517 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1518 /* 19 09 2008 Jay Draft */ 1519 /* */ 1520 /*****************************************************************************/ 1521 1522 WORD32 ih264d_parse_pmb_ref_index_cavlc(UWORD32 u4_num_part, /* Number of partitions in MB */ 1523 dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */ 1524 WORD8 *pi1_ref_idx, /* pointer to reference index array */ 1525 UWORD32 u4_num_ref_idx_active_minus1 /* Number of active references - 1 */ 1526 ) 1527 { 1528 UWORD32 u4_i; 1529 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 1530 UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst; 1531 1532 for(u4_i = 0; u4_i < u4_num_part; u4_i++) 1533 { 1534 UWORD32 u4_ref_idx; 1535 //Inlined ih264d_uev 1536 UWORD32 u4_bitstream_offset = *pu4_bitstream_off; 1537 UWORD32 u4_word, u4_ldz; 1538 1539 /***************************************************************/ 1540 /* Find leading zeros in next 32 bits */ 1541 /***************************************************************/ 1542 NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); 1543 u4_ldz = CLZ(u4_word); 1544 /* Flush the ps_bitstrm */ 1545 u4_bitstream_offset += (u4_ldz + 1); 1546 /* Read the suffix from the ps_bitstrm */ 1547 u4_word = 0; 1548 if(u4_ldz) 1549 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); 1550 *pu4_bitstream_off = u4_bitstream_offset; 1551 u4_ref_idx = ((1 << u4_ldz) + u4_word - 1); 1552 //Inlined ih264d_uev 1553 1554 if(u4_ref_idx > u4_num_ref_idx_active_minus1) 1555 return ERROR_REF_IDX; 1556 1557 /* Storing Reference Idx Information */ 1558 pi1_ref_idx[u4_i] = (WORD8)u4_ref_idx; 1559 } 1560 return OK; 1561 } 1562 1563 /*****************************************************************************/ 1564 /* */ 1565 /* Function Name : ih264d_parse_bmb_ref_index_cavlc_range1 */ 1566 /* */ 1567 /* Description : This function does the Cavlc TEV range =1 parsing of */ 1568 /* reference index for a B MB. Range is 1 when */ 1569 /* num_ref_idx_active_minus1 is 0 */ 1570 /* */ 1571 /* Inputs : <What inputs does the function take?> */ 1572 /* Globals : <Does it use any global variables?> */ 1573 /* Processing : <Describe how the function operates - include algorithm */ 1574 /* description> */ 1575 /* Outputs : <What does the function produce?> */ 1576 /* Returns : <What does the function return?> */ 1577 /* */ 1578 /* Issues : <List any issues or problems with this function> */ 1579 /* */ 1580 /* Revision History: */ 1581 /* */ 1582 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1583 /* 19 09 2008 Jay Draft */ 1584 /* */ 1585 /*****************************************************************************/ 1586 void ih264d_parse_bmb_ref_index_cavlc_range1(UWORD32 u4_num_part, /* Number of partitions in MB */ 1587 dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */ 1588 WORD8 *pi1_ref_idx, /* pointer to reference index array */ 1589 UWORD32 u4_num_ref_idx_active_minus1 /* Not used for range 1 */ 1590 ) 1591 { 1592 UWORD32 u4_i; 1593 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 1594 UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst; 1595 UNUSED(u4_num_ref_idx_active_minus1); 1596 for(u4_i = 0; u4_i < u4_num_part; u4_i++) 1597 { 1598 if(pi1_ref_idx[u4_i] > -1) 1599 { 1600 UWORD32 u4_ref_idx; 1601 1602 u4_ref_idx = ih264d_tev_range1(pu4_bitstream_off, pu4_bitstrm_buf); 1603 1604 /* Storing Reference Idx Information */ 1605 pi1_ref_idx[u4_i] = (WORD8)u4_ref_idx; 1606 } 1607 } 1608 } 1609 1610 /*****************************************************************************/ 1611 /* */ 1612 /* Function Name : ih264d_parse_bmb_ref_index_cavlc */ 1613 /* */ 1614 /* Description : This function does the Cavlc TEV range > 1 parsing of */ 1615 /* reference index for a B MB. */ 1616 /* Range > 1 when num_ref_idx_active_minus1 > 0 */ 1617 /* */ 1618 /* Inputs : <What inputs does the function take?> */ 1619 /* Globals : <Does it use any global variables?> */ 1620 /* Processing : <Describe how the function operates - include algorithm */ 1621 /* description> */ 1622 /* Outputs : <What does the function produce?> */ 1623 /* Returns : <What does the function return?> */ 1624 /* */ 1625 /* Issues : <List any issues or problems with this function> */ 1626 /* */ 1627 /* Revision History: */ 1628 /* */ 1629 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1630 /* 19 09 2008 Jay Draft */ 1631 /* */ 1632 /*****************************************************************************/ 1633 WORD32 ih264d_parse_bmb_ref_index_cavlc(UWORD32 u4_num_part, /* Number of partitions in MB */ 1634 dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */ 1635 WORD8 *pi1_ref_idx, /* pointer to reference index array */ 1636 UWORD32 u4_num_ref_idx_active_minus1 /* Number of active references - 1 */ 1637 ) 1638 { 1639 UWORD32 u4_i; 1640 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 1641 UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst; 1642 1643 for(u4_i = 0; u4_i < u4_num_part; u4_i++) 1644 { 1645 if(pi1_ref_idx[u4_i] > -1) 1646 { 1647 UWORD32 u4_ref_idx; 1648 //inlining ih264d_uev 1649 UWORD32 u4_bitstream_offset = *pu4_bitstream_off; 1650 UWORD32 u4_word, u4_ldz; 1651 1652 /***************************************************************/ 1653 /* Find leading zeros in next 32 bits */ 1654 /***************************************************************/ 1655 NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); 1656 u4_ldz = CLZ(u4_word); 1657 /* Flush the ps_bitstrm */ 1658 u4_bitstream_offset += (u4_ldz + 1); 1659 /* Read the suffix from the ps_bitstrm */ 1660 u4_word = 0; 1661 if(u4_ldz) 1662 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); 1663 *pu4_bitstream_off = u4_bitstream_offset; 1664 u4_ref_idx = ((1 << u4_ldz) + u4_word - 1); 1665 //inlining ih264d_uev 1666 if(u4_ref_idx > u4_num_ref_idx_active_minus1) 1667 return ERROR_REF_IDX; 1668 1669 /* Storing Reference Idx Information */ 1670 pi1_ref_idx[u4_i] = (WORD8)u4_ref_idx; 1671 } 1672 } 1673 return OK; 1674 } 1675 /*****************************************************************************/ 1676 /* */ 1677 /* Function Name : ih264d_cavlc_parse_8x8block_both_available */ 1678 /* */ 1679 /* Description : This function does the residual parsing of 4 subblocks */ 1680 /* in a 8x8 block when both top and left are available */ 1681 /* */ 1682 /* Inputs : pi2_coeff_block : pointer to residual block where */ 1683 /* decoded and inverse scan coefficients are updated */ 1684 /* */ 1685 /* u4_sub_block_strd : indicates the number of sublocks */ 1686 /* in a row. It is 4 for luma and 2 for chroma. */ 1687 /* */ 1688 /* u4_isdc : required to indicate 4x4 parse modules if the */ 1689 /* current Mb is I_16x16/chroma DC coded. */ 1690 /* */ 1691 /* ps_dec : pointer to Decstruct (decoder context) */ 1692 /* */ 1693 /* pu1_top_nnz : top nnz pointer */ 1694 /* */ 1695 /* pu1_left_nnz : left nnz pointer */ 1696 /* */ 1697 /* Globals : No */ 1698 /* Processing : Parsing for four subblocks in unrolled, top and left nnz */ 1699 /* are updated on the fly. csbp is set in accordance to */ 1700 /* decoded numcoeff for the subblock index in raster order */ 1701 /* */ 1702 /* Outputs : The updated residue buffer, nnzs and csbp current block */ 1703 /* */ 1704 /* Returns : Returns the coded sub block pattern csbp for the block */ 1705 /* */ 1706 /* Issues : <List any issues or problems with this function> */ 1707 /* */ 1708 /* Revision History: */ 1709 /* */ 1710 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1711 /* 09 10 2008 Jay Draft */ 1712 /* */ 1713 /*****************************************************************************/ 1714 WORD32 ih264d_cavlc_parse_8x8block_both_available(WORD16 *pi2_coeff_block, 1715 UWORD32 u4_sub_block_strd, 1716 UWORD32 u4_isdc, 1717 dec_struct_t * ps_dec, 1718 UWORD8 *pu1_top_nnz, 1719 UWORD8 *pu1_left_nnz, 1720 UWORD8 u1_tran_form8x8, 1721 UWORD8 u1_mb_field_decodingflag, 1722 UWORD32 *pu4_csbp) 1723 { 1724 UWORD32 u4_num_coeff, u4_n, u4_subblock_coded; 1725 UWORD32 u4_top0, u4_top1; 1726 UWORD32 *pu4_dummy; 1727 WORD32 (**pf_cavlc_parse4x4coeff)(WORD16 *pi2_coeff_block, 1728 UWORD32 u4_isdc, 1729 WORD32 u4_n, 1730 struct _DecStruct *ps_dec, 1731 UWORD32 *pu4_dummy) = 1732 ps_dec->pf_cavlc_parse4x4coeff; 1733 UWORD32 u4_idx = 0; 1734 UWORD8 *puc_temp; 1735 WORD32 ret; 1736 1737 *pu4_csbp = 0; 1738 /* need to change the inverse scan matrices here */ 1739 puc_temp = ps_dec->pu1_inv_scan; 1740 1741 /*------------------------------------------------------*/ 1742 /* Residual 4x4 decoding: SubBlock 0 */ 1743 /*------------------------------------------------------*/ 1744 if(u1_tran_form8x8) 1745 { 1746 if(!u1_mb_field_decodingflag) 1747 { 1748 ps_dec->pu1_inv_scan = 1749 (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0]; 1750 } 1751 else 1752 { 1753 ps_dec->pu1_inv_scan = 1754 (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0]; 1755 } 1756 } 1757 u4_n = (pu1_top_nnz[0] + pu1_left_nnz[0] + 1) >> 1; 1758 ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc, 1759 u4_n, ps_dec, &u4_num_coeff); 1760 if(ret != OK) 1761 return ret; 1762 1763 u4_top0 = u4_num_coeff; 1764 u4_subblock_coded = (u4_num_coeff != 0); 1765 INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded); 1766 1767 /*------------------------------------------------------*/ 1768 /* Residual 4x4 decoding: SubBlock 1 */ 1769 /*------------------------------------------------------*/ 1770 u4_idx++; 1771 if(u1_tran_form8x8) 1772 { 1773 if(!u1_mb_field_decodingflag) 1774 { 1775 ps_dec->pu1_inv_scan = 1776 (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1]; 1777 } 1778 else 1779 { 1780 ps_dec->pu1_inv_scan = 1781 (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1]; 1782 } 1783 } 1784 else 1785 { 1786 pi2_coeff_block += NUM_COEFFS_IN_4x4BLK; 1787 } 1788 u4_n = (pu1_top_nnz[1] + u4_num_coeff + 1) >> 1; 1789 ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc, 1790 u4_n, ps_dec, &u4_num_coeff); 1791 if(ret != OK) 1792 return ret; 1793 1794 u4_top1 = pu1_left_nnz[0] = u4_num_coeff; 1795 u4_subblock_coded = (u4_num_coeff != 0); 1796 INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded); 1797 1798 /*------------------------------------------------------*/ 1799 /* Residual 4x4 decoding: SubBlock 2 */ 1800 /*------------------------------------------------------*/ 1801 u4_idx += (u4_sub_block_strd - 1); 1802 if(u1_tran_form8x8) 1803 { 1804 if(!u1_mb_field_decodingflag) 1805 { 1806 ps_dec->pu1_inv_scan = 1807 (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2]; 1808 } 1809 else 1810 { 1811 ps_dec->pu1_inv_scan = 1812 (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2]; 1813 } 1814 } 1815 else 1816 { 1817 pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK); 1818 } 1819 u4_n = (u4_top0 + pu1_left_nnz[1] + 1) >> 1; 1820 ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc, 1821 u4_n, ps_dec, &u4_num_coeff); 1822 if(ret != OK) 1823 return ret; 1824 1825 pu1_top_nnz[0] = u4_num_coeff; 1826 u4_subblock_coded = (u4_num_coeff != 0); 1827 INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded); 1828 1829 /*------------------------------------------------------*/ 1830 /* Residual 4x4 decoding: SubBlock 3 */ 1831 /*------------------------------------------------------*/ 1832 u4_idx++; 1833 if(u1_tran_form8x8) 1834 { 1835 if(!u1_mb_field_decodingflag) 1836 { 1837 ps_dec->pu1_inv_scan = 1838 (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3]; 1839 } 1840 else 1841 { 1842 ps_dec->pu1_inv_scan = 1843 (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3]; 1844 } 1845 } 1846 else 1847 { 1848 pi2_coeff_block += NUM_COEFFS_IN_4x4BLK; 1849 } 1850 u4_n = (u4_top1 + u4_num_coeff + 1) >> 1; 1851 ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc, 1852 u4_n, ps_dec, &u4_num_coeff); 1853 if(ret != OK) 1854 return ret; 1855 1856 pu1_top_nnz[1] = pu1_left_nnz[1] = u4_num_coeff; 1857 u4_subblock_coded = (u4_num_coeff != 0); 1858 INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded); 1859 1860 ps_dec->pu1_inv_scan = puc_temp; 1861 1862 return OK; 1863 } 1864 1865 /*****************************************************************************/ 1866 /* */ 1867 /* Function Name : ih264d_cavlc_parse_8x8block_left_available */ 1868 /* */ 1869 /* Description : This function does the residual parsing of 4 subblocks */ 1870 /* in a 8x8 block when only left is available for block */ 1871 /* */ 1872 /* Inputs : pi2_coeff_block : pointer to residual block where */ 1873 /* decoded and inverse scan coefficients are updated */ 1874 /* */ 1875 /* u4_sub_block_strd : indicates the number of sublocks */ 1876 /* in a row. It is 4 for luma and 2 for chroma. */ 1877 /* */ 1878 /* u4_isdc : required to indicate 4x4 parse modules if the */ 1879 /* current Mb is I_16x16/chroma DC coded. */ 1880 /* */ 1881 /* ps_dec : pointer to Decstruct (decoder context) */ 1882 /* */ 1883 /* pu1_top_nnz : top nnz pointer */ 1884 /* */ 1885 /* pu1_left_nnz : left nnz pointer */ 1886 /* */ 1887 /* Globals : No */ 1888 /* Processing : Parsing for four subblocks in unrolled, top and left nnz */ 1889 /* are updated on the fly. csbp is set in accordance to */ 1890 /* decoded numcoeff for the subblock index in raster order */ 1891 /* */ 1892 /* Outputs : The updated residue buffer, nnzs and csbp current block */ 1893 /* */ 1894 /* Returns : Returns the coded sub block pattern csbp for the block */ 1895 /* */ 1896 /* Issues : <List any issues or problems with this function> */ 1897 /* */ 1898 /* Revision History: */ 1899 /* */ 1900 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1901 /* 09 10 2008 Jay Draft */ 1902 /* */ 1903 /*****************************************************************************/ 1904 WORD32 ih264d_cavlc_parse_8x8block_left_available(WORD16 *pi2_coeff_block, 1905 UWORD32 u4_sub_block_strd, 1906 UWORD32 u4_isdc, 1907 dec_struct_t * ps_dec, 1908 UWORD8 *pu1_top_nnz, 1909 UWORD8 *pu1_left_nnz, 1910 UWORD8 u1_tran_form8x8, 1911 UWORD8 u1_mb_field_decodingflag, 1912 UWORD32 *pu4_csbp) 1913 { 1914 UWORD32 u4_num_coeff, u4_n, u4_subblock_coded; 1915 UWORD32 u4_top0, u4_top1; 1916 UWORD32 *pu4_dummy; 1917 WORD32 (**pf_cavlc_parse4x4coeff)(WORD16 *pi2_coeff_block, 1918 UWORD32 u4_isdc, 1919 WORD32 u4_n, 1920 struct _DecStruct *ps_dec, 1921 UWORD32 *pu4_dummy) = 1922 ps_dec->pf_cavlc_parse4x4coeff; 1923 UWORD32 u4_idx = 0; 1924 UWORD8 *puc_temp; 1925 WORD32 ret; 1926 1927 *pu4_csbp = 0; 1928 puc_temp = ps_dec->pu1_inv_scan; 1929 1930 /*------------------------------------------------------*/ 1931 /* Residual 4x4 decoding: SubBlock 0 */ 1932 /*------------------------------------------------------*/ 1933 if(u1_tran_form8x8) 1934 { 1935 if(!u1_mb_field_decodingflag) 1936 { 1937 ps_dec->pu1_inv_scan = 1938 (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0]; 1939 } 1940 else 1941 { 1942 ps_dec->pu1_inv_scan = 1943 (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0]; 1944 } 1945 } 1946 u4_n = pu1_left_nnz[0]; 1947 ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc, 1948 u4_n, ps_dec, &u4_num_coeff); 1949 if(ret != OK) 1950 return ret; 1951 1952 u4_top0 = u4_num_coeff; 1953 u4_subblock_coded = (u4_num_coeff != 0); 1954 INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded); 1955 1956 /*------------------------------------------------------*/ 1957 /* Residual 4x4 decoding: SubBlock 1 */ 1958 /*------------------------------------------------------*/ 1959 u4_idx++; 1960 if(u1_tran_form8x8) 1961 { 1962 if(!u1_mb_field_decodingflag) 1963 { 1964 ps_dec->pu1_inv_scan = 1965 (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1]; 1966 } 1967 else 1968 { 1969 ps_dec->pu1_inv_scan = 1970 (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1]; 1971 } 1972 } 1973 else 1974 { 1975 pi2_coeff_block += NUM_COEFFS_IN_4x4BLK; 1976 } 1977 u4_n = u4_num_coeff; 1978 ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc, 1979 u4_n, ps_dec, &u4_num_coeff); 1980 if(ret != OK) 1981 return ret; 1982 1983 u4_top1 = pu1_left_nnz[0] = u4_num_coeff; 1984 u4_subblock_coded = (u4_num_coeff != 0); 1985 INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded); 1986 1987 /*------------------------------------------------------*/ 1988 /* Residual 4x4 decoding: SubBlock 2 */ 1989 /*------------------------------------------------------*/ 1990 u4_idx += (u4_sub_block_strd - 1); 1991 if(u1_tran_form8x8) 1992 { 1993 if(!u1_mb_field_decodingflag) 1994 { 1995 ps_dec->pu1_inv_scan = 1996 (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2]; 1997 } 1998 else 1999 { 2000 ps_dec->pu1_inv_scan = 2001 (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2]; 2002 } 2003 } 2004 else 2005 { 2006 pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK); 2007 } 2008 u4_n = (u4_top0 + pu1_left_nnz[1] + 1) >> 1; 2009 ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc, 2010 u4_n, ps_dec, &u4_num_coeff); 2011 if(ret != OK) 2012 return ret; 2013 2014 pu1_top_nnz[0] = u4_num_coeff; 2015 u4_subblock_coded = (u4_num_coeff != 0); 2016 INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded); 2017 2018 /*------------------------------------------------------*/ 2019 /* Residual 4x4 decoding: SubBlock 3 */ 2020 /*------------------------------------------------------*/ 2021 u4_idx++; 2022 if(u1_tran_form8x8) 2023 { 2024 if(!u1_mb_field_decodingflag) 2025 { 2026 ps_dec->pu1_inv_scan = 2027 (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3]; 2028 } 2029 else 2030 { 2031 ps_dec->pu1_inv_scan = 2032 (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3]; 2033 } 2034 } 2035 else 2036 { 2037 pi2_coeff_block += NUM_COEFFS_IN_4x4BLK; 2038 } 2039 u4_n = (u4_top1 + u4_num_coeff + 1) >> 1; 2040 ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc, 2041 u4_n, ps_dec, &u4_num_coeff); 2042 if(ret != OK) 2043 return ret; 2044 2045 pu1_top_nnz[1] = pu1_left_nnz[1] = u4_num_coeff; 2046 u4_subblock_coded = (u4_num_coeff != 0); 2047 INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded); 2048 2049 ps_dec->pu1_inv_scan = puc_temp; 2050 2051 return OK; 2052 } 2053 2054 /*****************************************************************************/ 2055 /* */ 2056 /* Function Name : ih264d_cavlc_parse_8x8block_top_available */ 2057 /* */ 2058 /* Description : This function does the residual parsing of 4 subblocks */ 2059 /* in a 8x8 block when only top is available for block */ 2060 /* */ 2061 /* Inputs : pi2_coeff_block : pointer to residual block where */ 2062 /* decoded and inverse scan coefficients are updated */ 2063 /* */ 2064 /* u4_sub_block_strd : indicates the number of sublocks */ 2065 /* in a row. It is 4 for luma and 2 for chroma. */ 2066 /* */ 2067 /* u4_isdc : required to indicate 4x4 parse modules if the */ 2068 /* current Mb is I_16x16/chroma DC coded. */ 2069 /* */ 2070 /* ps_dec : pointer to Decstruct (decoder context) */ 2071 /* */ 2072 /* pu1_top_nnz : top nnz pointer */ 2073 /* */ 2074 /* pu1_left_nnz : left nnz pointer */ 2075 /* */ 2076 /* Globals : No */ 2077 /* Processing : Parsing for four subblocks in unrolled, top and left nnz */ 2078 /* are updated on the fly. csbp is set in accordance to */ 2079 /* decoded numcoeff for the subblock index in raster order */ 2080 /* */ 2081 /* Outputs : The updated residue buffer, nnzs and csbp current block */ 2082 /* */ 2083 /* Returns : Returns the coded sub block pattern csbp for the block */ 2084 /* */ 2085 /* Issues : <List any issues or problems with this function> */ 2086 /* */ 2087 /* Revision History: */ 2088 /* */ 2089 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 2090 /* 09 10 2008 Jay Draft */ 2091 /* */ 2092 /*****************************************************************************/ 2093 WORD32 ih264d_cavlc_parse_8x8block_top_available(WORD16 *pi2_coeff_block, 2094 UWORD32 u4_sub_block_strd, 2095 UWORD32 u4_isdc, 2096 dec_struct_t * ps_dec, 2097 UWORD8 *pu1_top_nnz, 2098 UWORD8 *pu1_left_nnz, 2099 UWORD8 u1_tran_form8x8, 2100 UWORD8 u1_mb_field_decodingflag, 2101 UWORD32 *pu4_csbp) 2102 { 2103 UWORD32 u4_num_coeff, u4_n, u4_subblock_coded; 2104 UWORD32 u4_top0, u4_top1; 2105 UWORD32 *pu4_dummy; 2106 WORD32 (**pf_cavlc_parse4x4coeff)(WORD16 *pi2_coeff_block, 2107 UWORD32 u4_isdc, 2108 WORD32 u4_n, 2109 struct _DecStruct *ps_dec, 2110 UWORD32 *pu4_dummy) = 2111 ps_dec->pf_cavlc_parse4x4coeff; 2112 UWORD32 u4_idx = 0; 2113 UWORD8 *puc_temp; 2114 WORD32 ret; 2115 2116 *pu4_csbp = 0; 2117 puc_temp = ps_dec->pu1_inv_scan; 2118 2119 /*------------------------------------------------------*/ 2120 /* Residual 4x4 decoding: SubBlock 0 */ 2121 /*------------------------------------------------------*/ 2122 if(u1_tran_form8x8) 2123 { 2124 if(!u1_mb_field_decodingflag) 2125 { 2126 ps_dec->pu1_inv_scan = 2127 (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0]; 2128 } 2129 else 2130 { 2131 ps_dec->pu1_inv_scan = 2132 (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0]; 2133 } 2134 } 2135 u4_n = pu1_top_nnz[0]; 2136 ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc, 2137 u4_n, ps_dec, &u4_num_coeff); 2138 if(ret != OK) 2139 return ret; 2140 2141 u4_top0 = u4_num_coeff; 2142 u4_subblock_coded = (u4_num_coeff != 0); 2143 INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded); 2144 2145 /*------------------------------------------------------*/ 2146 /* Residual 4x4 decoding: SubBlock 1 */ 2147 /*------------------------------------------------------*/ 2148 u4_idx++; 2149 if(u1_tran_form8x8) 2150 { 2151 if(!u1_mb_field_decodingflag) 2152 { 2153 ps_dec->pu1_inv_scan = 2154 (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1]; 2155 } 2156 else 2157 { 2158 ps_dec->pu1_inv_scan = 2159 (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1]; 2160 } 2161 } 2162 else 2163 { 2164 pi2_coeff_block += NUM_COEFFS_IN_4x4BLK; 2165 } 2166 u4_n = (pu1_top_nnz[1] + u4_num_coeff + 1) >> 1; 2167 ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc, 2168 u4_n, ps_dec, &u4_num_coeff); 2169 if(ret != OK) 2170 return ret; 2171 2172 u4_top1 = pu1_left_nnz[0] = u4_num_coeff; 2173 u4_subblock_coded = (u4_num_coeff != 0); 2174 INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded); 2175 2176 /*------------------------------------------------------*/ 2177 /* Residual 4x4 decoding: SubBlock 2 */ 2178 /*------------------------------------------------------*/ 2179 u4_idx += (u4_sub_block_strd - 1); 2180 if(u1_tran_form8x8) 2181 { 2182 if(!u1_mb_field_decodingflag) 2183 { 2184 ps_dec->pu1_inv_scan = 2185 (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2]; 2186 } 2187 else 2188 { 2189 ps_dec->pu1_inv_scan = 2190 (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2]; 2191 } 2192 } 2193 else 2194 { 2195 pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK); 2196 } 2197 u4_n = u4_top0; 2198 ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc, 2199 u4_n, ps_dec, &u4_num_coeff); 2200 if(ret != OK) 2201 return ret; 2202 2203 pu1_top_nnz[0] = u4_num_coeff; 2204 u4_subblock_coded = (u4_num_coeff != 0); 2205 INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded); 2206 2207 /*------------------------------------------------------*/ 2208 /* Residual 4x4 decoding: SubBlock 3 */ 2209 /*------------------------------------------------------*/ 2210 u4_idx++; 2211 if(u1_tran_form8x8) 2212 { 2213 if(!u1_mb_field_decodingflag) 2214 { 2215 ps_dec->pu1_inv_scan = 2216 (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3]; 2217 } 2218 else 2219 { 2220 ps_dec->pu1_inv_scan = 2221 (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3]; 2222 } 2223 } 2224 else 2225 { 2226 pi2_coeff_block += NUM_COEFFS_IN_4x4BLK; 2227 } 2228 u4_n = (u4_top1 + u4_num_coeff + 1) >> 1; 2229 ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc, 2230 u4_n, ps_dec, &u4_num_coeff); 2231 if(ret != OK) 2232 return ret; 2233 2234 pu1_top_nnz[1] = pu1_left_nnz[1] = u4_num_coeff; 2235 u4_subblock_coded = (u4_num_coeff != 0); 2236 INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded); 2237 2238 ps_dec->pu1_inv_scan = puc_temp; 2239 2240 return OK; 2241 } 2242 2243 /*****************************************************************************/ 2244 /* */ 2245 /* Function Name : ih264d_cavlc_parse_8x8block_none_available */ 2246 /* */ 2247 /* Description : This function does the residual parsing of 4 subblocks */ 2248 /* in a 8x8 block when none of the neigbours are available */ 2249 /* */ 2250 /* Inputs : pi2_coeff_block : pointer to residual block where */ 2251 /* decoded and inverse scan coefficients are updated */ 2252 /* */ 2253 /* u4_sub_block_strd : indicates the number of sublocks */ 2254 /* in a row. It is 4 for luma and 2 for chroma. */ 2255 /* */ 2256 /* u4_isdc : required to indicate 4x4 parse modules if the */ 2257 /* current Mb is I_16x16/chroma DC coded. */ 2258 /* */ 2259 /* ps_dec : pointer to Decstruct (decoder context) */ 2260 /* */ 2261 /* pu1_top_nnz : top nnz pointer */ 2262 /* */ 2263 /* pu1_left_nnz : left nnz pointer */ 2264 /* */ 2265 /* Globals : No */ 2266 /* Processing : Parsing for four subblocks in unrolled, top and left nnz */ 2267 /* are updated on the fly. csbp is set in accordance to */ 2268 /* decoded numcoeff for the subblock index in raster order */ 2269 /* */ 2270 /* Outputs : The updated residue buffer, nnzs and csbp current block */ 2271 /* */ 2272 /* Returns : Returns the coded sub block pattern csbp for the block */ 2273 /* */ 2274 /* Issues : <List any issues or problems with this function> */ 2275 /* */ 2276 /* Revision History: */ 2277 /* */ 2278 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 2279 /* 09 10 2008 Jay Draft */ 2280 /* */ 2281 /*****************************************************************************/ 2282 WORD32 ih264d_cavlc_parse_8x8block_none_available(WORD16 *pi2_coeff_block, 2283 UWORD32 u4_sub_block_strd, 2284 UWORD32 u4_isdc, 2285 dec_struct_t * ps_dec, 2286 UWORD8 *pu1_top_nnz, 2287 UWORD8 *pu1_left_nnz, 2288 UWORD8 u1_tran_form8x8, 2289 UWORD8 u1_mb_field_decodingflag, 2290 UWORD32 *pu4_csbp) 2291 { 2292 UWORD32 u4_num_coeff, u4_n, u4_subblock_coded; 2293 UWORD32 u4_top0, u4_top1; 2294 UWORD32 *pu4_dummy; 2295 WORD32 (**pf_cavlc_parse4x4coeff)(WORD16 *pi2_coeff_block, 2296 UWORD32 u4_isdc, 2297 WORD32 u4_n, 2298 struct _DecStruct *ps_dec, 2299 UWORD32 *pu4_dummy) = 2300 ps_dec->pf_cavlc_parse4x4coeff; 2301 UWORD32 u4_idx = 0; 2302 UWORD8 *puc_temp; 2303 WORD32 ret; 2304 2305 *pu4_csbp = 0; 2306 puc_temp = ps_dec->pu1_inv_scan; 2307 2308 /*------------------------------------------------------*/ 2309 /* Residual 4x4 decoding: SubBlock 0 */ 2310 /*------------------------------------------------------*/ 2311 if(u1_tran_form8x8) 2312 { 2313 if(!u1_mb_field_decodingflag) 2314 { 2315 ps_dec->pu1_inv_scan = 2316 (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0]; 2317 } 2318 else 2319 { 2320 ps_dec->pu1_inv_scan = 2321 (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0]; 2322 } 2323 } 2324 ret = pf_cavlc_parse4x4coeff[0](pi2_coeff_block, u4_isdc, 0, 2325 ps_dec, &u4_num_coeff); 2326 if(ret != OK) 2327 return ret; 2328 2329 u4_top0 = u4_num_coeff; 2330 u4_subblock_coded = (u4_num_coeff != 0); 2331 INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded); 2332 2333 /*------------------------------------------------------*/ 2334 /* Residual 4x4 decoding: SubBlock 1 */ 2335 /*------------------------------------------------------*/ 2336 u4_idx++; 2337 if(u1_tran_form8x8) 2338 { 2339 if(!u1_mb_field_decodingflag) 2340 { 2341 ps_dec->pu1_inv_scan = 2342 (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1]; 2343 } 2344 else 2345 { 2346 ps_dec->pu1_inv_scan = 2347 (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1]; 2348 } 2349 } 2350 else 2351 { 2352 pi2_coeff_block += NUM_COEFFS_IN_4x4BLK; 2353 } 2354 u4_n = u4_num_coeff; 2355 ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc, 2356 u4_n, ps_dec, &u4_num_coeff); 2357 if(ret != OK) 2358 return ret; 2359 2360 u4_top1 = pu1_left_nnz[0] = u4_num_coeff; 2361 u4_subblock_coded = (u4_num_coeff != 0); 2362 INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded); 2363 2364 /*------------------------------------------------------*/ 2365 /* Residual 4x4 decoding: SubBlock 2 */ 2366 /*------------------------------------------------------*/ 2367 u4_idx += (u4_sub_block_strd - 1); 2368 if(u1_tran_form8x8) 2369 { 2370 if(!u1_mb_field_decodingflag) 2371 { 2372 ps_dec->pu1_inv_scan = 2373 (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2]; 2374 } 2375 else 2376 { 2377 ps_dec->pu1_inv_scan = 2378 (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2]; 2379 } 2380 } 2381 else 2382 { 2383 pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK); 2384 } 2385 u4_n = u4_top0; 2386 ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc, 2387 u4_n, ps_dec, &u4_num_coeff); 2388 if(ret != OK) 2389 return ret; 2390 2391 pu1_top_nnz[0] = u4_num_coeff; 2392 u4_subblock_coded = (u4_num_coeff != 0); 2393 INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded); 2394 2395 /*------------------------------------------------------*/ 2396 /* Residual 4x4 decoding: SubBlock 3 */ 2397 /*------------------------------------------------------*/ 2398 u4_idx++; 2399 if(u1_tran_form8x8) 2400 { 2401 if(!u1_mb_field_decodingflag) 2402 { 2403 ps_dec->pu1_inv_scan = 2404 (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3]; 2405 } 2406 else 2407 { 2408 ps_dec->pu1_inv_scan = 2409 (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3]; 2410 } 2411 } 2412 else 2413 { 2414 pi2_coeff_block += NUM_COEFFS_IN_4x4BLK; 2415 } 2416 u4_n = (u4_top1 + u4_num_coeff + 1) >> 1; 2417 ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc, 2418 u4_n, ps_dec, &u4_num_coeff); 2419 if(ret != OK) 2420 return ret; 2421 2422 pu1_top_nnz[1] = pu1_left_nnz[1] = u4_num_coeff; 2423 u4_subblock_coded = (u4_num_coeff != 0); 2424 INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded); 2425 2426 ps_dec->pu1_inv_scan = puc_temp; 2427 2428 return OK; 2429 } 2430 2431 /*! 2432 ************************************************************************** 2433 * \if Function name : ih264d_parse_residual4x4_cavlc \endif 2434 * 2435 * \brief 2436 * This function parses CAVLC syntax of a Luma and Chroma AC Residuals. 2437 * 2438 * \return 2439 * 0 on Success and Error code otherwise 2440 ************************************************************************** 2441 */ 2442 2443 WORD32 ih264d_parse_residual4x4_cavlc(dec_struct_t * ps_dec, 2444 dec_mb_info_t *ps_cur_mb_info, 2445 UWORD8 u1_offset) 2446 { 2447 UWORD8 u1_cbp = ps_cur_mb_info->u1_cbp; 2448 UWORD16 ui16_csbp = 0; 2449 UWORD32 u4_nbr_avl; 2450 WORD16 *pi2_residual_buf; 2451 2452 UWORD8 u1_is_top_mb_avail; 2453 UWORD8 u1_is_left_mb_avail; 2454 2455 UWORD8 *pu1_top_nnz = ps_cur_mb_info->ps_curmb->pu1_nnz_y; 2456 UWORD8 *pu1_left_nnz = ps_dec->pu1_left_nnz_y; 2457 WORD16 *pi2_coeff_block = NULL; 2458 UWORD32 *pu4_dummy; 2459 WORD32 ret; 2460 2461 WORD32 (**pf_cavlc_parse_8x8block)(WORD16 *pi2_coeff_block, 2462 UWORD32 u4_sub_block_strd, 2463 UWORD32 u4_isdc, 2464 struct _DecStruct *ps_dec, 2465 UWORD8 *pu1_top_nnz, 2466 UWORD8 *pu1_left_nnz, 2467 UWORD8 u1_tran_form8x8, 2468 UWORD8 u1_mb_field_decodingflag, 2469 UWORD32 *pu4_dummy) = ps_dec->pf_cavlc_parse_8x8block; 2470 2471 2472 { 2473 UWORD8 uc_temp = ps_dec->u1_mb_ngbr_availablity; 2474 u1_is_top_mb_avail = BOOLEAN(uc_temp & TOP_MB_AVAILABLE_MASK); 2475 u1_is_left_mb_avail = BOOLEAN(uc_temp & LEFT_MB_AVAILABLE_MASK); 2476 u4_nbr_avl = (u1_is_top_mb_avail << 1) | u1_is_left_mb_avail; 2477 } 2478 2479 ps_cur_mb_info->u1_qp_div6 = ps_dec->u1_qp_y_div6; 2480 ps_cur_mb_info->u1_qp_rem6 = ps_dec->u1_qp_y_rem6; 2481 ps_cur_mb_info->u1_qpc_div6 = ps_dec->u1_qp_u_div6; 2482 ps_cur_mb_info->u1_qpc_rem6 = ps_dec->u1_qp_u_rem6; 2483 ps_cur_mb_info->u1_qpcr_div6 = ps_dec->u1_qp_v_div6; 2484 ps_cur_mb_info->u1_qpcr_rem6 = ps_dec->u1_qp_v_rem6; 2485 2486 if(u1_cbp & 0xf) 2487 { 2488 pu1_top_nnz[0] = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[0]; 2489 pu1_top_nnz[1] = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[1]; 2490 pu1_top_nnz[2] = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[2]; 2491 pu1_top_nnz[3] = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[3]; 2492 2493 /*******************************************************************/ 2494 /* Block 0 residual decoding, check cbp and proceed (subblock = 0) */ 2495 /*******************************************************************/ 2496 if(!(u1_cbp & 0x1)) 2497 { 2498 *(UWORD16 *)(pu1_top_nnz) = 0; 2499 *(UWORD16 *)(pu1_left_nnz) = 0; 2500 2501 } 2502 else 2503 { 2504 UWORD32 u4_temp; 2505 ret = pf_cavlc_parse_8x8block[u4_nbr_avl]( 2506 pi2_coeff_block, 4, u1_offset, ps_dec, pu1_top_nnz, 2507 pu1_left_nnz, ps_cur_mb_info->u1_tran_form8x8, 2508 ps_cur_mb_info->u1_mb_field_decodingflag, &u4_temp); 2509 if(ret != OK) 2510 return ret; 2511 ui16_csbp = u4_temp; 2512 } 2513 2514 /*******************************************************************/ 2515 /* Block 1 residual decoding, check cbp and proceed (subblock = 2) */ 2516 /*******************************************************************/ 2517 if(ps_cur_mb_info->u1_tran_form8x8) 2518 { 2519 pi2_coeff_block += 64; 2520 } 2521 else 2522 { 2523 pi2_coeff_block += (2 * NUM_COEFFS_IN_4x4BLK); 2524 } 2525 2526 if(!(u1_cbp & 0x2)) 2527 { 2528 *(UWORD16 *)(pu1_top_nnz + 2) = 0; 2529 *(UWORD16 *)(pu1_left_nnz) = 0; 2530 } 2531 else 2532 { 2533 UWORD32 u4_temp = (u4_nbr_avl | 0x1); 2534 ret = pf_cavlc_parse_8x8block[u4_temp]( 2535 pi2_coeff_block, 4, u1_offset, ps_dec, 2536 (pu1_top_nnz + 2), pu1_left_nnz, 2537 ps_cur_mb_info->u1_tran_form8x8, 2538 ps_cur_mb_info->u1_mb_field_decodingflag, &u4_temp); 2539 if(ret != OK) 2540 return ret; 2541 ui16_csbp |= (u4_temp << 2); 2542 } 2543 2544 /*******************************************************************/ 2545 /* Block 2 residual decoding, check cbp and proceed (subblock = 8) */ 2546 /*******************************************************************/ 2547 if(ps_cur_mb_info->u1_tran_form8x8) 2548 { 2549 pi2_coeff_block += 64; 2550 } 2551 else 2552 { 2553 pi2_coeff_block += (6 * NUM_COEFFS_IN_4x4BLK); 2554 } 2555 2556 if(!(u1_cbp & 0x4)) 2557 { 2558 *(UWORD16 *)(pu1_top_nnz) = 0; 2559 *(UWORD16 *)(pu1_left_nnz + 2) = 0; 2560 } 2561 else 2562 { 2563 UWORD32 u4_temp = (u4_nbr_avl | 0x2); 2564 ret = pf_cavlc_parse_8x8block[u4_temp]( 2565 pi2_coeff_block, 4, u1_offset, ps_dec, pu1_top_nnz, 2566 (pu1_left_nnz + 2), ps_cur_mb_info->u1_tran_form8x8, 2567 ps_cur_mb_info->u1_mb_field_decodingflag, &u4_temp); 2568 if(ret != OK) 2569 return ret; 2570 ui16_csbp |= (u4_temp << 8); 2571 } 2572 2573 /*******************************************************************/ 2574 /* Block 3 residual decoding, check cbp and proceed (subblock = 10)*/ 2575 /*******************************************************************/ 2576 if(ps_cur_mb_info->u1_tran_form8x8) 2577 { 2578 pi2_coeff_block += 64; 2579 } 2580 else 2581 { 2582 pi2_coeff_block += (2 * NUM_COEFFS_IN_4x4BLK); 2583 } 2584 2585 if(!(u1_cbp & 0x8)) 2586 { 2587 *(UWORD16 *)(pu1_top_nnz + 2) = 0; 2588 *(UWORD16 *)(pu1_left_nnz + 2) = 0; 2589 } 2590 else 2591 { 2592 UWORD32 u4_temp; 2593 ret = pf_cavlc_parse_8x8block[0x3]( 2594 pi2_coeff_block, 4, u1_offset, ps_dec, 2595 (pu1_top_nnz + 2), (pu1_left_nnz + 2), 2596 ps_cur_mb_info->u1_tran_form8x8, 2597 ps_cur_mb_info->u1_mb_field_decodingflag, &u4_temp); 2598 if(ret != OK) 2599 return ret; 2600 ui16_csbp |= (u4_temp << 10); 2601 } 2602 } 2603 else 2604 { 2605 *(UWORD32 *)(pu1_top_nnz) = 0; 2606 *(UWORD32 *)(pu1_left_nnz) = 0; 2607 } 2608 2609 ps_cur_mb_info->u2_luma_csbp = ui16_csbp; 2610 ps_cur_mb_info->ps_curmb->u2_luma_csbp = ui16_csbp; 2611 2612 { 2613 UWORD16 u2_chroma_csbp = 0; 2614 ps_cur_mb_info->u2_chroma_csbp = 0; 2615 pu1_top_nnz = ps_cur_mb_info->ps_curmb->pu1_nnz_uv; 2616 pu1_left_nnz = ps_dec->pu1_left_nnz_uv; 2617 2618 u1_cbp >>= 4; 2619 /*--------------------------------------------------------------------*/ 2620 /* if Chroma Component not present OR no ac values present */ 2621 /* Set the values of N to zero */ 2622 /*--------------------------------------------------------------------*/ 2623 if(u1_cbp == CBPC_ALLZERO || u1_cbp == CBPC_ACZERO) 2624 { 2625 *(UWORD32 *)(pu1_top_nnz) = 0; 2626 *(UWORD32 *)(pu1_left_nnz) = 0; 2627 } 2628 2629 if(u1_cbp == CBPC_ALLZERO) 2630 { 2631 return (0); 2632 } 2633 /*--------------------------------------------------------------------*/ 2634 /* Decode Chroma DC values */ 2635 /*--------------------------------------------------------------------*/ 2636 { 2637 WORD32 u4_scale_u; 2638 WORD32 u4_scale_v; 2639 WORD32 i4_mb_inter_inc; 2640 u4_scale_u = ps_dec->pu2_quant_scale_u[0] << ps_dec->u1_qp_u_div6; 2641 u4_scale_v = ps_dec->pu2_quant_scale_v[0] << ps_dec->u1_qp_v_div6; 2642 i4_mb_inter_inc = (!((ps_cur_mb_info->ps_curmb->u1_mb_type == I_4x4_MB) 2643 || (ps_cur_mb_info->ps_curmb->u1_mb_type == I_16x16_MB))) 2644 * 3; 2645 2646 if(ps_dec->s_high_profile.u1_scaling_present) 2647 { 2648 u4_scale_u *= 2649 ps_dec->s_high_profile.i2_scalinglist4x4[i4_mb_inter_inc 2650 + 1][0]; 2651 u4_scale_v *= 2652 ps_dec->s_high_profile.i2_scalinglist4x4[i4_mb_inter_inc 2653 + 2][0]; 2654 2655 } 2656 else 2657 { 2658 u4_scale_u <<= 4; 2659 u4_scale_v <<= 4; 2660 } 2661 2662 ih264d_cavlc_parse_chroma_dc(ps_cur_mb_info,pi2_coeff_block, ps_dec->ps_bitstrm, 2663 u4_scale_u, u4_scale_v, 2664 i4_mb_inter_inc); 2665 } 2666 2667 if(u1_cbp == CBPC_ACZERO) 2668 return (0); 2669 2670 pu1_top_nnz[0] = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv[0]; 2671 pu1_top_nnz[1] = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv[1]; 2672 pu1_top_nnz[2] = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv[2]; 2673 pu1_top_nnz[3] = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv[3]; 2674 /*--------------------------------------------------------------------*/ 2675 /* Decode Chroma AC values */ 2676 /*--------------------------------------------------------------------*/ 2677 { 2678 UWORD32 u4_temp; 2679 /*****************************************************************/ 2680 /* U Block residual decoding, check cbp and proceed (subblock=0)*/ 2681 /*****************************************************************/ 2682 ret = pf_cavlc_parse_8x8block[u4_nbr_avl]( 2683 pi2_coeff_block, 2, 1, ps_dec, pu1_top_nnz, 2684 pu1_left_nnz, 0, 0, &u4_temp); 2685 if(ret != OK) 2686 return ret; 2687 u2_chroma_csbp = u4_temp; 2688 2689 pi2_coeff_block += MB_CHROM_SIZE; 2690 /*****************************************************************/ 2691 /* V Block residual decoding, check cbp and proceed (subblock=1)*/ 2692 /*****************************************************************/ 2693 ret = pf_cavlc_parse_8x8block[u4_nbr_avl](pi2_coeff_block, 2, 1, 2694 ps_dec, 2695 (pu1_top_nnz + 2), 2696 (pu1_left_nnz + 2), 0, 2697 0, &u4_temp); 2698 if(ret != OK) 2699 return ret; 2700 u2_chroma_csbp |= (u4_temp << 4); 2701 } 2702 2703 ps_cur_mb_info->u2_chroma_csbp = u2_chroma_csbp; 2704 } 2705 return OK; 2706 } 2707