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/huffcb.c
21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Funtions:
22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    huffcb
23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY
27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Modified from original shareware code
29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Modified to pass variables by reference to eliminate use
31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber               of global variables.
32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Change variable names for clarity,
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber               change variables 'base', 'sect_len_inc', and 'esc_val' to
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber               UChar type.
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Add "if ((pSect[-1] % sfb_per_win) > max_sfb)" statement to
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber               detect the error condition.
39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber               add more white space.
40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: eliminated "pSect[-1]%sfb_per_win" operation
42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: eliminated "pSect[-1]%sfb_per_win" operation
44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: (1) Pass in SectInfo pSect
46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              (2) put BITS *pInputStream as second parameter
47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Fix a failure for thrid party AAC encoding.
49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber               The problem came when the total and the
50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber               maximun number of active scale factor bands do not coincide.
51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber               This is a rare situation but produces a problem when decoding
52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber               encoders that tolerate this.
53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Replace some instances of getbits to get9_n_lessbits
55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              when the number of bits read is 9 or less and get1bits
56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              when only 1 bit is read.
57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs:
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UChar   *pSect  = pointer to array that contains the interleaved
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      information of huffman codebook index and section
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      length. Array contains:
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      [codebook index]
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      [section boundary]
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      [codebook index]
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      [section boundary]
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      ...
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     sectbits  =   array that defines the number of bits
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          used for expressing the escape value of
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                          section length
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     tot_sfb     = total number of sfb in one Frame
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     sfb_per_win = number of sfb in each sub-block (window)
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UChar   max_sfb     = 1 + number of active sfbs - see reference (2) p56
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    BITS    *pInputStream = pointer to input stream
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed:
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UChar    base     = number of sfb in already detected sections
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UChar    sect_len_inc = section length increment in number of sfbs'
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UChar    esc_val  = escape value for section length
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     bits     = number of bits needed for expressing section length
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed:
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs:
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    num_sect = total number of sections in one frame
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified:
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UChar    *pSect = pointer to array where huffman codebook index and
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     section length are stored
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified:
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified:
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Background knowledge: 1024(960) coef's are separated into several sections,
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber each section is encoded with one single Huffman codebook, and each section
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber has a length of multiples of sfb.
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber max_sfb <= sfb_per_win <= tot_sfb
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tot_sfb = total number of scalefactor bands in one frame (1024 coefs)
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function reads the codebook index and section boundaries (expressed
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber in number of sfb) from the input bitstream, store these information in
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pSect, and return the number of sections been detected. Returns 0 if there
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber is an error.
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function should fill the array *pSect with section Huffman codebook
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber indexes and section boundaries
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) MPEG-2 NBC Audio Decoder
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   "This software module was originally developed by AT&T, Dolby
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   3. This software module is an implementation of a part of one or more
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   standards free license to this software module or modifications thereof
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for use in hardware or software products claiming conformance to the
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module in hardware or software products are advised that this use may
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   infringe existing patents. The original developer of this software
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module and his/her company, the subsequent editors and their companies,
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   and ISO/IEC have no liability for use of this software module or
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   modifications thereof in an implementation. Copyright is not released
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   developer retains full right to use the code for his/her own purpose,
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   assign or donate the code to a third party and to inhibit third party
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   This copyright notice must be included in all copies or derivative
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   works."
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Copyright(c)1996.
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) ISO/IEC 14496-3 1999(E)
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Subpart 4    p55     (Recovering section_data())
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                p24-25  (Syntax of section_data())
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (3) M. Bosi, K. Brandenburg, etc., "ISO/IEC MPEG-2 Advanced Audio Coding,"
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     J. Audio Eng. Soc., Vol.45, No.10, 1997 October
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber bits_needed_for_ESC  = sectbits[0];
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ESC_value            = (1<<bits_needed_for_ESC) - 1;
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber num_of_section       = 0;
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR (base = 0; base<total_sfb AND num_of_section<total_sfb)
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber {
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    *pSect++     = getbits(LEN_CB, pInputStream);   (read huffman_codebook_num)
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    sect_length_incr  = getbits(bits_needed_for_ESC, pInputStream);
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    WHILE (sect_length_incr == ESC_value AND base < total_sfb)
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        base              += ESC_value;
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        sect_length_incr  =  getbits(bits_needed_for_ESC, ebits);
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ENDWHILE
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    base      += sect_length_incr;
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    *pSect++   =  base;
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    num_of_section++;
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   IF (num_of_sfb_for_this_group==max_sfb)
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   {
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *pSect++    = 0; (use huffman codebook 0)
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        base       += sfb_per_win - max_sfb;
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *pSect++    = base;
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        num_of_section++;
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   }
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   ENDIF
201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   IF (num_of_sfb_for_this_group > max_sfb)
203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        break;
204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   ENDIF
205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber }
207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR
208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (base != total_sfb OR num_of_section>total_sfb)
210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber      return 0;
211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF
212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return num_sect;
214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED
217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   When the code is written for a specific target processor the
218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     the resources used should be documented below.
219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent
221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          stack usage for each subroutine called]
222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [stack usage variable] = stack usage for [subroutine
224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         name] (see [filename].ext)
225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words
227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words
229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable
231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           used to represent cycle count for each subroutine
232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           called]
233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [cycle count variable] = cycle count for [subroutine
235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        name] (see [filename].ext)
236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/
239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES
243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "pv_audio_type_defs.h"
245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "huffman.h"
246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here
250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
283dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberInt huffcb(
284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    SectInfo    *pSect,
285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    BITS        *pInputStream,
286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int         sectbits[],
287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int         tot_sfb,
288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int         sfb_per_win,
289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int         max_sfb)
290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*----------------------------------------------------------------------------
292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; Define all local variables
293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ----------------------------------------------------------------------------*/
294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int   base;        /* section boundary */
296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int   sect_len_incr;
297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int   esc_val;     /* ESC of section length = 31(long), =7 (short) */
298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     bits;        /* # of bits used to express esc_val */
299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     num_sect;
300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     active_sfb;
301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int   group_base;
302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*----------------------------------------------------------------------------
305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ; Function body here
306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ----------------------------------------------------------------------------*/
307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    bits       =  sectbits[0];     /* 3 for SHORT_WIN, 5 for LONG_WIN */
309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    esc_val    = (1 << bits) - 1;   /* ESC_value for section length */
310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    num_sect   =  0;
311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    base       =  0;
312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    group_base =  0;
313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* read until the end of one frame */
315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    while ((base < tot_sfb) && (num_sect < tot_sfb))
316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pSect->sect_cb  = get9_n_lessbits(
319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                              LEN_CB,
320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                              pInputStream); /* section codebook */
321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        sect_len_incr   = get9_n_lessbits(
323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                              bits,
324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                              pInputStream); /* length_incr */
325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* read until non-ESC value, see p55 reference 2 */
328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        while ((sect_len_incr == esc_val) && (base < tot_sfb))
329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            base            +=  esc_val;
331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            sect_len_incr   = get9_n_lessbits(
333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                  bits,
334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                  pInputStream);
335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        base      += sect_len_incr;
338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pSect->sect_end  =  base; /* total # of sfb until current section */
339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pSect++;
340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        num_sect++;
341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* active_sfb = base % sfb_per_win; */
343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        active_sfb = base - group_base;
344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  insert a zero section for regions above max_sfb for each group
347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  Make sure that active_sfb is also lesser than tot_sfb
348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if ((active_sfb == max_sfb) && (active_sfb < tot_sfb))
351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            base      += (sfb_per_win - max_sfb);
353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pSect->sect_cb   =   0; /* huffman codebook 0 */
354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pSect->sect_end  =   base;
355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            num_sect++;
356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pSect++;
357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            group_base = base;
358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        else if (active_sfb > max_sfb)
360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* within each group, the sections must delineate the sfb
362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * from zero to max_sfb so that the 1st section within each
363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * group starts at sfb0 and the last section ends at max_sfb
364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * see p55 reference 2
365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            break;
367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    } /* while (base=0) */
370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (base != tot_sfb || num_sect > tot_sfb)
373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        num_sect = 0;   /* error */
375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return num_sect;
378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* huffcb */
380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
382