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