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:  huffspec_fxp.c
21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Funtions:
22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    huffspec_fxp
23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY
26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Modified from original shareware code
28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Modified to pass variables by reference to eliminate use
30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber               of global variables.
31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: (1) Modified to keep in-line with PV standards
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              (2) Eliminated "continue" in if(sect_cb==ZERO_HCB||...)
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: (1) Use SectInfo *pSect
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              (2) Convert 'Real' to 'Int32', float -> fixed-point
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              (3) move BITS *pInputStream to second parameter
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              (4) pass in quantSpec and tmp_spec, scratch shared with hufffac
39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              (5) pass in FrameInfo *pLongFrameInfo, eliminate only_long_info
40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: (1) Eliminate parameter Hcb *book, because of eliminating
42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  function 'hufftab.c', Hcb hcbbook defined as a
43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  const structure in 'hcbtables.h'.
44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              (2) Replace three nested 'for' loops with a for-while loop in
45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  the rescaling part.
46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              (3) Change esc_iquant-> esc_iquant_fxp, call esc_iquant_fxp()
47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  by sfb
48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Cleaned up include files.
50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Correct definition of stack variable "scale".
52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        It was defined as Int, but it receives an UInt value,
53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        this present a problem when Int is 16 bits and
54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        the sign bit is not interpreted correctly. This does not
55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        shows for 32-bit implementations. This problem manifest itself
56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        as a flipping sign on some spectral coefficients (the ones
57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        multiplied by 0x8000).
58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Typecast b_low and b_high to 32-bits before multiplication, this
60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              assures propoer compilation on a 16-bit platform (TI-C55x)
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified to speed up decode_huff_cw
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: pass codebook index to decode_huff_cw, delete pointer to Huffman
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              structure
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: keep memset to quantSpec, remove memset to temp_spec
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified per review comments
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Use Binary tree search in decode_huff_cw_binary
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified per review comments
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              (1) delete unused codes
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: (1) Change the interface to decode huffman codeword.
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              (2) Move the scaling inside the inverse quantization.
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              (3) Change scaling factor accuracy to 10 bits.
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              (1) delete unused variable max_fac
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Addresses of huffman tables are now found by means of a
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              switch statement, this solve linking problem when using the
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              /ropi option (Read-only position independent) for some
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              compilers
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who:                                   Date: MM/DD/YYYY
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs:
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pFrameInfo  = ptr to structure that holds Information of current Frame,
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  type FrameInfo
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pInputStream = ptr to structure of bitstream, type BITS
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    nsect       = number of sections in current Frame, at fs = 44.1 kHz,
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  range [0, 49] long block, [0,112] short blocks. type Int
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pSect       = ptr to structure that holds section codebook and boundary
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  type SectInfo
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    factors[]   = array that contains scalefactors for each sfb, type Int16
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    coef[]      = array that holds inverse quantized coefs, Int32 QFormat.
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    quantSpec[] = array that holds quantized spectral coefs, type Int
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp_spec[]  = temporary buffer to hold the de-interleaved coefs.
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pLongFrameInfo = ptr to structure that holds long frame info
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed:
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    exptable = array contains the Q15 format data for 2^0, 2^0.25, 2^0.5,
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber               and 2^0.75, type const Int.
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed:
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs:
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return 0 if decoding properly.
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified:
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pInputStream    read codeword index and/or sign bits and/or ESC value
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    coef            contains the newly inverse quantized 1024 spec coefs,
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    type Int32 Q-format from esc_iquant()
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    quantSpec       contains decoded quantized 1024 spec coefs, type Int
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tmp_spec        contains the de-interleaved version of quantSpec
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    qFormat         contains Q-Format for each scalefactor band
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified:
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified:
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function first reads the section info (codebook and boundary), then
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber decode the spectral coefficients if a spectral codebook is used.
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber If necessary, get the sign bits, ESC value or the NEC_pulse data. In case of
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber short window sequences, the decoded data is de-interleaved before
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber multiplied by scalefactors.
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function should set the content of the array 'coef' with the inverse
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber quantized and rescaled value of spectral coefficients.
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) MPEG-2 NBC Audio Decoder
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   "This software module was originally developed by AT&T, Dolby
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   3. This software module is an implementation of a part of one or more
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   standards free license to this software module or modifications thereof
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for use in hardware or software products claiming conformance to the
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module in hardware or software products are advised that this use may
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   infringe existing patents. The original developer of this software
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module and his/her company, the subsequent editors and their companies,
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   and ISO/IEC have no liability for use of this software module or
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   modifications thereof in an implementation. Copyright is not released
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   developer retains full right to use the code for his/her own purpose,
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   assign or donate the code to a third party and to inhibit third party
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   This copyright notice must be included in all copies or derivative
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   works."
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Copyright(c)1996.
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) ISO/IEC 14496-3: 1999(E)
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Subpart (4)         p56 (spectral_data() parsing and decoding)
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        p26 (Syntax of spectral_data())
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        p74-78 (decoding: unpack_idx, get_sign_bits,
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                getescape, pulse_nc, deinterleave)
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        p72 (inverse quantization: esc_iquant)
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   When the code is written for a specific target processor the
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     the resources used should be documented below.
201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent
203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          stack usage for each subroutine called]
204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [stack usage variable] = stack usage for [subroutine
206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         name] (see [filename].ext)
207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words
209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words
211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable
213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           used to represent cycle count for each subroutine
214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           called]
215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [cycle count variable] = cycle count for [subroutine
217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        name] (see [filename].ext)
218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/
221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES
224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "pv_audio_type_defs.h"
226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "aac_mem_funcs.h"
227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "esc_iquant_scaling.h"
228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "huffman.h"
229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "unpack_idx.h"
230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "pulse_nc.h"
231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "iquant_table.h"
232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "e_huffmanconst.h"
233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_normalize.h"
236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here
240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define ORDER        (3)
249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Format the table is stored in.
252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define QTABLE       (27)
254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Number of bits for data in a signed 32 bit integer.
257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define SIGNED32BITS  (31)
259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Round up value for intermediate values obtained from the table
262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define ROUND_UP (( ((UInt32) 1) << (QTABLE) )-1)
264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberconst UInt16 exptable[4] =
275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    0,  /* (2^0.00)<<15 (Q10), use zero to signal no scaling required! */
277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    19485,  /* (2^0.25)<<15 */
278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    23171,  /* (2^0.50)<<15 */
279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    27555   /* (2^0.75)<<15 */
280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber};
282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
298dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberInt huffspec_fxp(
299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    FrameInfo *pFrameInfo,
300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    BITS      *pInputStream,
301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int       nsect,
302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    SectInfo  *pSectInfo,
303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int       factors[],
304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32     coef[],
305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16     quantSpec[],
306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16     tmp_spec[],
307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const FrameInfo  *pLongFrameInfo,
308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    PulseInfo  *pPulseInfo,
309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int         qFormat[])
310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*----------------------------------------------------------------------------
312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; Define all local variables
313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ----------------------------------------------------------------------------*/
314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Hcb       *pHcb;
315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     i;
316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     sfb;
317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     idx_count;
318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     sect_cb;    /* section codebook */
319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     dim;
320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     idx;
321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     stop_idx;     /* index of 1st coef in next sfb */
322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     sect_start;   /* start index of sfb in one section*/
323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     sect_end;     /* index of 1st sfb in next section */
324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     *pSfbStart;
325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     *pSfb;
326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16     *pQuantSpec;        /* probably could be short */
327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     max = 0;
328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* rescaling parameters */
329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     nsfb;
330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     tot_sfb;
331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     fac;
332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32   *pCoef; /* ptr to coef[], inverse quantized coefs */
334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UInt16     scale;
335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     power_scale_div_4;
337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     sfbWidth;
338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    void (*pUnpack_idx)(
340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int16  quant_spec[],
341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int  codeword_indx,
342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        const Hcb *pHuffCodebook,
343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        BITS  *pInputStream,
344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int *max);
345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int(*pDec_huff_tab)(BITS *) = NULL;
347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UInt32 temp;
349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int    binaryDigits, QFormat;
350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*----------------------------------------------------------------------------
352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; Function body here
353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ----------------------------------------------------------------------------*/
354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    sect_start = 0;
356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    stop_idx   = 0;
357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* pSfb: ptr to array that holds stop index of each sfb */
359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pSfbStart = pFrameInfo->frame_sfb_top;
360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (pSfbStart == NULL)
362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        return (-1);   /*  error condition */
364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pSfb      = pSfbStart;
367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* decoding spectral values section by section */
369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    for (i = nsect; i > 0; i--)
370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* read the codebook and section length */
372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        sect_cb  =  pSectInfo->sect_cb;     /* codebook */
373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if ((sect_cb > 15) || (sect_cb < 0))
374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            return (-1);   /*  error condition */
376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        sect_end =  pSectInfo->sect_end;    /* # of sfbs */
378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (sect_end < 0)
380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            return (-1);   /*  error condition */
382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pSectInfo++;
385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*  sect_cb       sect_cb - 1
387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  ZERO_HCB        1111b
388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    1             0000b
389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    2             0001b
390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    3             0010b
391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    4             0011b
392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    5             0100b
393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    6             0101b
394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    7             0110b
395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    8             0111b
396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    9             1000b
397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    10            1001b
398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    11            1010b
399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    12            1011b
400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         * NOISE_HCB        1100b
401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         * INTENSITY_HCB2   1101b
402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         * INTENSITY_HCB    1110b
403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         * if ( ((sect_cb - 1) & 0xC) == 0xC ) is identical to
404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         * if !((sect_cb == ZERO_HCB) || (sect_cb == NOISE_HCB) ||
405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *      (sec_cb == INTENSITY_HCB) || (sect_cb==INTENSITY_HCB2) )
406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         * use this compare scheme to speed up the execution
407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (((sect_cb - 1) & 0xC) != 0xC)
410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* decode spec in one section */
412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (sect_cb > BY4BOOKS)
413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                dim = DIMENSION_2; /* set codebook dimension */
415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            else
417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                dim = DIMENSION_4;
419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pHcb        = &hcbbook_binary[sect_cb];
422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (sect_cb == ESCBOOK)
424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pUnpack_idx = &unpack_idx_esc;
426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            else if (pHcb->signed_cb == FALSE)
428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pUnpack_idx = &unpack_idx_sgn;
430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            else
432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pUnpack_idx = &unpack_idx;
434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            switch (sect_cb)
438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case 1:
440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pDec_huff_tab = decode_huff_cw_tab1;
441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case 2:
443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pDec_huff_tab = decode_huff_cw_tab2;
444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case 3:
446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pDec_huff_tab = decode_huff_cw_tab3;
447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case 4:
449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pDec_huff_tab = decode_huff_cw_tab4;
450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case 5:
452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pDec_huff_tab = decode_huff_cw_tab5;
453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case 6:
455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pDec_huff_tab = decode_huff_cw_tab6;
456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case 7:
458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pDec_huff_tab = decode_huff_cw_tab7;
459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case 8:
461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pDec_huff_tab = decode_huff_cw_tab8;
462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case 9:
464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pDec_huff_tab = decode_huff_cw_tab9;
465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case 10:
467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pDec_huff_tab = decode_huff_cw_tab10;
468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                case 11:
470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pDec_huff_tab = decode_huff_cw_tab11;
471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                default:
473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    return (-1); /* error condition */
474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* move ptr to first sfb of current section */
477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pQuantSpec  = quantSpec + stop_idx;
478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* step through all sfbs in current section */
480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            for (sfb = sect_start; sfb < sect_end; sfb++)
481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                idx_count = *pSfb - stop_idx;
483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                stop_idx  = *pSfb++;
484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /* decode all coefs for one sfb */
486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                while ((idx_count > 0) && (idx_count < 1024))
487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    idx = (*pDec_huff_tab)(pInputStream);
490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    (*pUnpack_idx)(pQuantSpec,
492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                   idx,
493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                   pHcb,
494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                   pInputStream,
495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                   &max);      /* unpack idx -> coefs */
496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pQuantSpec += dim;
498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    idx_count  -= dim;
499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                } /* while(idx_count) */
501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            } /* for (sfb=sect_start) */
503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        else
505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* current section uses ZERO_HCB, NOISE_HCB, etc */
508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* move sfb pointer to the start sfb of next section */
510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pSfb        = pSfbStart + sect_end;
511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* number of coefs in current section */
512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            idx_count   = *(pSfb - 1) - stop_idx;
513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if ((idx_count > 1024) || (idx_count < 0))
515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                return (-1);   /*  error condition */
517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * This memset is necessary in terms of (1) net savings in total
521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * MIPS and (2) accurate Q-Formats for fft_rx2
522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * In case a scalefactor band uses ZERO_HCB, all coefficients of
523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * that sfb should be zeros. Without this call to memset, the
524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * coefficients for a ZERO_HCB sfb are the "leftovers" of the
525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * previous frame, which may not have all zero values. This leads
526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * to a drastical increase in the cycles consumed by esc_iquant_fxp
527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * and fft_rx2, which is the most "expensive" function of the
528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * library.
529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * This memset also guarantees the Q_Format for sfbs with all zero
530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * coefficients will be set properly.
531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * Profiling data on ARM and TMS320C55x proves that there is a net
532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * gain in total MIPS if a memset is called here.
533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pv_memset(&quantSpec[stop_idx],
535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      0,
536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      idx_count * sizeof(quantSpec[0]));
537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * This memset is called because pQuantSpec points to tmp_spec
540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * after deinterleaving
541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pv_memset(&tmp_spec[stop_idx],
544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      0,
545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      idx_count * sizeof(tmp_spec[0]));
546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* stop_idx is the index of the 1st coef of next section */
549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            stop_idx    = *(pSfb - 1);
550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }/* if (sect_cb) */
552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        sect_start = sect_end;
554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    } /* for (i=nsect) */
556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* noisless coding reconstruction */
558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (pFrameInfo->islong != FALSE)
559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (pPulseInfo->pulse_data_present == 1)
561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pulse_nc(quantSpec,
563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     pPulseInfo,
564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     pLongFrameInfo,
565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     &max);    /* add pulse data */
566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pQuantSpec = quantSpec;
569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    else
572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        deinterleave(quantSpec,
574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     tmp_spec,
575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     pFrameInfo);
576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pQuantSpec = tmp_spec;
578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* inverse quantization, Q_format: Int32 */
582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* rescaling */
583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* what we can do here is assuming that we already know maxInput for each band, we have to go
585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    though each one of them for re-quant and scaling, and pick the right qFormat to apply to
586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    all spectral coeffs.*/
587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if ((max < 0) || (max > 8192))    /* (8192>>ORDER) == 1024 is the inverseQuantTable size */
589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        return (-1);   /*  error condition */
591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    else
593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* Get  (max/SPACING) ^ (1/3), in Q Format  */
595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp = inverseQuantTable[(max >> ORDER) + 1];
596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* Round up before shifting down to Q0 */
600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp += ROUND_UP;
601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* shift down to Q0 and multiply by 2 (FACTOR) in one step */
603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp >>= (QTABLE - 1);
604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
605dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* Now get max ^ (4/3) in Q0 */
606dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp *= max;
607dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
608dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
609dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    binaryDigits = 31 - pv_normalize(temp);
610dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
611dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
612dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* Prevent negative shifts caused by low maximums. */
613dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (binaryDigits < (SIGNED32BITS - QTABLE))
614dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
615dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        binaryDigits = SIGNED32BITS - QTABLE;
616dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
617dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
618dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    QFormat = SIGNED32BITS - binaryDigits;
619dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
620dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /********************/
621dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tot_sfb = 0;
622dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    nsfb = pFrameInfo->sfb_per_win[0];
623dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pCoef = coef;
624dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
625dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    for (i = pFrameInfo->num_win; i > 0; i--)
626dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
627dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        stop_idx  = 0;
628dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
629dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (sfb = 0; sfb < nsfb; sfb++)
630dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
631dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            sfbWidth   =  pFrameInfo->win_sfb_top[0][sfb] - stop_idx;
632dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
633dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if ((sfbWidth < 0) || (sfbWidth > 1024))
634dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
635dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                return (-1);   /*  error condition */
636dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
637dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
638dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            stop_idx  += sfbWidth;
639dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
640dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            fac   = factors[tot_sfb] - SF_OFFSET;
641dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            scale = exptable[fac & 0x3];
642dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
643dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            power_scale_div_4 = fac >> 2;
644dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
645dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            power_scale_div_4++;
646dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
647dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            qFormat[tot_sfb] = QFormat;
648dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
649dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            esc_iquant_scaling(pQuantSpec,
650dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               pCoef,
651dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               sfbWidth,
652dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               QFormat,
653dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               scale,
654dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               max);
655dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
656dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pQuantSpec += sfbWidth;
657dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            qFormat[tot_sfb] -= power_scale_div_4;
658dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pCoef += sfbWidth;
659dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
660dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tot_sfb++;
661dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
662dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        } /* for (sfb) */
663dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    } /* for (i) */
664dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
665dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
666dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*----------------------------------------------------------------------------
667dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; Return status
668dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ----------------------------------------------------------------------------*/
669dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return SUCCESS;
670dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
671dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* huffspec_fxp */
672