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: get_tns.c 21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Date: 10/25/2000 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: Brought code in-line with PV standards. Some minor 33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber optimizations (count-down for loops, etc.) were made. 34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Made cosmetic changes as suggested during review. Also, 36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber changed calculation of s_mask and n_mask from table-based to being 37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber calculated based on res_index. Also, the flag coef_res was changed 38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber from having a range of [3,4] to having a range of [0,1], which corresponds 39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exactly with the true value that is passed via the bitstream. 40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified to use more efficient TNS memory structure. 42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Updated to reflect more efficient usage of memory by the TNS 44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber filters. 45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Updated the SW template to include the full pathname to the 47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber source file and a slightly modified copyright header. 48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Moved pInputStream to be the 2nd parameter, for a slight 50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber optimization on some platforms. 51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Moved pSfbTop outside of the loops, since its value does 53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber not change. 54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Replace some instances of getbits to get1bits 56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber when only 1 bit is read. 57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who: Date: 59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS 63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs: 65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FrameInfo *pFrameInfo 66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointer to structure that holds information about each block. 67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (long block flag, 68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber number of subblocks, 69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber scalefactor bands per subblock, etc.) 70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber BITS *pInputStream 72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointer to a BITS structure that is 73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber passed on to function getbits to pull information from the bitstream. 74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber TNS_Frame_info *pTnsFrameInfo 76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointer to filter data structure - to be populated by this function. 77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed: 79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed: 82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs: 85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified: 88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber TNS_frame_info *pTnsFrameInfo 89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pTnsFrameInfo->n_filt = Number of tns filters to be applied to the data. 91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pTnsFrameInfo->filt[]->order = The order of each individual TNS filter. 93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pTnsFrameInfo->filt[]->coef_res = The resolution of the filter coefficients 95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pTnsFrameInfo->filt[]->start_band = start of spectral band 97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pTnsFrameInfo->filt[]->stop_band = end of spectral band 99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pTnsFrameInfo->filt[]->coef[] = Each filter's coefficients are filled with 101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber data read from the input bitstream. 102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pTnsFrameInfo->filt[]->direction = A flag is set for each TNS filter. 104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber If the direction flag (on the bitstream) = 0, then the filter 106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber is applied to the block of spectral data in normal (upward) fashion. 107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber If the direction flag (on the bitstream) = 1, then the filter 109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber is applied in a reverse (downward) fashion. 110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (Starting with the last element in the block of data.) 111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber The value stored in filt[]->direction maps the values [0,1] to [1,-1] for 113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber a more intuitive storage of this flag's meaning. 114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified: 116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified: 118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION 122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function reads the TNS filter information from the bitstream, and stores 124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the filter order, LPC coefficients, and the number of TNS filters to 125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber be applied in the structure TNS_frame_info. 126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS 129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This code should match the ISO code in functionality, with the exception 131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber that coef_res has range of [0,1] (PV code) instead of [3,4] (ISO code) 132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber coef_res is only used by tns_decode_coef. 134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES 137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) ISO/IEC 14496-3:1999(E) 138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Part 3 139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Subpart 4.6.8 (Temporal Noise Shaping) 140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) MPEG-2 NBC Audio Decoder 142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "This software module was originally developed by AT&T, Dolby 143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Laboratories, Fraunhofer Gesellschaft IIS in the course of development 144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and 145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 3. This software module is an implementation of a part of one or more 146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4 147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio 148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber standards free license to this software module or modifications thereof 149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for use in hardware or software products claiming conformance to the 150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MPEG-2 NBC/MPEG-4 Audio standards. Those intending to use this software 151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber module in hardware or software products are advised that this use may 152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber infringe existing patents. The original developer of this software 153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber module and his/her company, the subsequent editors and their companies, 154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber and ISO/IEC have no liability for use of this software module or 155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber modifications thereof in an implementation. Copyright is not released 156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original 157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber developer retains full right to use the code for his/her own purpose, 158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber assign or donate the code to a third party and to inhibit third party 159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products. 160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This copyright notice must be included in all copies or derivative 161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber works." 162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Copyright(c)1996. 163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE 166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED 170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber When the code is written for a specific target processor 171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the resources used should be documented below. 172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent 174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber stack usage for each subroutine called] 175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber where: [stack usage variable] = stack usage for [subroutine 177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber name] (see [filename].ext) 178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words 180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words 182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable 184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber used to represent cycle count for each subroutine 185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber called] 186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber where: [cycle count variable] = cycle count for [subroutine 188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber name] (see [filename].ext) 189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES 193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h" 195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "get_tns.h" 196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_mc_info.h" 197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_frameinfo.h" 198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_tnsfilt.h" 199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_tns_frame_info.h" 200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_bits.h" 201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "ibstream.h" 202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "e_window_sequence.h" 203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "e_progconfigconst.h" 204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "tns_decode_coef.h" 206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS 210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here 211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define SCALE_FACTOR_BAND_OFFSET(x) ( ((x) > 0) ? pSFB_top[(x)-1] : 0 ) 213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define MINIMUM(x,y) ( ((x) < (y)) ? (x) : (y) ) 214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES 217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional 218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also. 219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS 222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration 223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS 226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module 227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* 229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * The entries in the ensuing tables provide the maximum permissable 230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * number of scalefactor bands for each TNS filter. This value is effected 231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * by the sampling rate, and window type. 232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberconst Int tns_max_bands_tbl_long_wndw[(1<<LEN_SAMP_IDX)] = 235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber {31, /* 96000 Hz */ 236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 31, /* 88200 Hz */ 237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 34, /* 64000 Hz */ 238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 40, /* 48000 Hz */ 239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 42, /* 44100 Hz */ 240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 51, /* 32000 Hz */ 241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 46, /* 24000 Hz */ 242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 46, /* 22050 Hz */ 243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 42, /* 16000 Hz */ 244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 42, /* 12000 Hz */ 245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 42, /* 11025 Hz */ 246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 39, /* 8000 Hz */ 247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0 251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber }; 252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberconst Int tns_max_bands_tbl_short_wndw[(1<<LEN_SAMP_IDX)] = 254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber {9, /* 96000 Hz */ 255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 9, /* 88200 Hz */ 256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 10, /* 64000 Hz */ 257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 14, /* 48000 Hz */ 258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 14, /* 44100 Hz */ 259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 14, /* 32000 Hz */ 260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 14, /* 24000 Hz */ 261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 14, /* 22050 Hz */ 262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 14, /* 16000 Hz */ 263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 14, /* 12000 Hz */ 264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 14, /* 11025 Hz */ 265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 14, /* 8000 Hz */ 266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0 270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber }; 271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* 273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * For completeness, here are the table entries for object types that make 274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * use of PQF filter bank. We do not currently support this; these are 275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * given here only to ease future implementation. 276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * const Int tns_max_bands_tbl_long_wndw_PQF[(1<<LEN_SAMP_IDX)] = 278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * {28, ; 96000 279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 28, ; 88200 280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 27, ; 64000 281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 26, ; 48000 282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 26, ; 44100 283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 26, ; 32000 284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 29, ; 24000 285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 29, ; 22050 286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 23, ; 16000 287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 23, ; 12000 288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 23, ; 11025 289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 19, ; 8000 290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 0, 291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 0, 292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 0, 293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 0}; 294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * const Int tns_max_bands_tbl_short_wndw_PQF[(1<<LEN_SAMP_IDX)] = 296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * {7, ; 96000 297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 7, ; 88200 298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 7, ; 64000 299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 6, ; 48000 300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 6, ; 44100 301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 6, ; 32000 302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 7, ; 24000 303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 7, ; 22050 304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 8, ; 16000 305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 8, ; 12000 306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 8, ; 11025 307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 7, ; 8000 308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 0, 309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 0, 310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 0, 311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 0}; 312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES 316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module 317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere 321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE 324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid get_tns( 328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int max_bands, 329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber BITS * const pInputStream, 330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const WINDOW_SEQUENCE wnd_seq, 331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const FrameInfo * const pFrameInfo, 332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const MC_Info * const pMC_Info, 333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber TNS_frame_info * const pTnsFrameInfo, 334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 scratchTnsDecCoefMem[]) 335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int16 * const pSFB_top = pFrameInfo->win_sfb_top[0]; 338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int f; 340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int t; 341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int win; 342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber UInt tempInt; 343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int num_filt_bits; 345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int num_order_bits; 346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int num_start_band_bits; 347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int top; 349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int res; 350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int res_index; 351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int compress; 352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int sfb_per_win; 354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *pLpcCoef; 356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *pStartLpcCoef; 357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int s_mask; 358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int n_mask; 359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int tns_bands; 361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber UInt max_order; 362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int coef_res; 363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber TNSfilt *pFilt; 366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (wnd_seq != EIGHT_SHORT_SEQUENCE) 368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber num_filt_bits = 2; 370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber num_order_bits = 5; 371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber num_start_band_bits = 6; 372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tns_bands = tns_max_bands_tbl_long_wndw[pMC_Info->sampling_rate_idx]; 374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Definition from 14496-3:1999 doc. Our first encoder follows this rule, 377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * later encoders don't 378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pMC_Info->sampling_rate_idx > 4) /* if (sampling_rate <= 32000 */ 381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber max_order = 20; 383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber max_order = 12; 387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber num_filt_bits = 1; 392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber num_order_bits = 3; 393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber num_start_band_bits = 4; 394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tns_bands = tns_max_bands_tbl_short_wndw[pMC_Info->sampling_rate_idx]; 396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber max_order = 7; 398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * After this branch, tns_bands will be equal to the minimum of 402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * the passed in variable, nbands, and the result from the 403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * tns_max_bands_tbl 404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (max_bands < tns_bands) 407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tns_bands = max_bands; 409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sfb_per_win = pFrameInfo->sfb_per_win[0]; 412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win = 0; 414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pLpcCoef = pTnsFrameInfo->lpc_coef; 416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFilt = pTnsFrameInfo->filt; 418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber do 420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tempInt = get9_n_lessbits(num_filt_bits, 422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream); 423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pTnsFrameInfo->n_filt[win] = tempInt; 425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tempInt != 0) 427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * coef_res = [0, 1] 430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Switch between a resolution of 3 and 4 bits respectively 431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * if coef_res = 0, the coefficients have a range of 433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * -4 -3 -2 -1 0 1 2 3 435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * if coef_res = 1, the coefficients have a range of 437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * The arrays in ./src/tns_tab.c are completely based on 441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * the value of coef_res. 442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber res = get1bits( 444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream); 445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* res is post-incremented for correct calculation of res_index */ 447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber coef_res = res++; 448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber top = sfb_per_win; 450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (f = pTnsFrameInfo->n_filt[win]; f > 0; f--) 452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tempInt = MINIMUM(top, tns_bands); 454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFilt->stop_coef = SCALE_FACTOR_BAND_OFFSET(tempInt); 456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFilt->stop_band = tempInt; 458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber top -= get9_n_lessbits(num_start_band_bits, 460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream); 461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tempInt = MINIMUM(top, tns_bands); 463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFilt->start_coef = SCALE_FACTOR_BAND_OFFSET(tempInt); 465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFilt->start_band = tempInt; 467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tempInt = get9_n_lessbits(num_order_bits, 469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream); 470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFilt->order = tempInt; 472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tempInt != 0) 474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tempInt > max_order) 476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFilt->order = max_order; 478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * This maps the bitstream's [0,1] to 482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * pFilt->direction = [1,-1] 483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tempInt = get1bits(pInputStream); 486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFilt->direction = (-(Int)tempInt) | 0x1; 488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * compress = [0,1] 491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * If compress is true, the MSB has 492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * been omitted from transmission (Ref. 1) 493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * For coef_res = 0, this limits the range of 495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * transmitted coefficients to... 496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * -2 -1 0 1 498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * For coef_res = 1, the coefficients have 500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * a range of... 501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * -4 -3 -2 -1 0 1 2 3 503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber compress = get1bits(pInputStream); 505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * res has a range of [1,2] 508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * compress has a range of [0,1] 509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * So (res - compress) has range [0,2]; 510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber res_index = res - compress; 512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber s_mask = 2 << res_index; 514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * If res_index = 0, grab 2 bits of data 517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * If res_index = 1, grab 3 bits of data 518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * If res_index = 2, grab 4 bits of data 519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber res_index += 2; 521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pStartLpcCoef = pLpcCoef; 523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (t = pFilt->order; t > 0; t--) 525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * These are the encoded coefficients, which will 528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * later be decoded into LPC coefficients by 529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * the function tns_decode_coef() 530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tempInt = get9_n_lessbits(res_index, 532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream); 533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber n_mask = -((Int)tempInt & s_mask); 535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * n_mask is used to sign_extend the 538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * value, if it is negative. 539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pLpcCoef++) = tempInt | n_mask; 542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Decode the TNS coefficients */ 545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tempInt = pFilt->stop_coef - pFilt->start_coef; 547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tempInt > 0) 549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFilt->q_lpc = 551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tns_decode_coef( 552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFilt->order, 553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber coef_res, 554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pStartLpcCoef, 555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber scratchTnsDecCoefMem); 556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (pTnsFilt->order != 0) */ 559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFilt++; 561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* END for (f=pTnsInfo->n_filt; f>0; f--, pTnsFilt++) */ 563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (pTnsInfo->n_filt != 0) */ 565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win++; 567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber while (win < pFrameInfo->num_win); 570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return; 572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* get_tns */ 574