1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 /* 12 * codec.h 13 * 14 * This header file contains the calls to the internal encoder 15 * and decoder functions. 16 * 17 */ 18 19 #ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_CODEC_H_ 20 #define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_CODEC_H_ 21 22 #include "structs.h" 23 24 25 void WebRtcIsac_ResetBitstream(Bitstr* bit_stream); 26 27 int WebRtcIsac_EstimateBandwidth(BwEstimatorstr* bwest_str, Bitstr* streamdata, 28 size_t packet_size, 29 uint16_t rtp_seq_number, 30 uint32_t send_ts, uint32_t arr_ts, 31 enum IsacSamplingRate encoderSampRate, 32 enum IsacSamplingRate decoderSampRate); 33 34 int WebRtcIsac_DecodeLb(const TransformTables* transform_tables, 35 float* signal_out, 36 ISACLBDecStruct* ISACdec_obj, 37 int16_t* current_framesamples, 38 int16_t isRCUPayload); 39 40 int WebRtcIsac_DecodeRcuLb(float* signal_out, ISACLBDecStruct* ISACdec_obj, 41 int16_t* current_framesamples); 42 43 int WebRtcIsac_EncodeLb(const TransformTables* transform_tables, 44 float* in, 45 ISACLBEncStruct* ISACencLB_obj, 46 int16_t codingMode, 47 int16_t bottleneckIndex); 48 49 int WebRtcIsac_EncodeStoredDataLb(const IsacSaveEncoderData* ISACSavedEnc_obj, 50 Bitstr* ISACBitStr_obj, int BWnumber, 51 float scale); 52 53 int WebRtcIsac_EncodeStoredDataUb( 54 const ISACUBSaveEncDataStruct* ISACSavedEnc_obj, Bitstr* bitStream, 55 int32_t jitterInfo, float scale, enum ISACBandwidth bandwidth); 56 57 int16_t WebRtcIsac_GetRedPayloadUb( 58 const ISACUBSaveEncDataStruct* ISACSavedEncObj, Bitstr* bitStreamObj, 59 enum ISACBandwidth bandwidth); 60 61 /****************************************************************************** 62 * WebRtcIsac_RateAllocation() 63 * Internal function to perform a rate-allocation for upper and lower-band, 64 * given a total rate. 65 * 66 * Input: 67 * - inRateBitPerSec : a total bit-rate in bits/sec. 68 * 69 * Output: 70 * - rateLBBitPerSec : a bit-rate allocated to the lower-band 71 * in bits/sec. 72 * - rateUBBitPerSec : a bit-rate allocated to the upper-band 73 * in bits/sec. 74 * 75 * Return value : 0 if rate allocation has been successful. 76 * -1 if failed to allocate rates. 77 */ 78 79 int16_t WebRtcIsac_RateAllocation(int32_t inRateBitPerSec, 80 double* rateLBBitPerSec, 81 double* rateUBBitPerSec, 82 enum ISACBandwidth* bandwidthKHz); 83 84 85 /****************************************************************************** 86 * WebRtcIsac_DecodeUb16() 87 * 88 * Decode the upper-band if the codec is in 0-16 kHz mode. 89 * 90 * Input/Output: 91 * -ISACdec_obj : pointer to the upper-band decoder object. The 92 * bit-stream is stored inside the decoder object. 93 * 94 * Output: 95 * -signal_out : decoded audio, 480 samples 30 ms. 96 * 97 * Return value : >0 number of decoded bytes. 98 * <0 if an error occurred. 99 */ 100 int WebRtcIsac_DecodeUb16(const TransformTables* transform_tables, 101 float* signal_out, 102 ISACUBDecStruct* ISACdec_obj, 103 int16_t isRCUPayload); 104 105 /****************************************************************************** 106 * WebRtcIsac_DecodeUb12() 107 * 108 * Decode the upper-band if the codec is in 0-12 kHz mode. 109 * 110 * Input/Output: 111 * -ISACdec_obj : pointer to the upper-band decoder object. The 112 * bit-stream is stored inside the decoder object. 113 * 114 * Output: 115 * -signal_out : decoded audio, 480 samples 30 ms. 116 * 117 * Return value : >0 number of decoded bytes. 118 * <0 if an error occurred. 119 */ 120 int WebRtcIsac_DecodeUb12(const TransformTables* transform_tables, 121 float* signal_out, 122 ISACUBDecStruct* ISACdec_obj, 123 int16_t isRCUPayload); 124 125 /****************************************************************************** 126 * WebRtcIsac_EncodeUb16() 127 * 128 * Encode the upper-band if the codec is in 0-16 kHz mode. 129 * 130 * Input: 131 * -in : upper-band audio, 160 samples (10 ms). 132 * 133 * Input/Output: 134 * -ISACdec_obj : pointer to the upper-band encoder object. The 135 * bit-stream is stored inside the encoder object. 136 * 137 * Return value : >0 number of encoded bytes. 138 * <0 if an error occurred. 139 */ 140 int WebRtcIsac_EncodeUb16(const TransformTables* transform_tables, 141 float* in, 142 ISACUBEncStruct* ISACenc_obj, 143 int32_t jitterInfo); 144 145 /****************************************************************************** 146 * WebRtcIsac_EncodeUb12() 147 * 148 * Encode the upper-band if the codec is in 0-12 kHz mode. 149 * 150 * Input: 151 * -in : upper-band audio, 160 samples (10 ms). 152 * 153 * Input/Output: 154 * -ISACdec_obj : pointer to the upper-band encoder object. The 155 * bit-stream is stored inside the encoder object. 156 * 157 * Return value : >0 number of encoded bytes. 158 * <0 if an error occurred. 159 */ 160 int WebRtcIsac_EncodeUb12(const TransformTables* transform_tables, 161 float* in, 162 ISACUBEncStruct* ISACenc_obj, 163 int32_t jitterInfo); 164 165 /************************** initialization functions *************************/ 166 167 void WebRtcIsac_InitMasking(MaskFiltstr* maskdata); 168 169 void WebRtcIsac_InitPreFilterbank(PreFiltBankstr* prefiltdata); 170 171 void WebRtcIsac_InitPostFilterbank(PostFiltBankstr* postfiltdata); 172 173 void WebRtcIsac_InitPitchFilter(PitchFiltstr* pitchfiltdata); 174 175 void WebRtcIsac_InitPitchAnalysis(PitchAnalysisStruct* State); 176 177 178 /**************************** transform functions ****************************/ 179 180 void WebRtcIsac_InitTransform(TransformTables* tables); 181 182 void WebRtcIsac_Time2Spec(const TransformTables* tables, 183 double* inre1, 184 double* inre2, 185 int16_t* outre, 186 int16_t* outim, 187 FFTstr* fftstr_obj); 188 189 void WebRtcIsac_Spec2time(const TransformTables* tables, 190 double* inre, 191 double* inim, 192 double* outre1, 193 double* outre2, 194 FFTstr* fftstr_obj); 195 196 /******************************* filter functions ****************************/ 197 198 void WebRtcIsac_AllPoleFilter(double* InOut, double* Coef, size_t lengthInOut, 199 int orderCoef); 200 201 void WebRtcIsac_AllZeroFilter(double* In, double* Coef, size_t lengthInOut, 202 int orderCoef, double* Out); 203 204 void WebRtcIsac_ZeroPoleFilter(double* In, double* ZeroCoef, double* PoleCoef, 205 size_t lengthInOut, int orderCoef, double* Out); 206 207 208 /***************************** filterbank functions **************************/ 209 210 void WebRtcIsac_SplitAndFilterFloat(float* in, float* LP, float* HP, 211 double* LP_la, double* HP_la, 212 PreFiltBankstr* prefiltdata); 213 214 215 void WebRtcIsac_FilterAndCombineFloat(float* InLP, float* InHP, float* Out, 216 PostFiltBankstr* postfiltdata); 217 218 219 /************************* normalized lattice filters ************************/ 220 221 void WebRtcIsac_NormLatticeFilterMa(int orderCoef, float* stateF, float* stateG, 222 float* lat_in, double* filtcoeflo, 223 double* lat_out); 224 225 void WebRtcIsac_NormLatticeFilterAr(int orderCoef, float* stateF, float* stateG, 226 double* lat_in, double* lo_filt_coef, 227 float* lat_out); 228 229 void WebRtcIsac_Dir2Lat(double* a, int orderCoef, float* sth, float* cth); 230 231 void WebRtcIsac_AutoCorr(double* r, const double* x, size_t N, size_t order); 232 233 #endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_CODEC_H_ */ 234