1dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* ------------------------------------------------------------------
2dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
4dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * you may not use this file except in compliance with the License.
6dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * You may obtain a copy of the License at
7dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
8dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
10dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Unless required by applicable law or agreed to in writing, software
11dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * express or implied.
14dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * See the License for the specific language governing permissions
15dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and limitations under the License.
16dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * -------------------------------------------------------------------
17dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
18dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
19dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
20dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pathname: ./src/esc_iquant_scaling.c
21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Funtions:  esc_iquant_scaling
22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY
25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Modified from esc_iquant_fxp.c code
27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Eliminated unused variables to avoid warnings, changed header
29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who:                                   Date:
31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs:
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    quantSpec[] = array of quantized compressed spectral coefficients, of
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  data type Int and length sfbWidth.
39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    sfbWidth    = number of array elements in quantSpec and the output array
41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  coef, data type Int.
42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    coef[]      = output array of uncompressed coefficients, stored in a
44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  variable Q format, depending on the maximum value found
45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  for the group, array of Int32, length sfbWdith to be
46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  overwritten.
47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    QFormat     = the output Q format for the array coef[].
49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    scale       = scaling factor after separating power of 2 factor out from
52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  0.25*(sfb_scale - 100), i.e., 0.25*sfb_scale.
53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    maxInput    = maximum absolute value of quantSpec.
55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed: None.
57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed:
59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    inverseQuantTable = lookup table of const integer values to the one third
60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                power stored in Q27 format, in file iquant_table.c, const
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                array of UInt32, of size 1025.
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs: None
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified:
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    coef[] contents are overwritten with the uncompressed values from
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    quantSpec[]
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified: None.
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified: None.
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function performs the inverse quantization of the spectral coeficients
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber read from huffman decoding. It takes each input array value to the four
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber thirds power, then scales it according to the scaling factor input argument
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ,and stores the result in the output array in a variable Q format
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber depending upon the maximum input value found.
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function shall not have static or global variables.
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) ISO/IEC 13818-7:1997 Titled "Information technology - Generic coding
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   of moving pictures and associated audio information - Part 7: Advanced
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Audio Coding (AAC)", Section 10.3, "Decoding process", page 43.
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) MPEG-2 NBC Audio Decoder
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   "This software module was originally developed by AT&T, Dolby
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   3. This software module is an implementation of a part of one or more
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   standards free license to this software module or modifications thereof
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for use in hardware or software products claiming conformance to the
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module in hardware or software products are advised that this use may
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   infringe existing patents. The original developer of this software
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module and his/her company, the subsequent editors and their companies,
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   and ISO/IEC have no liability for use of this software module or
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   modifications thereof in an implementation. Copyright is not released
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   developer retains full right to use the code for his/her own purpose,
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   assign or donate the code to a third party and to inhibit third party
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   This copyright notice must be included in all copies or derivative
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   works."
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Copyright(c)1996.
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    maxInput = 0;
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    FOR (i = sfbWidth - 1; i >= 0; i--)
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        x = quantSpec[i];
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        IF ( x >= 0)
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            absX = x;
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ELSE
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            absX = -x;
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ENDIF
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        coef[i] = absX;
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        IF (absX > maxInput)
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            maxInput = absX;
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ENDIF
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ENDFOR
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    IF (maxInput == 0)
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *pQFormat = QTABLE;
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ELSE
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp = inverseQuantTable[(maxInput >> ORDER) + 1];
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp += ((1 << (QTABLE))-1);
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp >>= (QTABLE-1);
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp *= maxInput;
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        binaryDigits = 0;
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        WHILE( temp != 0)
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            temp >>= 1;
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            binaryDigits++;
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        WEND
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        IF (binaryDigits < (SIGNED32BITS - QTABLE))
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            binaryDigits = SIGNED32BITS - QTABLE;
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ENDIF
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *pQFormat = SIGNED32BITS - binaryDigits;
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        shift = QTABLE - *pQFormat;
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        IF (maxInput < TABLESIZE)
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            FOR (i = sfbWidth - 1; i >= 0; i--)
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                x = quantSpec[i];
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                absX = coef[i];
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                tmp_coef = x * (inverseQuantTable[absX] >> shift);
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                b_low  = (tmp_coef & 0xFFFF);
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                b_high = (tmp_coef >> 16);
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                mult_low  = ( (UInt32) b_low * scale );
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                mult_high = ( (Int32) b_high * scale );
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                mult_low >>= 16;
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                coef[i]  = (Int32) (mult_high + mult_low);
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            ENDFOR
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ELSE
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            FOR (i = sfbWidth; i >= 0 ; i--)
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                x    = quantSpec[i];
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                absX = coef[i];
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                IF (absX < TABLESIZE)
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    tmp_coef = x * (inverseQuantTable[absX] >> shift);
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                ELSE
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    index = absX >> ORDER;
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    w1 = inverseQuantTable[index];
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    approxOneThird = (w1 * FACTOR) >> shift;
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    x1 = index * SPACING;
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    w2 = inverseQuantTable[index+1];
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    deltaOneThird = (w2 - w1) * (absX - x1);
202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    deltaOneThird >>= (shift + ORDER - 1);
204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    tmp_coef = x * (approxOneThird + deltaOneThird);
206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                ENDIF
208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                b_low  = (mult_high & 0xFFFF);
210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                b_high = (mult_high >> 16);
211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                mult_low  = ( (UInt32) b_low * scale );
213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                mult_high = ( (Int32) b_high * scale );
214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                mult_low >>= 16;
216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                coef[i]  = (Int32) (mult_high + mult_low);
218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            ENDFOR
220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ENDIF
221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ENDIF
222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    RETURN
224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED
228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   When the code is written for a specific target processor the
229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     the resources used should be documented below.
230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent
232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          stack usage for each subroutine called]
233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [stack usage variable] = stack usage for [subroutine
235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         name] (see [filename].ext)
236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words
238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words
240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable
242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           used to represent cycle count for each subroutine
243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           called]
244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [cycle count variable] = cycle count for [subroutine
246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        name] (see [filename].ext)
247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/
250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES
253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h"
255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "iquant_table.h"
256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "esc_iquant_scaling.h"
257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "aac_mem_funcs.h"         /* For pv_memset                         */
258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "fxp_mul32.h"
260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here
264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Read further on what order is.
273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Note: If ORDER is not a multiple of 3, FACTOR is not an integer.
274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Note: Portions of this function assume ORDER is 3, and so does the table
275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *       in iquant_table.c
276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define ORDER        (3)
278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * For input values > TABLESIZE, multiply by FACTOR to get x ^ (1/3)
280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * FACTOR = 2 ^ (ORDER/3)
281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define FACTOR       (2)
283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * This is one more than the range of expected inputs.
286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define INPUTRANGE   (8192)
288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * SPACING is 2 ^ ORDER, and is the spacing between points when in the
291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * interpolation range.
292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define SPACING      (1<<ORDER)
294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * The actual table size is one more than TABLESIZE, to allow for
297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * interpolation for numbers near 8191
298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define TABLESIZE    (INPUTRANGE/SPACING)
300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Format the table is stored in.
303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define QTABLE       (27)
305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Number of bits for data in a signed 32 bit integer.
308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define SIGNED32BITS  (31)
310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Round up value for intermediate values obtained from the table
313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define ROUND_UP (( ((UInt32) 1) << (QTABLE) )-1)
315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define     MASK_LOW16  0xffff
317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define     UPPER16     16
318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL VARIABLE DEFINITIONS
326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL VARIABLES REFERENCES
336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Processing in this function is performed in these steps:
341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1) Find the overall Q format for the entire group of inputs. This consists
343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *    of:
344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *    a) Finding the maximum input
345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *    b) estimate the maximum output
346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *    c) Using the table, get max ^ (4/3), taking into account the table is
347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *       in q format.
348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 2) For each array element, see if the value is directly inside the table.
349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *    a) If yes, just multiply by table value by itself, then shift as
350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *       appropriate.
351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *    b) If no, get an approximation (described below) for x ^ (1/3) by linearly
352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *       interpolating using lower values in the table, then multiply by a
353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *       correction factor, then multiply by x (see below).
354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * It more accurate to interpolate x ^ (1/3) then x ^ (4/3), so that is stored
356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * in the lookup table. For values not in the table, interpolation is used:
357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *  We want y = x ^ (4/3) = x * (x ^ (1/3))
359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *  Let     x = w * (2 ^ m)  where m is a constant, = ORDER
361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *  then     x ^ (1/3) = w ^ (1/3) * (2 ^ (m/3))
363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *  w is most likely not an integer, so an interpolation with floor(w) and
365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *  ceil(w) can be performed to approximate w ^ (1/3) by getting values out of
366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *  the table. Then to get x ^ (1/3), multiply by FACTOR. If m = 0, 3, 6,
367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *  then FACTOR is a simple power of 2, so a shift can do the job.
368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *  The actual code employs some more tricks to speed things up, and because
370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *  the table is stored in Q format.
371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *  Rather than saving the sign of each input, the unsigned value of
373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *  abs(x) ^ (1/3) is multiplied by the signed input value.
374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if ( defined(_ARM) || defined(_ARM_V4))
379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *  Absolute value for 16 bit-numbers
382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber__inline Int32 abs2(Int32 x)
384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 z;
386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        z = x - (x<0);
388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        x = z ^ sign(z)
389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     */
390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    __asm
391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        sub  z, x, x, lsr #31
393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        eor  x, z, z, asr #31
394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return (x);
396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define pv_abs(x)   abs2(x)
400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#elif (defined(PV_ARM_GCC_V5)||defined(PV_ARM_GCC_V4))
403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *  Absolute value for 16 bit-numbers
406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber__inline Int32 abs2(Int32 x)
408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    register Int32 z;
410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    register Int32 y;
411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    register Int32 ra = x;
412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    asm volatile(
413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        "sub  %0, %2, %2, lsr #31\n\t"
414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        "eor  %1, %0, %0, asr #31"
415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    : "=&r*i"(z),
416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        "=&r*i"(y)
417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                : "r"(ra));
418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return (y);
420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define pv_abs(x)   abs2(x)
423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else
426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define pv_abs(x)   ((x) > 0)? (x) : (-x)
428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid esc_iquant_scaling(
436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int16     quantSpec[],
437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32         coef[],
438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int     sfbWidth,
439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int const      QFormat,
440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UInt16        scale,
441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int           maxInput)
442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int    i;
444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int    x;
445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int    y;
446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int    index;
447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int    shift;
448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UInt   absX;
449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UInt32 w1, w2;
450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UInt32 deltaOneThird;
451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UInt32 x1;
452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UInt32 approxOneThird;
453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32   mult_high;
454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if ( defined(_ARM) || defined(_ARM_V4))
457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32   *temp;
460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32   R12, R11, R10, R9;
461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        deltaOneThird = sizeof(Int32) * sfbWidth;
463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp = coef;
464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        // from standard library call for __rt_memset
466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        __asm
467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            MOV     R12, #0x0
469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            MOV     R11, #0x0
470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            MOV     R10, #0x0
471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            MOV     R9, #0x0
472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            SUBS    deltaOneThird, deltaOneThird, #0x20
473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberloop:
474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            STMCSIA temp!, {R12, R11, R10, R9}
475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            STMCSIA temp!, {R12, R11, R10, R9}
476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            SUBCSS  deltaOneThird, deltaOneThird, #0x20
477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            BCS     loop
478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            MOVS    deltaOneThird, deltaOneThird, LSL #28
480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            STMCSIA temp!, {R12, R11, R10, R9}
481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            STMMIIA temp!, {R12, R11}
482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else
486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pv_memset(coef, 0, sizeof(Int32) * sfbWidth);
487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (maxInput > 0)
490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        shift = QTABLE - QFormat;
493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (scale != 0)
495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (maxInput < TABLESIZE)
497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (i = sfbWidth - 1; i >= 0; i -= 4)
500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    x = quantSpec[i];
502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    y = quantSpec[i-1];
503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (x)
504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        absX = pv_abs(x);
506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        mult_high = (x * (inverseQuantTable[absX] >> shift));
507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        coef[i] = fxp_mul32_by_16(mult_high, scale) << 1;
508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (y)
511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        absX = pv_abs(y);
513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        mult_high = y * (inverseQuantTable[absX] >> shift);
514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        coef[i-1] = fxp_mul32_by_16(mult_high, scale) << 1;
515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    x = quantSpec[i-2];
518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    y = quantSpec[i-3];
519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (x)
520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        absX = pv_abs(x);
522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        mult_high = x * (inverseQuantTable[absX] >> shift);
523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        coef[i-2] = fxp_mul32_by_16(mult_high, scale) << 1;
524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (y)
527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        absX = pv_abs(y);
529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        mult_high = y * (inverseQuantTable[absX] >> shift);
530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        coef[i-3] = fxp_mul32_by_16(mult_high, scale) << 1;
531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                } /* end for (i = sfbWidth - 1; i >= 0; i--) */
533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            } /* end if (maxInput < TABLESIZE)*/
535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            else /* maxInput >= TABLESIZE) */
537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (i = sfbWidth - 1; i >= 0; i -= 4)
539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    x    = quantSpec[i];
541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (x)
542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        absX = pv_abs(x);
544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        if (absX < TABLESIZE)
545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            mult_high = x * (inverseQuantTable[absX] >> shift);
547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            coef[i] = fxp_mul32_by_16(mult_high, scale) << 1;
548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        else
551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            index = absX >> ORDER;
553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            w1 = inverseQuantTable[index];
554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            w2 = inverseQuantTable[index+1];
555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            approxOneThird = (w1 * FACTOR) >> shift;
556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            x1 = index << ORDER;
557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            deltaOneThird = (w2 - w1) * (absX - x1);
558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            deltaOneThird >>= (shift + 2);
559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            mult_high = x * (approxOneThird + deltaOneThird);
560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            coef[i] = fxp_mul32_by_16(mult_high, scale) << 1;
561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    } /* if(x) */
564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    x    = quantSpec[i-1];
567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (x)
568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        absX = pv_abs(x);
570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        if (absX < TABLESIZE)
571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            mult_high = (x * (inverseQuantTable[absX] >> shift));
573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            coef[i-1] = fxp_mul32_by_16(mult_high, scale) << 1;
574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        else
577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            index = absX >> ORDER;
579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            w1 = inverseQuantTable[index];
580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            w2 = inverseQuantTable[index+1];
581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            approxOneThird = (w1 * FACTOR) >> shift;
582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            x1 = index << ORDER;
583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            deltaOneThird = (w2 - w1) * (absX - x1);
584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            deltaOneThird >>= (shift + 2);
585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            mult_high = x * (approxOneThird + deltaOneThird);
586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            coef[i-1] = fxp_mul32_by_16(mult_high, scale) << 1;
587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    } /* if(x) */
589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    x    = quantSpec[i-2];
591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (x)
592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        absX = pv_abs(x);
594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        if (absX < TABLESIZE)
595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            mult_high = x * (inverseQuantTable[absX] >> shift);
597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            coef[i-2] = fxp_mul32_by_16(mult_high, scale) << 1;
598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        else
600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            index = absX >> ORDER;
602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            w1 = inverseQuantTable[index];
603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            w2 = inverseQuantTable[index+1];
604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            approxOneThird = (w1 * FACTOR) >> shift;
605dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            x1 = index << ORDER;
606dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            deltaOneThird = (w2 - w1) * (absX - x1);
607dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            deltaOneThird >>= (shift + 2);
608dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            mult_high = x * (approxOneThird + deltaOneThird);
609dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            coef[i-2] = fxp_mul32_by_16(mult_high, scale) << 1;
610dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
611dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    } /* if(x) */
612dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
613dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    x    = quantSpec[i-3];
614dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (x)
615dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
616dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        absX = pv_abs(x);
617dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        if (absX < TABLESIZE)
618dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
619dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            mult_high = x * (inverseQuantTable[absX] >> shift);
620dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            coef[i-3] = fxp_mul32_by_16(mult_high, scale) << 1;
621dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
622dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
623dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        else
624dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
625dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            index = absX >> ORDER;
626dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            w1 = inverseQuantTable[index];
627dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            w2 = inverseQuantTable[index+1];
628dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            approxOneThird = (w1 * FACTOR) >> shift;
629dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            x1 = index << ORDER;
630dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            deltaOneThird = (w2 - w1) * (absX - x1);
631dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            deltaOneThird >>= (shift + 2);
632dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            mult_high = x * (approxOneThird + deltaOneThird);
633dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            coef[i-3] = fxp_mul32_by_16(mult_high, scale) << 1;
634dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
635dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
636dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    } /* if(x) */
637dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
638dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }  /* end for (i = sfbWidth - 1; i >= 0; i--) */
639dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            } /* end else for if (maxInput < TABLESIZE)*/
640dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
641dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        else /* scale == 0 */
642dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
643dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (maxInput < TABLESIZE)
644dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
645dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (i = sfbWidth - 1; i >= 0; i -= 4)
646dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
647dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    x = quantSpec[i];
648dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    y = quantSpec[i-1];
649dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (x)
650dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
651dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        absX = pv_abs(x);
652dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        mult_high = x * (inverseQuantTable[absX] >> shift);
653dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        coef[i] = mult_high >> 1;
654dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
655dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
656dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (y)
657dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
658dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        absX = pv_abs(y);
659dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        mult_high = y * (inverseQuantTable[absX] >> shift);
660dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        coef[i-1] = mult_high >> 1;
661dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
662dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
663dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    x = quantSpec[i-2];
664dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    y = quantSpec[i-3];
665dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (x)
666dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
667dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        absX = pv_abs(x);
668dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        mult_high = x * (inverseQuantTable[absX] >> shift);
669dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        coef[i-2] = mult_high >> 1;
670dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
671dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
672dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (y)
673dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
674dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        absX = pv_abs(y);
675dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        mult_high = y * (inverseQuantTable[absX] >> shift);
676dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        coef[i-3] = mult_high >> 1;
677dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
678dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
679dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
680dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            } /* end if (maxInput < TABLESIZE)*/
681dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
682dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            else /* maxInput >= TABLESIZE) */
683dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
684dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (i = sfbWidth - 1; i >= 0; i -= 4)
685dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
686dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    x    = quantSpec[i];
687dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (x)
688dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
689dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        absX = pv_abs(x);
690dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        if (absX < TABLESIZE)
691dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
692dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            mult_high = x * (inverseQuantTable[absX] >> shift);
693dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            coef[i] = (mult_high >> 1);
694dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        } /* end if (absX < TABLESIZE) */
695dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        else
696dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
697dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            index = absX >> ORDER;
698dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            w1 = inverseQuantTable[index];
699dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            w2 = inverseQuantTable[index+1];
700dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            approxOneThird = (w1 * FACTOR) >> shift;
701dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            x1 = index << ORDER;
702dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            deltaOneThird = (w2 - w1) * (absX - x1);
703dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            deltaOneThird >>= (shift + 2);
704dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            mult_high = x * (approxOneThird + deltaOneThird);
705dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            coef[i] = (mult_high >> 1);
706dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
707dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    } /* if(x) */
708dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
709dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    x    = quantSpec[i-1];
710dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (x)
711dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
712dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        absX = pv_abs(x);
713dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        if (absX < TABLESIZE)
714dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
715dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            mult_high = x * (inverseQuantTable[absX] >> shift);
716dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            coef[i-1] = (mult_high >> 1);
717dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        } /* end if (absX < TABLESIZE) */
718dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        else
719dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
720dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            index = absX >> ORDER;
721dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            w1 = inverseQuantTable[index];
722dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            w2 = inverseQuantTable[index+1];
723dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            approxOneThird = (w1 * FACTOR) >> shift;
724dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            x1 = index << ORDER;
725dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            deltaOneThird = (w2 - w1) * (absX - x1);
726dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            deltaOneThird >>= (shift + 2);
727dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            mult_high = x * (approxOneThird + deltaOneThird);
728dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            coef[i-1] = (mult_high >> 1);
729dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
730dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    } /* if(x) */
731dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
732dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    x    = quantSpec[i-2];
733dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (x)
734dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
735dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        absX = pv_abs(x);
736dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        if (absX < TABLESIZE)
737dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
738dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            mult_high = x * (inverseQuantTable[absX] >> shift);
739dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            coef[i-2] = (mult_high >> 1);
740dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        } /* end if (absX < TABLESIZE) */
741dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        else
742dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
743dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            index = absX >> ORDER;
744dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            w1 = inverseQuantTable[index];
745dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            w2 = inverseQuantTable[index+1];
746dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            approxOneThird = (w1 * FACTOR) >> shift;
747dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            x1 = index << ORDER;
748dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            deltaOneThird = (w2 - w1) * (absX - x1);
749dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            deltaOneThird >>= (shift + 2);
750dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            mult_high = x * (approxOneThird + deltaOneThird);
751dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            coef[i-2] = (mult_high >> 1);
752dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
753dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    } /* if(x) */
754dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
755dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    x    = quantSpec[i-3];
756dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (x)
757dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
758dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        absX = pv_abs(x);
759dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        if (absX < TABLESIZE)
760dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
761dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            mult_high = x * (inverseQuantTable[absX] >> shift);
762dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            coef[i-3] = (mult_high >> 1);
763dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        } /* end if (absX < TABLESIZE) */
764dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        else
765dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
766dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            index = absX >> ORDER;
767dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            w1 = inverseQuantTable[index];
768dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            w2 = inverseQuantTable[index+1];
769dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            approxOneThird = (w1 * FACTOR) >> shift;
770dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            x1 = index << ORDER;
771dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            deltaOneThird = (w2 - w1) * (absX - x1);
772dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            deltaOneThird >>= (shift + 2);
773dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            mult_high = x * (approxOneThird + deltaOneThird);
774dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            coef[i-3] = (mult_high >> 1);
775dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
776dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
777dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    } /* if(x) */
778dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
779dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }  /* end for (i = sfbWidth - 1; i >= 0; i--) */
780dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
781dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            } /* end else for if (maxInput < TABLESIZE)*/
782dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
783dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        } /* end else for if(scale!=0) */
784dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
785dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }  /* end else for if(maxInput == 0) */
786dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
787dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* end esc_iquant_fxp */
788dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
789dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
790