1 /* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18 #include "mp4dec_lib.h" 19 #include "vlc_decode.h" 20 #include "zigzag.h" 21 22 23 typedef PV_STATUS(*VlcDecFuncP)(BitstreamDecVideo *stream, Tcoef *pTcoef); 24 static const uint8 AC_rowcol[64] = { 0, 0, 0, 0, 0, 0, 0, 0, 25 0, 1, 1, 1, 1, 1, 1, 1, 26 0, 1, 1, 1, 1, 1, 1, 1, 27 0, 1, 1, 1, 1, 1, 1, 1, 28 0, 1, 1, 1, 1, 1, 1, 1, 29 0, 1, 1, 1, 1, 1, 1, 1, 30 0, 1, 1, 1, 1, 1, 1, 1, 31 0, 1, 1, 1, 1, 1, 1, 1, 32 }; 33 static const uint8 mask[8] = /* for fast bitmap */ 34 {128, 64, 32, 16, 8, 4, 2, 1}; 35 36 37 38 /***********************************************************CommentBegin****** 39 * 40 * -- VlcDequantMpegBlock -- Decodes the DCT coefficients of one 8x8 block and perform 41 dequantization using Mpeg mode. 42 Date: 08/08/2000 43 44 Modified: 3/21/01 45 Added pre IDCT clipping, new ACDC prediction structure, ACDC prediction clipping, 46 16-bit int case, removed multiple zigzaging 47 ******************************************************************************/ 48 49 #ifdef PV_SUPPORT_MAIN_PROFILE 50 int VlcDequantMpegIntraBlock(void *vid, int comp, int switched, 51 uint8 *bitmapcol, uint8 *bitmaprow) 52 { 53 VideoDecData *video = (VideoDecData*) vid; 54 Vol *currVol = video->vol[video->currLayer]; 55 BitstreamDecVideo *stream = video->bitstream; 56 int16 *datablock = video->mblock->block[comp]; /* 10/20/2000, assume it has been reset of all-zero !!!*/ 57 int mbnum = video->mbnum; 58 uint CBP = video->headerInfo.CBP[mbnum]; 59 int QP = video->QPMB[mbnum]; 60 typeDCStore *DC = video->predDC + mbnum; 61 int x_pos = video->mbnum_col; 62 typeDCACStore *DCAC_row = video->predDCAC_row + x_pos; 63 typeDCACStore *DCAC_col = video->predDCAC_col; 64 uint ACpred_flag = (uint) video->acPredFlag[mbnum]; 65 66 /*** VLC *****/ 67 int i, j, k; 68 Tcoef run_level; 69 int last, return_status; 70 VlcDecFuncP vlcDecCoeff; 71 int direction; 72 const int *inv_zigzag; 73 /*** Quantizer ****/ 74 int dc_scaler; 75 int sum; 76 int *qmat; 77 int32 temp; 78 79 const int B_Xtab[6] = {0, 1, 0, 1, 2, 3}; 80 const int B_Ytab[6] = {0, 0, 1, 1, 2, 3}; 81 82 int16 *dcac_row, *dcac_col; 83 84 dcac_row = (*DCAC_row)[B_Xtab[comp]]; 85 dcac_col = (*DCAC_col)[B_Ytab[comp]]; 86 87 88 i = 1 - switched; 89 90 #ifdef FAST_IDCT 91 *((uint32*)bitmapcol) = *((uint32*)(bitmapcol + 4)) = 0; 92 *bitmaprow = 0; 93 #endif 94 95 96 /* select which Huffman table to be used */ 97 vlcDecCoeff = video->vlcDecCoeffIntra; 98 99 dc_scaler = (comp < 4) ? video->mblock->DCScalarLum : video->mblock->DCScalarChr; 100 101 /* enter the zero run decoding loop */ 102 sum = 0; 103 qmat = currVol->iqmat; 104 105 /* perform only VLC decoding */ 106 /* We cannot do DCACrecon before VLC decoding. 10/17/2000 */ 107 doDCACPrediction(video, comp, datablock, &direction); 108 if (!ACpred_flag) direction = 0; 109 inv_zigzag = zigzag_inv + (ACpred_flag << 6) + (direction << 6); 110 if (CBP & (1 << (5 - comp))) 111 { 112 do 113 { 114 return_status = (*vlcDecCoeff)(stream, &run_level); 115 if (return_status != PV_SUCCESS) 116 { 117 last = 1;/* 11/1/2000 let it slips undetected, just like 118 in original version */ 119 i = VLC_ERROR; 120 ACpred_flag = 0; /* no of coefficients should not get reset 03/07/2002 */ 121 break; 122 } 123 124 i += run_level.run; 125 last = run_level.last; 126 if (i >= 64) 127 { 128 /* i = NCOEFF_BLOCK; */ /* 11/1/00 */ 129 ACpred_flag = 0; /* no of coefficients should not get reset 03/07/2002 */ 130 i = VLC_NO_LAST_BIT; 131 last = 1; 132 break; 133 } 134 135 k = inv_zigzag[i]; 136 137 if (run_level.sign == 1) 138 { 139 datablock[k] -= run_level.level; 140 } 141 else 142 { 143 datablock[k] += run_level.level; 144 } 145 146 if (AC_rowcol[k]) 147 { 148 temp = (int32)datablock[k] * qmat[k] * QP; 149 temp = (temp + (0x7 & (temp >> 31))) >> 3; 150 if (temp > 2047) temp = 2047; 151 else if (temp < -2048) temp = -2048; 152 datablock[k] = (int) temp; 153 154 #ifdef FAST_IDCT 155 bitmapcol[k&0x7] |= mask[k>>3]; 156 #endif 157 sum ^= temp; 158 } 159 160 i++; 161 } 162 while (!last); 163 164 } 165 else 166 { 167 i = 1; /* 04/26/01 needed for switched case */ 168 } 169 ///// NEED TO DEQUANT THOSE PREDICTED AC COEFF 170 /* dequantize the rest of AC predicted coeff that haven't been dequant */ 171 if (ACpred_flag) 172 { 173 174 i = NCOEFF_BLOCK; /* otherwise, FAST IDCT won't work correctly, 10/18/2000 */ 175 176 if (!direction) /* check vertical */ 177 { 178 dcac_row[0] = datablock[1]; 179 dcac_row[1] = datablock[2]; 180 dcac_row[2] = datablock[3]; 181 dcac_row[3] = datablock[4]; 182 dcac_row[4] = datablock[5]; 183 dcac_row[5] = datablock[6]; 184 dcac_row[6] = datablock[7]; 185 186 for (j = 0, k = 8; k < 64; k += 8, j++) 187 { 188 if (dcac_col[j] = datablock[k]) 189 { /* ACDC clipping 03/26/01 */ 190 if (datablock[k] > 2047) dcac_col[j] = 2047; 191 else if (datablock[k] < -2048) dcac_col[j] = -2048; 192 193 temp = (int32)dcac_col[j] * qmat[k] * QP; 194 temp = (temp + (0x7 & (temp >> 31))) >> 3; /* 03/26/01*/ 195 if (temp > 2047) temp = 2047; 196 else if (temp < -2048) temp = -2048; 197 datablock[k] = (int)temp; 198 sum ^= temp; /* 7/5/01 */ 199 #ifdef FAST_IDCT 200 bitmapcol[0] |= mask[k>>3]; 201 #endif 202 203 } 204 } 205 for (k = 1; k < 8; k++) 206 { 207 if (datablock[k]) 208 { 209 temp = (int32)datablock[k] * qmat[k] * QP; 210 temp = (temp + (0x7 & (temp >> 31))) >> 3; /* 03/26/01*/ 211 if (temp > 2047) temp = 2047; 212 else if (temp < -2048) temp = -2048; 213 datablock[k] = (int)temp; 214 sum ^= temp; /* 7/5/01 */ 215 #ifdef FAST_IDCT 216 bitmapcol[k] |= 128; 217 #endif 218 219 } 220 } 221 222 } 223 else 224 { 225 226 dcac_col[0] = datablock[8]; 227 dcac_col[1] = datablock[16]; 228 dcac_col[2] = datablock[24]; 229 dcac_col[3] = datablock[32]; 230 dcac_col[4] = datablock[40]; 231 dcac_col[5] = datablock[48]; 232 dcac_col[6] = datablock[56]; 233 234 235 for (j = 0, k = 1; k < 8; k++, j++) 236 { 237 if (dcac_row[j] = datablock[k]) 238 { /* ACDC clipping 03/26/01 */ 239 if (datablock[k] > 2047) dcac_row[j] = 2047; 240 else if (datablock[k] < -2048) dcac_row[j] = -2048; 241 242 temp = (int32)dcac_row[j] * qmat[k] * QP; 243 temp = (temp + (0x7 & (temp >> 31))) >> 3; /* 03/26/01 */ 244 if (temp > 2047) temp = 2047; 245 else if (temp < -2048) temp = -2048; 246 datablock[k] = (int)temp; 247 sum ^= temp; 248 #ifdef FAST_IDCT 249 bitmapcol[k] |= 128; 250 #endif 251 252 } 253 } 254 255 for (k = 8; k < 64; k += 8) 256 { 257 if (datablock[k]) 258 { 259 temp = (int32)datablock[k] * qmat[k] * QP; 260 temp = (temp + (0x7 & (temp >> 31))) >> 3; /* 03/26/01 */ 261 if (temp > 2047) temp = 2047; 262 else if (temp < -2048) temp = -2048; 263 datablock[k] = (int)temp; 264 sum ^= temp; 265 #ifdef FAST_IDCT 266 bitmapcol[0] |= mask[k>>3]; 267 #endif 268 } 269 } 270 271 } 272 } 273 else 274 { 275 276 /* Store the qcoeff-values needed later for prediction */ 277 278 dcac_row[0] = datablock[1]; /* ACDC, no need for clipping */ 279 dcac_row[1] = datablock[2]; 280 dcac_row[2] = datablock[3]; 281 dcac_row[3] = datablock[4]; 282 dcac_row[4] = datablock[5]; 283 dcac_row[5] = datablock[6]; 284 dcac_row[6] = datablock[7]; 285 286 dcac_col[0] = datablock[8]; 287 dcac_col[1] = datablock[16]; 288 dcac_col[2] = datablock[24]; 289 dcac_col[3] = datablock[32]; 290 dcac_col[4] = datablock[40]; 291 dcac_col[5] = datablock[48]; 292 dcac_col[6] = datablock[56]; 293 294 for (k = 1; k < 8; k++) 295 { 296 if (datablock[k]) 297 { 298 temp = (int32)datablock[k] * qmat[k] * QP; 299 temp = (temp + (0x7 & (temp >> 31))) >> 3; /* 03/26/01*/ 300 if (temp > 2047) temp = 2047; 301 else if (temp < -2048) temp = -2048; 302 datablock[k] = (int)temp; 303 sum ^= temp; /* 7/5/01 */ 304 #ifdef FAST_IDCT 305 bitmapcol[k] |= 128; 306 #endif 307 308 } 309 } 310 for (k = 8; k < 64; k += 8) 311 { 312 if (datablock[k]) 313 { 314 temp = (int32)datablock[k] * qmat[k] * QP; 315 temp = (temp + (0x7 & (temp >> 31))) >> 3; /* 03/26/01 */ 316 if (temp > 2047) temp = 2047; 317 else if (temp < -2048) temp = -2048; 318 datablock[k] = (int)temp; 319 sum ^= temp; 320 #ifdef FAST_IDCT 321 bitmapcol[0] |= mask[k>>3]; 322 #endif 323 } 324 } 325 326 } 327 328 329 330 if (datablock[0]) 331 { 332 temp = (int32)datablock[0] * dc_scaler; 333 if (temp > 2047) temp = 2047; /* 03/14/01 */ 334 else if (temp < -2048) temp = -2048; 335 datablock[0] = (int)temp; 336 sum ^= temp; 337 #ifdef FAST_IDCT 338 bitmapcol[0] |= 128; 339 #endif 340 } 341 342 if ((sum & 1) == 0) 343 { 344 datablock[63] = datablock[63] ^ 0x1; 345 #ifdef FAST_IDCT /* 7/5/01, need to update bitmap */ 346 if (datablock[63]) 347 bitmapcol[7] |= 1; 348 #endif 349 i = (-64 & i) | NCOEFF_BLOCK; /* if i > -1 then i is set to NCOEFF_BLOCK */ 350 } 351 352 353 #ifdef FAST_IDCT 354 if (i > 10) 355 { 356 for (k = 1; k < 4; k++) 357 { 358 if (bitmapcol[k] != 0) 359 { 360 (*bitmaprow) |= mask[k]; 361 } 362 } 363 } 364 #endif 365 366 /* Store the qcoeff-values needed later for prediction */ 367 (*DC)[comp] = datablock[0]; 368 return i; 369 370 } 371 372 373 /***********************************************************CommentBegin****** 374 * 375 * -- VlcDequantMpegInterBlock -- Decodes the DCT coefficients of one 8x8 block and perform 376 dequantization using Mpeg mode for INTER block. 377 Date: 08/08/2000 378 Modified: 3/21/01 379 clean up, added clipping, 16-bit int case, new ACDC prediction 380 ******************************************************************************/ 381 382 383 int VlcDequantMpegInterBlock(void *vid, int comp, 384 uint8 *bitmapcol, uint8 *bitmaprow) 385 { 386 VideoDecData *video = (VideoDecData*) vid; 387 BitstreamDecVideo *stream = video->bitstream; 388 Vol *currVol = video->vol[video->currLayer]; 389 int16 *datablock = video->mblock->block[comp]; /* 10/20/2000, assume it has been reset of all-zero !!!*/ 390 int mbnum = video->mbnum; 391 int QP = video->QPMB[mbnum]; 392 /*** VLC *****/ 393 int i, k; 394 Tcoef run_level; 395 int last, return_status; 396 VlcDecFuncP vlcDecCoeff; 397 398 /*** Quantizer ****/ 399 int sum; 400 int *qmat; 401 402 int32 temp; 403 404 i = 0 ; 405 406 #ifdef FAST_IDCT 407 *((uint32*)bitmapcol) = *((uint32*)(bitmapcol + 4)) = 0; 408 *bitmaprow = 0; 409 #endif 410 411 /* select which Huffman table to be used */ 412 vlcDecCoeff = video->vlcDecCoeffInter; 413 414 /* enter the zero run decoding loop */ 415 sum = 0; 416 qmat = currVol->niqmat; 417 do 418 { 419 return_status = (*vlcDecCoeff)(stream, &run_level); 420 if (return_status != PV_SUCCESS) 421 { 422 last = 1;/* 11/1/2000 let it slips undetected, just like 423 in original version */ 424 i = VLC_ERROR; 425 sum = 1; /* no of coefficients should not get reset 03/07/2002 */ 426 break; 427 } 428 429 i += run_level.run; 430 last = run_level.last; 431 if (i >= 64) 432 { 433 /* i = NCOEFF_BLOCK; */ /* 11/1/00 */ 434 //return VLC_NO_LAST_BIT; 435 i = VLC_NO_LAST_BIT; 436 last = 1; 437 sum = 1; /* no of coefficients should not get reset 03/07/2002 */ 438 break; 439 } 440 441 k = zigzag_inv[i]; 442 443 if (run_level.sign == 1) 444 { 445 temp = (-(int32)(2 * run_level.level + 1) * qmat[k] * QP + 15) >> 4; /* 03/23/01 */ 446 if (temp < -2048) temp = - 2048; 447 } 448 else 449 { 450 temp = ((int32)(2 * run_level.level + 1) * qmat[k] * QP) >> 4; /* 03/23/01 */ 451 if (temp > 2047) temp = 2047; 452 } 453 454 datablock[k] = (int)temp; 455 456 #ifdef FAST_IDCT 457 bitmapcol[k&0x7] |= mask[k>>3]; 458 #endif 459 sum ^= temp; 460 461 i++; 462 } 463 while (!last); 464 465 if ((sum & 1) == 0) 466 { 467 datablock[63] = datablock[63] ^ 0x1; 468 #ifdef FAST_IDCT /* 7/5/01, need to update bitmap */ 469 if (datablock[63]) 470 bitmapcol[7] |= 1; 471 #endif 472 i = NCOEFF_BLOCK; 473 } 474 475 476 #ifdef FAST_IDCT 477 if (i > 10) 478 { 479 for (k = 1; k < 4; k++) /* 07/19/01 */ 480 { 481 if (bitmapcol[k] != 0) 482 { 483 (*bitmaprow) |= mask[k]; 484 } 485 } 486 } 487 #endif 488 489 return i; 490 } 491 #endif 492 /***********************************************************CommentBegin****** 493 * 494 * -- VlcDequantIntraH263Block -- Decodes the DCT coefficients of one 8x8 block and perform 495 dequantization in H.263 mode for INTRA block. 496 Date: 08/08/2000 497 Modified: 3/21/01 498 clean up, added clipping, 16-bit int case, removed multiple zigzaging 499 ******************************************************************************/ 500 501 502 int VlcDequantH263IntraBlock(VideoDecData *video, int comp, int switched, 503 uint8 *bitmapcol, uint8 *bitmaprow) 504 { 505 BitstreamDecVideo *stream = video->bitstream; 506 int16 *datablock = video->mblock->block[comp]; /* 10/20/2000, assume it has been reset of all-zero !!!*/ 507 int32 temp; 508 int mbnum = video->mbnum; 509 uint CBP = video->headerInfo.CBP[mbnum]; 510 int QP = video->QPMB[mbnum]; 511 typeDCStore *DC = video->predDC + mbnum; 512 int x_pos = video->mbnum_col; 513 typeDCACStore *DCAC_row = video->predDCAC_row + x_pos; 514 typeDCACStore *DCAC_col = video->predDCAC_col; 515 uint ACpred_flag = (uint) video->acPredFlag[mbnum]; 516 517 /*** VLC *****/ 518 int i, j, k; 519 Tcoef run_level; 520 int last, return_status; 521 VlcDecFuncP vlcDecCoeff; 522 int direction; 523 const int *inv_zigzag; 524 525 /*** Quantizer ****/ 526 int dc_scaler; 527 int sgn_coeff; 528 529 530 531 const int B_Xtab[6] = {0, 1, 0, 1, 2, 3}; 532 const int B_Ytab[6] = {0, 0, 1, 1, 2, 3}; 533 534 int16 *dcac_row, *dcac_col; 535 536 dcac_row = (*DCAC_row)[B_Xtab[comp]]; 537 dcac_col = (*DCAC_col)[B_Ytab[comp]]; 538 539 #ifdef FAST_IDCT 540 *((uint32*)bitmapcol) = *((uint32*)(bitmapcol + 4)) = 0; 541 *bitmaprow = 0; 542 #endif 543 /* select which Huffman table to be used */ 544 vlcDecCoeff = video->vlcDecCoeffIntra; 545 546 dc_scaler = (comp < 4) ? video->mblock->DCScalarLum : video->mblock->DCScalarChr; 547 548 /* perform only VLC decoding */ 549 doDCACPrediction(video, comp, datablock, &direction); 550 if (!ACpred_flag) direction = 0; 551 552 inv_zigzag = zigzag_inv + (ACpred_flag << 6) + (direction << 6); /* 04/17/01 */ 553 554 i = 1; 555 if (CBP & (1 << (5 - comp))) 556 { 557 i = 1 - switched; 558 do 559 { 560 return_status = (*vlcDecCoeff)(stream, &run_level); 561 if (return_status != PV_SUCCESS) 562 { 563 last = 1;/* 11/1/2000 let it slips undetected, just like 564 in original version */ 565 i = VLC_ERROR; 566 ACpred_flag = 0; /* no of coefficients should not get reset 03/07/2002 */ 567 break; 568 } 569 570 i += run_level.run; 571 last = run_level.last; 572 if (i >= 64) 573 { 574 ACpred_flag = 0; /* no of coefficients should not get reset 03/07/2002 */ 575 i = VLC_NO_LAST_BIT; 576 last = 1; 577 break; 578 } 579 580 k = inv_zigzag[i]; 581 582 if (run_level.sign == 1) 583 { 584 datablock[k] -= run_level.level; 585 sgn_coeff = -1; 586 } 587 else 588 { 589 datablock[k] += run_level.level; 590 sgn_coeff = 1; 591 } 592 593 594 if (AC_rowcol[k]) /* 10/25/2000 */ 595 { 596 temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff; 597 if (temp > 2047) temp = 2047; /* 03/14/01 */ 598 else if (temp < -2048) temp = -2048; 599 datablock[k] = (int16) temp; 600 601 #ifdef FAST_IDCT 602 bitmapcol[k&0x7] |= mask[k>>3]; 603 #endif 604 } 605 606 i++; 607 } 608 while (!last); 609 610 } 611 612 ///// NEED TO DEQUANT THOSE PREDICTED AC COEFF 613 /* dequantize the rest of AC predicted coeff that haven't been dequant */ 614 if (ACpred_flag) 615 { 616 617 i = NCOEFF_BLOCK; /* otherwise, FAST IDCT won't work correctly, 10/18/2000 */ 618 619 if (!direction) /* check vertical */ 620 { 621 622 dcac_row[0] = datablock[1]; 623 dcac_row[1] = datablock[2]; 624 dcac_row[2] = datablock[3]; 625 dcac_row[3] = datablock[4]; 626 dcac_row[4] = datablock[5]; 627 dcac_row[5] = datablock[6]; 628 dcac_row[6] = datablock[7]; 629 630 for (j = 0, k = 8; k < 64; k += 8, j++) 631 { 632 dcac_col[j] = datablock[k]; 633 if (dcac_col[j]) 634 { 635 if (datablock[k] > 0) 636 { 637 if (datablock[k] > 2047) dcac_col[j] = 2047; 638 sgn_coeff = 1; 639 } 640 else 641 { 642 if (datablock[k] < -2048) dcac_col[j] = -2048; 643 sgn_coeff = -1; 644 } 645 temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff; 646 if (temp > 2047) temp = 2047; /* 03/14/01 */ 647 else if (temp < -2048) temp = -2048; 648 datablock[k] = (int16) temp; 649 #ifdef FAST_IDCT 650 bitmapcol[0] |= mask[k>>3]; 651 #endif 652 653 } 654 } 655 656 for (k = 1; k < 8; k++) 657 { 658 if (datablock[k]) 659 { 660 sgn_coeff = (datablock[k] > 0) ? 1 : -1; 661 temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff; 662 if (temp > 2047) temp = 2047; /* 03/14/01 */ 663 else if (temp < -2048) temp = -2048; 664 datablock[k] = (int16) temp; 665 #ifdef FAST_IDCT 666 bitmapcol[k] |= 128; 667 #endif 668 669 } 670 } 671 } 672 else 673 { 674 675 dcac_col[0] = datablock[8]; 676 dcac_col[1] = datablock[16]; 677 dcac_col[2] = datablock[24]; 678 dcac_col[3] = datablock[32]; 679 dcac_col[4] = datablock[40]; 680 dcac_col[5] = datablock[48]; 681 dcac_col[6] = datablock[56]; 682 683 684 for (j = 0, k = 1; k < 8; k++, j++) 685 { 686 dcac_row[j] = datablock[k]; 687 if (dcac_row[j]) 688 { 689 if (datablock[k] > 0) 690 { 691 if (datablock[k] > 2047) dcac_row[j] = 2047; 692 sgn_coeff = 1; 693 } 694 else 695 { 696 if (datablock[k] < -2048) dcac_row[j] = -2048; 697 sgn_coeff = -1; 698 } 699 700 temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff; 701 if (temp > 2047) temp = 2047; /* 03/14/01 */ 702 else if (temp < -2048) temp = -2048; 703 datablock[k] = (int) temp; 704 #ifdef FAST_IDCT 705 bitmapcol[k] |= 128; 706 #endif 707 708 } 709 } 710 for (k = 8; k < 64; k += 8) 711 { 712 if (datablock[k]) 713 { 714 sgn_coeff = (datablock[k] > 0) ? 1 : -1; 715 temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff; 716 if (temp > 2047) temp = 2047; /* 03/14/01 */ 717 else if (temp < -2048) temp = -2048; 718 datablock[k] = (int16) temp; 719 #ifdef FAST_IDCT 720 bitmapcol[0] |= mask[k>>3]; 721 #endif 722 } 723 } 724 725 } 726 } 727 else 728 { 729 dcac_row[0] = datablock[1]; 730 dcac_row[1] = datablock[2]; 731 dcac_row[2] = datablock[3]; 732 dcac_row[3] = datablock[4]; 733 dcac_row[4] = datablock[5]; 734 dcac_row[5] = datablock[6]; 735 dcac_row[6] = datablock[7]; 736 737 dcac_col[0] = datablock[8]; 738 dcac_col[1] = datablock[16]; 739 dcac_col[2] = datablock[24]; 740 dcac_col[3] = datablock[32]; 741 dcac_col[4] = datablock[40]; 742 dcac_col[5] = datablock[48]; 743 dcac_col[6] = datablock[56]; 744 745 for (k = 1; k < 8; k++) 746 { 747 if (datablock[k]) 748 { 749 sgn_coeff = (datablock[k] > 0) ? 1 : -1; 750 temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff; 751 if (temp > 2047) temp = 2047; /* 03/14/01 */ 752 else if (temp < -2048) temp = -2048; 753 datablock[k] = (int16) temp; 754 #ifdef FAST_IDCT 755 bitmapcol[k] |= 128; 756 #endif 757 } 758 } 759 for (k = 8; k < 64; k += 8) 760 { 761 if (datablock[k]) 762 { 763 sgn_coeff = (datablock[k] > 0) ? 1 : -1; 764 temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff; 765 if (temp > 2047) temp = 2047; /* 03/14/01 */ 766 else if (temp < -2048) temp = -2048; 767 datablock[k] = (int16) temp; 768 #ifdef FAST_IDCT 769 bitmapcol[0] |= mask[k>>3]; 770 #endif 771 } 772 } 773 } 774 if (datablock[0]) 775 { 776 #ifdef FAST_IDCT 777 bitmapcol[0] |= 128; 778 #endif 779 780 temp = (int32)datablock[0] * dc_scaler; 781 if (temp > 2047) temp = 2047; /* 03/14/01 */ 782 else if (temp < -2048) temp = -2048; 783 datablock[0] = (int16)temp; 784 } 785 786 787 #ifdef FAST_IDCT 788 if (i > 10) 789 { 790 for (k = 1; k < 4; k++) /* if i > 10 then k = 0 does not matter */ 791 { 792 if (bitmapcol[k] != 0) 793 { 794 (*bitmaprow) |= mask[k]; /* (1<<(7-i)); */ 795 } 796 } 797 } 798 #endif 799 800 /* Store the qcoeff-values needed later for prediction */ 801 (*DC)[comp] = datablock[0]; 802 return i; 803 } 804 805 int VlcDequantH263IntraBlock_SH(VideoDecData *video, int comp, uint8 *bitmapcol, uint8 *bitmaprow) 806 { 807 BitstreamDecVideo *stream = video->bitstream; 808 int16 *datablock = video->mblock->block[comp]; /*, 10/20/2000, assume it has been reset of all-zero !!!*/ 809 int32 temp; 810 int mbnum = video->mbnum; 811 uint CBP = video->headerInfo.CBP[mbnum]; 812 int16 QP = video->QPMB[mbnum]; 813 typeDCStore *DC = video->predDC + mbnum; 814 int x_pos = video->mbnum_col; 815 typeDCACStore *DCAC_row = video->predDCAC_row + x_pos; 816 typeDCACStore *DCAC_col = video->predDCAC_col; 817 uint ACpred_flag = (uint) video->acPredFlag[mbnum]; 818 819 /*** VLC *****/ 820 int i, k; 821 Tcoef run_level; 822 int last, return_status; 823 VlcDecFuncP vlcDecCoeff; 824 #ifdef PV_ANNEX_IJKT_SUPPORT 825 int direction; 826 const int *inv_zigzag; 827 #endif 828 /*** Quantizer ****/ 829 830 831 832 const int B_Xtab[6] = {0, 1, 0, 1, 2, 3}; 833 const int B_Ytab[6] = {0, 0, 1, 1, 2, 3}; 834 835 int16 *dcac_row, *dcac_col; 836 837 dcac_row = (*DCAC_row)[B_Xtab[comp]]; 838 dcac_col = (*DCAC_col)[B_Ytab[comp]]; 839 i = 1; 840 841 #ifdef FAST_IDCT 842 *((uint32*)bitmapcol) = *((uint32*)(bitmapcol + 4)) = 0; 843 *bitmaprow = 0; 844 #endif 845 846 /* select which Huffman table to be used */ 847 vlcDecCoeff = video->vlcDecCoeffIntra; 848 849 #ifdef PV_ANNEX_IJKT_SUPPORT 850 if (comp > 3) /* ANNEX_T */ 851 { 852 QP = video->QP_CHR; 853 } 854 if (!video->advanced_INTRA) 855 { 856 #endif 857 858 if ((CBP & (1 << (5 - comp))) == 0) 859 { 860 #ifdef FAST_IDCT 861 bitmapcol[0] = 128; 862 bitmapcol[1] = bitmapcol[2] = bitmapcol[3] = bitmapcol[4] = bitmapcol[5] = bitmapcol[6] = bitmapcol[7] = 0; 863 #endif 864 datablock[0] <<= 3; /* no need to clip */ 865 return 1;//ncoeffs; 866 } 867 else 868 { 869 /* enter the zero run decoding loop */ 870 do 871 { 872 return_status = (*vlcDecCoeff)(stream, &run_level); 873 if (return_status != PV_SUCCESS) 874 { 875 last = 1;/* 11/1/2000 let it slips undetected, just like 876 in original version */ 877 i = VLC_ERROR; 878 break; 879 } 880 881 i += run_level.run; 882 last = run_level.last; 883 if (i >= 64) 884 { 885 /* i = NCOEFF_BLOCK; */ /* 11/1/00 */ 886 i = VLC_NO_LAST_BIT; 887 last = 1; 888 break; 889 } 890 k = zigzag_inv[i]; 891 892 if (run_level.sign == 0) 893 { 894 temp = (int32)QP * (2 * run_level.level + 1) - 1 + (QP & 1); 895 if (temp > 2047) temp = 2047; 896 } 897 else 898 { 899 temp = -(int32)QP * (2 * run_level.level + 1) + 1 - (QP & 1); 900 if (temp < -2048) temp = -2048; 901 } 902 903 904 datablock[k] = (int16) temp; 905 906 #ifdef FAST_IDCT 907 bitmapcol[k&0x7] |= mask[k>>3]; 908 #endif 909 i++; 910 } 911 while (!last); 912 913 } 914 /* no ACDC prediction when ACDC disable */ 915 if (datablock[0]) 916 { 917 #ifdef FAST_IDCT 918 bitmapcol[0] |= 128; 919 #endif 920 datablock[0] <<= 3; /* no need to clip 09/18/2001 */ 921 } 922 #ifdef PV_ANNEX_IJKT_SUPPORT 923 } 924 else /* advanced_INTRA mode */ 925 { 926 i = 1; 927 doDCACPrediction_I(video, comp, datablock); 928 /* perform only VLC decoding */ 929 if (!ACpred_flag) 930 { 931 direction = 0; 932 } 933 else 934 { 935 direction = video->mblock->direction; 936 } 937 938 inv_zigzag = zigzag_inv + (ACpred_flag << 6) + (direction << 6); /* 04/17/01 */ 939 940 if (CBP & (1 << (5 - comp))) 941 { 942 i = 0; 943 do 944 { 945 return_status = (*vlcDecCoeff)(stream, &run_level); 946 if (return_status != PV_SUCCESS) 947 { 948 last = 1;/* 11/1/2000 let it slips undetected, just like 949 in original version */ 950 i = VLC_ERROR; 951 ACpred_flag = 0; /* no of coefficients should not get reset 03/07/2002 */ 952 break; 953 } 954 955 i += run_level.run; 956 last = run_level.last; 957 if (i >= 64) 958 { 959 /* i = NCOEFF_BLOCK; */ /* 11/1/00 */ 960 ACpred_flag = 0; /* no of coefficients should not get reset 03/07/2002 */ 961 i = VLC_NO_LAST_BIT; 962 last = 1; 963 break; 964 } 965 966 k = inv_zigzag[i]; 967 968 if (run_level.sign == 0) 969 { 970 datablock[k] += (int16)QP * 2 * run_level.level; 971 if (datablock[k] > 2047) datablock[k] = 2047; 972 } 973 else 974 { 975 datablock[k] -= (int16)QP * 2 * run_level.level; 976 if (datablock[k] < -2048) datablock[k] = -2048; 977 } 978 #ifdef FAST_IDCT 979 bitmapcol[k&0x7] |= mask[k>>3]; 980 #endif 981 982 i++; 983 } 984 while (!last); 985 986 } 987 ///// NEED TO DEQUANT THOSE PREDICTED AC COEFF 988 /* dequantize the rest of AC predicted coeff that haven't been dequant */ 989 990 if (ACpred_flag) 991 { 992 i = NCOEFF_BLOCK; 993 for (k = 1; k < 8; k++) 994 { 995 if (datablock[k]) 996 { 997 bitmapcol[k] |= 128; 998 } 999 1000 if (datablock[k<<3]) 1001 { 1002 bitmapcol[0] |= mask[k]; 1003 } 1004 } 1005 } 1006 1007 dcac_row[0] = datablock[1]; 1008 dcac_row[1] = datablock[2]; 1009 dcac_row[2] = datablock[3]; 1010 dcac_row[3] = datablock[4]; 1011 dcac_row[4] = datablock[5]; 1012 dcac_row[5] = datablock[6]; 1013 dcac_row[6] = datablock[7]; 1014 1015 dcac_col[0] = datablock[8]; 1016 dcac_col[1] = datablock[16]; 1017 dcac_col[2] = datablock[24]; 1018 dcac_col[3] = datablock[32]; 1019 dcac_col[4] = datablock[40]; 1020 dcac_col[5] = datablock[48]; 1021 dcac_col[6] = datablock[56]; 1022 1023 if (datablock[0]) 1024 { 1025 #ifdef FAST_IDCT 1026 bitmapcol[0] |= 128; 1027 #endif 1028 1029 datablock[0] |= 1; 1030 if (datablock[0] < 0) 1031 { 1032 datablock[0] = 0; 1033 } 1034 } 1035 } 1036 #endif 1037 1038 #ifdef FAST_IDCT 1039 if (i > 10) 1040 { 1041 for (k = 1; k < 4; k++) /* if i > 10 then k = 0 does not matter */ 1042 { 1043 if (bitmapcol[k] != 0) 1044 { 1045 (*bitmaprow) |= mask[k]; /* (1<<(7-i)); */ 1046 } 1047 } 1048 } 1049 #endif 1050 1051 /* Store the qcoeff-values needed later for prediction */ 1052 (*DC)[comp] = datablock[0]; 1053 return i; 1054 } 1055 1056 /***********************************************************CommentBegin****** 1057 * 1058 * -- VlcDequantInterH263Block -- Decodes the DCT coefficients of one 8x8 block and perform 1059 dequantization in H.263 mode for INTER block. 1060 Date: 08/08/2000 1061 Modified: 3/21/01 1062 clean up, added clipping, 16-bit int case 1063 ******************************************************************************/ 1064 1065 1066 int VlcDequantH263InterBlock(VideoDecData *video, int comp, 1067 uint8 *bitmapcol, uint8 *bitmaprow) 1068 { 1069 BitstreamDecVideo *stream = video->bitstream; 1070 int16 *datablock = video->mblock->block[comp]; /* 10/20/2000, assume it has been reset of all-zero !!!*/ 1071 int32 temp; 1072 int mbnum = video->mbnum; 1073 int QP = video->QPMB[mbnum]; 1074 1075 /*** VLC *****/ 1076 int i, k; 1077 Tcoef run_level; 1078 int last, return_status; 1079 VlcDecFuncP vlcDecCoeff; 1080 1081 /*** Quantizer ****/ 1082 1083 1084 i = 0; 1085 1086 #ifdef FAST_IDCT 1087 *((uint32*)bitmapcol) = *((uint32*)(bitmapcol + 4)) = 0; 1088 *bitmaprow = 0; 1089 #endif 1090 1091 /* select which Huffman table to be used */ 1092 vlcDecCoeff = video->vlcDecCoeffInter; 1093 1094 /* enter the zero run decoding loop */ 1095 do 1096 { 1097 return_status = (*vlcDecCoeff)(stream, &run_level); 1098 if (return_status != PV_SUCCESS) 1099 { 1100 1101 1102 last = 1;/* 11/1/2000 let it slips undetected, just like 1103 in original version */ 1104 i = -1; 1105 break; 1106 } 1107 1108 i += run_level.run; 1109 last = run_level.last; 1110 if (i >= 64) 1111 { 1112 i = -1; 1113 last = 1; 1114 break; 1115 } 1116 1117 if (run_level.sign == 0) 1118 { 1119 temp = (int32)QP * (2 * run_level.level + 1) - 1 + (QP & 1); 1120 if (temp > 2047) temp = 2047; 1121 1122 } 1123 else 1124 { 1125 temp = -(int32)QP * (2 * run_level.level + 1) + 1 - (QP & 1); 1126 if (temp < -2048) temp = -2048; 1127 } 1128 1129 k = zigzag_inv[i]; 1130 datablock[k] = (int16)temp; 1131 #ifdef FAST_IDCT 1132 bitmapcol[k&0x7] |= mask[k>>3]; 1133 #endif 1134 i++; 1135 } 1136 while (!last); 1137 1138 #ifdef FAST_IDCT 1139 if (i > 10) /* 07/19/01 */ 1140 { 1141 for (k = 1; k < 4; k++) /* if (i > 10 ) k = 0 does not matter */ 1142 { 1143 if (bitmapcol[k] != 0) 1144 { 1145 (*bitmaprow) |= mask[k]; /* (1<<(7-i)); */ 1146 } 1147 } 1148 } 1149 #endif 1150 return i; 1151 } 1152 1153