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