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_pulse_data.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: Put into PV format
31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 1) Change loop to use pointers.
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              2) Rename to from get_nec_nc to get_pulse_data
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Changes per code review
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              1) Fix pathname
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              2) Read in two fields to save call to getbits
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              3) Change how pPulseInfo->number_pulse is stored.
39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Placed typecast to Int in places where UInt->Int
41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Replace some instances of getbits to get9_n_lessbits
43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              when the number of bits read is 9.
44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who:                                  Date:
46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS
49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs:
51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     pInputStream = pointer to a BITS structure, used by the function getbits
52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                   to provide data. Data type pointer to BITS structure
53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     pPulseInfo   = pointer to pulse data structure to be filled with data
55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    concerning pulses in the frequency domain.
56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Data type pointer to PulseInfo
57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed: None
59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed: None
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs:
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     status       = return value, zero signifies success, non-zero otherwise.
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Presently this function only returns a success, error
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    checking may be added later.
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Data type Int.
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified:
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPulseInfo contents are updated with pulse information. Specifically,
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPulseInfo->number_pulse with the number of pulses found, and
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPulseInfo->pulse_start_sfb is set to the first scale factor band.
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Then pPulseInfo->pulse_offset and pPulseInfo->pulse_amp are filled
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    with data. For these array, only the number of pulses defined will be
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    set, those values beyond the number of pulses will retain their previous
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    value and should not be read from.
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Note: The value in pPulseInfo->number_pulse is different by a value of
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          one from the original ISO code.
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pInputBuffer contents are updated to the next location to be read from
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        the input stream.
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified: None
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified: None
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function fills in the pulse data structure with information to be used
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber later for restoring pulses in the spectrum.
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function shall not use global or static variables.
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber  (1) ISO/IEC 13818-7:1997 Titled "Information technology - Generic coding
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber      of moving pictures and associated audio information - Part 7: Advanced
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber      Audio Coding (AAC)", Table 6.17 - Syntax of pulse_data(),
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber      page 15, and section 9.3 "Decoding process", starting on page 41.
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) MPEG-2 NBC Audio Decoder
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   "This software module was originally developed by AT&T, Dolby
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   3. This software module is an implementation of a part of one or more
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   standards free license to this software module or modifications thereof
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for use in hardware or software products claiming conformance to the
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module in hardware or software products are advised that this use may
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   infringe existing patents. The original developer of this software
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module and his/her company, the subsequent editors and their companies,
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   and ISO/IEC have no liability for use of this software module or
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   modifications thereof in an implementation. Copyright is not released
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   developer retains full right to use the code for his/her own purpose,
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   assign or donate the code to a third party and to inhibit third party
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   This copyright notice must be included in all copies or derivative
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   works."
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Copyright(c)1996.
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    status = SUCCESS;
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    CALL getbits(neededBits = LEN_PULSE_NPULSE + LEN_PULSE_ST_SFB,
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 pInputStream = pInputStream)
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    MODIFYING(*pInputStream)
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    RETURNING(temp)
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPulseInfo->number_pulse = 1 + (temp >> LEN_PULSE_ST_SFB);
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPulseInfo->pulse_start_sfb = temp & ((1 << LEN_PULSE_ST_SFB) - 1);
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPulseOffset = &pPulseInfo->pulse_offset[0];
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPulseAmp    = &pPulseInfo->pulse_amp[0];
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    FOR (i = PulseInfo->number_pulse; i > 0; i--)
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        CALL getbits(neededBits = LEN_PULSE_POFF + LEN_PULSE_PAMP,
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     pInputStream = pInputStream)
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        MODIFYING(*pInputStream)
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        RETURNING(temp)
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *pPulseOffset++ = temp >> LEN_PULSE_PAMP;
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *pPulseAmp++    = temp & ((1 << LEN_PULSE_PAMP) - 1);
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    END FOR
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    MODIFYING (*pInputStream)
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    MODIFYING (*pPulseInfo)
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    RETURN status
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   When the code is written for a specific target processor the
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     the resources used should be documented below.
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          stack usage for each subroutine called]
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [stack usage variable] = stack usage for [subroutine
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         name] (see [filename].ext)
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           used to represent cycle count for each subroutine
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           called]
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [cycle count variable] = cycle count for [subroutine
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        name] (see [filename].ext)
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h"
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "ibstream.h"
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_pulseinfo.h"
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_bits.h"
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "e_rawbitstreamconst.h"
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "get_pulse_data.h"
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here
202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL VARIABLE DEFINITIONS
217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL VARIABLES REFERENCES
227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
233dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberInt get_pulse_data(
234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    PulseInfo   *pPulseInfo,
235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    BITS        *pInputStream)
236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int   i;
238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int  *pPulseOffset;
239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int  *pPulseAmp;
240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int   status = SUCCESS;
241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UInt  temp;
242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     * Read in both field fields at once to save cycles. These are the
245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     * original lines of code:
246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     * pPulseInfo->number_pulse = getbits(LEN_PULSE_NPULSE, pInputStream);
247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     * pPulseInfo->pulse_start_sfb = getbits(LEN_PULSE_ST_SFB, pInputStream);
248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     */
249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp =
251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        get9_n_lessbits(
252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            LEN_PULSE_NPULSE + LEN_PULSE_ST_SFB,
253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pInputStream);
254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPulseInfo->number_pulse = (Int)(1 + (temp >> LEN_PULSE_ST_SFB));
256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPulseInfo->pulse_start_sfb = (Int)(temp & ((1 << LEN_PULSE_ST_SFB) - 1));
257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPulseOffset = &pPulseInfo->pulse_offset[0];
259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pPulseAmp    = &pPulseInfo->pulse_amp[0];
260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     * This loop needs to count one more than the number read in from
263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     * the bitstream - look at reference [1].
264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     */
265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    for (i = pPulseInfo->number_pulse; i > 0; i--)
267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         * Read in both fields. Original lines:
270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  *pPulseOffset++ = getbits(LEN_PULSE_POFF, pInputStream);
271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  *pPulseAmp++    = getbits(LEN_PULSE_PAMP, pInputStream);
272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp =
275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            get9_n_lessbits(
276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                LEN_PULSE_POFF + LEN_PULSE_PAMP,
277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pInputStream);
278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *pPulseOffset++ = (Int)(temp >> LEN_PULSE_PAMP);
280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *pPulseAmp++    = (Int)(temp & ((1 << LEN_PULSE_PAMP) - 1));
282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return (status);
285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
287