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