Home | History | Annotate | Download | only in aacdec
      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   Filename: calc_sbr_synfilterbank.c
     21 
     22 
     23 ------------------------------------------------------------------------------
     24  REVISION HISTORY
     25 
     26 
     27  Who:                                   Date: MM/DD/YYYY
     28  Description:
     29 
     30 ------------------------------------------------------------------------------
     31  INPUT AND OUTPUT DEFINITIONS
     32 
     33 
     34 
     35 ------------------------------------------------------------------------------
     36  FUNCTION DESCRIPTION
     37 
     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 #ifdef AAC_PLUS
     82 
     83 /*----------------------------------------------------------------------------
     84 ; INCLUDES
     85 ----------------------------------------------------------------------------*/
     86 #include    "calc_sbr_synfilterbank.h"
     87 #include    "qmf_filterbank_coeff.h"
     88 #include    "synthesis_sub_band.h"
     89 #include    "fxp_mul32.h"
     90 #include    "aac_mem_funcs.h"
     91 
     92 /*----------------------------------------------------------------------------
     93 ; MACROS
     94 ; Define module specific macros here
     95 ----------------------------------------------------------------------------*/
     96 
     97 
     98 /*----------------------------------------------------------------------------
     99 ; DEFINES
    100 ; Include all pre-processor statements here. Include conditional
    101 ; compile variables also.
    102 ----------------------------------------------------------------------------*/
    103 
    104 
    105 #if defined (PV_ARM_V5)
    106 
    107 
    108 __inline Int16 sat(Int32 y)
    109 {
    110     Int32 x;
    111     __asm
    112     {
    113         qdadd y, y, y
    114         mov y, y, asr #16
    115     }
    116 
    117     return((Int16)y);
    118 }
    119 
    120 #define saturate2( a, b, c, d)      *c = sat( a);   \
    121                                     *d = sat( b);   \
    122                                     c += 2;         \
    123                                     d -= 2;
    124 
    125 
    126 #elif defined (PV_ARM_V4)
    127 
    128 
    129 __inline Int16 sat(Int32 y)
    130 {
    131     Int32 x;
    132     Int32 z = 31; /* rvct compiler problem */
    133     __asm
    134     {
    135         sub y, y, y, asr 2
    136         mov y, y, asr N
    137         mov x, y, asr #15
    138         teq x, y, asr z
    139         eorne  y, INT16_MAX, y, asr #31
    140     }
    141 
    142     return((Int16)y);
    143 }
    144 
    145 #define saturate2( a, b, c, d)      *c = sat( a);   \
    146                                     *d = sat( b);   \
    147                                     c += 2;         \
    148                                     d -= 2;
    149 
    150 #elif defined(PV_ARM_GCC_V5)
    151 
    152 __inline Int16 sat(Int32 y)
    153 {
    154     register Int32 x;
    155     register Int32 ra = y;
    156 
    157 
    158     asm volatile(
    159         "qdadd %0, %1, %1\n\t"
    160         "mov %0, %0, asr #16"
    161     : "=&r*i"(x)
    162                 : "r"(ra));
    163 
    164     return ((Int16)x);
    165 }
    166 
    167 
    168 #define saturate2( a, b, c, d)      *c = sat( a);   \
    169                                     *d = sat( b);   \
    170                                     c += 2;         \
    171                                     d -= 2;
    172 
    173 
    174 #elif defined(PV_ARM_MSC_EVC_V5)
    175 
    176 #include "armintr.h"
    177 
    178 #define saturate2( a, b, c, d)      *c = _DAddSatInt( a, a)>>16;   \
    179                                     *d = _DAddSatInt( b, b)>>16;   \
    180                                     c += 2;         \
    181                                     d -= 2;
    182 
    183 #else
    184 
    185 
    186 #define   saturate2( a, b, c, d)    a -= (a>>2);                             \
    187                                     a  = (a>>N);                     \
    188                                     if((a>>15) != (a>>31))                   \
    189                                     {                                        \
    190                                         a = ((a >> 31) ^ INT16_MAX); \
    191                                     }                                        \
    192                                     *c = (Int16)a;                           \
    193                                     c += 2;                                  \
    194                                     b -= (b>>2);                             \
    195                                     b =  (b>>N);                      \
    196                                     if((b>>15) != (b>>31))                   \
    197                                     {                                        \
    198                                         b = ((b >> 31) ^ INT16_MAX); \
    199                                     }                                        \
    200                                     *d = (Int16)b;                           \
    201                                     d -= 2;
    202 
    203 
    204 #endif
    205 
    206 /*----------------------------------------------------------------------------
    207 ; LOCAL FUNCTION DEFINITIONS
    208 ; Function Prototype declaration
    209 ----------------------------------------------------------------------------*/
    210 
    211 
    212 /*----------------------------------------------------------------------------
    213 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    214 ; Variable declaration - defined here and used outside this module
    215 ----------------------------------------------------------------------------*/
    216 
    217 
    218 
    219 
    220 /*----------------------------------------------------------------------------
    221 ; EXTERNAL FUNCTION REFERENCES
    222 ; Declare functions defined elsewhere and referenced in this module
    223 ----------------------------------------------------------------------------*/
    224 
    225 /*----------------------------------------------------------------------------
    226 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    227 ; Declare variables used in this module but defined elsewhere
    228 ----------------------------------------------------------------------------*/
    229 
    230 /*----------------------------------------------------------------------------
    231 ; FUNCTION CODE
    232 ----------------------------------------------------------------------------*/
    233 
    234 void calc_sbr_synfilterbank_LC(Int32 * Sr,
    235                                Int16 * timeSig,
    236                                Int16   V[1280],
    237                                bool bDownSampleSBR)
    238 {
    239     Int32 i;
    240 
    241     Int32   realAccu1;
    242     Int32   realAccu2;
    243     const Int32 *pt_C2;
    244 
    245     Int16 *pt_V1;
    246     Int16 *pt_V2;
    247 
    248 
    249     Int16 *pt_timeSig;
    250 
    251     Int16 *pt_timeSig_2;
    252     Int32  test1;
    253     Int16  tmp1;
    254     Int16  tmp2;
    255 
    256     /* shift filterstates */
    257 
    258     Int32 * pt_Sr = Sr;
    259 
    260 
    261     if (bDownSampleSBR == false)
    262     {
    263 
    264         synthesis_sub_band_LC(pt_Sr, V);
    265 
    266         /* content of V[] is at most 16 bits */
    267 
    268         pt_timeSig   = &timeSig[0];
    269         pt_timeSig_2 = &timeSig[64];
    270 
    271 
    272         tmp1 = V[ 704];
    273         tmp2 = V[ 768];
    274         realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(0.853738560F), ROUND_SYNFIL);
    275         realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.361158990F), realAccu1);
    276         tmp1 = -V[ 512];
    277         tmp2 =  V[ 960];
    278         realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.361158990F), realAccu1);
    279         realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(0.070353307F), realAccu1);
    280         tmp1 =  V[ 448];
    281         tmp2 =  V[1024];
    282         realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(0.070353307F), realAccu1);
    283         realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.013271822F), realAccu1);
    284         tmp1 =  -V[ 256];
    285         tmp2 =   V[ 192];
    286         realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.013271822F), realAccu1);
    287         realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(0.002620176F), realAccu1);
    288         realAccu1 =  fxp_mac_16_by_16(V[1216], Qfmt(0.002620176F), realAccu1);
    289 
    290         tmp1 = V[  32];
    291         tmp2 = V[1248];
    292         realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.000665042F), ROUND_SYNFIL);
    293         realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.000665042F), realAccu2);
    294         tmp1 = V[ 224];
    295         tmp2 = V[1056];
    296         realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(0.005271576F), realAccu2);
    297         realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(0.005271576F), realAccu2);
    298         tmp1 = V[ 992];
    299         tmp2 = V[ 288];
    300         realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(0.058591568F), realAccu2);
    301         realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(0.058591568F), realAccu2);
    302         tmp1 = V[ 480];
    303         tmp2 = V[ 800];
    304         realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.058370533F), realAccu2);
    305         realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.058370533F), realAccu2);
    306         tmp1 = V[ 736];
    307         tmp2 = V[ 544];
    308         realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(0.702238872F), realAccu2);
    309         realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(0.702238872F), realAccu2);
    310 
    311 
    312 
    313         saturate2(realAccu1, realAccu2, pt_timeSig, pt_timeSig_2);
    314 
    315         pt_timeSig_2 = &timeSig[126];
    316 
    317         pt_V1 = &V[1];
    318         pt_V2 = &V[1279];
    319 
    320         pt_C2 = &sbrDecoderFilterbankCoefficients[0];
    321 
    322         for (i = 31; i != 0; i--)
    323         {
    324             test1 = *(pt_C2++);
    325             tmp1 = *(pt_V1++);
    326             tmp2 = *(pt_V2--);
    327             realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, ROUND_SYNFIL);
    328             realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, ROUND_SYNFIL);
    329             tmp1 = pt_V1[  191];
    330             tmp2 = pt_V2[ -191];
    331             realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
    332             realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
    333 
    334             test1 = *(pt_C2++);
    335             tmp1 = pt_V1[  255];
    336             tmp2 = pt_V2[ -255];
    337             realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
    338             realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
    339             tmp1 = pt_V1[  447];
    340             tmp2 = pt_V2[ -447];
    341             realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
    342             realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
    343 
    344             test1 = *(pt_C2++);
    345             tmp1 = pt_V1[  511];
    346             tmp2 = pt_V2[ -511];
    347             realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
    348             realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
    349             tmp1 = pt_V1[  703];
    350             tmp2 = pt_V2[ -703];
    351             realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
    352             realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
    353 
    354             test1 = *(pt_C2++);
    355             tmp1 = pt_V1[  767];
    356             tmp2 = pt_V2[ -767];
    357             realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
    358             realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
    359             tmp1 = pt_V1[  959];
    360             tmp2 = pt_V2[ -959];
    361             realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
    362             realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
    363 
    364             test1 = *(pt_C2++);
    365             tmp1 = pt_V1[  1023];
    366             tmp2 = pt_V2[ -1023];
    367             realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
    368             realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
    369             tmp1 = pt_V1[  1215];
    370             tmp2 = pt_V2[ -1215];
    371             realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
    372             realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
    373 
    374             saturate2(realAccu1, realAccu2, pt_timeSig, pt_timeSig_2);
    375 
    376         }
    377     }
    378     else
    379     {
    380 
    381         synthesis_sub_band_LC_down_sampled(Sr, V);
    382 
    383         /*
    384          *    window signal
    385          *    calculate output samples
    386          */
    387 
    388 
    389         pt_V1 = &V[0];
    390         pt_V2 = &V[96];
    391 
    392 
    393         Int32 * pt_out = Sr;
    394 
    395         for (i = 0; i < 8; i++)
    396         {
    397             *(pt_out++) = 0;
    398             *(pt_out++) = 0;
    399             *(pt_out++) = 0;
    400             *(pt_out++) = 0;
    401         }
    402 
    403         const Int32* pt_C1 = &sbrDecoderFilterbankCoefficients_down_smpl[0];
    404         pt_C2 = &sbrDecoderFilterbankCoefficients_down_smpl[16];
    405 
    406         for (int k = 0; k < 5; k++)
    407         {
    408             pt_out -= 32;
    409             for (i = 0; i < 16; i++)
    410             {
    411                 realAccu1   = fxp_mul_16_by_16bt(*(pt_V1++), *(pt_C1));
    412                 realAccu2   = fxp_mul_16_by_16bb(*(pt_V1++), *(pt_C1++));
    413                 realAccu1   = fxp_mac_16_by_16_bt(*(pt_V2++), *(pt_C2), realAccu1);
    414                 realAccu2   = fxp_mac_16_by_16_bb(*(pt_V2++), *(pt_C2++), realAccu2);
    415                 *(pt_out++) += realAccu1 >> 5;
    416                 *(pt_out++) += realAccu2 >> 5;
    417 
    418             }
    419             pt_V1 += 96;
    420             pt_V2 += 96;
    421             pt_C1 += 16;
    422             pt_C2 += 16;
    423         }
    424         pt_out -= 32;
    425 
    426         for (i = 0; i < 32; i++)
    427         {
    428             timeSig[2*i] = (Int16)((*(pt_out++) + 512) >> 10);
    429         }
    430 
    431     }
    432 
    433 }
    434 
    435 
    436 
    437 #ifdef HQ_SBR
    438 
    439 void calc_sbr_synfilterbank(Int32 * Sr,
    440                             Int32 * Si,
    441                             Int16 * timeSig,
    442                             Int16   V[1280],
    443                             bool bDownSampleSBR)
    444 {
    445     Int32 i;
    446 
    447     const Int32 *pt_C2;
    448 
    449     Int32   realAccu1;
    450     Int32   realAccu2;
    451 
    452     Int16 *pt_V1;
    453     Int16 *pt_V2;
    454 
    455     Int16 *pt_timeSig;
    456 
    457     Int16 *pt_timeSig_2;
    458     Int32  test1;
    459     Int16  tmp1;
    460     Int16  tmp2;
    461 
    462 
    463     if (bDownSampleSBR == false)
    464     {
    465         synthesis_sub_band(Sr, Si, V);
    466 
    467         /* content of V[] is at most 16 bits */
    468         pt_timeSig   = &timeSig[0];
    469         pt_timeSig_2 = &timeSig[64];
    470 
    471         tmp1 = V[ 704];
    472         tmp2 = V[ 768];
    473         realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(0.853738560F), ROUND_SYNFIL);
    474         realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.361158990F), realAccu1);
    475         tmp1 = -V[ 512];
    476         tmp2 =  V[ 960];
    477         realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.361158990F), realAccu1);
    478         realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(0.070353307F), realAccu1);
    479         tmp1 =  V[ 448];
    480         tmp2 =  V[1024];
    481         realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(0.070353307F), realAccu1);
    482         realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.013271822F), realAccu1);
    483         tmp1 =  -V[ 256];
    484         tmp2 =   V[ 192];
    485         realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.013271822F), realAccu1);
    486         realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(0.002620176F), realAccu1);
    487         realAccu1 =  fxp_mac_16_by_16(V[1216], Qfmt(0.002620176F), realAccu1);
    488 
    489         tmp1 = V[  32];
    490         tmp2 = V[1248];
    491         realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.000665042F), ROUND_SYNFIL);
    492         realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.000665042F), realAccu2);
    493         tmp1 = V[ 224];
    494         tmp2 = V[1056];
    495         realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(0.005271576F), realAccu2);
    496         realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(0.005271576F), realAccu2);
    497         tmp1 = V[ 992];
    498         tmp2 = V[ 288];
    499         realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(0.058591568F), realAccu2);
    500         realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(0.058591568F), realAccu2);
    501         tmp1 = V[ 480];
    502         tmp2 = V[ 800];
    503         realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.058370533F), realAccu2);
    504         realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.058370533F), realAccu2);
    505         tmp1 = V[ 736];
    506         tmp2 = V[ 544];
    507         realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(0.702238872F), realAccu2);
    508         realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(0.702238872F), realAccu2);
    509 
    510 
    511         saturate2(realAccu1, realAccu2, pt_timeSig, pt_timeSig_2);
    512 
    513         pt_timeSig_2 = &timeSig[126];
    514 
    515         pt_V1 = &V[1];
    516         pt_V2 = &V[1279];
    517 
    518         pt_C2 = &sbrDecoderFilterbankCoefficients[0];
    519 
    520         for (i = 31; i != 0; i--)
    521         {
    522             test1 = *(pt_C2++);
    523             tmp1 = *(pt_V1++);
    524             tmp2 = *(pt_V2--);
    525             realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, ROUND_SYNFIL);
    526             realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, ROUND_SYNFIL);
    527             tmp1 = pt_V1[  191];
    528             tmp2 = pt_V2[ -191];
    529             realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
    530             realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
    531 
    532             test1 = *(pt_C2++);
    533             tmp1 = pt_V1[  255];
    534             tmp2 = pt_V2[ -255];
    535             realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
    536             realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
    537             tmp1 = pt_V1[  447];
    538             tmp2 = pt_V2[ -447];
    539             realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
    540             realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
    541 
    542             test1 = *(pt_C2++);
    543             tmp1 = pt_V1[  511];
    544             tmp2 = pt_V2[ -511];
    545             realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
    546             realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
    547             tmp1 = pt_V1[  703];
    548             tmp2 = pt_V2[ -703];
    549             realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
    550             realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
    551 
    552             test1 = *(pt_C2++);
    553             tmp1 = pt_V1[  767];
    554             tmp2 = pt_V2[ -767];
    555             realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
    556             realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
    557             tmp1 = pt_V1[  959];
    558             tmp2 = pt_V2[ -959];
    559             realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
    560             realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
    561 
    562             test1 = *(pt_C2++);
    563             tmp1 = pt_V1[  1023];
    564             tmp2 = pt_V2[ -1023];
    565             realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
    566             realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
    567             tmp1 = pt_V1[  1215];
    568             tmp2 = pt_V2[ -1215];
    569             realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
    570             realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
    571 
    572             saturate2(realAccu1, realAccu2, pt_timeSig, pt_timeSig_2);
    573         }
    574 
    575     }
    576     else
    577     {
    578 
    579         synthesis_sub_band_down_sampled(Sr,  Si,  V);
    580 
    581 
    582         Int32 * pt_out = Sr;
    583 
    584         for (i = 0; i < 8; i++)
    585         {
    586             *(pt_out++) = 0;
    587             *(pt_out++) = 0;
    588             *(pt_out++) = 0;
    589             *(pt_out++) = 0;
    590         }
    591 
    592 
    593         /*
    594          *    window signal
    595          *    calculate output samples
    596          */
    597 
    598         pt_V1 = &V[0];
    599         pt_V2 = &V[96];
    600 
    601 
    602         const Int32* pt_C1 = &sbrDecoderFilterbankCoefficients_down_smpl[0];
    603         pt_C2 = &sbrDecoderFilterbankCoefficients_down_smpl[16];
    604 
    605         for (Int k = 0; k < 5; k++)
    606         {
    607             pt_out -= 32;
    608             for (i = 0; i < 16; i++)
    609             {
    610                 realAccu1   = fxp_mul_16_by_16bt(*(pt_V1++), *(pt_C1));
    611                 realAccu2   = fxp_mul_16_by_16bb(*(pt_V1++), *(pt_C1++));
    612                 realAccu1   = fxp_mac_16_by_16_bt(*(pt_V2++), *(pt_C2), realAccu1);
    613                 realAccu2   = fxp_mac_16_by_16_bb(*(pt_V2++), *(pt_C2++), realAccu2);
    614                 *(pt_out++) += realAccu1 >> 5;
    615                 *(pt_out++) += realAccu2 >> 5;
    616             }
    617             pt_V1 += 96;
    618             pt_V2 += 96;
    619             pt_C1 += 16;
    620             pt_C2 += 16;
    621         }
    622         pt_out -= 32;
    623 
    624         for (i = 0; i < 32; i++)
    625         {
    626             timeSig[2*i] = (Int16)((*(pt_out++) + 512) >> 10);
    627         }
    628 
    629     }
    630 }
    631 
    632 
    633 #endif      /* --- HQ_SBR --- */
    634 
    635 
    636 #endif      /* --- AAC_PLUS --- */
    637 
    638 
    639 
    640