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