Re-committing r3428
TBR=ajm
BUG=None
Review URL: https://webrtc-codereview.appspot.com/1066008
git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@3436 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/modules/audio_processing/aec/aec_core.c b/modules/audio_processing/aec/aec_core.c
index 1f3123f..191a505 100644
--- a/modules/audio_processing/aec/aec_core.c
+++ b/modules/audio_processing/aec/aec_core.c
@@ -206,9 +206,16 @@
return -1;
}
#endif
- aec->delay_estimator = WebRtc_CreateDelayEstimator(PART_LEN1,
- kMaxDelayBlocks,
- kLookaheadBlocks);
+ aec->delay_estimator_farend =
+ WebRtc_CreateDelayEstimatorFarend(PART_LEN1, kHistorySizeBlocks);
+ if (aec->delay_estimator_farend == NULL) {
+ WebRtcAec_FreeAec(aec);
+ aec = NULL;
+ return -1;
+ }
+ aec->delay_estimator =
+ WebRtc_CreateDelayEstimator(aec->delay_estimator_farend,
+ kLookaheadBlocks);
if (aec->delay_estimator == NULL) {
WebRtcAec_FreeAec(aec);
aec = NULL;
@@ -236,6 +243,7 @@
WebRtc_FreeBuffer(aec->far_time_buf);
#endif
WebRtc_FreeDelayEstimator(aec->delay_estimator);
+ WebRtc_FreeDelayEstimatorFarend(aec->delay_estimator_farend);
free(aec);
return 0;
@@ -428,6 +436,9 @@
#endif
aec->system_delay = 0;
+ if (WebRtc_InitDelayEstimatorFarend(aec->delay_estimator_farend) != 0) {
+ return -1;
+ }
if (WebRtc_InitDelayEstimator(aec->delay_estimator) != 0) {
return -1;
}
@@ -748,14 +759,15 @@
// Block wise delay estimation used for logging
if (aec->delay_logging_enabled) {
int delay_estimate = 0;
- // Estimate the delay
- delay_estimate = WebRtc_DelayEstimatorProcessFloat(aec->delay_estimator,
- abs_far_spectrum,
- abs_near_spectrum,
- PART_LEN1);
- if (delay_estimate >= 0) {
- // Update delay estimate buffer.
- aec->delay_histogram[delay_estimate]++;
+ if (WebRtc_AddFarSpectrumFloat(aec->delay_estimator_farend,
+ abs_far_spectrum, PART_LEN1) == 0) {
+ delay_estimate = WebRtc_DelayEstimatorProcessFloat(aec->delay_estimator,
+ abs_near_spectrum,
+ PART_LEN1);
+ if (delay_estimate >= 0) {
+ // Update delay estimate buffer.
+ aec->delay_histogram[delay_estimate]++;
+ }
}
}
diff --git a/modules/audio_processing/aec/aec_core.h b/modules/audio_processing/aec/aec_core.h
index c07528d..43b69b3 100644
--- a/modules/audio_processing/aec/aec_core.h
+++ b/modules/audio_processing/aec/aec_core.h
@@ -19,12 +19,12 @@
#include <stdio.h>
#endif
-#include "typedefs.h"
+#include "webrtc/typedefs.h"
#define FRAME_LEN 80
-#define PART_LEN 64 // Length of partition
-#define PART_LEN1 (PART_LEN + 1) // Unique fft coefficients
-#define PART_LEN2 (PART_LEN * 2) // Length of partition * 2
+#define PART_LEN 64 // Length of partition
+#define PART_LEN1 (PART_LEN + 1) // Unique fft coefficients
+#define PART_LEN2 (PART_LEN * 2) // Length of partition * 2
#define NR_PART 12 // Number of partitions in filter.
#define PREF_BAND_SIZE 24
@@ -79,10 +79,10 @@
void *nearFrBufH;
void *outFrBufH;
- float dBuf[PART_LEN2]; // nearend
- float eBuf[PART_LEN2]; // error
+ float dBuf[PART_LEN2]; // nearend
+ float eBuf[PART_LEN2]; // error
- float dBufH[PART_LEN2]; // nearend
+ float dBufH[PART_LEN2]; // nearend
float xPow[PART_LEN1];
float dPow[PART_LEN1];
@@ -90,13 +90,13 @@
float dInitMinPow[PART_LEN1];
float *noisePow;
- float xfBuf[2][NR_PART * PART_LEN1]; // farend fft buffer
- float wfBuf[2][NR_PART * PART_LEN1]; // filter fft
- complex_t sde[PART_LEN1]; // cross-psd of nearend and error
- complex_t sxd[PART_LEN1]; // cross-psd of farend and nearend
- complex_t xfwBuf[NR_PART * PART_LEN1]; // farend windowed fft buffer
+ float xfBuf[2][NR_PART * PART_LEN1]; // farend fft buffer
+ float wfBuf[2][NR_PART * PART_LEN1]; // filter fft
+ complex_t sde[PART_LEN1]; // cross-psd of nearend and error
+ complex_t sxd[PART_LEN1]; // cross-psd of farend and nearend
+ complex_t xfwBuf[NR_PART * PART_LEN1]; // farend windowed fft buffer
- float sx[PART_LEN1], sd[PART_LEN1], se[PART_LEN1]; // far, near and error psd
+ float sx[PART_LEN1], sd[PART_LEN1], se[PART_LEN1]; // far, near, error psd
float hNs[PART_LEN1];
float hNlFbMin, hNlFbLocalMin;
float hNlXdAvgMin;
@@ -119,8 +119,8 @@
int sampFreq;
WebRtc_UWord32 seed;
- float mu; // stepsize
- float errThresh; // error threshold
+ float mu; // stepsize
+ float errThresh; // error threshold
int noiseEstCtr;
@@ -137,12 +137,13 @@
stats_t rerl;
// Quantities to control H band scaling for SWB input
- int freq_avg_ic; //initial bin for averaging nlp gain
- int flag_Hband_cn; //for comfort noise
- float cn_scale_Hband; //scale for comfort noise in H band
+ int freq_avg_ic; // initial bin for averaging nlp gain
+ int flag_Hband_cn; // for comfort noise
+ float cn_scale_Hband; // scale for comfort noise in H band
int delay_histogram[kHistorySizeBlocks];
int delay_logging_enabled;
+ void* delay_estimator_farend;
void* delay_estimator;
#ifdef WEBRTC_AEC_DEBUG_DUMP
diff --git a/modules/audio_processing/aecm/aecm_core.c b/modules/audio_processing/aecm/aecm_core.c
index 28eb4f2..a81912e 100644
--- a/modules/audio_processing/aecm/aecm_core.c
+++ b/modules/audio_processing/aecm/aecm_core.c
@@ -8,19 +8,19 @@
* be found in the AUTHORS file in the root of the source tree.
*/
-#include "aecm_core.h"
+#include "webrtc/modules/audio_processing/aecm/aecm_core.h"
#include <assert.h>
#include <stddef.h>
#include <stdlib.h>
-#include "common_audio/signal_processing/include/real_fft.h"
-#include "cpu_features_wrapper.h"
-#include "delay_estimator_wrapper.h"
-#include "echo_control_mobile.h"
-#include "ring_buffer.h"
-#include "system_wrappers/interface/compile_assert.h"
-#include "typedefs.h"
+#include "webrtc/common_audio/signal_processing/include/real_fft.h"
+#include "webrtc/modules/audio_processing/utility/delay_estimator_wrapper.h"
+#include "webrtc/modules/audio_processing/aecm/include/echo_control_mobile.h"
+#include "webrtc/modules/audio_processing/utility/ring_buffer.h"
+#include "webrtc/system_wrappers/interface/compile_assert.h"
+#include "webrtc/system_wrappers/interface/cpu_features_wrapper.h"
+#include "webrtc/typedefs.h"
#ifdef AEC_DEBUG
FILE *dfile;
@@ -288,8 +288,15 @@
return -1;
}
- aecm->delay_estimator = WebRtc_CreateDelayEstimator(PART_LEN1, MAX_DELAY,
- 0);
+ aecm->delay_estimator_farend = WebRtc_CreateDelayEstimatorFarend(PART_LEN1,
+ MAX_DELAY);
+ if (aecm->delay_estimator_farend == NULL) {
+ WebRtcAecm_FreeCore(aecm);
+ aecm = NULL;
+ return -1;
+ }
+ aecm->delay_estimator =
+ WebRtc_CreateDelayEstimator(aecm->delay_estimator_farend, 0);
if (aecm->delay_estimator == NULL) {
WebRtcAecm_FreeCore(aecm);
aecm = NULL;
@@ -565,6 +572,9 @@
aecm->seed = 666;
aecm->totCount = 0;
+ if (WebRtc_InitDelayEstimatorFarend(aecm->delay_estimator_farend) != 0) {
+ return -1;
+ }
if (WebRtc_InitDelayEstimator(aecm->delay_estimator) != 0) {
return -1;
}
@@ -682,6 +692,7 @@
WebRtc_FreeBuffer(aecm->outFrameBuf);
WebRtc_FreeDelayEstimator(aecm->delay_estimator);
+ WebRtc_FreeDelayEstimatorFarend(aecm->delay_estimator_farend);
WebRtcSpl_FreeRealFFT(aecm->real_fft);
free(aecm);
@@ -1592,11 +1603,13 @@
// Get the delay
// Save far-end history and estimate delay
UpdateFarHistory(aecm, xfa, far_q);
+ if (WebRtc_AddFarSpectrumFix(aecm->delay_estimator_farend, xfa, PART_LEN1,
+ far_q) == -1) {
+ return -1;
+ }
delay = WebRtc_DelayEstimatorProcessFix(aecm->delay_estimator,
- xfa,
dfaNoisy,
PART_LEN1,
- far_q,
zerosDBufNoisy);
if (delay == -1)
{
diff --git a/modules/audio_processing/aecm/aecm_core.h b/modules/audio_processing/aecm/aecm_core.h
index 3e0816f..1038258 100644
--- a/modules/audio_processing/aecm/aecm_core.h
+++ b/modules/audio_processing/aecm/aecm_core.h
@@ -17,10 +17,10 @@
#include "modules/audio_processing/aecm/aecm_defines.h"
#include "typedefs.h"
-#ifdef _MSC_VER // visual c++
+#ifdef _MSC_VER // visual c++
#define ALIGN8_BEG __declspec(align(8))
#define ALIGN8_END
-#else // gcc or icc
+#else // gcc or icc
#define ALIGN8_BEG
#define ALIGN8_END __attribute__((aligned(8)))
#endif
@@ -30,13 +30,12 @@
WebRtc_Word16 imag;
} complex16_t;
-typedef struct
-{
+typedef struct {
int farBufWritePos;
int farBufReadPos;
int knownDelay;
int lastKnownDelay;
- int firstVAD; // Parameter to control poorly initialized channels
+ int firstVAD; // Parameter to control poorly initialized channels
void *farFrameBuf;
void *nearNoisyFrameBuf;
@@ -49,6 +48,7 @@
WebRtc_UWord32 seed;
// Delay estimation variables
+ void* delay_estimator_farend;
void* delay_estimator;
WebRtc_UWord16 currentDelay;
// Far end history variables
@@ -72,15 +72,16 @@
WebRtc_Word16 echoAdaptLogEnergy[MAX_BUF_LEN];
WebRtc_Word16 echoStoredLogEnergy[MAX_BUF_LEN];
- // The extra 16 or 32 bytes in the following buffers are for alignment based Neon code.
- // It's designed this way since the current GCC compiler can't align a buffer in 16 or 32
- // byte boundaries properly.
+ // The extra 16 or 32 bytes in the following buffers are for alignment based
+ // Neon code.
+ // It's designed this way since the current GCC compiler can't align a
+ // buffer in 16 or 32 byte boundaries properly.
WebRtc_Word16 channelStored_buf[PART_LEN1 + 8];
WebRtc_Word16 channelAdapt16_buf[PART_LEN1 + 8];
WebRtc_Word32 channelAdapt32_buf[PART_LEN1 + 8];
- WebRtc_Word16 xBuf_buf[PART_LEN2 + 16]; // farend
- WebRtc_Word16 dBufClean_buf[PART_LEN2 + 16]; // nearend
- WebRtc_Word16 dBufNoisy_buf[PART_LEN2 + 16]; // nearend
+ WebRtc_Word16 xBuf_buf[PART_LEN2 + 16]; // farend
+ WebRtc_Word16 dBufClean_buf[PART_LEN2 + 16]; // nearend
+ WebRtc_Word16 dBufNoisy_buf[PART_LEN2 + 16]; // nearend
WebRtc_Word16 outBuf_buf[PART_LEN + 8];
// Pointers to the above buffers
@@ -131,7 +132,7 @@
#endif
} AecmCore_t;
-///////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
// WebRtcAecm_CreateCore(...)
//
// Allocates the memory needed by the AECM. The memory needs to be
@@ -148,10 +149,11 @@
//
int WebRtcAecm_CreateCore(AecmCore_t **aecm);
-///////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
// WebRtcAecm_InitCore(...)
//
-// This function initializes the AECM instant created with WebRtcAecm_CreateCore(...)
+// This function initializes the AECM instant created with
+// WebRtcAecm_CreateCore(...)
// Input:
// - aecm : Pointer to the AECM instance
// - samplingFreq : Sampling Frequency
@@ -164,7 +166,7 @@
//
int WebRtcAecm_InitCore(AecmCore_t * const aecm, int samplingFreq);
-///////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
// WebRtcAecm_FreeCore(...)
//
// This function releases the memory allocated by WebRtcAecm_CreateCore()
@@ -179,29 +181,34 @@
int WebRtcAecm_Control(AecmCore_t *aecm, int delay, int nlpFlag);
-///////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
// WebRtcAecm_InitEchoPathCore(...)
//
// This function resets the echo channel adaptation with the specified channel.
// Input:
// - aecm : Pointer to the AECM instance
-// - echo_path : Pointer to the data that should initialize the echo path
+// - echo_path : Pointer to the data that should initialize the echo
+// path
//
// Output:
// - aecm : Initialized instance
//
-void WebRtcAecm_InitEchoPathCore(AecmCore_t* aecm, const WebRtc_Word16* echo_path);
+void WebRtcAecm_InitEchoPathCore(AecmCore_t* aecm,
+ const WebRtc_Word16* echo_path);
-///////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
// WebRtcAecm_ProcessFrame(...)
//
-// This function processes frames and sends blocks to WebRtcAecm_ProcessBlock(...)
+// This function processes frames and sends blocks to
+// WebRtcAecm_ProcessBlock(...)
//
// Inputs:
// - aecm : Pointer to the AECM instance
// - farend : In buffer containing one frame of echo signal
-// - nearendNoisy : In buffer containing one frame of nearend+echo signal without NS
-// - nearendClean : In buffer containing one frame of nearend+echo signal with NS
+// - nearendNoisy : In buffer containing one frame of nearend+echo signal
+// without NS
+// - nearendClean : In buffer containing one frame of nearend+echo signal
+// with NS
//
// Output:
// - out : Out buffer, one frame of nearend signal :
@@ -212,7 +219,7 @@
const WebRtc_Word16 * nearendClean,
WebRtc_Word16 * out);
-///////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
// WebRtcAecm_ProcessBlock(...)
//
// This function is called for every block within one frame
@@ -221,8 +228,10 @@
// Inputs:
// - aecm : Pointer to the AECM instance
// - farend : In buffer containing one block of echo signal
-// - nearendNoisy : In buffer containing one frame of nearend+echo signal without NS
-// - nearendClean : In buffer containing one frame of nearend+echo signal with NS
+// - nearendNoisy : In buffer containing one frame of nearend+echo signal
+// without NS
+// - nearendClean : In buffer containing one frame of nearend+echo signal
+// with NS
//
// Output:
// - out : Out buffer, one block of nearend signal :
@@ -233,7 +242,7 @@
const WebRtc_Word16 * noisyClean,
WebRtc_Word16 * out);
-///////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
// WebRtcAecm_BufferFarFrame()
//
// Inserts a frame of data into farend buffer.
@@ -243,10 +252,11 @@
// - farend : In buffer containing one frame of farend signal
// - farLen : Length of frame
//
-void WebRtcAecm_BufferFarFrame(AecmCore_t * const aecm, const WebRtc_Word16 * const farend,
+void WebRtcAecm_BufferFarFrame(AecmCore_t * const aecm,
+ const WebRtc_Word16 * const farend,
const int farLen);
-///////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
// WebRtcAecm_FetchFarFrame()
//
// Read the farend buffer to account for known delay
@@ -257,11 +267,12 @@
// - farLen : Length of frame
// - knownDelay : known delay
//
-void WebRtcAecm_FetchFarFrame(AecmCore_t * const aecm, WebRtc_Word16 * const farend,
+void WebRtcAecm_FetchFarFrame(AecmCore_t * const aecm,
+ WebRtc_Word16 * const farend,
const int farLen, const int knownDelay);
///////////////////////////////////////////////////////////////////////////////
-// Some function pointers, for internal functions shared by ARM NEON and
+// Some function pointers, for internal functions shared by ARM NEON and
// generic C code.
//
typedef void (*CalcLinearEnergies)(
diff --git a/modules/audio_processing/utility/delay_estimator.c b/modules/audio_processing/utility/delay_estimator.c
index 2ef5c5f..bcbb00a 100644
--- a/modules/audio_processing/utility/delay_estimator.c
+++ b/modules/audio_processing/utility/delay_estimator.c
@@ -8,7 +8,7 @@
* be found in the AUTHORS file in the root of the source tree.
*/
-#include "delay_estimator.h"
+#include "webrtc/modules/audio_processing/utility/delay_estimator.h"
#include <assert.h>
#include <stdlib.h>
@@ -76,9 +76,12 @@
BinaryDelayEstimatorFarend* WebRtc_CreateBinaryDelayEstimatorFarend(
int history_size) {
- BinaryDelayEstimatorFarend* self = malloc(sizeof(BinaryDelayEstimatorFarend));
+ BinaryDelayEstimatorFarend* self = NULL;
- assert(history_size > 1);
+ if (history_size > 1) {
+ // Sanity conditions fulfilled.
+ self = malloc(sizeof(BinaryDelayEstimatorFarend));
+ }
if (self != NULL) {
int malloc_fail = 0;
diff --git a/modules/audio_processing/utility/delay_estimator.h b/modules/audio_processing/utility/delay_estimator.h
index 11468f2..bf2b08a 100644
--- a/modules/audio_processing/utility/delay_estimator.h
+++ b/modules/audio_processing/utility/delay_estimator.h
@@ -14,14 +14,13 @@
#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_H_
#define WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_H_
-#include "typedefs.h"
+#include "webrtc/typedefs.h"
typedef struct {
// Pointer to bit counts.
int* far_bit_counts;
// Binary history variables.
uint32_t* binary_far_history;
- // Buffer size.
int history_size;
} BinaryDelayEstimatorFarend;
@@ -34,6 +33,7 @@
// Binary history variables.
uint32_t* binary_near_history;
+ int near_history_size;
// Delay estimation variables.
int32_t minimum_probability;
@@ -42,8 +42,6 @@
// Delay memory.
int last_delay;
- // Near-end buffer size.
- int near_history_size;
// Far-end binary spectrum history buffer etc.
BinaryDelayEstimatorFarend* farend;
} BinaryDelayEstimator;
@@ -94,7 +92,7 @@
// - binary_far_spectrum : Far-end binary spectrum.
//
// Output:
-// - handle : Updated far-end instance.
+// - self : Updated far-end instance.
//
void WebRtc_AddBinaryFarSpectrum(BinaryDelayEstimatorFarend* self,
uint32_t binary_far_spectrum);
diff --git a/modules/audio_processing/utility/delay_estimator_internal.h b/modules/audio_processing/utility/delay_estimator_internal.h
index 43bbc4d..fd11028 100644
--- a/modules/audio_processing/utility/delay_estimator_internal.h
+++ b/modules/audio_processing/utility/delay_estimator_internal.h
@@ -13,8 +13,8 @@
#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_INTERNAL_H_
#define WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_INTERNAL_H_
-#include "modules/audio_processing/utility/delay_estimator.h"
-#include "typedefs.h"
+#include "webrtc/modules/audio_processing/utility/delay_estimator.h"
+#include "webrtc/typedefs.h"
typedef union {
float float_;
@@ -24,18 +24,25 @@
typedef struct {
// Pointers to mean values of spectrum.
SpectrumType* mean_far_spectrum;
- SpectrumType* mean_near_spectrum;
- // |mean_*_spectrum| initialization indicator.
+ // |mean_far_spectrum| initialization indicator.
int far_spectrum_initialized;
+
+ int spectrum_size;
+
+ // Far-end part of binary spectrum based delay estimation.
+ BinaryDelayEstimatorFarend* binary_farend;
+} DelayEstimatorFarend;
+
+typedef struct {
+ // Pointers to mean values of spectrum.
+ SpectrumType* mean_near_spectrum;
+ // |mean_near_spectrum| initialization indicator.
int near_spectrum_initialized;
int spectrum_size;
// Binary spectrum based delay estimator
BinaryDelayEstimator* binary_handle;
- // TODO(bjornv): This is an intermediate member variable. To be removed when
- // we complete full support.
- BinaryDelayEstimatorFarend* binary_farend;
} DelayEstimator;
#endif // WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_INTERNAL_H_
diff --git a/modules/audio_processing/utility/delay_estimator_unittest.cc b/modules/audio_processing/utility/delay_estimator_unittest.cc
index 27f8832..ac3bc16 100644
--- a/modules/audio_processing/utility/delay_estimator_unittest.cc
+++ b/modules/audio_processing/utility/delay_estimator_unittest.cc
@@ -11,11 +11,11 @@
#include "gtest/gtest.h"
extern "C" {
-#include "modules/audio_processing/utility/delay_estimator.h"
-#include "modules/audio_processing/utility/delay_estimator_internal.h"
-#include "modules/audio_processing/utility/delay_estimator_wrapper.h"
+#include "webrtc/modules/audio_processing/utility/delay_estimator.h"
+#include "webrtc/modules/audio_processing/utility/delay_estimator_internal.h"
+#include "webrtc/modules/audio_processing/utility/delay_estimator_wrapper.h"
}
-#include "typedefs.h"
+#include "webrtc/typedefs.h"
namespace {
@@ -42,6 +42,8 @@
void* handle_;
DelayEstimator* self_;
+ void* farend_handle_;
+ DelayEstimatorFarend* farend_self_;
BinaryDelayEstimator* binary_;
BinaryDelayEstimatorFarend* binary_farend_;
int spectrum_size_;
@@ -56,6 +58,8 @@
DelayEstimatorTest::DelayEstimatorTest()
: handle_(NULL),
self_(NULL),
+ farend_handle_(NULL),
+ farend_self_(NULL),
binary_(NULL),
binary_farend_(NULL),
spectrum_size_(kSpectrumSize) {
@@ -74,7 +78,11 @@
}
void DelayEstimatorTest::SetUp() {
- handle_ = WebRtc_CreateDelayEstimator(kSpectrumSize, kMaxDelay, kLookahead);
+ farend_handle_ = WebRtc_CreateDelayEstimatorFarend(kSpectrumSize,
+ kMaxDelay + kLookahead);
+ ASSERT_TRUE(farend_handle_ != NULL);
+ farend_self_ = reinterpret_cast<DelayEstimatorFarend*>(farend_handle_);
+ handle_ = WebRtc_CreateDelayEstimator(farend_handle_, kLookahead);
ASSERT_TRUE(handle_ != NULL);
self_ = reinterpret_cast<DelayEstimator*>(handle_);
binary_farend_ = WebRtc_CreateBinaryDelayEstimatorFarend(kMaxDelay +
@@ -88,6 +96,9 @@
WebRtc_FreeDelayEstimator(handle_);
handle_ = NULL;
self_ = NULL;
+ WebRtc_FreeDelayEstimatorFarend(farend_handle_);
+ farend_handle_ = NULL;
+ farend_self_ = NULL;
WebRtc_FreeBinaryDelayEstimator(binary_);
binary_ = NULL;
WebRtc_FreeBinaryDelayEstimatorFarend(binary_farend_);
@@ -96,9 +107,10 @@
void DelayEstimatorTest::Init() {
// Initialize Delay Estimator
+ EXPECT_EQ(0, WebRtc_InitDelayEstimatorFarend(farend_handle_));
EXPECT_EQ(0, WebRtc_InitDelayEstimator(handle_));
// Verify initialization.
- EXPECT_EQ(0, self_->far_spectrum_initialized);
+ EXPECT_EQ(0, farend_self_->far_spectrum_initialized);
EXPECT_EQ(0, self_->near_spectrum_initialized);
EXPECT_EQ(-2, WebRtc_last_delay(handle_)); // Delay in initial state.
EXPECT_EQ(0, WebRtc_last_delay_quality(handle_)); // Zero quality.
@@ -187,59 +199,78 @@
TEST_F(DelayEstimatorTest, CorrectErrorReturnsOfWrapper) {
// In this test we verify correct error returns on invalid API calls.
- // WebRtc_CreateDelayEstimator() should return a NULL pointer on invalid input
- // values.
+ // WebRtc_CreateDelayEstimatorFarend() and WebRtc_CreateDelayEstimator()
+ // should return a NULL pointer on invalid input values.
// Make sure we have a non-NULL value at start, so we can detect NULL after
// create failure.
- void* handle = handle_;
- handle = WebRtc_CreateDelayEstimator(33, kMaxDelay, kLookahead);
+ void* handle = farend_handle_;
+ handle = WebRtc_CreateDelayEstimatorFarend(33, kMaxDelay + kLookahead);
EXPECT_TRUE(handle == NULL);
- handle = handle_;
- handle = WebRtc_CreateDelayEstimator(kSpectrumSize, kMaxDelay, -1);
- EXPECT_TRUE(handle == NULL);
- handle = handle_;
- handle = WebRtc_CreateDelayEstimator(kSpectrumSize, 0, 0);
+ handle = farend_handle_;
+ handle = WebRtc_CreateDelayEstimatorFarend(kSpectrumSize, 1);
EXPECT_TRUE(handle == NULL);
- // WebRtc_InitDelayEstimator() should return -1 if we have a NULL pointer as
- // |handle|.
+ handle = handle_;
+ handle = WebRtc_CreateDelayEstimator(NULL, kLookahead);
+ EXPECT_TRUE(handle == NULL);
+ handle = handle_;
+ handle = WebRtc_CreateDelayEstimator(farend_handle_, -1);
+ EXPECT_TRUE(handle == NULL);
+
+ // WebRtc_InitDelayEstimatorFarend() and WebRtc_InitDelayEstimator() should
+ // return -1 if we have a NULL pointer as |handle|.
+ EXPECT_EQ(-1, WebRtc_InitDelayEstimatorFarend(NULL));
EXPECT_EQ(-1, WebRtc_InitDelayEstimator(NULL));
+ // WebRtc_AddFarSpectrumFloat() should return -1 if we have:
+ // 1) NULL pointer as |handle|.
+ // 2) NULL pointer as far-end spectrum.
+ // 3) Incorrect spectrum size.
+ EXPECT_EQ(-1, WebRtc_AddFarSpectrumFloat(NULL, far_f_, spectrum_size_));
+ // Use |farend_handle_| which is properly created at SetUp().
+ EXPECT_EQ(-1, WebRtc_AddFarSpectrumFloat(farend_handle_, NULL,
+ spectrum_size_));
+ EXPECT_EQ(-1, WebRtc_AddFarSpectrumFloat(farend_handle_, far_f_,
+ spectrum_size_ + 1));
+
+ // WebRtc_AddFarSpectrumFix() should return -1 if we have:
+ // 1) NULL pointer as |handle|.
+ // 2) NULL pointer as far-end spectrum.
+ // 3) Incorrect spectrum size.
+ // 4) Too high precision in far-end spectrum (Q-domain > 15).
+ EXPECT_EQ(-1, WebRtc_AddFarSpectrumFix(NULL, far_u16_, spectrum_size_, 0));
+ EXPECT_EQ(-1, WebRtc_AddFarSpectrumFix(farend_handle_, NULL, spectrum_size_,
+ 0));
+ EXPECT_EQ(-1, WebRtc_AddFarSpectrumFix(farend_handle_, far_u16_,
+ spectrum_size_ + 1, 0));
+ EXPECT_EQ(-1, WebRtc_AddFarSpectrumFix(farend_handle_, far_u16_,
+ spectrum_size_, 16));
+
// WebRtc_DelayEstimatorProcessFloat() should return -1 if we have:
// 1) NULL pointer as |handle|.
- // 2) NULL pointer as far-end spectrum.
- // 3) NULL pointer as near-end spectrum.
- // 4) Incorrect spectrum size.
- EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFloat(NULL, far_f_, near_f_,
+ // 2) NULL pointer as near-end spectrum.
+ // 3) Incorrect spectrum size.
+ EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFloat(NULL, near_f_,
spectrum_size_));
// Use |handle_| which is properly created at SetUp().
- EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFloat(handle_, NULL, near_f_,
+ EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFloat(handle_, NULL,
spectrum_size_));
- EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFloat(handle_, far_f_, NULL,
- spectrum_size_));
- EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFloat(handle_, far_f_, near_f_,
+ EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFloat(handle_, near_f_,
spectrum_size_ + 1));
// WebRtc_DelayEstimatorProcessFix() should return -1 if we have:
// 1) NULL pointer as |handle|.
- // 2) NULL pointer as far-end spectrum.
// 3) NULL pointer as near-end spectrum.
// 4) Incorrect spectrum size.
- // 5) Too high precision in far-end spectrum (Q-domain > 15).
// 6) Too high precision in near-end spectrum (Q-domain > 15).
- EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(NULL, far_u16_, near_u16_,
- spectrum_size_, 0, 0));
- // Use |handle_| which is properly created at SetUp().
- EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(handle_, NULL, near_u16_,
- spectrum_size_, 0, 0));
- EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(handle_, far_u16_, NULL,
- spectrum_size_, 0, 0));
- EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(handle_, far_u16_, near_u16_,
- spectrum_size_ + 1, 0, 0));
- EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(handle_, far_u16_, near_u16_,
- spectrum_size_, 16, 0));
- EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(handle_, far_u16_, near_u16_,
- spectrum_size_, 0, 16));
+ EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(NULL, near_u16_, spectrum_size_,
+ 0));
+ EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(handle_, NULL, spectrum_size_,
+ 0));
+ EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(handle_, near_u16_,
+ spectrum_size_ + 1, 0));
+ EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(handle_, near_u16_,
+ spectrum_size_, 16));
// WebRtc_last_delay() should return -1 if we have a NULL pointer as |handle|.
EXPECT_EQ(-1, WebRtc_last_delay(NULL));
@@ -254,22 +285,26 @@
TEST_F(DelayEstimatorTest, InitializedSpectrumAfterProcess) {
// In this test we verify that the mean spectra are initialized after first
- // time we call Process().
+ // time we call WebRtc_AddFarSpectrum() and Process() respectively.
// For floating point operations, process one frame and verify initialization
// flag.
Init();
- EXPECT_EQ(-2, WebRtc_DelayEstimatorProcessFloat(handle_, far_f_, near_f_,
+ EXPECT_EQ(0, WebRtc_AddFarSpectrumFloat(farend_handle_, far_f_,
+ spectrum_size_));
+ EXPECT_EQ(1, farend_self_->far_spectrum_initialized);
+ EXPECT_EQ(-2, WebRtc_DelayEstimatorProcessFloat(handle_, near_f_,
spectrum_size_));
- EXPECT_EQ(1, self_->far_spectrum_initialized);
EXPECT_EQ(1, self_->near_spectrum_initialized);
// For fixed point operations, process one frame and verify initialization
// flag.
Init();
- EXPECT_EQ(-2, WebRtc_DelayEstimatorProcessFix(handle_, far_u16_, near_u16_,
- spectrum_size_, 0, 0));
- EXPECT_EQ(1, self_->far_spectrum_initialized);
+ EXPECT_EQ(0, WebRtc_AddFarSpectrumFix(farend_handle_, far_u16_,
+ spectrum_size_, 0));
+ EXPECT_EQ(1, farend_self_->far_spectrum_initialized);
+ EXPECT_EQ(-2, WebRtc_DelayEstimatorProcessFix(handle_, near_u16_,
+ spectrum_size_, 0));
EXPECT_EQ(1, self_->near_spectrum_initialized);
}
@@ -283,7 +318,9 @@
// Floating point operations.
Init();
for (int i = 0; i < 200; i++) {
- last_delay = WebRtc_DelayEstimatorProcessFloat(handle_, far_f_, near_f_,
+ EXPECT_EQ(0, WebRtc_AddFarSpectrumFloat(farend_handle_, far_f_,
+ spectrum_size_));
+ last_delay = WebRtc_DelayEstimatorProcessFloat(handle_, near_f_,
spectrum_size_);
if (last_delay != -2) {
EXPECT_EQ(last_delay, WebRtc_last_delay(handle_));
@@ -298,8 +335,10 @@
// Fixed point operations.
Init();
for (int i = 0; i < 200; i++) {
- last_delay = WebRtc_DelayEstimatorProcessFix(handle_, far_u16_, near_u16_,
- spectrum_size_, 0, 0);
+ EXPECT_EQ(0, WebRtc_AddFarSpectrumFix(farend_handle_, far_u16_,
+ spectrum_size_, 0));
+ last_delay = WebRtc_DelayEstimatorProcessFix(handle_, near_u16_,
+ spectrum_size_, 0);
if (last_delay != -2) {
EXPECT_EQ(last_delay, WebRtc_last_delay(handle_));
EXPECT_EQ(7203, WebRtc_last_delay_quality(handle_));
@@ -311,6 +350,20 @@
EXPECT_NE(0, WebRtc_last_delay_quality(handle_));
}
+TEST_F(DelayEstimatorTest, CorrectErrorReturnsOfBinaryEstimatorFarend) {
+ // In this test we verify correct output on invalid API calls to the Binary
+ // Delay Estimator (far-end part).
+
+ BinaryDelayEstimatorFarend* binary = binary_farend_;
+ // WebRtc_CreateBinaryDelayEstimatorFarend() should return -1 if the input
+ // history size is less than 2. This is to make sure the buffer shifting
+ // applies properly.
+ // Make sure we have a non-NULL value at start, so we can detect NULL after
+ // create failure.
+ binary = WebRtc_CreateBinaryDelayEstimatorFarend(1);
+ EXPECT_TRUE(binary == NULL);
+}
+
TEST_F(DelayEstimatorTest, CorrectErrorReturnsOfBinaryEstimator) {
// In this test we verify correct output on invalid API calls to the Binary
// Delay Estimator.
diff --git a/modules/audio_processing/utility/delay_estimator_wrapper.c b/modules/audio_processing/utility/delay_estimator_wrapper.c
index a00923f..c358f13 100644
--- a/modules/audio_processing/utility/delay_estimator_wrapper.c
+++ b/modules/audio_processing/utility/delay_estimator_wrapper.c
@@ -8,19 +8,20 @@
* be found in the AUTHORS file in the root of the source tree.
*/
-#include "delay_estimator_wrapper.h"
+#include "webrtc/modules/audio_processing/utility/delay_estimator_wrapper.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
-#include "delay_estimator.h"
-#include "modules/audio_processing/utility/delay_estimator_internal.h"
+#include "webrtc/modules/audio_processing/utility/delay_estimator.h"
+#include "webrtc/modules/audio_processing/utility/delay_estimator_internal.h"
+#include "webrtc/system_wrappers/interface/compile_assert.h"
// Only bit |kBandFirst| through bit |kBandLast| are processed and
// |kBandFirst| - |kBandLast| must be < 32.
-static const int kBandFirst = 12;
-static const int kBandLast = 43;
+enum { kBandFirst = 12 };
+enum { kBandLast = 43 };
static __inline uint32_t SetBit(uint32_t in, int pos) {
uint32_t mask = (1 << pos);
@@ -122,8 +123,8 @@
return out;
}
-void WebRtc_FreeDelayEstimator(void* handle) {
- DelayEstimator* self = (DelayEstimator*) handle;
+void WebRtc_FreeDelayEstimatorFarend(void* handle) {
+ DelayEstimatorFarend* self = (DelayEstimatorFarend*) handle;
if (handle == NULL) {
return;
@@ -132,54 +133,156 @@
free(self->mean_far_spectrum);
self->mean_far_spectrum = NULL;
- free(self->mean_near_spectrum);
- self->mean_near_spectrum = NULL;
-
- WebRtc_FreeBinaryDelayEstimator(self->binary_handle);
- self->binary_handle = NULL;
-
WebRtc_FreeBinaryDelayEstimatorFarend(self->binary_farend);
self->binary_farend = NULL;
free(self);
}
-void* WebRtc_CreateDelayEstimator(int spectrum_size, int max_delay,
- int lookahead) {
- DelayEstimator* self = NULL;
- const int history_size = max_delay + lookahead; // For buffer shifting: > 1
+void* WebRtc_CreateDelayEstimatorFarend(int spectrum_size, int history_size) {
+ DelayEstimatorFarend* self = NULL;
- // TODO(bjornv): Make this a static assert.
// Check if the sub band used in the delay estimation is small enough to fit
// the binary spectra in a uint32_t.
- assert(kBandLast - kBandFirst < 32);
+ COMPILE_ASSERT(kBandLast - kBandFirst < 32);
- if ((spectrum_size >= kBandLast) && (history_size > 1)) {
+ if (spectrum_size >= kBandLast) {
self = malloc(sizeof(DelayEstimator));
}
if (self != NULL) {
int memory_fail = 0;
- self->mean_far_spectrum = NULL;
- self->mean_near_spectrum = NULL;
- self->binary_farend = NULL;
-
- // Allocate memory for the farend spectrum handling.
+ // Allocate memory for the binary far-end spectrum handling.
self->binary_farend = WebRtc_CreateBinaryDelayEstimatorFarend(history_size);
-
- self->binary_handle = WebRtc_CreateBinaryDelayEstimator(self->binary_farend,
- lookahead);
- memory_fail |= (self->binary_handle == NULL);
+ memory_fail |= (self->binary_farend == NULL);
// Allocate memory for spectrum buffers.
self->mean_far_spectrum = malloc(spectrum_size * sizeof(SpectrumType));
memory_fail |= (self->mean_far_spectrum == NULL);
- self->mean_near_spectrum = malloc(spectrum_size * sizeof(SpectrumType));
+ self->spectrum_size = spectrum_size;
+
+ if (memory_fail) {
+ WebRtc_FreeDelayEstimatorFarend(self);
+ self = NULL;
+ }
+ }
+
+ return self;
+}
+
+int WebRtc_InitDelayEstimatorFarend(void* handle) {
+ DelayEstimatorFarend* self = (DelayEstimatorFarend*) handle;
+
+ if (self == NULL) {
+ return -1;
+ }
+
+ // Initialize far-end part of binary delay estimator.
+ WebRtc_InitBinaryDelayEstimatorFarend(self->binary_farend);
+
+ // Set averaged far and near end spectra to zero.
+ memset(self->mean_far_spectrum, 0,
+ sizeof(SpectrumType) * self->spectrum_size);
+ // Reset initialization indicators.
+ self->far_spectrum_initialized = 0;
+
+ return 0;
+}
+
+int WebRtc_AddFarSpectrumFix(void* handle, uint16_t* far_spectrum,
+ int spectrum_size, int far_q) {
+ DelayEstimatorFarend* self = (DelayEstimatorFarend*) handle;
+ uint32_t binary_spectrum = 0;
+
+ if (self == NULL) {
+ return -1;
+ }
+ if (far_spectrum == NULL) {
+ // Empty far end spectrum.
+ return -1;
+ }
+ if (spectrum_size != self->spectrum_size) {
+ // Data sizes don't match.
+ return -1;
+ }
+ if (far_q > 15) {
+ // If |far_q| is larger than 15 we cannot guarantee no wrap around.
+ return -1;
+ }
+
+ // Get binary spectrum.
+ binary_spectrum = BinarySpectrumFix(far_spectrum, self->mean_far_spectrum,
+ far_q, &(self->far_spectrum_initialized));
+ WebRtc_AddBinaryFarSpectrum(self->binary_farend, binary_spectrum);
+
+ return 0;
+}
+
+int WebRtc_AddFarSpectrumFloat(void* handle, float* far_spectrum,
+ int spectrum_size) {
+ DelayEstimatorFarend* self = (DelayEstimatorFarend*) handle;
+ uint32_t binary_spectrum = 0;
+
+ if (self == NULL) {
+ return -1;
+ }
+ if (far_spectrum == NULL) {
+ // Empty far end spectrum.
+ return -1;
+ }
+ if (spectrum_size != self->spectrum_size) {
+ // Data sizes don't match.
+ return -1;
+ }
+
+ // Get binary spectrum.
+ binary_spectrum = BinarySpectrumFloat(far_spectrum, self->mean_far_spectrum,
+ &(self->far_spectrum_initialized));
+ WebRtc_AddBinaryFarSpectrum(self->binary_farend, binary_spectrum);
+
+ return 0;
+}
+
+void WebRtc_FreeDelayEstimator(void* handle) {
+ DelayEstimator* self = (DelayEstimator*) handle;
+
+ if (handle == NULL) {
+ return;
+ }
+
+ free(self->mean_near_spectrum);
+ self->mean_near_spectrum = NULL;
+
+ WebRtc_FreeBinaryDelayEstimator(self->binary_handle);
+ self->binary_handle = NULL;
+
+ free(self);
+}
+
+void* WebRtc_CreateDelayEstimator(void* farend_handle, int lookahead) {
+ DelayEstimator* self = NULL;
+ DelayEstimatorFarend* farend = (DelayEstimatorFarend*) farend_handle;
+
+ if (farend_handle != NULL) {
+ self = malloc(sizeof(DelayEstimator));
+ }
+
+ if (self != NULL) {
+ int memory_fail = 0;
+
+ // Allocate memory for the farend spectrum handling.
+ self->binary_handle =
+ WebRtc_CreateBinaryDelayEstimator(farend->binary_farend, lookahead);
+ memory_fail |= (self->binary_handle == NULL);
+
+ // Allocate memory for spectrum buffers.
+ self->mean_near_spectrum = malloc(farend->spectrum_size *
+ sizeof(SpectrumType));
memory_fail |= (self->mean_near_spectrum == NULL);
- self->spectrum_size = spectrum_size;
+ self->spectrum_size = farend->spectrum_size;
if (memory_fail) {
WebRtc_FreeDelayEstimator(self);
@@ -197,40 +300,28 @@
return -1;
}
- // Initialize far-end part of binary delay estimator.
- WebRtc_InitBinaryDelayEstimatorFarend(self->binary_farend);
// Initialize binary delay estimator.
WebRtc_InitBinaryDelayEstimator(self->binary_handle);
// Set averaged far and near end spectra to zero.
- memset(self->mean_far_spectrum, 0,
- sizeof(SpectrumType) * self->spectrum_size);
memset(self->mean_near_spectrum, 0,
sizeof(SpectrumType) * self->spectrum_size);
// Reset initialization indicators.
- self->far_spectrum_initialized = 0;
self->near_spectrum_initialized = 0;
return 0;
}
int WebRtc_DelayEstimatorProcessFix(void* handle,
- uint16_t* far_spectrum,
uint16_t* near_spectrum,
int spectrum_size,
- int far_q,
int near_q) {
DelayEstimator* self = (DelayEstimator*) handle;
- uint32_t binary_far_spectrum = 0;
- uint32_t binary_near_spectrum = 0;
+ uint32_t binary_spectrum = 0;
if (self == NULL) {
return -1;
}
- if (far_spectrum == NULL) {
- // Empty far end spectrum.
- return -1;
- }
if (near_spectrum == NULL) {
// Empty near end spectrum.
return -1;
@@ -239,46 +330,29 @@
// Data sizes don't match.
return -1;
}
- if (far_q > 15) {
- // If |far_q| is larger than 15 we cannot guarantee no wrap around.
- return -1;
- }
if (near_q > 15) {
// If |near_q| is larger than 15 we cannot guarantee no wrap around.
return -1;
}
// Get binary spectra.
- binary_far_spectrum = BinarySpectrumFix(far_spectrum,
- self->mean_far_spectrum,
- far_q,
- &(self->far_spectrum_initialized));
- binary_near_spectrum = BinarySpectrumFix(near_spectrum,
- self->mean_near_spectrum,
- near_q,
- &(self->near_spectrum_initialized));
+ binary_spectrum = BinarySpectrumFix(near_spectrum,
+ self->mean_near_spectrum,
+ near_q,
+ &(self->near_spectrum_initialized));
- WebRtc_AddBinaryFarSpectrum(self->binary_handle->farend, binary_far_spectrum);
-
- return WebRtc_ProcessBinarySpectrum(self->binary_handle,
- binary_near_spectrum);
+ return WebRtc_ProcessBinarySpectrum(self->binary_handle, binary_spectrum);
}
int WebRtc_DelayEstimatorProcessFloat(void* handle,
- float* far_spectrum,
float* near_spectrum,
int spectrum_size) {
DelayEstimator* self = (DelayEstimator*) handle;
- uint32_t binary_far_spectrum = 0;
- uint32_t binary_near_spectrum = 0;
+ uint32_t binary_spectrum = 0;
if (self == NULL) {
return -1;
}
- if (far_spectrum == NULL) {
- // Empty far end spectrum.
- return -1;
- }
if (near_spectrum == NULL) {
// Empty near end spectrum.
return -1;
@@ -288,18 +362,11 @@
return -1;
}
- // Get binary spectra.
- binary_far_spectrum = BinarySpectrumFloat(far_spectrum,
- self->mean_far_spectrum,
- &(self->far_spectrum_initialized));
- binary_near_spectrum =
- BinarySpectrumFloat(near_spectrum, self->mean_near_spectrum,
- &(self->near_spectrum_initialized));
+ // Get binary spectrum.
+ binary_spectrum = BinarySpectrumFloat(near_spectrum, self->mean_near_spectrum,
+ &(self->near_spectrum_initialized));
- WebRtc_AddBinaryFarSpectrum(self->binary_handle->farend, binary_far_spectrum);
-
- return WebRtc_ProcessBinarySpectrum(self->binary_handle,
- binary_near_spectrum);
+ return WebRtc_ProcessBinarySpectrum(self->binary_handle, binary_spectrum);
}
int WebRtc_last_delay(void* handle) {
diff --git a/modules/audio_processing/utility/delay_estimator_wrapper.h b/modules/audio_processing/utility/delay_estimator_wrapper.h
index 3d243db..51b9a0a 100644
--- a/modules/audio_processing/utility/delay_estimator_wrapper.h
+++ b/modules/audio_processing/utility/delay_estimator_wrapper.h
@@ -14,7 +14,64 @@
#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_WRAPPER_H_
#define WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_WRAPPER_H_
-#include "typedefs.h"
+#include "webrtc/typedefs.h"
+
+// Releases the memory allocated by WebRtc_CreateDelayEstimatorFarend(...)
+// Input:
+// - handle : Pointer to the delay estimation far-end instance.
+//
+void WebRtc_FreeDelayEstimatorFarend(void* handle);
+
+// Allocates the memory needed by the far-end part of the delay estimation. The
+// memory needs to be initialized separately through
+// WebRtc_InitDelayEstimatorFarend(...).
+//
+// Inputs:
+// - spectrum_size : Size of the spectrum used both in far-end and
+// near-end. Used to allocate memory for spectrum
+// specific buffers.
+// - history_size : The far-end history buffer size. Note that the maximum
+// delay which can be estimated is controlled together
+// with |lookahead| through
+// WebRtc_CreateDelayEstimator().
+//
+// Return value:
+// - void* : Created |handle|. If the memory can't be allocated or
+// if any of the input parameters are invalid NULL is
+// returned.
+//
+void* WebRtc_CreateDelayEstimatorFarend(int spectrum_size, int history_size);
+
+// Initializes the far-end part of the delay estimation instance returned by
+// WebRtc_CreateDelayEstimatorFarend(...)
+// Input:
+// - handle : Pointer to the delay estimation far-end instance.
+//
+// Output:
+// - handle : Initialized instance.
+//
+int WebRtc_InitDelayEstimatorFarend(void* handle);
+
+// Adds the far-end spectrum to the far-end history buffer. This spectrum is
+// used as reference when calculating the delay using
+// WebRtc_ProcessSpectrum().
+//
+// Inputs:
+// - handle : Pointer to the delay estimation far-end instance.
+// - far_spectrum : Far-end spectrum.
+// - spectrum_size : The size of the data arrays (same for both far- and
+// near-end).
+// - far_q : The Q-domain of the far-end data.
+//
+// Output:
+// - handle : Updated far-end instance.
+//
+int WebRtc_AddFarSpectrumFix(void* handle, uint16_t* far_spectrum,
+ int spectrum_size, int far_q);
+
+// See WebRtc_AddFarSpectrumFix() for description.
+int WebRtc_AddFarSpectrumFloat(void* handle, float* far_spectrum,
+ int spectrum_size);
// Releases the memory allocated by WebRtc_CreateDelayEstimator(...)
// Input:
@@ -26,11 +83,14 @@
// initialized separately through WebRtc_InitDelayEstimator(...).
//
// Inputs:
-// - spectrum_size : Size of the spectrum used both in far-end and
-// near-end. Used to allocate memory for spectrum
-// specific buffers.
-// - max_delay : The maximum delay which can be estimated. Needed to
-// allocate memory for history buffers.
+// - farend_handle : Pointer to the far-end part of the delay estimation
+// instance created prior to this call using
+// WebRtc_CreateDelayEstimatorFarend().
+//
+// Note that WebRtc_CreateDelayEstimator does not take
+// ownership of |farend_handle|, which has to be torn
+// down properly after this instance.
+//
// - lookahead : Amount of non-causal lookahead to use. This can
// detect cases in which a near-end signal occurs before
// the corresponding far-end signal. It will delay the
@@ -41,13 +101,17 @@
// This also represents the minimum delay which can be
// estimated.
//
+// Note that the effective range of delay estimates is
+// [-|lookahead|,... ,|history_size|-|lookahead|)
+// where |history_size| was set upon creating the far-end
+// history buffer size.
+//
// Return value:
// - void* : Created |handle|. If the memory can't be allocated or
// if any of the input parameters are invalid NULL is
// returned.
//
-void* WebRtc_CreateDelayEstimator(int spectrum_size, int max_delay,
- int lookahead);
+void* WebRtc_CreateDelayEstimator(void* farend_handle, int lookahead);
// Initializes the delay estimation instance returned by
// WebRtc_CreateDelayEstimator(...)
@@ -64,12 +128,10 @@
// subtracted from the returned value).
// Inputs:
// - handle : Pointer to the delay estimation instance.
-// - far_spectrum : Pointer to the far-end spectrum data.
// - near_spectrum : Pointer to the near-end spectrum data of the current
// block.
// - spectrum_size : The size of the data arrays (same for both far- and
// near-end).
-// - far_q : The Q-domain of the far-end data.
// - near_q : The Q-domain of the near-end data.
//
// Output:
@@ -81,15 +143,12 @@
// -2 - Insufficient data for estimation.
//
int WebRtc_DelayEstimatorProcessFix(void* handle,
- uint16_t* far_spectrum,
uint16_t* near_spectrum,
int spectrum_size,
- int far_q,
int near_q);
// See WebRtc_DelayEstimatorProcessFix() for description.
int WebRtc_DelayEstimatorProcessFloat(void* handle,
- float* far_spectrum,
float* near_spectrum,
int spectrum_size);
@@ -100,7 +159,7 @@
// - handle : Pointer to the delay estimation instance.
//
// Return value:
-// - delay : >= 0 - Last calculated delay value.
+// - delay : >= 0 - Last calculated delay value.
// -1 - Error.
// -2 - Insufficient data for estimation.
//
@@ -115,7 +174,7 @@
// - handle : Pointer to the delay estimation instance.
//
// Return value:
-// - delay_quality : >= 0 - Estimation quality (in Q9) of last calculated
+// - delay_quality : >= 0 - Estimation quality (in Q9) of last calculated
// delay value.
// -1 - Error.
// -2 - Insufficient data for estimation.