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 Filename: sbr_get_envelope.c 21 22 ------------------------------------------------------------------------------ 23 REVISION HISTORY 24 25 26 Who: Date: MM/DD/YYYY 27 Description: 28 29 ------------------------------------------------------------------------------ 30 INPUT AND OUTPUT DEFINITIONS 31 32 Arguments: h_frame_data - handle to struct SBR_FRAME_DATA 33 hBitBuf - handle to struct BIT_BUF 34 channel - channel number 35 36 Return: void 37 38 39 ------------------------------------------------------------------------------ 40 FUNCTION DESCRIPTION 41 42 Reads envelope data from bitstream 43 44 ------------------------------------------------------------------------------ 45 REQUIREMENTS 46 47 48 ------------------------------------------------------------------------------ 49 REFERENCES 50 51 SC 29 Software Copyright Licencing Disclaimer: 52 53 This software module was originally developed by 54 Coding Technologies 55 56 and edited by 57 - 58 59 in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3 60 standards for reference purposes and its performance may not have been 61 optimized. This software module is an implementation of one or more tools as 62 specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards. 63 ISO/IEC gives users free license to this software module or modifications 64 thereof for use in products claiming conformance to audiovisual and 65 image-coding related ITU Recommendations and/or ISO/IEC International 66 Standards. ISO/IEC gives users the same free license to this software module or 67 modifications thereof for research purposes and further ISO/IEC standardisation. 68 Those intending to use this software module in products are advised that its 69 use may infringe existing patents. ISO/IEC have no liability for use of this 70 software module or modifications thereof. Copyright is not released for 71 products that do not conform to audiovisual and image-coding related ITU 72 Recommendations and/or ISO/IEC International Standards. 73 The original developer retains full right to modify and use the code for its 74 own purpose, assign or donate the code to a third party and to inhibit third 75 parties from using the code for products that do not conform to audiovisual and 76 image-coding related ITU Recommendations and/or ISO/IEC International Standards. 77 This copyright notice must be included in all copies or derivative works. 78 Copyright (c) ISO/IEC 2002. 79 80 ------------------------------------------------------------------------------ 81 PSEUDO-CODE 82 83 ------------------------------------------------------------------------------ 84 */ 85 86 87 /*---------------------------------------------------------------------------- 88 ; INCLUDES 89 ----------------------------------------------------------------------------*/ 90 91 #ifdef AAC_PLUS 92 93 94 #include "sbr_get_envelope.h" 95 #include "s_huffman.h" 96 #include "e_coupling_mode.h" 97 #include "sbr_code_book_envlevel.h" 98 #include "buf_getbits.h" 99 #include "sbr_decode_huff_cw.h" 100 101 102 /*---------------------------------------------------------------------------- 103 ; MACROS 104 ; Define module specific macros here 105 ----------------------------------------------------------------------------*/ 106 107 108 /*---------------------------------------------------------------------------- 109 ; DEFINES 110 ; Include all pre-processor statements here. Include conditional 111 ; compile variables also. 112 ----------------------------------------------------------------------------*/ 113 114 /*---------------------------------------------------------------------------- 115 ; LOCAL FUNCTION DEFINITIONS 116 ; Function Prototype declaration 117 ----------------------------------------------------------------------------*/ 118 119 /*---------------------------------------------------------------------------- 120 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS 121 ; Variable declaration - defined here and used outside this module 122 ----------------------------------------------------------------------------*/ 123 124 /*---------------------------------------------------------------------------- 125 ; EXTERNAL FUNCTION REFERENCES 126 ; Declare functions defined elsewhere and referenced in this module 127 ----------------------------------------------------------------------------*/ 128 129 /*---------------------------------------------------------------------------- 130 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 131 ; Declare variables used in this module but defined elsewhere 132 ----------------------------------------------------------------------------*/ 133 134 /*---------------------------------------------------------------------------- 135 ; FUNCTION CODE 136 ----------------------------------------------------------------------------*/ 137 138 void sbr_get_envelope(SBR_FRAME_DATA * h_frame_data, 139 BIT_BUFFER * hBitBuf) 140 { 141 Int32 i; 142 Int32 j; 143 Int32 tmp; 144 Int32 no_band[MAX_ENVELOPES]; 145 Int32 delta = 0; 146 Int32 offset = 0; 147 Int32 ampRes; 148 Int32 envDataTableCompFactor; 149 Int32 start_bits; 150 Int32 start_bits_balance; 151 SbrHuffman hcb_t; 152 SbrHuffman hcb_f; 153 COUPLING_MODE coupling = h_frame_data->coupling; 154 155 h_frame_data->nScaleFactors = 0; 156 157 if ((h_frame_data->frameClass == FIXFIX) && 158 (h_frame_data->frameInfo[0] == 1)) 159 { 160 h_frame_data->ampRes = SBR_AMP_RES_1_5; 161 } 162 else 163 { 164 h_frame_data->ampRes = h_frame_data->sbr_header.ampResolution; 165 } 166 167 ampRes = h_frame_data->ampRes; 168 169 /* 170 * Set number of bits for first value depending on amplitude resolution 171 */ 172 if (ampRes == SBR_AMP_RES_3_0) 173 { 174 start_bits = SI_SBR_START_ENV_BITS_AMP_RES_3_0; 175 start_bits_balance = SI_SBR_START_ENV_BITS_BALANCE_AMP_RES_3_0; 176 } 177 else 178 { 179 start_bits = SI_SBR_START_ENV_BITS_AMP_RES_1_5; 180 start_bits_balance = SI_SBR_START_ENV_BITS_BALANCE_AMP_RES_1_5; 181 } 182 183 /* 184 * Calculate number of values for each envelope and alltogether 185 */ 186 for (i = 0; i < h_frame_data->frameInfo[0]; i++) 187 { 188 no_band[i] = 189 h_frame_data->nSfb[h_frame_data->frameInfo[h_frame_data->frameInfo[0] + 2 + i]]; 190 h_frame_data->nScaleFactors += no_band[i]; 191 } 192 193 194 /* 195 * Select huffman codebook depending on coupling mode and amplitude resolution 196 */ 197 if (coupling == COUPLING_BAL) 198 { 199 envDataTableCompFactor = 1; 200 if (ampRes == SBR_AMP_RES_1_5) 201 { 202 hcb_t = bookSbrEnvBalance10T; 203 hcb_f = bookSbrEnvBalance10F; 204 } 205 else 206 { 207 hcb_t = bookSbrEnvBalance11T; 208 hcb_f = bookSbrEnvBalance11F; 209 } 210 } 211 else 212 { 213 envDataTableCompFactor = 0; 214 if (ampRes == SBR_AMP_RES_1_5) 215 { 216 hcb_t = bookSbrEnvLevel10T; 217 hcb_f = bookSbrEnvLevel10F; 218 } 219 else 220 { 221 hcb_t = bookSbrEnvLevel11T; 222 hcb_f = bookSbrEnvLevel11F; 223 } 224 } 225 226 /* 227 * Now read raw envelope data 228 */ 229 for (j = 0; j < h_frame_data->frameInfo[0]; j++) 230 { 231 if (h_frame_data->domain_vec1[j] == FREQ) 232 { 233 if (coupling == COUPLING_BAL) 234 { 235 tmp = buf_getbits(hBitBuf, start_bits_balance); 236 h_frame_data->iEnvelope_man[offset] = tmp << envDataTableCompFactor; 237 } 238 else 239 { 240 tmp = buf_getbits(hBitBuf, start_bits); 241 h_frame_data->iEnvelope_man[offset] = tmp; 242 } 243 } 244 245 for (i = (1 - h_frame_data->domain_vec1[j]); i < no_band[j]; i++) 246 { 247 248 if (h_frame_data->domain_vec1[j] == FREQ) 249 { 250 delta = sbr_decode_huff_cw(hcb_f, hBitBuf); 251 } 252 else 253 { 254 delta = sbr_decode_huff_cw(hcb_t, hBitBuf); 255 } 256 257 h_frame_data->iEnvelope_man[offset + i] = delta << envDataTableCompFactor; 258 } 259 offset += no_band[j]; 260 } 261 262 } 263 264 #endif 265 266