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