1 /* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2010 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 Filename: sbr_dec.c 21 22 ------------------------------------------------------------------------------ 23 REVISION HISTORY 24 25 26 Who: Date: MM/DD/YYYY 27 Description: 28 29 ------------------------------------------------------------------------------ 30 INPUT AND OUTPUT DEFINITIONS 31 32 33 34 ------------------------------------------------------------------------------ 35 FUNCTION DESCRIPTION 36 37 sbr decoder core function 38 39 ------------------------------------------------------------------------------ 40 REQUIREMENTS 41 42 43 ------------------------------------------------------------------------------ 44 REFERENCES 45 46 SC 29 Software Copyright Licencing Disclaimer: 47 48 This software module was originally developed by 49 Coding Technologies 50 51 and edited by 52 - 53 54 in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3 55 standards for reference purposes and its performance may not have been 56 optimized. This software module is an implementation of one or more tools as 57 specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards. 58 ISO/IEC gives users free license to this software module or modifications 59 thereof for use in products claiming conformance to audiovisual and 60 image-coding related ITU Recommendations and/or ISO/IEC International 61 Standards. ISO/IEC gives users the same free license to this software module or 62 modifications thereof for research purposes and further ISO/IEC standardisation. 63 Those intending to use this software module in products are advised that its 64 use may infringe existing patents. ISO/IEC have no liability for use of this 65 software module or modifications thereof. Copyright is not released for 66 products that do not conform to audiovisual and image-coding related ITU 67 Recommendations and/or ISO/IEC International Standards. 68 The original developer retains full right to modify and use the code for its 69 own purpose, assign or donate the code to a third party and to inhibit third 70 parties from using the code for products that do not conform to audiovisual and 71 image-coding related ITU Recommendations and/or ISO/IEC International Standards. 72 This copyright notice must be included in all copies or derivative works. 73 Copyright (c) ISO/IEC 2002. 74 75 ------------------------------------------------------------------------------ 76 PSEUDO-CODE 77 78 ------------------------------------------------------------------------------ 79 */ 80 81 82 /*---------------------------------------------------------------------------- 83 ; INCLUDES 84 ----------------------------------------------------------------------------*/ 85 #ifdef AAC_PLUS 86 87 88 #include "s_sbr_frame_data.h" 89 #include "calc_sbr_synfilterbank.h" 90 #include "calc_sbr_anafilterbank.h" 91 #include "calc_sbr_envelope.h" 92 #include "sbr_generate_high_freq.h" 93 #include "sbr_dec.h" 94 #include "decode_noise_floorlevels.h" 95 #include "aac_mem_funcs.h" 96 #include "fxp_mul32.h" 97 98 /*---------------------------------------------------------------------------- 99 ; MACROS 100 ; Define module specific macros here 101 ----------------------------------------------------------------------------*/ 102 103 104 /*---------------------------------------------------------------------------- 105 ; DEFINES 106 ; Include all pre-processor statements here. Include conditional 107 ; compile variables also. 108 ----------------------------------------------------------------------------*/ 109 110 /*---------------------------------------------------------------------------- 111 ; LOCAL FUNCTION DEFINITIONS 112 ; Function Prototype declaration 113 ----------------------------------------------------------------------------*/ 114 /*---------------------------------------------------------------------------- 115 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS 116 ; Variable declaration - defined here and used outside this module 117 ----------------------------------------------------------------------------*/ 118 119 120 /*---------------------------------------------------------------------------- 121 ; EXTERNAL FUNCTION REFERENCES 122 ; Declare functions defined elsewhere and referenced in this module 123 ----------------------------------------------------------------------------*/ 124 #include "pv_audio_type_defs.h" 125 126 #ifdef PARAMETRICSTEREO 127 128 #include "ps_applied.h" 129 #include "ps_init_stereo_mixing.h" 130 131 #endif 132 133 /*---------------------------------------------------------------------------- 134 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 135 ; Declare variables used in this module but defined elsewhere 136 ----------------------------------------------------------------------------*/ 137 138 /*---------------------------------------------------------------------------- 139 ; FUNCTION CODE 140 ----------------------------------------------------------------------------*/ 141 142 void sbr_dec(Int16 *inPcmData, 143 Int16 *ftimeOutPtr, 144 SBR_FRAME_DATA * hFrameData, 145 int32_t applyProcessing, 146 SBR_DEC *sbrDec, 147 #ifdef HQ_SBR 148 #ifdef PARAMETRICSTEREO 149 Int16 * ftimeOutPtrPS, 150 HANDLE_PS_DEC hParametricStereoDec, 151 #endif 152 #endif 153 tDec_Int_File *pVars) 154 { 155 int32_t i; 156 int32_t j; 157 int32_t m; 158 159 int32_t *frameInfo = hFrameData->frameInfo; 160 Int num_qmf_bands; 161 162 #ifdef HQ_SBR 163 #ifdef PARAMETRICSTEREO 164 165 int32_t env; 166 167 int32_t *qmf_PS_generated_Real; 168 int32_t *qmf_PS_generated_Imag; 169 170 int32_t *Sr_x; 171 int32_t *Si_x; 172 173 174 #endif 175 #endif 176 177 int32_t(*scratch_mem)[64]; 178 Int16 *circular_buffer_s; 179 180 int32_t k; 181 int32_t *Sr; 182 int32_t *Si; 183 int32_t *ptr_tmp1; 184 int32_t *ptr_tmp2; 185 scratch_mem = pVars->scratch.scratch_mem; 186 187 188 if (applyProcessing) 189 { 190 num_qmf_bands = sbrDec->lowSubband; 191 } 192 else 193 { 194 num_qmf_bands = 32; /* becomes a resampler by 2 */ 195 } 196 197 /* -------------------------------------------------- */ 198 /* 199 * Re-Load Buffers 200 */ 201 pv_memmove(&hFrameData->sbrQmfBufferReal[0], 202 &hFrameData->HistsbrQmfBufferReal[0], 203 6*SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferReal)); 204 #ifdef HQ_SBR 205 206 207 if (sbrDec->LC_aacP_DecoderFlag == OFF) 208 { 209 pv_memmove(&hFrameData->sbrQmfBufferImag[0], 210 &hFrameData->HistsbrQmfBufferImag[0], 211 6*SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferImag)); 212 } 213 #endif 214 /* -------------------------------------------------- */ 215 216 217 /* 218 * low band codec signal subband filtering 219 */ 220 221 for (i = 0; i < 32; i++) 222 { 223 224 if (sbrDec->LC_aacP_DecoderFlag == ON) 225 { 226 227 calc_sbr_anafilterbank_LC(hFrameData->codecQmfBufferReal[sbrDec->bufWriteOffs + i], 228 &inPcmData[319] + (i << 5), 229 scratch_mem, 230 num_qmf_bands); 231 232 } 233 #ifdef HQ_SBR 234 else 235 { 236 237 calc_sbr_anafilterbank(hFrameData->codecQmfBufferReal[sbrDec->bufWriteOffs + i], 238 hFrameData->codecQmfBufferImag[sbrDec->bufWriteOffs + i], 239 &inPcmData[319] + (i << 5), 240 scratch_mem, 241 num_qmf_bands); 242 } 243 #endif 244 245 } 246 247 if (pVars->ltp_buffer_state) 248 { 249 pv_memcpy(&inPcmData[-1024-288], &inPcmData[1024], 288*sizeof(*inPcmData)); 250 } 251 else 252 { 253 pv_memcpy(&inPcmData[1024 + 288], &inPcmData[1024], 288*sizeof(*inPcmData)); 254 } 255 256 257 if (applyProcessing) 258 { 259 260 /* 261 * Inverse filtering of lowband + HF generation 262 */ 263 264 if (sbrDec->LC_aacP_DecoderFlag == ON) 265 { 266 267 sbr_generate_high_freq((int32_t(*)[32])(hFrameData->codecQmfBufferReal + sbrDec->bufReadOffs), 268 NULL, 269 (int32_t *)(hFrameData->sbrQmfBufferReal), 270 NULL, 271 hFrameData->sbr_invf_mode, 272 hFrameData->sbr_invf_mode_prev, 273 &(sbrDec->FreqBandTableNoise[1]), 274 sbrDec->NoNoiseBands, 275 sbrDec->lowSubband, 276 sbrDec->V_k_master, 277 sbrDec->Num_Master, 278 sbrDec->outSampleRate, 279 frameInfo, 280 hFrameData->degreeAlias, 281 scratch_mem, 282 hFrameData->BwVector,/* */ 283 hFrameData->BwVectorOld, 284 &(sbrDec->Patch), 285 sbrDec->LC_aacP_DecoderFlag, 286 &(sbrDec->highSubband)); 287 288 289 /* 290 * Adjust envelope of current frame. 291 */ 292 293 calc_sbr_envelope(hFrameData, 294 (int32_t *)(hFrameData->sbrQmfBufferReal), 295 NULL, 296 sbrDec->FreqBandTable, 297 sbrDec->NSfb, 298 sbrDec->FreqBandTableNoise, 299 sbrDec->NoNoiseBands, 300 hFrameData->reset_flag, 301 hFrameData->degreeAlias, 302 &(hFrameData->harm_index), 303 &(hFrameData->phase_index), 304 hFrameData->hFp, 305 &(hFrameData->sUp), 306 sbrDec->limSbc, 307 sbrDec->gateMode, 308 #ifdef HQ_SBR 309 NULL, 310 NULL, 311 NULL, 312 NULL, 313 #endif 314 scratch_mem, 315 sbrDec->Patch, 316 sbrDec->sqrt_cache, 317 sbrDec->LC_aacP_DecoderFlag); 318 } 319 #ifdef HQ_SBR 320 else 321 { 322 323 sbr_generate_high_freq((int32_t(*)[32])(hFrameData->codecQmfBufferReal + sbrDec->bufReadOffs), 324 (int32_t(*)[32])(hFrameData->codecQmfBufferImag + sbrDec->bufReadOffs), 325 (int32_t *)(hFrameData->sbrQmfBufferReal), 326 (int32_t *)(hFrameData->sbrQmfBufferImag), 327 hFrameData->sbr_invf_mode, 328 hFrameData->sbr_invf_mode_prev, 329 &(sbrDec->FreqBandTableNoise[1]), 330 sbrDec->NoNoiseBands, 331 sbrDec->lowSubband, 332 sbrDec->V_k_master, 333 sbrDec->Num_Master, 334 sbrDec->outSampleRate, 335 frameInfo, 336 NULL, 337 scratch_mem, 338 hFrameData->BwVector, 339 hFrameData->BwVectorOld, 340 &(sbrDec->Patch), 341 sbrDec->LC_aacP_DecoderFlag, 342 &(sbrDec->highSubband)); 343 344 /* 345 * Adjust envelope of current frame. 346 */ 347 348 calc_sbr_envelope(hFrameData, 349 (int32_t *)(hFrameData->sbrQmfBufferReal), 350 (int32_t *)(hFrameData->sbrQmfBufferImag), 351 sbrDec->FreqBandTable, 352 sbrDec->NSfb, 353 sbrDec->FreqBandTableNoise, 354 sbrDec->NoNoiseBands, 355 hFrameData->reset_flag, 356 NULL, 357 &(hFrameData->harm_index), 358 &(hFrameData->phase_index), 359 hFrameData->hFp, 360 &(hFrameData->sUp), 361 sbrDec->limSbc, 362 sbrDec->gateMode, 363 hFrameData->fBuf_man, 364 hFrameData->fBuf_exp, 365 hFrameData->fBufN_man, 366 hFrameData->fBufN_exp, 367 scratch_mem, 368 sbrDec->Patch, 369 sbrDec->sqrt_cache, 370 sbrDec->LC_aacP_DecoderFlag); 371 372 } 373 #endif 374 375 376 } 377 else /* else for applyProcessing */ 378 { 379 /* no sbr, set high band buffers to zero */ 380 381 for (i = 0; i < SBR_NUM_COLUMNS; i++) 382 { 383 pv_memset((void *)&hFrameData->sbrQmfBufferReal[i*SBR_NUM_BANDS], 384 0, 385 SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferReal)); 386 387 #ifdef HQ_SBR 388 pv_memset((void *)&hFrameData->sbrQmfBufferImag[i*SBR_NUM_BANDS], 389 0, 390 SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferImag)); 391 392 #endif 393 } 394 395 } 396 397 398 /* 399 * Synthesis subband filtering. 400 */ 401 402 #ifdef HQ_SBR 403 404 #ifdef PARAMETRICSTEREO 405 406 407 /* 408 * psPresentFlag set implies hParametricStereoDec !=NULL, second condition is 409 * is just here to prevent CodeSonar warnings. 410 */ 411 if ((pVars->mc_info.psPresentFlag) && (applyProcessing) && 412 (hParametricStereoDec != NULL)) 413 { 414 415 /* 416 * qmfBufferReal uses the rigth aac channel ( perChan[1] is not used) 417 * followed by the buffer fxpCoef[2][2048] which makes a total of 418 * 2349 + 2048*2 = 6445 419 * These 2 matrices (qmfBufferReal & qmfBufferImag) are 420 * [2][38][64] == 4864 int32_t 421 */ 422 423 424 tDec_Int_Chan *tmpx = &pVars->perChan[1]; 425 /* 426 * dereferencing type-punned pointer avoid 427 * breaking strict-aliasing rules 428 */ 429 int32_t *tmp = (int32_t *)tmpx; 430 hParametricStereoDec->qmfBufferReal = (int32_t(*)[64]) tmp; 431 432 tmp = (int32_t *) & hParametricStereoDec->qmfBufferReal[38][0]; 433 hParametricStereoDec->qmfBufferImag = (int32_t(*)[64]) tmp; 434 435 for (i = 0; i < 32; i++) 436 { 437 Int xoverBand; 438 439 if (i < ((hFrameData->frameInfo[1]) << 1)) 440 { 441 xoverBand = sbrDec->prevLowSubband; 442 } 443 else 444 { 445 xoverBand = sbrDec->lowSubband; 446 } 447 448 if (xoverBand > sbrDec->highSubband) 449 { 450 /* 451 * error condition, default to upsampling mode 452 * and make sure that the number of bands for xover does 453 * not exceed the number of high freq bands. 454 */ 455 xoverBand = (sbrDec->highSubband > 32)? 32: sbrDec->highSubband; 456 } 457 458 m = sbrDec->bufReadOffs + i; /* 2 + i */ 459 460 Sr_x = hParametricStereoDec->qmfBufferReal[i]; 461 Si_x = hParametricStereoDec->qmfBufferImag[i]; 462 463 464 465 for (int32_t j = 0; j < xoverBand; j++) 466 { 467 Sr_x[j] = shft_lft_1(hFrameData->codecQmfBufferReal[m][j]); 468 Si_x[j] = shft_lft_1(hFrameData->codecQmfBufferImag[m][j]); 469 } 470 471 472 473 474 pv_memcpy(&Sr_x[xoverBand], 475 &hFrameData->sbrQmfBufferReal[i*SBR_NUM_BANDS], 476 (sbrDec->highSubband - xoverBand)*sizeof(*Sr_x)); 477 478 pv_memcpy(&Si_x[xoverBand], 479 &hFrameData->sbrQmfBufferImag[i*SBR_NUM_BANDS], 480 (sbrDec->highSubband - xoverBand)*sizeof(*Si_x)); 481 482 pv_memset((void *)&Sr_x[sbrDec->highSubband], 483 0, 484 (64 - sbrDec->highSubband)*sizeof(*Sr_x)); 485 486 pv_memset((void *)&Si_x[sbrDec->highSubband], 487 0, 488 (64 - sbrDec->highSubband)*sizeof(*Si_x)); 489 490 491 } 492 493 for (i = 32; i < 32 + 6; i++) 494 { 495 m = sbrDec->bufReadOffs + i; /* 2 + i */ 496 497 for (int32_t j = 0; j < 5; j++) 498 { 499 hParametricStereoDec->qmfBufferReal[i][j] = shft_lft_1(hFrameData->codecQmfBufferReal[m][j]); 500 hParametricStereoDec->qmfBufferImag[i][j] = shft_lft_1(hFrameData->codecQmfBufferImag[m][j]); 501 } 502 503 } 504 505 506 /* 507 * Update Buffers 508 */ 509 for (i = 0; i < sbrDec->bufWriteOffs; i++) /* sbrDec->bufWriteOffs set to 8 and unchanged */ 510 { 511 j = sbrDec->noCols + i; /* sbrDec->noCols set to 32 and unchanged */ 512 513 pv_memmove(hFrameData->codecQmfBufferReal[i], /* to */ 514 hFrameData->codecQmfBufferReal[j], /* from */ 515 sizeof(*hFrameData->codecQmfBufferReal[i]) << 5); 516 517 pv_memmove(hFrameData->codecQmfBufferImag[i], 518 hFrameData->codecQmfBufferImag[j], 519 sizeof(*hFrameData->codecQmfBufferImag[i]) << 5); 520 } 521 522 523 pv_memmove(&hFrameData->HistsbrQmfBufferReal[0], 524 &hFrameData->sbrQmfBufferReal[32*SBR_NUM_BANDS], 525 6*SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferReal)); 526 527 pv_memmove(&hFrameData->HistsbrQmfBufferImag[0], 528 &hFrameData->sbrQmfBufferImag[32*SBR_NUM_BANDS], 529 6*SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferImag)); 530 531 532 /* 533 * Needs whole QMF matrix formed before applying 534 * Parametric stereo processing. 535 */ 536 537 qmf_PS_generated_Real = scratch_mem[0]; 538 qmf_PS_generated_Imag = scratch_mem[1]; 539 env = 0; 540 541 /* 542 * Set circular buffer for Left channel 543 */ 544 545 circular_buffer_s = (Int16 *)scratch_mem[7]; 546 547 548 if (pVars->mc_info.bDownSampledSbr) 549 { 550 pv_memmove(&circular_buffer_s[2048], 551 hFrameData->V, 552 640*sizeof(*circular_buffer_s)); 553 } 554 else 555 { 556 pv_memmove(&circular_buffer_s[4096], 557 hFrameData->V, 558 1152*sizeof(*circular_buffer_s)); 559 560 } 561 562 563 /* 564 * Set Circular buffer for PS hybrid analysis 565 */ 566 567 int32_t *pt_temp = &scratch_mem[2][32]; 568 569 for (i = 0, j = 0; i < 3; i++) 570 { 571 572 pv_memmove(&pt_temp[ j], 573 hParametricStereoDec->hHybrid->mQmfBufferReal[i], 574 HYBRID_FILTER_LENGTH_m_1*sizeof(*hParametricStereoDec->hHybrid->mQmfBufferReal)); 575 pv_memmove(&pt_temp[ j + 44], 576 hParametricStereoDec->hHybrid->mQmfBufferImag[i], 577 HYBRID_FILTER_LENGTH_m_1*sizeof(*hParametricStereoDec->hHybrid->mQmfBufferImag)); 578 j += 88; 579 } 580 581 582 pv_memset((void *)&qmf_PS_generated_Real[hParametricStereoDec->usb], 583 0, 584 (64 - hParametricStereoDec->usb)*sizeof(*qmf_PS_generated_Real)); 585 586 pv_memset((void *)&qmf_PS_generated_Imag[hParametricStereoDec->usb], 587 0, 588 (64 - hParametricStereoDec->usb)*sizeof(*qmf_PS_generated_Imag)); 589 590 591 for (i = 0; i < 32; i++) 592 { 593 if (i == (Int)hParametricStereoDec-> aEnvStartStop[env]) 594 { 595 ps_init_stereo_mixing(hParametricStereoDec, env, sbrDec->highSubband); 596 env++; 597 } 598 599 600 ps_applied(hParametricStereoDec, 601 &hParametricStereoDec->qmfBufferReal[i], 602 &hParametricStereoDec->qmfBufferImag[i], 603 qmf_PS_generated_Real, 604 qmf_PS_generated_Imag, 605 scratch_mem[2], 606 i); 607 608 /* Create time samples for regular mono channel */ 609 610 if (pVars->mc_info.bDownSampledSbr) 611 { 612 calc_sbr_synfilterbank(hParametricStereoDec->qmfBufferReal[i], /* realSamples */ 613 hParametricStereoDec->qmfBufferImag[i], /* imagSamples */ 614 ftimeOutPtr + (i << 6), 615 &circular_buffer_s[1984 - (i<<6)], 616 pVars->mc_info.bDownSampledSbr); 617 } 618 else 619 { 620 calc_sbr_synfilterbank(hParametricStereoDec->qmfBufferReal[i], /* realSamples */ 621 hParametricStereoDec->qmfBufferImag[i], /* imagSamples */ 622 ftimeOutPtr + (i << 7), 623 &circular_buffer_s[3968 - (i<<7)], 624 pVars->mc_info.bDownSampledSbr); 625 626 } 627 628 pv_memmove(hParametricStereoDec->qmfBufferReal[i], qmf_PS_generated_Real, 64*sizeof(*qmf_PS_generated_Real)); 629 pv_memmove(hParametricStereoDec->qmfBufferImag[i], qmf_PS_generated_Imag, 64*sizeof(*qmf_PS_generated_Real)); 630 631 } 632 633 634 /* 635 * Save Circular buffer history used on PS hybrid analysis 636 */ 637 638 639 pt_temp = &scratch_mem[2][64]; 640 641 for (i = 0, j = 0; i < 3; i++) 642 { 643 pv_memmove(hParametricStereoDec->hHybrid->mQmfBufferReal[i], 644 &pt_temp[ j], 645 HYBRID_FILTER_LENGTH_m_1*sizeof(*hParametricStereoDec->hHybrid->mQmfBufferReal)); 646 647 pv_memmove(hParametricStereoDec->hHybrid->mQmfBufferImag[i], 648 &pt_temp[ j + 44], 649 HYBRID_FILTER_LENGTH_m_1*sizeof(*hParametricStereoDec->hHybrid->mQmfBufferImag)); 650 651 j += 88; 652 } 653 654 655 pv_memmove(hFrameData->V, &circular_buffer_s[0], 1152*sizeof(*circular_buffer_s)); 656 657 /* 658 * Set circular buffer for Right channel 659 */ 660 661 circular_buffer_s = (Int16 *)scratch_mem[5]; 662 663 if (pVars->mc_info.bDownSampledSbr) 664 { 665 pv_memmove(&circular_buffer_s[2048], 666 (int32_t *)hParametricStereoDec->R_ch_qmf_filter_history, 667 640*sizeof(*circular_buffer_s)); 668 } 669 else 670 { 671 pv_memmove(&circular_buffer_s[4096], 672 (int32_t *)hParametricStereoDec->R_ch_qmf_filter_history, 673 1152*sizeof(*circular_buffer_s)); 674 675 } 676 677 678 for (i = 0; i < 32; i++) 679 { 680 if (pVars->mc_info.bDownSampledSbr) 681 { 682 683 calc_sbr_synfilterbank(hParametricStereoDec->qmfBufferReal[i], /* realSamples */ 684 hParametricStereoDec->qmfBufferImag[i], /* imagSamples */ 685 ftimeOutPtrPS + (i << 6), 686 &circular_buffer_s[1984 - (i<<6)], 687 pVars->mc_info.bDownSampledSbr); 688 } 689 else 690 { 691 calc_sbr_synfilterbank(hParametricStereoDec->qmfBufferReal[i], /* realSamples */ 692 hParametricStereoDec->qmfBufferImag[i], /* imagSamples */ 693 ftimeOutPtrPS + (i << 7), 694 &circular_buffer_s[3968 - (i<<7)], 695 pVars->mc_info.bDownSampledSbr); 696 } 697 698 } 699 700 if (pVars->mc_info.bDownSampledSbr) 701 { 702 pv_memmove((int32_t *)hParametricStereoDec->R_ch_qmf_filter_history, &circular_buffer_s[0], 640*sizeof(*circular_buffer_s)); 703 } 704 else 705 { 706 pv_memmove((int32_t *)hParametricStereoDec->R_ch_qmf_filter_history, &circular_buffer_s[0], 1152*sizeof(*circular_buffer_s)); 707 } 708 709 710 711 712 713 } 714 else /* else -- sbrEnablePS */ 715 { 716 717 #endif /* PARAMETRICSTEREO */ 718 #endif /* HQ_SBR */ 719 720 /* 721 * Use shared aac memory as continuous buffer 722 */ 723 724 725 Sr = scratch_mem[0]; 726 Si = scratch_mem[1]; 727 728 circular_buffer_s = (Int16*)scratch_mem[2]; 729 730 if (pVars->mc_info.bDownSampledSbr) 731 { 732 733 pv_memmove(&circular_buffer_s[2048], 734 hFrameData->V, 735 640*sizeof(*circular_buffer_s)); 736 } 737 else 738 { 739 pv_memmove(&circular_buffer_s[4096], 740 hFrameData->V, 741 1152*sizeof(*circular_buffer_s)); 742 } 743 744 for (i = 0; i < 32; i++) 745 { 746 Int xoverBand; 747 748 if (applyProcessing) 749 { 750 if (i < ((hFrameData->frameInfo[1]) << 1)) 751 { 752 xoverBand = sbrDec->prevLowSubband; 753 754 } 755 else 756 { 757 xoverBand = sbrDec->lowSubband; 758 } 759 760 if (xoverBand > sbrDec->highSubband) 761 { 762 /* 763 * error condition, default to upsampling mode 764 * and make sure that the number of bands for xover does 765 * not exceed the number of high freq bands. 766 */ 767 xoverBand = (sbrDec->highSubband > 32)? 32: sbrDec->highSubband; 768 } 769 } 770 else 771 { 772 xoverBand = 32; 773 sbrDec->highSubband = 32; 774 } 775 776 777 m = sbrDec->bufReadOffs + i; /* sbrDec->bufReadOffs == 2 */ 778 779 780 ptr_tmp1 = (hFrameData->codecQmfBufferReal[m]); 781 ptr_tmp2 = Sr; 782 783 if (sbrDec->LC_aacP_DecoderFlag == ON) 784 { 785 786 for (k = (xoverBand >> 1); k != 0; k--) 787 { 788 *(ptr_tmp2++) = (*(ptr_tmp1++)) >> 9; 789 *(ptr_tmp2++) = (*(ptr_tmp1++)) >> 9; 790 } 791 if (xoverBand & 1) 792 { 793 *(ptr_tmp2++) = (*(ptr_tmp1)) >> 9; 794 } 795 796 ptr_tmp1 = &hFrameData->sbrQmfBufferReal[i*SBR_NUM_BANDS]; 797 798 799 for (k = xoverBand; k < sbrDec->highSubband; k++) 800 { 801 *(ptr_tmp2++) = (*(ptr_tmp1++)) << 1; 802 } 803 804 pv_memset((void *)ptr_tmp2, 805 0, 806 (64 - sbrDec->highSubband)*sizeof(*ptr_tmp2)); 807 808 809 if (pVars->mc_info.bDownSampledSbr) 810 { 811 calc_sbr_synfilterbank_LC(Sr, /* realSamples */ 812 ftimeOutPtr + (i << 6), 813 &circular_buffer_s[1984 - (i<<6)], 814 pVars->mc_info.bDownSampledSbr); 815 } 816 else 817 { 818 calc_sbr_synfilterbank_LC(Sr, /* realSamples */ 819 ftimeOutPtr + (i << 7), 820 &circular_buffer_s[3968 - (i<<7)], 821 pVars->mc_info.bDownSampledSbr); 822 } 823 } 824 #ifdef HQ_SBR 825 else 826 { 827 828 for (k = xoverBand; k != 0; k--) 829 { 830 *(ptr_tmp2++) = shft_lft_1(*(ptr_tmp1++)); 831 } 832 833 ptr_tmp1 = &hFrameData->sbrQmfBufferReal[i*SBR_NUM_BANDS]; 834 ptr_tmp2 = &Sr[xoverBand]; 835 836 837 for (k = xoverBand; k < sbrDec->highSubband; k++) 838 { 839 *(ptr_tmp2++) = (*(ptr_tmp1++)); 840 } 841 842 pv_memset((void *)ptr_tmp2, 843 0, 844 (64 - sbrDec->highSubband)*sizeof(*ptr_tmp2)); 845 846 847 ptr_tmp1 = (hFrameData->codecQmfBufferImag[m]); 848 ptr_tmp2 = Si; 849 850 for (k = (xoverBand >> 1); k != 0; k--) 851 { 852 *(ptr_tmp2++) = shft_lft_1(*(ptr_tmp1++)); 853 *(ptr_tmp2++) = shft_lft_1(*(ptr_tmp1++)); 854 } 855 if (xoverBand & 1) 856 { 857 *(ptr_tmp2) = shft_lft_1(*(ptr_tmp1)); 858 } 859 860 ptr_tmp1 = &hFrameData->sbrQmfBufferImag[i*SBR_NUM_BANDS]; 861 ptr_tmp2 = &Si[xoverBand]; 862 863 for (k = xoverBand; k < sbrDec->highSubband; k++) 864 { 865 *(ptr_tmp2++) = (*(ptr_tmp1++)); 866 } 867 868 pv_memset((void *)ptr_tmp2, 869 0, 870 (64 - sbrDec->highSubband)*sizeof(*ptr_tmp2)); 871 872 873 if (pVars->mc_info.bDownSampledSbr) 874 { 875 calc_sbr_synfilterbank(Sr, /* realSamples */ 876 Si, /* imagSamples */ 877 ftimeOutPtr + (i << 6), 878 &circular_buffer_s[1984 - (i<<6)], 879 pVars->mc_info.bDownSampledSbr); 880 } 881 else 882 { 883 calc_sbr_synfilterbank(Sr, /* realSamples */ 884 Si, /* imagSamples */ 885 ftimeOutPtr + (i << 7), 886 &circular_buffer_s[3968 - (i<<7)], 887 pVars->mc_info.bDownSampledSbr); 888 } 889 } 890 #endif 891 892 } 893 894 if (pVars->mc_info.bDownSampledSbr) 895 { 896 pv_memmove(hFrameData->V, &circular_buffer_s[0], 640*sizeof(*circular_buffer_s)); 897 } 898 else 899 { 900 pv_memmove(hFrameData->V, &circular_buffer_s[0], 1152*sizeof(*circular_buffer_s)); 901 } 902 903 904 905 906 /* 907 * Update Buffers 908 */ 909 for (i = 0; i < sbrDec->bufWriteOffs; i++) /* sbrDec->bufWriteOffs set to 8 and unchanged */ 910 { 911 j = sbrDec->noCols + i; /* sbrDec->noCols set to 32 and unchanged */ 912 913 pv_memmove(hFrameData->codecQmfBufferReal[i], /* to */ 914 hFrameData->codecQmfBufferReal[j], /* from */ 915 sizeof(*hFrameData->codecQmfBufferReal[i]) << 5); 916 } 917 918 919 pv_memmove(&hFrameData->HistsbrQmfBufferReal[0], 920 &hFrameData->sbrQmfBufferReal[32*SBR_NUM_BANDS], 921 6*SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferReal)); 922 923 #ifdef HQ_SBR 924 if (sbrDec->LC_aacP_DecoderFlag == OFF) 925 { 926 for (i = 0; i < sbrDec->bufWriteOffs; i++) /* sbrDec->bufWriteOffs set to 6 and unchanged */ 927 { 928 j = sbrDec->noCols + i; /* sbrDec->noCols set to 32 and unchanged */ 929 930 931 pv_memmove(hFrameData->codecQmfBufferImag[i], 932 hFrameData->codecQmfBufferImag[j], 933 sizeof(*hFrameData->codecQmfBufferImag[i]) << 5); 934 935 } 936 937 pv_memmove(&hFrameData->HistsbrQmfBufferImag[0], 938 &hFrameData->sbrQmfBufferImag[32*SBR_NUM_BANDS], 939 6*SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferImag)); 940 } 941 #endif 942 943 944 #ifdef HQ_SBR 945 #ifdef PARAMETRICSTEREO 946 } 947 #endif 948 #endif 949 950 951 hFrameData->reset_flag = 0; 952 if (applyProcessing) 953 { 954 sbrDec->prevLowSubband = sbrDec->lowSubband; 955 } 956 957 } 958 959 960 #endif /* AAC_PLUS */ 961