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/huffcb.c 21f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Funtions: 22f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber huffcb 23f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 24f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 25f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------ 26f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber REVISION HISTORY 27f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 28f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: Modified from original shareware code 29f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 30f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: Modified to pass variables by reference to eliminate use 31f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber of global variables. 32f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 33f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: Change variable names for clarity, 34f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber change variables 'base', 'sect_len_inc', and 'esc_val' to 35f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber UChar type. 36f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 37f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: Add "if ((pSect[-1] % sfb_per_win) > max_sfb)" statement to 38f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber detect the error condition. 39f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber add more white space. 40f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 41f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: eliminated "pSect[-1]%sfb_per_win" operation 42f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 43f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: eliminated "pSect[-1]%sfb_per_win" operation 44f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 45f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: (1) Pass in SectInfo pSect 46f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber (2) put BITS *pInputStream as second parameter 47f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 48f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: Fix a failure for thrid party AAC encoding. 49f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber The problem came when the total and the 50f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber maximun number of active scale factor bands do not coincide. 51f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber This is a rare situation but produces a problem when decoding 52f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber encoders that tolerate this. 53f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 54f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: Replace some instances of getbits to get9_n_lessbits 55f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber when the number of bits read is 9 or less and get1bits 56f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber when only 1 bit is read. 57f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 58f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: 59f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 60f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------ 61f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber INPUT AND OUTPUT DEFINITIONS 62f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 63f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Inputs: 64f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 65f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber UChar *pSect = pointer to array that contains the interleaved 66f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber information of huffman codebook index and section 67f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber length. Array contains: 68f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber [codebook index] 69f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber [section boundary] 70f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber [codebook index] 71f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber [section boundary] 72f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber ... 73f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 74f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Int sectbits = array that defines the number of bits 75f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber used for expressing the escape value of 76f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber section length 77f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 78f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Int tot_sfb = total number of sfb in one Frame 79f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 80f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Int sfb_per_win = number of sfb in each sub-block (window) 81f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 82f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber UChar max_sfb = 1 + number of active sfbs - see reference (2) p56 83f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 84f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber BITS *pInputStream = pointer to input stream 85f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 86f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 87f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Local Stores/Buffers/Pointers Needed: 88f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 89f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber UChar base = number of sfb in already detected sections 90f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 91f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber UChar sect_len_inc = section length increment in number of sfbs' 92f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 93f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber UChar esc_val = escape value for section length 94f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 95f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Int bits = number of bits needed for expressing section length 96f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 97f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 98f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Global Stores/Buffers/Pointers Needed: 99f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 100f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 101f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Outputs: 102f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 103f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber num_sect = total number of sections in one frame 104f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 105f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 106f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Pointers and Buffers Modified: 107f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 108f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber UChar *pSect = pointer to array where huffman codebook index and 109f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber section length are stored 110f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 111f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Local Stores Modified: 112f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 113f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Global Stores Modified: 114f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 115f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------ 116f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber FUNCTION DESCRIPTION 117f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 118f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Background knowledge: 1024(960) coef's are separated into several sections, 119f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber each section is encoded with one single Huffman codebook, and each section 120f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber has a length of multiples of sfb. 121f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 122f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber max_sfb <= sfb_per_win <= tot_sfb 123f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber tot_sfb = total number of scalefactor bands in one frame (1024 coefs) 124f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 125f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber This function reads the codebook index and section boundaries (expressed 126f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber in number of sfb) from the input bitstream, store these information in 127f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber *pSect, and return the number of sections been detected. Returns 0 if there 128f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber is an error. 129f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 130f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------ 131f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber REQUIREMENTS 132f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 133f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber This function should fill the array *pSect with section Huffman codebook 134f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber indexes and section boundaries 135f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 136f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------ 137f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber REFERENCES 138f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 139f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber (1) MPEG-2 NBC Audio Decoder 140f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber "This software module was originally developed by AT&T, Dolby 141f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Laboratories, Fraunhofer Gesellschaft IIS in the course of development 142f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and 143f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 3. This software module is an implementation of a part of one or more 144f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4 145f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio 146f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber standards free license to this software module or modifications thereof 147f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber for use in hardware or software products claiming conformance to the 148f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber MPEG-2 NBC/MPEG-4 Audio standards. Those intending to use this software 149f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber module in hardware or software products are advised that this use may 150f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber infringe existing patents. The original developer of this software 151f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber module and his/her company, the subsequent editors and their companies, 152f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber and ISO/IEC have no liability for use of this software module or 153f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber modifications thereof in an implementation. Copyright is not released 154f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original 155f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber developer retains full right to use the code for his/her own purpose, 156f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber assign or donate the code to a third party and to inhibit third party 157f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products. 158f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber This copyright notice must be included in all copies or derivative 159f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber works." 160f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Copyright(c)1996. 161f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 162f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber (2) ISO/IEC 14496-3 1999(E) 163f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Subpart 4 p55 (Recovering section_data()) 164f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber p24-25 (Syntax of section_data()) 165f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 166f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber (3) M. Bosi, K. Brandenburg, etc., "ISO/IEC MPEG-2 Advanced Audio Coding," 167f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber J. Audio Eng. Soc., Vol.45, No.10, 1997 October 168f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 169f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------ 170f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber PSEUDO-CODE 171f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 172f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber bits_needed_for_ESC = sectbits[0]; 173f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber ESC_value = (1<<bits_needed_for_ESC) - 1; 174f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber num_of_section = 0; 175f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 176f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 177f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber FOR (base = 0; base<total_sfb AND num_of_section<total_sfb) 178f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber { 179f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber *pSect++ = getbits(LEN_CB, pInputStream); (read huffman_codebook_num) 180f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber sect_length_incr = getbits(bits_needed_for_ESC, pInputStream); 181f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 182f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber WHILE (sect_length_incr == ESC_value AND base < total_sfb) 183f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber { 184f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber base += ESC_value; 185f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber sect_length_incr = getbits(bits_needed_for_ESC, ebits); 186f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber } 187f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber ENDWHILE 188f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 189f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber base += sect_length_incr; 190f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber *pSect++ = base; 191f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber num_of_section++; 192f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 193f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber IF (num_of_sfb_for_this_group==max_sfb) 194f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber { 195f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber *pSect++ = 0; (use huffman codebook 0) 196f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber base += sfb_per_win - max_sfb; 197f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber *pSect++ = base; 198f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber num_of_section++; 199f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber } 200f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber ENDIF 201f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 202f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber IF (num_of_sfb_for_this_group > max_sfb) 203f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber break; 204f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber ENDIF 205f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 206f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber } 207f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber ENDFOR 208f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 209f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber IF (base != total_sfb OR num_of_section>total_sfb) 210f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber return 0; 211f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber ENDIF 212f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 213f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber return num_sect; 214f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 215f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------ 216f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber RESOURCES USED 217f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber When the code is written for a specific target processor the 218f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber the resources used should be documented below. 219f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 220f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent 221f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber stack usage for each subroutine called] 222f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 223f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber where: [stack usage variable] = stack usage for [subroutine 224f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber name] (see [filename].ext) 225f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 226f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber DATA MEMORY USED: x words 227f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 228f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber PROGRAM MEMORY USED: x words 229f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 230f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable 231f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber used to represent cycle count for each subroutine 232f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber called] 233f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 234f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber where: [cycle count variable] = cycle count for [subroutine 235f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber name] (see [filename].ext) 236f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 237f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------ 238f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber*/ 239f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 240f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 241f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*---------------------------------------------------------------------------- 242f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; INCLUDES 243f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/ 244f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "pv_audio_type_defs.h" 245f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "huffman.h" 246f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 247f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*---------------------------------------------------------------------------- 248f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; MACROS 249f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Define module specific macros here 250f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/ 251f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 252f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 253f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*---------------------------------------------------------------------------- 254f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; DEFINES 255f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Include all pre-processor statements here. Include conditional 256f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; compile variables also. 257f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/ 258f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 259f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 260f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*---------------------------------------------------------------------------- 261f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; LOCAL FUNCTION DEFINITIONS 262f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Function Prototype declaration 263f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/ 264f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 265f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*---------------------------------------------------------------------------- 266f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS 267f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Variable declaration - defined here and used outside this module 268f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/ 269f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 270f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*---------------------------------------------------------------------------- 271f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; EXTERNAL FUNCTION REFERENCES 272f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Declare functions defined elsewhere and referenced in this module 273f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/ 274f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 275f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*---------------------------------------------------------------------------- 276f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 277f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Declare variables used in this module but defined elsewhere 278f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/ 279f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 280f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*---------------------------------------------------------------------------- 281f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; FUNCTION CODE 282f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/ 283f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas HuberInt huffcb( 284f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber SectInfo *pSect, 285f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber BITS *pInputStream, 286f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Int sectbits[], 287f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Int tot_sfb, 288f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Int sfb_per_win, 289f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Int max_sfb) 290f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber{ 291f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber /*---------------------------------------------------------------------------- 292f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber ; Define all local variables 293f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber ----------------------------------------------------------------------------*/ 294f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 295f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Int base; /* section boundary */ 296f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Int sect_len_incr; 297f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Int esc_val; /* ESC of section length = 31(long), =7 (short) */ 298f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Int bits; /* # of bits used to express esc_val */ 299f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Int num_sect; 300f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Int active_sfb; 301f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Int group_base; 302f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 303f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 304f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber /*---------------------------------------------------------------------------- 305f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber ; Function body here 306f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber ----------------------------------------------------------------------------*/ 307f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 308f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber bits = sectbits[0]; /* 3 for SHORT_WIN, 5 for LONG_WIN */ 309f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber esc_val = (1 << bits) - 1; /* ESC_value for section length */ 310f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber num_sect = 0; 311f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber base = 0; 312f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber group_base = 0; 313f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 314f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber /* read until the end of one frame */ 315f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber while ((base < tot_sfb) && (num_sect < tot_sfb)) 316f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber { 317f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 318f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber pSect->sect_cb = get9_n_lessbits( 319f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber LEN_CB, 320f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber pInputStream); /* section codebook */ 321f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 322f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber sect_len_incr = get9_n_lessbits( 323f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber bits, 324f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber pInputStream); /* length_incr */ 325f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 326f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 327f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber /* read until non-ESC value, see p55 reference 2 */ 328f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber while ((sect_len_incr == esc_val) && (base < tot_sfb)) 329f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber { 330f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber base += esc_val; 331f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 332f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber sect_len_incr = get9_n_lessbits( 333f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber bits, 334f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber pInputStream); 335f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber } 336f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 337f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber base += sect_len_incr; 338f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber pSect->sect_end = base; /* total # of sfb until current section */ 339f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber pSect++; 340f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber num_sect++; 341f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 342f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber /* active_sfb = base % sfb_per_win; */ 343f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber active_sfb = base - group_base; 344f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 345f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber /* 346f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * insert a zero section for regions above max_sfb for each group 347f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * Make sure that active_sfb is also lesser than tot_sfb 348f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber */ 349f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 350f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber if ((active_sfb == max_sfb) && (active_sfb < tot_sfb)) 351f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber { 352f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber base += (sfb_per_win - max_sfb); 353f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber pSect->sect_cb = 0; /* huffman codebook 0 */ 354f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber pSect->sect_end = base; 355f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber num_sect++; 356f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber pSect++; 357f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber group_base = base; 358f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber } 359f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber else if (active_sfb > max_sfb) 360f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber { 361f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber /* within each group, the sections must delineate the sfb 362f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * from zero to max_sfb so that the 1st section within each 363f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * group starts at sfb0 and the last section ends at max_sfb 364f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * see p55 reference 2 365f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber */ 366f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber break; 367f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber } 368f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 369f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber } /* while (base=0) */ 370f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 371f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 372f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber if (base != tot_sfb || num_sect > tot_sfb) 373f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber { 374f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber num_sect = 0; /* error */ 375f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber } 376f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 377f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber return num_sect; 378f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 379f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber} /* huffcb */ 380f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 381f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber 382