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/unpack_idx.c
21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Function:  unpack_idx
22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            unpack_idx_sgn
23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            unpack_idx_esc
24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY
27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Modified from original shareware code
29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Eliminated 3 divisions and 1 multiplication through a table
31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber look-up method for calculating 1/mod and constant allocation of 1/mod^3
32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber and 1/mod^2.
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Eliminated 3 additions through simple optimizations in the code.
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Changed if/else  statement to a switch/case utilizing fall-through.
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:   Made changes per review comments.  Main improvements were
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber in change of switch/case to if statement, and use of temporary variable
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber to hold value of *pQuantSpec.
39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: (1) Typecast codeword_indx to Int32 before multiplication, this
41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              assures the shift operation happens on a 32-bit product on
42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              TI-C55x processor.
43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              (2) define temp_spec as Int32 to avoid overflow
44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified per review comments
46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              (1) remove the two typecastings of codeword_indx when
47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  pHuffCodebook->dim == DIMENSION_4
48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              (2) temp_spec is Int because the result never exceeds 16 bits
49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Break up and combine unpack index with sign bit reading and for
51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              special escape code. Parent function must know which one of the
52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              3 functions should be called.
53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Put back if-statement to get the max.
55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: When searching for the max, there was some instances where the
57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              max was compared against a negative number, so the max was never
58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              updated (defaulted to 0), leading to block processing in other
59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              magnitude sensitive stages.
60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who:                       Date:
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs:
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          Int  quant_spec[]  = Array for storage of the quantized
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               spectral coefficients.  Length is either 2 or 4.
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               See Ref #1, Page 76 for a complete description.
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          Int  codeword_indx = The index into the Huffman table.
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               Range is [1-288]
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Hcb *pHuffCodebook = Pointer to HuffmanCodebook information.
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          BITS  *pInputStream = Pointer to the bitstream buffer.
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          Int *max           = Pointer to maximum coefficient value.
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed:
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const UInt div_mod[18]   = An array with the values for 1/mod
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               stored in Q-formats 13.
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed:
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs:
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified:
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int quant_spec[] = Output (the quantized and signed spectral coefficients)
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                       returned via this pointer.
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified:
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified:
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function decodes quantized spectral coefficients and decode their signs
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber from the input bitstream. Quantized spectral coefficients are transmitted as
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber four-tuples or 2-tuples, and this information is conveyed to the function via
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the variable HuffCodebook->dim.
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber See Reference #1 for a complete description
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function shall correctly calculate pQuantSpec[], given the inputs
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx     = {1-288};
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber HuffCodebook->off = {0, 1, 4};
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber HuffCodebook->mod = {3, 8, 9, 13, 17};
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber mod =   LAV + 1 if unsigned codebook
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber mod = 2*LAV + 1 if   signed codebook
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Range of values for LAV is {2,7,12,16} if unsigned
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            {1,4}       if   signed
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Additionally,
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     LAV <= 2 if dim == 4
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This restricts mod ==  3                if dim == 4
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            and mod == {3, 8, 9, 13, 17} if dim == 2
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function will NOT function correctly if fed values that do not
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber meet the requirements as stated above.
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This limitation on the range of values was determined by analysis
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber of Reference #1 (see below.)
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) ISO/IEC 14496-3:1999(E)
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     Part 3
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Subpart 4.6.3.3   Decoding Process
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Subpart 4.6.4     Tables
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) MPEG-2 NBC Audio Decoder
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   "This software module was originally developed by AT&T, Dolby
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   3. This software module is an implementation of a part of one or more
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   standards free license to this software module or modifications thereof
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for use in hardware or software products claiming conformance to the
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module in hardware or software products are advised that this use may
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   infringe existing patents. The original developer of this software
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module and his/her company, the subsequent editors and their companies,
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   and ISO/IEC have no liability for use of this software module or
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   modifications thereof in an implementation. Copyright is not released
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   developer retains full right to use the code for his/her  own purpose,
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   assign or donate the code to a third party and to inhibit third party
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   This copyright notice must be included in all copies or derivative
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   works."
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Copyright(c)1996.
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    IF (pHuffCodebook->dim == 4)
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pQuantSpec) = codeword_indx/(3^3);
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        codeword_indx = codeword_indx - *(pQuantSpec)*(3^3);
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pQuantSpec) = *(pQuantSpec) - off;
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pQuantSpec    = pQuantSpec + 1;
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pQuantSpec) = codeword_indx/(3^2);
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        codeword_indx = codeword_indx - *(pQuantSpec)*(3^2);
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pQuantSpec) = *(pQuantSpec) - off;
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pQuantSpec    = pQuantSpec + 1;
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ENDIF
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pQuantSpec) = codeword_indx/mod;
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        codeword_indx = codeword_indx - (*pQuantSpec)*mod;
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pQuantSpec) = *(pQuantSpec) - off;
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pQuantSpec    = pQuantSpec + 1;
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pQuantSpec) = codeword_indx - off;
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   When the code is written for a specific target processor the
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     the resources used should be documented below.
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          stack usage for each subroutine called]
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [stack usage variable] = stack usage for [subroutine
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         name] (see [filename].ext)
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words
202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words
204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable
206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           used to represent cycle count for each subroutine
207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           called]
208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [cycle count variable] = cycle count for [subroutine
210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        name] (see [filename].ext)
211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/
214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES
218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h"
220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_hcb.h"
221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "ibstream.h"
222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "unpack_idx.h"
223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "fxp_mul32.h"
225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here
230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define DIV_3_CUBED    19  /* 19 = 1/27 in Q-9 format    */
238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define THREE_CUBED    27  /* 27 = 3^3                   */
239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define DIV_3_SQUARED  57  /* 57 = 1/9  in Q-9 format    */
241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define THREE_SQUARED   9  /*  9 = 3^2                   */
242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define Q_FORMAT_MOD   13  /* Q-format for 1/mod table   */
244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define Q_FORMAT_MOD2   9  /* Q-format for DIV_3_SQUARED */
245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define Q_FORMAT_MOD3   9  /* Q-format for DIV_3_CUBED   */
246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define LOWER_5_BITS_MASK 0x1F
248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if ( defined(PV_ARM_V5) || defined(PV_ARM_V4))
251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber__inline Int32 abs1(Int32 x)
253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 z;
255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        z = x - (x<0);
257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        x = z ^ sign(z)
258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     */
259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    __asm
260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        sub  z, x, x, lsr #31
262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        eor  x, z, z, asr #31
263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return (x);
265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define pv_abs(x)   abs1(x)
268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else
271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define pv_abs(x)   ((x) > 0)? (x) : (-x)
273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*--------------------------------------------------------------------------
288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Possible values for mod = {3,8,9,13,17}
289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    There exists "empty" spaces in the table.  These can potentially
291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    be utilized by other const tables, if available memory becomes an issue.
292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber---------------------------------------------------------------------------*/
293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberconst Int div_mod[18] =   /*   mod   index  Q-format */
295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* ----------------------- */
297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    0xCC,                 /* |      |  0  |          */
298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    0xCC,                 /* |      |  1  |          */
299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    0xCC,                 /* |      |  2  |          */
300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    2731,                 /* |  3   |  3  |   13     */
301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    0xCC,                 /* |      |  4  |          */
302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    0xCC,                 /* |      |  5  |          */
303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    0xCC,                 /* |      |  6  |          */
304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    0xCC,                 /* |      |  7  |          */
305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    1025,                 /* |  8   |  8  |   13     */
306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    911,                 /* |  9   |  9  |   13     */
307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    0xCC,                 /* |      | 10  |          */
308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    0xCC,                 /* |      | 11  |          */
309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    0xCC,                 /* |      | 12  |          */
310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    631,                 /* |  13  | 13  |   13     */
311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    0xCC,                 /* |      | 14  |          */
312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    0xCC,                 /* |      | 15  |          */
313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    0xCC,                 /* |      | 16  |          */
314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    482,                 /* |  17  | 17  |   13     */
315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber};
316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid unpack_idx(
331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16   quant_spec[],
332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int codeword_indx,
333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Hcb   *pHuffCodebook,
334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    BITS  *pInputStream,
335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int *max)
336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16 *pQuantSpec = &quant_spec[0];
338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int  temp_spec;
339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int mod = pHuffCodebook->mod;
341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int off = pHuffCodebook->off;
342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    OSCL_UNUSED_ARG(pInputStream);
344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (pHuffCodebook->dim == DIMENSION_4)
347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* Calculate pQuantSpec[0] */
349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp_spec      = (codeword_indx * DIV_3_CUBED) >> Q_FORMAT_MOD3;
351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        codeword_indx -= temp_spec * THREE_CUBED;
353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp_spec -= off;
355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *pQuantSpec++  = (Int16)temp_spec;
356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp_spec = pv_abs(temp_spec);
358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (temp_spec > *max)
360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *max = temp_spec;
362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* Calculate pQuantSpec[1] */
365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp_spec      = (codeword_indx * DIV_3_SQUARED) >> Q_FORMAT_MOD2;
366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        codeword_indx -= temp_spec * THREE_SQUARED;
368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp_spec -= off;
370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *pQuantSpec++  = (Int16)temp_spec;
371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp_spec = pv_abs(temp_spec);
373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (temp_spec > *max)
375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *max = temp_spec;
377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *  Calculate pQuantSpec[2] if dim == 4
382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *  Calculate pQuantSpec[0] if dim == 2
383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     */
384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp_spec      = ((Int32) codeword_indx * div_mod[mod]) >> Q_FORMAT_MOD;
386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    codeword_indx -= temp_spec * mod;
388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp_spec -= off;
390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    *pQuantSpec++  = (Int16)temp_spec;
391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp_spec = pv_abs(temp_spec);
393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (temp_spec > *max)
396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *max = temp_spec;
398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    *  Calculate pQuantSpec[3] if dim == 4
402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    *  Calculate pQuantSpec[1] if dim == 2
403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    */
404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    codeword_indx -= off;
405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    *pQuantSpec    = (Int16)codeword_indx ;
406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    codeword_indx = pv_abs(codeword_indx);
409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (codeword_indx > *max)
411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *max = codeword_indx;
413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return ;
417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* unpack_idx */
418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid unpack_idx_sgn(
421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16   quant_spec[],
422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int codeword_indx,
423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Hcb   *pHuffCodebook,
424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    BITS  *pInputStream,
425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int *max)
426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16 *pQuantSpec = &quant_spec[0];
428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int  temp_spec;
429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int  sgn;
430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int mod = pHuffCodebook->mod;
432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int off = pHuffCodebook->off;
433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (pHuffCodebook->dim == DIMENSION_4)
437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* Calculate pQuantSpec[0] */
439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        preload_cache((Int32 *)pQuantSpec);
440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp_spec      = (codeword_indx * DIV_3_CUBED) >> Q_FORMAT_MOD3;
441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        codeword_indx -= temp_spec * THREE_CUBED;
443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp_spec -= off;
445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (temp_spec)
446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            sgn = get1bits(pInputStream);
448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *pQuantSpec++ = (Int16)((sgn) ? -temp_spec : temp_spec);
451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            temp_spec = pv_abs(temp_spec);
453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (temp_spec > *max)
455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                *max = temp_spec;
457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        else
461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *pQuantSpec++ = 0;
463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* Calculate pQuantSpec[1] */
466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp_spec      = (codeword_indx * DIV_3_SQUARED) >> Q_FORMAT_MOD2;
467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        codeword_indx -= temp_spec * THREE_SQUARED;
469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp_spec -= off;
471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (temp_spec)
472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            sgn = get1bits(pInputStream);
475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *pQuantSpec++ = (Int16)((sgn) ? -temp_spec : temp_spec);
477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            temp_spec = pv_abs(temp_spec);
479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (temp_spec > *max)
481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                *max = temp_spec;
483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        else
486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *pQuantSpec++ = 0;
488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *  Calculate pQuantSpec[2] if dim == 4
493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *  Calculate pQuantSpec[0] if dim == 2
494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     */
495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp_spec      = ((Int32) codeword_indx * div_mod[mod]) >> Q_FORMAT_MOD;
497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    codeword_indx -= temp_spec * mod;
499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp_spec -= off;
501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (temp_spec)
502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        sgn = get1bits(pInputStream);
505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *pQuantSpec++ = (Int16)((sgn) ? -temp_spec : temp_spec);
507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp_spec = pv_abs(temp_spec);
509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (temp_spec > *max)
511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *max = temp_spec;
513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    else
516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *pQuantSpec++ = 0;
518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *  Calculate pQuantSpec[3] if dim == 4
522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *  Calculate pQuantSpec[1] if dim == 2
523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     */
524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    codeword_indx -= off;
525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (codeword_indx)
526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        sgn = get1bits(pInputStream);
529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *pQuantSpec = (Int16)((sgn) ? -codeword_indx : codeword_indx);
531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        codeword_indx = pv_abs(codeword_indx);
533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (codeword_indx > *max)
535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *max = codeword_indx;
537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    else
540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *pQuantSpec = 0;
542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return ;
545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* unpack_idx_sgn */
546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid unpack_idx_esc(
549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16   quant_spec[],
550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int codeword_indx,
551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Hcb   *pHuffCodebook,
552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    BITS  *pInputStream,
553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int *max)
554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int  temp_spec;
556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int  sgn1 = 0, sgn2 = 0;
557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int N;
558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 esc_seq;
559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int mod = pHuffCodebook->mod;
561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int off = pHuffCodebook->off;
562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp_spec      = ((Int32) codeword_indx * div_mod[mod]) >> Q_FORMAT_MOD;
565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    codeword_indx -= temp_spec * mod;
567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp_spec -= off;
569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (temp_spec)
570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        sgn1 = get1bits(pInputStream);
572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    codeword_indx -= off;
575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (codeword_indx)
576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        sgn2 = get1bits(pInputStream);
578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if ((temp_spec & LOWER_5_BITS_MASK) == 16)
582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        N = 3;
584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        do
585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            N++;
587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            esc_seq = get1bits(pInputStream);
589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        while (esc_seq != 0);
592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        esc_seq  = getbits(N, pInputStream);
594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        esc_seq += (1 << N);
596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp_spec = (Int)((temp_spec * esc_seq) >> 4);
599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (sgn1)
604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
605dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        quant_spec[0]  = (Int16)(-temp_spec);
606dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
607dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    else
608dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
609dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        quant_spec[0]  = (Int16)temp_spec;
610dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
611dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
612dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    temp_spec = pv_abs(temp_spec);
613dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
614dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (temp_spec > *max)
615dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
616dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *max = temp_spec;
617dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
618dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
619dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if ((codeword_indx & LOWER_5_BITS_MASK) == 16)
620dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
621dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        N = 3;
622dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        do
623dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
624dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            N++;
625dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
626dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            esc_seq = get1bits(pInputStream);
627dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
628dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
629dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        while (esc_seq != 0);
630dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
631dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        esc_seq  = getbits(N, pInputStream);
632dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
633dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        esc_seq += (1 << N);
634dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
635dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        codeword_indx = (Int)((codeword_indx * esc_seq) >> 4);
636dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
637dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
638dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
639dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
640dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
641dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (sgn2)
642dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
643dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        quant_spec[1]    = (Int16)(-codeword_indx);
644dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
645dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    else
646dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
647dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        quant_spec[1]    = (Int16)codeword_indx;
648dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
649dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
650dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
651dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    codeword_indx = pv_abs(codeword_indx);
652dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
653dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (codeword_indx > *max)
654dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
655dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *max = codeword_indx;
656dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
657dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
658dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
659dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return ;
660dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* unpack_idx_esc */
661