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}
3428a3b3707a6e320ba75f4ecd47fdc001f16c15cb8Martin Storsjo#else
3438a3b3707a6e320ba75f4ecd47fdc001f16c15cb8Martin Storsjovoid Radix4First(int *buf, int num);
3448a3b3707a6e320ba75f4ecd47fdc001f16c15cb8Martin Storsjovoid Radix8First(int *buf, int num);
3458a3b3707a6e320ba75f4ecd47fdc001f16c15cb8Martin Storsjovoid Radix4FFT(int *buf, int num, int bgn, int *twidTab);
3468a3b3707a6e320ba75f4ecd47fdc001f16c15cb8Martin Storsjovoid PreMDCT(int *buf0, int num, const int *csptr);
3478a3b3707a6e320ba75f4ecd47fdc001f16c15cb8Martin Storsjovoid PostMDCT(int *buf0, int num, const int *csptr);
348e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
349e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
350e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
351956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/**********************************************************************************
352956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
353956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Mdct_Long
354956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  the long block mdct, include long_start block, end_long block
355956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
356e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**********************************************************************************/
357e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Mdct_Long(int *buf)
358e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
359e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	PreMDCT(buf, 1024, cossintab + 128);
360e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
361e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Shuffle(buf, 512, bitrevTab + 17);
362b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Radix8First(buf, 512 >> 3);
363e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Radix4FFT(buf, 512 >> 3, 8, (int *)twidTab512);
364e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
365b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	PostMDCT(buf, 1024, cossintab + 128);
366e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
367e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
368e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
369956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/**********************************************************************************
370956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
371956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Mdct_Short
372b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard* description:  the short block mdct
373956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
374e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**********************************************************************************/
375e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Mdct_Short(int *buf)
376e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
377e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	PreMDCT(buf, 128, cossintab);
378e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
379e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Shuffle(buf, 64, bitrevTab);
380b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Radix4First(buf, 64 >> 2);
381b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Radix4FFT(buf, 64 >> 2, 4, (int *)twidTab64);
382e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
383b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	PostMDCT(buf, 128, cossintab);
384e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
385956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
386956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
387956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
388956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
389956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: shiftMdctDelayBuffer
390956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:    the mdct delay buffer has a size of 1600,
391b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard*  so the calculation of LONG,STOP must be  spilt in two
392956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*  passes with 1024 samples and a mid shift,
393956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*  the SHORT transforms can be completed in the delay buffer,
394956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*  and afterwards a shift
395956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
396956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/
397956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic void shiftMdctDelayBuffer(Word16 *mdctDelayBuffer, /*! start of mdct delay buffer */
398956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong								 Word16 *timeSignal,      /*! pointer to new time signal samples, interleaved */
399956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong								 Word16 chIncrement       /*! number of channels */
400956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong								 )
401956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
402956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 i;
403956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word16 *srBuf = mdctDelayBuffer;
404956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word16 *dsBuf = mdctDelayBuffer+FRAME_LEN_LONG;
405956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
406956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	for(i = 0; i < BLOCK_SWITCHING_OFFSET-FRAME_LEN_LONG; i+= 8)
407956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	{
408956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf++;	 *srBuf++ = *dsBuf++;
409956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf++;	 *srBuf++ = *dsBuf++;
410956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf++;	 *srBuf++ = *dsBuf++;
411956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf++;	 *srBuf++ = *dsBuf++;
412956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
413956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
414956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	srBuf = mdctDelayBuffer + BLOCK_SWITCHING_OFFSET-FRAME_LEN_LONG;
415956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	dsBuf = timeSignal;
416956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
417956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	for(i=0; i<FRAME_LEN_LONG; i+=8)
418b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	{
419956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf; dsBuf += chIncrement;
420956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf; dsBuf += chIncrement;
421956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf; dsBuf += chIncrement;
422956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf; dsBuf += chIncrement;
423956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf; dsBuf += chIncrement;
424956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf; dsBuf += chIncrement;
425956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf; dsBuf += chIncrement;
426956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*srBuf++ = *dsBuf; dsBuf += chIncrement;
427956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
428e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
429e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
430e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
431956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
432956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
433956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: getScalefactorOfShortVectorStride
434956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  Calculate max possible scale factor for input vector of shorts
435956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* returns:      Maximum scale factor
436956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
437e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**********************************************************************************/
438e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic Word16 getScalefactorOfShortVectorStride(const Word16 *vector, /*!< Pointer to input vector */
439e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard												Word16 len,           /*!< Length of input vector */
440e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard												Word16 stride)        /*!< Stride of input vector */
441e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
442e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 maxVal = 0;
443e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 absVal;
444e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 i;
445e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
446e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for(i=0; i<len; i++){
447e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		absVal = abs_s(vector[i*stride]);
448e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		maxVal |= absVal;
449e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
450e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
451e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return( maxVal ? norm_s(maxVal) : 15);
452e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
453956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
454956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
455956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
456956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
457956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: Transform_Real
458956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  Calculate transform filter for input vector of shorts
459956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* returns:      TRUE if success
460956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
461956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/
462956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongvoid Transform_Real(Word16 *mdctDelayBuffer,
463956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    Word16 *timeSignal,
464956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    Word16 chIncrement,
465956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    Word32 *realOut,
466956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    Word16 *mdctScale,
467956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    Word16 blockType
468956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    )
469956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
470956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 i,w;
471956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 timeSignalSample;
472956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 ws1,ws2;
473e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 *dctIn0, *dctIn1;
474e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word32 *outData0, *outData1;
475956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 *winPtr;
476956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
477956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 delayBufferSf,timeSignalSf,minSf;
478956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	Word32 headRoom=0;
479b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
480956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	switch(blockType){
481b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
482b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
483956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	case LONG_WINDOW:
484956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/*
485956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + 448 new timeSignal samples
486956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		and get the biggest scale factor for next calculate more precise
487956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*/
488956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		delayBufferSf = getScalefactorOfShortVectorStride(mdctDelayBuffer,BLOCK_SWITCHING_OFFSET,1);
489956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		timeSignalSf  = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement);
490956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = min(delayBufferSf,timeSignalSf);
491956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = min(minSf,14);
492b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
493956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn0 = mdctDelayBuffer;
494956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
495956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		outData0 = realOut + FRAME_LEN_LONG/2;
496b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
497956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* add windows and pre add for mdct to last buffer*/
498956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		winPtr = (int *)LongWindowKBD;
499956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		for(i=0;i<FRAME_LEN_LONG/2;i++){
500b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			timeSignalSample = (*dctIn0++) << minSf;
501956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws1 = timeSignalSample * (*winPtr >> 16);
502956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample = (*dctIn1--) << minSf;
503956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws2 = timeSignalSample * (*winPtr & 0xffff);
504956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			winPtr ++;
505956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			/* shift 2 to avoid overflow next */
506956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			*outData0++ = (ws1 >> 2) - (ws2 >> 2);
507956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
508b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
509956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
510b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
511956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* add windows and pre add for mdct to new buffer*/
512956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn0 = mdctDelayBuffer;
513956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
514b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		outData0 = realOut + FRAME_LEN_LONG/2 - 1;
515956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		winPtr = (int *)LongWindowKBD;
516b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		for(i=0;i<FRAME_LEN_LONG/2;i++){
517956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample = (*dctIn0++) << minSf;
518956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws1 = timeSignalSample * (*winPtr & 0xffff);
519956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample = (*dctIn1--) << minSf;
520956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws2 = timeSignalSample * (*winPtr >> 16);
521956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			winPtr++;
522956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			/* shift 2 to avoid overflow next */
523b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			*outData0-- = -((ws1 >> 2) + (ws2 >> 2));
524956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
525956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
526e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Mdct_Long(realOut);
527e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* update scale factor */
528956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = 14 - minSf;
529b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		*mdctScale=minSf;
530956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		break;
531b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
532956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	case START_WINDOW:
533956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/*
534956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no timeSignal samples
535956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		and get the biggest scale factor for next calculate more precise
536956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*/
537956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = getScalefactorOfShortVectorStride(mdctDelayBuffer,BLOCK_SWITCHING_OFFSET,1);
538956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = min(minSf,14);
539956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
540956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn0 = mdctDelayBuffer;
541956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
542b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		outData0 = realOut + FRAME_LEN_LONG/2;
543956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		winPtr = (int *)LongWindowKBD;
544956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
545956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* add windows and pre add for mdct to last buffer*/
546956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		for(i=0;i<FRAME_LEN_LONG/2;i++){
547956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample = (*dctIn0++) << minSf;
548956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws1 = timeSignalSample * (*winPtr >> 16);
549956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample = (*dctIn1--) << minSf;
550956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws2 = timeSignalSample * (*winPtr & 0xffff);
551956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			winPtr ++;
552e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			*outData0++ = (ws1 >> 2) - (ws2 >> 2);  /* shift 2 to avoid overflow next */
553956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
554b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
555956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
556b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
557b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		outData0 = realOut + FRAME_LEN_LONG/2 - 1;
558956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		for(i=0;i<LS_TRANS;i++){
559b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			*outData0-- = -mdctDelayBuffer[i] << (15 - 2 + minSf);
560956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
561b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
562956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* add windows and pre add for mdct to new buffer*/
563956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn0 = mdctDelayBuffer + LS_TRANS;
564956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1 - LS_TRANS;
565b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		outData0 = realOut + FRAME_LEN_LONG/2 - 1 -LS_TRANS;
566956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		winPtr = (int *)ShortWindowSine;
567956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		for(i=0;i<FRAME_LEN_SHORT/2;i++){
568956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample= (*dctIn0++) << minSf;
569956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws1 = timeSignalSample * (*winPtr & 0xffff);
570956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample= (*dctIn1--) << minSf;
571956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws2 = timeSignalSample * (*winPtr >> 16);
572956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			winPtr++;
573e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			*outData0-- =  -((ws1 >> 2) + (ws2 >> 2));  /* shift 2 to avoid overflow next */
574956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
575956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
576956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		Mdct_Long(realOut);
577956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* update scale factor */
578956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = 14 - minSf;
579956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*mdctScale= minSf;
580956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		break;
581b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
582956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	case STOP_WINDOW:
583956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/*
584956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		we access BLOCK_SWITCHING_OFFSET-LS_TRANS (1600-448 ) delay buffer samples + 448 new timeSignal samples
585956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		and get the biggest scale factor for next calculate more precise
586956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*/
587956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		delayBufferSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+LS_TRANS,BLOCK_SWITCHING_OFFSET-LS_TRANS,1);
588956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		timeSignalSf  = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement);
589b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		minSf = min(delayBufferSf,timeSignalSf);
590956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = min(minSf,13);
591b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
592956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		outData0 = realOut + FRAME_LEN_LONG/2;
593956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
594956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		for(i=0;i<LS_TRANS;i++){
595b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			*outData0++ = -(*dctIn1--) << (15 - 2 + minSf);
596956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
597b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
598956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* add windows and pre add for mdct to last buffer*/
599956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn0 = mdctDelayBuffer + LS_TRANS;
600956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1 - LS_TRANS;
601b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		outData0 = realOut + FRAME_LEN_LONG/2 + LS_TRANS;
602956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		winPtr = (int *)ShortWindowSine;
603956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		for(i=0;i<FRAME_LEN_SHORT/2;i++){
604956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample = (*dctIn0++) << minSf;
605956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws1 = timeSignalSample * (*winPtr >> 16);
606956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample= (*dctIn1--) << minSf;
607956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws2 = timeSignalSample * (*winPtr & 0xffff);
608956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			winPtr++;
609e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			*outData0++ = (ws1 >> 2) - (ws2 >> 2);  /* shift 2 to avoid overflow next */
610956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
611b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
612956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
613b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
614956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* add windows and pre add for mdct to new buffer*/
615956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn0 = mdctDelayBuffer;
616956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
617b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		outData0 = realOut + FRAME_LEN_LONG/2 - 1;
618956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		winPtr = (int *)LongWindowKBD;
619956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		for(i=0;i<FRAME_LEN_LONG/2;i++){
620956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample= (*dctIn0++) << minSf;
621956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws1 = timeSignalSample *(*winPtr & 0xffff);
622956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			timeSignalSample= (*dctIn1--) << minSf;
623956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			ws2 = timeSignalSample * (*winPtr >> 16);
624e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			*outData0-- =  -((ws1 >> 2) + (ws2 >> 2));  /* shift 2 to avoid overflow next */
625e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			winPtr++;
626956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
627b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
628956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		Mdct_Long(realOut);
629956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = 14 - minSf;
630956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*mdctScale= minSf; /* update scale factor */
631956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		break;
632b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
633956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	case SHORT_WINDOW:
634956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/*
635956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no new timeSignal samples
636956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		and get the biggest scale factor for next calculate more precise
637b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		*/
638956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+TRANSFORM_OFFSET_SHORT,9*FRAME_LEN_SHORT,1);
639956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = min(minSf,10);
640b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
641b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
642956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		for(w=0;w<TRANS_FAC;w++){
643956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			dctIn0 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT;
644956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			dctIn1 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT + FRAME_LEN_SHORT-1;
645b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			outData0 = realOut + FRAME_LEN_SHORT/2;
646b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			outData1 = realOut + FRAME_LEN_SHORT/2 - 1;
647956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
648956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			winPtr = (int *)ShortWindowSine;
649956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			for(i=0;i<FRAME_LEN_SHORT/2;i++){
650956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				timeSignalSample= *dctIn0 << minSf;
651956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				ws1 = timeSignalSample * (*winPtr >> 16);
652956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				timeSignalSample= *dctIn1 << minSf;
653956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				ws2 = timeSignalSample * (*winPtr & 0xffff);
654e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				*outData0++ = (ws1 >> 2) - (ws2 >> 2);  /* shift 2 to avoid overflow next */
655b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
656956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				timeSignalSample= *(dctIn0 + FRAME_LEN_SHORT) << minSf;
657956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				ws1 = timeSignalSample * (*winPtr & 0xffff);
658956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				timeSignalSample= *(dctIn1 + FRAME_LEN_SHORT) << minSf;
659956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong				ws2 = timeSignalSample * (*winPtr >> 16);
660e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				*outData1-- =  -((ws1 >> 2) + (ws2 >> 2));  /* shift 2 to avoid overflow next */
661e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
662e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				winPtr++;
663e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				dctIn0++;
664e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				dctIn1--;
665956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			}
666956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
667956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			Mdct_Short(realOut);
668956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			realOut += FRAME_LEN_SHORT;
669956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		}
670b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
671956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		minSf = 11 - minSf;
672956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*mdctScale = minSf; /* update scale factor */
673b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
674956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
675956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		break;
676956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
677956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
678956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
679