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