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: pulse_nc.c
21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY
24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Modified from original shareware code
26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Modified to pass variables by reference to eliminate use
28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber               of global variables.
29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Modified to bring code in-line with PV standards.
31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Pass in max as input argument.
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Went back to the if-statement to check for max.
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who:                       Date:
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS
41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs:
43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    coef[]         =  Array of quantized spectral coefficents.
44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      (Int [])
45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPulseInfo     =  Pointer to structure which contains noiseless
47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      encoding info, includes information about the pulse data,
48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      pulse amplitude, etc.
49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      (const PulseInfo *)
50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pLongFrameInfo =  Pointer to structure that holds information about
52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      each group. (long block flag, number of windows,
53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      scalefactor bands per group, etc.)
54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      Variable is named (pLongFrameInfo) because this function
56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      is only used for LONG windows.
57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      (FrameInfo *)
58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    max             = Pointer to the maximum value of coef[]
59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed:
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed:
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs:
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified:
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    coef[]  =  coefficient contents are modified by the encoded pulse
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified:
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified:
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function adds pulses to defined ranges of coefficients in the window,
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for the case of LONG windows.  The pulses are unsigned, so
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber negative coefficients subtract the pulse, and positive coefficients add it.
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (The ampltiude of the coefficient is always increased by the pulse)
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber A maximum of 4 coefficients may be modified by a pulse, and these
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber coefficients must all occur in the same scalefactor band.
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber The number of pulse-encoded coefficients to be processed by this function
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber is communicated to this function via pPulseInfo->number_pulse
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This value is equal to the actual number of pulses - 1.
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (e.g if pPulseInfo->number_pulse == 0, one pulse is assumed)
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function must not be called if no pulse encoded data exists.
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber The function assumes that at least one pulse exists.
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This module shall correctly add transmitted pulse(s) to the correct
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber coefficients in a LONG window.
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) ISO/IEC 14496-3:1999(E)
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     Part 3
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Subpart 4.6.3.3 Decoding Process
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) MPEG-2 NBC Audio Decoder
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   "This software module was originally developed by AT&T, Dolby
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   3. This software module is an implementation of a part of one or more
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   standards free license to this software module or modifications thereof
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for use in hardware or software products claiming conformance to the
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module in hardware or software products are advised that this use may
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   infringe existing patents. The original developer of this software
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module and his/her company, the subsequent editors and their companies,
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   and ISO/IEC have no liability for use of this software module or
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   modifications thereof in an implementation. Copyright is not released
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   developer retains full right to use the code for his/her  own purpose,
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   assign or donate the code to a third party and to inhibit third party
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   This copyright notice must be included in all copies or derivative
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   works."
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Copyright(c)1996.
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    index = pLongFrameInfo->win_sfb_top[0][pPulseInfo->pulse_start_sfb];
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPulseOffset = &(pPulseInfo->pulse_offset[0]);
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPulseAmp    = &(pPulseInfo->pulse_amp[0]);
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pCoef        = &(Coef[index]);
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    FOR (index = pPulseInfo->number_pulse; index >= 0; index--)
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pCoef   = pCoef + *(pPulseOffset);
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pPulseOffset = pPulseOffset + 1;
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        IF (*pCoef > 0)
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *(pCoef) = *(pCoef) + *(pPulseAmp);
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pPulseAmp     = pPulseAmp + 1;
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ELSE
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *(pCoef) = *(pCoef) - *(pPulseAmp);
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pPulseAmp     = pPulseAmp + 1;
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ENDIF
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ENDFOR
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   When the code is written for a specific target processor the
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     the resources used should be documented below.
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          stack usage for each subroutine called]
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [stack usage variable] = stack usage for [subroutine
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         name] (see [filename].ext)
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           used to represent cycle count for each subroutine
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           called]
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [cycle count variable] = cycle count for [subroutine
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        name] (see [filename].ext)
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h"
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_frameinfo.h"
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_pulseinfo.h"
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pulse_nc.h"
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid pulse_nc(
225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16      coef[],
226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const PulseInfo  *pPulseInfo,
227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const FrameInfo  *pLongFrameInfo,
228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int      *max)
229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int index;
231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16 *pCoef;
233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int temp;
234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int *pPulseOffset;
236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int *pPulseAmp;
237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*--- Find the scalefactor band where pulse-encoded data starts ---*/
239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (pPulseInfo->pulse_start_sfb > 0)
241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        index = pLongFrameInfo->win_sfb_top[0][pPulseInfo->pulse_start_sfb - 1];
243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    else
245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        index = 0;
247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*-------------------------------------------------------------------------
250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber      Each pulse index is stored as an offset from the previous pulse
251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber      Example - here we have a sfb that is 20 coefficients in length:
253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber      [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19]
255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber      [ ][ ][ ][ ][ ][P][P][ ][ ][ ][  ][  ][  ][  ][  ][ P][  ][  ][  ][ P]
256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber      The array pointed to by pPulseOffset == [5][1][9][4]
258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber      pPulseAmp is of the same length as pPulseOffset, and contains
260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber      an individual pulse amplitude for each coefficient.
261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    --------------------------------------------------------------------------*/
262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pCoef        = &(coef[index]);
264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPulseOffset = &(pPulseInfo->pulse_offset[0]);
266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPulseAmp    = &(pPulseInfo->pulse_amp[0]);
268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    for (index = pPulseInfo->number_pulse; index > 0; index--)
270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pCoef  += *pPulseOffset++;
272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp = *pCoef;
274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (temp > 0)
276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            temp += *(pPulseAmp++);
278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *pCoef = (Int16)temp;
279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (temp > *max)
280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                *max = temp;
282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        else
285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            temp -= *(pPulseAmp++);
287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *pCoef = (Int16)temp;
288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (-temp > *max)
289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                *max = -temp;
291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    } /* for() */
295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return;
297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* pulse_nc */
299