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