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: get_tns.c
21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     Date: 10/25/2000
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:  Brought code in-line with PV standards.  Some minor
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber               optimizations (count-down for loops, etc.) were made.
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Made cosmetic changes as suggested during review.  Also,
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber changed calculation of s_mask and n_mask from table-based to being
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber calculated based on res_index.  Also, the flag coef_res was changed
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber from having a range of [3,4] to having a range of [0,1], which corresponds
39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exactly with the true value that is passed via the bitstream.
40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Modified to use more efficient TNS memory structure.
42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Updated to reflect more efficient usage of memory by the TNS
44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber filters.
45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Updated the SW template to include the full pathname to the
47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber source file and a slightly modified copyright header.
48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Moved pInputStream to be the 2nd parameter, for a slight
50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber optimization on some platforms.
51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Moved pSfbTop outside of the loops, since its value does
53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber not change.
54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Replace some instances of getbits to get1bits
56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              when only 1 bit is read.
57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who:                       Date:
59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs:
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    FrameInfo *pFrameInfo
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Pointer to structure that holds information about each block.
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        (long block flag,
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         number of subblocks,
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         scalefactor bands per subblock, etc.)
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    BITS *pInputStream
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Pointer to a BITS structure that is
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        passed on to function getbits to pull information from the bitstream.
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    TNS_Frame_info *pTnsFrameInfo
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Pointer to filter data structure - to be populated by this function.
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed:
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed:
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs:
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified:
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    TNS_frame_info *pTnsFrameInfo
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pTnsFrameInfo->n_filt = Number of tns filters to be applied to the data.
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pTnsFrameInfo->filt[]->order = The order of each individual TNS filter.
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pTnsFrameInfo->filt[]->coef_res = The resolution of the filter coefficients
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pTnsFrameInfo->filt[]->start_band = start of spectral band
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pTnsFrameInfo->filt[]->stop_band = end of spectral band
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pTnsFrameInfo->filt[]->coef[] = Each filter's coefficients are filled with
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    data read from the input bitstream.
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pTnsFrameInfo->filt[]->direction = A flag is set for each TNS filter.
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    If the direction flag (on the bitstream) = 0, then the filter
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    is applied to the block of spectral data in normal (upward) fashion.
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    If the direction flag (on the bitstream) = 1, then the filter
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    is applied in a reverse (downward) fashion.
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    (Starting with the last element in the block of data.)
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    The value stored in filt[]->direction maps the values [0,1] to [1,-1] for
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    a more intuitive storage of this flag's meaning.
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified:
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified:
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function reads the TNS filter information from the bitstream, and stores
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the filter order, LPC coefficients, and the number of TNS filters to
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber be applied in the structure TNS_frame_info.
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This code should match the ISO code in functionality, with the exception
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber that coef_res has range of [0,1] (PV code) instead of [3,4] (ISO code)
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber coef_res is only used by tns_decode_coef.
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) ISO/IEC 14496-3:1999(E)
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     Part 3
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Subpart 4.6.8 (Temporal Noise Shaping)
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) MPEG-2 NBC Audio Decoder
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   "This software module was originally developed by AT&T, Dolby
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   3. This software module is an implementation of a part of one or more
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   standards free license to this software module or modifications thereof
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for use in hardware or software products claiming conformance to the
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module in hardware or software products are advised that this use may
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   infringe existing patents. The original developer of this software
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module and his/her company, the subsequent editors and their companies,
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   and ISO/IEC have no liability for use of this software module or
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   modifications thereof in an implementation. Copyright is not released
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   developer retains full right to use the code for his/her own purpose,
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   assign or donate the code to a third party and to inhibit third party
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   This copyright notice must be included in all copies or derivative
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   works."
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Copyright(c)1996.
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   When the code is written for a specific target processor
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     the resources used should be documented below.
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          stack usage for each subroutine called]
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [stack usage variable] = stack usage for [subroutine
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         name] (see [filename].ext)
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           used to represent cycle count for each subroutine
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           called]
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [cycle count variable] = cycle count for [subroutine
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        name] (see [filename].ext)
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h"
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "get_tns.h"
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_mc_info.h"
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_frameinfo.h"
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_tnsfilt.h"
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_tns_frame_info.h"
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_bits.h"
201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "ibstream.h"
202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "e_window_sequence.h"
203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "e_progconfigconst.h"
204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "tns_decode_coef.h"
206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here
211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define SCALE_FACTOR_BAND_OFFSET(x) ( ((x) > 0) ? pSFB_top[(x)-1] : 0 )
213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define MINIMUM(x,y) ( ((x) < (y)) ? (x) : (y) )
214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * The entries in the ensuing tables provide the maximum permissable
230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * number of scalefactor bands for each TNS filter.  This value is effected
231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * by the sampling rate, and window type.
232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberconst Int tns_max_bands_tbl_long_wndw[(1<<LEN_SAMP_IDX)] =
235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {31,       /* 96000 Hz */
236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     31,       /* 88200 Hz */
237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     34,       /* 64000 Hz */
238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     40,       /* 48000 Hz */
239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     42,       /* 44100 Hz */
240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     51,       /* 32000 Hz */
241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     46,       /* 24000 Hz */
242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     46,       /* 22050 Hz */
243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     42,       /* 16000 Hz */
244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     42,       /* 12000 Hz */
245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     42,       /* 11025 Hz */
246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     39,       /* 8000  Hz */
247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     0,
248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     0,
249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     0,
250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     0
251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    };
252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberconst Int tns_max_bands_tbl_short_wndw[(1<<LEN_SAMP_IDX)] =
254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {9,       /* 96000 Hz */
255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     9,       /* 88200 Hz */
256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     10,       /* 64000 Hz */
257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     14,       /* 48000 Hz */
258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     14,       /* 44100 Hz */
259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     14,       /* 32000 Hz */
260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     14,       /* 24000 Hz */
261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     14,       /* 22050 Hz */
262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     14,       /* 16000 Hz */
263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     14,       /* 12000 Hz */
264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     14,       /* 11025 Hz */
265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     14,       /* 8000  Hz */
266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     0,
267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     0,
268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     0,
269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     0
270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    };
271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * For completeness, here are the table entries for object types that make
274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * use of PQF filter bank.  We do not currently support this; these are
275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * given here only to ease future implementation.
276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *  const Int tns_max_bands_tbl_long_wndw_PQF[(1<<LEN_SAMP_IDX)] =
278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *         {28,       ; 96000
279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          28,       ; 88200
280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          27,       ; 64000
281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          26,       ; 48000
282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          26,       ; 44100
283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          26,       ; 32000
284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          29,       ; 24000
285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          29,       ; 22050
286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          23,       ; 16000
287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          23,       ; 12000
288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          23,       ; 11025
289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          19,       ; 8000
290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *           0,
291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *           0,
292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *           0,
293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *           0};
294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *  const Int tns_max_bands_tbl_short_wndw_PQF[(1<<LEN_SAMP_IDX)] =
296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *         {7,       ; 96000
297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          7,       ; 88200
298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          7,       ; 64000
299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          6,       ; 48000
300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          6,       ; 44100
301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          6,       ; 32000
302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          7,       ; 24000
303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          7,       ; 22050
304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          8,       ; 16000
305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          8,       ; 12000
306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          8,       ; 11025
307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          7,       ; 8000
308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          0,
309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          0,
310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          0,
311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *          0};
312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid get_tns(
328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int               max_bands,
329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    BITS            * const pInputStream,
330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const WINDOW_SEQUENCE   wnd_seq,
331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const FrameInfo * const pFrameInfo,
332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const MC_Info   * const pMC_Info,
333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    TNS_frame_info  * const pTnsFrameInfo,
334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32                   scratchTnsDecCoefMem[])
335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int16 * const pSFB_top = pFrameInfo->win_sfb_top[0];
338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int f;
340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int t;
341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int win;
342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UInt tempInt;
343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int num_filt_bits;
345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int num_order_bits;
346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int num_start_band_bits;
347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int top;
349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int res;
350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int res_index;
351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int compress;
352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int sfb_per_win;
354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pLpcCoef;
356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 *pStartLpcCoef;
357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int s_mask;
358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int n_mask;
359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int tns_bands;
361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UInt max_order;
362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int coef_res;
363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    TNSfilt *pFilt;
366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (wnd_seq != EIGHT_SHORT_SEQUENCE)
368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        num_filt_bits  = 2;
370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        num_order_bits = 5;
371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        num_start_band_bits = 6;
372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tns_bands = tns_max_bands_tbl_long_wndw[pMC_Info->sampling_rate_idx];
374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  Definition from 14496-3:1999 doc. Our first encoder follows this rule,
377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  later encoders don't
378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (pMC_Info->sampling_rate_idx > 4)  /* if (sampling_rate <= 32000 */
381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            max_order = 20;
383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        else
385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            max_order = 12;
387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    else
390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        num_filt_bits  = 1;
392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        num_order_bits = 3;
393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        num_start_band_bits = 4;
394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tns_bands = tns_max_bands_tbl_short_wndw[pMC_Info->sampling_rate_idx];
396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        max_order = 7;
398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     * After this branch, tns_bands will be equal to the minimum of
402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     * the passed in variable, nbands, and the result from the
403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     * tns_max_bands_tbl
404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     */
405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (max_bands < tns_bands)
407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tns_bands = max_bands;
409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    sfb_per_win = pFrameInfo->sfb_per_win[0];
412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    win = 0;
414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pLpcCoef = pTnsFrameInfo->lpc_coef;
416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pFilt = pTnsFrameInfo->filt;
418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    do
420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tempInt = get9_n_lessbits(num_filt_bits,
422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                  pInputStream);
423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pTnsFrameInfo->n_filt[win] = tempInt;
425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (tempInt != 0)
427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * coef_res = [0, 1]
430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * Switch between a resolution of 3 and 4 bits respectively
431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *
432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * if coef_res = 0, the coefficients have a range of
433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *
434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *                 -4  -3  -2  -1  0   1   2   3
435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *
436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * if coef_res = 1, the coefficients have a range of
437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *
438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * -8  -7  -6  -5  -4  -3  -2  -1  0   1   2   3   4   5   6   7
439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *
440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * The arrays in ./src/tns_tab.c are completely based on
441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * the value of coef_res.
442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            res = get1bits(
444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      pInputStream);
445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* res is post-incremented for correct calculation of res_index */
447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            coef_res = res++;
448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            top = sfb_per_win;
450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            for (f = pTnsFrameInfo->n_filt[win]; f > 0; f--)
452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                tempInt = MINIMUM(top, tns_bands);
454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pFilt->stop_coef = SCALE_FACTOR_BAND_OFFSET(tempInt);
456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pFilt->stop_band = tempInt;
458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                top -= get9_n_lessbits(num_start_band_bits,
460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                       pInputStream);
461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                tempInt = MINIMUM(top, tns_bands);
463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pFilt->start_coef = SCALE_FACTOR_BAND_OFFSET(tempInt);
465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pFilt->start_band = tempInt;
467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                tempInt = get9_n_lessbits(num_order_bits,
469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                          pInputStream);
470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pFilt->order = tempInt;
472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                if (tempInt != 0)
474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (tempInt > max_order)
476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        pFilt->order = max_order;
478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /*
481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * This maps the bitstream's [0,1] to
482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * pFilt->direction = [1,-1]
483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     */
484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    tempInt = get1bits(pInputStream);
486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pFilt->direction = (-(Int)tempInt) | 0x1;
488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /*
490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * compress = [0,1]
491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * If compress is true, the MSB has
492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * been omitted from transmission (Ref. 1)
493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *
494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * For coef_res = 0, this limits the range of
495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * transmitted coefficients to...
496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *
497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *         -2  -1  0   1
498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *
499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * For coef_res = 1, the coefficients have
500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * a range of...
501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *
502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * -4  -3  -2  -1  0   1   2   3
503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     */
504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    compress = get1bits(pInputStream);
505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /*
507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * res has a range of [1,2]
508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * compress has a range of [0,1]
509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * So (res - compress) has range [0,2];
510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     */
511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    res_index = res - compress;
512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    s_mask =  2 << res_index;
514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /*
516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * If res_index = 0, grab 2 bits of data
517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * If res_index = 1, grab 3 bits of data
518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * If res_index = 2, grab 4 bits of data
519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     */
520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    res_index += 2;
521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pStartLpcCoef = pLpcCoef;
523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    for (t = pFilt->order; t > 0; t--)
525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        /*
527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * These are the encoded coefficients, which will
528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * later be decoded into LPC coefficients by
529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * the function tns_decode_coef()
530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         */
531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        tempInt = get9_n_lessbits(res_index,
532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                                  pInputStream);
533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        n_mask  = -((Int)tempInt & s_mask);
535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        /*
537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * n_mask is used to sign_extend the
538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * value, if it is negative.
539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         *
540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         */
541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *(pLpcCoef++) = tempInt | n_mask;
542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /* Decode the TNS coefficients */
545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    tempInt = pFilt->stop_coef - pFilt->start_coef;
547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (tempInt > 0)
549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        pFilt->q_lpc =
551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            tns_decode_coef(
552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                pFilt->order,
553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                coef_res,
554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                pStartLpcCoef,
555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                scratchTnsDecCoefMem);
556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                } /* if (pTnsFilt->order != 0) */
559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pFilt++;
561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            } /* END for (f=pTnsInfo->n_filt; f>0; f--, pTnsFilt++) */
563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        } /* if (pTnsInfo->n_filt != 0) */
565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        win++;
567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    while (win < pFrameInfo->num_win);
570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return;
572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* get_tns */
574