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: huffspec_fxp.c 21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Funtions: 22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber huffspec_fxp 23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY 26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified from original shareware code 28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified to pass variables by reference to eliminate use 30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber of global variables. 31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: (1) Modified to keep in-line with PV standards 33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) Eliminated "continue" in if(sect_cb==ZERO_HCB||...) 34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: (1) Use SectInfo *pSect 36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) Convert 'Real' to 'Int32', float -> fixed-point 37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (3) move BITS *pInputStream to second parameter 38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (4) pass in quantSpec and tmp_spec, scratch shared with hufffac 39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (5) pass in FrameInfo *pLongFrameInfo, eliminate only_long_info 40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: (1) Eliminate parameter Hcb *book, because of eliminating 42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber function 'hufftab.c', Hcb hcbbook defined as a 43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const structure in 'hcbtables.h'. 44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) Replace three nested 'for' loops with a for-while loop in 45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the rescaling part. 46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (3) Change esc_iquant-> esc_iquant_fxp, call esc_iquant_fxp() 47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber by sfb 48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Cleaned up include files. 50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Correct definition of stack variable "scale". 52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber It was defined as Int, but it receives an UInt value, 53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber this present a problem when Int is 16 bits and 54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the sign bit is not interpreted correctly. This does not 55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shows for 32-bit implementations. This problem manifest itself 56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber as a flipping sign on some spectral coefficients (the ones 57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber multiplied by 0x8000). 58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Typecast b_low and b_high to 32-bits before multiplication, this 60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber assures propoer compilation on a 16-bit platform (TI-C55x) 61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified to speed up decode_huff_cw 63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: pass codebook index to decode_huff_cw, delete pointer to Huffman 65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber structure 66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: keep memset to quantSpec, remove memset to temp_spec 68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified per review comments 70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Use Binary tree search in decode_huff_cw_binary 72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified per review comments 74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) delete unused codes 75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: (1) Change the interface to decode huffman codeword. 77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) Move the scaling inside the inverse quantization. 78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (3) Change scaling factor accuracy to 10 bits. 79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) delete unused variable max_fac 82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Addresses of huffman tables are now found by means of a 84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber switch statement, this solve linking problem when using the 85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /ropi option (Read-only position independent) for some 86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber compilers 87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who: Date: MM/DD/YYYY 89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS 92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs: 94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFrameInfo = ptr to structure that holds Information of current Frame, 95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber type FrameInfo 96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream = ptr to structure of bitstream, type BITS 98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nsect = number of sections in current Frame, at fs = 44.1 kHz, 100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber range [0, 49] long block, [0,112] short blocks. type Int 101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pSect = ptr to structure that holds section codebook and boundary 103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber type SectInfo 104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber factors[] = array that contains scalefactors for each sfb, type Int16 106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber coef[] = array that holds inverse quantized coefs, Int32 QFormat. 108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber quantSpec[] = array that holds quantized spectral coefs, type Int 110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_spec[] = temporary buffer to hold the de-interleaved coefs. 112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pLongFrameInfo = ptr to structure that holds long frame info 114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed: 116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exptable = array contains the Q15 format data for 2^0, 2^0.25, 2^0.5, 117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber and 2^0.75, type const Int. 118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed: 120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs: 123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return 0 if decoding properly. 125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified: 127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream read codeword index and/or sign bits and/or ESC value 129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber coef contains the newly inverse quantized 1024 spec coefs, 131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber type Int32 Q-format from esc_iquant() 132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber quantSpec contains decoded quantized 1024 spec coefs, type Int 134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_spec contains the de-interleaved version of quantSpec 136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber qFormat contains Q-Format for each scalefactor band 138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified: 140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified: 143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION 147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function first reads the section info (codebook and boundary), then 149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber decode the spectral coefficients if a spectral codebook is used. 150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber If necessary, get the sign bits, ESC value or the NEC_pulse data. In case of 151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber short window sequences, the decoded data is de-interleaved before 152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber multiplied by scalefactors. 153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS 156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function should set the content of the array 'coef' with the inverse 158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber quantized and rescaled value of spectral coefficients. 159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES 162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) MPEG-2 NBC Audio Decoder 164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "This software module was originally developed by AT&T, Dolby 165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Laboratories, Fraunhofer Gesellschaft IIS in the course of development 166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and 167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 3. This software module is an implementation of a part of one or more 168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4 169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio 170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber standards free license to this software module or modifications thereof 171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for use in hardware or software products claiming conformance to the 172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MPEG-2 NBC/MPEG-4 Audio standards. Those intending to use this software 173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber module in hardware or software products are advised that this use may 174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber infringe existing patents. The original developer of this software 175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber module and his/her company, the subsequent editors and their companies, 176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber and ISO/IEC have no liability for use of this software module or 177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber modifications thereof in an implementation. Copyright is not released 178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original 179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber developer retains full right to use the code for his/her own purpose, 180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber assign or donate the code to a third party and to inhibit third party 181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products. 182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This copyright notice must be included in all copies or derivative 183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber works." 184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Copyright(c)1996. 185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) ISO/IEC 14496-3: 1999(E) 187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Subpart (4) p56 (spectral_data() parsing and decoding) 188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p26 (Syntax of spectral_data()) 189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p74-78 (decoding: unpack_idx, get_sign_bits, 190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber getescape, pulse_nc, deinterleave) 191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p72 (inverse quantization: esc_iquant) 192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE 195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED 199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber When the code is written for a specific target processor the 200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the resources used should be documented below. 201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent 203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber stack usage for each subroutine called] 204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber where: [stack usage variable] = stack usage for [subroutine 206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber name] (see [filename].ext) 207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words 209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words 211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable 213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber used to represent cycle count for each subroutine 214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber called] 215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber where: [cycle count variable] = cycle count for [subroutine 217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber name] (see [filename].ext) 218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/ 221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES 224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h" 226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "aac_mem_funcs.h" 227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "esc_iquant_scaling.h" 228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "huffman.h" 229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "unpack_idx.h" 230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pulse_nc.h" 231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "iquant_table.h" 232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "e_huffmanconst.h" 233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_normalize.h" 236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS 239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here 240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES 245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional 246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also. 247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define ORDER (3) 249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* 251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Format the table is stored in. 252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define QTABLE (27) 254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* 256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Number of bits for data in a signed 32 bit integer. 257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define SIGNED32BITS (31) 259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* 261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Round up value for intermediate values obtained from the table 262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define ROUND_UP (( ((UInt32) 1) << (QTABLE) )-1) 264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS 267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration 268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS 272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module 273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberconst UInt16 exptable[4] = 275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, /* (2^0.00)<<15 (Q10), use zero to signal no scaling required! */ 277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 19485, /* (2^0.25)<<15 */ 278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 23171, /* (2^0.50)<<15 */ 279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 27555 /* (2^0.75)<<15 */ 280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}; 282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES 286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module 287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere 292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE 296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 298dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberInt huffspec_fxp( 299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FrameInfo *pFrameInfo, 300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber BITS *pInputStream, 301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int nsect, 302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SectInfo *pSectInfo, 303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int factors[], 304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 coef[], 305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 quantSpec[], 306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 tmp_spec[], 307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const FrameInfo *pLongFrameInfo, 308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PulseInfo *pPulseInfo, 309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int qFormat[]) 310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /*---------------------------------------------------------------------------- 312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ; Define all local variables 313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ----------------------------------------------------------------------------*/ 314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Hcb *pHcb; 315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int i; 316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int sfb; 317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int idx_count; 318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int sect_cb; /* section codebook */ 319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int dim; 320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int idx; 321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int stop_idx; /* index of 1st coef in next sfb */ 322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int sect_start; /* start index of sfb in one section*/ 323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int sect_end; /* index of 1st sfb in next section */ 324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int *pSfbStart; 325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int *pSfb; 326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 *pQuantSpec; /* probably could be short */ 327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int max = 0; 328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* rescaling parameters */ 329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int nsfb; 330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int tot_sfb; 331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int fac; 332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *pCoef; /* ptr to coef[], inverse quantized coefs */ 334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber UInt16 scale; 335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int power_scale_div_4; 337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int sfbWidth; 338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber void (*pUnpack_idx)( 340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 quant_spec[], 341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int codeword_indx, 342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Hcb *pHuffCodebook, 343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber BITS *pInputStream, 344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int *max); 345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int(*pDec_huff_tab)(BITS *) = NULL; 347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber UInt32 temp; 349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int binaryDigits, QFormat; 350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /*---------------------------------------------------------------------------- 352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ; Function body here 353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ----------------------------------------------------------------------------*/ 354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sect_start = 0; 356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber stop_idx = 0; 357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* pSfb: ptr to array that holds stop index of each sfb */ 359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pSfbStart = pFrameInfo->frame_sfb_top; 360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pSfbStart == NULL) 362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (-1); /* error condition */ 364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pSfb = pSfbStart; 367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* decoding spectral values section by section */ 369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = nsect; i > 0; i--) 370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* read the codebook and section length */ 372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sect_cb = pSectInfo->sect_cb; /* codebook */ 373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((sect_cb > 15) || (sect_cb < 0)) 374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (-1); /* error condition */ 376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sect_end = pSectInfo->sect_end; /* # of sfbs */ 378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sect_end < 0) 380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (-1); /* error condition */ 382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pSectInfo++; 385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* sect_cb sect_cb - 1 387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ZERO_HCB 1111b 388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1 0000b 389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 2 0001b 390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 3 0010b 391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 4 0011b 392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 5 0100b 393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 6 0101b 394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 7 0110b 395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 8 0111b 396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 9 1000b 397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 10 1001b 398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 11 1010b 399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 12 1011b 400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * NOISE_HCB 1100b 401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * INTENSITY_HCB2 1101b 402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * INTENSITY_HCB 1110b 403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * if ( ((sect_cb - 1) & 0xC) == 0xC ) is identical to 404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * if !((sect_cb == ZERO_HCB) || (sect_cb == NOISE_HCB) || 405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (sec_cb == INTENSITY_HCB) || (sect_cb==INTENSITY_HCB2) ) 406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * use this compare scheme to speed up the execution 407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (((sect_cb - 1) & 0xC) != 0xC) 410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* decode spec in one section */ 412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sect_cb > BY4BOOKS) 413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dim = DIMENSION_2; /* set codebook dimension */ 415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dim = DIMENSION_4; 419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pHcb = &hcbbook_binary[sect_cb]; 422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sect_cb == ESCBOOK) 424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pUnpack_idx = &unpack_idx_esc; 426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else if (pHcb->signed_cb == FALSE) 428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pUnpack_idx = &unpack_idx_sgn; 430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pUnpack_idx = &unpack_idx; 434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber switch (sect_cb) 438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case 1: 440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pDec_huff_tab = decode_huff_cw_tab1; 441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case 2: 443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pDec_huff_tab = decode_huff_cw_tab2; 444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case 3: 446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pDec_huff_tab = decode_huff_cw_tab3; 447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case 4: 449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pDec_huff_tab = decode_huff_cw_tab4; 450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case 5: 452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pDec_huff_tab = decode_huff_cw_tab5; 453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case 6: 455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pDec_huff_tab = decode_huff_cw_tab6; 456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case 7: 458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pDec_huff_tab = decode_huff_cw_tab7; 459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case 8: 461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pDec_huff_tab = decode_huff_cw_tab8; 462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case 9: 464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pDec_huff_tab = decode_huff_cw_tab9; 465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case 10: 467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pDec_huff_tab = decode_huff_cw_tab10; 468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case 11: 470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pDec_huff_tab = decode_huff_cw_tab11; 471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber default: 473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (-1); /* error condition */ 474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* move ptr to first sfb of current section */ 477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQuantSpec = quantSpec + stop_idx; 478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* step through all sfbs in current section */ 480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (sfb = sect_start; sfb < sect_end; sfb++) 481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber idx_count = *pSfb - stop_idx; 483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber stop_idx = *pSfb++; 484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* decode all coefs for one sfb */ 486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber while ((idx_count > 0) && (idx_count < 1024)) 487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber idx = (*pDec_huff_tab)(pInputStream); 490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*pUnpack_idx)(pQuantSpec, 492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber idx, 493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pHcb, 494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream, 495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &max); /* unpack idx -> coefs */ 496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQuantSpec += dim; 498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber idx_count -= dim; 499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* while(idx_count) */ 501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for (sfb=sect_start) */ 503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* current section uses ZERO_HCB, NOISE_HCB, etc */ 508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* move sfb pointer to the start sfb of next section */ 510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pSfb = pSfbStart + sect_end; 511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* number of coefs in current section */ 512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber idx_count = *(pSfb - 1) - stop_idx; 513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((idx_count > 1024) || (idx_count < 0)) 515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (-1); /* error condition */ 517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * This memset is necessary in terms of (1) net savings in total 521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * MIPS and (2) accurate Q-Formats for fft_rx2 522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * In case a scalefactor band uses ZERO_HCB, all coefficients of 523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * that sfb should be zeros. Without this call to memset, the 524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * coefficients for a ZERO_HCB sfb are the "leftovers" of the 525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * previous frame, which may not have all zero values. This leads 526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * to a drastical increase in the cycles consumed by esc_iquant_fxp 527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and fft_rx2, which is the most "expensive" function of the 528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * library. 529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * This memset also guarantees the Q_Format for sfbs with all zero 530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * coefficients will be set properly. 531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Profiling data on ARM and TMS320C55x proves that there is a net 532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * gain in total MIPS if a memset is called here. 533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset(&quantSpec[stop_idx], 535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber idx_count * sizeof(quantSpec[0])); 537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * This memset is called because pQuantSpec points to tmp_spec 540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * after deinterleaving 541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset(&tmp_spec[stop_idx], 544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber idx_count * sizeof(tmp_spec[0])); 546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* stop_idx is the index of the 1st coef of next section */ 549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber stop_idx = *(pSfb - 1); 550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber }/* if (sect_cb) */ 552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sect_start = sect_end; 554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for (i=nsect) */ 556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* noisless coding reconstruction */ 558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pFrameInfo->islong != FALSE) 559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pPulseInfo->pulse_data_present == 1) 561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pulse_nc(quantSpec, 563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPulseInfo, 564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pLongFrameInfo, 565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &max); /* add pulse data */ 566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQuantSpec = quantSpec; 569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber deinterleave(quantSpec, 574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_spec, 575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFrameInfo); 576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQuantSpec = tmp_spec; 578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* inverse quantization, Q_format: Int32 */ 582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* rescaling */ 583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* what we can do here is assuming that we already know maxInput for each band, we have to go 585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber though each one of them for re-quant and scaling, and pick the right qFormat to apply to 586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber all spectral coeffs.*/ 587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((max < 0) || (max > 8192)) /* (8192>>ORDER) == 1024 is the inverseQuantTable size */ 589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (-1); /* error condition */ 591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Get (max/SPACING) ^ (1/3), in Q Format */ 595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = inverseQuantTable[(max >> ORDER) + 1]; 596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Round up before shifting down to Q0 */ 600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp += ROUND_UP; 601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* shift down to Q0 and multiply by 2 (FACTOR) in one step */ 603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp >>= (QTABLE - 1); 604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 605dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Now get max ^ (4/3) in Q0 */ 606dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp *= max; 607dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 608dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 609dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber binaryDigits = 31 - pv_normalize(temp); 610dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 611dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 612dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Prevent negative shifts caused by low maximums. */ 613dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (binaryDigits < (SIGNED32BITS - QTABLE)) 614dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 615dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber binaryDigits = SIGNED32BITS - QTABLE; 616dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 617dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 618dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber QFormat = SIGNED32BITS - binaryDigits; 619dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 620dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /********************/ 621dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tot_sfb = 0; 622dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nsfb = pFrameInfo->sfb_per_win[0]; 623dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pCoef = coef; 624dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 625dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = pFrameInfo->num_win; i > 0; i--) 626dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 627dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber stop_idx = 0; 628dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 629dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (sfb = 0; sfb < nsfb; sfb++) 630dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 631dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sfbWidth = pFrameInfo->win_sfb_top[0][sfb] - stop_idx; 632dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 633dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((sfbWidth < 0) || (sfbWidth > 1024)) 634dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 635dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (-1); /* error condition */ 636dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 637dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 638dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber stop_idx += sfbWidth; 639dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 640dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fac = factors[tot_sfb] - SF_OFFSET; 641dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber scale = exptable[fac & 0x3]; 642dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 643dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber power_scale_div_4 = fac >> 2; 644dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 645dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber power_scale_div_4++; 646dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 647dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber qFormat[tot_sfb] = QFormat; 648dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 649dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber esc_iquant_scaling(pQuantSpec, 650dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pCoef, 651dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sfbWidth, 652dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber QFormat, 653dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber scale, 654dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber max); 655dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 656dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQuantSpec += sfbWidth; 657dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber qFormat[tot_sfb] -= power_scale_div_4; 658dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pCoef += sfbWidth; 659dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 660dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tot_sfb++; 661dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 662dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for (sfb) */ 663dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for (i) */ 664dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 665dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 666dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /*---------------------------------------------------------------------------- 667dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ; Return status 668dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ----------------------------------------------------------------------------*/ 669dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return SUCCESS; 670dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 671dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* huffspec_fxp */ 672