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
46SC 29 Software Copyright Licencing Disclaimer:
47
48This software module was originally developed by
49  Coding Technologies
50
51and edited by
52  -
53
54in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
55standards for reference purposes and its performance may not have been
56optimized. This software module is an implementation of one or more tools as
57specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
58ISO/IEC gives users free license to this software module or modifications
59thereof for use in products claiming conformance to audiovisual and
60image-coding related ITU Recommendations and/or ISO/IEC International
61Standards. ISO/IEC gives users the same free license to this software module or
62modifications thereof for research purposes and further ISO/IEC standardisation.
63Those intending to use this software module in products are advised that its
64use may infringe existing patents. ISO/IEC have no liability for use of this
65software module or modifications thereof. Copyright is not released for
66products that do not conform to audiovisual and image-coding related ITU
67Recommendations and/or ISO/IEC International Standards.
68The original developer retains full right to modify and use the code for its
69own purpose, assign or donate the code to a third party and to inhibit third
70parties from using the code for products that do not conform to audiovisual and
71image-coding related ITU Recommendations and/or ISO/IEC International Standards.
72This copyright notice must be included in all copies or derivative works.
73Copyright (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
234void 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
439void 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