1f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/* ------------------------------------------------------------------
2f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber *
4f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * you may not use this file except in compliance with the License.
6f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * You may obtain a copy of the License at
7f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber *
8f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber *
10f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * Unless required by applicable law or agreed to in writing, software
11f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * express or implied.
14f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * See the License for the specific language governing permissions
15f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * and limitations under the License.
16f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * -------------------------------------------------------------------
17f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber */
18f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*
19f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
20f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Pathname: ./src/hufffac.c
21f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Funtions:
22f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    hufffac
23f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
24f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
25f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber REVISION HISTORY
26f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
27f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:  Modified from original shareware code
28f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
29f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:  Modified to pass variables by reference to eliminate use
30f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber               of global variables.
31f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
32f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: (1) Modified with new templates,
33f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber              (2) Modified variable names for clarity
34f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber              (3) adjusted variables of "for loop"
35f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber              (4) eliminated multiple returns, use return valid
36f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
37f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: (1) Change return logic: 0 if success, 1 if error
38f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber              (2) Define SectInfo structure to store section codebook index
39f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                  and section boundary
40f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber              (3) Substitute "switch" with "if- else if"
41f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber              (4) move BITS *pInputStream to second pass-in parameter
42f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber              (5) pass in huffBookUsed[] to save stack size
43f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
44f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: (1) Remove pass in parameter Hcb pBook
45f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
46f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: Use binary tree search in decode_huff_cw_binary
47f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
48f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: Use decode_huff_scl function.
49f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
50f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Who:                                   Date: MM/DD/YYYY
51f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:
52f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
53f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
54f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
55f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
56f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Inputs:
57f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
58f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    *pFrameInfo     = pointer to structure that holds information
59f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                      of each Frame. type FrameInfo
60f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
61f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    *pInputStream   = pointer to input bitstream. type BITS
62f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
63f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    *pGroup         = pointer to array that contains the index of the first
64f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                      window in each group, type UChar
65f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
66f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    nsect           = number of sections to be decoded. type Int
67f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
68f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    *pSect          = pointer to structure array that contains the huffman
69f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                      codebook index and section boundary for each section,
70f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                      type SectInfo
71f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
72f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    global_gain     = initial value for "DPCM encoded" scalefactors and noise
73f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                      energy, type Int
74f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
75f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    *pFactors       = pointer to array that stores the decoded scalefactors,
76f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                      intensity position or noise energy, type Int
77f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
78f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    huffBookUsed    = array that will hold the huffman codebook index for
79f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                      each sfb, type Int
80f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
81f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    *pBook          = pointer to structure that contains the huffman codebook
82f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                      information, such as dimension, Largest Absolute Value
83f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                      (LAV) of each huffman codebook, etc. type Hcb
84f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
85f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
86f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Local Stores/Buffers/Pointers Needed: None
87f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
88f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Global Stores/Buffers/Pointers Needed: None
89f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
90f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Outputs:
91f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         0 if success
92f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         1 if error
93f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
94f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Pointers and Buffers Modified:
95f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
96f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        Int   *pFactors    contains the newly decoded scalefactors and/or
97f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                             intensity position and/or noise energy level
98f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
99f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Local Stores Modified:
100f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
101f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Global Stores Modified:
102f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
103f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
104f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber FUNCTION DESCRIPTION
105f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
106f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber This function first reads the Huffman codebook index of all sections within
107f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber one Frame. Then, depending on the huffman codebook index of each section,
108f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber the function decodes the scalefactors, and/or intensity positions
109f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber (INTENSITY_HCB, INTENSITY_HCB2), and/or noise energy (NOISE_HCB)
110f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber for every scalefactor band in each section.
111f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber The function returns 0 upon successful decoding, returns 1 if error.
112f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
113f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
114f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber REQUIREMENTS
115f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
116f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber This function should replace the content of the array pFactors with the
117f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber decoded scalefactors and/or intensity positions and/or noise energy
118f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
119f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
120f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber REFERENCES
121f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
122f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber (1) MPEG-2 NBC Audio Decoder
123f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   "This software module was originally developed by AT&T, Dolby
124f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
125f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
126f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   3. This software module is an implementation of a part of one or more
127f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
128f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
129f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   standards free license to this software module or modifications thereof
130f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   for use in hardware or software products claiming conformance to the
131f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
132f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   module in hardware or software products are advised that this use may
133f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   infringe existing patents. The original developer of this software
134f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   module and his/her company, the subsequent editors and their companies,
135f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   and ISO/IEC have no liability for use of this software module or
136f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   modifications thereof in an implementation. Copyright is not released
137f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
138f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   developer retains full right to use the code for his/her own purpose,
139f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   assign or donate the code to a third party and to inhibit third party
140f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
141f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   This copyright notice must be included in all copies or derivative
142f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   works."
143f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   Copyright(c)1996.
144f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
145f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber (2) ISO/IEC 14496-3: 1999(E)
146f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     Subpart 4      p72-73  (scalefactors)
147f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    p76     (decoding)
148f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    p78     (Table 4.6.1, Table 4.6.2)
149f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    p93-94  (INTENSITY_HCB)
150f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    p123    (NOISE_HCB)
151f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
152f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
153f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber PSEUDO-CODE
154f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
155f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber status = SUCCESS;
156f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
157f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber CALL pv_memset(pHuffBookUsed, ZERO_HCB, MAXBANDS*sizeof(*pHuffBookUsed));
158f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
159f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber CALL pv_memset(pFactors, ZERO_HCB, MAXBANDS*sizeof(*pFactors));
160f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
161f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber sect_start       = 0;
162f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
163f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber FOR(sect_idx = nsect; sect_idx > 0; sect_idx--)
164f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber {
165f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     sect_cb  = pSect->sect_cb;
166f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     sect_end = pSect->sect_end;
167f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     pSect++;
168f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
169f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     CALL pv_memset(
170f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        &pHuffBookUsed[sect_start],
171f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        sect_cb,
172f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        (sect_end - sect_start));
173f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
174f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber }
175f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber ENDFOR
176f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
177f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    fac       = global_gain;
178f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    is_pos    = 0;
179f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    noise_nrg = global_gain - NOISE_OFFSET;
180f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
181f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pTable    = pBook[BOOKSCL].pTable;
182f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    group_win  = 0;
183f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    group_end  = 0;
184f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
185f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    WHILE((group_end < pFrameInfo->num_win)&&(status == SUCCESS))
186f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    {
187f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        nsfb_win  = pFrameInfo->sfb_per_win[group_end];
188f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        group_end = *pGroup++;
189f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
190f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        FOR(sfb = 0; sfb < nsfb_win; sfb++)
191f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
192f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            IF ((pHuffBookUsed[sfb] > 0)&&(pHuffBookUsed[sfb] < BOOKSCL))
193f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
194f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                cw_index = CALL decode_huff_cw_binary(pTable, pInputStream);
195f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
196f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                fac      += cw_index - MIDFAC;
197f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
198f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                IF((fac >= 2*TEXP) || (fac < 0))
199f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                {
200f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    status = 1;
201f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                }
202f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                ELSE
203f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                {
204f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    pFactors[sfb] = fac;
205f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                }
206f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                ENDIF (fac)
207f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
208f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            }
209f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            ELSE IF (pHuffBookUsed[sfb] == ZERO_HCB)
210f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
211f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                do nothing;
212f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            }
213f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
214f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            ELSE IF ((pHuffBookUsed[sfb] == INTENSITY_HCB)||
215f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                     (pHuffBookUsed[sfb] == INTENSITY_HCB2))
216f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
217f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                cw_index = CALL decode_huff_cw_binary(pTable, pInputStream);
218f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
219f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                is_pos        += cw_index - MIDFAC;
220f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                pFactors[sfb] =  is_pos;
221f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            }
222f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
223f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            ELSE IF (pHuffBookUsed[sfb] == NOISE_HCB)
224f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
225f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                IF (noise_pcm_flag == TRUE)
226f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                {
227f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    noise_pcm_flag = FALSE;
228f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    dpcm_noise_nrg = CALL getbits(
229f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                              NOISE_PCM_BITS,
230f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                              pInputStream);
231f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
232f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    dpcm_noise_nrg -= NOISE_PCM_OFFSET;
233f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                }
234f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                ELSE
235f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                {
236f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    dpcm_noise_nrg = CALL decode_huff_cw_binary(
237f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                              pTable,
238f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                              pInputStream);
239f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
240f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    dpcm_noise_nrg -= MIDFAC;
241f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                }
242f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                ENDIF (noise_pcm_flag)
243f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
244f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                noise_nrg       += dpcm_noise_nrg;
245f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                pFactors[sfb]   =  noise_nrg;
246f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            }
247f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
248f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            ELSE IF (pHuffBookUsed[sfb] == BOOKSCL)
249f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
250f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                status = 1;
251f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            }
252f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            ENDIF (pHuffBookUsed[sfb])
253f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
254f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        }
255f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        ENDFOR (sfb)
256f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
257f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        IF (pFrameInfo->islong == FALSE)
258f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
259f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
260f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            FOR(group_win++; group_win < group_end; group_win++)
261f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
262f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                FOR (sfb=0; sfb < nsfb_win; sfb++)
263f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                {
264f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    pFactors[sfb + nsfb_win]  =  pFactors[sfb];
265f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                }
266f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                ENDFOR
267f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
268f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                pFactors  +=  nsfb_win;
269f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            }
270f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            ENDFOR
271f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
272f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        }
273f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        ENDIF (pFrameInfo)
274f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
275f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        pHuffBookUsed   += nsfb_win;
276f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        pFactors        += nsfb_win;
277f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
278f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    }
279f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ENDWHILE (group_end)
280f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
281f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    return status;
282f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
283f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
284f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber RESOURCES USED
285f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   When the code is written for a specific target processor the
286f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     the resources used should be documented below.
287f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
288f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent
289f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber          stack usage for each subroutine called]
290f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
291f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     where: [stack usage variable] = stack usage for [subroutine
292f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         name] (see [filename].ext)
293f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
294f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber DATA MEMORY USED: x words
295f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
296f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber PROGRAM MEMORY USED: x words
297f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
298f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable
299f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber           used to represent cycle count for each subroutine
300f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber           called]
301f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
302f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     where: [cycle count variable] = cycle count for [subroutine
303f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        name] (see [filename].ext)
304f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
305f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
306f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber*/
307f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
308f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
309f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
310f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; INCLUDES
311f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
312f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include    "pv_audio_type_defs.h"
313f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include    "aac_mem_funcs.h"       /* pv_memset */
314f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include    "s_frameinfo.h"
315f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include    "s_bits.h"
316f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include    "s_sectinfo.h"
317f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include    "s_huffman.h"
318f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include    "ibstream.h"
319f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
320f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include    "hcbtables.h"
321f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include    "e_huffmanconst.h"
322f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include    "e_infoinitconst.h"
323f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include    "huffman.h"
324f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
325f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
326f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; MACROS
327f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Define module specific macros here
328f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
329f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
330f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
331f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; DEFINES
332f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Include all pre-processor statements here. Include conditional
333f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; compile variables also.
334f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
335f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
336f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
337f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; LOCAL FUNCTION DEFINITIONS
338f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Function Prototype declaration
339f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
340f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
341f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
342f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
343f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Variable declaration - defined here and used outside this module
344f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
345f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
346f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
347f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; EXTERNAL FUNCTION REFERENCES
348f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Declare functions defined elsewhere and referenced in this module
349f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
350f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
351f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
352f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
353f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Declare variables used in this module but defined elsewhere
354f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
355f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
356f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
357f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; FUNCTION CODE
358f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
359f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas HuberInt hufffac(
360f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    FrameInfo   *pFrameInfo,
361f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    BITS        *pInputStream,
362f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int         *pGroup,    /* may be changed to Int */
363f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int         nsect,
364f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    SectInfo    *pSect,     /* may be changed to Int */
365f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int         global_gain,
366f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int         *pFactors,
367f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int         huffBookUsed[])
368f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber{
369f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     sect_idx;
370f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     group_end;  /* index of 1st window in next group */
371f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     group_win;  /* window index within group */
372f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     cw_index;   /* huff codeword index */
373f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     nsfb_win;   /* # of scfbands per window */
374f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     sfb;        /* scalefactor band index */
375f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     sect_cb;    /* huff codebook # for each section */
376f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     fac;        /* decoded scf */
377f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     is_pos;     /* intensity stereo position */
378f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     noise_pcm_flag = TRUE;  /* first PNS sfb */
379f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     dpcm_noise_nrg;     /* dpcm noise energy */
380f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     noise_nrg;      /* noise energy */
381f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     status = SUCCESS;  /* status of decoding */
382f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     *pHuffBookUsed = &huffBookUsed[0];
383f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
384f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
385f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pv_memset(pFactors,
386f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber              ZERO_HCB,
387f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber              MAXBANDS*sizeof(*pFactors));
388f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
389f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
390f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    if (nsect)
391f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    {
392f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /* read section length and codebook */
393f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
394f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        if (nsect == 1) /* long window */
395f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
396f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            sect_cb  = pSect->sect_cb;  /* codebook for this section */
397f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
398f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            /* all sfbs in one section share the same codebook */
399f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
400f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            for (sfb = pSect->sect_end >> 2; sfb != 0; sfb--)
401f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
402f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                *(pHuffBookUsed++) = sect_cb;
403f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                *(pHuffBookUsed++) = sect_cb;
404f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                *(pHuffBookUsed++) = sect_cb;
405f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                *(pHuffBookUsed++) = sect_cb;
406f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            }
407f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            for (sfb = pSect->sect_end & 3; sfb != 0; sfb--)
408f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
409f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                *(pHuffBookUsed++) = sect_cb;
410f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            }
411f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
412f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        }
413f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        else            /* short */
414f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
415f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            Int sect_start = 0; /* start index of sfb for each section */
416f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            for (sect_idx = nsect; sect_idx > 0; sect_idx--)
417f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
418f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                sect_cb  = pSect->sect_cb;  /* codebook for this section */
419f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
420f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                /* all sfbs in one section share the same codebook */
421f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                for (sfb = sect_start; sfb < pSect->sect_end; sfb++)
422f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                {
423f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    pHuffBookUsed[sfb] = sect_cb;
424f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                }
425f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
426f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                pSect++;
427f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                sect_start = sfb;
428f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
429f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            } /* for (sect_idx) */
430f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        }
431f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    }
432f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    else
433f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    {
434f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /* clear array for the case of max_sfb == 0 */
435f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        pv_memset(pHuffBookUsed,
436f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                  ZERO_HCB,
437f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                  MAXBANDS*sizeof(*pHuffBookUsed));
438f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    }
439f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
440f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pHuffBookUsed = &huffBookUsed[0];
441f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
442f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /* scale factors and noise energy are dpcm relative to global gain
443f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     * intensity positions are dpcm relative to zero
444f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     */
445f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    fac       = global_gain;
446f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    is_pos    = 0;
447f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    noise_nrg = global_gain - NOISE_OFFSET;
448f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
449f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /* get scale factors,
450f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     * use reserved Table entry = 12, see reference (2) p78 Table 4.6.2
451f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     */
452f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    group_win  = 0;
453f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    group_end  = 0;
454f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
455f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
456f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /* group by group decoding scalefactors and/or noise energy
457f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     * and/or intensity position
458f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     */
459f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    while ((group_end < pFrameInfo->num_win) && (status == SUCCESS))
460f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    {
461f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        nsfb_win  = pFrameInfo->sfb_per_win[group_end];
462f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        group_end = *pGroup++;  /* index of 1st window in next group */
463f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
464f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /* decode scf in first window of each group */
465f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
466f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        for (sfb = 0; sfb < nsfb_win; sfb++)
467f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
468f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
469f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            switch (pHuffBookUsed[sfb])
470f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
471f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                case ZERO_HCB:
472f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    break;
473f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                case INTENSITY_HCB:
474f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                case INTENSITY_HCB2:
475f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    /* intensity books */
476f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    /* decode intensity position */
477f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    cw_index = decode_huff_scl(pInputStream);
478f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
479f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    is_pos        += cw_index - MIDFAC;
480f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    pFactors[sfb] =  is_pos;
481f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    break;
482f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                case NOISE_HCB:
483f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    /* noise books */
484f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    /* decode noise energy */
485f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    if (noise_pcm_flag == TRUE)
486f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    {
487f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        noise_pcm_flag = FALSE;
488f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        dpcm_noise_nrg = get9_n_lessbits(NOISE_PCM_BITS,
489f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                                                         pInputStream);
490f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
491f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        dpcm_noise_nrg -= NOISE_PCM_OFFSET;
492f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    }
493f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    else
494f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    {
495f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        dpcm_noise_nrg = decode_huff_scl(pInputStream);
496f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
497f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        dpcm_noise_nrg -= MIDFAC;
498f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    } /* if (noise_pcm_flag) */
499f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
500f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    noise_nrg       += dpcm_noise_nrg;
501f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    pFactors[sfb]   =  noise_nrg;
502f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    break;
503f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                case BOOKSCL:
504f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    status = 1; /* invalid books */
505f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    sfb = nsfb_win;  /* force out */
506f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    break;
507f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                default:
508f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    /* spectral books */
509f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    /* decode scale factors */
510f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    cw_index = decode_huff_scl(pInputStream);
511f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
512f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    fac      += cw_index - MIDFAC;   /* 1.5 dB */
513f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    if ((fac >= 2*TEXP) || (fac < 0))
514f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    {
515f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        status = 1;   /* error, MUST 0<=scf<256, Ref. p73 */
516f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    }
517f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    else
518f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    {
519f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        pFactors[sfb] = fac;  /* store scf */
520f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    } /* if (fac) */
521f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            }
522f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
523f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        } /* for (sfb=0), first window decode ends */
524f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
525f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /* expand scf to other windows in the same group */
526f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        if (pFrameInfo->islong == FALSE)
527f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
528f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
529f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            for (group_win++; group_win < group_end; group_win++)
530f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
531f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                for (sfb = 0; sfb < nsfb_win; sfb++)
532f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                {
533f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    pFactors[sfb + nsfb_win]  =  pFactors[sfb];
534f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                }
535f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                pFactors  +=  nsfb_win;
536f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            }
537f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
538f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        } /* if (pFrameInfo->islong), one group decode ends */
539f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
540f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
541f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /* points to next group */
542f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        pHuffBookUsed   += nsfb_win;
543f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        pFactors        += nsfb_win;
544f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
545f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    } /* while (group_end), all groups decode end */
546f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
547f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    return status;
548f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
549f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber} /* hufffac */
550f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
551