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 /* 19 ------------------------------------------------------------------------------ 20 21 PacketVideo Corp. 22 MP3 Decoder Library 23 24 Filename: pvmp3_decode_huff_cw.cpp 25 26 Funtions: 27 pvmp3_decode_huff_cw_tab0 28 pvmp3_decode_huff_cw_tab1 29 pvmp3_decode_huff_cw_tab2 30 pvmp3_decode_huff_cw_tab3 31 pvmp3_decode_huff_cw_tab5 32 pvmp3_decode_huff_cw_tab6 33 pvmp3_decode_huff_cw_tab7 34 pvmp3_decode_huff_cw_tab8 35 pvmp3_decode_huff_cw_tab9 36 pvmp3_decode_huff_cw_tab10 37 pvmp3_decode_huff_cw_tab11 38 pvmp3_decode_huff_cw_tab12 39 pvmp3_decode_huff_cw_tab13 40 pvmp3_decode_huff_cw_tab15 41 pvmp3_decode_huff_cw_tab16 42 pvmp3_decode_huff_cw_tab24 43 pvmp3_decode_huff_cw_tab32 44 pvmp3_decode_huff_cw_tab33 45 46 Date: 09/21/2007 47 48 ------------------------------------------------------------------------------ 49 REVISION HISTORY 50 51 52 Description: 53 54 ------------------------------------------------------------------------------ 55 INPUT AND OUTPUT DEFINITIONS 56 57 Inputs: 58 BITS *pMainData = pointer to input mp3 Main data bit stream 59 60 61 Outputs: 62 cw = bit field extracted from a leaf entry of packed mp3 Huffman Tables 63 64 65 ------------------------------------------------------------------------------ 66 FUNCTION DESCRIPTION 67 68 These functions are used to decode huffman codewords from the input 69 bitstream using combined binary search and look-up table approach. 70 71 ------------------------------------------------------------------------------ 72 REQUIREMENTS 73 74 75 ------------------------------------------------------------------------------ 76 REFERENCES 77 [1] ISO MPEG Audio Subgroup Software Simulation Group (1996) 78 ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension 79 80 [2] Introduction to Algorithms, 81 Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest. 82 The MIT press, 1990 83 84 [3] "Selecting an Optimal Huffman Decoder for AAC", 85 Vladimir Z. Mesarovic, et al. 86 AES 111th Convention, September 21-24, 2001, New York, USA 87 88 ------------------------------------------------------------------------------ 89 PSEUDO-CODE 90 91 ------------------------------------------------------------------------------ 92 */ 93 94 95 /*---------------------------------------------------------------------------- 96 ; INCLUDES 97 ----------------------------------------------------------------------------*/ 98 #include "pv_mp3dec_fxd_op.h" 99 #include "pvmp3_tables.h" 100 #include "pvmp3_getbits.h" 101 #include "pvmp3_decode_huff_cw.h" 102 103 /*---------------------------------------------------------------------------- 104 ; MACROS 105 ; Define module specific macros here 106 ----------------------------------------------------------------------------*/ 107 108 109 /*---------------------------------------------------------------------------- 110 ; DEFINES 111 ; Include all pre-processor statements here. Include conditional 112 ; compile variables also. 113 ----------------------------------------------------------------------------*/ 114 115 116 /*---------------------------------------------------------------------------- 117 ; LOCAL FUNCTION DEFINITIONS 118 ; Function Prototype declaration 119 ----------------------------------------------------------------------------*/ 120 121 /*---------------------------------------------------------------------------- 122 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS 123 ; Variable declaration - defined here and used outside this module 124 ----------------------------------------------------------------------------*/ 125 126 /*---------------------------------------------------------------------------- 127 ; EXTERNAL FUNCTION REFERENCES 128 ; Declare functions defined elsewhere and referenced in this module 129 ----------------------------------------------------------------------------*/ 130 131 /*---------------------------------------------------------------------------- 132 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 133 ; Declare variables used in this module but defined elsewhere 134 ----------------------------------------------------------------------------*/ 135 136 /*---------------------------------------------------------------------------- 137 ; FUNCTION CODE 138 ----------------------------------------------------------------------------*/ 139 140 uint16 pvmp3_decode_huff_cw_tab0(tmp3Bits *pMainData) 141 { 142 OSCL_UNUSED_ARG(pMainData); 143 return(0); 144 145 } 146 147 /*---------------------------------------------------------------------------- 148 ; FUNCTION CODE 149 ----------------------------------------------------------------------------*/ 150 uint16 pvmp3_decode_huff_cw_tab1(tmp3Bits *pMainData) 151 { 152 uint32 tmp; 153 uint16 cw; 154 155 tmp = getUpTo9bits(pMainData, 3); /* hufftable1 */ 156 157 cw = *(huffTable_1 + tmp); 158 pMainData->usedBits -= (3 - (cw & 0xFF)); 159 return(cw >> 8); 160 161 } 162 163 164 /*---------------------------------------------------------------------------- 165 ; FUNCTION CODE 166 ----------------------------------------------------------------------------*/ 167 uint16 pvmp3_decode_huff_cw_tab2(tmp3Bits *pMainData) 168 { 169 uint32 tmp; 170 uint16 cw; 171 172 tmp = getUpTo9bits(pMainData, 6); /* huffTable_2,3 */ 173 174 if (tmp >> 3) 175 { 176 tmp = (tmp >> 3) - 1; 177 } 178 else 179 { 180 tmp = tmp + 7; 181 } 182 183 cw = *(huffTable_2 + tmp); 184 pMainData->usedBits -= (6 - (cw & 0xFF)); 185 186 return(cw >> 8); 187 } 188 189 190 /*---------------------------------------------------------------------------- 191 ; FUNCTION CODE 192 ----------------------------------------------------------------------------*/ 193 uint16 pvmp3_decode_huff_cw_tab3(tmp3Bits *pMainData) 194 { 195 uint32 tmp; 196 uint16 cw; 197 198 tmp = getUpTo9bits(pMainData, 6); /* huffTable_2,3 */ 199 200 if (tmp >> 3) 201 { 202 tmp = (tmp >> 3) - 1; 203 } 204 else 205 { 206 tmp = tmp + 7; 207 } 208 209 cw = *(huffTable_3 + tmp); 210 pMainData->usedBits -= (6 - (cw & 0xFF)); 211 212 return(cw >> 8); 213 } 214 215 216 /*---------------------------------------------------------------------------- 217 ; FUNCTION CODE 218 ----------------------------------------------------------------------------*/ 219 uint16 pvmp3_decode_huff_cw_tab5(tmp3Bits *pMainData) 220 { 221 uint32 tmp; 222 uint16 cw; 223 224 tmp = getUpTo9bits(pMainData, 8); /* huffTable_5 */ 225 226 if ((tmp >> 5)) 227 { 228 tmp = (tmp >> 5) - 1; 229 } 230 else if ((tmp >> 1) >= 2) 231 { 232 tmp = (tmp >> 1) - 2 + 7; 233 } 234 else 235 { 236 tmp = (tmp & 3) + 21; 237 } 238 239 cw = *(huffTable_5 + tmp); 240 pMainData->usedBits -= (8 - (cw & 0xFF)); 241 242 return(cw >> 8); 243 } 244 245 /*---------------------------------------------------------------------------- 246 ; FUNCTION CODE 247 ----------------------------------------------------------------------------*/ 248 uint16 pvmp3_decode_huff_cw_tab6(tmp3Bits *pMainData) 249 { 250 uint32 tmp; 251 uint16 cw; 252 253 tmp = getUpTo9bits(pMainData, 7); /* huffTable_6 */ 254 if ((tmp >> 3) >= 3) 255 { 256 tmp = (tmp >> 3) - 3; 257 } 258 else if (tmp >> 1) 259 { 260 tmp = (tmp >> 1) - 1 + 13; 261 } 262 else 263 { 264 tmp = tmp + 24; 265 } 266 267 cw = *(huffTable_6 + tmp); 268 pMainData->usedBits -= (7 - (cw & 0xFF)); 269 270 return(cw >> 8); 271 } 272 273 274 /*---------------------------------------------------------------------------- 275 ; FUNCTION CODE 276 ----------------------------------------------------------------------------*/ 277 uint16 pvmp3_decode_huff_cw_tab7(tmp3Bits *pMainData) 278 { 279 uint32 tmp; 280 uint16 cw; 281 282 tmp = getUpTo17bits(pMainData, 10); /* huffTable_7 */ 283 if ((tmp >> 7) >= 2) 284 { 285 tmp = (tmp >> 7) - 2; 286 } 287 else if ((tmp >> 4) >= 7) 288 { 289 tmp = (tmp >> 4) - 7 + 6; 290 } 291 else if ((tmp >> 1) >= 2) 292 { 293 tmp = (tmp >> 1) - 2 + 15; 294 } 295 else 296 { 297 tmp = (tmp & 3) + 69; 298 } 299 300 cw = *(huffTable_7 + tmp); 301 pMainData->usedBits -= (10 - (cw & 0xFF)); 302 303 return(cw >> 8); 304 } 305 306 307 /*---------------------------------------------------------------------------- 308 ; FUNCTION CODE 309 ----------------------------------------------------------------------------*/ 310 uint16 pvmp3_decode_huff_cw_tab8(tmp3Bits *pMainData) 311 { 312 uint32 tmp; 313 uint16 cw; 314 315 tmp = getUpTo17bits(pMainData, 11); /* huffTable_8 */ 316 if ((tmp >> 7) >= 2) 317 { 318 tmp = (tmp >> 7) - 2; 319 } 320 else if ((tmp >> 5) >= 5) 321 { 322 tmp = (tmp >> 5) - 5 + 14; 323 } 324 else if ((tmp >> 2) >= 3) 325 { 326 tmp = (tmp >> 2) - 3 + 17; 327 } 328 else 329 { 330 tmp = (tmp) + 54; 331 } 332 333 cw = *(huffTable_8 + tmp); 334 pMainData->usedBits -= (11 - (cw & 0xFF)); 335 336 return(cw >> 8); 337 } 338 339 340 /*---------------------------------------------------------------------------- 341 ; FUNCTION CODE 342 ----------------------------------------------------------------------------*/ 343 uint16 pvmp3_decode_huff_cw_tab9(tmp3Bits *pMainData) 344 { 345 uint32 tmp; 346 uint16 cw; 347 348 tmp = getUpTo9bits(pMainData, 9); /* huffTable_9 */ 349 if ((tmp >> 5) >= 5) 350 { 351 tmp = (tmp >> 5) - 5; 352 } 353 else if ((tmp >> 3) >= 6) 354 { 355 tmp = (tmp >> 3) - 6 + 11; 356 } 357 else if ((tmp >> 1) >= 4) 358 { 359 tmp = (tmp >> 1) - 4 + 25; 360 } 361 else 362 { 363 tmp = tmp + 45; 364 } 365 366 cw = *(huffTable_9 + tmp); 367 pMainData->usedBits -= (9 - (cw & 0xFF)); 368 369 return(cw >> 8); 370 } 371 372 373 /*---------------------------------------------------------------------------- 374 ; FUNCTION CODE 375 ----------------------------------------------------------------------------*/ 376 uint16 pvmp3_decode_huff_cw_tab10(tmp3Bits *pMainData) 377 { 378 uint32 tmp; 379 uint16 cw; 380 381 tmp = getUpTo17bits(pMainData, 11); /* huffTable_10 */ 382 if (tmp >> 10) 383 { 384 tmp = (tmp >> 10) - 1; 385 } 386 else if ((tmp >> 7) >= 3) 387 { 388 tmp = (tmp >> 7) - 3 + 1; 389 } 390 else if ((tmp >> 5) >= 8) 391 { 392 tmp = (tmp >> 5) - 8 + 6; 393 } 394 else if ((tmp >> 3) >= 18) 395 { 396 tmp = (tmp >> 3) - 18 + 10; 397 } 398 else if ((tmp >> 2) >= 24) 399 { 400 tmp = (tmp >> 2) - 24 + 24; 401 } 402 else if ((tmp >> 1) >= 12) 403 { 404 tmp = (tmp >> 1) - 12 + 36; 405 } 406 else 407 { 408 tmp = (tmp) + 72; 409 } 410 411 cw = *(huffTable_10 + tmp); 412 pMainData->usedBits -= (11 - (cw & 0xFF)); 413 414 return(cw >> 8); 415 } 416 417 418 /*---------------------------------------------------------------------------- 419 ; FUNCTION CODE 420 ----------------------------------------------------------------------------*/ 421 uint16 pvmp3_decode_huff_cw_tab11(tmp3Bits *pMainData) 422 { 423 uint32 tmp; 424 uint16 cw; 425 426 tmp = getUpTo17bits(pMainData, 11); /* huffTable_11 */ 427 if ((tmp >> 8) >= 3) 428 { 429 tmp = (tmp >> 8) - 3; 430 } 431 else if ((tmp >> 6) >= 7) 432 { 433 tmp = (tmp >> 6) - 7 + 5; 434 } 435 else if ((tmp >> 3) >= 32) 436 { 437 tmp = (tmp >> 3) - 32 + 10; 438 } 439 else if ((tmp >> 2) >= 10) 440 { 441 tmp = (tmp >> 2) - 10 + 34; 442 } 443 else if ((tmp >> 1) >= 8) 444 { 445 tmp = (tmp >> 1) - 8 + 88; 446 } 447 else 448 { 449 tmp = (tmp & 0xFF) + 100; 450 } 451 cw = *(huffTable_11 + tmp); 452 pMainData->usedBits -= (11 - (cw & 0xFF)); 453 454 return(cw >> 8); 455 } 456 457 458 /*---------------------------------------------------------------------------- 459 ; FUNCTION CODE 460 ----------------------------------------------------------------------------*/ 461 uint16 pvmp3_decode_huff_cw_tab12(tmp3Bits *pMainData) 462 { 463 uint32 tmp; 464 uint16 cw; 465 466 tmp = getUpTo17bits(pMainData, 10); /* huffTable_12 */ 467 if ((tmp >> 7) >= 5) 468 { 469 tmp = (tmp >> 7) - 5; 470 } 471 else if ((tmp >> 5) >= 12) 472 { 473 tmp = (tmp >> 5) - 12 + 3; 474 } 475 else if ((tmp >> 4) >= 17) 476 { 477 tmp = (tmp >> 4) - 17 + 11; 478 } 479 else if ((tmp >> 2) >= 32) 480 { 481 tmp = (tmp >> 2) - 32 + 18; 482 } 483 else if ((tmp >> 1) >= 16) 484 { 485 tmp = (tmp >> 1) - 16 + 54; 486 } 487 else 488 { 489 tmp = (tmp & 0x1F) + 102; 490 491 } 492 cw = *(huffTable_12 + tmp); 493 pMainData->usedBits -= (10 - (cw & 0xFF)); 494 495 return(cw >> 8); 496 } 497 498 499 /*---------------------------------------------------------------------------- 500 ; FUNCTION CODE 501 ----------------------------------------------------------------------------*/ 502 uint16 pvmp3_decode_huff_cw_tab13(tmp3Bits *pMainData) 503 { 504 uint32 tmp; 505 uint16 cw; 506 507 tmp = getNbits(pMainData, 19); /* huffTable_13 */ 508 if (tmp >> 18) 509 { 510 tmp = 0; 511 } 512 else if ((tmp >> 15) >= 4) 513 { 514 tmp = (tmp >> 15) - 4 + 1; 515 } 516 else if ((tmp >> 11) >= 32) 517 { 518 tmp = (tmp >> 11) - 32 + 5; 519 } 520 else if ((tmp >> 9) >= 64) 521 { 522 tmp = (tmp >> 9) - 64 + 37; 523 } 524 else if ((tmp >> 8) >= 64) 525 { 526 tmp = (tmp >> 8) - 64 + 101; 527 } 528 else if ((tmp >> 7) >= 64) 529 { 530 tmp = (tmp >> 7) - 64 + 165; 531 } 532 else if ((tmp >> 6) >= 32) 533 { 534 tmp = (tmp >> 6) - 32 + 229; 535 } 536 else if ((tmp >> 5) >= 32) 537 { 538 tmp = (tmp >> 5) - 32 + 325; 539 } 540 else if ((tmp >> 4) >= 32) 541 { 542 tmp = (tmp >> 4) - 32 + 357; 543 } 544 else if ((tmp >> 3) >= 32) 545 { 546 tmp = (tmp >> 3) - 32 + 389; 547 } 548 else if ((tmp >> 2) >= 2) 549 { 550 tmp = (tmp >> 2) - 2 + 421; 551 } 552 else 553 { 554 tmp = (tmp & 0x7) + 483; 555 } 556 557 cw = *(huffTable_13 + tmp); 558 pMainData->usedBits -= (19 - (cw & 0xFF)); 559 560 return(cw >> 8); 561 } 562 563 564 /*---------------------------------------------------------------------------- 565 ; FUNCTION CODE 566 ----------------------------------------------------------------------------*/ 567 uint16 pvmp3_decode_huff_cw_tab15(tmp3Bits *pMainData) 568 { 569 uint32 tmp; 570 uint16 cw; 571 572 tmp = getUpTo17bits(pMainData, 13); /* huffTable_15 */ 573 if ((tmp >> 9) >= 10) 574 { 575 tmp = (tmp >> 9) - 10; 576 } 577 else if ((tmp >> 6) >= 39) 578 { 579 tmp = (tmp >> 6) - 39 + 6; 580 } 581 else if ((tmp >> 4) >= 62) 582 { 583 tmp = (tmp >> 4) - 62 + 47; 584 } 585 else if ((tmp >> 3) >= 60) 586 { 587 tmp = (tmp >> 3) - 60 + 141; 588 } 589 else if ((tmp >> 2) >= 64) 590 { 591 tmp = (tmp >> 2) - 64 + 205; 592 } 593 else if ((tmp >> 1) >= 32) 594 { 595 tmp = (tmp >> 1) - 32 + 261; 596 } 597 else 598 { 599 tmp = (tmp & 0x3f) + 357; 600 } 601 602 cw = *(huffTable_15 + tmp); 603 pMainData->usedBits -= (13 - (cw & 0xFF)); 604 605 return(cw >> 8); 606 } 607 608 609 /*---------------------------------------------------------------------------- 610 ; FUNCTION CODE 611 ----------------------------------------------------------------------------*/ 612 uint16 pvmp3_decode_huff_cw_tab16(tmp3Bits *pMainData) 613 { 614 uint32 tmp; 615 uint16 cw; 616 617 tmp = getUpTo17bits(pMainData, 17); /* huffTable_16 */ 618 if (tmp >> 16) 619 { 620 tmp = 0; 621 } 622 else if ((tmp >> 13) >= 4) 623 { 624 tmp = (tmp >> 13) - 4 + 1; 625 } 626 else if ((tmp >> 9) >= 38) 627 { 628 tmp = (tmp >> 9) - 38 + 5; 629 } 630 else if ((tmp >> 7) >= 94) 631 { 632 tmp = (tmp >> 7) - 94 + 31; 633 } 634 else if ((tmp >> 5) >= 214) 635 { 636 tmp = (tmp >> 5) - 214 + 89; 637 } 638 else if ((tmp >> 3) >= 704) 639 { 640 if ((tmp >> 4) >= 384) 641 { 642 tmp = (tmp >> 4) - 384 + 315; 643 } 644 else 645 { 646 tmp = (tmp >> 3) - 704 + 251; 647 } 648 } 649 else if ((tmp >> 8) >= 14) 650 { 651 tmp = (tmp >> 8) - 14 + 359; 652 } 653 else if ((tmp) >= 3456) 654 { 655 if ((tmp >> 2) >= 868) 656 { 657 tmp = (tmp >> 2) - 868 + 383; 658 } 659 else 660 { 661 tmp = (tmp) - 3456 + 367; 662 } 663 } 664 else 665 { 666 tmp = ((tmp >> 6) & 0x3f) + 411; 667 } 668 669 cw = *(huffTable_16 + tmp); 670 pMainData->usedBits -= (17 - (cw & 0xFF)); 671 672 return(cw >> 8); 673 } 674 675 676 677 /*---------------------------------------------------------------------------- 678 ; FUNCTION CODE 679 ----------------------------------------------------------------------------*/ 680 uint16 pvmp3_decode_huff_cw_tab24(tmp3Bits *pMainData) 681 { 682 uint32 tmp; 683 uint16 cw; 684 685 tmp = getUpTo17bits(pMainData, 12); /* huffTable_24 */ 686 if ((tmp >> 6) >= 41) 687 { 688 tmp = (tmp >> 6) - 41; 689 } 690 else if ((tmp >> 3) >= 218) 691 { 692 tmp = (tmp >> 3) - 218 + 23; 693 } 694 else if ((tmp >> 2) >= 336) 695 { 696 tmp = (tmp >> 2) - 336 + 133; 697 } 698 else if ((tmp >> 1) >= 520) 699 { 700 tmp = (tmp >> 1) - 520 + 233; 701 } 702 else if ((tmp) >= 1024) 703 { 704 tmp = (tmp) - 1024 + 385; 705 } 706 else if ((tmp >> 1) >= 352) 707 { 708 if ((tmp >> 8) == 3) 709 { 710 tmp = (tmp >> 8) - 3 + 433; 711 } 712 else 713 { 714 tmp = (tmp >> 1) - 352 + 401; 715 } 716 } 717 else 718 { 719 tmp = ((tmp >> 4) & 0x3f) + 434; 720 } 721 722 cw = *(huffTable_24 + tmp); 723 pMainData->usedBits -= (12 - (cw & 0xFF)); 724 725 return(cw >> 8); 726 } 727 728 729 /*---------------------------------------------------------------------------- 730 ; FUNCTION CODE 731 ----------------------------------------------------------------------------*/ 732 uint16 pvmp3_decode_huff_cw_tab32(tmp3Bits *pMainData) 733 { 734 uint32 tmp = getUpTo9bits(pMainData, 6); /* huffTable_32 */ 735 if ((tmp >> 5)) 736 { 737 pMainData->usedBits -= 5; 738 return(0); 739 } 740 else 741 { 742 uint16 cw = *(huffTable_32 + (tmp & 0x1f)); 743 pMainData->usedBits -= (6 - (cw & 0xFF)); 744 745 return(cw >> 8); 746 } 747 748 } 749 750 751 uint16 pvmp3_decode_huff_cw_tab33(tmp3Bits *pMainData) 752 { 753 754 uint16 tmp = getUpTo9bits(pMainData, 4); /* huffTable_33 */ 755 756 return((0x0f - tmp)); 757 } 758 759