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: getmask.c
21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY
24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Modified from original shareware code
26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Modified to pass variables by reference to eliminate use
28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber               of global variables.
29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber               Replaced for-loop style memory initialization with memset()
30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: (1) Modified to bring code in-line with PV standard
32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              (2) Removed multiple returns, Replaced multiple 'if's with
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  switch
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: (1) Modified per review comments
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              (2) increment pointer pMask after memset
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Make the maximum number of bits requested from getbits
39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              become a constant.
40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Typecast 1 to UInt32 for bitmask to avoid masking on a 16-bit
42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              platform
43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Replace some instances of getbits to get9_n_lessbits
45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber              when the number of bits read is 9 or less.
46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who:                                   Date: MM/DD/YYYY
48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS
52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs:
54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pFrameInfo  = pointer to structure that holds information for current
55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      frame, Type FrameInfo
56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pInputStream= pointer to structure that holds input stream information
58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      Type BITS
59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pGroup      = pointer to array that holds the stop window index for
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      each group in current frame, Type Int
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        max_sfb     = number of active sfbs for each window, Type Int
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        mask[]      = array that holds the MS_mask information
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                      Type Int
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed:
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed:
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs:
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    mask_present = 0    (no Mid/Side mixed)
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                   2    (Mid/Side mixed present for entire frame)
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                   1    (Mid/Side mixed information read from bitstream)
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                   -1   (invalid mask_present read from bitstream)
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified:
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pMask   contents replaced by MS information of each scalefactor band
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified:
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified:
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function reads the Mid/Side(MS) mask information from the input
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber bitstream. If the mask_present field is equal to 2, the mask bits is set to
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1 for the entire frame. If mask_present has a value of 0, the function
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber returns 0, If mask_present is set to 1, the Mid/Side(MS) information is
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber read from the input stream. When mask_present is 3, an error code (-1) is
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber generated.
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber The Mid/Side(MS) information is later used for mixing the left and right
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber channel sounds. Each scalefactor band has its own MS information.
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (ISO comments: read a synthesis mask,  read a synthesis mask uses
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                EXTENDED_MS_MASK and grouped mask )
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function shall replace the contents of pMask with the MS information
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber of each scalefactor band
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) MPEG-2 NBC Audio Decoder
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   "This software module was originally developed by AT&T, Dolby
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   3. This software module is an implementation of a part of one or more
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   standards free license to this software module or modifications thereof
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for use in hardware or software products claiming conformance to the
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module in hardware or software products are advised that this use may
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   infringe existing patents. The original developer of this software
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module and his/her company, the subsequent editors and their companies,
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   and ISO/IEC have no liability for use of this software module or
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   modifications thereof in an implementation. Copyright is not released
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   developer retains full right to use the code for his/her own purpose,
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   assign or donate the code to a third party and to inhibit third party
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   This copyright notice must be included in all copies or derivative
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   works."
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Copyright(c)1996.
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) ISO/IEC 14496-3: 1999(E)
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Subpart 4
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    p15     (Table 4.4.5    getmask)
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    CALL getbits(LEN_MASK_PRES, pInputStream)
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    MODIFYING (pInputStream)
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    RETURNING (mask present information)
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    mask_present = mask present information
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    SWITCH (mask_present)
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        CASE (0):
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            BREAK;
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        CASE (2):
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            nwin = pFrameInfo->num_win;
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            FOR(win = 0; win < nwin; win = *(pGroup++))
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                FOR(sfb = pFrameInfo->sfb_per_win[win]; sfb > 0; sfb--)
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    *(pMask++) = 1;
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                ENDFOR
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            ENDFOR
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            BREAK;
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        CASE(1):
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            nwin = pFrameInfo->num_win;
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                nToDo = max_sfb;
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                WHILE (nToDo > 0)
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    nCall = nToDo;
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    IF (nCall > MAX_GETBITS)
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    THEN
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        nCall = MAX_GETBITS;
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    ENDIF
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    tempMask =
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        getbits(
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            nCall,
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            pInputStream);
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    bitmask = 1 << (nCall - 1);
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    FOR (sfb = nCall; sfb > 0; sfb--)
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                       *(pMask++) = (tempMask & bitmask) >> (sfb - 1);
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        bitmask >>= 1;
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    ENDFOR
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    nToDo -= nCall;
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                END WHILE
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                pv_memset(
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pMask,
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    0,
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    (pFrameInfo->sfb_per_win[win]-max_sfb)*sizeof(*pMask));
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            ENDFOR (win)
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            BREAK
201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        DEFAULT:
203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            mask_present = -1
204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ENDSWITCH
206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    RETURN  mask_present
208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/
211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES
215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "pv_audio_type_defs.h"
217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "huffman.h"
218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "aac_mem_funcs.h"
219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "e_maskstatus.h"
220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here
224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
255dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberInt getmask(
256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    FrameInfo   *pFrameInfo,
257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    BITS        *pInputStream,
258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int         group[],
259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int         max_sfb,
260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int         mask[])
261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     win; /* window index */
264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     sfb;
265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     mask_present;
266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int    *pMask;
267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int    *pGroup;
268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     nwin;
269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     nCall;
270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     nToDo;
271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UInt32  tempMask;
272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UInt32  bitmask;
273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pMask  = mask;
275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pGroup = group;
276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    mask_present =
278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        get9_n_lessbits(
279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            LEN_MASK_PRES,
280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pInputStream);
281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    switch (mask_present)
283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        case(MASK_NOT_PRESENT):
285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* special EXTENDED_MS_MASK cases */
286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* no ms at all */
287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            break;
288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        case(MASK_ALL_FRAME):
290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* MS for whole spectrum on, mask bits set to 1 */
291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            nwin = pFrameInfo->num_win;
292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            for (win = 0; win < nwin; win = *(pGroup++))
293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                for (sfb = pFrameInfo->sfb_per_win[win]; sfb > 0; sfb--)
295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    *(pMask++) = 1; /* cannot use memset for Int type */
297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            break;
302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        case(MASK_FROM_BITSTREAM):
304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* MS_mask_present==1, get mask information*/
305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            nwin = pFrameInfo->num_win;
306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            for (win = 0; win < nwin; win = *(pGroup++))
307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /*
309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * the following code is equivalent to
310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *
311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * for(sfb = max_sfb; sfb > 0; sfb--)
312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * {
313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *   *(pMask++) =
314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *       getbits(
315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *           LEN_MASK,
316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *           pInputStream);
317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * }
318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *
319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * in order to save the calls to getbits, the above
320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * for-loop is broken into two parts
321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 */
322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                nToDo = max_sfb;
324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                while (nToDo > 0)
326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    nCall = nToDo;
328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (nCall > MAX_GETBITS)
330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        nCall = MAX_GETBITS;
332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    tempMask =
335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        getbits(
336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            nCall,
337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            pInputStream);
338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    bitmask = (UInt32) 1 << (nCall - 1);
340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    for (sfb = nCall; sfb > 0; sfb--)
341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *(pMask++) = (Int)((tempMask & bitmask) >> (sfb - 1));
343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        bitmask >>= 1;
344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    nToDo -= nCall;
347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /*
350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * set remaining sfbs to zero
351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * re-use nCall to save one variable on stack
352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 */
353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                nCall = pFrameInfo->sfb_per_win[win] - max_sfb;
355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                if (nCall >= 0)
358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pv_memset(pMask,
360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                              0,
361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                              nCall*sizeof(*pMask));
362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pMask += nCall;
364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                else
366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    mask_present = MASK_ERROR;
368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    break;
369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            } /* for (win) */
373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            break;
375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        default:
377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* error */
378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            break;
379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    } /* switch (mask_present) */
381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return mask_present;
383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* getmask */
385