transform.c revision 956c553ab0ce72f8074ad0fda2ffd66a0305700c
1956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*
2956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** Copyright 2003-2010, VisualOn, Inc.
3956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong **
4956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** Licensed under the Apache License, Version 2.0 (the "License");
5956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** you may not use this file except in compliance with the License.
6956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** You may obtain a copy of the License at
7956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong **
8956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong **     http://www.apache.org/licenses/LICENSE-2.0
9956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong **
10956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** Unless required by applicable law or agreed to in writing, software
11956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** distributed under the License is distributed on an "AS IS" BASIS,
12956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** See the License for the specific language governing permissions and
14956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** limitations under the License.
15956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong */
16956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*******************************************************************************
17956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	File:		transform.c
18956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
19956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Content:	MDCT Transform functionss
20956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
21956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*******************************************************************************/
22956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
23956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "basic_op.h"
24956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "psy_const.h"
25956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "transform.h"
26956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "aac_rom.h"
27956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
28956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
29956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define LS_TRANS ((FRAME_LEN_LONG-FRAME_LEN_SHORT)/2) /* 448 */
30956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define SQRT1_2 0x5a82799a	/* sqrt(1/2) in Q31 */
31956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#define swap2(p0,p1) \
32956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	t = p0; t1 = *(&(p0)+1);	\
33956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	p0 = p1; *(&(p0)+1) = *(&(p1)+1);	\
34956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	p1 = t; *(&(p1)+1) = t1
35956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
36956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*********************************************************************************
37956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
38956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Shuffle
39956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  Shuffle points prepared function for fft
40956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
41956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/
42956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void Shuffle(int *buf, int num, const unsigned char* bitTab)
43956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
44956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    int *part0, *part1;
45956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	int i, j;
46956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	int t, t1;
47956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
48956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	part0 = buf;
49956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    part1 = buf + num;
50956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
51956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	while ((i = *bitTab++) != 0) {
52956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        j = *bitTab++;
53956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
54956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        swap2(part0[4*i+0], part0[4*j+0]);
55956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        swap2(part0[4*i+2], part1[4*j+0]);
56956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        swap2(part1[4*i+0], part0[4*j+2]);
57956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        swap2(part1[4*i+2], part1[4*j+2]);
58956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
59956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
60956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    do {
61956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        swap2(part0[4*i+2], part1[4*i+0]);
62956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    } while ((i = *bitTab++) != 0);
63956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
64956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
65956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#if !defined(ARMV5E) && !defined(ARMV7Neon)
66956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
67956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
68956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
69956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Radix4First
70956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  Radix 4 point prepared function for fft
71956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
72956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/
73956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void Radix4First(int *buf, int num)
74956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
75956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    int r0, r1, r2, r3;
76956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	int r4, r5, r6, r7;
77956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
78956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	for (; num != 0; num--)
79956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	{
80956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r0 = buf[0] + buf[2];
81956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r1 = buf[1] + buf[3];
82956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r2 = buf[0] - buf[2];
83956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r3 = buf[1] - buf[3];
84956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r4 = buf[4] + buf[6];
85956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r5 = buf[5] + buf[7];
86956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r6 = buf[4] - buf[6];
87956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r7 = buf[5] - buf[7];
88956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
89956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[0] = r0 + r4;
90956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[1] = r1 + r5;
91956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[4] = r0 - r4;
92956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[5] = r1 - r5;
93956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[2] = r2 + r7;
94956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[3] = r3 - r6;
95956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[6] = r2 - r7;
96956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[7] = r3 + r6;
97956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
98956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf += 8;
99956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
100956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
101956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
102956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
103956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
104956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Radix8First
105956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  Radix 8 point prepared function for fft
106956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
107956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/
108956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void Radix8First(int *buf, int num)
109956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
110956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong   int r0, r1, r2, r3;
111956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong   int i0, i1, i2, i3;
112956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong   int r4, r5, r6, r7;
113956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong   int i4, i5, i6, i7;
114956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong   int t0, t1, t2, t3;
115956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
116956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	for ( ; num != 0; num--)
117956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	{
118956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r0 = buf[0] + buf[2];
119956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		i0 = buf[1] + buf[3];
120956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r1 = buf[0] - buf[2];
121956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		i1 = buf[1] - buf[3];
122956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r2 = buf[4] + buf[6];
123956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		i2 = buf[5] + buf[7];
124956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r3 = buf[4] - buf[6];
125956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		i3 = buf[5] - buf[7];
126956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
127956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r4 = (r0 + r2) >> 1;
128956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		i4 = (i0 + i2) >> 1;
129956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r5 = (r0 - r2) >> 1;
130956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		i5 = (i0 - i2) >> 1;
131956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r6 = (r1 - i3) >> 1;
132956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		i6 = (i1 + r3) >> 1;
133956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r7 = (r1 + i3) >> 1;
134956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		i7 = (i1 - r3) >> 1;
135956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
136956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r0 = buf[ 8] + buf[10];
137956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		i0 = buf[ 9] + buf[11];
138956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r1 = buf[ 8] - buf[10];
139956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		i1 = buf[ 9] - buf[11];
140956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r2 = buf[12] + buf[14];
141956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		i2 = buf[13] + buf[15];
142956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r3 = buf[12] - buf[14];
143956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		i3 = buf[13] - buf[15];
144956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
145956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		t0 = (r0 + r2) >> 1;
146956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		t1 = (i0 + i2) >> 1;
147956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		t2 = (r0 - r2) >> 1;
148956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		t3 = (i0 - i2) >> 1;
149956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
150956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[ 0] = r4 + t0;
151956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[ 1] = i4 + t1;
152956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[ 8] = r4 - t0;
153956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[ 9] = i4 - t1;
154956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[ 4] = r5 + t3;
155956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[ 5] = i5 - t2;
156956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[12] = r5 - t3;
157956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[13] = i5 + t2;
158956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
159956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r0 = r1 - i3;
160956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		i0 = i1 + r3;
161956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		r2 = r1 + i3;
162956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		i2 = i1 - r3;
163956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
164956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		t0 = MULHIGH(SQRT1_2, r0 - i0);
165956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		t1 = MULHIGH(SQRT1_2, r0 + i0);
166956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		t2 = MULHIGH(SQRT1_2, r2 - i2);
167956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		t3 = MULHIGH(SQRT1_2, r2 + i2);
168956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
169956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[ 6] = r6 - t0;
170956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[ 7] = i6 - t1;
171956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[14] = r6 + t0;
172956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[15] = i6 + t1;
173956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[ 2] = r7 + t3;
174956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[ 3] = i7 - t2;
175956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[10] = r7 - t3;
176956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf[11] = i7 + t2;
177956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
178956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		buf += 16;
179956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
180956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
181956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
182956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
183956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
184956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Radix4FFT
185956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  Radix 4 point fft core function
186956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
187956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/
188956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void Radix4FFT(int *buf, int num, int bgn, int *twidTab)
189956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
190956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	int r0, r1, r2, r3;
191956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	int r4, r5, r6, r7;
192956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	int t0, t1;
193956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	int sinx, cosx;
194956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	int i, j, step;
195956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	int *xptr, *csptr;
196956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
197956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	for (num >>= 2; num != 0; num >>= 2)
198956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	{
199956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		step = 2*bgn;
200956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		xptr = buf;
201956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
202956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    	for (i = num; i != 0; i--)
203956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		{
204956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			csptr = twidTab;
205956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
206956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			for (j = bgn; j != 0; j--)
207956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			{
208956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				r0 = xptr[0];
209956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				r1 = xptr[1];
210956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				xptr += step;
211956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
212956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				t0 = xptr[0];
213956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				t1 = xptr[1];
214956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				cosx = csptr[0];
215956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				sinx = csptr[1];
216956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				r2 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1);		/* cos*br + sin*bi */
217956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				r3 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0);		/* cos*bi - sin*br */
218956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				xptr += step;
219956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
220956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				t0 = r0 >> 2;
221956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				t1 = r1 >> 2;
222956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				r0 = t0 - r2;
223956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				r1 = t1 - r3;
224956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				r2 = t0 + r2;
225956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				r3 = t1 + r3;
226956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
227956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				t0 = xptr[0];
228956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				t1 = xptr[1];
229956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				cosx = csptr[2];
230956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				sinx = csptr[3];
231956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				r4 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1);		/* cos*cr + sin*ci */
232956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				r5 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0);		/* cos*ci - sin*cr */
233956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				xptr += step;
234956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
235956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				t0 = xptr[0];
236956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				t1 = xptr[1];
237956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				cosx = csptr[4];
238956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				sinx = csptr[5];
239956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				r6 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1);		/* cos*cr + sin*ci */
240956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				r7 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0);		/* cos*ci - sin*cr */
241956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				csptr += 6;
242956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
243956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				t0 = r4;
244956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				t1 = r5;
245956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				r4 = t0 + r6;
246956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				r5 = r7 - t1;
247956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				r6 = t0 - r6;
248956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				r7 = r7 + t1;
249956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
250956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				xptr[0] = r0 + r5;
251956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				xptr[1] = r1 + r6;
252956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				xptr -= step;
253956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
254956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				xptr[0] = r2 - r4;
255956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				xptr[1] = r3 - r7;
256956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				xptr -= step;
257956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
258956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				xptr[0] = r0 - r5;
259956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				xptr[1] = r1 - r6;
260956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				xptr -= step;
261956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
262956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				xptr[0] = r2 + r4;
263956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				xptr[1] = r3 + r7;
264956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				xptr += 2;
265956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			}
266956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			xptr += 3*step;
267956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
268956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		twidTab += 3*step;
269956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		bgn <<= 2;
270956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
271956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
272956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
273956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*********************************************************************************
274956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
275956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: PreMDCT
276956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  prepare MDCT process for next FFT compute
277956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
278956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/
279956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void PreMDCT(int *buf0, int num, const int *csptr)
280956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
281956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	int i;
282956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	int tr1, ti1, tr2, ti2;
283956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	int cosa, sina, cosb, sinb;
284956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	int *buf1;
285956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
286956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	buf1 = buf0 + num - 1;
287956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
288956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	for(i = num >> 2; i != 0; i--)
289956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	{
290956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		cosa = *csptr++;
291956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		sina = *csptr++;
292956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		cosb = *csptr++;
293956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		sinb = *csptr++;
294956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
295956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		tr1 = *(buf0 + 0);
296956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		ti2 = *(buf0 + 1);
297956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		tr2 = *(buf1 - 1);
298956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		ti1 = *(buf1 + 0);
299956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
300956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);
301956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1);
302956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
303956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*buf1-- = MULHIGH(cosb, ti2) - MULHIGH(sinb, tr2);
304956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);
305956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
306956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
307956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
308956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*********************************************************************************
309956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
310956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: PostMDCT
311956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:   post MDCT process after next FFT for MDCT
312956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
313956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/
314956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void PostMDCT(int *buf0, int num, const int *csptr)
315956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
316956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	int i;
317956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	int tr1, ti1, tr2, ti2;
318956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	int cosa, sina, cosb, sinb;
319956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	int *buf1;
320956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
321956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	buf1 = buf0 + num - 1;
322956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
323956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	for(i = num >> 2; i != 0; i--)
324956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	{
325956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		cosa = *csptr++;
326956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		sina = *csptr++;
327956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		cosb = *csptr++;
328956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		sinb = *csptr++;
329956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
330956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		tr1 = *(buf0 + 0);
331956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		ti1 = *(buf0 + 1);
332956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		ti2 = *(buf1 + 0);
333956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		tr2 = *(buf1 - 1);
334956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
335956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);
336956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1);
337956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
338956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*buf0++ = MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2);
339956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);
340956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
341956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
342956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#endif
343956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
344956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
345956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/**********************************************************************************
346956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
347956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Mdct_Long
348956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  the long block mdct, include long_start block, end_long block
349956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
350956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/
351956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongvoid Mdct_Long(int *buf)
352956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
353956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	PreMDCT(buf, 1024, cossintab + 128);
354956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
355956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Shuffle(buf, 512, bitrevTab + 17);
356956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Radix8First(buf, 512 >> 3);
357956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Radix4FFT(buf, 512 >> 3, 8, (int *)twidTab512);
358956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
359956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	PostMDCT(buf, 1024, cossintab + 128);
360956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
361956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
362956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
363956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/**********************************************************************************
364956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
365956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Mdct_Short
366956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  the short block mdct
367956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
368956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/
369956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongvoid Mdct_Short(int *buf)
370956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
371956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	PreMDCT(buf, 128, cossintab);
372956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
373956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Shuffle(buf, 64, bitrevTab);
374956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Radix4First(buf, 64 >> 2);
375956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Radix4FFT(buf, 64 >> 2, 4, (int *)twidTab64);
376956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
377956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	PostMDCT(buf, 128, cossintab);
378956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
379956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
380956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
381956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
382956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
383956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: shiftMdctDelayBuffer
384956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:    the mdct delay buffer has a size of 1600,
385956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*  so the calculation of LONG,STOP must be  spilt in two
386956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*  passes with 1024 samples and a mid shift,
387956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*  the SHORT transforms can be completed in the delay buffer,
388956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*  and afterwards a shift
389956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
390956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/
391956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void shiftMdctDelayBuffer(Word16 *mdctDelayBuffer, /*! start of mdct delay buffer */
392956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong								 Word16 *timeSignal,      /*! pointer to new time signal samples, interleaved */
393956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong								 Word16 chIncrement       /*! number of channels */
394956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong								 )
395956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
396956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 i;
397956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word16 *srBuf = mdctDelayBuffer;
398956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word16 *dsBuf = mdctDelayBuffer+FRAME_LEN_LONG;
399956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
400956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	for(i = 0; i < BLOCK_SWITCHING_OFFSET-FRAME_LEN_LONG; i+= 8)
401956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	{
402956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf++;	 *srBuf++ = *dsBuf++;
403956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf++;	 *srBuf++ = *dsBuf++;
404956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf++;	 *srBuf++ = *dsBuf++;
405956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf++;	 *srBuf++ = *dsBuf++;
406956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
407956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
408956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	srBuf = mdctDelayBuffer + BLOCK_SWITCHING_OFFSET-FRAME_LEN_LONG;
409956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	dsBuf = timeSignal;
410956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
411956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	for(i=0; i<FRAME_LEN_LONG; i+=8)
412956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	{
413956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf; dsBuf += chIncrement;
414956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf; dsBuf += chIncrement;
415956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf; dsBuf += chIncrement;
416956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf; dsBuf += chIncrement;
417956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf; dsBuf += chIncrement;
418956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf; dsBuf += chIncrement;
419956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf; dsBuf += chIncrement;
420956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf; dsBuf += chIncrement;
421956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
422956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
423956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
424956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
425956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
426956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
427956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: getScalefactorOfShortVectorStride
428956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  Calculate max possible scale factor for input vector of shorts
429956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* returns:      Maximum scale factor
430956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
431956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/
432956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic Word16 getScalefactorOfShortVectorStride(const Word16 *vector, /*!< Pointer to input vector */
433956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong												Word16 len,           /*!< Length of input vector */
434956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong												Word16 stride)        /*!< Stride of input vector */
435956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
436956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word16 maxVal = 0;
437956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word16 absVal;
438956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word16 i;
439956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
440956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	for(i=0; i<len; i++){
441956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		absVal = abs_s(vector[i*stride]);
442956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		maxVal |= absVal;
443956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
444956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
445956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	return( maxVal ? norm_s(maxVal) : 15);
446956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
447956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
448956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
449956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
450956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
451956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Transform_Real
452956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  Calculate transform filter for input vector of shorts
453956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* returns:      TRUE if success
454956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
455956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/
456956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongvoid Transform_Real(Word16 *mdctDelayBuffer,
457956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    Word16 *timeSignal,
458956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    Word16 chIncrement,
459956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    Word32 *realOut,
460956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    Word16 *mdctScale,
461956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    Word16 blockType
462956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    )
463956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
464956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 i,w;
465956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 timeSignalSample;
466956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 ws1,ws2;
467956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word16 *dctIn0, *dctIn1;
468956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 *outData0, *outData1;
469956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 *winPtr;
470956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
471956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 delayBufferSf,timeSignalSf,minSf;
472956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 headRoom=0;
473956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
474956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	switch(blockType){
475956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
476956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
477956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	case LONG_WINDOW:
478956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/*
479956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + 448 new timeSignal samples
480956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		and get the biggest scale factor for next calculate more precise
481956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*/
482956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		delayBufferSf = getScalefactorOfShortVectorStride(mdctDelayBuffer,BLOCK_SWITCHING_OFFSET,1);
483956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		timeSignalSf  = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement);
484956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = min(delayBufferSf,timeSignalSf);
485956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = min(minSf,14);
486956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
487956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn0 = mdctDelayBuffer;
488956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
489956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		outData0 = realOut + FRAME_LEN_LONG/2;
490956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
491956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* add windows and pre add for mdct to last buffer*/
492956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		winPtr = (int *)LongWindowKBD;
493956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		for(i=0;i<FRAME_LEN_LONG/2;i++){
494956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample = (*dctIn0++) << minSf;
495956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws1 = timeSignalSample * (*winPtr >> 16);
496956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample = (*dctIn1--) << minSf;
497956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws2 = timeSignalSample * (*winPtr & 0xffff);
498956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			winPtr ++;
499956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			/* shift 2 to avoid overflow next */
500956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			*outData0++ = (ws1 >> 2) - (ws2 >> 2);
501956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
502956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
503956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
504956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
505956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* add windows and pre add for mdct to new buffer*/
506956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn0 = mdctDelayBuffer;
507956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
508956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		outData0 = realOut + FRAME_LEN_LONG/2 - 1;
509956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		winPtr = (int *)LongWindowKBD;
510956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		for(i=0;i<FRAME_LEN_LONG/2;i++){
511956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample = (*dctIn0++) << minSf;
512956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws1 = timeSignalSample * (*winPtr & 0xffff);
513956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample = (*dctIn1--) << minSf;
514956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws2 = timeSignalSample * (*winPtr >> 16);
515956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			winPtr++;
516956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			/* shift 2 to avoid overflow next */
517956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			*outData0-- = -((ws1 >> 2) + (ws2 >> 2));
518956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
519956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
520956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		Mdct_Long(realOut);
521956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* update scale factor */
522956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = 14 - minSf;
523956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*mdctScale=minSf;
524956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		break;
525956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
526956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	case START_WINDOW:
527956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/*
528956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no timeSignal samples
529956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		and get the biggest scale factor for next calculate more precise
530956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*/
531956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = getScalefactorOfShortVectorStride(mdctDelayBuffer,BLOCK_SWITCHING_OFFSET,1);
532956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = min(minSf,14);
533956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
534956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn0 = mdctDelayBuffer;
535956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
536956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		outData0 = realOut + FRAME_LEN_LONG/2;
537956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		winPtr = (int *)LongWindowKBD;
538956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
539956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* add windows and pre add for mdct to last buffer*/
540956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		for(i=0;i<FRAME_LEN_LONG/2;i++){
541956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample = (*dctIn0++) << minSf;
542956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws1 = timeSignalSample * (*winPtr >> 16);
543956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample = (*dctIn1--) << minSf;
544956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws2 = timeSignalSample * (*winPtr & 0xffff);
545956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			winPtr ++;
546956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			*outData0++ = (ws1 >> 2) - (ws2 >> 2);  /* shift 2 to avoid overflow next */
547956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
548956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
549956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
550956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
551956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		outData0 = realOut + FRAME_LEN_LONG/2 - 1;
552956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		for(i=0;i<LS_TRANS;i++){
553956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			*outData0-- = -mdctDelayBuffer[i] << (15 - 2 + minSf);
554956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
555956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
556956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* add windows and pre add for mdct to new buffer*/
557956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn0 = mdctDelayBuffer + LS_TRANS;
558956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1 - LS_TRANS;
559956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		outData0 = realOut + FRAME_LEN_LONG/2 - 1 -LS_TRANS;
560956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		winPtr = (int *)ShortWindowSine;
561956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		for(i=0;i<FRAME_LEN_SHORT/2;i++){
562956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample= (*dctIn0++) << minSf;
563956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws1 = timeSignalSample * (*winPtr & 0xffff);
564956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample= (*dctIn1--) << minSf;
565956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws2 = timeSignalSample * (*winPtr >> 16);
566956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			winPtr++;
567956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			*outData0-- =  -((ws1 >> 2) + (ws2 >> 2));  /* shift 2 to avoid overflow next */
568956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
569956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
570956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		Mdct_Long(realOut);
571956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* update scale factor */
572956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = 14 - minSf;
573956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*mdctScale= minSf;
574956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		break;
575956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
576956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	case STOP_WINDOW:
577956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/*
578956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		we access BLOCK_SWITCHING_OFFSET-LS_TRANS (1600-448 ) delay buffer samples + 448 new timeSignal samples
579956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		and get the biggest scale factor for next calculate more precise
580956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*/
581956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		delayBufferSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+LS_TRANS,BLOCK_SWITCHING_OFFSET-LS_TRANS,1);
582956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		timeSignalSf  = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement);
583956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = min(delayBufferSf,timeSignalSf);
584956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = min(minSf,13);
585956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
586956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		outData0 = realOut + FRAME_LEN_LONG/2;
587956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
588956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		for(i=0;i<LS_TRANS;i++){
589956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			*outData0++ = -(*dctIn1--) << (15 - 2 + minSf);
590956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
591956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
592956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* add windows and pre add for mdct to last buffer*/
593956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn0 = mdctDelayBuffer + LS_TRANS;
594956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1 - LS_TRANS;
595956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		outData0 = realOut + FRAME_LEN_LONG/2 + LS_TRANS;
596956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		winPtr = (int *)ShortWindowSine;
597956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		for(i=0;i<FRAME_LEN_SHORT/2;i++){
598956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample = (*dctIn0++) << minSf;
599956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws1 = timeSignalSample * (*winPtr >> 16);
600956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample= (*dctIn1--) << minSf;
601956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws2 = timeSignalSample * (*winPtr & 0xffff);
602956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			winPtr++;
603956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			*outData0++ = (ws1 >> 2) - (ws2 >> 2);  /* shift 2 to avoid overflow next */
604956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
605956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
606956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
607956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
608956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* add windows and pre add for mdct to new buffer*/
609956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn0 = mdctDelayBuffer;
610956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
611956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		outData0 = realOut + FRAME_LEN_LONG/2 - 1;
612956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		winPtr = (int *)LongWindowKBD;
613956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		for(i=0;i<FRAME_LEN_LONG/2;i++){
614956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample= (*dctIn0++) << minSf;
615956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws1 = timeSignalSample *(*winPtr & 0xffff);
616956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample= (*dctIn1--) << minSf;
617956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws2 = timeSignalSample * (*winPtr >> 16);
618956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			*outData0-- =  -((ws1 >> 2) + (ws2 >> 2));  /* shift 2 to avoid overflow next */
619956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			winPtr++;
620956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
621956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
622956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		Mdct_Long(realOut);
623956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = 14 - minSf;
624956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*mdctScale= minSf; /* update scale factor */
625956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		break;
626956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
627956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	case SHORT_WINDOW:
628956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/*
629956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no new timeSignal samples
630956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		and get the biggest scale factor for next calculate more precise
631956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*/
632956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+TRANSFORM_OFFSET_SHORT,9*FRAME_LEN_SHORT,1);
633956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = min(minSf,10);
634956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
635956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
636956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		for(w=0;w<TRANS_FAC;w++){
637956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			dctIn0 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT;
638956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			dctIn1 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT + FRAME_LEN_SHORT-1;
639956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			outData0 = realOut + FRAME_LEN_SHORT/2;
640956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			outData1 = realOut + FRAME_LEN_SHORT/2 - 1;
641956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
642956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			winPtr = (int *)ShortWindowSine;
643956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			for(i=0;i<FRAME_LEN_SHORT/2;i++){
644956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				timeSignalSample= *dctIn0 << minSf;
645956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				ws1 = timeSignalSample * (*winPtr >> 16);
646956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				timeSignalSample= *dctIn1 << minSf;
647956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				ws2 = timeSignalSample * (*winPtr & 0xffff);
648956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				*outData0++ = (ws1 >> 2) - (ws2 >> 2);  /* shift 2 to avoid overflow next */
649956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
650956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				timeSignalSample= *(dctIn0 + FRAME_LEN_SHORT) << minSf;
651956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				ws1 = timeSignalSample * (*winPtr & 0xffff);
652956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				timeSignalSample= *(dctIn1 + FRAME_LEN_SHORT) << minSf;
653956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				ws2 = timeSignalSample * (*winPtr >> 16);
654956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				*outData1-- =  -((ws1 >> 2) + (ws2 >> 2));  /* shift 2 to avoid overflow next */
655956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
656956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				winPtr++;
657956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				dctIn0++;
658956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				dctIn1--;
659956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			}
660956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
661956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			Mdct_Short(realOut);
662956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			realOut += FRAME_LEN_SHORT;
663956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
664956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
665956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = 11 - minSf;
666956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*mdctScale = minSf; /* update scale factor */
667956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
668956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
669956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		break;
670956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
671956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
672956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
673