transform.c revision b676a05348e4c516fa8b57e33b10548e6142c3f8
1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*
2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc.
3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License");
5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License.
6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at
7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **     http://www.apache.org/licenses/LICENSE-2.0
9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software
11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS,
12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and
14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License.
15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */
16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*******************************************************************************
17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	File:		transform.c
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Content:	MDCT Transform functionss
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
21956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*******************************************************************************/
22956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h"
24956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "psy_const.h"
25956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "transform.h"
26956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "aac_rom.h"
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define LS_TRANS ((FRAME_LEN_LONG-FRAME_LEN_SHORT)/2) /* 448 */
30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define SQRT1_2 0x5a82799a	/* sqrt(1/2) in Q31 */
31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define swap2(p0,p1) \
32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	t = p0; t1 = *(&(p0)+1);	\
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	p0 = p1; *(&(p0)+1) = *(&(p1)+1);	\
34b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	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**********************************************************************************/
42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void Shuffle(int *buf, int num, const unsigned char* bitTab)
43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    int *part0, *part1;
45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int i, j;
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int t, t1;
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	part0 = buf;
49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    part1 = buf + num;
50b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	while ((i = *bitTab++) != 0) {
52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        j = *bitTab++;
53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
54b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        swap2(part0[4*i+0], part0[4*j+0]);
55b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        swap2(part0[4*i+2], part1[4*j+0]);
56b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        swap2(part1[4*i+0], part0[4*j+2]);
57b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        swap2(part1[4*i+2], part1[4*j+2]);
58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    }
59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    do {
61b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        swap2(part0[4*i+2], part1[4*i+0]);
62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    } while ((i = *bitTab++) != 0);
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#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*
72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**********************************************************************************/
73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void Radix4First(int *buf, int num)
74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard    int r0, r1, r2, r3;
76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int r4, r5, r6, r7;
77b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
78b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	for (; num != 0; num--)
79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r0 = buf[0] + buf[2];
81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r1 = buf[1] + buf[3];
82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r2 = buf[0] - buf[2];
83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r3 = buf[1] - buf[3];
84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r4 = buf[4] + buf[6];
85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r5 = buf[5] + buf[7];
86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r6 = buf[4] - buf[6];
87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r7 = buf[5] - buf[7];
88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[0] = r0 + r4;
90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[1] = r1 + r5;
91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[4] = r0 - r4;
92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[5] = r1 - r5;
93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[2] = r2 + r7;
94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[3] = r3 - r6;
95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[6] = r2 - r7;
96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[7] = r3 + r6;
97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf += 8;
99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
102956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
103956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
104956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Radix8First
105956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  Radix 8 point prepared function for fft
106956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**********************************************************************************/
108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void Radix8First(int *buf, int num)
109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard   int r0, r1, r2, r3;
111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard   int i0, i1, i2, i3;
112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard   int r4, r5, r6, r7;
113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard   int i4, i5, i6, i7;
114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard   int t0, t1, t2, t3;
115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
116b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	for ( ; num != 0; num--)
117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r0 = buf[0] + buf[2];
119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		i0 = buf[1] + buf[3];
120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r1 = buf[0] - buf[2];
121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		i1 = buf[1] - buf[3];
122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r2 = buf[4] + buf[6];
123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		i2 = buf[5] + buf[7];
124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r3 = buf[4] - buf[6];
125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		i3 = buf[5] - buf[7];
126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r4 = (r0 + r2) >> 1;
128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		i4 = (i0 + i2) >> 1;
129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r5 = (r0 - r2) >> 1;
130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		i5 = (i0 - i2) >> 1;
131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r6 = (r1 - i3) >> 1;
132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		i6 = (i1 + r3) >> 1;
133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r7 = (r1 + i3) >> 1;
134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		i7 = (i1 - r3) >> 1;
135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r0 = buf[ 8] + buf[10];
137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		i0 = buf[ 9] + buf[11];
138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r1 = buf[ 8] - buf[10];
139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		i1 = buf[ 9] - buf[11];
140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r2 = buf[12] + buf[14];
141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		i2 = buf[13] + buf[15];
142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r3 = buf[12] - buf[14];
143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		i3 = buf[13] - buf[15];
144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t0 = (r0 + r2) >> 1;
146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t1 = (i0 + i2) >> 1;
147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t2 = (r0 - r2) >> 1;
148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t3 = (i0 - i2) >> 1;
149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[ 0] = r4 + t0;
151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[ 1] = i4 + t1;
152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[ 8] = r4 - t0;
153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[ 9] = i4 - t1;
154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[ 4] = r5 + t3;
155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[ 5] = i5 - t2;
156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[12] = r5 - t3;
157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[13] = i5 + t2;
158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r0 = r1 - i3;
160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		i0 = i1 + r3;
161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		r2 = r1 + i3;
162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		i2 = i1 - r3;
163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t0 = MULHIGH(SQRT1_2, r0 - i0);
165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t1 = MULHIGH(SQRT1_2, r0 + i0);
166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t2 = MULHIGH(SQRT1_2, r2 - i2);
167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t3 = MULHIGH(SQRT1_2, r2 + i2);
168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[ 6] = r6 - t0;
170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[ 7] = i6 - t1;
171e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[14] = r6 + t0;
172e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[15] = i6 + t1;
173e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[ 2] = r7 + t3;
174e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[ 3] = i7 - t2;
175e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[10] = r7 - t3;
176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf[11] = i7 + t2;
177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		buf += 16;
179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
181e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
182956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
183956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
184956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Radix4FFT
185956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  Radix 4 point fft core function
186956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**********************************************************************************/
188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void Radix4FFT(int *buf, int num, int bgn, int *twidTab)
189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int r0, r1, r2, r3;
191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int r4, r5, r6, r7;
192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int t0, t1;
193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int sinx, cosx;
194e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int i, j, step;
195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int *xptr, *csptr;
196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
197b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	for (num >>= 2; num != 0; num >>= 2)
198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		step = 2*bgn;
200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		xptr = buf;
201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
202b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    	for (i = num; i != 0; i--)
203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
204e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			csptr = twidTab;
205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
206b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			for (j = bgn; j != 0; j--)
207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
208e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				r0 = xptr[0];
209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				r1 = xptr[1];
210e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				xptr += step;
211b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
212e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				t0 = xptr[0];
213b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard				t1 = xptr[1];
214e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				cosx = csptr[0];
215e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				sinx = csptr[1];
216e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				r2 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1);		/* cos*br + sin*bi */
217e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				r3 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0);		/* cos*bi - sin*br */
218e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				xptr += step;
219e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
220e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				t0 = r0 >> 2;
221e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				t1 = r1 >> 2;
222e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				r0 = t0 - r2;
223e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				r1 = t1 - r3;
224e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				r2 = t0 + r2;
225e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				r3 = t1 + r3;
226b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
227e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				t0 = xptr[0];
228e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				t1 = xptr[1];
229e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				cosx = csptr[2];
230e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				sinx = csptr[3];
231e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				r4 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1);		/* cos*cr + sin*ci */
232e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				r5 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0);		/* cos*ci - sin*cr */
233e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				xptr += step;
234b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
235e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				t0 = xptr[0];
236e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				t1 = xptr[1];
237e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				cosx = csptr[4];
238e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				sinx = csptr[5];
239e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				r6 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1);		/* cos*cr + sin*ci */
240e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				r7 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0);		/* cos*ci - sin*cr */
241e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				csptr += 6;
242e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
243e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				t0 = r4;
244e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				t1 = r5;
245e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				r4 = t0 + r6;
246e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				r5 = r7 - t1;
247e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				r6 = t0 - r6;
248e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				r7 = r7 + t1;
249e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				xptr[0] = r0 + r5;
251e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				xptr[1] = r1 + r6;
252e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				xptr -= step;
253e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
254e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				xptr[0] = r2 - r4;
255e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				xptr[1] = r3 - r7;
256e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				xptr -= step;
257e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
258e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				xptr[0] = r0 - r5;
259e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				xptr[1] = r1 - r6;
260e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				xptr -= step;
261e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
262e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				xptr[0] = r2 + r4;
263e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				xptr[1] = r3 + r7;
264e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				xptr += 2;
265e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
266e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			xptr += 3*step;
267e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
268e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		twidTab += 3*step;
269e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		bgn <<= 2;
270e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
271e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
272e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
273956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*********************************************************************************
274956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
275956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: PreMDCT
276956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  prepare MDCT process for next FFT compute
277956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
278e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**********************************************************************************/
279e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void PreMDCT(int *buf0, int num, const int *csptr)
280e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
281e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int i;
282e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int tr1, ti1, tr2, ti2;
283e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int cosa, sina, cosb, sinb;
284e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int *buf1;
285b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
286e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	buf1 = buf0 + num - 1;
287e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
288e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for(i = num >> 2; i != 0; i--)
289e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
290b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		cosa = *csptr++;
291b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		sina = *csptr++;
292b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		cosb = *csptr++;
293b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		sinb = *csptr++;
294e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
295e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		tr1 = *(buf0 + 0);
296e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		ti2 = *(buf0 + 1);
297e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		tr2 = *(buf1 - 1);
298e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		ti1 = *(buf1 + 0);
299b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
300e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		*buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);
301b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		*buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1);
302b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
303b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		*buf1-- = MULHIGH(cosb, ti2) - MULHIGH(sinb, tr2);
304e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		*buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);
305e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
306e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
307e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
308956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*********************************************************************************
309956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
310956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: PostMDCT
311956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:   post MDCT process after next FFT for MDCT
312956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
313e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**********************************************************************************/
314e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void PostMDCT(int *buf0, int num, const int *csptr)
315e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
316e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int i;
317e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int tr1, ti1, tr2, ti2;
318e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int cosa, sina, cosb, sinb;
319e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int *buf1;
320e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
321e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	buf1 = buf0 + num - 1;
322b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
323e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for(i = num >> 2; i != 0; i--)
324e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
325b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		cosa = *csptr++;
326b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		sina = *csptr++;
327b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		cosb = *csptr++;
328e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		sinb = *csptr++;
329e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
330e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		tr1 = *(buf0 + 0);
331e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		ti1 = *(buf0 + 1);
332e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		ti2 = *(buf1 + 0);
333e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		tr2 = *(buf1 - 1);
334e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
335e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		*buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);
336b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		*buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1);
337b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
338e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		*buf0++ = MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2);
339b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		*buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);
340e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
341e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
342e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
343e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
344e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
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*
350e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**********************************************************************************/
351e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Mdct_Long(int *buf)
352e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
353e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	PreMDCT(buf, 1024, cossintab + 128);
354e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
355e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Shuffle(buf, 512, bitrevTab + 17);
356b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Radix8First(buf, 512 >> 3);
357e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Radix4FFT(buf, 512 >> 3, 8, (int *)twidTab512);
358e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
359b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	PostMDCT(buf, 1024, cossintab + 128);
360e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
361e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
362e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
363956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/**********************************************************************************
364956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
365956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Mdct_Short
366b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard* description:  the short block mdct
367956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
368e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**********************************************************************************/
369e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Mdct_Short(int *buf)
370e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
371e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	PreMDCT(buf, 128, cossintab);
372e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
373e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Shuffle(buf, 64, bitrevTab);
374b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Radix4First(buf, 64 >> 2);
375b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Radix4FFT(buf, 64 >> 2, 4, (int *)twidTab64);
376e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
377b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	PostMDCT(buf, 128, cossintab);
378e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
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,
385b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard*  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)
412b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	{
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	}
422e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
423e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
424e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
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*
431e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**********************************************************************************/
432e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic Word16 getScalefactorOfShortVectorStride(const Word16 *vector, /*!< Pointer to input vector */
433e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard												Word16 len,           /*!< Length of input vector */
434e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard												Word16 stride)        /*!< Stride of input vector */
435e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
436e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 maxVal = 0;
437e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 absVal;
438e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 i;
439e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
440e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for(i=0; i<len; i++){
441e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		absVal = abs_s(vector[i*stride]);
442e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		maxVal |= absVal;
443e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
444e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
445e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return( maxVal ? norm_s(maxVal) : 15);
446e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
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;
467e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 *dctIn0, *dctIn1;
468e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word32 *outData0, *outData1;
469956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 *winPtr;
470956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
471956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 delayBufferSf,timeSignalSf,minSf;
472956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 headRoom=0;
473b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
474956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	switch(blockType){
475b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
476b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
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);
486b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
487956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn0 = mdctDelayBuffer;
488956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
489956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		outData0 = realOut + FRAME_LEN_LONG/2;
490b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
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++){
494b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			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		}
502b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
503956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
504b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
505956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* add windows and pre add for mdct to new buffer*/
506956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn0 = mdctDelayBuffer;
507956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
508b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		outData0 = realOut + FRAME_LEN_LONG/2 - 1;
509956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		winPtr = (int *)LongWindowKBD;
510b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		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 */
517b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			*outData0-- = -((ws1 >> 2) + (ws2 >> 2));
518956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
519956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
520e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Mdct_Long(realOut);
521e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* update scale factor */
522956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = 14 - minSf;
523b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		*mdctScale=minSf;
524956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		break;
525b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
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;
536b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		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 ++;
546e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			*outData0++ = (ws1 >> 2) - (ws2 >> 2);  /* shift 2 to avoid overflow next */
547956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
548b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
549956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
550b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
551b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		outData0 = realOut + FRAME_LEN_LONG/2 - 1;
552956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		for(i=0;i<LS_TRANS;i++){
553b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			*outData0-- = -mdctDelayBuffer[i] << (15 - 2 + minSf);
554956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
555b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
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;
559b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		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++;
567e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			*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;
575b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
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);
583b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		minSf = min(delayBufferSf,timeSignalSf);
584956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = min(minSf,13);
585b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
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++){
589b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			*outData0++ = -(*dctIn1--) << (15 - 2 + minSf);
590956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
591b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
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;
595b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		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++;
603e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			*outData0++ = (ws1 >> 2) - (ws2 >> 2);  /* shift 2 to avoid overflow next */
604956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
605b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
606956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
607b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
608956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* add windows and pre add for mdct to new buffer*/
609956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn0 = mdctDelayBuffer;
610956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
611b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		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);
618e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			*outData0-- =  -((ws1 >> 2) + (ws2 >> 2));  /* shift 2 to avoid overflow next */
619e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			winPtr++;
620956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
621b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
622956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		Mdct_Long(realOut);
623956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = 14 - minSf;
624956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*mdctScale= minSf; /* update scale factor */
625956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		break;
626b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
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
631b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		*/
632956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+TRANSFORM_OFFSET_SHORT,9*FRAME_LEN_SHORT,1);
633956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = min(minSf,10);
634b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
635b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
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;
639b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			outData0 = realOut + FRAME_LEN_SHORT/2;
640b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			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);
648e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				*outData0++ = (ws1 >> 2) - (ws2 >> 2);  /* shift 2 to avoid overflow next */
649b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
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);
654e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				*outData1-- =  -((ws1 >> 2) + (ws2 >> 2));  /* shift 2 to avoid overflow next */
655e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
656e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				winPtr++;
657e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				dctIn0++;
658e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				dctIn1--;
659956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			}
660956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
661956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			Mdct_Short(realOut);
662956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			realOut += FRAME_LEN_SHORT;
663956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
664b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
665956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = 11 - minSf;
666956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*mdctScale = minSf; /* update scale factor */
667b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
668956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
669956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		break;
670956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
671956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
672956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
673