• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 // Performs delay estimation on block by block basis.
12 // The return value is  0 - OK and -1 - Error, unless otherwise stated.
13 
14 #ifndef WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_WRAPPER_H_
15 #define WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_WRAPPER_H_
16 
17 #include "webrtc/typedefs.h"
18 
19 // Releases the memory allocated by WebRtc_CreateDelayEstimatorFarend(...)
20 void WebRtc_FreeDelayEstimatorFarend(void* handle);
21 
22 // Allocates the memory needed by the far-end part of the delay estimation. The
23 // memory needs to be initialized separately through
24 // WebRtc_InitDelayEstimatorFarend(...).
25 //
26 // Inputs:
27 //  - spectrum_size     : Size of the spectrum used both in far-end and
28 //                        near-end. Used to allocate memory for spectrum
29 //                        specific buffers.
30 //  - history_size      : The far-end history buffer size. A change in buffer
31 //                        size can be forced with WebRtc_set_history_size().
32 //                        Note that the maximum delay which can be estimated is
33 //                        determined together with WebRtc_set_lookahead().
34 //
35 // Return value:
36 //  - void*             : Created |handle|. If the memory can't be allocated or
37 //                        if any of the input parameters are invalid NULL is
38 //                        returned.
39 void* WebRtc_CreateDelayEstimatorFarend(int spectrum_size, int history_size);
40 
41 // Initializes the far-end part of the delay estimation instance returned by
42 // WebRtc_CreateDelayEstimatorFarend(...)
43 int WebRtc_InitDelayEstimatorFarend(void* handle);
44 
45 // Soft resets the far-end part of the delay estimation instance returned by
46 // WebRtc_CreateDelayEstimatorFarend(...).
47 // Input:
48 //      - delay_shift   : The amount of blocks to shift history buffers.
49 void WebRtc_SoftResetDelayEstimatorFarend(void* handle, int delay_shift);
50 
51 // Adds the far-end spectrum to the far-end history buffer. This spectrum is
52 // used as reference when calculating the delay using
53 // WebRtc_ProcessSpectrum().
54 //
55 // Inputs:
56 //    - far_spectrum    : Far-end spectrum.
57 //    - spectrum_size   : The size of the data arrays (same for both far- and
58 //                        near-end).
59 //    - far_q           : The Q-domain of the far-end data.
60 //
61 // Output:
62 //    - handle          : Updated far-end instance.
63 //
64 int WebRtc_AddFarSpectrumFix(void* handle,
65                              const uint16_t* far_spectrum,
66                              int spectrum_size,
67                              int far_q);
68 
69 // See WebRtc_AddFarSpectrumFix() for description.
70 int WebRtc_AddFarSpectrumFloat(void* handle,
71                                const float* far_spectrum,
72                                int spectrum_size);
73 
74 // Releases the memory allocated by WebRtc_CreateDelayEstimator(...)
75 void WebRtc_FreeDelayEstimator(void* handle);
76 
77 // Allocates the memory needed by the delay estimation. The memory needs to be
78 // initialized separately through WebRtc_InitDelayEstimator(...).
79 //
80 // Inputs:
81 //      - farend_handle : Pointer to the far-end part of the delay estimation
82 //                        instance created prior to this call using
83 //                        WebRtc_CreateDelayEstimatorFarend().
84 //
85 //                        Note that WebRtc_CreateDelayEstimator does not take
86 //                        ownership of |farend_handle|, which has to be torn
87 //                        down properly after this instance.
88 //
89 //      - max_lookahead : Maximum amount of non-causal lookahead allowed. The
90 //                        actual amount of lookahead used can be controlled by
91 //                        WebRtc_set_lookahead(...). The default |lookahead| is
92 //                        set to |max_lookahead| at create time. Use
93 //                        WebRtc_set_lookahead(...) before start if a different
94 //                        value is desired.
95 //
96 //                        Using lookahead can detect cases in which a near-end
97 //                        signal occurs before the corresponding far-end signal.
98 //                        It will delay the estimate for the current block by an
99 //                        equal amount, and the returned values will be offset
100 //                        by it.
101 //
102 //                        A value of zero is the typical no-lookahead case.
103 //                        This also represents the minimum delay which can be
104 //                        estimated.
105 //
106 //                        Note that the effective range of delay estimates is
107 //                        [-|lookahead|,... ,|history_size|-|lookahead|)
108 //                        where |history_size| is set through
109 //                        WebRtc_set_history_size().
110 //
111 // Return value:
112 //      - void*         : Created |handle|. If the memory can't be allocated or
113 //                        if any of the input parameters are invalid NULL is
114 //                        returned.
115 void* WebRtc_CreateDelayEstimator(void* farend_handle, int max_lookahead);
116 
117 // Initializes the delay estimation instance returned by
118 // WebRtc_CreateDelayEstimator(...)
119 int WebRtc_InitDelayEstimator(void* handle);
120 
121 // Soft resets the delay estimation instance returned by
122 // WebRtc_CreateDelayEstimator(...)
123 // Input:
124 //      - delay_shift   : The amount of blocks to shift history buffers.
125 //
126 // Return value:
127 //      - actual_shifts : The actual number of shifts performed.
128 int WebRtc_SoftResetDelayEstimator(void* handle, int delay_shift);
129 
130 // Sets the effective |history_size| used. Valid values from 2. We simply need
131 // at least two delays to compare to perform an estimate. If |history_size| is
132 // changed, buffers are reallocated filling in with zeros if necessary.
133 // Note that changing the |history_size| affects both buffers in far-end and
134 // near-end. Hence it is important to change all DelayEstimators that use the
135 // same reference far-end, to the same |history_size| value.
136 // Inputs:
137 //  - handle            : Pointer to the delay estimation instance.
138 //  - history_size      : Effective history size to be used.
139 // Return value:
140 //  - new_history_size  : The new history size used. If the memory was not able
141 //                        to be allocated 0 is returned.
142 int WebRtc_set_history_size(void* handle, int history_size);
143 
144 // Returns the history_size currently used.
145 // Input:
146 //      - handle        : Pointer to the delay estimation instance.
147 int WebRtc_history_size(const void* handle);
148 
149 // Sets the amount of |lookahead| to use. Valid values are [0, max_lookahead]
150 // where |max_lookahead| was set at create time through
151 // WebRtc_CreateDelayEstimator(...).
152 //
153 // Input:
154 //      - handle        : Pointer to the delay estimation instance.
155 //      - lookahead     : The amount of lookahead to be used.
156 //
157 // Return value:
158 //      - new_lookahead : The actual amount of lookahead set, unless |handle| is
159 //                        a NULL pointer or |lookahead| is invalid, for which an
160 //                        error is returned.
161 int WebRtc_set_lookahead(void* handle, int lookahead);
162 
163 // Returns the amount of lookahead we currently use.
164 // Input:
165 //      - handle        : Pointer to the delay estimation instance.
166 int WebRtc_lookahead(void* handle);
167 
168 // Sets the |allowed_offset| used in the robust validation scheme.  If the
169 // delay estimator is used in an echo control component, this parameter is
170 // related to the filter length.  In principle |allowed_offset| should be set to
171 // the echo control filter length minus the expected echo duration, i.e., the
172 // delay offset the echo control can handle without quality regression.  The
173 // default value, used if not set manually, is zero.  Note that |allowed_offset|
174 // has to be non-negative.
175 // Inputs:
176 //  - handle            : Pointer to the delay estimation instance.
177 //  - allowed_offset    : The amount of delay offset, measured in partitions,
178 //                        the echo control filter can handle.
179 int WebRtc_set_allowed_offset(void* handle, int allowed_offset);
180 
181 // Returns the |allowed_offset| in number of partitions.
182 int WebRtc_get_allowed_offset(const void* handle);
183 
184 // Enables/Disables a robust validation functionality in the delay estimation.
185 // This is by default set to disabled at create time.  The state is preserved
186 // over a reset.
187 // Inputs:
188 //      - handle        : Pointer to the delay estimation instance.
189 //      - enable        : Enable (1) or disable (0) this feature.
190 int WebRtc_enable_robust_validation(void* handle, int enable);
191 
192 // Returns 1 if robust validation is enabled and 0 if disabled.
193 int WebRtc_is_robust_validation_enabled(const void* handle);
194 
195 // Estimates and returns the delay between the far-end and near-end blocks. The
196 // value will be offset by the lookahead (i.e. the lookahead should be
197 // subtracted from the returned value).
198 // Inputs:
199 //      - handle        : Pointer to the delay estimation instance.
200 //      - near_spectrum : Pointer to the near-end spectrum data of the current
201 //                        block.
202 //      - spectrum_size : The size of the data arrays (same for both far- and
203 //                        near-end).
204 //      - near_q        : The Q-domain of the near-end data.
205 //
206 // Output:
207 //      - handle        : Updated instance.
208 //
209 // Return value:
210 //      - delay         :  >= 0 - Calculated delay value.
211 //                        -1    - Error.
212 //                        -2    - Insufficient data for estimation.
213 int WebRtc_DelayEstimatorProcessFix(void* handle,
214                                     const uint16_t* near_spectrum,
215                                     int spectrum_size,
216                                     int near_q);
217 
218 // See WebRtc_DelayEstimatorProcessFix() for description.
219 int WebRtc_DelayEstimatorProcessFloat(void* handle,
220                                       const float* near_spectrum,
221                                       int spectrum_size);
222 
223 // Returns the last calculated delay updated by the function
224 // WebRtc_DelayEstimatorProcess(...).
225 //
226 // Input:
227 //      - handle        : Pointer to the delay estimation instance.
228 //
229 // Return value:
230 //      - delay         : >= 0  - Last calculated delay value.
231 //                        -1    - Error.
232 //                        -2    - Insufficient data for estimation.
233 int WebRtc_last_delay(void* handle);
234 
235 // Returns the estimation quality/probability of the last calculated delay
236 // updated by the function WebRtc_DelayEstimatorProcess(...). The estimation
237 // quality is a value in the interval [0, 1]. The higher the value, the better
238 // the quality.
239 //
240 // Return value:
241 //      - delay_quality : >= 0  - Estimation quality of last calculated delay.
242 float WebRtc_last_delay_quality(void* handle);
243 
244 #endif  // WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_WRAPPER_H_
245