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_FIX_SOURCE_CODEC_H_
20 #define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_CODEC_H_
21 
22 #include "structs.h"
23 
24 
25 int WebRtcIsacfix_EstimateBandwidth(BwEstimatorstr   *bwest_str,
26                                     Bitstr_dec       *streamdata,
27                                     WebRtc_Word32      packet_size,
28                                     WebRtc_UWord16     rtp_seq_number,
29                                     WebRtc_UWord32     send_ts,
30                                     WebRtc_UWord32     arr_ts);
31 
32 WebRtc_Word16 WebRtcIsacfix_DecodeImpl(WebRtc_Word16   *signal_out16,
33                                        ISACFIX_DecInst_t  *ISACdec_obj,
34                                        WebRtc_Word16        *current_framesamples);
35 
36 WebRtc_Word16 WebRtcIsacfix_DecodePlcImpl(WebRtc_Word16       *decoded,
37                                           ISACFIX_DecInst_t *ISACdec_obj,
38                                           WebRtc_Word16       *current_framesample );
39 
40 int WebRtcIsacfix_EncodeImpl(WebRtc_Word16      *in,
41                              ISACFIX_EncInst_t  *ISACenc_obj,
42                              BwEstimatorstr      *bw_estimatordata,
43                              WebRtc_Word16         CodingMode);
44 
45 int WebRtcIsacfix_EncodeStoredData(ISACFIX_EncInst_t  *ISACenc_obj,
46                                    int     BWnumber,
47                                    float              scale);
48 
49 /* initialization functions */
50 
51 void WebRtcIsacfix_InitMaskingEnc(MaskFiltstr_enc *maskdata);
52 void WebRtcIsacfix_InitMaskingDec(MaskFiltstr_dec *maskdata);
53 
54 void WebRtcIsacfix_InitPreFilterbank(PreFiltBankstr *prefiltdata);
55 
56 void WebRtcIsacfix_InitPostFilterbank(PostFiltBankstr *postfiltdata);
57 
58 void WebRtcIsacfix_InitPitchFilter(PitchFiltstr *pitchfiltdata);
59 
60 void WebRtcIsacfix_InitPitchAnalysis(PitchAnalysisStruct *State);
61 
62 void WebRtcIsacfix_InitPlc( PLCstr *State );
63 
64 
65 /* transform functions */
66 
67 void WebRtcIsacfix_InitTransform();
68 
69 
70 void WebRtcIsacfix_Time2Spec(WebRtc_Word16 *inre1Q9,
71                              WebRtc_Word16 *inre2Q9,
72                              WebRtc_Word16 *outre,
73                              WebRtc_Word16 *outim);
74 
75 
76 
77 void WebRtcIsacfix_Spec2Time(WebRtc_Word16 *inreQ7,
78                              WebRtc_Word16 *inimQ7,
79                              WebRtc_Word32 *outre1Q16,
80                              WebRtc_Word32 *outre2Q16);
81 
82 
83 
84 
85 /* filterbank functions */
86 
87 void WebRtcIsacfix_SplitAndFilter1(WebRtc_Word16    *in,
88                                    WebRtc_Word16    *LP16,
89                                    WebRtc_Word16    *HP16,
90                                    PreFiltBankstr *prefiltdata);
91 
92 void WebRtcIsacfix_FilterAndCombine1(WebRtc_Word16     *tempin_ch1,
93                                      WebRtc_Word16     *tempin_ch2,
94                                      WebRtc_Word16     *out16,
95                                      PostFiltBankstr *postfiltdata);
96 
97 #ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
98 
99 void WebRtcIsacfix_SplitAndFilter2(WebRtc_Word16    *in,
100                                    WebRtc_Word16    *LP16,
101                                    WebRtc_Word16    *HP16,
102                                    PreFiltBankstr *prefiltdata);
103 
104 void WebRtcIsacfix_FilterAndCombine2(WebRtc_Word16     *tempin_ch1,
105                                      WebRtc_Word16     *tempin_ch2,
106                                      WebRtc_Word16     *out16,
107                                      PostFiltBankstr *postfiltdata,
108                                      WebRtc_Word16     len);
109 
110 #endif
111 
112 /* normalized lattice filters */
113 
114 void WebRtcIsacfix_NormLatticeFilterMa(WebRtc_Word16 orderCoef,
115                                        WebRtc_Word32 *stateGQ15,
116                                        WebRtc_Word16 *lat_inQ0,
117                                        WebRtc_Word16 *filt_coefQ15,
118                                        WebRtc_Word32 *gain_lo_hiQ17,
119                                        WebRtc_Word16 lo_hi,
120                                        WebRtc_Word16 *lat_outQ9);
121 
122 void WebRtcIsacfix_NormLatticeFilterAr(WebRtc_Word16 orderCoef,
123                                        WebRtc_Word16 *stateGQ0,
124                                        WebRtc_Word32 *lat_inQ25,
125                                        WebRtc_Word16 *filt_coefQ15,
126                                        WebRtc_Word32 *gain_lo_hiQ17,
127                                        WebRtc_Word16 lo_hi,
128                                        WebRtc_Word16 *lat_outQ0);
129 
130 /* TODO(kma): Remove the following functions into individual header files. */
131 
132 /* Internal functions in both C and ARM Neon versions */
133 
134 int WebRtcIsacfix_AutocorrC(WebRtc_Word32* __restrict r,
135                             const WebRtc_Word16* __restrict x,
136                             WebRtc_Word16 N,
137                             WebRtc_Word16 order,
138                             WebRtc_Word16* __restrict scale);
139 
140 void WebRtcIsacfix_FilterMaLoopC(int16_t input0,
141                                  int16_t input1,
142                                  int32_t input2,
143                                  int32_t* ptr0,
144                                  int32_t* ptr1,
145                                  int32_t* ptr2);
146 
147 #if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON)
148 int WebRtcIsacfix_AutocorrNeon(WebRtc_Word32* __restrict r,
149                                const WebRtc_Word16* __restrict x,
150                                WebRtc_Word16 N,
151                                WebRtc_Word16 order,
152                                WebRtc_Word16* __restrict scale);
153 
154 void WebRtcIsacfix_FilterMaLoopNeon(int16_t input0,
155                                     int16_t input1,
156                                     int32_t input2,
157                                     int32_t* ptr0,
158                                     int32_t* ptr1,
159                                     int32_t* ptr2);
160 #endif
161 
162 /* Function pointers associated with the above functions. */
163 
164 typedef int (*AutocorrFix)(WebRtc_Word32* __restrict r,
165                            const WebRtc_Word16* __restrict x,
166                            WebRtc_Word16 N,
167                            WebRtc_Word16 order,
168                            WebRtc_Word16* __restrict scale);
169 extern AutocorrFix WebRtcIsacfix_AutocorrFix;
170 
171 typedef void (*FilterMaLoopFix)(int16_t input0,
172                                 int16_t input1,
173                                 int32_t input2,
174                                 int32_t* ptr0,
175                                 int32_t* ptr1,
176                                 int32_t* ptr2);
177 extern FilterMaLoopFix WebRtcIsacfix_FilterMaLoopFix;
178 
179 #endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_CODEC_H_ */
180