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/hufffac.c 21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Funtions: 22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber hufffac 23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY 26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified from original shareware code 28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified to pass variables by reference to eliminate use 30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber of global variables. 31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: (1) Modified with new templates, 33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) Modified variable names for clarity 34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (3) adjusted variables of "for loop" 35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (4) eliminated multiple returns, use return valid 36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: (1) Change return logic: 0 if success, 1 if error 38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) Define SectInfo structure to store section codebook index 39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber and section boundary 40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (3) Substitute "switch" with "if- else if" 41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (4) move BITS *pInputStream to second pass-in parameter 42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (5) pass in huffBookUsed[] to save stack size 43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: (1) Remove pass in parameter Hcb pBook 45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Use binary tree search in decode_huff_cw_binary 47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Use decode_huff_scl function. 49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who: Date: MM/DD/YYYY 51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS 55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs: 57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pFrameInfo = pointer to structure that holds information 59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber of each Frame. type FrameInfo 60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pInputStream = pointer to input bitstream. type BITS 62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pGroup = pointer to array that contains the index of the first 64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber window in each group, type UChar 65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nsect = number of sections to be decoded. type Int 67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pSect = pointer to structure array that contains the huffman 69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codebook index and section boundary for each section, 70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber type SectInfo 71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber global_gain = initial value for "DPCM encoded" scalefactors and noise 73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber energy, type Int 74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pFactors = pointer to array that stores the decoded scalefactors, 76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber intensity position or noise energy, type Int 77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber huffBookUsed = array that will hold the huffman codebook index for 79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber each sfb, type Int 80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pBook = pointer to structure that contains the huffman codebook 82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber information, such as dimension, Largest Absolute Value 83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (LAV) of each huffman codebook, etc. type Hcb 84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed: None 87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed: None 89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs: 91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0 if success 92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1 if error 93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified: 95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int *pFactors contains the newly decoded scalefactors and/or 97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber intensity position and/or noise energy level 98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified: 100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified: 102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION 105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function first reads the Huffman codebook index of all sections within 107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber one Frame. Then, depending on the huffman codebook index of each section, 108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the function decodes the scalefactors, and/or intensity positions 109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (INTENSITY_HCB, INTENSITY_HCB2), and/or noise energy (NOISE_HCB) 110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for every scalefactor band in each section. 111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber The function returns 0 upon successful decoding, returns 1 if error. 112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS 115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function should replace the content of the array pFactors with the 117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber decoded scalefactors and/or intensity positions and/or noise energy 118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES 121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) MPEG-2 NBC Audio Decoder 123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "This software module was originally developed by AT&T, Dolby 124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Laboratories, Fraunhofer Gesellschaft IIS in the course of development 125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and 126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 3. This software module is an implementation of a part of one or more 127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4 128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio 129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber standards free license to this software module or modifications thereof 130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for use in hardware or software products claiming conformance to the 131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MPEG-2 NBC/MPEG-4 Audio standards. Those intending to use this software 132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber module in hardware or software products are advised that this use may 133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber infringe existing patents. The original developer of this software 134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber module and his/her company, the subsequent editors and their companies, 135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber and ISO/IEC have no liability for use of this software module or 136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber modifications thereof in an implementation. Copyright is not released 137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original 138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber developer retains full right to use the code for his/her own purpose, 139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber assign or donate the code to a third party and to inhibit third party 140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products. 141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This copyright notice must be included in all copies or derivative 142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber works." 143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Copyright(c)1996. 144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) ISO/IEC 14496-3: 1999(E) 146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Subpart 4 p72-73 (scalefactors) 147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p76 (decoding) 148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p78 (Table 4.6.1, Table 4.6.2) 149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p93-94 (INTENSITY_HCB) 150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p123 (NOISE_HCB) 151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE 154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = SUCCESS; 156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CALL pv_memset(pHuffBookUsed, ZERO_HCB, MAXBANDS*sizeof(*pHuffBookUsed)); 158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CALL pv_memset(pFactors, ZERO_HCB, MAXBANDS*sizeof(*pFactors)); 160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sect_start = 0; 162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR(sect_idx = nsect; sect_idx > 0; sect_idx--) 164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sect_cb = pSect->sect_cb; 166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sect_end = pSect->sect_end; 167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pSect++; 168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CALL pv_memset( 170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &pHuffBookUsed[sect_start], 171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sect_cb, 172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (sect_end - sect_start)); 173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fac = global_gain; 178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber is_pos = 0; 179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noise_nrg = global_gain - NOISE_OFFSET; 180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pTable = pBook[BOOKSCL].pTable; 182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber group_win = 0; 183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber group_end = 0; 184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber WHILE((group_end < pFrameInfo->num_win)&&(status == SUCCESS)) 186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nsfb_win = pFrameInfo->sfb_per_win[group_end]; 188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber group_end = *pGroup++; 189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR(sfb = 0; sfb < nsfb_win; sfb++) 191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF ((pHuffBookUsed[sfb] > 0)&&(pHuffBookUsed[sfb] < BOOKSCL)) 193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber cw_index = CALL decode_huff_cw_binary(pTable, pInputStream); 195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fac += cw_index - MIDFAC; 197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF((fac >= 2*TEXP) || (fac < 0)) 199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 1; 201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ELSE 203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFactors[sfb] = fac; 205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF (fac) 207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ELSE IF (pHuffBookUsed[sfb] == ZERO_HCB) 210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber do nothing; 212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ELSE IF ((pHuffBookUsed[sfb] == INTENSITY_HCB)|| 215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (pHuffBookUsed[sfb] == INTENSITY_HCB2)) 216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber cw_index = CALL decode_huff_cw_binary(pTable, pInputStream); 218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber is_pos += cw_index - MIDFAC; 220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFactors[sfb] = is_pos; 221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ELSE IF (pHuffBookUsed[sfb] == NOISE_HCB) 224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (noise_pcm_flag == TRUE) 226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noise_pcm_flag = FALSE; 228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dpcm_noise_nrg = CALL getbits( 229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber NOISE_PCM_BITS, 230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream); 231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dpcm_noise_nrg -= NOISE_PCM_OFFSET; 233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ELSE 235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dpcm_noise_nrg = CALL decode_huff_cw_binary( 237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pTable, 238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream); 239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dpcm_noise_nrg -= MIDFAC; 241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF (noise_pcm_flag) 243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noise_nrg += dpcm_noise_nrg; 245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFactors[sfb] = noise_nrg; 246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ELSE IF (pHuffBookUsed[sfb] == BOOKSCL) 249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 1; 251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF (pHuffBookUsed[sfb]) 253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR (sfb) 256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (pFrameInfo->islong == FALSE) 258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR(group_win++; group_win < group_end; group_win++) 261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR (sfb=0; sfb < nsfb_win; sfb++) 263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFactors[sfb + nsfb_win] = pFactors[sfb]; 265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFactors += nsfb_win; 269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF (pFrameInfo) 274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pHuffBookUsed += nsfb_win; 276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFactors += nsfb_win; 277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDWHILE (group_end) 280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return status; 282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED 285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber When the code is written for a specific target processor the 286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the resources used should be documented below. 287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent 289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber stack usage for each subroutine called] 290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber where: [stack usage variable] = stack usage for [subroutine 292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber name] (see [filename].ext) 293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words 295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words 297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable 299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber used to represent cycle count for each subroutine 300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber called] 301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber where: [cycle count variable] = cycle count for [subroutine 303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber name] (see [filename].ext) 304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/ 307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES 311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h" 313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "aac_mem_funcs.h" /* pv_memset */ 314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_frameinfo.h" 315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_bits.h" 316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_sectinfo.h" 317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_huffman.h" 318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "ibstream.h" 319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "hcbtables.h" 321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "e_huffmanconst.h" 322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "e_infoinitconst.h" 323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "huffman.h" 324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS 327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here 328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES 332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional 333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also. 334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS 338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration 339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS 343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module 344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES 348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module 349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere 354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE 358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 359dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberInt hufffac( 360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FrameInfo *pFrameInfo, 361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber BITS *pInputStream, 362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int *pGroup, /* may be changed to Int */ 363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int nsect, 364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SectInfo *pSect, /* may be changed to Int */ 365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int global_gain, 366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int *pFactors, 367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int huffBookUsed[]) 368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int sect_idx; 370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int group_end; /* index of 1st window in next group */ 371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int group_win; /* window index within group */ 372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int cw_index; /* huff codeword index */ 373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int nsfb_win; /* # of scfbands per window */ 374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int sfb; /* scalefactor band index */ 375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int sect_cb; /* huff codebook # for each section */ 376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int fac; /* decoded scf */ 377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int is_pos; /* intensity stereo position */ 378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int noise_pcm_flag = TRUE; /* first PNS sfb */ 379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int dpcm_noise_nrg; /* dpcm noise energy */ 380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int noise_nrg; /* noise energy */ 381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int status = SUCCESS; /* status of decoding */ 382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int *pHuffBookUsed = &huffBookUsed[0]; 383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset(pFactors, 386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ZERO_HCB, 387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MAXBANDS*sizeof(*pFactors)); 388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (nsect) 391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* read section length and codebook */ 393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (nsect == 1) /* long window */ 395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sect_cb = pSect->sect_cb; /* codebook for this section */ 397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* all sfbs in one section share the same codebook */ 399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (sfb = pSect->sect_end >> 2; sfb != 0; sfb--) 401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pHuffBookUsed++) = sect_cb; 403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pHuffBookUsed++) = sect_cb; 404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pHuffBookUsed++) = sect_cb; 405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pHuffBookUsed++) = sect_cb; 406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (sfb = pSect->sect_end & 3; sfb != 0; sfb--) 408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pHuffBookUsed++) = sect_cb; 410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else /* short */ 414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int sect_start = 0; /* start index of sfb for each section */ 416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (sect_idx = nsect; sect_idx > 0; sect_idx--) 417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sect_cb = pSect->sect_cb; /* codebook for this section */ 419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* all sfbs in one section share the same codebook */ 421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (sfb = sect_start; sfb < pSect->sect_end; sfb++) 422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pHuffBookUsed[sfb] = sect_cb; 424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pSect++; 427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sect_start = sfb; 428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for (sect_idx) */ 430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* clear array for the case of max_sfb == 0 */ 435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset(pHuffBookUsed, 436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ZERO_HCB, 437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MAXBANDS*sizeof(*pHuffBookUsed)); 438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pHuffBookUsed = &huffBookUsed[0]; 441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* scale factors and noise energy are dpcm relative to global gain 443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * intensity positions are dpcm relative to zero 444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fac = global_gain; 446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber is_pos = 0; 447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noise_nrg = global_gain - NOISE_OFFSET; 448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* get scale factors, 450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * use reserved Table entry = 12, see reference (2) p78 Table 4.6.2 451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber group_win = 0; 453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber group_end = 0; 454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* group by group decoding scalefactors and/or noise energy 457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and/or intensity position 458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber while ((group_end < pFrameInfo->num_win) && (status == SUCCESS)) 460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nsfb_win = pFrameInfo->sfb_per_win[group_end]; 462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber group_end = *pGroup++; /* index of 1st window in next group */ 463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* decode scf in first window of each group */ 465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (sfb = 0; sfb < nsfb_win; sfb++) 467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber switch (pHuffBookUsed[sfb]) 470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case ZERO_HCB: 472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case INTENSITY_HCB: 474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case INTENSITY_HCB2: 475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* intensity books */ 476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* decode intensity position */ 477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber cw_index = decode_huff_scl(pInputStream); 478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber is_pos += cw_index - MIDFAC; 480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFactors[sfb] = is_pos; 481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case NOISE_HCB: 483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* noise books */ 484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* decode noise energy */ 485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (noise_pcm_flag == TRUE) 486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noise_pcm_flag = FALSE; 488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dpcm_noise_nrg = get9_n_lessbits(NOISE_PCM_BITS, 489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream); 490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dpcm_noise_nrg -= NOISE_PCM_OFFSET; 492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dpcm_noise_nrg = decode_huff_scl(pInputStream); 496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dpcm_noise_nrg -= MIDFAC; 498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (noise_pcm_flag) */ 499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noise_nrg += dpcm_noise_nrg; 501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFactors[sfb] = noise_nrg; 502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case BOOKSCL: 504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 1; /* invalid books */ 505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sfb = nsfb_win; /* force out */ 506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber default: 508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* spectral books */ 509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* decode scale factors */ 510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber cw_index = decode_huff_scl(pInputStream); 511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fac += cw_index - MIDFAC; /* 1.5 dB */ 513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((fac >= 2*TEXP) || (fac < 0)) 514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 1; /* error, MUST 0<=scf<256, Ref. p73 */ 516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFactors[sfb] = fac; /* store scf */ 520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (fac) */ 521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for (sfb=0), first window decode ends */ 524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* expand scf to other windows in the same group */ 526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pFrameInfo->islong == FALSE) 527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (group_win++; group_win < group_end; group_win++) 530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (sfb = 0; sfb < nsfb_win; sfb++) 532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFactors[sfb + nsfb_win] = pFactors[sfb]; 534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFactors += nsfb_win; 536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (pFrameInfo->islong), one group decode ends */ 539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* points to next group */ 542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pHuffBookUsed += nsfb_win; 543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFactors += nsfb_win; 544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* while (group_end), all groups decode end */ 546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return status; 548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* hufffac */ 550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 551