1a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* 2a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * 4a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * Use of this source code is governed by a BSD-style license 5a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * that can be found in the LICENSE file in the root of the source 6a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * tree. An additional intellectual property rights grant can be found 7a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * in the file PATENTS. All contributing project authors may 8a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * be found in the AUTHORS file in the root of the source tree. 9a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin */ 10a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 11a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* 12a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * codec.h 13a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * 14a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * This header file contains the calls to the internal encoder 15a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * and decoder functions. 16a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * 17a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin */ 18a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 19a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_CODEC_H_ 20a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_CODEC_H_ 21a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 22a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include "structs.h" 23a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 24a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 25a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinint WebRtcIsacfix_EstimateBandwidth(BwEstimatorstr *bwest_str, 26a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin Bitstr_dec *streamdata, 27a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word32 packet_size, 28a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_UWord16 rtp_seq_number, 29a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_UWord32 send_ts, 30a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_UWord32 arr_ts); 31a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 32a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word16 WebRtcIsacfix_DecodeImpl(WebRtc_Word16 *signal_out16, 33a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin ISACFIX_DecInst_t *ISACdec_obj, 34a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *current_framesamples); 35a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 36a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word16 WebRtcIsacfix_DecodePlcImpl(WebRtc_Word16 *decoded, 37a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin ISACFIX_DecInst_t *ISACdec_obj, 38a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *current_framesample ); 39a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 40a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinint WebRtcIsacfix_EncodeImpl(WebRtc_Word16 *in, 41a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin ISACFIX_EncInst_t *ISACenc_obj, 42a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin BwEstimatorstr *bw_estimatordata, 43a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 CodingMode); 44a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 45a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinint WebRtcIsacfix_EncodeStoredData(ISACFIX_EncInst_t *ISACenc_obj, 46a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin int BWnumber, 47a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin float scale); 48a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 49a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* initialization functions */ 50a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 51a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_InitMaskingEnc(MaskFiltstr_enc *maskdata); 52a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_InitMaskingDec(MaskFiltstr_dec *maskdata); 53a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 54a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_InitPreFilterbank(PreFiltBankstr *prefiltdata); 55a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 56a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_InitPostFilterbank(PostFiltBankstr *postfiltdata); 57a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 58a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_InitPitchFilter(PitchFiltstr *pitchfiltdata); 59a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 60a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_InitPitchAnalysis(PitchAnalysisStruct *State); 61a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 62a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_InitPlc( PLCstr *State ); 63a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 64a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 65a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* transform functions */ 66a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 67a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_InitTransform(); 68a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 69a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 70a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_Time2Spec(WebRtc_Word16 *inre1Q9, 71a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *inre2Q9, 72a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *outre, 73a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *outim); 74a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 75a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 76a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 77a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_Spec2Time(WebRtc_Word16 *inreQ7, 78a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *inimQ7, 79a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word32 *outre1Q16, 80a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word32 *outre2Q16); 81a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 82a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 83a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 84a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 85a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* filterbank functions */ 86a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 87a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_SplitAndFilter1(WebRtc_Word16 *in, 88a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *LP16, 89a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *HP16, 90a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin PreFiltBankstr *prefiltdata); 91a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 92a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_FilterAndCombine1(WebRtc_Word16 *tempin_ch1, 93a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *tempin_ch2, 94a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *out16, 95a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin PostFiltBankstr *postfiltdata); 96a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 97a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED 98a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 99a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_SplitAndFilter2(WebRtc_Word16 *in, 100a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *LP16, 101a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *HP16, 102a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin PreFiltBankstr *prefiltdata); 103a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 104a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_FilterAndCombine2(WebRtc_Word16 *tempin_ch1, 105a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *tempin_ch2, 106a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *out16, 107a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin PostFiltBankstr *postfiltdata, 108a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 len); 109a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 110a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#endif 111a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 112a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* normalized lattice filters */ 113a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 114a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_NormLatticeFilterMa(WebRtc_Word16 orderCoef, 115a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word32 *stateGQ15, 116a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *lat_inQ0, 117a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *filt_coefQ15, 118a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word32 *gain_lo_hiQ17, 119a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 lo_hi, 120a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *lat_outQ9); 121a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 122a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_NormLatticeFilterAr(WebRtc_Word16 orderCoef, 123a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *stateGQ0, 124a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word32 *lat_inQ25, 125a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *filt_coefQ15, 126a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word32 *gain_lo_hiQ17, 127a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 lo_hi, 128a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 *lat_outQ0); 129a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 130a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* TODO(kma): Remove the following functions into individual header files. */ 131a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 132a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* Internal functions in both C and ARM Neon versions */ 133a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 134a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinint WebRtcIsacfix_AutocorrC(WebRtc_Word32* __restrict r, 135a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin const WebRtc_Word16* __restrict x, 136a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 N, 137a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 order, 138a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16* __restrict scale); 139a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 140a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_FilterMaLoopC(int16_t input0, 141a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin int16_t input1, 142a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin int32_t input2, 143a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin int32_t* ptr0, 144a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin int32_t* ptr1, 145a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin int32_t* ptr2); 146a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 147a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON) 148a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinint WebRtcIsacfix_AutocorrNeon(WebRtc_Word32* __restrict r, 149a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin const WebRtc_Word16* __restrict x, 150a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 N, 151a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 order, 152a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16* __restrict scale); 153a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 154a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_FilterMaLoopNeon(int16_t input0, 155a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin int16_t input1, 156a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin int32_t input2, 157a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin int32_t* ptr0, 158a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin int32_t* ptr1, 159a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin int32_t* ptr2); 160a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#endif 161a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 162a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* Function pointers associated with the above functions. */ 163a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 164a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkintypedef int (*AutocorrFix)(WebRtc_Word32* __restrict r, 165a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin const WebRtc_Word16* __restrict x, 166a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 N, 167a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16 order, 168a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word16* __restrict scale); 169a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinextern AutocorrFix WebRtcIsacfix_AutocorrFix; 170a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 171a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkintypedef void (*FilterMaLoopFix)(int16_t input0, 172a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin int16_t input1, 173a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin int32_t input2, 174a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin int32_t* ptr0, 175a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin int32_t* ptr1, 176a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin int32_t* ptr2); 177a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinextern FilterMaLoopFix WebRtcIsacfix_FilterMaLoopFix; 178a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 179a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_CODEC_H_ */ 180