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