1 /* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18 /* 19 20 Pathname: infoinit.c 21 22 23 ------------------------------------------------------------------------------ 24 REVISION HISTORY 25 26 Description: Modified from original shareware code 27 28 Description: Modified to pass variables by reference to eliminate use 29 of global variables. 30 31 Description: Pass eight_short_info and the array 'sfbwidth128'. 32 Change function arguments' names for clarity 33 34 Description: move sfb definitions to "sfb.h", and "sfb.c", eliminated 35 the function "huffbookinit.c" 36 37 Description: Remove initialization of the never used array, 38 pFrameInfo->group_offs 39 40 Description: 41 (1) Changed "stdinc.h" to <stdlib.h> - this avoids linking in the math 42 library and stdio.h. (All for just defining the NULL pointer macro) 43 44 (2) Updated copyright header. 45 46 Description: Updated the SW template to include the full pathname to the 47 source file and a slightly modified copyright header. 48 49 Description: Addresses of constant vectors are now found by means of a 50 switch statement, this solve linking problem when using the 51 /ropi option (Read-only position independent) for some 52 compilers 53 54 Who: Date: 55 Description: 56 57 ------------------------------------------------------------------------------ 58 INPUT AND OUTPUT DEFINITIONS 59 60 Inputs: 61 pSi = pointer to sampling rate info 62 ppWin_seq_info = pointer array to window sequence Info struct 63 pSfbwidth128 = pointer to sfb bandwidth array of short window 64 65 Local Stores/Buffers/Pointers Needed: 66 67 Global Stores/Buffers/Pointers Needed: 68 69 Outputs: 70 71 Pointers and Buffers Modified: 72 73 ppWin_seq_info[ONLY_LONG_WINDOW]{all structure members} = setup values 74 ppWin_seq_info[EIGHT_SHORT_WINDOW]{all structure members} = setup values 75 76 Local Stores Modified: 77 78 Global Stores Modified: 79 80 81 ------------------------------------------------------------------------------ 82 FUNCTION DESCRIPTION 83 84 This function sets the values of 'Info' structure for blocks containing long 85 and short window sequences, the following structures are being set: 86 87 win_seq_info[ONLY_LONG_WINDOW], win_seq_info[EIGHT_SHORT_WINDOW], 88 only_long_info and eight_short_info 89 90 ------------------------------------------------------------------------------ 91 REQUIREMENTS 92 93 ------------------------------------------------------------------------------ 94 REFERENCES 95 96 (1) MPEG-2 NBC Audio Decoder 97 "This software module was originally developed by AT&T, Dolby 98 Laboratories, Fraunhofer Gesellschaft IIS in the course of development 99 of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and 100 3. This software module is an implementation of a part of one or more 101 MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4 102 Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio 103 standards free license to this software module or modifications thereof 104 for use in hardware or software products claiming conformance to the 105 MPEG-2 NBC/MPEG-4 Audio standards. Those intending to use this software 106 module in hardware or software products are advised that this use may 107 infringe existing patents. The original developer of this software 108 module and his/her company, the subsequent editors and their companies, 109 and ISO/IEC have no liability for use of this software module or 110 modifications thereof in an implementation. Copyright is not released 111 for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original 112 developer retains full right to use the code for his/her own purpose, 113 assign or donate the code to a third party and to inhibit third party 114 from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products. 115 This copyright notice must be included in all copies or derivative 116 works." 117 Copyright(c)1996. 118 119 (2) ISO/IEC 14496-3: 1999(E) 120 Subpart 4 p66 (sfb tables) 121 p111 (4.6.10) 122 p200 (Annex 4.B.5) 123 ------------------------------------------------------------------------------ 124 PSEUDO-CODE 125 126 pFrameInfo = pointer to only_long_info; 127 win_seq_info[ONLY_LONG_WINDOW] = pFrameInfo; 128 pFrameInfo{all structure members} = setup values; 129 130 131 pFrameInfo = pointer to eight_short_info; 132 win_seq_info[EIGHT_SHORT_WINDOW] = pFrameInfo; 133 pFrameInfo{all structure.members} = setup values; 134 135 136 FOR (window_seq = 0; window_seq < NUM_WIN_SEQ; win_seq++) 137 138 win_seq_info[window_seq].members = setup values; 139 140 ENDFOR 141 142 ------------------------------------------------------------------------------ 143 RESOURCES USED 144 When the code is written for a specific target processor the 145 the resources used should be documented below. 146 147 STACK USAGE: 148 149 DATA MEMORY USED: x words 150 151 PROGRAM MEMORY USED: x words 152 153 CLOCK CYCLES: 154 155 ------------------------------------------------------------------------------ 156 */ 157 158 159 160 /*---------------------------------------------------------------------------- 161 ; INCLUDES 162 ----------------------------------------------------------------------------*/ 163 #include "pv_audio_type_defs.h" 164 #include "s_sr_info.h" 165 #include "s_frameinfo.h" 166 #include "e_blockswitching.h" 167 #include "e_huffmanconst.h" 168 #include "sfb.h" 169 #include "huffman.h" 170 171 /*---------------------------------------------------------------------------- 172 ; MACROS 173 ; Define module specific macros here 174 ----------------------------------------------------------------------------*/ 175 176 177 /*---------------------------------------------------------------------------- 178 ; DEFINES 179 ; Include all pre-processor statements here. Include conditional 180 ; compile variables also. 181 ----------------------------------------------------------------------------*/ 182 183 184 /*---------------------------------------------------------------------------- 185 ; LOCAL FUNCTION DEFINITIONS 186 ; Function Prototype declaration 187 ----------------------------------------------------------------------------*/ 188 189 190 /*---------------------------------------------------------------------------- 191 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS 192 ; Variable declaration - defined here and used outside this module 193 ----------------------------------------------------------------------------*/ 194 195 196 /*---------------------------------------------------------------------------- 197 ; EXTERNAL FUNCTION REFERENCES 198 ; Declare functions defined elsewhere and referenced in this module 199 ----------------------------------------------------------------------------*/ 200 201 /*---------------------------------------------------------------------------- 202 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 203 ; Declare variables used in this module but defined elsewhere 204 ----------------------------------------------------------------------------*/ 205 206 /*---------------------------------------------------------------------------- 207 ; FUNCTION CODE 208 ----------------------------------------------------------------------------*/ 209 210 Int infoinit( 211 const Int samp_rate_idx, 212 FrameInfo **ppWin_seq_info, 213 Int *pSfbwidth128) 214 215 { 216 /*---------------------------------------------------------------------------- 217 ; Define all local variables 218 ----------------------------------------------------------------------------*/ 219 220 Int i; 221 Int sfb_idx, sfb_sbk; 222 Int bins_sbk; 223 Int win_seq; 224 Int start_idx, end_idx; 225 Int nsfb_short; 226 Int16 *sfbands; 227 FrameInfo *pFrameInfo; 228 229 const SR_Info *pSi = &(samp_rate_info[samp_rate_idx]); 230 231 const Int16 * pt_SFbands1024 = NULL; 232 const Int16 * pt_SFbands128 = NULL; 233 234 /*---------------------------------------------------------------------------- 235 ; Function body here 236 ----------------------------------------------------------------------------*/ 237 238 switch (pSi->samp_rate) 239 { 240 case 96000: 241 case 88200: 242 pt_SFbands1024 = sfb_96_1024; 243 pt_SFbands128 = sfb_64_128; /* equal to table sfb_96_128, (eliminated) */ 244 break; 245 case 64000: 246 pt_SFbands1024 = sfb_64_1024; 247 pt_SFbands128 = sfb_64_128; 248 break; 249 case 48000: 250 case 44100: 251 pt_SFbands1024 = sfb_48_1024; 252 pt_SFbands128 = sfb_48_128; 253 break; 254 case 32000: 255 pt_SFbands1024 = sfb_32_1024; 256 pt_SFbands128 = sfb_48_128; 257 break; 258 case 24000: 259 case 22050: 260 pt_SFbands1024 = sfb_24_1024; 261 pt_SFbands128 = sfb_24_128; 262 break; 263 case 16000: 264 case 12000: 265 case 11025: 266 pt_SFbands1024 = sfb_16_1024; 267 pt_SFbands128 = sfb_16_128; 268 break; 269 case 8000: 270 pt_SFbands1024 = sfb_8_1024; 271 pt_SFbands128 = sfb_8_128; 272 break; 273 default: 274 // sampling rate not supported 275 return -1; 276 } 277 278 /* long block info */ 279 280 pFrameInfo = ppWin_seq_info[ONLY_LONG_WINDOW]; 281 pFrameInfo->islong = 1; 282 pFrameInfo->num_win = 1; 283 pFrameInfo->coef_per_frame = LN2; /* = 1024 */ 284 285 pFrameInfo->sfb_per_win[0] = pSi->nsfb1024; 286 pFrameInfo->sectbits[0] = LONG_SECT_BITS; 287 pFrameInfo->win_sfb_top[0] = (Int16 *)pt_SFbands1024; 288 289 pFrameInfo->sfb_width_128 = NULL; /* no short block sfb */ 290 pFrameInfo->num_groups = 1; /* long block, one group */ 291 pFrameInfo->group_len[0] = 1; /* only one window */ 292 293 /* short block info */ 294 pFrameInfo = ppWin_seq_info[EIGHT_SHORT_WINDOW]; 295 pFrameInfo->islong = 0; 296 pFrameInfo->num_win = NSHORT; 297 pFrameInfo->coef_per_frame = LN2; 298 299 for (i = 0; i < pFrameInfo->num_win; i++) 300 { 301 pFrameInfo->sfb_per_win[i] = pSi->nsfb128; 302 pFrameInfo->sectbits[i] = SHORT_SECT_BITS; 303 pFrameInfo->win_sfb_top[i] = (Int16 *)pt_SFbands128; 304 } 305 306 /* construct sfb width table */ 307 pFrameInfo->sfb_width_128 = pSfbwidth128; 308 for (i = 0, start_idx = 0, nsfb_short = pSi->nsfb128; i < nsfb_short; i++) 309 { 310 end_idx = pt_SFbands128[i]; 311 pSfbwidth128[i] = end_idx - start_idx; 312 start_idx = end_idx; 313 } 314 315 316 /* common to long and short */ 317 for (win_seq = 0; win_seq < NUM_WIN_SEQ; win_seq++) 318 { 319 320 if (ppWin_seq_info[win_seq] != NULL) 321 { 322 pFrameInfo = ppWin_seq_info[win_seq]; 323 pFrameInfo->sfb_per_frame = 0; 324 sfb_sbk = 0; 325 bins_sbk = 0; 326 327 for (i = 0; i < pFrameInfo->num_win; i++) 328 { 329 330 /* compute coef_per_win */ 331 pFrameInfo->coef_per_win[i] = 332 pFrameInfo->coef_per_frame / pFrameInfo->num_win; 333 334 /* compute sfb_per_frame */ 335 pFrameInfo->sfb_per_frame += pFrameInfo->sfb_per_win[i]; 336 337 /* construct default (non-interleaved) bk_sfb_top[] */ 338 sfbands = pFrameInfo->win_sfb_top[i]; 339 for (sfb_idx = 0; sfb_idx < pFrameInfo->sfb_per_win[i]; 340 sfb_idx++) 341 { 342 pFrameInfo->frame_sfb_top[sfb_idx+sfb_sbk] = 343 sfbands[sfb_idx] + bins_sbk; 344 } 345 346 bins_sbk += pFrameInfo->coef_per_win[i]; 347 sfb_sbk += pFrameInfo->sfb_per_win[i]; 348 } /* for i = sbk ends */ 349 } 350 351 } /* for win_seq ends */ 352 353 return SUCCESS; 354 355 } /* infoinit */ 356