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_stereo_proc.cpp 25 26 Functions: 27 28 pvmp3_st_mid_side 29 pvmp3_st_intensity 30 pvmp3_stereo_proc 31 32 ------------------------------------------------------------------------------ 33 34 pvmp3_st_mid_side 35 36 INPUT AND OUTPUT DEFINITIONS 37 38 Input 39 40 int32 xr[], input channel 41 int32 xl[], 42 int32 Start, Location of first element where stereo intensity is applied 43 int32 Number number of elements affected 44 45 Returns 46 47 int32 xl[], generated stereo channel 48 49 50 ------------------------------------------------------------------------------ 51 52 pvmp3_st_intensity 53 54 INPUT AND OUTPUT DEFINITIONS 55 56 Input 57 58 int32 xr[], input channel 59 int32 xl[], 60 int32 is_pos, index to table is_ratio_factor[] 61 int32 Start, Location of first element where stereo intensity is applied 62 int32 Number number of elements affected 63 64 Returns 65 66 int32 xl[], generated stereo channel 67 68 69 ------------------------------------------------------------------------------ 70 71 pvmp3_stereo_proc 72 73 INPUT AND OUTPUT DEFINITIONS 74 75 Input 76 77 int32 xr[], input channel 78 int32 xl[], 79 mp3ScaleFactors *scalefac, scale factors structure 80 struct gr_info_s *gr_info, granule structure 81 mp3Header *info mp3 header info 82 Returns 83 84 int32 xl[], generated stereo channel 85 86 87 ------------------------------------------------------------------------------ 88 FUNCTION DESCRIPTION 89 90 stereo processing for mpeg1 layer III 91 After requantization, the reconstructed values are processed for ms_stereo 92 or intensity_stereo modes or both, before passing them to the synthesis 93 filterbank 94 95 In ms_stereo mode the values of the normalized middle/side channels 96 M[l] and S[l] are transmitted instead of the left/right channel values 97 L[l] and R[l]. From here, L[l] and R[l] are reconstructed 98 99 Intensity_stereo is done by specifying the magnitude (via the 100 scalefactors of the left channel) and a stereo position is_pos[sfb], 101 which is transmitted instead of scalefactors of the right channel. 102 The stereo position is used to derive the left and right channel signals 103 104 ------------------------------------------------------------------------------ 105 REQUIREMENTS 106 107 108 ------------------------------------------------------------------------------ 109 REFERENCES 110 111 [1] ISO MPEG Audio Subgroup Software Simulation Group (1996) 112 ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension 113 114 ------------------------------------------------------------------------------ 115 PSEUDO-CODE 116 117 ------------------------------------------------------------------------------ 118 */ 119 120 121 /*---------------------------------------------------------------------------- 122 ; INCLUDES 123 ----------------------------------------------------------------------------*/ 124 125 #include "pvmp3_stereo_proc.h" 126 #include "pv_mp3dec_fxd_op.h" 127 #include "pvmp3_tables.h" 128 129 130 /*---------------------------------------------------------------------------- 131 ; MACROS 132 ; Define module specific macros here 133 ----------------------------------------------------------------------------*/ 134 135 136 /*---------------------------------------------------------------------------- 137 ; DEFINES 138 ; Include all pre-processor statements here. Include conditional 139 ; compile variables also. 140 ----------------------------------------------------------------------------*/ 141 #define N31 31 142 143 #define Q31_fmt(a) (int32(double(0x7FFFFFFF)*a)) 144 145 /*---------------------------------------------------------------------------- 146 ; LOCAL FUNCTION DEFINITIONS 147 ; Function Prototype declaration 148 ----------------------------------------------------------------------------*/ 149 150 /*---------------------------------------------------------------------------- 151 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS 152 ; Variable declaration - defined here and used outside this module 153 ----------------------------------------------------------------------------*/ 154 /* 155 * TmpFac= tan(is_pos * (PI /12)); 156 * 157 * TmpFac /= (1 + TmpFac); 158 * 159 */ 160 161 const int32 is_ratio_factor[8] = {0, 162 Q31_fmt(0.21132486540519), Q31_fmt(0.36602540378444), Q31_fmt(0.50000000000000), 163 Q31_fmt(0.63397459621556), Q31_fmt(0.78867513459481), Q31_fmt(1.00000000000000), 164 0 165 }; 166 167 /*---------------------------------------------------------------------------- 168 ; EXTERNAL FUNCTION REFERENCES 169 ; Declare functions defined elsewhere and referenced in this module 170 ----------------------------------------------------------------------------*/ 171 172 /*---------------------------------------------------------------------------- 173 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 174 ; Declare variables used in this module but defined elsewhere 175 ----------------------------------------------------------------------------*/ 176 177 /*---------------------------------------------------------------------------- 178 ; FUNCTION CODE 179 ----------------------------------------------------------------------------*/ 180 181 void pvmp3_st_mid_side(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS], 182 int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS], 183 int32 Start, 184 int32 Number) 185 { 186 187 int32 *pt_xr = &xr[Start]; 188 int32 *pt_xl = &xl[Start]; 189 190 for (int32 i = Number >> 1; i != 0; i--) 191 { 192 int32 xxr = *(pt_xr) << 1; 193 int32 xxl = *(pt_xl) << 1; 194 *(pt_xr++) = fxp_mul32_Q32((xxr + xxl), Q31_fmt(0.70710678118655)); /* Sum */ 195 *(pt_xl++) = fxp_mul32_Q32((xxr - xxl), Q31_fmt(0.70710678118655)); /* Diff */ 196 xxr = *(pt_xr) << 1; 197 xxl = *(pt_xl) << 1; 198 *(pt_xr++) = fxp_mul32_Q32((xxr + xxl), Q31_fmt(0.70710678118655)); /* Sum */ 199 *(pt_xl++) = fxp_mul32_Q32((xxr - xxl), Q31_fmt(0.70710678118655)); /* Diff */ 200 } 201 202 203 if (Number&1) 204 { 205 int32 xxr = *(pt_xr) << 1; 206 int32 xxl = *(pt_xl) << 1; 207 *(pt_xr) = fxp_mul32_Q32((xxr + xxl), Q31_fmt(0.70710678118655)); /* Sum */ 208 *(pt_xl) = fxp_mul32_Q32((xxr - xxl), Q31_fmt(0.70710678118655)); /* Diff */ 209 } 210 211 } 212 213 214 /*---------------------------------------------------------------------------- 215 ; FUNCTION CODE 216 ----------------------------------------------------------------------------*/ 217 218 void pvmp3_st_intensity(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS], 219 int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS], 220 int32 is_pos, 221 int32 Start, 222 int32 Number) 223 { 224 225 int32 TmpFac = is_ratio_factor[ is_pos & 7]; 226 227 int32 *pt_xr = &xr[Start]; 228 int32 *pt_xl = &xl[Start]; 229 230 for (int32 i = Number >> 1; i != 0; i--) 231 { 232 int32 tmp = fxp_mul32_Q32((*pt_xr) << 1, TmpFac); 233 *(pt_xl++) = (*pt_xr) - tmp; 234 *(pt_xr++) = tmp; 235 tmp = fxp_mul32_Q32((*pt_xr) << 1, TmpFac); 236 *(pt_xl++) = (*pt_xr) - tmp; 237 *(pt_xr++) = tmp; 238 } 239 240 if (Number&1) 241 { 242 int32 tmp = fxp_mul32_Q32((*pt_xr) << 1, TmpFac); 243 *(pt_xl) = (*pt_xr) - tmp; 244 *(pt_xr) = tmp; 245 } 246 247 } 248 249 /*---------------------------------------------------------------------------- 250 ; FUNCTION CODE 251 ----------------------------------------------------------------------------*/ 252 void pvmp3_stereo_proc(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS], 253 int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS], 254 mp3ScaleFactors *scalefac, 255 granuleInfo *gr_info, 256 int32 used_freq_lines, 257 mp3Header *info) 258 { 259 260 261 int32 sb; 262 int32 ss; 263 int32 sfbNo; 264 int32 sfbStart; 265 266 int32 sfb; 267 int32 sfbTemp; 268 int32 i; 269 int32 j; 270 271 272 int32 i_stereo = (info->mode == MPG_MD_JOINT_STEREO) && 273 (info->mode_ext & 0x1); 274 275 int32 ms_stereo = (info->mode == MPG_MD_JOINT_STEREO) && 276 (info->mode_ext & 0x2); 277 278 int32 sfreq = info->version_x + (info->version_x << 1); 279 sfreq += info->sampling_frequency; 280 281 282 283 284 if (i_stereo) 285 { 286 if (gr_info->window_switching_flag && (gr_info->block_type == 2)) 287 { 288 if (gr_info->mixed_block_flag) 289 { 290 /* 291 * mixed blocks processing 292 */ 293 i = 31; 294 ss = 17; 295 sb = 0; 296 while (i >= 0) 297 { 298 if (xl[(i*FILTERBANK_BANDS) + ss]) 299 { 300 sb = (i << 4) + (i << 1) + ss; 301 i = -1; 302 } 303 else 304 { 305 ss--; 306 if (ss < 0) 307 { 308 i--; 309 ss = 17; 310 } 311 } 312 } 313 314 if (sb < 36) 315 { 316 /* 317 * mixed blocks processing: intensity bound inside long blocks 318 */ 319 /* 1. long blocks up to intensity border: not intensity */ 320 321 if (mp3_sfBandIndex[sfreq].l[4] <= sb) 322 { 323 sfb = 4; 324 } 325 else 326 { 327 sfb = 0; 328 } 329 330 while (mp3_sfBandIndex[sfreq].l[sfb] < sb) 331 { 332 sfb++; 333 } 334 335 /* from that sfb on intensity stereo */ 336 sfbTemp = sfb; /* save for later use */ 337 338 sfbStart = mp3_sfBandIndex[sfreq].l[sfb]; 339 340 /* from 0 up to sfbStart do ms_stereo or normal stereo */ 341 342 if (ms_stereo) 343 { 344 pvmp3_st_mid_side(xr, xl, 0, sfbStart); 345 } 346 347 /* 2. long blocks from intensity border up to sfb band 8: intensity */ 348 /* calc. is_ratio */ 349 350 351 /* Start of intensity stereo of remaining sfc bands: */ 352 for (; sfbTemp < 8; sfbTemp++) 353 { 354 sfbStart = mp3_sfBandIndex[sfreq].l[sfbTemp]; /* = Start in 0 ... 575 */ 355 sfbNo = mp3_sfBandIndex[sfreq].l[sfbTemp+1] - mp3_sfBandIndex[sfreq].l[sfbTemp]; /* No of lines to process */ 356 357 if (scalefac->l[sfbTemp] != 7) 358 { 359 pvmp3_st_intensity(xr, xl, scalefac->l[sfbTemp], sfbStart, sfbNo); 360 } 361 else if (ms_stereo) 362 { 363 pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo); 364 } 365 366 } /* for (; sfbTemp < 8; sfbTemp++) */ 367 368 for (j = 0; j < 3; j++) 369 { 370 /* 3. short blocks from sfbcnt to last sfb do intensity stereo */ 371 for (sfbTemp = 3; sfbTemp < 13; sfbTemp++) 372 { 373 sfbNo = mp3_sfBandIndex[sfreq].s[sfbTemp+1] - mp3_sfBandIndex[sfreq].s[sfbTemp]; /* No of lines to process */ 374 sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfbTemp] + j * sfbNo; 375 376 if (scalefac->s[j][sfbTemp] != 7) 377 { 378 pvmp3_st_intensity(xr, xl, scalefac->s[j][sfbTemp], sfbStart, sfbNo); 379 } 380 else if (ms_stereo) 381 { 382 pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo); 383 } 384 385 } /* for (; sfbTemp < 22; sfbTemp++) */ 386 } /* for (j = 0; j < 3; j++) */ 387 } 388 else /* else for (sb >= 36) */ 389 { 390 /* 391 * mixed blocks processing: intensity bound outside long blocks 392 */ 393 394 395 /* 396 * 2. short blocks from sfb band 3 up to intensity border: normal stereo, ms stereo and intensity 397 */ 398 for (j = 0; j < 3; j++) 399 { 400 int32 sfbcnt; 401 sfbcnt = -1; 402 403 for (sfb = 12; sfb >= 3; sfb--) 404 { 405 int32 lines; 406 lines = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb]; 407 i = 3 * mp3_sfBandIndex[sfreq].s[sfb] + (j + 1) * lines - 1; 408 409 while (lines > 0) 410 { 411 if (xl[i]) 412 { 413 sfbcnt = sfb; 414 sfb = -10; 415 lines = -10; 416 } 417 lines--; 418 i--; 419 } 420 } 421 422 sfbcnt += 1; 423 if (sfbcnt < 3) 424 { 425 sfbcnt = 3; 426 } 427 428 sfbTemp = sfbcnt; /* for later use */ 429 430 431 /* 432 * do normal stereo or MS stereo from sfb 3 to < sfbcnt: 433 */ 434 for (sb = 3; sb < sfbcnt; sb++) 435 { 436 sfbNo = mp3_sfBandIndex[sfreq].s[sb+1] - mp3_sfBandIndex[sfreq].s[sb]; 437 sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sb] + j * sfbNo; 438 439 if (ms_stereo) 440 { 441 pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo); 442 } 443 444 } 445 446 /* from sfbcnt to last sfb do intensity stereo */ 447 for (; sfbTemp < 13; sfbTemp++) 448 { 449 sfbNo = mp3_sfBandIndex[sfreq].s[sfbTemp+1] - mp3_sfBandIndex[sfreq].s[sfbTemp]; /* No of lines to process */ 450 sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfbTemp] + j * sfbNo; 451 452 if (scalefac->s[j][sfbTemp] != 7) 453 { 454 pvmp3_st_intensity(xr, xl, scalefac->s[j][sfbTemp], sfbStart, sfbNo); 455 } 456 else if (ms_stereo) 457 { 458 pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo); 459 } 460 461 } /* for (; sfbTemp < 22; sfbTemp++) */ 462 463 } /* for (j = 0; j < 3; j++) */ 464 465 /* 1. long blocks up to sfb band 8: not intensity */ 466 /* from 0 to sfb 8 ms_stereo or normal stereo */ 467 468 sfbStart = mp3_sfBandIndex[sfreq].l[8]; 469 470 if (ms_stereo) 471 { 472 pvmp3_st_mid_side(xr, xl, 0, sfbStart); 473 } 474 475 } 476 } /* if (gr_info->mixed_block_flag) */ 477 else 478 { 479 /* 480 * short block processing 481 */ 482 for (j = 0; j < 3; j++) 483 { 484 int32 sfbcnt = -1; 485 486 for (sfb = 12; sfb >= 0; sfb--) 487 { 488 int32 lines = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb]; 489 i = 3 * mp3_sfBandIndex[sfreq].s[sfb] + (j + 1) * lines - 1; 490 491 while (lines > 0) 492 { 493 if (xl[i]) 494 { 495 sfbcnt = sfb; 496 sfb = -10; 497 lines = -10; 498 } 499 lines--; 500 i--; 501 } 502 } 503 504 sfbcnt += 1; 505 sfbTemp = sfbcnt; /* for later use */ 506 507 /* do normal stereo or MS stereo from 0 to sfbcnt */ 508 for (sb = 0; sb < sfbcnt; sb++) 509 { 510 sfbNo = mp3_sfBandIndex[sfreq].s[sb+1] - mp3_sfBandIndex[sfreq].s[sb]; 511 sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sb] + j * sfbNo; 512 513 if (ms_stereo) 514 { 515 pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo); 516 } 517 } 518 519 520 /* from sfbcnt to last sfb do intensity stereo */ 521 for (; sfbTemp < 13; sfbTemp++) 522 { 523 sfbNo = mp3_sfBandIndex[sfreq].s[sfbTemp+1] - mp3_sfBandIndex[sfreq].s[sfbTemp]; /* No of lines to process */ 524 sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfbTemp] + j * sfbNo; 525 526 if (scalefac->s[j][sfbTemp] != 7) 527 { 528 pvmp3_st_intensity(xr, xl, scalefac->s[j][sfbTemp], sfbStart, sfbNo); 529 } 530 else if (ms_stereo) 531 { 532 pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo); 533 } 534 535 } /* for (; sfbTemp < 22; sfbTemp++) */ 536 537 } /* for (j = 0; j < 3; j++) */ 538 539 } /* if( gr_info->mixed_block_flag) */ 540 541 542 543 } /* if (gr_info->window_switching_flag && (gr_info->block_type == 2)) */ 544 else 545 { 546 /* 547 * long block processing 548 */ 549 i = 31; 550 ss = 17; 551 sb = 0; 552 553 while (i >= 0) 554 { 555 if (xl[(i*FILTERBANK_BANDS) + ss] != 0) 556 { 557 sb = (i << 4) + (i << 1) + ss; 558 i = -2; 559 } 560 else 561 { 562 ss--; 563 if (ss < 0) 564 { 565 i--; 566 ss = 17; 567 } 568 } 569 } 570 571 if (sb) 572 { 573 if (mp3_sfBandIndex[sfreq].l[14] <= sb) 574 { 575 sfb = 14; 576 } 577 else if (mp3_sfBandIndex[sfreq].l[7] <= sb) 578 { 579 sfb = 7; 580 } 581 else 582 { 583 sfb = 0; 584 } 585 586 587 while (mp3_sfBandIndex[sfreq].l[sfb] <= sb) 588 { 589 sfb++; 590 } 591 } 592 else 593 { 594 if (i == -1) 595 { 596 /* all xr[1][][] are 0: set IS bound sfb to 0 */ 597 sfb = 0; 598 } 599 else 600 { 601 /* xr[1][0][0] is unequal 0 and all others are 0: set IS bound sfb to 1 */ 602 sfb = 1; 603 } 604 } 605 606 sfbTemp = sfb; /* save for later use */ 607 608 609 sfbStart = mp3_sfBandIndex[sfreq].l[sfb]; 610 611 /* from 0 to sfbStart ms_stereo or normal stereo */ 612 if (ms_stereo) 613 { 614 pvmp3_st_mid_side(xr, xl, 0, sfbStart); 615 } 616 617 /* now intensity stereo of the remaining sfb's: */ 618 for (; sfb < 21; sfb++) 619 { 620 sfbStart = mp3_sfBandIndex[sfreq].l[sfb]; 621 sfbNo = mp3_sfBandIndex[sfreq].l[sfb+1] - mp3_sfBandIndex[sfreq].l[sfb]; /* No of lines to process */ 622 623 if (scalefac->l[sfb] != 7) 624 { 625 pvmp3_st_intensity(xr, xl, scalefac->l[sfb], sfbStart, sfbNo); 626 } 627 else if (ms_stereo) 628 { 629 pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo); 630 } 631 632 } /* for (; sfbTemp < 22; sfbTemp++) */ 633 634 635 636 sfbStart = mp3_sfBandIndex[sfreq].l[21]; 637 sfbNo = mp3_sfBandIndex[sfreq].l[22] - mp3_sfBandIndex[sfreq].l[21]; /* No of lines to process */ 638 639 if (scalefac->l[21] != 7) 640 { 641 if (sfbTemp < 21) 642 { 643 sfbTemp = scalefac->l[20]; 644 } 645 else 646 { 647 sfbTemp = 0; /* if scalefac[20] is not an intensity position, is_pos = 0 */ 648 } 649 650 pvmp3_st_intensity(xr, xl, sfbTemp, sfbStart, sfbNo); 651 } 652 else if (ms_stereo) 653 { 654 pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo); 655 } 656 657 } /* if (gr_info->window_switching_flag && (gr_info->block_type == 2)) */ 658 659 660 } /* if (i_stereo) */ 661 else 662 { 663 /* 664 * normal or ms stereo processing 665 */ 666 if (ms_stereo) 667 { 668 669 pvmp3_st_mid_side(xr, xl, 0, used_freq_lines); 670 671 } 672 673 } /* if (i_stereo) */ 674 675 } 676 677