Revert "Added webrtc audio processing library"
This reverts commit 4e51691e58d8d32590b03c1951cb13de4d1c4758
diff --git a/Android.mk b/Android.mk
deleted file mode 100644
index aa90dd3..0000000
--- a/Android.mk
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-MY_WEBRTC_ROOT_PATH := $(call my-dir)
-
-
-include $(MY_WEBRTC_ROOT_PATH)/src/system_wrappers/source/Android.mk
-
-# audio processing
-include $(MY_WEBRTC_ROOT_PATH)/src/common_audio/resampler/main/source/Android.mk
-include $(MY_WEBRTC_ROOT_PATH)/src/common_audio/signal_processing_library/main/source/Android.mk
-include $(MY_WEBRTC_ROOT_PATH)/src/common_audio/vad/main/source/Android.mk
-include $(MY_WEBRTC_ROOT_PATH)/src/modules/audio_processing/aec/main/source/Android.mk
-include $(MY_WEBRTC_ROOT_PATH)/src/modules/audio_processing/aecm/main/source/Android.mk
-include $(MY_WEBRTC_ROOT_PATH)/src/modules/audio_processing/agc/main/source/Android.mk
-include $(MY_WEBRTC_ROOT_PATH)/src/modules/audio_processing/main/source/Android.mk
-include $(MY_WEBRTC_ROOT_PATH)/src/modules/audio_processing/ns/main/source/Android.mk
-include $(MY_WEBRTC_ROOT_PATH)/src/modules/audio_processing/utility/Android.mk
-
-
-# build .so
-include $(MY_WEBRTC_ROOT_PATH)/android-webrtc.mk
-
-# build test apps
-include $(MY_WEBRTC_ROOT_PATH)/src/modules/audio_processing/main/test/process_test/Android.mk
diff --git a/MODULE_LICENSE_BSD b/MODULE_LICENSE_BSD
deleted file mode 100644
index e69de29..0000000
--- a/MODULE_LICENSE_BSD
+++ /dev/null
diff --git a/NOTICE b/NOTICE
deleted file mode 100644
index 1c39e5b..0000000
--- a/NOTICE
+++ /dev/null
@@ -1,111 +0,0 @@
-===============================================================================
-
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-===============================================================================
-
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-===============================================================================
-
-/*
- * http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html
- * Copyright Takuya OOURA, 1996-2001
- *
- * You may use, copy, modify and distribute this code for any purpose (include
- * commercial use) and without fee. Please refer to this package when you modify
- * this code.
- *
- * Changes by the WebRTC authors:
- * - Trivial type modifications.
- * - Minimal code subset to do rdft of length 128.
- * - Optimizations because of known length.
- *
- * All changes are covered by the WebRTC license and IP grant:
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-===============================================================================
-
-/*
- * http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html
- * Copyright Takuya OOURA, 1996-2001
- *
- * You may use, copy, modify and distribute this code for any purpose (include
- * commercial use) and without fee. Please refer to this package when you modify
- * this code.
- *
- * Changes:
- * Trivial type modifications by the WebRTC authors.
- */
-
-===============================================================================
-
-/*Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.*/
-
-===============================================================================
-
-// Copyright Steven J. Ross 2001 - 2009.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/ for updates, documentation, and revision history.
-
-/*
-Some improvements suggested by:
-Phil Endecott and Frank Gennari
-Cygwin fix provided by:
-Scott McMurray
-*/
-
-
diff --git a/android-webrtc.mk b/android-webrtc.mk
deleted file mode 100644
index 01d6a9e..0000000
--- a/android-webrtc.mk
+++ /dev/null
@@ -1,96 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-MY_APM_WHOLE_STATIC_LIBRARIES := \
- libwebrtc_spl \
- libwebrtc_resampler \
- libwebrtc_apm \
- libwebrtc_apm_utility \
- libwebrtc_vad \
- libwebrtc_ns \
- libwebrtc_agc \
- libwebrtc_aec \
- libwebrtc_aecm
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_ARM_MODE := arm
-LOCAL_MODULE := libwebrtc_audio_preprocessing
-LOCAL_MODULE_TAGS := optional
-LOCAL_LDFLAGS :=
-
-LOCAL_WHOLE_STATIC_LIBRARIES := \
- $(MY_APM_WHOLE_STATIC_LIBRARIES) \
- libwebrtc_system_wrappers \
-
-LOCAL_SHARED_LIBRARIES := \
- libcutils \
- libdl \
- libstlport
-
-LOCAL_ADDITIONAL_DEPENDENCIES :=
-
-include external/stlport/libstlport.mk
-include $(BUILD_SHARED_LIBRARY)
-
-###
-
-#LOCAL_PATH := $(call my-dir)
-#
-#include $(CLEAR_VARS)
-#
-#LOCAL_ARM_MODE := arm
-#LOCAL_MODULE := libwebrtc
-#LOCAL_MODULE_TAGS := optional
-#LOCAL_LDFLAGS :=
-#
-#LOCAL_WHOLE_STATIC_LIBRARIES := \
-# libwebrtc_system_wrappers \
-# libwebrtc_audio_device \
-# libwebrtc_pcm16b \
-# libwebrtc_cng \
-# libwebrtc_audio_coding \
-# libwebrtc_rtp_rtcp \
-# libwebrtc_media_file \
-# libwebrtc_udp_transport \
-# libwebrtc_utility \
-# libwebrtc_neteq \
-# libwebrtc_audio_conference_mixer \
-# libwebrtc_isac \
-# libwebrtc_ilbc \
-# libwebrtc_isacfix \
-# libwebrtc_g722 \
-# libwebrtc_g711 \
-# libwebrtc_voe_core \
-# libwebrtc_video_render \
-# libwebrtc_video_capture \
-# libwebrtc_i420 \
-# libwebrtc_video_coding \
-# libwebrtc_video_processing \
-# libwebrtc_vp8 \
-# libwebrtc_vie_core \
-# libwebrtc_vplib \
-# libwebrtc_jpeg \
-# libwebrtc_vpx
-#
-#LOCAL_STATIC_LIBRARIES :=
-#LOCAL_SHARED_LIBRARIES := \
-# libcutils \
-# libdl \
-# libstlport \
-# libjpeg \
-# libGLESv2 \
-# libOpenSLES \
-# libwebrtc_audio_preprocessing
-#
-#LOCAL_ADDITIONAL_DEPENDENCIES :=
-#
-#include external/stlport/libstlport.mk
-#include $(BUILD_SHARED_LIBRARY)
diff --git a/src/common_audio/OWNERS b/src/common_audio/OWNERS
deleted file mode 100644
index 0eb967b..0000000
--- a/src/common_audio/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-bjornv@google.com
diff --git a/src/common_audio/resampler/OWNERS b/src/common_audio/resampler/OWNERS
deleted file mode 100644
index cf595df..0000000
--- a/src/common_audio/resampler/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-bjornv@google.com
-tlegrand@google.com
-jks@google.com
diff --git a/src/common_audio/resampler/main/interface/resampler.h b/src/common_audio/resampler/main/interface/resampler.h
deleted file mode 100644
index a03ff18..0000000
--- a/src/common_audio/resampler/main/interface/resampler.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * A wrapper for resampling a numerous amount of sampling combinations.
- */
-
-#ifndef WEBRTC_RESAMPLER_RESAMPLER_H_
-#define WEBRTC_RESAMPLER_RESAMPLER_H_
-
-#include "typedefs.h"
-
-namespace webrtc
-{
-
-enum ResamplerType
-{
- // 4 MSB = Number of channels
- // 4 LSB = Synchronous or asynchronous
-
- kResamplerSynchronous = 0x10,
- kResamplerAsynchronous = 0x11,
- kResamplerSynchronousStereo = 0x20,
- kResamplerAsynchronousStereo = 0x21,
- kResamplerInvalid = 0xff
-};
-
-enum ResamplerMode
-{
- kResamplerMode1To1,
- kResamplerMode1To2,
- kResamplerMode1To3,
- kResamplerMode1To4,
- kResamplerMode1To6,
- kResamplerMode2To3,
- kResamplerMode2To11,
- kResamplerMode4To11,
- kResamplerMode8To11,
- kResamplerMode11To16,
- kResamplerMode11To32,
- kResamplerMode2To1,
- kResamplerMode3To1,
- kResamplerMode4To1,
- kResamplerMode6To1,
- kResamplerMode3To2,
- kResamplerMode11To2,
- kResamplerMode11To4,
- kResamplerMode11To8
-};
-
-class Resampler
-{
-
-public:
- Resampler();
- Resampler(int inFreq, int outFreq, ResamplerType type);
- ~Resampler();
-
- // Reset all states
- int Reset(int inFreq, int outFreq, ResamplerType type);
-
- // Reset all states if any parameter has changed
- int ResetIfNeeded(int inFreq, int outFreq, ResamplerType type);
-
- // Synchronous resampling, all output samples are written to samplesOut
- int Push(const WebRtc_Word16* samplesIn, int lengthIn, WebRtc_Word16* samplesOut,
- int maxLen, int &outLen);
-
- // Asynchronous resampling, input
- int Insert(WebRtc_Word16* samplesIn, int lengthIn);
-
- // Asynchronous resampling output, remaining samples are buffered
- int Pull(WebRtc_Word16* samplesOut, int desiredLen, int &outLen);
-
-private:
- // Generic pointers since we don't know what states we'll need
- void* state1_;
- void* state2_;
- void* state3_;
-
- // Storage if needed
- WebRtc_Word16* in_buffer_;
- WebRtc_Word16* out_buffer_;
- int in_buffer_size_;
- int out_buffer_size_;
- int in_buffer_size_max_;
- int out_buffer_size_max_;
-
- // State
- int my_in_frequency_khz_;
- int my_out_frequency_khz_;
- ResamplerMode my_mode_;
- ResamplerType my_type_;
-
- // Extra instance for stereo
- Resampler* slave_left_;
- Resampler* slave_right_;
-};
-
-} // namespace webrtc
-
-#endif // WEBRTC_RESAMPLER_RESAMPLER_H_
diff --git a/src/common_audio/resampler/main/source/Android.mk b/src/common_audio/resampler/main/source/Android.mk
deleted file mode 100644
index b78e3af..0000000
--- a/src/common_audio/resampler/main/source/Android.mk
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_ARM_MODE := arm
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_MODULE := libwebrtc_resampler
-LOCAL_MODULE_TAGS := optional
-LOCAL_CPP_EXTENSION := .cc
-LOCAL_GENERATED_SOURCES :=
-LOCAL_SRC_FILES := resampler.cc
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS :=
-MY_CFLAGS_C :=
-MY_DEFS := '-DNO_TCMALLOC' \
- '-DNO_HEAPCHECKER' \
- '-DWEBRTC_TARGET_PC' \
- '-DWEBRTC_LINUX' \
- '-DWEBRTC_ANDROID' \
- '-DANDROID'
-LOCAL_CFLAGS := $(MY_CFLAGS_C) $(MY_CFLAGS) $(MY_DEFS)
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../.. \
- $(LOCAL_PATH)/../interface \
- $(LOCAL_PATH)/../../../signal_processing_library/main/interface
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS :=
-
-LOCAL_LDFLAGS :=
-
-LOCAL_STATIC_LIBRARIES :=
-
-LOCAL_SHARED_LIBRARIES := libcutils \
- libdl \
- libstlport
-LOCAL_ADDITIONAL_DEPENDENCIES :=
-
-ifeq ($(TARGET_OS)-$(TARGET_SIMULATOR),linux-true)
-LOCAL_LDLIBS += -ldl -lpthread
-endif
-
-ifneq ($(TARGET_SIMULATOR),true)
-LOCAL_SHARED_LIBRARIES += libdl
-endif
-
-include external/stlport/libstlport.mk
-include $(BUILD_STATIC_LIBRARY)
diff --git a/src/common_audio/resampler/main/source/resampler.cc b/src/common_audio/resampler/main/source/resampler.cc
deleted file mode 100644
index f866739..0000000
--- a/src/common_audio/resampler/main/source/resampler.cc
+++ /dev/null
@@ -1,981 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * A wrapper for resampling a numerous amount of sampling combinations.
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "signal_processing_library.h"
-#include "resampler.h"
-
-
-namespace webrtc
-{
-
-Resampler::Resampler()
-{
- state1_ = NULL;
- state2_ = NULL;
- state3_ = NULL;
- in_buffer_ = NULL;
- out_buffer_ = NULL;
- in_buffer_size_ = 0;
- out_buffer_size_ = 0;
- in_buffer_size_max_ = 0;
- out_buffer_size_max_ = 0;
- // we need a reset before we will work
- my_in_frequency_khz_ = 0;
- my_out_frequency_khz_ = 0;
- my_mode_ = kResamplerMode1To1;
- my_type_ = kResamplerInvalid;
- slave_left_ = NULL;
- slave_right_ = NULL;
-}
-
-Resampler::Resampler(int inFreq, int outFreq, ResamplerType type)
-{
- state1_ = NULL;
- state2_ = NULL;
- state3_ = NULL;
- in_buffer_ = NULL;
- out_buffer_ = NULL;
- in_buffer_size_ = 0;
- out_buffer_size_ = 0;
- in_buffer_size_max_ = 0;
- out_buffer_size_max_ = 0;
- // we need a reset before we will work
- my_in_frequency_khz_ = 0;
- my_out_frequency_khz_ = 0;
- my_mode_ = kResamplerMode1To1;
- my_type_ = kResamplerInvalid;
- slave_left_ = NULL;
- slave_right_ = NULL;
-
- int res = Reset(inFreq, outFreq, type);
-
-}
-
-Resampler::~Resampler()
-{
- if (state1_)
- {
- free(state1_);
- }
- if (state2_)
- {
- free(state2_);
- }
- if (state3_)
- {
- free(state3_);
- }
- if (in_buffer_)
- {
- free(in_buffer_);
- }
- if (out_buffer_)
- {
- free(out_buffer_);
- }
- if (slave_left_)
- {
- delete slave_left_;
- }
- if (slave_right_)
- {
- delete slave_right_;
- }
-}
-
-int Resampler::ResetIfNeeded(int inFreq, int outFreq, ResamplerType type)
-{
- int tmpInFreq_kHz = inFreq / 1000;
- int tmpOutFreq_kHz = outFreq / 1000;
-
- if ((tmpInFreq_kHz != my_in_frequency_khz_) || (tmpOutFreq_kHz != my_out_frequency_khz_)
- || (type != my_type_))
- {
- return Reset(inFreq, outFreq, type);
- } else
- {
- return 0;
- }
-}
-
-int Resampler::Reset(int inFreq, int outFreq, ResamplerType type)
-{
-
- if (state1_)
- {
- free(state1_);
- state1_ = NULL;
- }
- if (state2_)
- {
- free(state2_);
- state2_ = NULL;
- }
- if (state3_)
- {
- free(state3_);
- state3_ = NULL;
- }
- if (in_buffer_)
- {
- free(in_buffer_);
- in_buffer_ = NULL;
- }
- if (out_buffer_)
- {
- free(out_buffer_);
- out_buffer_ = NULL;
- }
- if (slave_left_)
- {
- delete slave_left_;
- slave_left_ = NULL;
- }
- if (slave_right_)
- {
- delete slave_right_;
- slave_right_ = NULL;
- }
-
- in_buffer_size_ = 0;
- out_buffer_size_ = 0;
- in_buffer_size_max_ = 0;
- out_buffer_size_max_ = 0;
-
- // This might be overridden if parameters are not accepted.
- my_type_ = type;
-
- // Start with a math exercise, Euclid's algorithm to find the gcd:
-
- int a = inFreq;
- int b = outFreq;
- int c = a % b;
- while (c != 0)
- {
- a = b;
- b = c;
- c = a % b;
- }
- // b is now the gcd;
-
- // We need to track what domain we're in.
- my_in_frequency_khz_ = inFreq / 1000;
- my_out_frequency_khz_ = outFreq / 1000;
-
- // Scale with GCD
- inFreq = inFreq / b;
- outFreq = outFreq / b;
-
- // Do we need stereo?
- if ((my_type_ & 0xf0) == 0x20)
- {
- // Change type to mono
- type = (ResamplerType)((int)type & 0x0f + 0x10);
- slave_left_ = new Resampler(inFreq, outFreq, type);
- slave_right_ = new Resampler(inFreq, outFreq, type);
- }
-
- if (inFreq == outFreq)
- {
- my_mode_ = kResamplerMode1To1;
- } else if (inFreq == 1)
- {
- switch (outFreq)
- {
- case 2:
- my_mode_ = kResamplerMode1To2;
- break;
- case 3:
- my_mode_ = kResamplerMode1To3;
- break;
- case 4:
- my_mode_ = kResamplerMode1To4;
- break;
- case 6:
- my_mode_ = kResamplerMode1To6;
- break;
- default:
- my_type_ = kResamplerInvalid;
- break;
- }
- } else if (outFreq == 1)
- {
- switch (inFreq)
- {
- case 2:
- my_mode_ = kResamplerMode2To1;
- break;
- case 3:
- my_mode_ = kResamplerMode3To1;
- break;
- case 4:
- my_mode_ = kResamplerMode4To1;
- break;
- case 6:
- my_mode_ = kResamplerMode6To1;
- break;
- default:
- my_type_ = kResamplerInvalid;
- break;
- }
- } else if ((inFreq == 2) && (outFreq == 3))
- {
- my_mode_ = kResamplerMode2To3;
- } else if ((inFreq == 2) && (outFreq == 11))
- {
- my_mode_ = kResamplerMode2To11;
- } else if ((inFreq == 4) && (outFreq == 11))
- {
- my_mode_ = kResamplerMode4To11;
- } else if ((inFreq == 8) && (outFreq == 11))
- {
- my_mode_ = kResamplerMode8To11;
- } else if ((inFreq == 3) && (outFreq == 2))
- {
- my_mode_ = kResamplerMode3To2;
- } else if ((inFreq == 11) && (outFreq == 2))
- {
- my_mode_ = kResamplerMode11To2;
- } else if ((inFreq == 11) && (outFreq == 4))
- {
- my_mode_ = kResamplerMode11To4;
- } else if ((inFreq == 11) && (outFreq == 16))
- {
- my_mode_ = kResamplerMode11To16;
- } else if ((inFreq == 11) && (outFreq == 32))
- {
- my_mode_ = kResamplerMode11To32;
- } else if ((inFreq == 11) && (outFreq == 8))
- {
- my_mode_ = kResamplerMode11To8;
- } else
- {
- my_type_ = kResamplerInvalid;
- return -1;
- }
-
- // Now create the states we need
- switch (my_mode_)
- {
- case kResamplerMode1To1:
- // No state needed;
- break;
- case kResamplerMode1To2:
- state1_ = malloc(8 * sizeof(WebRtc_Word32));
- memset(state1_, 0, 8 * sizeof(WebRtc_Word32));
- break;
- case kResamplerMode1To3:
- state1_ = malloc(sizeof(WebRtcSpl_State16khzTo48khz));
- WebRtcSpl_ResetResample16khzTo48khz((WebRtcSpl_State16khzTo48khz *)state1_);
- break;
- case kResamplerMode1To4:
- // 1:2
- state1_ = malloc(8 * sizeof(WebRtc_Word32));
- memset(state1_, 0, 8 * sizeof(WebRtc_Word32));
- // 2:4
- state2_ = malloc(8 * sizeof(WebRtc_Word32));
- memset(state2_, 0, 8 * sizeof(WebRtc_Word32));
- break;
- case kResamplerMode1To6:
- // 1:2
- state1_ = malloc(8 * sizeof(WebRtc_Word32));
- memset(state1_, 0, 8 * sizeof(WebRtc_Word32));
- // 2:6
- state2_ = malloc(sizeof(WebRtcSpl_State16khzTo48khz));
- WebRtcSpl_ResetResample16khzTo48khz((WebRtcSpl_State16khzTo48khz *)state2_);
- break;
- case kResamplerMode2To3:
- // 2:6
- state1_ = malloc(sizeof(WebRtcSpl_State16khzTo48khz));
- WebRtcSpl_ResetResample16khzTo48khz((WebRtcSpl_State16khzTo48khz *)state1_);
- // 6:3
- state2_ = malloc(8 * sizeof(WebRtc_Word32));
- memset(state2_, 0, 8 * sizeof(WebRtc_Word32));
- break;
- case kResamplerMode2To11:
- state1_ = malloc(8 * sizeof(WebRtc_Word32));
- memset(state1_, 0, 8 * sizeof(WebRtc_Word32));
-
- state2_ = malloc(sizeof(WebRtcSpl_State8khzTo22khz));
- WebRtcSpl_ResetResample8khzTo22khz((WebRtcSpl_State8khzTo22khz *)state2_);
- break;
- case kResamplerMode4To11:
- state1_ = malloc(sizeof(WebRtcSpl_State8khzTo22khz));
- WebRtcSpl_ResetResample8khzTo22khz((WebRtcSpl_State8khzTo22khz *)state1_);
- break;
- case kResamplerMode8To11:
- state1_ = malloc(sizeof(WebRtcSpl_State16khzTo22khz));
- WebRtcSpl_ResetResample16khzTo22khz((WebRtcSpl_State16khzTo22khz *)state1_);
- break;
- case kResamplerMode11To16:
- state1_ = malloc(8 * sizeof(WebRtc_Word32));
- memset(state1_, 0, 8 * sizeof(WebRtc_Word32));
-
- state2_ = malloc(sizeof(WebRtcSpl_State22khzTo16khz));
- WebRtcSpl_ResetResample22khzTo16khz((WebRtcSpl_State22khzTo16khz *)state2_);
- break;
- case kResamplerMode11To32:
- // 11 -> 22
- state1_ = malloc(8 * sizeof(WebRtc_Word32));
- memset(state1_, 0, 8 * sizeof(WebRtc_Word32));
-
- // 22 -> 16
- state2_ = malloc(sizeof(WebRtcSpl_State22khzTo16khz));
- WebRtcSpl_ResetResample22khzTo16khz((WebRtcSpl_State22khzTo16khz *)state2_);
-
- // 16 -> 32
- state3_ = malloc(8 * sizeof(WebRtc_Word32));
- memset(state3_, 0, 8 * sizeof(WebRtc_Word32));
-
- break;
- case kResamplerMode2To1:
- state1_ = malloc(8 * sizeof(WebRtc_Word32));
- memset(state1_, 0, 8 * sizeof(WebRtc_Word32));
- break;
- case kResamplerMode3To1:
- state1_ = malloc(sizeof(WebRtcSpl_State48khzTo16khz));
- WebRtcSpl_ResetResample48khzTo16khz((WebRtcSpl_State48khzTo16khz *)state1_);
- break;
- case kResamplerMode4To1:
- // 4:2
- state1_ = malloc(8 * sizeof(WebRtc_Word32));
- memset(state1_, 0, 8 * sizeof(WebRtc_Word32));
- // 2:1
- state2_ = malloc(8 * sizeof(WebRtc_Word32));
- memset(state2_, 0, 8 * sizeof(WebRtc_Word32));
- break;
- case kResamplerMode6To1:
- // 6:2
- state1_ = malloc(sizeof(WebRtcSpl_State48khzTo16khz));
- WebRtcSpl_ResetResample48khzTo16khz((WebRtcSpl_State48khzTo16khz *)state1_);
- // 2:1
- state2_ = malloc(8 * sizeof(WebRtc_Word32));
- memset(state2_, 0, 8 * sizeof(WebRtc_Word32));
- break;
- case kResamplerMode3To2:
- // 3:6
- state1_ = malloc(8 * sizeof(WebRtc_Word32));
- memset(state1_, 0, 8 * sizeof(WebRtc_Word32));
- // 6:2
- state2_ = malloc(sizeof(WebRtcSpl_State48khzTo16khz));
- WebRtcSpl_ResetResample48khzTo16khz((WebRtcSpl_State48khzTo16khz *)state2_);
- break;
- case kResamplerMode11To2:
- state1_ = malloc(sizeof(WebRtcSpl_State22khzTo8khz));
- WebRtcSpl_ResetResample22khzTo8khz((WebRtcSpl_State22khzTo8khz *)state1_);
-
- state2_ = malloc(8 * sizeof(WebRtc_Word32));
- memset(state2_, 0, 8 * sizeof(WebRtc_Word32));
-
- break;
- case kResamplerMode11To4:
- state1_ = malloc(sizeof(WebRtcSpl_State22khzTo8khz));
- WebRtcSpl_ResetResample22khzTo8khz((WebRtcSpl_State22khzTo8khz *)state1_);
- break;
- case kResamplerMode11To8:
- state1_ = malloc(sizeof(WebRtcSpl_State22khzTo16khz));
- WebRtcSpl_ResetResample22khzTo16khz((WebRtcSpl_State22khzTo16khz *)state1_);
- break;
-
- }
-
- return 0;
-}
-
-// Synchronous resampling, all output samples are written to samplesOut
-int Resampler::Push(const WebRtc_Word16 * samplesIn, int lengthIn, WebRtc_Word16* samplesOut,
- int maxLen, int &outLen)
-{
- // Check that the resampler is not in asynchronous mode
- if (my_type_ & 0x0f)
- {
- return -1;
- }
-
- // Do we have a stereo signal?
- if ((my_type_ & 0xf0) == 0x20)
- {
-
- // Split up the signal and call the slave object for each channel
-
- WebRtc_Word16* left = (WebRtc_Word16*)malloc(lengthIn * sizeof(WebRtc_Word16) / 2);
- WebRtc_Word16* right = (WebRtc_Word16*)malloc(lengthIn * sizeof(WebRtc_Word16) / 2);
- WebRtc_Word16* out_left = (WebRtc_Word16*)malloc(maxLen / 2 * sizeof(WebRtc_Word16));
- WebRtc_Word16* out_right =
- (WebRtc_Word16*)malloc(maxLen / 2 * sizeof(WebRtc_Word16));
- int res = 0;
- for (int i = 0; i < lengthIn; i += 2)
- {
- left[i >> 1] = samplesIn[i];
- right[i >> 1] = samplesIn[i + 1];
- }
-
- // It's OK to overwrite the local parameter, since it's just a copy
- lengthIn = lengthIn / 2;
-
- int actualOutLen_left = 0;
- int actualOutLen_right = 0;
- // Do resampling for right channel
- res |= slave_left_->Push(left, lengthIn, out_left, maxLen / 2, actualOutLen_left);
- res |= slave_right_->Push(right, lengthIn, out_right, maxLen / 2, actualOutLen_right);
- if (res || (actualOutLen_left != actualOutLen_right))
- {
- free(left);
- free(right);
- free(out_left);
- free(out_right);
- return -1;
- }
-
- // Reassemble the signal
- for (int i = 0; i < actualOutLen_left; i++)
- {
- samplesOut[i * 2] = out_left[i];
- samplesOut[i * 2 + 1] = out_right[i];
- }
- outLen = 2 * actualOutLen_left;
-
- free(left);
- free(right);
- free(out_left);
- free(out_right);
-
- return 0;
- }
-
- // Container for temp samples
- WebRtc_Word16* tmp;
- // tmp data for resampling routines
- WebRtc_Word32* tmp_mem;
-
- switch (my_mode_)
- {
- case kResamplerMode1To1:
- memcpy(samplesOut, samplesIn, lengthIn * sizeof(WebRtc_Word16));
- outLen = lengthIn;
- break;
- case kResamplerMode1To2:
- if (maxLen < (lengthIn * 2))
- {
- return -1;
- }
- WebRtcSpl_UpsampleBy2(samplesIn, lengthIn, samplesOut, (WebRtc_Word32*)state1_);
- outLen = lengthIn * 2;
- return 0;
- case kResamplerMode1To3:
-
- // We can only handle blocks of 160 samples
- // Can be fixed, but I don't think it's needed
- if ((lengthIn % 160) != 0)
- {
- return -1;
- }
- if (maxLen < (lengthIn * 3))
- {
- return -1;
- }
- tmp_mem = (WebRtc_Word32*)malloc(336 * sizeof(WebRtc_Word32));
-
- for (int i = 0; i < lengthIn; i += 160)
- {
- WebRtcSpl_Resample16khzTo48khz(samplesIn + i, samplesOut + i * 3,
- (WebRtcSpl_State16khzTo48khz *)state1_,
- tmp_mem);
- }
- outLen = lengthIn * 3;
- free(tmp_mem);
- return 0;
- case kResamplerMode1To4:
- if (maxLen < (lengthIn * 4))
- {
- return -1;
- }
-
- tmp = (WebRtc_Word16*)malloc(sizeof(WebRtc_Word16) * 2 * lengthIn);
- // 1:2
- WebRtcSpl_UpsampleBy2(samplesIn, lengthIn, tmp, (WebRtc_Word32*)state1_);
- // 2:4
- WebRtcSpl_UpsampleBy2(tmp, lengthIn * 2, samplesOut, (WebRtc_Word32*)state2_);
- outLen = lengthIn * 4;
- free(tmp);
- return 0;
- case kResamplerMode1To6:
- // We can only handle blocks of 80 samples
- // Can be fixed, but I don't think it's needed
- if ((lengthIn % 80) != 0)
- {
- return -1;
- }
- if (maxLen < (lengthIn * 6))
- {
- return -1;
- }
-
- //1:2
-
- tmp_mem = (WebRtc_Word32*)malloc(336 * sizeof(WebRtc_Word32));
- tmp = (WebRtc_Word16*)malloc(sizeof(WebRtc_Word16) * 2 * lengthIn);
-
- WebRtcSpl_UpsampleBy2(samplesIn, lengthIn, tmp, (WebRtc_Word32*)state1_);
- outLen = lengthIn * 2;
-
- for (int i = 0; i < outLen; i += 160)
- {
- WebRtcSpl_Resample16khzTo48khz(tmp + i, samplesOut + i * 3,
- (WebRtcSpl_State16khzTo48khz *)state2_,
- tmp_mem);
- }
- outLen = outLen * 3;
- free(tmp_mem);
- free(tmp);
-
- return 0;
- case kResamplerMode2To3:
- if (maxLen < (lengthIn * 3 / 2))
- {
- return -1;
- }
- // 2:6
- // We can only handle blocks of 160 samples
- // Can be fixed, but I don't think it's needed
- if ((lengthIn % 160) != 0)
- {
- return -1;
- }
- tmp = static_cast<WebRtc_Word16*> (malloc(sizeof(WebRtc_Word16) * lengthIn * 3));
- tmp_mem = (WebRtc_Word32*)malloc(336 * sizeof(WebRtc_Word32));
- for (int i = 0; i < lengthIn; i += 160)
- {
- WebRtcSpl_Resample16khzTo48khz(samplesIn + i, tmp + i * 3,
- (WebRtcSpl_State16khzTo48khz *)state1_,
- tmp_mem);
- }
- lengthIn = lengthIn * 3;
- // 6:3
- WebRtcSpl_DownsampleBy2(tmp, lengthIn, samplesOut, (WebRtc_Word32*)state2_);
- outLen = lengthIn / 2;
- free(tmp);
- free(tmp_mem);
- return 0;
- case kResamplerMode2To11:
-
- // We can only handle blocks of 80 samples
- // Can be fixed, but I don't think it's needed
- if ((lengthIn % 80) != 0)
- {
- return -1;
- }
- if (maxLen < ((lengthIn * 11) / 2))
- {
- return -1;
- }
- tmp = (WebRtc_Word16*)malloc(sizeof(WebRtc_Word16) * 2 * lengthIn);
- // 1:2
- WebRtcSpl_UpsampleBy2(samplesIn, lengthIn, tmp, (WebRtc_Word32*)state1_);
- lengthIn *= 2;
-
- tmp_mem = (WebRtc_Word32*)malloc(98 * sizeof(WebRtc_Word32));
-
- for (int i = 0; i < lengthIn; i += 80)
- {
- WebRtcSpl_Resample8khzTo22khz(tmp + i, samplesOut + (i * 11) / 4,
- (WebRtcSpl_State8khzTo22khz *)state2_,
- tmp_mem);
- }
- outLen = (lengthIn * 11) / 4;
- free(tmp_mem);
- free(tmp);
- return 0;
- case kResamplerMode4To11:
-
- // We can only handle blocks of 80 samples
- // Can be fixed, but I don't think it's needed
- if ((lengthIn % 80) != 0)
- {
- return -1;
- }
- if (maxLen < ((lengthIn * 11) / 4))
- {
- return -1;
- }
- tmp_mem = (WebRtc_Word32*)malloc(98 * sizeof(WebRtc_Word32));
-
- for (int i = 0; i < lengthIn; i += 80)
- {
- WebRtcSpl_Resample8khzTo22khz(samplesIn + i, samplesOut + (i * 11) / 4,
- (WebRtcSpl_State8khzTo22khz *)state1_,
- tmp_mem);
- }
- outLen = (lengthIn * 11) / 4;
- free(tmp_mem);
- return 0;
- case kResamplerMode8To11:
- // We can only handle blocks of 160 samples
- // Can be fixed, but I don't think it's needed
- if ((lengthIn % 160) != 0)
- {
- return -1;
- }
- if (maxLen < ((lengthIn * 11) / 8))
- {
- return -1;
- }
- tmp_mem = (WebRtc_Word32*)malloc(88 * sizeof(WebRtc_Word32));
-
- for (int i = 0; i < lengthIn; i += 160)
- {
- WebRtcSpl_Resample16khzTo22khz(samplesIn + i, samplesOut + (i * 11) / 8,
- (WebRtcSpl_State16khzTo22khz *)state1_,
- tmp_mem);
- }
- outLen = (lengthIn * 11) / 8;
- free(tmp_mem);
- return 0;
-
- case kResamplerMode11To16:
- // We can only handle blocks of 110 samples
- if ((lengthIn % 110) != 0)
- {
- return -1;
- }
- if (maxLen < ((lengthIn * 16) / 11))
- {
- return -1;
- }
-
- tmp_mem = (WebRtc_Word32*)malloc(104 * sizeof(WebRtc_Word32));
- tmp = (WebRtc_Word16*)malloc((sizeof(WebRtc_Word16) * lengthIn * 2));
-
- WebRtcSpl_UpsampleBy2(samplesIn, lengthIn, tmp, (WebRtc_Word32*)state1_);
-
- for (int i = 0; i < (lengthIn * 2); i += 220)
- {
- WebRtcSpl_Resample22khzTo16khz(tmp + i, samplesOut + (i / 220) * 160,
- (WebRtcSpl_State22khzTo16khz *)state2_,
- tmp_mem);
- }
-
- outLen = (lengthIn * 16) / 11;
-
- free(tmp_mem);
- free(tmp);
- return 0;
-
- case kResamplerMode11To32:
-
- // We can only handle blocks of 110 samples
- if ((lengthIn % 110) != 0)
- {
- return -1;
- }
- if (maxLen < ((lengthIn * 32) / 11))
- {
- return -1;
- }
-
- tmp_mem = (WebRtc_Word32*)malloc(104 * sizeof(WebRtc_Word32));
- tmp = (WebRtc_Word16*)malloc((sizeof(WebRtc_Word16) * lengthIn * 2));
-
- // 11 -> 22 kHz in samplesOut
- WebRtcSpl_UpsampleBy2(samplesIn, lengthIn, samplesOut, (WebRtc_Word32*)state1_);
-
- // 22 -> 16 in tmp
- for (int i = 0; i < (lengthIn * 2); i += 220)
- {
- WebRtcSpl_Resample22khzTo16khz(samplesOut + i, tmp + (i / 220) * 160,
- (WebRtcSpl_State22khzTo16khz *)state2_,
- tmp_mem);
- }
-
- // 16 -> 32 in samplesOut
- WebRtcSpl_UpsampleBy2(tmp, (lengthIn * 16) / 11, samplesOut,
- (WebRtc_Word32*)state3_);
-
- outLen = (lengthIn * 32) / 11;
-
- free(tmp_mem);
- free(tmp);
- return 0;
-
- case kResamplerMode2To1:
- if (maxLen < (lengthIn / 2))
- {
- return -1;
- }
- WebRtcSpl_DownsampleBy2(samplesIn, lengthIn, samplesOut, (WebRtc_Word32*)state1_);
- outLen = lengthIn / 2;
- return 0;
- case kResamplerMode3To1:
- // We can only handle blocks of 480 samples
- // Can be fixed, but I don't think it's needed
- if ((lengthIn % 480) != 0)
- {
- return -1;
- }
- if (maxLen < (lengthIn / 3))
- {
- return -1;
- }
- tmp_mem = (WebRtc_Word32*)malloc(496 * sizeof(WebRtc_Word32));
-
- for (int i = 0; i < lengthIn; i += 480)
- {
- WebRtcSpl_Resample48khzTo16khz(samplesIn + i, samplesOut + i / 3,
- (WebRtcSpl_State48khzTo16khz *)state1_,
- tmp_mem);
- }
- outLen = lengthIn / 3;
- free(tmp_mem);
- return 0;
- case kResamplerMode4To1:
- if (maxLen < (lengthIn / 4))
- {
- return -1;
- }
- tmp = (WebRtc_Word16*)malloc(sizeof(WebRtc_Word16) * lengthIn / 2);
- // 4:2
- WebRtcSpl_DownsampleBy2(samplesIn, lengthIn, tmp, (WebRtc_Word32*)state1_);
- // 2:1
- WebRtcSpl_DownsampleBy2(tmp, lengthIn / 2, samplesOut, (WebRtc_Word32*)state2_);
- outLen = lengthIn / 4;
- free(tmp);
- return 0;
-
- case kResamplerMode6To1:
- // We can only handle blocks of 480 samples
- // Can be fixed, but I don't think it's needed
- if ((lengthIn % 480) != 0)
- {
- return -1;
- }
- if (maxLen < (lengthIn / 6))
- {
- return -1;
- }
-
- tmp_mem = (WebRtc_Word32*)malloc(496 * sizeof(WebRtc_Word32));
- tmp = (WebRtc_Word16*)malloc((sizeof(WebRtc_Word16) * lengthIn) / 3);
-
- for (int i = 0; i < lengthIn; i += 480)
- {
- WebRtcSpl_Resample48khzTo16khz(samplesIn + i, tmp + i / 3,
- (WebRtcSpl_State48khzTo16khz *)state1_,
- tmp_mem);
- }
- outLen = lengthIn / 3;
- free(tmp_mem);
- WebRtcSpl_DownsampleBy2(tmp, outLen, samplesOut, (WebRtc_Word32*)state2_);
- free(tmp);
- outLen = outLen / 2;
- return 0;
- case kResamplerMode3To2:
- if (maxLen < (lengthIn * 2 / 3))
- {
- return -1;
- }
- // 3:6
- tmp = static_cast<WebRtc_Word16*> (malloc(sizeof(WebRtc_Word16) * lengthIn * 2));
- WebRtcSpl_UpsampleBy2(samplesIn, lengthIn, tmp, (WebRtc_Word32*)state1_);
- lengthIn *= 2;
- // 6:2
- // We can only handle blocks of 480 samples
- // Can be fixed, but I don't think it's needed
- if ((lengthIn % 480) != 0)
- {
- free(tmp);
- return -1;
- }
- tmp_mem = (WebRtc_Word32*)malloc(496 * sizeof(WebRtc_Word32));
- for (int i = 0; i < lengthIn; i += 480)
- {
- WebRtcSpl_Resample48khzTo16khz(tmp + i, samplesOut + i / 3,
- (WebRtcSpl_State48khzTo16khz *)state2_,
- tmp_mem);
- }
- outLen = lengthIn / 3;
- free(tmp);
- free(tmp_mem);
- return 0;
- case kResamplerMode11To2:
- // We can only handle blocks of 220 samples
- // Can be fixed, but I don't think it's needed
- if ((lengthIn % 220) != 0)
- {
- return -1;
- }
- if (maxLen < ((lengthIn * 2) / 11))
- {
- return -1;
- }
- tmp_mem = (WebRtc_Word32*)malloc(126 * sizeof(WebRtc_Word32));
- tmp = (WebRtc_Word16*)malloc((lengthIn * 4) / 11 * sizeof(WebRtc_Word16));
-
- for (int i = 0; i < lengthIn; i += 220)
- {
- WebRtcSpl_Resample22khzTo8khz(samplesIn + i, tmp + (i * 4) / 11,
- (WebRtcSpl_State22khzTo8khz *)state1_,
- tmp_mem);
- }
- lengthIn = (lengthIn * 4) / 11;
-
- WebRtcSpl_DownsampleBy2(tmp, lengthIn, samplesOut, (WebRtc_Word32*)state2_);
- outLen = lengthIn / 2;
-
- free(tmp_mem);
- free(tmp);
- return 0;
- case kResamplerMode11To4:
- // We can only handle blocks of 220 samples
- // Can be fixed, but I don't think it's needed
- if ((lengthIn % 220) != 0)
- {
- return -1;
- }
- if (maxLen < ((lengthIn * 4) / 11))
- {
- return -1;
- }
- tmp_mem = (WebRtc_Word32*)malloc(126 * sizeof(WebRtc_Word32));
-
- for (int i = 0; i < lengthIn; i += 220)
- {
- WebRtcSpl_Resample22khzTo8khz(samplesIn + i, samplesOut + (i * 4) / 11,
- (WebRtcSpl_State22khzTo8khz *)state1_,
- tmp_mem);
- }
- outLen = (lengthIn * 4) / 11;
- free(tmp_mem);
- return 0;
- case kResamplerMode11To8:
- // We can only handle blocks of 160 samples
- // Can be fixed, but I don't think it's needed
- if ((lengthIn % 220) != 0)
- {
- return -1;
- }
- if (maxLen < ((lengthIn * 8) / 11))
- {
- return -1;
- }
- tmp_mem = (WebRtc_Word32*)malloc(104 * sizeof(WebRtc_Word32));
-
- for (int i = 0; i < lengthIn; i += 220)
- {
- WebRtcSpl_Resample22khzTo16khz(samplesIn + i, samplesOut + (i * 8) / 11,
- (WebRtcSpl_State22khzTo16khz *)state1_,
- tmp_mem);
- }
- outLen = (lengthIn * 8) / 11;
- free(tmp_mem);
- return 0;
- break;
-
- }
- return 0;
-}
-
-// Asynchronous resampling, input
-int Resampler::Insert(WebRtc_Word16 * samplesIn, int lengthIn)
-{
- if (my_type_ != kResamplerAsynchronous)
- {
- return -1;
- }
- int sizeNeeded, tenMsblock;
-
- // Determine need for size of outBuffer
- sizeNeeded = out_buffer_size_ + ((lengthIn + in_buffer_size_) * my_out_frequency_khz_)
- / my_in_frequency_khz_;
- if (sizeNeeded > out_buffer_size_max_)
- {
- // Round the value upwards to complete 10 ms blocks
- tenMsblock = my_out_frequency_khz_ * 10;
- sizeNeeded = (sizeNeeded / tenMsblock + 1) * tenMsblock;
- out_buffer_ = (WebRtc_Word16*)realloc(out_buffer_, sizeNeeded * sizeof(WebRtc_Word16));
- out_buffer_size_max_ = sizeNeeded;
- }
-
- // If we need to use inBuffer, make sure all input data fits there.
-
- tenMsblock = my_in_frequency_khz_ * 10;
- if (in_buffer_size_ || (lengthIn % tenMsblock))
- {
- // Check if input buffer size is enough
- if ((in_buffer_size_ + lengthIn) > in_buffer_size_max_)
- {
- // Round the value upwards to complete 10 ms blocks
- sizeNeeded = ((in_buffer_size_ + lengthIn) / tenMsblock + 1) * tenMsblock;
- in_buffer_ = (WebRtc_Word16*)realloc(in_buffer_,
- sizeNeeded * sizeof(WebRtc_Word16));
- in_buffer_size_max_ = sizeNeeded;
- }
- // Copy in data to input buffer
- memcpy(in_buffer_ + in_buffer_size_, samplesIn, lengthIn * sizeof(WebRtc_Word16));
-
- // Resample all available 10 ms blocks
- int lenOut;
- int dataLenToResample = (in_buffer_size_ / tenMsblock) * tenMsblock;
- Push(in_buffer_, dataLenToResample, out_buffer_ + out_buffer_size_,
- out_buffer_size_max_ - out_buffer_size_, lenOut);
- out_buffer_size_ += lenOut;
-
- // Save the rest
- memmove(in_buffer_, in_buffer_ + dataLenToResample,
- (in_buffer_size_ - dataLenToResample) * sizeof(WebRtc_Word16));
- in_buffer_size_ -= dataLenToResample;
- } else
- {
- // Just resample
- int lenOut;
- Push(in_buffer_, lengthIn, out_buffer_ + out_buffer_size_,
- out_buffer_size_max_ - out_buffer_size_, lenOut);
- out_buffer_size_ += lenOut;
- }
-
- return 0;
-}
-
-// Asynchronous resampling output, remaining samples are buffered
-int Resampler::Pull(WebRtc_Word16* samplesOut, int desiredLen, int &outLen)
-{
- if (my_type_ != kResamplerAsynchronous)
- {
- return -1;
- }
-
- // Check that we have enough data
- if (desiredLen <= out_buffer_size_)
- {
- // Give out the date
- memcpy(samplesOut, out_buffer_, desiredLen * sizeof(WebRtc_Word32));
-
- // Shuffle down remaining
- memmove(out_buffer_, out_buffer_ + desiredLen,
- (out_buffer_size_ - desiredLen) * sizeof(WebRtc_Word16));
-
- // Update remaining size
- out_buffer_size_ -= desiredLen;
-
- return 0;
- } else
- {
- return -1;
- }
-}
-
-} // namespace webrtc
diff --git a/src/common_audio/resampler/main/source/resampler.gyp b/src/common_audio/resampler/main/source/resampler.gyp
deleted file mode 100644
index 8baf870..0000000
--- a/src/common_audio/resampler/main/source/resampler.gyp
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-{
- 'includes': [
- '../../../../common_settings.gypi', # Common settings
- ],
- 'targets': [
- {
- 'target_name': 'resampler',
- 'type': '<(library)',
- 'dependencies': [
- '../../../signal_processing_library/main/source/spl.gyp:spl',
- ],
- 'include_dirs': [
- '../interface',
- ],
- 'direct_dependent_settings': {
- 'include_dirs': [
- '../interface',
- ],
- },
- 'sources': [
- '../interface/resampler.h',
- 'resampler.cc',
- ],
- },
- ],
-}
-
-# Local Variables:
-# tab-width:2
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/src/common_audio/signal_processing_library/OWNERS b/src/common_audio/signal_processing_library/OWNERS
deleted file mode 100644
index cf595df..0000000
--- a/src/common_audio/signal_processing_library/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-bjornv@google.com
-tlegrand@google.com
-jks@google.com
diff --git a/src/common_audio/signal_processing_library/main/interface/signal_processing_library.h b/src/common_audio/signal_processing_library/main/interface/signal_processing_library.h
deleted file mode 100644
index 414e045..0000000
--- a/src/common_audio/signal_processing_library/main/interface/signal_processing_library.h
+++ /dev/null
@@ -1,1771 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This header file includes all of the fix point signal processing library (SPL) function
- * descriptions and declarations.
- * For specific function calls, see bottom of file.
- */
-
-#ifndef WEBRTC_SPL_SIGNAL_PROCESSING_LIBRARY_H_
-#define WEBRTC_SPL_SIGNAL_PROCESSING_LIBRARY_H_
-
-#include <string.h>
-#include "typedefs.h"
-
-#ifdef ARM_WINM
-#include <Armintr.h> // intrinsic file for windows mobile
-#endif
-
-#ifdef WEBRTC_ANDROID
-#define WEBRTC_SPL_INLINE_CALLS
-#define SPL_NO_DOUBLE_IMPLEMENTATIONS
-#endif
-
-// Macros specific for the fixed point implementation
-#define WEBRTC_SPL_WORD16_MAX 32767
-#define WEBRTC_SPL_WORD16_MIN -32768
-#define WEBRTC_SPL_WORD32_MAX (WebRtc_Word32)0x7fffffff
-#define WEBRTC_SPL_WORD32_MIN (WebRtc_Word32)0x80000000
-#define WEBRTC_SPL_MAX_LPC_ORDER 14
-#define WEBRTC_SPL_MAX_SEED_USED 0x80000000L
-#define WEBRTC_SPL_MIN(A, B) (A < B ? A : B) // Get min value
-#define WEBRTC_SPL_MAX(A, B) (A > B ? A : B) // Get max value
-#define WEBRTC_SPL_ABS_W16(a)\
- (((WebRtc_Word16)a >= 0) ? ((WebRtc_Word16)a) : -((WebRtc_Word16)a))
-#define WEBRTC_SPL_ABS_W32(a)\
- (((WebRtc_Word32)a >= 0) ? ((WebRtc_Word32)a) : -((WebRtc_Word32)a))
-
-#if (defined WEBRTC_TARGET_PC)||(defined __TARGET_XSCALE)
-#define WEBRTC_SPL_GET_BYTE(a, nr) (((WebRtc_Word8 *)a)[nr])
-#define WEBRTC_SPL_SET_BYTE(d_ptr, val, index) \
- (((WebRtc_Word8 *)d_ptr)[index] = (val))
-#elif defined WEBRTC_BIG_ENDIAN
-#define WEBRTC_SPL_GET_BYTE(a, nr)\
- ((((WebRtc_Word16 *)a)[nr >> 1]) >> (((nr + 1) & 0x1) * 8) & 0x00ff)
-#define WEBRTC_SPL_SET_BYTE(d_ptr, val, index) \
- ((WebRtc_Word16 *)d_ptr)[index >> 1] = \
- ((((WebRtc_Word16 *)d_ptr)[index >> 1]) \
- & (0x00ff << (8 * ((index) & 0x1)))) | (val << (8 * ((index + 1) & 0x1)))
-#else
-#define WEBRTC_SPL_GET_BYTE(a,nr) \
- ((((WebRtc_Word16 *)(a))[(nr) >> 1]) >> (((nr) & 0x1) * 8) & 0x00ff)
-#define WEBRTC_SPL_SET_BYTE(d_ptr, val, index) \
- ((WebRtc_Word16 *)(d_ptr))[(index) >> 1] = \
- ((((WebRtc_Word16 *)(d_ptr))[(index) >> 1]) \
- & (0x00ff << (8 * (((index) + 1) & 0x1)))) | \
- ((val) << (8 * ((index) & 0x1)))
-#endif
-
-#ifndef WEBRTC_ANDROID
-#define WEBRTC_SPL_MUL(a, b) \
- ((WebRtc_Word32) ((WebRtc_Word32)(a) * (WebRtc_Word32)(b)))
-#endif
-
-#define WEBRTC_SPL_UMUL(a, b) \
- ((WebRtc_UWord32) ((WebRtc_UWord32)(a) * (WebRtc_UWord32)(b)))
-#define WEBRTC_SPL_UMUL_RSFT16(a, b)\
- ((WebRtc_UWord32) ((WebRtc_UWord32)(a) * (WebRtc_UWord32)(b)) >> 16)
-#define WEBRTC_SPL_UMUL_16_16(a, b)\
- ((WebRtc_UWord32) (WebRtc_UWord16)(a) * (WebRtc_UWord16)(b))
-#define WEBRTC_SPL_UMUL_16_16_RSFT16(a, b)\
- (((WebRtc_UWord32) (WebRtc_UWord16)(a) * (WebRtc_UWord16)(b)) >> 16)
-#define WEBRTC_SPL_UMUL_32_16(a, b)\
- ((WebRtc_UWord32) ((WebRtc_UWord32)(a) * (WebRtc_UWord16)(b)))
-#define WEBRTC_SPL_UMUL_32_16_RSFT16(a, b)\
- ((WebRtc_UWord32) ((WebRtc_UWord32)(a) * (WebRtc_UWord16)(b)) >> 16)
-#define WEBRTC_SPL_MUL_16_U16(a, b)\
- ((WebRtc_Word32)(WebRtc_Word16)(a) * (WebRtc_UWord16)(b))
-#define WEBRTC_SPL_DIV(a, b) \
- ((WebRtc_Word32) ((WebRtc_Word32)(a) / (WebRtc_Word32)(b)))
-#define WEBRTC_SPL_UDIV(a, b) \
- ((WebRtc_UWord32) ((WebRtc_UWord32)(a) / (WebRtc_UWord32)(b)))
-
-#define WEBRTC_SPL_MUL_16_32_RSFT11(a, b)\
- ((WEBRTC_SPL_MUL_16_16(a, (b) >> 16) << 5) \
- + (((WEBRTC_SPL_MUL_16_U16(a, (WebRtc_UWord16)(b)) >> 1) + 0x0200) >> 10))
-#define WEBRTC_SPL_MUL_16_32_RSFT14(a, b)\
- ((WEBRTC_SPL_MUL_16_16(a, (b) >> 16) << 2) \
- + (((WEBRTC_SPL_MUL_16_U16(a, (WebRtc_UWord16)(b)) >> 1) + 0x1000) >> 13))
-#define WEBRTC_SPL_MUL_16_32_RSFT15(a, b) \
- ((WEBRTC_SPL_MUL_16_16(a, (b) >> 16) << 1) \
- + (((WEBRTC_SPL_MUL_16_U16(a, (WebRtc_UWord16)(b)) >> 1) + 0x2000) >> 14))
-
-#ifndef WEBRTC_ANDROID
-#define WEBRTC_SPL_MUL_16_32_RSFT16(a, b) \
- (WEBRTC_SPL_MUL_16_16(a, b >> 16) \
- + ((WEBRTC_SPL_MUL_16_16(a, (b & 0xffff) >> 1) + 0x4000) >> 15))
-#define WEBRTC_SPL_MUL_32_32_RSFT32(a32a, a32b, b32) \
- ((WebRtc_Word32)(WEBRTC_SPL_MUL_16_32_RSFT16(a32a, b32) \
- + (WEBRTC_SPL_MUL_16_32_RSFT16(a32b, b32) >> 16)))
-#define WEBRTC_SPL_MUL_32_32_RSFT32BI(a32, b32) \
- ((WebRtc_Word32)(WEBRTC_SPL_MUL_16_32_RSFT16(( \
- (WebRtc_Word16)(a32 >> 16)), b32) + \
- (WEBRTC_SPL_MUL_16_32_RSFT16(( \
- (WebRtc_Word16)((a32 & 0x0000FFFF) >> 1)), b32) >> 15)))
-#endif
-
-#ifdef ARM_WINM
-#define WEBRTC_SPL_MUL_16_16(a, b) \
- _SmulLo_SW_SL((WebRtc_Word16)(a), (WebRtc_Word16)(b))
-#elif !defined (WEBRTC_ANDROID)
-#define WEBRTC_SPL_MUL_16_16(a, b) \
- ((WebRtc_Word32) (((WebRtc_Word16)(a)) * ((WebRtc_Word16)(b))))
-#endif
-
-#define WEBRTC_SPL_MUL_16_16_RSFT(a, b, c) \
- (WEBRTC_SPL_MUL_16_16(a, b) >> (c))
-
-#define WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(a, b, c) \
- ((WEBRTC_SPL_MUL_16_16(a, b) + ((WebRtc_Word32) \
- (((WebRtc_Word32)1) << ((c) - 1)))) >> (c))
-#define WEBRTC_SPL_MUL_16_16_RSFT_WITH_FIXROUND(a, b)\
- ((WEBRTC_SPL_MUL_16_16(a, b) + ((WebRtc_Word32) (1 << 14))) >> 15)
-
-// C + the 32 most significant bits of A * B
-#define WEBRTC_SPL_SCALEDIFF32(A, B, C) \
- (C + (B >> 16) * A + (((WebRtc_UWord32)(0x0000FFFF & B) * A) >> 16))
-
-#define WEBRTC_SPL_ADD_SAT_W32(a, b) WebRtcSpl_AddSatW32(a, b)
-#define WEBRTC_SPL_SAT(a, b, c) (b > a ? a : b < c ? c : b)
-#define WEBRTC_SPL_MUL_32_16(a, b) ((a) * (b))
-
-#define WEBRTC_SPL_SUB_SAT_W32(a, b) WebRtcSpl_SubSatW32(a, b)
-#define WEBRTC_SPL_ADD_SAT_W16(a, b) WebRtcSpl_AddSatW16(a, b)
-#define WEBRTC_SPL_SUB_SAT_W16(a, b) WebRtcSpl_SubSatW16(a, b)
-
-// We cannot do casting here due to signed/unsigned problem
-#define WEBRTC_SPL_IS_NEG(a) ((a) & 0x80000000)
-// Shifting with negative numbers allowed
-// Positive means left shift
-#define WEBRTC_SPL_SHIFT_W16(x, c) \
- (((c) >= 0) ? ((x) << (c)) : ((x) >> (-(c))))
-#define WEBRTC_SPL_SHIFT_W32(x, c) \
- (((c) >= 0) ? ((x) << (c)) : ((x) >> (-(c))))
-
-// Shifting with negative numbers not allowed
-// We cannot do casting here due to signed/unsigned problem
-#define WEBRTC_SPL_RSHIFT_W16(x, c) ((x) >> (c))
-#define WEBRTC_SPL_LSHIFT_W16(x, c) ((x) << (c))
-#define WEBRTC_SPL_RSHIFT_W32(x, c) ((x) >> (c))
-#define WEBRTC_SPL_LSHIFT_W32(x, c) ((x) << (c))
-
-#define WEBRTC_SPL_RSHIFT_U16(x, c) ((WebRtc_UWord16)(x) >> (c))
-#define WEBRTC_SPL_LSHIFT_U16(x, c) ((WebRtc_UWord16)(x) << (c))
-#define WEBRTC_SPL_RSHIFT_U32(x, c) ((WebRtc_UWord32)(x) >> (c))
-#define WEBRTC_SPL_LSHIFT_U32(x, c) ((WebRtc_UWord32)(x) << (c))
-
-#define WEBRTC_SPL_VNEW(t, n) (t *) malloc (sizeof (t) * (n))
-#define WEBRTC_SPL_FREE free
-
-#define WEBRTC_SPL_RAND(a)\
- ((WebRtc_Word16)(WEBRTC_SPL_MUL_16_16_RSFT((a), 18816, 7) & 0x00007fff))
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#define WEBRTC_SPL_MEMCPY_W8(v1, v2, length) \
- memcpy(v1, v2, (length) * sizeof(char))
-#define WEBRTC_SPL_MEMCPY_W16(v1, v2, length) \
- memcpy(v1, v2, (length) * sizeof(WebRtc_Word16))
-
-#define WEBRTC_SPL_MEMMOVE_W16(v1, v2, length) \
- memmove(v1, v2, (length) * sizeof(WebRtc_Word16))
-
-// Trigonometric tables used for quick lookup
-// default declarations
-extern WebRtc_Word16 WebRtcSpl_kCosTable[];
-extern WebRtc_Word16 WebRtcSpl_kSinTable[];
-extern WebRtc_Word16 WebRtcSpl_kSinTable1024[];
-// Hanning table
-extern WebRtc_Word16 WebRtcSpl_kHanningTable[];
-// Random table
-extern WebRtc_Word16 WebRtcSpl_kRandNTable[];
-
-#ifndef WEBRTC_SPL_INLINE_CALLS
-WebRtc_Word16 WebRtcSpl_AddSatW16(WebRtc_Word16 var1, WebRtc_Word16 var2);
-WebRtc_Word16 WebRtcSpl_SubSatW16(WebRtc_Word16 var1, WebRtc_Word16 var2);
-WebRtc_Word32 WebRtcSpl_AddSatW32(WebRtc_Word32 var1, WebRtc_Word32 var2);
-WebRtc_Word32 WebRtcSpl_SubSatW32(WebRtc_Word32 var1, WebRtc_Word32 var2);
-WebRtc_Word16 WebRtcSpl_GetSizeInBits(WebRtc_UWord32 value);
-int WebRtcSpl_NormW32(WebRtc_Word32 value);
-int WebRtcSpl_NormW16(WebRtc_Word16 value);
-int WebRtcSpl_NormU32(WebRtc_UWord32 value);
-#else
-#include "spl_inl.h"
-#endif
-
-// Get SPL Version
-WebRtc_Word16 WebRtcSpl_get_version(char* version,
- WebRtc_Word16 length_in_bytes);
-
-int WebRtcSpl_GetScalingSquare(WebRtc_Word16* in_vector,
- int in_vector_length,
- int times);
-
-// Copy and set operations. Implementation in copy_set_operations.c.
-// Descriptions at bottom of file.
-void WebRtcSpl_MemSetW16(WebRtc_Word16* vector,
- WebRtc_Word16 set_value,
- int vector_length);
-void WebRtcSpl_MemSetW32(WebRtc_Word32* vector,
- WebRtc_Word32 set_value,
- int vector_length);
-void WebRtcSpl_MemCpyReversedOrder(WebRtc_Word16* out_vector,
- WebRtc_Word16* in_vector,
- int vector_length);
-WebRtc_Word16 WebRtcSpl_CopyFromEndW16(G_CONST WebRtc_Word16* in_vector,
- WebRtc_Word16 in_vector_length,
- WebRtc_Word16 samples,
- WebRtc_Word16* out_vector);
-WebRtc_Word16 WebRtcSpl_ZerosArrayW16(WebRtc_Word16* vector,
- WebRtc_Word16 vector_length);
-WebRtc_Word16 WebRtcSpl_ZerosArrayW32(WebRtc_Word32* vector,
- WebRtc_Word16 vector_length);
-WebRtc_Word16 WebRtcSpl_OnesArrayW16(WebRtc_Word16* vector,
- WebRtc_Word16 vector_length);
-WebRtc_Word16 WebRtcSpl_OnesArrayW32(WebRtc_Word32* vector,
- WebRtc_Word16 vector_length);
-// End: Copy and set operations.
-
-// Minimum and maximum operations. Implementation in min_max_operations.c.
-// Descriptions at bottom of file.
-WebRtc_Word16 WebRtcSpl_MaxAbsValueW16(G_CONST WebRtc_Word16* vector,
- WebRtc_Word16 length);
-WebRtc_Word32 WebRtcSpl_MaxAbsValueW32(G_CONST WebRtc_Word32* vector,
- WebRtc_Word16 length);
-WebRtc_Word16 WebRtcSpl_MinValueW16(G_CONST WebRtc_Word16* vector,
- WebRtc_Word16 length);
-WebRtc_Word32 WebRtcSpl_MinValueW32(G_CONST WebRtc_Word32* vector,
- WebRtc_Word16 length);
-WebRtc_Word16 WebRtcSpl_MaxValueW16(G_CONST WebRtc_Word16* vector,
- WebRtc_Word16 length);
-
-WebRtc_Word16 WebRtcSpl_MaxAbsIndexW16(G_CONST WebRtc_Word16* vector,
- WebRtc_Word16 length);
-WebRtc_Word32 WebRtcSpl_MaxValueW32(G_CONST WebRtc_Word32* vector,
- WebRtc_Word16 length);
-WebRtc_Word16 WebRtcSpl_MinIndexW16(G_CONST WebRtc_Word16* vector,
- WebRtc_Word16 length);
-WebRtc_Word16 WebRtcSpl_MinIndexW32(G_CONST WebRtc_Word32* vector,
- WebRtc_Word16 length);
-WebRtc_Word16 WebRtcSpl_MaxIndexW16(G_CONST WebRtc_Word16* vector,
- WebRtc_Word16 length);
-WebRtc_Word16 WebRtcSpl_MaxIndexW32(G_CONST WebRtc_Word32* vector,
- WebRtc_Word16 length);
-// End: Minimum and maximum operations.
-
-// Vector scaling operations. Implementation in vector_scaling_operations.c.
-// Description at bottom of file.
-void WebRtcSpl_VectorBitShiftW16(WebRtc_Word16* out_vector,
- WebRtc_Word16 vector_length,
- G_CONST WebRtc_Word16* in_vector,
- WebRtc_Word16 right_shifts);
-void WebRtcSpl_VectorBitShiftW32(WebRtc_Word32* out_vector,
- WebRtc_Word16 vector_length,
- G_CONST WebRtc_Word32* in_vector,
- WebRtc_Word16 right_shifts);
-void WebRtcSpl_VectorBitShiftW32ToW16(WebRtc_Word16* out_vector,
- WebRtc_Word16 vector_length,
- G_CONST WebRtc_Word32* in_vector,
- WebRtc_Word16 right_shifts);
-
-void WebRtcSpl_ScaleVector(G_CONST WebRtc_Word16* in_vector,
- WebRtc_Word16* out_vector,
- WebRtc_Word16 gain,
- WebRtc_Word16 vector_length,
- WebRtc_Word16 right_shifts);
-void WebRtcSpl_ScaleVectorWithSat(G_CONST WebRtc_Word16* in_vector,
- WebRtc_Word16* out_vector,
- WebRtc_Word16 gain,
- WebRtc_Word16 vector_length,
- WebRtc_Word16 right_shifts);
-void WebRtcSpl_ScaleAndAddVectors(G_CONST WebRtc_Word16* in_vector1,
- WebRtc_Word16 gain1, int right_shifts1,
- G_CONST WebRtc_Word16* in_vector2,
- WebRtc_Word16 gain2, int right_shifts2,
- WebRtc_Word16* out_vector,
- int vector_length);
-// End: Vector scaling operations.
-
-// iLBC specific functions. Implementations in ilbc_specific_functions.c.
-// Description at bottom of file.
-void WebRtcSpl_ScaleAndAddVectorsWithRound(WebRtc_Word16* in_vector1,
- WebRtc_Word16 scale1,
- WebRtc_Word16* in_vector2,
- WebRtc_Word16 scale2,
- WebRtc_Word16 right_shifts,
- WebRtc_Word16* out_vector,
- WebRtc_Word16 vector_length);
-void WebRtcSpl_ReverseOrderMultArrayElements(WebRtc_Word16* out_vector,
- G_CONST WebRtc_Word16* in_vector,
- G_CONST WebRtc_Word16* window,
- WebRtc_Word16 vector_length,
- WebRtc_Word16 right_shifts);
-void WebRtcSpl_ElementwiseVectorMult(WebRtc_Word16* out_vector,
- G_CONST WebRtc_Word16* in_vector,
- G_CONST WebRtc_Word16* window,
- WebRtc_Word16 vector_length,
- WebRtc_Word16 right_shifts);
-void WebRtcSpl_AddVectorsAndShift(WebRtc_Word16* out_vector,
- G_CONST WebRtc_Word16* in_vector1,
- G_CONST WebRtc_Word16* in_vector2,
- WebRtc_Word16 vector_length,
- WebRtc_Word16 right_shifts);
-void WebRtcSpl_AddAffineVectorToVector(WebRtc_Word16* out_vector,
- WebRtc_Word16* in_vector,
- WebRtc_Word16 gain,
- WebRtc_Word32 add_constant,
- WebRtc_Word16 right_shifts,
- int vector_length);
-void WebRtcSpl_AffineTransformVector(WebRtc_Word16* out_vector,
- WebRtc_Word16* in_vector,
- WebRtc_Word16 gain,
- WebRtc_Word32 add_constant,
- WebRtc_Word16 right_shifts,
- int vector_length);
-// End: iLBC specific functions.
-
-// Signal processing operations. Descriptions at bottom of this file.
-int WebRtcSpl_AutoCorrelation(G_CONST WebRtc_Word16* vector,
- int vector_length, int order,
- WebRtc_Word32* result_vector,
- int* scale);
-WebRtc_Word16 WebRtcSpl_LevinsonDurbin(WebRtc_Word32* auto_corr,
- WebRtc_Word16* lpc_coef,
- WebRtc_Word16* refl_coef,
- WebRtc_Word16 order);
-void WebRtcSpl_ReflCoefToLpc(G_CONST WebRtc_Word16* refl_coef,
- int use_order,
- WebRtc_Word16* lpc_coef);
-void WebRtcSpl_LpcToReflCoef(WebRtc_Word16* lpc_coef,
- int use_order,
- WebRtc_Word16* refl_coef);
-void WebRtcSpl_AutoCorrToReflCoef(G_CONST WebRtc_Word32* auto_corr,
- int use_order,
- WebRtc_Word16* refl_coef);
-void WebRtcSpl_CrossCorrelation(WebRtc_Word32* cross_corr,
- WebRtc_Word16* vector1,
- WebRtc_Word16* vector2,
- WebRtc_Word16 dim_vector,
- WebRtc_Word16 dim_cross_corr,
- WebRtc_Word16 right_shifts,
- WebRtc_Word16 step_vector2);
-void WebRtcSpl_GetHanningWindow(WebRtc_Word16* window, WebRtc_Word16 size);
-void WebRtcSpl_SqrtOfOneMinusXSquared(WebRtc_Word16* in_vector,
- int vector_length,
- WebRtc_Word16* out_vector);
-// End: Signal processing operations.
-
-// Randomization functions. Implementations collected in randomization_functions.c and
-// descriptions at bottom of this file.
-WebRtc_UWord32 WebRtcSpl_IncreaseSeed(WebRtc_UWord32* seed);
-WebRtc_Word16 WebRtcSpl_RandU(WebRtc_UWord32* seed);
-WebRtc_Word16 WebRtcSpl_RandN(WebRtc_UWord32* seed);
-WebRtc_Word16 WebRtcSpl_RandUArray(WebRtc_Word16* vector,
- WebRtc_Word16 vector_length,
- WebRtc_UWord32* seed);
-// End: Randomization functions.
-
-// Math functions
-WebRtc_Word32 WebRtcSpl_Sqrt(WebRtc_Word32 value);
-WebRtc_Word32 WebRtcSpl_SqrtFloor(WebRtc_Word32 value);
-
-// Divisions. Implementations collected in division_operations.c and
-// descriptions at bottom of this file.
-WebRtc_UWord32 WebRtcSpl_DivU32U16(WebRtc_UWord32 num, WebRtc_UWord16 den);
-WebRtc_Word32 WebRtcSpl_DivW32W16(WebRtc_Word32 num, WebRtc_Word16 den);
-WebRtc_Word16 WebRtcSpl_DivW32W16ResW16(WebRtc_Word32 num, WebRtc_Word16 den);
-WebRtc_Word32 WebRtcSpl_DivResultInQ31(WebRtc_Word32 num, WebRtc_Word32 den);
-WebRtc_Word32 WebRtcSpl_DivW32HiLow(WebRtc_Word32 num, WebRtc_Word16 den_hi,
- WebRtc_Word16 den_low);
-// End: Divisions.
-
-WebRtc_Word32 WebRtcSpl_Energy(WebRtc_Word16* vector,
- int vector_length,
- int* scale_factor);
-
-WebRtc_Word32 WebRtcSpl_DotProductWithScale(WebRtc_Word16* vector1,
- WebRtc_Word16* vector2,
- int vector_length,
- int scaling);
-
-// Filter operations.
-int WebRtcSpl_FilterAR(G_CONST WebRtc_Word16* ar_coef, int ar_coef_length,
- G_CONST WebRtc_Word16* in_vector, int in_vector_length,
- WebRtc_Word16* filter_state, int filter_state_length,
- WebRtc_Word16* filter_state_low,
- int filter_state_low_length, WebRtc_Word16* out_vector,
- WebRtc_Word16* out_vector_low, int out_vector_low_length);
-
-void WebRtcSpl_FilterMAFastQ12(WebRtc_Word16* in_vector,
- WebRtc_Word16* out_vector,
- WebRtc_Word16* ma_coef,
- WebRtc_Word16 ma_coef_length,
- WebRtc_Word16 vector_length);
-void WebRtcSpl_FilterARFastQ12(WebRtc_Word16* in_vector,
- WebRtc_Word16* out_vector,
- WebRtc_Word16* ar_coef,
- WebRtc_Word16 ar_coef_length,
- WebRtc_Word16 vector_length);
-int WebRtcSpl_DownsampleFast(WebRtc_Word16* in_vector,
- WebRtc_Word16 in_vector_length,
- WebRtc_Word16* out_vector,
- WebRtc_Word16 out_vector_length,
- WebRtc_Word16* ma_coef,
- WebRtc_Word16 ma_coef_length,
- WebRtc_Word16 factor,
- WebRtc_Word16 delay);
-// End: Filter operations.
-
-// FFT operations
-int WebRtcSpl_ComplexFFT(WebRtc_Word16 vector[], int stages, int mode);
-int WebRtcSpl_ComplexIFFT(WebRtc_Word16 vector[], int stages, int mode);
-#if (defined ARM9E_GCC) || (defined ARM_WINM) || (defined ANDROID_AECOPT)
-int WebRtcSpl_ComplexFFT2(WebRtc_Word16 in_vector[],
- WebRtc_Word16 out_vector[],
- int stages, int mode);
-int WebRtcSpl_ComplexIFFT2(WebRtc_Word16 in_vector[],
- WebRtc_Word16 out_vector[],
- int stages, int mode);
-#endif
-void WebRtcSpl_ComplexBitReverse(WebRtc_Word16 vector[], int stages);
-// End: FFT operations
-
-/************************************************************
- *
- * RESAMPLING FUNCTIONS AND THEIR STRUCTS ARE DEFINED BELOW
- *
- ************************************************************/
-
-/*******************************************************************
- * resample.c
- *
- * Includes the following resampling combinations
- * 22 kHz -> 16 kHz
- * 16 kHz -> 22 kHz
- * 22 kHz -> 8 kHz
- * 8 kHz -> 22 kHz
- *
- ******************************************************************/
-
-// state structure for 22 -> 16 resampler
-typedef struct
-{
- WebRtc_Word32 S_22_44[8];
- WebRtc_Word32 S_44_32[8];
- WebRtc_Word32 S_32_16[8];
-} WebRtcSpl_State22khzTo16khz;
-
-void WebRtcSpl_Resample22khzTo16khz(const WebRtc_Word16* in,
- WebRtc_Word16* out,
- WebRtcSpl_State22khzTo16khz* state,
- WebRtc_Word32* tmpmem);
-
-void WebRtcSpl_ResetResample22khzTo16khz(WebRtcSpl_State22khzTo16khz* state);
-
-// state structure for 16 -> 22 resampler
-typedef struct
-{
- WebRtc_Word32 S_16_32[8];
- WebRtc_Word32 S_32_22[8];
-} WebRtcSpl_State16khzTo22khz;
-
-void WebRtcSpl_Resample16khzTo22khz(const WebRtc_Word16* in,
- WebRtc_Word16* out,
- WebRtcSpl_State16khzTo22khz* state,
- WebRtc_Word32* tmpmem);
-
-void WebRtcSpl_ResetResample16khzTo22khz(WebRtcSpl_State16khzTo22khz* state);
-
-// state structure for 22 -> 8 resampler
-typedef struct
-{
- WebRtc_Word32 S_22_22[16];
- WebRtc_Word32 S_22_16[8];
- WebRtc_Word32 S_16_8[8];
-} WebRtcSpl_State22khzTo8khz;
-
-void WebRtcSpl_Resample22khzTo8khz(const WebRtc_Word16* in, WebRtc_Word16* out,
- WebRtcSpl_State22khzTo8khz* state,
- WebRtc_Word32* tmpmem);
-
-void WebRtcSpl_ResetResample22khzTo8khz(WebRtcSpl_State22khzTo8khz* state);
-
-// state structure for 8 -> 22 resampler
-typedef struct
-{
- WebRtc_Word32 S_8_16[8];
- WebRtc_Word32 S_16_11[8];
- WebRtc_Word32 S_11_22[8];
-} WebRtcSpl_State8khzTo22khz;
-
-void WebRtcSpl_Resample8khzTo22khz(const WebRtc_Word16* in, WebRtc_Word16* out,
- WebRtcSpl_State8khzTo22khz* state,
- WebRtc_Word32* tmpmem);
-
-void WebRtcSpl_ResetResample8khzTo22khz(WebRtcSpl_State8khzTo22khz* state);
-
-/*******************************************************************
- * resample_fractional.c
- * Functions for internal use in the other resample functions
- *
- * Includes the following resampling combinations
- * 48 kHz -> 32 kHz
- * 32 kHz -> 24 kHz
- * 44 kHz -> 32 kHz
- *
- ******************************************************************/
-
-void WebRtcSpl_Resample48khzTo32khz(const WebRtc_Word32* In, WebRtc_Word32* Out,
- const WebRtc_Word32 K);
-
-void WebRtcSpl_Resample32khzTo24khz(const WebRtc_Word32* In, WebRtc_Word32* Out,
- const WebRtc_Word32 K);
-
-void WebRtcSpl_Resample44khzTo32khz(const WebRtc_Word32* In, WebRtc_Word32* Out,
- const WebRtc_Word32 K);
-
-/*******************************************************************
- * resample_48khz.c
- *
- * Includes the following resampling combinations
- * 48 kHz -> 16 kHz
- * 16 kHz -> 48 kHz
- * 48 kHz -> 8 kHz
- * 8 kHz -> 48 kHz
- *
- ******************************************************************/
-
-typedef struct
-{
- WebRtc_Word32 S_48_48[16];
- WebRtc_Word32 S_48_32[8];
- WebRtc_Word32 S_32_16[8];
-} WebRtcSpl_State48khzTo16khz;
-
-void WebRtcSpl_Resample48khzTo16khz(const WebRtc_Word16* in, WebRtc_Word16* out,
- WebRtcSpl_State48khzTo16khz* state,
- WebRtc_Word32* tmpmem);
-
-void WebRtcSpl_ResetResample48khzTo16khz(WebRtcSpl_State48khzTo16khz* state);
-
-typedef struct
-{
- WebRtc_Word32 S_16_32[8];
- WebRtc_Word32 S_32_24[8];
- WebRtc_Word32 S_24_48[8];
-} WebRtcSpl_State16khzTo48khz;
-
-void WebRtcSpl_Resample16khzTo48khz(const WebRtc_Word16* in, WebRtc_Word16* out,
- WebRtcSpl_State16khzTo48khz* state,
- WebRtc_Word32* tmpmem);
-
-void WebRtcSpl_ResetResample16khzTo48khz(WebRtcSpl_State16khzTo48khz* state);
-
-typedef struct
-{
- WebRtc_Word32 S_48_24[8];
- WebRtc_Word32 S_24_24[16];
- WebRtc_Word32 S_24_16[8];
- WebRtc_Word32 S_16_8[8];
-} WebRtcSpl_State48khzTo8khz;
-
-void WebRtcSpl_Resample48khzTo8khz(const WebRtc_Word16* in, WebRtc_Word16* out,
- WebRtcSpl_State48khzTo8khz* state,
- WebRtc_Word32* tmpmem);
-
-void WebRtcSpl_ResetResample48khzTo8khz(WebRtcSpl_State48khzTo8khz* state);
-
-typedef struct
-{
- WebRtc_Word32 S_8_16[8];
- WebRtc_Word32 S_16_12[8];
- WebRtc_Word32 S_12_24[8];
- WebRtc_Word32 S_24_48[8];
-} WebRtcSpl_State8khzTo48khz;
-
-void WebRtcSpl_Resample8khzTo48khz(const WebRtc_Word16* in, WebRtc_Word16* out,
- WebRtcSpl_State8khzTo48khz* state,
- WebRtc_Word32* tmpmem);
-
-void WebRtcSpl_ResetResample8khzTo48khz(WebRtcSpl_State8khzTo48khz* state);
-
-/*******************************************************************
- * resample_by_2.c
- *
- * Includes down and up sampling by a factor of two.
- *
- ******************************************************************/
-
-void WebRtcSpl_DownsampleBy2(const WebRtc_Word16* in, const WebRtc_Word16 len,
- WebRtc_Word16* out, WebRtc_Word32* filtState);
-
-void WebRtcSpl_UpsampleBy2(const WebRtc_Word16* in, WebRtc_Word16 len, WebRtc_Word16* out,
- WebRtc_Word32* filtState);
-
-/************************************************************
- * END OF RESAMPLING FUNCTIONS
- ************************************************************/
-void WebRtcSpl_AnalysisQMF(const WebRtc_Word16* in_data,
- WebRtc_Word16* low_band,
- WebRtc_Word16* high_band,
- WebRtc_Word32* filter_state1,
- WebRtc_Word32* filter_state2);
-void WebRtcSpl_SynthesisQMF(const WebRtc_Word16* low_band,
- const WebRtc_Word16* high_band,
- WebRtc_Word16* out_data,
- WebRtc_Word32* filter_state1,
- WebRtc_Word32* filter_state2);
-
-#ifdef __cplusplus
-}
-#endif // __cplusplus
-#endif // WEBRTC_SPL_SIGNAL_PROCESSING_LIBRARY_H_
-
-//
-// WebRtcSpl_AddSatW16(...)
-// WebRtcSpl_AddSatW32(...)
-//
-// Returns the result of a saturated 16-bit, respectively 32-bit, addition of
-// the numbers specified by the |var1| and |var2| parameters.
-//
-// Input:
-// - var1 : Input variable 1
-// - var2 : Input variable 2
-//
-// Return value : Added and saturated value
-//
-
-//
-// WebRtcSpl_SubSatW16(...)
-// WebRtcSpl_SubSatW32(...)
-//
-// Returns the result of a saturated 16-bit, respectively 32-bit, subtraction
-// of the numbers specified by the |var1| and |var2| parameters.
-//
-// Input:
-// - var1 : Input variable 1
-// - var2 : Input variable 2
-//
-// Returned value : Subtracted and saturated value
-//
-
-//
-// WebRtcSpl_GetSizeInBits(...)
-//
-// Returns the # of bits that are needed at the most to represent the number
-// specified by the |value| parameter.
-//
-// Input:
-// - value : Input value
-//
-// Return value : Number of bits needed to represent |value|
-//
-
-//
-// WebRtcSpl_NormW32(...)
-//
-// Norm returns the # of left shifts required to 32-bit normalize the 32-bit
-// signed number specified by the |value| parameter.
-//
-// Input:
-// - value : Input value
-//
-// Return value : Number of bit shifts needed to 32-bit normalize |value|
-//
-
-//
-// WebRtcSpl_NormW16(...)
-//
-// Norm returns the # of left shifts required to 16-bit normalize the 16-bit
-// signed number specified by the |value| parameter.
-//
-// Input:
-// - value : Input value
-//
-// Return value : Number of bit shifts needed to 32-bit normalize |value|
-//
-
-//
-// WebRtcSpl_NormU32(...)
-//
-// Norm returns the # of left shifts required to 32-bit normalize the unsigned
-// 32-bit number specified by the |value| parameter.
-//
-// Input:
-// - value : Input value
-//
-// Return value : Number of bit shifts needed to 32-bit normalize |value|
-//
-
-//
-// WebRtcSpl_GetScalingSquare(...)
-//
-// Returns the # of bits required to scale the samples specified in the
-// |in_vector| parameter so that, if the squares of the samples are added the
-// # of times specified by the |times| parameter, the 32-bit addition will not
-// overflow (result in WebRtc_Word32).
-//
-// Input:
-// - in_vector : Input vector to check scaling on
-// - in_vector_length : Samples in |in_vector|
-// - times : Number of additions to be performed
-//
-// Return value : Number of right bit shifts needed to avoid
-// overflow in the addition calculation
-//
-
-//
-// WebRtcSpl_MemSetW16(...)
-//
-// Sets all the values in the WebRtc_Word16 vector |vector| of length
-// |vector_length| to the specified value |set_value|
-//
-// Input:
-// - vector : Pointer to the WebRtc_Word16 vector
-// - set_value : Value specified
-// - vector_length : Length of vector
-//
-
-//
-// WebRtcSpl_MemSetW32(...)
-//
-// Sets all the values in the WebRtc_Word32 vector |vector| of length
-// |vector_length| to the specified value |set_value|
-//
-// Input:
-// - vector : Pointer to the WebRtc_Word16 vector
-// - set_value : Value specified
-// - vector_length : Length of vector
-//
-
-//
-// WebRtcSpl_MemCpyReversedOrder(...)
-//
-// Copies all the values from the source WebRtc_Word16 vector |in_vector| to a
-// destination WebRtc_Word16 vector |out_vector|. It is done in reversed order,
-// meaning that the first sample of |in_vector| is copied to the last sample of
-// the |out_vector|. The procedure continues until the last sample of
-// |in_vector| has been copied to the first sample of |out_vector|. This
-// creates a reversed vector. Used in e.g. prediction in iLBC.
-//
-// Input:
-// - in_vector : Pointer to the first sample in a WebRtc_Word16 vector
-// of length |length|
-// - vector_length : Number of elements to copy
-//
-// Output:
-// - out_vector : Pointer to the last sample in a WebRtc_Word16 vector
-// of length |length|
-//
-
-//
-// WebRtcSpl_CopyFromEndW16(...)
-//
-// Copies the rightmost |samples| of |in_vector| (of length |in_vector_length|)
-// to the vector |out_vector|.
-//
-// Input:
-// - in_vector : Input vector
-// - in_vector_length : Number of samples in |in_vector|
-// - samples : Number of samples to extract (from right side)
-// from |in_vector|
-//
-// Output:
-// - out_vector : Vector with the requested samples
-//
-// Return value : Number of copied samples in |out_vector|
-//
-
-//
-// WebRtcSpl_ZerosArrayW16(...)
-// WebRtcSpl_ZerosArrayW32(...)
-//
-// Inserts the value "zero" in all positions of a w16 and a w32 vector
-// respectively.
-//
-// Input:
-// - vector_length : Number of samples in vector
-//
-// Output:
-// - vector : Vector containing all zeros
-//
-// Return value : Number of samples in vector
-//
-
-//
-// WebRtcSpl_OnesArrayW16(...)
-// WebRtcSpl_OnesArrayW32(...)
-//
-// Inserts the value "one" in all positions of a w16 and a w32 vector
-// respectively.
-//
-// Input:
-// - vector_length : Number of samples in vector
-//
-// Output:
-// - vector : Vector containing all ones
-//
-// Return value : Number of samples in vector
-//
-
-//
-// WebRtcSpl_MinValueW16(...)
-// WebRtcSpl_MinValueW32(...)
-//
-// Returns the minimum value of a vector
-//
-// Input:
-// - vector : Input vector
-// - vector_length : Number of samples in vector
-//
-// Return value : Minimum sample value in vector
-//
-
-//
-// WebRtcSpl_MaxValueW16(...)
-// WebRtcSpl_MaxValueW32(...)
-//
-// Returns the maximum value of a vector
-//
-// Input:
-// - vector : Input vector
-// - vector_length : Number of samples in vector
-//
-// Return value : Maximum sample value in vector
-//
-
-//
-// WebRtcSpl_MaxAbsValueW16(...)
-// WebRtcSpl_MaxAbsValueW32(...)
-//
-// Returns the largest absolute value of a vector
-//
-// Input:
-// - vector : Input vector
-// - vector_length : Number of samples in vector
-//
-// Return value : Maximum absolute value in vector
-//
-
-//
-// WebRtcSpl_MaxAbsIndexW16(...)
-//
-// Returns the vector index to the largest absolute value of a vector
-//
-// Input:
-// - vector : Input vector
-// - vector_length : Number of samples in vector
-//
-// Return value : Index to maximum absolute value in vector
-//
-
-//
-// WebRtcSpl_MinIndexW16(...)
-// WebRtcSpl_MinIndexW32(...)
-//
-// Returns the vector index to the minimum sample value of a vector
-//
-// Input:
-// - vector : Input vector
-// - vector_length : Number of samples in vector
-//
-// Return value : Index to minimum sample value in vector
-//
-
-//
-// WebRtcSpl_MaxIndexW16(...)
-// WebRtcSpl_MaxIndexW32(...)
-//
-// Returns the vector index to the maximum sample value of a vector
-//
-// Input:
-// - vector : Input vector
-// - vector_length : Number of samples in vector
-//
-// Return value : Index to maximum sample value in vector
-//
-
-//
-// WebRtcSpl_VectorBitShiftW16(...)
-// WebRtcSpl_VectorBitShiftW32(...)
-//
-// Bit shifts all the values in a vector up or downwards. Different calls for
-// WebRtc_Word16 and WebRtc_Word32 vectors respectively.
-//
-// Input:
-// - vector_length : Length of vector
-// - in_vector : Pointer to the vector that should be bit shifted
-// - right_shifts : Number of right bit shifts (negative value gives left
-// shifts)
-//
-// Output:
-// - out_vector : Pointer to the result vector (can be the same as
-// |in_vector|)
-//
-
-//
-// WebRtcSpl_VectorBitShiftW32ToW16(...)
-//
-// Bit shifts all the values in a WebRtc_Word32 vector up or downwards and
-// stores the result as a WebRtc_Word16 vector
-//
-// Input:
-// - vector_length : Length of vector
-// - in_vector : Pointer to the vector that should be bit shifted
-// - right_shifts : Number of right bit shifts (negative value gives left
-// shifts)
-//
-// Output:
-// - out_vector : Pointer to the result vector (can be the same as
-// |in_vector|)
-//
-
-//
-// WebRtcSpl_ScaleVector(...)
-//
-// Performs the vector operation:
-// out_vector[k] = (gain*in_vector[k])>>right_shifts
-//
-// Input:
-// - in_vector : Input vector
-// - gain : Scaling gain
-// - vector_length : Elements in the |in_vector|
-// - right_shifts : Number of right bit shifts applied
-//
-// Output:
-// - out_vector : Output vector (can be the same as |in_vector|)
-//
-
-//
-// WebRtcSpl_ScaleVectorWithSat(...)
-//
-// Performs the vector operation:
-// out_vector[k] = SATURATE( (gain*in_vector[k])>>right_shifts )
-//
-// Input:
-// - in_vector : Input vector
-// - gain : Scaling gain
-// - vector_length : Elements in the |in_vector|
-// - right_shifts : Number of right bit shifts applied
-//
-// Output:
-// - out_vector : Output vector (can be the same as |in_vector|)
-//
-
-//
-// WebRtcSpl_ScaleAndAddVectors(...)
-//
-// Performs the vector operation:
-// out_vector[k] = (gain1*in_vector1[k])>>right_shifts1
-// + (gain2*in_vector2[k])>>right_shifts2
-//
-// Input:
-// - in_vector1 : Input vector 1
-// - gain1 : Gain to be used for vector 1
-// - right_shifts1 : Right bit shift to be used for vector 1
-// - in_vector2 : Input vector 2
-// - gain2 : Gain to be used for vector 2
-// - right_shifts2 : Right bit shift to be used for vector 2
-// - vector_length : Elements in the input vectors
-//
-// Output:
-// - out_vector : Output vector
-//
-
-//
-// WebRtcSpl_ScaleAndAddVectorsWithRound(...)
-//
-// Performs the vector operation:
-//
-// out_vector[k] = ((scale1*in_vector1[k]) + (scale2*in_vector2[k])
-// + round_value) >> right_shifts
-//
-// where:
-//
-// round_value = (1<<right_shifts)>>1
-//
-// Input:
-// - in_vector1 : Input vector 1
-// - scale1 : Gain to be used for vector 1
-// - in_vector2 : Input vector 2
-// - scale2 : Gain to be used for vector 2
-// - right_shifts : Number of right bit shifts to be applied
-// - vector_length : Number of elements in the input vectors
-//
-// Output:
-// - out_vector : Output vector
-//
-
-//
-// WebRtcSpl_ReverseOrderMultArrayElements(...)
-//
-// Performs the vector operation:
-// out_vector[n] = (in_vector[n]*window[-n])>>right_shifts
-//
-// Input:
-// - in_vector : Input vector
-// - window : Window vector (should be reversed). The pointer
-// should be set to the last value in the vector
-// - right_shifts : Number of right bit shift to be applied after the
-// multiplication
-// - vector_length : Number of elements in |in_vector|
-//
-// Output:
-// - out_vector : Output vector (can be same as |in_vector|)
-//
-
-//
-// WebRtcSpl_ElementwiseVectorMult(...)
-//
-// Performs the vector operation:
-// out_vector[n] = (in_vector[n]*window[n])>>right_shifts
-//
-// Input:
-// - in_vector : Input vector
-// - window : Window vector.
-// - right_shifts : Number of right bit shift to be applied after the
-// multiplication
-// - vector_length : Number of elements in |in_vector|
-//
-// Output:
-// - out_vector : Output vector (can be same as |in_vector|)
-//
-
-//
-// WebRtcSpl_AddVectorsAndShift(...)
-//
-// Performs the vector operation:
-// out_vector[k] = (in_vector1[k] + in_vector2[k])>>right_shifts
-//
-// Input:
-// - in_vector1 : Input vector 1
-// - in_vector2 : Input vector 2
-// - right_shifts : Number of right bit shift to be applied after the
-// multiplication
-// - vector_length : Number of elements in |in_vector1| and |in_vector2|
-//
-// Output:
-// - out_vector : Output vector (can be same as |in_vector1|)
-//
-
-//
-// WebRtcSpl_AddAffineVectorToVector(...)
-//
-// Adds an affine transformed vector to another vector |out_vector|, i.e,
-// performs
-// out_vector[k] += (in_vector[k]*gain+add_constant)>>right_shifts
-//
-// Input:
-// - in_vector : Input vector
-// - gain : Gain value, used to multiply the in vector with
-// - add_constant : Constant value to add (usually 1<<(right_shifts-1),
-// but others can be used as well
-// - right_shifts : Number of right bit shifts (0-16)
-// - vector_length : Number of samples in |in_vector| and |out_vector|
-//
-// Output:
-// - out_vector : Vector with the output
-//
-
-//
-// WebRtcSpl_AffineTransformVector(...)
-//
-// Affine transforms a vector, i.e, performs
-// out_vector[k] = (in_vector[k]*gain+add_constant)>>right_shifts
-//
-// Input:
-// - in_vector : Input vector
-// - gain : Gain value, used to multiply the in vector with
-// - add_constant : Constant value to add (usually 1<<(right_shifts-1),
-// but others can be used as well
-// - right_shifts : Number of right bit shifts (0-16)
-// - vector_length : Number of samples in |in_vector| and |out_vector|
-//
-// Output:
-// - out_vector : Vector with the output
-//
-
-//
-// WebRtcSpl_AutoCorrelation(...)
-//
-// A 32-bit fix-point implementation of auto-correlation computation
-//
-// Input:
-// - vector : Vector to calculate autocorrelation upon
-// - vector_length : Length (in samples) of |vector|
-// - order : The order up to which the autocorrelation should be
-// calculated
-//
-// Output:
-// - result_vector : auto-correlation values (values should be seen
-// relative to each other since the absolute values
-// might have been down shifted to avoid overflow)
-//
-// - scale : The number of left shifts required to obtain the
-// auto-correlation in Q0
-//
-// Return value : Number of samples in |result_vector|, i.e., (order+1)
-//
-
-//
-// WebRtcSpl_LevinsonDurbin(...)
-//
-// A 32-bit fix-point implementation of the Levinson-Durbin algorithm that
-// does NOT use the 64 bit class
-//
-// Input:
-// - auto_corr : Vector with autocorrelation values of length >=
-// |use_order|+1
-// - use_order : The LPC filter order (support up to order 20)
-//
-// Output:
-// - lpc_coef : lpc_coef[0..use_order] LPC coefficients in Q12
-// - refl_coef : refl_coef[0...use_order-1]| Reflection coefficients in
-// Q15
-//
-// Return value : 1 for stable 0 for unstable
-//
-
-//
-// WebRtcSpl_ReflCoefToLpc(...)
-//
-// Converts reflection coefficients |refl_coef| to LPC coefficients |lpc_coef|.
-// This version is a 16 bit operation.
-//
-// NOTE: The 16 bit refl_coef -> lpc_coef conversion might result in a
-// "slightly unstable" filter (i.e., a pole just outside the unit circle) in
-// "rare" cases even if the reflection coefficients are stable.
-//
-// Input:
-// - refl_coef : Reflection coefficients in Q15 that should be converted
-// to LPC coefficients
-// - use_order : Number of coefficients in |refl_coef|
-//
-// Output:
-// - lpc_coef : LPC coefficients in Q12
-//
-
-//
-// WebRtcSpl_LpcToReflCoef(...)
-//
-// Converts LPC coefficients |lpc_coef| to reflection coefficients |refl_coef|.
-// This version is a 16 bit operation.
-// The conversion is implemented by the step-down algorithm.
-//
-// Input:
-// - lpc_coef : LPC coefficients in Q12, that should be converted to
-// reflection coefficients
-// - use_order : Number of coefficients in |lpc_coef|
-//
-// Output:
-// - refl_coef : Reflection coefficients in Q15.
-//
-
-//
-// WebRtcSpl_AutoCorrToReflCoef(...)
-//
-// Calculates reflection coefficients (16 bit) from auto-correlation values
-//
-// Input:
-// - auto_corr : Auto-correlation values
-// - use_order : Number of coefficients wanted be calculated
-//
-// Output:
-// - refl_coef : Reflection coefficients in Q15.
-//
-
-//
-// WebRtcSpl_CrossCorrelation(...)
-//
-// Calculates the cross-correlation between two sequences |vector1| and
-// |vector2|. |vector1| is fixed and |vector2| slides as the pointer is
-// increased with the amount |step_vector2|
-//
-// Input:
-// - vector1 : First sequence (fixed throughout the correlation)
-// - vector2 : Second sequence (slides |step_vector2| for each
-// new correlation)
-// - dim_vector : Number of samples to use in the cross-correlation
-// - dim_cross_corr : Number of cross-correlations to calculate (the
-// start position for |vector2| is updated for each
-// new one)
-// - right_shifts : Number of right bit shifts to use. This will
-// become the output Q-domain.
-// - step_vector2 : How many (positive or negative) steps the
-// |vector2| pointer should be updated for each new
-// cross-correlation value.
-//
-// Output:
-// - cross_corr : The cross-correlation in Q(-right_shifts)
-//
-
-//
-// WebRtcSpl_GetHanningWindow(...)
-//
-// Creates (the first half of) a Hanning window. Size must be at least 1 and
-// at most 512.
-//
-// Input:
-// - size : Length of the requested Hanning window (1 to 512)
-//
-// Output:
-// - window : Hanning vector in Q14.
-//
-
-//
-// WebRtcSpl_SqrtOfOneMinusXSquared(...)
-//
-// Calculates y[k] = sqrt(1 - x[k]^2) for each element of the input vector
-// |in_vector|. Input and output values are in Q15.
-//
-// Inputs:
-// - in_vector : Values to calculate sqrt(1 - x^2) of
-// - vector_length : Length of vector |in_vector|
-//
-// Output:
-// - out_vector : Output values in Q15
-//
-
-//
-// WebRtcSpl_IncreaseSeed(...)
-//
-// Increases the seed (and returns the new value)
-//
-// Input:
-// - seed : Seed for random calculation
-//
-// Output:
-// - seed : Updated seed value
-//
-// Return value : The new seed value
-//
-
-//
-// WebRtcSpl_RandU(...)
-//
-// Produces a uniformly distributed value in the WebRtc_Word16 range
-//
-// Input:
-// - seed : Seed for random calculation
-//
-// Output:
-// - seed : Updated seed value
-//
-// Return value : Uniformly distributed value in the range
-// [Word16_MIN...Word16_MAX]
-//
-
-//
-// WebRtcSpl_RandN(...)
-//
-// Produces a normal distributed value in the WebRtc_Word16 range
-//
-// Input:
-// - seed : Seed for random calculation
-//
-// Output:
-// - seed : Updated seed value
-//
-// Return value : N(0,1) value in the Q13 domain
-//
-
-//
-// WebRtcSpl_RandUArray(...)
-//
-// Produces a uniformly distributed vector with elements in the WebRtc_Word16
-// range
-//
-// Input:
-// - vector_length : Samples wanted in the vector
-// - seed : Seed for random calculation
-//
-// Output:
-// - vector : Vector with the uniform values
-// - seed : Updated seed value
-//
-// Return value : Number of samples in vector, i.e., |vector_length|
-//
-
-//
-// WebRtcSpl_Sqrt(...)
-//
-// Returns the square root of the input value |value|. The precision of this
-// function is integer precision, i.e., sqrt(8) gives 2 as answer.
-// If |value| is a negative number then 0 is returned.
-//
-// Algorithm:
-//
-// A sixth order Taylor Series expansion is used here to compute the square
-// root of a number y^0.5 = (1+x)^0.5
-// where
-// x = y-1
-// = 1+(x/2)-0.5*((x/2)^2+0.5*((x/2)^3-0.625*((x/2)^4+0.875*((x/2)^5)
-// 0.5 <= x < 1
-//
-// Input:
-// - value : Value to calculate sqrt of
-//
-// Return value : Result of the sqrt calculation
-//
-
-//
-// WebRtcSpl_SqrtFloor(...)
-//
-// Returns the square root of the input value |value|. The precision of this
-// function is rounding down integer precision, i.e., sqrt(8) gives 2 as answer.
-// If |value| is a negative number then 0 is returned.
-//
-// Algorithm:
-//
-// An iterative 4 cylce/bit routine
-//
-// Input:
-// - value : Value to calculate sqrt of
-//
-// Return value : Result of the sqrt calculation
-//
-
-//
-// WebRtcSpl_DivU32U16(...)
-//
-// Divides a WebRtc_UWord32 |num| by a WebRtc_UWord16 |den|.
-//
-// If |den|==0, (WebRtc_UWord32)0xFFFFFFFF is returned.
-//
-// Input:
-// - num : Numerator
-// - den : Denominator
-//
-// Return value : Result of the division (as a WebRtc_UWord32), i.e., the
-// integer part of num/den.
-//
-
-//
-// WebRtcSpl_DivW32W16(...)
-//
-// Divides a WebRtc_Word32 |num| by a WebRtc_Word16 |den|.
-//
-// If |den|==0, (WebRtc_Word32)0x7FFFFFFF is returned.
-//
-// Input:
-// - num : Numerator
-// - den : Denominator
-//
-// Return value : Result of the division (as a WebRtc_Word32), i.e., the
-// integer part of num/den.
-//
-
-//
-// WebRtcSpl_DivW32W16ResW16(...)
-//
-// Divides a WebRtc_Word32 |num| by a WebRtc_Word16 |den|, assuming that the
-// result is less than 32768, otherwise an unpredictable result will occur.
-//
-// If |den|==0, (WebRtc_Word16)0x7FFF is returned.
-//
-// Input:
-// - num : Numerator
-// - den : Denominator
-//
-// Return value : Result of the division (as a WebRtc_Word16), i.e., the
-// integer part of num/den.
-//
-
-//
-// WebRtcSpl_DivResultInQ31(...)
-//
-// Divides a WebRtc_Word32 |num| by a WebRtc_Word16 |den|, assuming that the
-// absolute value of the denominator is larger than the numerator, otherwise
-// an unpredictable result will occur.
-//
-// Input:
-// - num : Numerator
-// - den : Denominator
-//
-// Return value : Result of the division in Q31.
-//
-
-//
-// WebRtcSpl_DivW32HiLow(...)
-//
-// Divides a WebRtc_Word32 |num| by a denominator in hi, low format. The
-// absolute value of the denominator has to be larger (or equal to) the
-// numerator.
-//
-// Input:
-// - num : Numerator
-// - den_hi : High part of denominator
-// - den_low : Low part of denominator
-//
-// Return value : Divided value in Q31
-//
-
-//
-// WebRtcSpl_Energy(...)
-//
-// Calculates the energy of a vector
-//
-// Input:
-// - vector : Vector which the energy should be calculated on
-// - vector_length : Number of samples in vector
-//
-// Output:
-// - scale_factor : Number of left bit shifts needed to get the physical
-// energy value, i.e, to get the Q0 value
-//
-// Return value : Energy value in Q(-|scale_factor|)
-//
-
-//
-// WebRtcSpl_FilterAR(...)
-//
-// Performs a 32-bit AR filtering on a vector in Q12
-//
-// Input:
-// - ar_coef : AR-coefficient vector (values in Q12),
-// ar_coef[0] must be 4096.
-// - ar_coef_length : Number of coefficients in |ar_coef|.
-// - in_vector : Vector to be filtered.
-// - in_vector_length : Number of samples in |in_vector|.
-// - filter_state : Current state (higher part) of the filter.
-// - filter_state_length : Length (in samples) of |filter_state|.
-// - filter_state_low : Current state (lower part) of the filter.
-// - filter_state_low_length : Length (in samples) of |filter_state_low|.
-// - out_vector_low_length : Maximum length (in samples) of
-// |out_vector_low|.
-//
-// Output:
-// - filter_state : Updated state (upper part) vector.
-// - filter_state_low : Updated state (lower part) vector.
-// - out_vector : Vector containing the upper part of the
-// filtered values.
-// - out_vector_low : Vector containing the lower part of the
-// filtered values.
-//
-// Return value : Number of samples in the |out_vector|.
-//
-
-//
-// WebRtcSpl_FilterMAFastQ12(...)
-//
-// Performs a MA filtering on a vector in Q12
-//
-// Input:
-// - in_vector : Input samples (state in positions
-// in_vector[-order] .. in_vector[-1])
-// - ma_coef : Filter coefficients (in Q12)
-// - ma_coef_length : Number of B coefficients (order+1)
-// - vector_length : Number of samples to be filtered
-//
-// Output:
-// - out_vector : Filtered samples
-//
-
-//
-// WebRtcSpl_FilterARFastQ12(...)
-//
-// Performs a AR filtering on a vector in Q12
-//
-// Input:
-// - in_vector : Input samples
-// - out_vector : State information in positions
-// out_vector[-order] .. out_vector[-1]
-// - ar_coef : Filter coefficients (in Q12)
-// - ar_coef_length : Number of B coefficients (order+1)
-// - vector_length : Number of samples to be filtered
-//
-// Output:
-// - out_vector : Filtered samples
-//
-
-//
-// WebRtcSpl_DownsampleFast(...)
-//
-// Performs a MA down sampling filter on a vector
-//
-// Input:
-// - in_vector : Input samples (state in positions
-// in_vector[-order] .. in_vector[-1])
-// - in_vector_length : Number of samples in |in_vector| to be filtered.
-// This must be at least
-// |delay| + |factor|*(|out_vector_length|-1) + 1)
-// - out_vector_length : Number of down sampled samples desired
-// - ma_coef : Filter coefficients (in Q12)
-// - ma_coef_length : Number of B coefficients (order+1)
-// - factor : Decimation factor
-// - delay : Delay of filter (compensated for in out_vector)
-//
-// Output:
-// - out_vector : Filtered samples
-//
-// Return value : 0 if OK, -1 if |in_vector| is too short
-//
-
-//
-// WebRtcSpl_DotProductWithScale(...)
-//
-// Calculates the dot product between two (WebRtc_Word16) vectors
-//
-// Input:
-// - vector1 : Vector 1
-// - vector2 : Vector 2
-// - vector_length : Number of samples used in the dot product
-// - scaling : The number of right bit shifts to apply on each term
-// during calculation to avoid overflow, i.e., the
-// output will be in Q(-|scaling|)
-//
-// Return value : The dot product in Q(-scaling)
-//
-
-//
-// WebRtcSpl_ComplexIFFT(...)
-//
-// Complex Inverse FFT
-//
-// Computes an inverse complex 2^|stages|-point FFT on the input vector, which
-// is in bit-reversed order. The original content of the vector is destroyed in
-// the process, since the input is overwritten by the output, normal-ordered,
-// FFT vector. With X as the input complex vector, y as the output complex
-// vector and with M = 2^|stages|, the following is computed:
-//
-// M-1
-// y(k) = sum[X(i)*[cos(2*pi*i*k/M) + j*sin(2*pi*i*k/M)]]
-// i=0
-//
-// The implementations are optimized for speed, not for code size. It uses the
-// decimation-in-time algorithm with radix-2 butterfly technique.
-//
-// Input:
-// - vector : In pointer to complex vector containing 2^|stages|
-// real elements interleaved with 2^|stages| imaginary
-// elements.
-// [ReImReImReIm....]
-// The elements are in Q(-scale) domain, see more on Return
-// Value below.
-//
-// - stages : Number of FFT stages. Must be at least 3 and at most 10,
-// since the table WebRtcSpl_kSinTable1024[] is 1024
-// elements long.
-//
-// - mode : This parameter gives the user to choose how the FFT
-// should work.
-// mode==0: Low-complexity and Low-accuracy mode
-// mode==1: High-complexity and High-accuracy mode
-//
-// Output:
-// - vector : Out pointer to the FFT vector (the same as input).
-//
-// Return Value : The scale value that tells the number of left bit shifts
-// that the elements in the |vector| should be shifted with
-// in order to get Q0 values, i.e. the physically correct
-// values. The scale parameter is always 0 or positive,
-// except if N>1024 (|stages|>10), which returns a scale
-// value of -1, indicating error.
-//
-
-#if (defined ARM9E_GCC) || (defined ARM_WINM) || (defined ANDROID_AECOPT)
-//
-// WebRtcSpl_ComplexIFFT2(...)
-//
-// Complex or Real inverse FFT, for ARM processor only
-//
-// Computes a 2^|stages|-point FFT on the input vector, which can be or not be
-// in bit-reversed order. If it is bit-reversed, the original content of the
-// vector could be overwritten by the output by setting the first two arguments
-// the same. With X as the input complex vector, y as the output complex vector
-// and with M = 2^|stages|, the following is computed:
-//
-// M-1
-// y(k) = sum[X(i)*[cos(2*pi*i*k/M) + j*sin(2*pi*i*k/M)]]
-// i=0
-//
-// The implementations are optimized for speed, not for code size. It uses the
-// decimation-in-time algorithm with radix-2 butterfly technique.
-//
-// Arguments:
-// - in_vector : In pointer to complex vector containing 2^|stages|
-// real elements interleaved with 2^|stages| imaginary
-// elements. [ReImReImReIm....]
-// The elements are in Q(-scale) domain.
-// - out_vector : Output pointer to vector containing 2^|stages| real
-// elements interleaved with 2^|stages| imaginary
-// elements. [ReImReImReIm....]
-// The output is in the Q0 domain.
-// - stages : Number of FFT stages. Must be at least 3 and at most
-// 10.
-// - mode : Dummy input.
-//
-// Return value : The scale parameter is always 0, except if N>1024,
-// which returns a scale value of -1, indicating error.
-//
-#endif
-
-//
-// WebRtcSpl_ComplexFFT(...)
-//
-// Complex FFT
-//
-// Computes a complex 2^|stages|-point FFT on the input vector, which is in
-// bit-reversed order. The original content of the vector is destroyed in
-// the process, since the input is overwritten by the output, normal-ordered,
-// FFT vector. With x as the input complex vector, Y as the output complex
-// vector and with M = 2^|stages|, the following is computed:
-//
-// M-1
-// Y(k) = 1/M * sum[x(i)*[cos(2*pi*i*k/M) + j*sin(2*pi*i*k/M)]]
-// i=0
-//
-// The implementations are optimized for speed, not for code size. It uses the
-// decimation-in-time algorithm with radix-2 butterfly technique.
-//
-// This routine prevents overflow by scaling by 2 before each FFT stage. This is
-// a fixed scaling, for proper normalization - there will be log2(n) passes, so
-// this results in an overall factor of 1/n, distributed to maximize arithmetic
-// accuracy.
-//
-// Input:
-// - vector : In pointer to complex vector containing 2^|stages| real
-// elements interleaved with 2^|stages| imaginary elements.
-// [ReImReImReIm....]
-// The output is in the Q0 domain.
-//
-// - stages : Number of FFT stages. Must be at least 3 and at most 10,
-// since the table WebRtcSpl_kSinTable1024[] is 1024
-// elements long.
-//
-// - mode : This parameter gives the user to choose how the FFT
-// should work.
-// mode==0: Low-complexity and Low-accuracy mode
-// mode==1: High-complexity and High-accuracy mode
-//
-// Output:
-// - vector : The output FFT vector is in the Q0 domain.
-//
-// Return value : The scale parameter is always 0, except if N>1024,
-// which returns a scale value of -1, indicating error.
-//
-
-#if (defined ARM9E_GCC) || (defined ARM_WINM) || (defined ANDROID_AECOPT)
-//
-// WebRtcSpl_ComplexFFT2(...)
-//
-// Complex or Real FFT, for ARM processor only
-//
-// Computes a 2^|stages|-point FFT on the input vector, which can be or not be
-// in bit-reversed order. If it is bit-reversed, the original content of the
-// vector could be overwritten by the output by setting the first two arguments
-// the same. With x as the input complex vector, Y as the output complex vector
-// and with M = 2^|stages|, the following is computed:
-//
-// M-1
-// Y(k) = 1/M * sum[x(i)*[cos(2*pi*i*k/M) + j*sin(2*pi*i*k/M)]]
-// i=0
-//
-// The implementations are optimized for speed, not for code size. It uses the
-// decimation-in-time algorithm with radix-2 butterfly technique.
-//
-// Arguments:
-// - in_vector : In pointer to complex vector containing 2^|stages|
-// real elements interleaved with 2^|stages| imaginary
-// elements. [ReImReImReIm....]
-// - out_vector : Output pointer to vector containing 2^|stages| real
-// elements interleaved with 2^|stages| imaginary
-// elements. [ReImReImReIm....]
-// The output is in the Q0 domain.
-// - stages : Number of FFT stages. Must be at least 3 and at most
-// 10.
-// - mode : Dummy input
-//
-// Return value : The scale parameter is always 0, except if N>1024,
-// which returns a scale value of -1, indicating error.
-//
-#endif
-
-//
-// WebRtcSpl_ComplexBitReverse(...)
-//
-// Complex Bit Reverse
-//
-// This function bit-reverses the position of elements in the complex input
-// vector into the output vector.
-//
-// If you bit-reverse a linear-order array, you obtain a bit-reversed order
-// array. If you bit-reverse a bit-reversed order array, you obtain a
-// linear-order array.
-//
-// Input:
-// - vector : In pointer to complex vector containing 2^|stages| real
-// elements interleaved with 2^|stages| imaginary elements.
-// [ReImReImReIm....]
-// - stages : Number of FFT stages. Must be at least 3 and at most 10,
-// since the table WebRtcSpl_kSinTable1024[] is 1024
-// elements long.
-//
-// Output:
-// - vector : Out pointer to complex vector in bit-reversed order.
-// The input vector is over written.
-//
-
-//
-// WebRtcSpl_AnalysisQMF(...)
-//
-// Splits a 0-2*F Hz signal into two sub bands: 0-F Hz and F-2*F Hz. The
-// current version has F = 8000, therefore, a super-wideband audio signal is
-// split to lower-band 0-8 kHz and upper-band 8-16 kHz.
-//
-// Input:
-// - in_data : Wide band speech signal, 320 samples (10 ms)
-//
-// Input & Output:
-// - filter_state1 : Filter state for first All-pass filter
-// - filter_state2 : Filter state for second All-pass filter
-//
-// Output:
-// - low_band : Lower-band signal 0-8 kHz band, 160 samples (10 ms)
-// - high_band : Upper-band signal 8-16 kHz band (flipped in frequency
-// domain), 160 samples (10 ms)
-//
-
-//
-// WebRtcSpl_SynthesisQMF(...)
-//
-// Combines the two sub bands (0-F and F-2*F Hz) into a signal of 0-2*F
-// Hz, (current version has F = 8000 Hz). So the filter combines lower-band
-// (0-8 kHz) and upper-band (8-16 kHz) channels to obtain super-wideband 0-16
-// kHz audio.
-//
-// Input:
-// - low_band : The signal with the 0-8 kHz band, 160 samples (10 ms)
-// - high_band : The signal with the 8-16 kHz band, 160 samples (10 ms)
-//
-// Input & Output:
-// - filter_state1 : Filter state for first All-pass filter
-// - filter_state2 : Filter state for second All-pass filter
-//
-// Output:
-// - out_data : Super-wideband speech signal, 0-16 kHz
-//
-
-// WebRtc_Word16 WebRtcSpl_get_version(...)
-//
-// This function gives the version string of the Signal Processing Library.
-//
-// Input:
-// - length_in_bytes : The size of Allocated space (in Bytes) where
-// the version number is written to (in string format).
-//
-// Output:
-// - version : Pointer to a buffer where the version number is written to.
-//
diff --git a/src/common_audio/signal_processing_library/main/interface/spl_inl.h b/src/common_audio/signal_processing_library/main/interface/spl_inl.h
deleted file mode 100644
index 8716ca9..0000000
--- a/src/common_audio/signal_processing_library/main/interface/spl_inl.h
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-// This header file includes the inline functions in
-// the fix point signal processing library.
-
-#ifndef WEBRTC_SPL_SPL_INL_H_
-#define WEBRTC_SPL_SPL_INL_H_
-
-#ifdef WEBRTC_SPL_INLINE_CALLS
-
-#ifdef WEBRTC_ANDROID
-
-WEBRTC_INLINE WebRtc_Word32 WEBRTC_SPL_MUL(WebRtc_Word32 a, WebRtc_Word32 b)
-{
- WebRtc_Word32 tmp;
- __asm__("mul %0, %1, %2":"=r"(tmp):"r"(a), "r"(b));
- return tmp;
-}
-
-WEBRTC_INLINE WebRtc_Word32 WEBRTC_SPL_MUL_16_32_RSFT16(WebRtc_Word16 a,
- WebRtc_Word32 b)
-{
- WebRtc_Word32 tmp;
- __asm__("smulwb %0, %1, %2":"=r"(tmp):"r"(b), "r"(a));
- return tmp;
-}
-
-WEBRTC_INLINE WebRtc_Word32 WEBRTC_SPL_MUL_32_32_RSFT32(WebRtc_Word16 a,
- WebRtc_Word16 b,
- WebRtc_Word32 c)
-{
- WebRtc_Word32 tmp;
- __asm__("pkhbt %0, %1, %2, lsl #16" : "=r"(tmp) : "r"(b), "r"(a));
- __asm__("smmul %0, %1, %2":"=r"(tmp):"r"(tmp), "r"(c));
- return tmp;
-}
-
-WEBRTC_INLINE WebRtc_Word32 WEBRTC_SPL_MUL_32_32_RSFT32BI(
- WebRtc_Word32 a,
- WebRtc_Word32 b)
-{
- WebRtc_Word32 tmp;
- __asm__("smmul %0, %1, %2":"=r"(tmp):"r"(a), "r"(b));
- return tmp;
-}
-
-WEBRTC_INLINE WebRtc_Word32 WEBRTC_SPL_MUL_16_16(WebRtc_Word16 a,
- WebRtc_Word16 b)
-{
- WebRtc_Word32 tmp;
- __asm__("smulbb %0, %1, %2":"=r"(tmp):"r"(a), "r"(b));
- return tmp;
-}
-
-WEBRTC_INLINE WebRtc_Word16 WebRtcSpl_AddSatW16(WebRtc_Word16 a,
- WebRtc_Word16 b)
-{
- WebRtc_Word32 s_sum;
-
- __asm__("qadd16 %0, %1, %2":"=r"(s_sum):"r"(a), "r"(b));
-
- return (WebRtc_Word16) s_sum;
-}
-
-WEBRTC_INLINE WebRtc_Word32 WebRtcSpl_AddSatW32(WebRtc_Word32 l_var1,
- WebRtc_Word32 l_var2)
-{
- WebRtc_Word32 l_sum;
-
- __asm__("qadd %0, %1, %2":"=r"(l_sum):"r"(l_var1), "r"(l_var2));
-
- return l_sum;
-}
-
-WEBRTC_INLINE WebRtc_Word16 WebRtcSpl_SubSatW16(WebRtc_Word16 var1,
- WebRtc_Word16 var2)
-{
- WebRtc_Word32 s_sub;
-
- __asm__("qsub16 %0, %1, %2":"=r"(s_sub):"r"(var1), "r"(var2));
-
- return (WebRtc_Word16)s_sub;
-}
-
-WEBRTC_INLINE WebRtc_Word32 WebRtcSpl_SubSatW32(WebRtc_Word32 l_var1,
- WebRtc_Word32 l_var2)
-{
- WebRtc_Word32 l_sub;
-
- __asm__("qsub %0, %1, %2":"=r"(l_sub):"r"(l_var1), "r"(l_var2));
-
- return l_sub;
-}
-
-WEBRTC_INLINE WebRtc_Word16 WebRtcSpl_GetSizeInBits(WebRtc_UWord32 n)
-{
- WebRtc_Word32 tmp;
-
- __asm__("clz %0, %1":"=r"(tmp):"r"(n));
-
- return (WebRtc_Word16)(32 - tmp);
-}
-
-WEBRTC_INLINE int WebRtcSpl_NormW32(WebRtc_Word32 a)
-{
- WebRtc_Word32 tmp;
-
- if (a <= 0) a ^= 0xFFFFFFFF;
-
- __asm__("clz %0, %1":"=r"(tmp):"r"(a));
-
- return tmp - 1;
-}
-
-WEBRTC_INLINE int WebRtcSpl_NormW16(WebRtc_Word16 a)
-{
- int zeros;
-
- if (a <= 0) a ^= 0xFFFF;
-
- if (!(0xFF80 & a)) zeros = 8; else zeros = 0;
- if (!(0xF800 & (a << zeros))) zeros += 4;
- if (!(0xE000 & (a << zeros))) zeros += 2;
- if (!(0xC000 & (a << zeros))) zeros += 1;
-
- return zeros;
-}
-
-WEBRTC_INLINE int WebRtcSpl_NormU32(WebRtc_UWord32 a)
-{
- int tmp;
-
- if (a == 0) return 0;
-
- __asm__("clz %0, %1":"=r"(tmp):"r"(a));
-
- return tmp;
-}
-
-#else
-
-WEBRTC_INLINE WebRtc_Word16 WebRtcSpl_AddSatW16(WebRtc_Word16 a,
- WebRtc_Word16 b)
-{
- WebRtc_Word32 s_sum = (WebRtc_Word32) a + (WebRtc_Word32) b;
-
- if (s_sum > WEBRTC_SPL_WORD16_MAX)
- s_sum = WEBRTC_SPL_WORD16_MAX;
- else if (s_sum < WEBRTC_SPL_WORD16_MIN)
- s_sum = WEBRTC_SPL_WORD16_MIN;
-
- return (WebRtc_Word16)s_sum;
-}
-
-WEBRTC_INLINE WebRtc_Word32 WebRtcSpl_AddSatW32(WebRtc_Word32 l_var1,
- WebRtc_Word32 l_var2)
-{
- WebRtc_Word32 l_sum;
-
- // perform long addition
- l_sum = l_var1 + l_var2;
-
- // check for under or overflow
- if (WEBRTC_SPL_IS_NEG (l_var1))
- {
- if (WEBRTC_SPL_IS_NEG (l_var2) && !WEBRTC_SPL_IS_NEG (l_sum))
- {
- l_sum = (WebRtc_Word32)0x80000000;
- }
- }
- else
- {
- if (!WEBRTC_SPL_IS_NEG (l_var2) && WEBRTC_SPL_IS_NEG (l_sum))
- {
- l_sum = (WebRtc_Word32)0x7FFFFFFF;
- }
- }
-
- return l_sum;
-}
-
-WEBRTC_INLINE WebRtc_Word16 WebRtcSpl_SubSatW16( WebRtc_Word16 var1,
- WebRtc_Word16 var2)
-{
- WebRtc_Word32 l_diff;
- WebRtc_Word16 s_diff;
-
- // perform subtraction
- l_diff = (WebRtc_Word32)var1 - (WebRtc_Word32)var2;
-
- // default setting
- s_diff = (WebRtc_Word16) l_diff;
-
- // check for overflow
- if (l_diff > (WebRtc_Word32)32767)
- s_diff = (WebRtc_Word16)32767;
-
- // check for underflow
- if (l_diff < (WebRtc_Word32)-32768)
- s_diff = (WebRtc_Word16)-32768;
-
- return s_diff;
-}
-
-WEBRTC_INLINE WebRtc_Word32 WebRtcSpl_SubSatW32(WebRtc_Word32 l_var1,
- WebRtc_Word32 l_var2)
-{
- WebRtc_Word32 l_diff;
-
- // perform subtraction
- l_diff = l_var1 - l_var2;
-
- // check for underflow
- if ((l_var1 < 0) && (l_var2 > 0) && (l_diff > 0))
- l_diff = (WebRtc_Word32)0x80000000;
- // check for overflow
- if ((l_var1 > 0) && (l_var2 < 0) && (l_diff < 0))
- l_diff = (WebRtc_Word32)0x7FFFFFFF;
-
- return l_diff;
-}
-
-WEBRTC_INLINE WebRtc_Word16 WebRtcSpl_GetSizeInBits(WebRtc_UWord32 n)
-{
-
- int bits;
-
- if ((0xFFFF0000 & n)) bits = 16; else bits = 0;
- if ((0x0000FF00 & (n >> bits))) bits += 8;
- if ((0x000000F0 & (n >> bits))) bits += 4;
- if ((0x0000000C & (n >> bits))) bits += 2;
- if ((0x00000002 & (n >> bits))) bits += 1;
- if ((0x00000001 & (n >> bits))) bits += 1;
-
- return bits;
-}
-
-WEBRTC_INLINE int WebRtcSpl_NormW32(WebRtc_Word32 a)
-{
- int zeros;
-
- if (a <= 0) a ^= 0xFFFFFFFF;
-
- if (!(0xFFFF8000 & a)) zeros = 16; else zeros = 0;
- if (!(0xFF800000 & (a << zeros))) zeros += 8;
- if (!(0xF8000000 & (a << zeros))) zeros += 4;
- if (!(0xE0000000 & (a << zeros))) zeros += 2;
- if (!(0xC0000000 & (a << zeros))) zeros += 1;
-
- return zeros;
-}
-
-WEBRTC_INLINE int WebRtcSpl_NormW16(WebRtc_Word16 a)
-{
- int zeros;
-
- if (a <= 0) a ^= 0xFFFF;
-
- if (!(0xFF80 & a)) zeros = 8; else zeros = 0;
- if (!(0xF800 & (a << zeros))) zeros += 4;
- if (!(0xE000 & (a << zeros))) zeros += 2;
- if (!(0xC000 & (a << zeros))) zeros += 1;
-
- return zeros;
-}
-
-WEBRTC_INLINE int WebRtcSpl_NormU32(WebRtc_UWord32 a)
-{
- int zeros;
-
- if (a == 0) return 0;
-
- if (!(0xFFFF0000 & a)) zeros = 16; else zeros = 0;
- if (!(0xFF000000 & (a << zeros))) zeros += 8;
- if (!(0xF0000000 & (a << zeros))) zeros += 4;
- if (!(0xC0000000 & (a << zeros))) zeros += 2;
- if (!(0x80000000 & (a << zeros))) zeros += 1;
-
- return zeros;
-}
-
-#endif // WEBRTC_ANDROID
-#endif // WEBRTC_SPL_INLINE_CALLS
-#endif // WEBRTC_SPL_SPL_INL_H_
diff --git a/src/common_audio/signal_processing_library/main/source/Android.mk b/src/common_audio/signal_processing_library/main/source/Android.mk
deleted file mode 100644
index 8b08676..0000000
--- a/src/common_audio/signal_processing_library/main/source/Android.mk
+++ /dev/null
@@ -1,99 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_ARM_MODE := arm
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_MODULE := libwebrtc_spl
-LOCAL_MODULE_TAGS := optional
-LOCAL_GENERATED_SOURCES :=
-LOCAL_SRC_FILES := add_sat_w16.c \
- add_sat_w32.c \
- auto_corr_to_refl_coef.c \
- auto_correlation.c \
- complex_fft.c \
- complex_ifft.c \
- complex_bit_reverse.c \
- copy_set_operations.c \
- cos_table.c \
- cross_correlation.c \
- division_operations.c \
- dot_product_with_scale.c \
- downsample_fast.c \
- energy.c \
- filter_ar.c \
- filter_ar_fast_q12.c \
- filter_ma_fast_q12.c \
- get_hanning_window.c \
- get_scaling_square.c \
- get_size_in_bits.c \
- hanning_table.c \
- ilbc_specific_functions.c \
- levinson_durbin.c \
- lpc_to_refl_coef.c \
- min_max_operations.c \
- norm_u32.c \
- norm_w16.c \
- norm_w32.c \
- randn_table.c \
- randomization_functions.c \
- refl_coef_to_lpc.c \
- resample.c \
- resample_48khz.c \
- resample_by_2.c \
- resample_by_2_internal.c \
- resample_fractional.c \
- sin_table.c \
- sin_table_1024.c \
- spl_sqrt.c \
- spl_version.c \
- splitting_filter.c \
- sqrt_of_one_minus_x_squared.c \
- sub_sat_w16.c \
- sub_sat_w32.c \
- vector_scaling_operations.c
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS :=
-MY_CFLAGS_C :=
-MY_DEFS := '-DNO_TCMALLOC' \
- '-DNO_HEAPCHECKER' \
- '-DWEBRTC_TARGET_PC' \
- '-DWEBRTC_LINUX' \
- '-DWEBRTC_ANDROID' \
- '-DANDROID'
-LOCAL_CFLAGS := $(MY_CFLAGS_C) $(MY_CFLAGS) $(MY_DEFS)
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../.. \
- $(LOCAL_PATH)/../interface
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS :=
-
-LOCAL_LDFLAGS :=
-
-LOCAL_STATIC_LIBRARIES :=
-
-LOCAL_SHARED_LIBRARIES := libstlport
-
-LOCAL_ADDITIONAL_DEPENDENCIES :=
-
-ifeq ($(TARGET_OS)-$(TARGET_SIMULATOR),linux-true)
-LOCAL_LDLIBS += -ldl -lpthread
-endif
-
-ifneq ($(TARGET_SIMULATOR),true)
-LOCAL_SHARED_LIBRARIES += libdl
-endif
-
-include external/stlport/libstlport.mk
-include $(BUILD_STATIC_LIBRARY)
diff --git a/src/common_audio/signal_processing_library/main/source/add_sat_w16.c b/src/common_audio/signal_processing_library/main/source/add_sat_w16.c
deleted file mode 100644
index d103999..0000000
--- a/src/common_audio/signal_processing_library/main/source/add_sat_w16.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_AddSatW16().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-#ifndef SPL_NO_DOUBLE_IMPLEMENTATIONS
-
-WebRtc_Word16 WebRtcSpl_AddSatW16(WebRtc_Word16 var1, WebRtc_Word16 var2)
-{
- WebRtc_Word32 s_sum = (WebRtc_Word32)var1 + (WebRtc_Word32)var2;
-
- if (s_sum > WEBRTC_SPL_WORD16_MAX)
- s_sum = WEBRTC_SPL_WORD16_MAX;
- else if (s_sum < WEBRTC_SPL_WORD16_MIN)
- s_sum = WEBRTC_SPL_WORD16_MIN;
-
- return (WebRtc_Word16)s_sum;
-}
-
-#endif
diff --git a/src/common_audio/signal_processing_library/main/source/add_sat_w32.c b/src/common_audio/signal_processing_library/main/source/add_sat_w32.c
deleted file mode 100644
index 6d83e75..0000000
--- a/src/common_audio/signal_processing_library/main/source/add_sat_w32.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_AddSatW32().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-#ifndef SPL_NO_DOUBLE_IMPLEMENTATIONS
-
-WebRtc_Word32 WebRtcSpl_AddSatW32(WebRtc_Word32 var1, WebRtc_Word32 var2)
-{
- WebRtc_Word32 l_sum;
-
- // perform long addition
- l_sum = var1 + var2;
-
- // check for under or overflow
- if (WEBRTC_SPL_IS_NEG(var1))
- {
- if (WEBRTC_SPL_IS_NEG(var2) && !WEBRTC_SPL_IS_NEG(l_sum))
- {
- l_sum = (WebRtc_Word32)0x80000000;
- }
- } else
- {
- if (!WEBRTC_SPL_IS_NEG(var2) && WEBRTC_SPL_IS_NEG(l_sum))
- {
- l_sum = (WebRtc_Word32)0x7FFFFFFF;
- }
- }
-
- return l_sum;
-}
-
-#endif
diff --git a/src/common_audio/signal_processing_library/main/source/auto_corr_to_refl_coef.c b/src/common_audio/signal_processing_library/main/source/auto_corr_to_refl_coef.c
deleted file mode 100644
index b7e8858..0000000
--- a/src/common_audio/signal_processing_library/main/source/auto_corr_to_refl_coef.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_AutoCorrToReflCoef().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-void WebRtcSpl_AutoCorrToReflCoef(G_CONST WebRtc_Word32 *R, int use_order, WebRtc_Word16 *K)
-{
- int i, n;
- WebRtc_Word16 tmp;
- G_CONST WebRtc_Word32 *rptr;
- WebRtc_Word32 L_num, L_den;
- WebRtc_Word16 *acfptr, *pptr, *wptr, *p1ptr, *w1ptr, ACF[WEBRTC_SPL_MAX_LPC_ORDER],
- P[WEBRTC_SPL_MAX_LPC_ORDER], W[WEBRTC_SPL_MAX_LPC_ORDER];
-
- // Initialize loop and pointers.
- acfptr = ACF;
- rptr = R;
- pptr = P;
- p1ptr = &P[1];
- w1ptr = &W[1];
- wptr = w1ptr;
-
- // First loop; n=0. Determine shifting.
- tmp = WebRtcSpl_NormW32(*R);
- *acfptr = (WebRtc_Word16)((*rptr++ << tmp) >> 16);
- *pptr++ = *acfptr++;
-
- // Initialize ACF, P and W.
- for (i = 1; i <= use_order; i++)
- {
- *acfptr = (WebRtc_Word16)((*rptr++ << tmp) >> 16);
- *wptr++ = *acfptr;
- *pptr++ = *acfptr++;
- }
-
- // Compute reflection coefficients.
- for (n = 1; n <= use_order; n++, K++)
- {
- tmp = WEBRTC_SPL_ABS_W16(*p1ptr);
- if (*P < tmp)
- {
- for (i = n; i <= use_order; i++)
- *K++ = 0;
-
- return;
- }
-
- // Division: WebRtcSpl_div(tmp, *P)
- *K = 0;
- if (tmp != 0)
- {
- L_num = tmp;
- L_den = *P;
- i = 15;
- while (i--)
- {
- (*K) <<= 1;
- L_num <<= 1;
- if (L_num >= L_den)
- {
- L_num -= L_den;
- (*K)++;
- }
- }
- if (*p1ptr > 0)
- *K = -*K;
- }
-
- // Last iteration; don't do Schur recursion.
- if (n == use_order)
- return;
-
- // Schur recursion.
- pptr = P;
- wptr = w1ptr;
- tmp = (WebRtc_Word16)(((WebRtc_Word32)*p1ptr * (WebRtc_Word32)*K + 16384) >> 15);
- *pptr = WEBRTC_SPL_ADD_SAT_W16( *pptr, tmp );
- pptr++;
- for (i = 1; i <= use_order - n; i++)
- {
- tmp = (WebRtc_Word16)(((WebRtc_Word32)*wptr * (WebRtc_Word32)*K + 16384) >> 15);
- *pptr = WEBRTC_SPL_ADD_SAT_W16( *(pptr+1), tmp );
- pptr++;
- tmp = (WebRtc_Word16)(((WebRtc_Word32)*pptr * (WebRtc_Word32)*K + 16384) >> 15);
- *wptr = WEBRTC_SPL_ADD_SAT_W16( *wptr, tmp );
- wptr++;
- }
- }
-}
diff --git a/src/common_audio/signal_processing_library/main/source/auto_correlation.c b/src/common_audio/signal_processing_library/main/source/auto_correlation.c
deleted file mode 100644
index a00fde4..0000000
--- a/src/common_audio/signal_processing_library/main/source/auto_correlation.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_AutoCorrelation().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-int WebRtcSpl_AutoCorrelation(G_CONST WebRtc_Word16* in_vector,
- int in_vector_length,
- int order,
- WebRtc_Word32* result,
- int* scale)
-{
- WebRtc_Word32 sum;
- int i, j;
- WebRtc_Word16 smax; // Sample max
- G_CONST WebRtc_Word16* xptr1;
- G_CONST WebRtc_Word16* xptr2;
- WebRtc_Word32* resultptr;
- int scaling = 0;
-
-#ifdef _ARM_OPT_
-#pragma message("NOTE: _ARM_OPT_ optimizations are used")
- WebRtc_Word16 loops4;
-#endif
-
- if (order < 0)
- order = in_vector_length;
-
- // Find the max. sample
- smax = WebRtcSpl_MaxAbsValueW16(in_vector, in_vector_length);
-
- // In order to avoid overflow when computing the sum we should scale the samples so that
- // (in_vector_length * smax * smax) will not overflow.
-
- if (smax == 0)
- {
- scaling = 0;
- } else
- {
- int nbits = WebRtcSpl_GetSizeInBits(in_vector_length); // # of bits in the sum loop
- int t = WebRtcSpl_NormW32(WEBRTC_SPL_MUL(smax, smax)); // # of bits to normalize smax
-
- if (t > nbits)
- {
- scaling = 0;
- } else
- {
- scaling = nbits - t;
- }
-
- }
-
- resultptr = result;
-
- // Perform the actual correlation calculation
- for (i = 0; i < order + 1; i++)
- {
- int loops = (in_vector_length - i);
- sum = 0;
- xptr1 = in_vector;
- xptr2 = &in_vector[i];
-#ifndef _ARM_OPT_
- for (j = loops; j > 0; j--)
- {
- sum += WEBRTC_SPL_MUL_16_16_RSFT(*xptr1++, *xptr2++, scaling);
- }
-#else
- loops4 = (loops >> 2) << 2;
-
- if (scaling == 0)
- {
- for (j = 0; j < loops4; j = j + 4)
- {
- sum += WEBRTC_SPL_MUL_16_16(*xptr1, *xptr2);
- xptr1++;
- xptr2++;
- sum += WEBRTC_SPL_MUL_16_16(*xptr1, *xptr2);
- xptr1++;
- xptr2++;
- sum += WEBRTC_SPL_MUL_16_16(*xptr1, *xptr2);
- xptr1++;
- xptr2++;
- sum += WEBRTC_SPL_MUL_16_16(*xptr1, *xptr2);
- xptr1++;
- xptr2++;
- }
-
- for (j = loops4; j < loops; j++)
- {
- sum += WEBRTC_SPL_MUL_16_16(*xptr1, *xptr2);
- xptr1++;
- xptr2++;
- }
- }
- else
- {
- for (j = 0; j < loops4; j = j + 4)
- {
- sum += WEBRTC_SPL_MUL_16_16_RSFT(*xptr1, *xptr2, scaling);
- xptr1++;
- xptr2++;
- sum += WEBRTC_SPL_MUL_16_16_RSFT(*xptr1, *xptr2, scaling);
- xptr1++;
- xptr2++;
- sum += WEBRTC_SPL_MUL_16_16_RSFT(*xptr1, *xptr2, scaling);
- xptr1++;
- xptr2++;
- sum += WEBRTC_SPL_MUL_16_16_RSFT(*xptr1, *xptr2, scaling);
- xptr1++;
- xptr2++;
- }
-
- for (j = loops4; j < loops; j++)
- {
- sum += WEBRTC_SPL_MUL_16_16_RSFT(*xptr1, *xptr2, scaling);
- xptr1++;
- xptr2++;
- }
- }
-
-#endif
- *resultptr++ = sum;
- }
-
- *scale = scaling;
-
- return order + 1;
-}
diff --git a/src/common_audio/signal_processing_library/main/source/complex_bit_reverse.c b/src/common_audio/signal_processing_library/main/source/complex_bit_reverse.c
deleted file mode 100644
index 85c76f8..0000000
--- a/src/common_audio/signal_processing_library/main/source/complex_bit_reverse.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_ComplexBitReverse().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-void WebRtcSpl_ComplexBitReverse(WebRtc_Word16 frfi[], int stages)
-{
- int mr, nn, n, l, m;
- WebRtc_Word16 tr, ti;
-
- n = 1 << stages;
-
- mr = 0;
- nn = n - 1;
-
- // decimation in time - re-order data
- for (m = 1; m <= nn; ++m)
- {
- l = n;
- do
- {
- l >>= 1;
- } while (mr + l > nn);
- mr = (mr & (l - 1)) + l;
-
- if (mr <= m)
- continue;
-
- tr = frfi[2 * m];
- frfi[2 * m] = frfi[2 * mr];
- frfi[2 * mr] = tr;
-
- ti = frfi[2 * m + 1];
- frfi[2 * m + 1] = frfi[2 * mr + 1];
- frfi[2 * mr + 1] = ti;
- }
-}
diff --git a/src/common_audio/signal_processing_library/main/source/complex_fft.c b/src/common_audio/signal_processing_library/main/source/complex_fft.c
deleted file mode 100644
index b6f0c4e..0000000
--- a/src/common_audio/signal_processing_library/main/source/complex_fft.c
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_ComplexFFT().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-#define CFFTSFT 14
-#define CFFTRND 1
-#define CFFTRND2 16384
-
-#if (defined ARM9E_GCC) || (defined ARM_WINM) || (defined ANDROID_AECOPT)
-extern "C" int FFT_4OFQ14(void *src, void *dest, int NC, int shift);
-
-// For detailed description of the fft functions, check the readme files in fft_ARM9E folder.
-int WebRtcSpl_ComplexFFT2(WebRtc_Word16 frfi[], WebRtc_Word16 frfiOut[], int stages, int mode)
-{
- return FFT_4OFQ14(frfi, frfiOut, 1 << stages, 0);
-}
-#endif
-
-int WebRtcSpl_ComplexFFT(WebRtc_Word16 frfi[], int stages, int mode)
-{
- int i, j, l, k, istep, n, m;
- WebRtc_Word16 wr, wi;
- WebRtc_Word32 tr32, ti32, qr32, qi32;
-
- /* The 1024-value is a constant given from the size of WebRtcSpl_kSinTable1024[],
- * and should not be changed depending on the input parameter 'stages'
- */
- n = 1 << stages;
- if (n > 1024)
- return -1;
-
- l = 1;
- k = 10 - 1; /* Constant for given WebRtcSpl_kSinTable1024[]. Do not change
- depending on the input parameter 'stages' */
-
- if (mode == 0)
- {
- // mode==0: Low-complexity and Low-accuracy mode
- while (l < n)
- {
- istep = l << 1;
-
- for (m = 0; m < l; ++m)
- {
- j = m << k;
-
- /* The 256-value is a constant given as 1/4 of the size of
- * WebRtcSpl_kSinTable1024[], and should not be changed depending on the input
- * parameter 'stages'. It will result in 0 <= j < N_SINE_WAVE/2
- */
- wr = WebRtcSpl_kSinTable1024[j + 256];
- wi = -WebRtcSpl_kSinTable1024[j];
-
- for (i = m; i < n; i += istep)
- {
- j = i + l;
-
- tr32 = WEBRTC_SPL_RSHIFT_W32((WEBRTC_SPL_MUL_16_16(wr, frfi[2 * j])
- - WEBRTC_SPL_MUL_16_16(wi, frfi[2 * j + 1])), 15);
-
- ti32 = WEBRTC_SPL_RSHIFT_W32((WEBRTC_SPL_MUL_16_16(wr, frfi[2 * j + 1])
- + WEBRTC_SPL_MUL_16_16(wi, frfi[2 * j])), 15);
-
- qr32 = (WebRtc_Word32)frfi[2 * i];
- qi32 = (WebRtc_Word32)frfi[2 * i + 1];
- frfi[2 * j] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(qr32 - tr32, 1);
- frfi[2 * j + 1] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(qi32 - ti32, 1);
- frfi[2 * i] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(qr32 + tr32, 1);
- frfi[2 * i + 1] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(qi32 + ti32, 1);
- }
- }
-
- --k;
- l = istep;
-
- }
-
- } else
- {
- // mode==1: High-complexity and High-accuracy mode
- while (l < n)
- {
- istep = l << 1;
-
- for (m = 0; m < l; ++m)
- {
- j = m << k;
-
- /* The 256-value is a constant given as 1/4 of the size of
- * WebRtcSpl_kSinTable1024[], and should not be changed depending on the input
- * parameter 'stages'. It will result in 0 <= j < N_SINE_WAVE/2
- */
- wr = WebRtcSpl_kSinTable1024[j + 256];
- wi = -WebRtcSpl_kSinTable1024[j];
-
- for (i = m; i < n; i += istep)
- {
- j = i + l;
-
- tr32 = WEBRTC_SPL_RSHIFT_W32((WEBRTC_SPL_MUL_16_16(wr, frfi[2 * j])
- - WEBRTC_SPL_MUL_16_16(wi, frfi[2 * j + 1]) + CFFTRND),
- 15 - CFFTSFT);
-
- ti32 = WEBRTC_SPL_RSHIFT_W32((WEBRTC_SPL_MUL_16_16(wr, frfi[2 * j + 1])
- + WEBRTC_SPL_MUL_16_16(wi, frfi[2 * j]) + CFFTRND), 15 - CFFTSFT);
-
- qr32 = ((WebRtc_Word32)frfi[2 * i]) << CFFTSFT;
- qi32 = ((WebRtc_Word32)frfi[2 * i + 1]) << CFFTSFT;
- frfi[2 * j] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(
- (qr32 - tr32 + CFFTRND2), 1 + CFFTSFT);
- frfi[2 * j + 1] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(
- (qi32 - ti32 + CFFTRND2), 1 + CFFTSFT);
- frfi[2 * i] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(
- (qr32 + tr32 + CFFTRND2), 1 + CFFTSFT);
- frfi[2 * i + 1] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(
- (qi32 + ti32 + CFFTRND2), 1 + CFFTSFT);
- }
- }
-
- --k;
- l = istep;
- }
- }
- return 0;
-}
diff --git a/src/common_audio/signal_processing_library/main/source/complex_ifft.c b/src/common_audio/signal_processing_library/main/source/complex_ifft.c
deleted file mode 100644
index 184b8de..0000000
--- a/src/common_audio/signal_processing_library/main/source/complex_ifft.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_ComplexIFFT().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-#define CIFFTSFT 14
-#define CIFFTRND 1
-
-#if (defined ARM9E_GCC) || (defined ARM_WINM) || (defined ANDROID_AECOPT)
-extern "C" int FFT_4OIQ14(void *src, void *dest, int NC, int shift);
-
-// For detailed description of the fft functions, check the readme files in fft_ARM9E folder.
-int WebRtcSpl_ComplexIFFT2(WebRtc_Word16 frfi[], WebRtc_Word16 frfiOut[], int stages, int mode)
-{
- FFT_4OIQ14(frfi, frfiOut, 1 << stages, 0);
- return 0;
-}
-#endif
-
-int WebRtcSpl_ComplexIFFT(WebRtc_Word16 frfi[], int stages, int mode)
-{
- int i, j, l, k, istep, n, m, scale, shift;
- WebRtc_Word16 wr, wi;
- WebRtc_Word32 tr32, ti32, qr32, qi32;
- WebRtc_Word32 tmp32, round2;
-
- /* The 1024-value is a constant given from the size of WebRtcSpl_kSinTable1024[],
- * and should not be changed depending on the input parameter 'stages'
- */
- n = 1 << stages;
- if (n > 1024)
- return -1;
-
- scale = 0;
-
- l = 1;
- k = 10 - 1; /* Constant for given WebRtcSpl_kSinTable1024[]. Do not change
- depending on the input parameter 'stages' */
-
- while (l < n)
- {
- // variable scaling, depending upon data
- shift = 0;
- round2 = 8192;
-
- tmp32 = (WebRtc_Word32)WebRtcSpl_MaxAbsValueW16(frfi, 2 * n);
- if (tmp32 > 13573)
- {
- shift++;
- scale++;
- round2 <<= 1;
- }
- if (tmp32 > 27146)
- {
- shift++;
- scale++;
- round2 <<= 1;
- }
-
- istep = l << 1;
-
- if (mode == 0)
- {
- // mode==0: Low-complexity and Low-accuracy mode
- for (m = 0; m < l; ++m)
- {
- j = m << k;
-
- /* The 256-value is a constant given as 1/4 of the size of
- * WebRtcSpl_kSinTable1024[], and should not be changed depending on the input
- * parameter 'stages'. It will result in 0 <= j < N_SINE_WAVE/2
- */
- wr = WebRtcSpl_kSinTable1024[j + 256];
- wi = WebRtcSpl_kSinTable1024[j];
-
- for (i = m; i < n; i += istep)
- {
- j = i + l;
-
- tr32 = WEBRTC_SPL_RSHIFT_W32((WEBRTC_SPL_MUL_16_16_RSFT(wr, frfi[2 * j], 0)
- - WEBRTC_SPL_MUL_16_16_RSFT(wi, frfi[2 * j + 1], 0)), 15);
-
- ti32 = WEBRTC_SPL_RSHIFT_W32(
- (WEBRTC_SPL_MUL_16_16_RSFT(wr, frfi[2 * j + 1], 0)
- + WEBRTC_SPL_MUL_16_16_RSFT(wi,frfi[2*j],0)), 15);
-
- qr32 = (WebRtc_Word32)frfi[2 * i];
- qi32 = (WebRtc_Word32)frfi[2 * i + 1];
- frfi[2 * j] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(qr32 - tr32, shift);
- frfi[2 * j + 1] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(qi32 - ti32, shift);
- frfi[2 * i] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(qr32 + tr32, shift);
- frfi[2 * i + 1] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(qi32 + ti32, shift);
- }
- }
- } else
- {
- // mode==1: High-complexity and High-accuracy mode
-
- for (m = 0; m < l; ++m)
- {
- j = m << k;
-
- /* The 256-value is a constant given as 1/4 of the size of
- * WebRtcSpl_kSinTable1024[], and should not be changed depending on the input
- * parameter 'stages'. It will result in 0 <= j < N_SINE_WAVE/2
- */
- wr = WebRtcSpl_kSinTable1024[j + 256];
- wi = WebRtcSpl_kSinTable1024[j];
-
- for (i = m; i < n; i += istep)
- {
- j = i + l;
-
- tr32 = WEBRTC_SPL_RSHIFT_W32((WEBRTC_SPL_MUL_16_16_RSFT(wr, frfi[2 * j], 0)
- - WEBRTC_SPL_MUL_16_16_RSFT(wi, frfi[2 * j + 1], 0) + CIFFTRND),
- 15 - CIFFTSFT);
-
- ti32 = WEBRTC_SPL_RSHIFT_W32(
- (WEBRTC_SPL_MUL_16_16_RSFT(wr, frfi[2 * j + 1], 0)
- + WEBRTC_SPL_MUL_16_16_RSFT(wi, frfi[2 * j], 0)
- + CIFFTRND), 15 - CIFFTSFT);
-
- qr32 = ((WebRtc_Word32)frfi[2 * i]) << CIFFTSFT;
- qi32 = ((WebRtc_Word32)frfi[2 * i + 1]) << CIFFTSFT;
- frfi[2 * j] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((qr32 - tr32+round2),
- shift+CIFFTSFT);
- frfi[2 * j + 1] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(
- (qi32 - ti32 + round2), shift + CIFFTSFT);
- frfi[2 * i] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((qr32 + tr32 + round2),
- shift + CIFFTSFT);
- frfi[2 * i + 1] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(
- (qi32 + ti32 + round2), shift + CIFFTSFT);
- }
- }
-
- }
- --k;
- l = istep;
- }
- return scale;
-}
diff --git a/src/common_audio/signal_processing_library/main/source/copy_set_operations.c b/src/common_audio/signal_processing_library/main/source/copy_set_operations.c
deleted file mode 100644
index 8247337..0000000
--- a/src/common_audio/signal_processing_library/main/source/copy_set_operations.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the implementation of functions
- * WebRtcSpl_MemSetW16()
- * WebRtcSpl_MemSetW32()
- * WebRtcSpl_MemCpyReversedOrder()
- * WebRtcSpl_CopyFromEndW16()
- * WebRtcSpl_ZerosArrayW16()
- * WebRtcSpl_ZerosArrayW32()
- * WebRtcSpl_OnesArrayW16()
- * WebRtcSpl_OnesArrayW32()
- *
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include <string.h>
-#include "signal_processing_library.h"
-
-
-void WebRtcSpl_MemSetW16(WebRtc_Word16 *ptr, WebRtc_Word16 set_value, int length)
-{
- int j;
- WebRtc_Word16 *arrptr = ptr;
-
- for (j = length; j > 0; j--)
- {
- *arrptr++ = set_value;
- }
-}
-
-void WebRtcSpl_MemSetW32(WebRtc_Word32 *ptr, WebRtc_Word32 set_value, int length)
-{
- int j;
- WebRtc_Word32 *arrptr = ptr;
-
- for (j = length; j > 0; j--)
- {
- *arrptr++ = set_value;
- }
-}
-
-void WebRtcSpl_MemCpyReversedOrder(WebRtc_Word16* dest, WebRtc_Word16* source, int length)
-{
- int j;
- WebRtc_Word16* destPtr = dest;
- WebRtc_Word16* sourcePtr = source;
-
- for (j = 0; j < length; j++)
- {
- *destPtr-- = *sourcePtr++;
- }
-}
-
-WebRtc_Word16 WebRtcSpl_CopyFromEndW16(G_CONST WebRtc_Word16 *vector_in,
- WebRtc_Word16 length,
- WebRtc_Word16 samples,
- WebRtc_Word16 *vector_out)
-{
- // Copy the last <samples> of the input vector to vector_out
- WEBRTC_SPL_MEMCPY_W16(vector_out, &vector_in[length - samples], samples);
-
- return samples;
-}
-
-WebRtc_Word16 WebRtcSpl_ZerosArrayW16(WebRtc_Word16 *vector, WebRtc_Word16 length)
-{
- WebRtcSpl_MemSetW16(vector, 0, length);
- return length;
-}
-
-WebRtc_Word16 WebRtcSpl_ZerosArrayW32(WebRtc_Word32 *vector, WebRtc_Word16 length)
-{
- WebRtcSpl_MemSetW32(vector, 0, length);
- return length;
-}
-
-WebRtc_Word16 WebRtcSpl_OnesArrayW16(WebRtc_Word16 *vector, WebRtc_Word16 length)
-{
- WebRtc_Word16 i;
- WebRtc_Word16 *tmpvec = vector;
- for (i = 0; i < length; i++)
- {
- *tmpvec++ = 1;
- }
- return length;
-}
-
-WebRtc_Word16 WebRtcSpl_OnesArrayW32(WebRtc_Word32 *vector, WebRtc_Word16 length)
-{
- WebRtc_Word16 i;
- WebRtc_Word32 *tmpvec = vector;
- for (i = 0; i < length; i++)
- {
- *tmpvec++ = 1;
- }
- return length;
-}
diff --git a/src/common_audio/signal_processing_library/main/source/cos_table.c b/src/common_audio/signal_processing_library/main/source/cos_table.c
deleted file mode 100644
index 7dba4b0..0000000
--- a/src/common_audio/signal_processing_library/main/source/cos_table.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the 360 degree cos table.
- *
- */
-
-#include "signal_processing_library.h"
-
-WebRtc_Word16 WebRtcSpl_kCosTable[] = {
- 8192, 8190, 8187, 8180, 8172, 8160, 8147, 8130, 8112,
- 8091, 8067, 8041, 8012, 7982, 7948, 7912, 7874, 7834,
- 7791, 7745, 7697, 7647, 7595, 7540, 7483, 7424, 7362,
- 7299, 7233, 7164, 7094, 7021, 6947, 6870, 6791, 6710,
- 6627, 6542, 6455, 6366, 6275, 6182, 6087, 5991, 5892,
- 5792, 5690, 5586, 5481, 5374, 5265, 5155, 5043, 4930,
- 4815, 4698, 4580, 4461, 4341, 4219, 4096, 3971, 3845,
- 3719, 3591, 3462, 3331, 3200, 3068, 2935, 2801, 2667,
- 2531, 2395, 2258, 2120, 1981, 1842, 1703, 1563, 1422,
- 1281, 1140, 998, 856, 713, 571, 428, 285, 142,
- 0, -142, -285, -428, -571, -713, -856, -998, -1140,
- -1281, -1422, -1563, -1703, -1842, -1981, -2120, -2258, -2395,
- -2531, -2667, -2801, -2935, -3068, -3200, -3331, -3462, -3591,
- -3719, -3845, -3971, -4095, -4219, -4341, -4461, -4580, -4698,
- -4815, -4930, -5043, -5155, -5265, -5374, -5481, -5586, -5690,
- -5792, -5892, -5991, -6087, -6182, -6275, -6366, -6455, -6542,
- -6627, -6710, -6791, -6870, -6947, -7021, -7094, -7164, -7233,
- -7299, -7362, -7424, -7483, -7540, -7595, -7647, -7697, -7745,
- -7791, -7834, -7874, -7912, -7948, -7982, -8012, -8041, -8067,
- -8091, -8112, -8130, -8147, -8160, -8172, -8180, -8187, -8190,
- -8191, -8190, -8187, -8180, -8172, -8160, -8147, -8130, -8112,
- -8091, -8067, -8041, -8012, -7982, -7948, -7912, -7874, -7834,
- -7791, -7745, -7697, -7647, -7595, -7540, -7483, -7424, -7362,
- -7299, -7233, -7164, -7094, -7021, -6947, -6870, -6791, -6710,
- -6627, -6542, -6455, -6366, -6275, -6182, -6087, -5991, -5892,
- -5792, -5690, -5586, -5481, -5374, -5265, -5155, -5043, -4930,
- -4815, -4698, -4580, -4461, -4341, -4219, -4096, -3971, -3845,
- -3719, -3591, -3462, -3331, -3200, -3068, -2935, -2801, -2667,
- -2531, -2395, -2258, -2120, -1981, -1842, -1703, -1563, -1422,
- -1281, -1140, -998, -856, -713, -571, -428, -285, -142,
- 0, 142, 285, 428, 571, 713, 856, 998, 1140,
- 1281, 1422, 1563, 1703, 1842, 1981, 2120, 2258, 2395,
- 2531, 2667, 2801, 2935, 3068, 3200, 3331, 3462, 3591,
- 3719, 3845, 3971, 4095, 4219, 4341, 4461, 4580, 4698,
- 4815, 4930, 5043, 5155, 5265, 5374, 5481, 5586, 5690,
- 5792, 5892, 5991, 6087, 6182, 6275, 6366, 6455, 6542,
- 6627, 6710, 6791, 6870, 6947, 7021, 7094, 7164, 7233,
- 7299, 7362, 7424, 7483, 7540, 7595, 7647, 7697, 7745,
- 7791, 7834, 7874, 7912, 7948, 7982, 8012, 8041, 8067,
- 8091, 8112, 8130, 8147, 8160, 8172, 8180, 8187, 8190
-};
diff --git a/src/common_audio/signal_processing_library/main/source/cross_correlation.c b/src/common_audio/signal_processing_library/main/source/cross_correlation.c
deleted file mode 100644
index 1133d09..0000000
--- a/src/common_audio/signal_processing_library/main/source/cross_correlation.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_CrossCorrelation().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-void WebRtcSpl_CrossCorrelation(WebRtc_Word32* cross_correlation, WebRtc_Word16* seq1,
- WebRtc_Word16* seq2, WebRtc_Word16 dim_seq,
- WebRtc_Word16 dim_cross_correlation,
- WebRtc_Word16 right_shifts,
- WebRtc_Word16 step_seq2)
-{
- int i, j;
- WebRtc_Word16* seq1Ptr;
- WebRtc_Word16* seq2Ptr;
- WebRtc_Word32* CrossCorrPtr;
-
-#ifdef _XSCALE_OPT_
-
-#ifdef _WIN32
-#pragma message("NOTE: _XSCALE_OPT_ optimizations are used (overrides _ARM_OPT_ and requires /QRxscale compiler flag)")
-#endif
-
- __int64 macc40;
-
- int iseq1[250];
- int iseq2[250];
- int iseq3[250];
- int * iseq1Ptr;
- int * iseq2Ptr;
- int * iseq3Ptr;
- int len, i_len;
-
- seq1Ptr = seq1;
- iseq1Ptr = iseq1;
- for(i = 0; i < ((dim_seq + 1) >> 1); i++)
- {
- *iseq1Ptr = (unsigned short)*seq1Ptr++;
- *iseq1Ptr++ |= (WebRtc_Word32)*seq1Ptr++ << 16;
-
- }
-
- if(dim_seq%2)
- {
- *(iseq1Ptr-1) &= 0x0000ffff;
- }
- *iseq1Ptr = 0;
- iseq1Ptr++;
- *iseq1Ptr = 0;
- iseq1Ptr++;
- *iseq1Ptr = 0;
-
- if(step_seq2 < 0)
- {
- seq2Ptr = seq2 - dim_cross_correlation + 1;
- CrossCorrPtr = &cross_correlation[dim_cross_correlation - 1];
- }
- else
- {
- seq2Ptr = seq2;
- CrossCorrPtr = cross_correlation;
- }
-
- len = dim_seq + dim_cross_correlation - 1;
- i_len = (len + 1) >> 1;
- iseq2Ptr = iseq2;
-
- iseq3Ptr = iseq3;
- for(i = 0; i < i_len; i++)
- {
- *iseq2Ptr = (unsigned short)*seq2Ptr++;
- *iseq3Ptr = (unsigned short)*seq2Ptr;
- *iseq2Ptr++ |= (WebRtc_Word32)*seq2Ptr++ << 16;
- *iseq3Ptr++ |= (WebRtc_Word32)*seq2Ptr << 16;
- }
-
- if(len % 2)
- {
- iseq2[i_len - 1] &= 0x0000ffff;
- iseq3[i_len - 1] = 0;
- }
- else
- iseq3[i_len - 1] &= 0x0000ffff;
-
- iseq2[i_len] = 0;
- iseq3[i_len] = 0;
- iseq2[i_len + 1] = 0;
- iseq3[i_len + 1] = 0;
- iseq2[i_len + 2] = 0;
- iseq3[i_len + 2] = 0;
-
- // Set pointer to start value
- iseq2Ptr = iseq2;
- iseq3Ptr = iseq3;
-
- i_len = (dim_seq + 7) >> 3;
- for (i = 0; i < dim_cross_correlation; i++)
- {
-
- iseq1Ptr = iseq1;
-
- macc40 = 0;
-
- _WriteCoProcessor(macc40, 0);
-
- if((i & 1))
- {
- iseq3Ptr = iseq3 + (i >> 1);
- for (j = i_len; j > 0; j--)
- {
- _SmulAddPack_2SW_ACC(*iseq1Ptr++, *iseq3Ptr++);
- _SmulAddPack_2SW_ACC(*iseq1Ptr++, *iseq3Ptr++);
- _SmulAddPack_2SW_ACC(*iseq1Ptr++, *iseq3Ptr++);
- _SmulAddPack_2SW_ACC(*iseq1Ptr++, *iseq3Ptr++);
- }
- }
- else
- {
- iseq2Ptr = iseq2 + (i >> 1);
- for (j = i_len; j > 0; j--)
- {
- _SmulAddPack_2SW_ACC(*iseq1Ptr++, *iseq2Ptr++);
- _SmulAddPack_2SW_ACC(*iseq1Ptr++, *iseq2Ptr++);
- _SmulAddPack_2SW_ACC(*iseq1Ptr++, *iseq2Ptr++);
- _SmulAddPack_2SW_ACC(*iseq1Ptr++, *iseq2Ptr++);
- }
-
- }
-
- macc40 = _ReadCoProcessor(0);
- *CrossCorrPtr = (WebRtc_Word32)(macc40 >> right_shifts);
- CrossCorrPtr += step_seq2;
- }
-#else // #ifdef _XSCALE_OPT_
-#ifdef _ARM_OPT_
- WebRtc_Word16 dim_seq8 = (dim_seq >> 3) << 3;
-#endif
-
- CrossCorrPtr = cross_correlation;
-
- for (i = 0; i < dim_cross_correlation; i++)
- {
- // Set the pointer to the static vector, set the pointer to the sliding vector
- // and initialize cross_correlation
- seq1Ptr = seq1;
- seq2Ptr = seq2 + (step_seq2 * i);
- (*CrossCorrPtr) = 0;
-
-#ifndef _ARM_OPT_
-#ifdef _WIN32
-#pragma message("NOTE: default implementation is used")
-#endif
- // Perform the cross correlation
- for (j = 0; j < dim_seq; j++)
- {
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr), right_shifts);
- seq1Ptr++;
- seq2Ptr++;
- }
-#else
-#ifdef _WIN32
-#pragma message("NOTE: _ARM_OPT_ optimizations are used")
-#endif
- if (right_shifts == 0)
- {
- // Perform the optimized cross correlation
- for (j = 0; j < dim_seq8; j = j + 8)
- {
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16((*seq1Ptr), (*seq2Ptr));
- seq1Ptr++;
- seq2Ptr++;
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16((*seq1Ptr), (*seq2Ptr));
- seq1Ptr++;
- seq2Ptr++;
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16((*seq1Ptr), (*seq2Ptr));
- seq1Ptr++;
- seq2Ptr++;
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16((*seq1Ptr), (*seq2Ptr));
- seq1Ptr++;
- seq2Ptr++;
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16((*seq1Ptr), (*seq2Ptr));
- seq1Ptr++;
- seq2Ptr++;
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16((*seq1Ptr), (*seq2Ptr));
- seq1Ptr++;
- seq2Ptr++;
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16((*seq1Ptr), (*seq2Ptr));
- seq1Ptr++;
- seq2Ptr++;
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16((*seq1Ptr), (*seq2Ptr));
- seq1Ptr++;
- seq2Ptr++;
- }
-
- for (j = dim_seq8; j < dim_seq; j++)
- {
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16((*seq1Ptr), (*seq2Ptr));
- seq1Ptr++;
- seq2Ptr++;
- }
- }
- else // right_shifts != 0
-
- {
- // Perform the optimized cross correlation
- for (j = 0; j < dim_seq8; j = j + 8)
- {
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr),
- right_shifts);
- seq1Ptr++;
- seq2Ptr++;
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr),
- right_shifts);
- seq1Ptr++;
- seq2Ptr++;
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr),
- right_shifts);
- seq1Ptr++;
- seq2Ptr++;
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr),
- right_shifts);
- seq1Ptr++;
- seq2Ptr++;
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr),
- right_shifts);
- seq1Ptr++;
- seq2Ptr++;
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr),
- right_shifts);
- seq1Ptr++;
- seq2Ptr++;
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr),
- right_shifts);
- seq1Ptr++;
- seq2Ptr++;
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr),
- right_shifts);
- seq1Ptr++;
- seq2Ptr++;
- }
-
- for (j = dim_seq8; j < dim_seq; j++)
- {
- (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr),
- right_shifts);
- seq1Ptr++;
- seq2Ptr++;
- }
- }
-#endif
- CrossCorrPtr++;
- }
-#endif
-}
diff --git a/src/common_audio/signal_processing_library/main/source/division_operations.c b/src/common_audio/signal_processing_library/main/source/division_operations.c
deleted file mode 100644
index b143373..0000000
--- a/src/common_audio/signal_processing_library/main/source/division_operations.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains implementations of the divisions
- * WebRtcSpl_DivU32U16()
- * WebRtcSpl_DivW32W16()
- * WebRtcSpl_DivW32W16ResW16()
- * WebRtcSpl_DivResultInQ31()
- * WebRtcSpl_DivW32HiLow()
- *
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-WebRtc_UWord32 WebRtcSpl_DivU32U16(WebRtc_UWord32 num, WebRtc_UWord16 den)
-{
- // Guard against division with 0
- if (den != 0)
- {
- return (WebRtc_UWord32)(num / den);
- } else
- {
- return (WebRtc_UWord32)0xFFFFFFFF;
- }
-}
-
-WebRtc_Word32 WebRtcSpl_DivW32W16(WebRtc_Word32 num, WebRtc_Word16 den)
-{
- // Guard against division with 0
- if (den != 0)
- {
- return (WebRtc_Word32)(num / den);
- } else
- {
- return (WebRtc_Word32)0x7FFFFFFF;
- }
-}
-
-WebRtc_Word16 WebRtcSpl_DivW32W16ResW16(WebRtc_Word32 num, WebRtc_Word16 den)
-{
- // Guard against division with 0
- if (den != 0)
- {
- return (WebRtc_Word16)(num / den);
- } else
- {
- return (WebRtc_Word16)0x7FFF;
- }
-}
-
-WebRtc_Word32 WebRtcSpl_DivResultInQ31(WebRtc_Word32 num, WebRtc_Word32 den)
-{
- WebRtc_Word32 L_num = num;
- WebRtc_Word32 L_den = den;
- WebRtc_Word32 div = 0;
- int k = 31;
- int change_sign = 0;
-
- if (num == 0)
- return 0;
-
- if (num < 0)
- {
- change_sign++;
- L_num = -num;
- }
- if (den < 0)
- {
- change_sign++;
- L_den = -den;
- }
- while (k--)
- {
- div <<= 1;
- L_num <<= 1;
- if (L_num >= L_den)
- {
- L_num -= L_den;
- div++;
- }
- }
- if (change_sign == 1)
- {
- div = -div;
- }
- return div;
-}
-
-WebRtc_Word32 WebRtcSpl_DivW32HiLow(WebRtc_Word32 num, WebRtc_Word16 den_hi,
- WebRtc_Word16 den_low)
-{
- WebRtc_Word16 approx, tmp_hi, tmp_low, num_hi, num_low;
- WebRtc_Word32 tmpW32;
-
- approx = (WebRtc_Word16)WebRtcSpl_DivW32W16((WebRtc_Word32)0x1FFFFFFF, den_hi);
- // result in Q14 (Note: 3FFFFFFF = 0.5 in Q30)
-
- // tmpW32 = 1/den = approx * (2.0 - den * approx) (in Q30)
- tmpW32 = (WEBRTC_SPL_MUL_16_16(den_hi, approx) << 1)
- + ((WEBRTC_SPL_MUL_16_16(den_low, approx) >> 15) << 1);
- // tmpW32 = den * approx
-
- tmpW32 = (WebRtc_Word32)0x7fffffffL - tmpW32; // result in Q30 (tmpW32 = 2.0-(den*approx))
-
- // Store tmpW32 in hi and low format
- tmp_hi = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmpW32, 16);
- tmp_low = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((tmpW32
- - WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)tmp_hi, 16)), 1);
-
- // tmpW32 = 1/den in Q29
- tmpW32 = ((WEBRTC_SPL_MUL_16_16(tmp_hi, approx) + (WEBRTC_SPL_MUL_16_16(tmp_low, approx)
- >> 15)) << 1);
-
- // 1/den in hi and low format
- tmp_hi = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmpW32, 16);
- tmp_low = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((tmpW32
- - WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)tmp_hi, 16)), 1);
-
- // Store num in hi and low format
- num_hi = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(num, 16);
- num_low = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((num
- - WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)num_hi, 16)), 1);
-
- // num * (1/den) by 32 bit multiplication (result in Q28)
-
- tmpW32 = (WEBRTC_SPL_MUL_16_16(num_hi, tmp_hi) + (WEBRTC_SPL_MUL_16_16(num_hi, tmp_low)
- >> 15) + (WEBRTC_SPL_MUL_16_16(num_low, tmp_hi) >> 15));
-
- // Put result in Q31 (convert from Q28)
- tmpW32 = WEBRTC_SPL_LSHIFT_W32(tmpW32, 3);
-
- return tmpW32;
-}
diff --git a/src/common_audio/signal_processing_library/main/source/dot_product_with_scale.c b/src/common_audio/signal_processing_library/main/source/dot_product_with_scale.c
deleted file mode 100644
index 6e085fd..0000000
--- a/src/common_audio/signal_processing_library/main/source/dot_product_with_scale.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_DotProductWithScale().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-WebRtc_Word32 WebRtcSpl_DotProductWithScale(WebRtc_Word16 *vector1, WebRtc_Word16 *vector2,
- int length, int scaling)
-{
- WebRtc_Word32 sum;
- int i;
-#ifdef _ARM_OPT_
-#pragma message("NOTE: _ARM_OPT_ optimizations are used")
- WebRtc_Word16 len4 = (length >> 2) << 2;
-#endif
-
- sum = 0;
-
-#ifndef _ARM_OPT_
- for (i = 0; i < length; i++)
- {
- sum += WEBRTC_SPL_MUL_16_16_RSFT(*vector1++, *vector2++, scaling);
- }
-#else
- if (scaling == 0)
- {
- for (i = 0; i < len4; i = i + 4)
- {
- sum += WEBRTC_SPL_MUL_16_16(*vector1, *vector2);
- vector1++;
- vector2++;
- sum += WEBRTC_SPL_MUL_16_16(*vector1, *vector2);
- vector1++;
- vector2++;
- sum += WEBRTC_SPL_MUL_16_16(*vector1, *vector2);
- vector1++;
- vector2++;
- sum += WEBRTC_SPL_MUL_16_16(*vector1, *vector2);
- vector1++;
- vector2++;
- }
-
- for (i = len4; i < length; i++)
- {
- sum += WEBRTC_SPL_MUL_16_16(*vector1, *vector2);
- vector1++;
- vector2++;
- }
- }
- else
- {
- for (i = 0; i < len4; i = i + 4)
- {
- sum += WEBRTC_SPL_MUL_16_16_RSFT(*vector1, *vector2, scaling);
- vector1++;
- vector2++;
- sum += WEBRTC_SPL_MUL_16_16_RSFT(*vector1, *vector2, scaling);
- vector1++;
- vector2++;
- sum += WEBRTC_SPL_MUL_16_16_RSFT(*vector1, *vector2, scaling);
- vector1++;
- vector2++;
- sum += WEBRTC_SPL_MUL_16_16_RSFT(*vector1, *vector2, scaling);
- vector1++;
- vector2++;
- }
-
- for (i = len4; i < length; i++)
- {
- sum += WEBRTC_SPL_MUL_16_16_RSFT(*vector1, *vector2, scaling);
- vector1++;
- vector2++;
- }
- }
-#endif
-
- return sum;
-}
diff --git a/src/common_audio/signal_processing_library/main/source/downsample_fast.c b/src/common_audio/signal_processing_library/main/source/downsample_fast.c
deleted file mode 100644
index 9338275..0000000
--- a/src/common_audio/signal_processing_library/main/source/downsample_fast.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_DownsampleFast().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-int WebRtcSpl_DownsampleFast(WebRtc_Word16 *in_ptr, WebRtc_Word16 in_length,
- WebRtc_Word16 *out_ptr, WebRtc_Word16 out_length,
- WebRtc_Word16 *B, WebRtc_Word16 B_length, WebRtc_Word16 factor,
- WebRtc_Word16 delay)
-{
- WebRtc_Word32 o;
- int i, j;
-
- WebRtc_Word16 *downsampled_ptr = out_ptr;
- WebRtc_Word16 *b_ptr;
- WebRtc_Word16 *x_ptr;
- WebRtc_Word16 endpos = delay
- + (WebRtc_Word16)WEBRTC_SPL_MUL_16_16(factor, (out_length - 1)) + 1;
-
- if (in_length < endpos)
- {
- return -1;
- }
-
- for (i = delay; i < endpos; i += factor)
- {
- b_ptr = &B[0];
- x_ptr = &in_ptr[i];
-
- o = (WebRtc_Word32)2048; // Round val
-
- for (j = 0; j < B_length; j++)
- {
- o += WEBRTC_SPL_MUL_16_16(*b_ptr++, *x_ptr--);
- }
-
- o = WEBRTC_SPL_RSHIFT_W32(o, 12);
-
- // If output is higher than 32768, saturate it. Same with negative side
-
- *downsampled_ptr++ = (WebRtc_Word16)WEBRTC_SPL_SAT(32767, o, -32768);
- }
-
- return 0;
-}
diff --git a/src/common_audio/signal_processing_library/main/source/energy.c b/src/common_audio/signal_processing_library/main/source/energy.c
deleted file mode 100644
index e8fdf94..0000000
--- a/src/common_audio/signal_processing_library/main/source/energy.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_Energy().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-WebRtc_Word32 WebRtcSpl_Energy(WebRtc_Word16* vector, int vector_length, int* scale_factor)
-{
- WebRtc_Word32 en = 0;
- int i;
- int scaling = WebRtcSpl_GetScalingSquare(vector, vector_length, vector_length);
- int looptimes = vector_length;
- WebRtc_Word16 *vectorptr = vector;
-
- for (i = 0; i < looptimes; i++)
- {
- en += WEBRTC_SPL_MUL_16_16_RSFT(*vectorptr, *vectorptr, scaling);
- vectorptr++;
- }
- *scale_factor = scaling;
-
- return en;
-}
diff --git a/src/common_audio/signal_processing_library/main/source/filter_ar.c b/src/common_audio/signal_processing_library/main/source/filter_ar.c
deleted file mode 100644
index 30a56c1..0000000
--- a/src/common_audio/signal_processing_library/main/source/filter_ar.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_FilterAR().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-int WebRtcSpl_FilterAR(G_CONST WebRtc_Word16* a,
- int a_length,
- G_CONST WebRtc_Word16* x,
- int x_length,
- WebRtc_Word16* state,
- int state_length,
- WebRtc_Word16* state_low,
- int state_low_length,
- WebRtc_Word16* filtered,
- WebRtc_Word16* filtered_low,
- int filtered_low_length)
-{
- WebRtc_Word32 o;
- WebRtc_Word32 oLOW;
- int i, j, stop;
- G_CONST WebRtc_Word16* x_ptr = &x[0];
- WebRtc_Word16* filteredFINAL_ptr = filtered;
- WebRtc_Word16* filteredFINAL_LOW_ptr = filtered_low;
-
- state_low_length = state_low_length;
- filtered_low_length = filtered_low_length;
-
- for (i = 0; i < x_length; i++)
- {
- // Calculate filtered[i] and filtered_low[i]
- G_CONST WebRtc_Word16* a_ptr = &a[1];
- WebRtc_Word16* filtered_ptr = &filtered[i - 1];
- WebRtc_Word16* filtered_low_ptr = &filtered_low[i - 1];
- WebRtc_Word16* state_ptr = &state[state_length - 1];
- WebRtc_Word16* state_low_ptr = &state_low[state_length - 1];
-
- o = (WebRtc_Word32)(*x_ptr++) << 12;
- oLOW = (WebRtc_Word32)0;
-
- stop = (i < a_length) ? i + 1 : a_length;
- for (j = 1; j < stop; j++)
- {
- o -= WEBRTC_SPL_MUL_16_16(*a_ptr, *filtered_ptr--);
- oLOW -= WEBRTC_SPL_MUL_16_16(*a_ptr++, *filtered_low_ptr--);
- }
- for (j = i + 1; j < a_length; j++)
- {
- o -= WEBRTC_SPL_MUL_16_16(*a_ptr, *state_ptr--);
- oLOW -= WEBRTC_SPL_MUL_16_16(*a_ptr++, *state_low_ptr--);
- }
-
- o += (oLOW >> 12);
- *filteredFINAL_ptr = (WebRtc_Word16)((o + (WebRtc_Word32)2048) >> 12);
- *filteredFINAL_LOW_ptr++ = (WebRtc_Word16)(o - ((WebRtc_Word32)(*filteredFINAL_ptr++)
- << 12));
- }
-
- // Save the filter state
- if (x_length >= state_length)
- {
- WebRtcSpl_CopyFromEndW16(filtered, x_length, a_length - 1, state);
- WebRtcSpl_CopyFromEndW16(filtered_low, x_length, a_length - 1, state_low);
- } else
- {
- for (i = 0; i < state_length - x_length; i++)
- {
- state[i] = state[i + x_length];
- state_low[i] = state_low[i + x_length];
- }
- for (i = 0; i < x_length; i++)
- {
- state[state_length - x_length + i] = filtered[i];
- state[state_length - x_length + i] = filtered_low[i];
- }
- }
-
- return x_length;
-}
diff --git a/src/common_audio/signal_processing_library/main/source/filter_ar_fast_q12.c b/src/common_audio/signal_processing_library/main/source/filter_ar_fast_q12.c
deleted file mode 100644
index 6184da3..0000000
--- a/src/common_audio/signal_processing_library/main/source/filter_ar_fast_q12.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_FilterARFastQ12().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-void WebRtcSpl_FilterARFastQ12(WebRtc_Word16 *in, WebRtc_Word16 *out, WebRtc_Word16 *A,
- WebRtc_Word16 A_length, WebRtc_Word16 length)
-{
- WebRtc_Word32 o;
- int i, j;
-
- WebRtc_Word16 *x_ptr = &in[0];
- WebRtc_Word16 *filtered_ptr = &out[0];
-
- for (i = 0; i < length; i++)
- {
- // Calculate filtered[i]
- G_CONST WebRtc_Word16 *a_ptr = &A[0];
- WebRtc_Word16 *state_ptr = &out[i - 1];
-
- o = WEBRTC_SPL_MUL_16_16(*x_ptr++, *a_ptr++);
-
- for (j = 1; j < A_length; j++)
- {
- o -= WEBRTC_SPL_MUL_16_16(*a_ptr++,*state_ptr--);
- }
-
- // Saturate the output
- o = WEBRTC_SPL_SAT((WebRtc_Word32)134215679, o, (WebRtc_Word32)-134217728);
-
- *filtered_ptr++ = (WebRtc_Word16)((o + (WebRtc_Word32)2048) >> 12);
- }
-
- return;
-}
diff --git a/src/common_audio/signal_processing_library/main/source/filter_ma_fast_q12.c b/src/common_audio/signal_processing_library/main/source/filter_ma_fast_q12.c
deleted file mode 100644
index 19ad9b1..0000000
--- a/src/common_audio/signal_processing_library/main/source/filter_ma_fast_q12.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_FilterMAFastQ12().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-void WebRtcSpl_FilterMAFastQ12(WebRtc_Word16* in_ptr,
- WebRtc_Word16* out_ptr,
- WebRtc_Word16* B,
- WebRtc_Word16 B_length,
- WebRtc_Word16 length)
-{
- WebRtc_Word32 o;
- int i, j;
- for (i = 0; i < length; i++)
- {
- G_CONST WebRtc_Word16* b_ptr = &B[0];
- G_CONST WebRtc_Word16* x_ptr = &in_ptr[i];
-
- o = (WebRtc_Word32)0;
-
- for (j = 0; j < B_length; j++)
- {
- o += WEBRTC_SPL_MUL_16_16(*b_ptr++, *x_ptr--);
- }
-
- // If output is higher than 32768, saturate it. Same with negative side
- // 2^27 = 134217728, which corresponds to 32768 in Q12
-
- // Saturate the output
- o = WEBRTC_SPL_SAT((WebRtc_Word32)134215679, o, (WebRtc_Word32)-134217728);
-
- *out_ptr++ = (WebRtc_Word16)((o + (WebRtc_Word32)2048) >> 12);
- }
- return;
-}
diff --git a/src/common_audio/signal_processing_library/main/source/get_hanning_window.c b/src/common_audio/signal_processing_library/main/source/get_hanning_window.c
deleted file mode 100644
index 2845c83..0000000
--- a/src/common_audio/signal_processing_library/main/source/get_hanning_window.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_GetHanningWindow().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-void WebRtcSpl_GetHanningWindow(WebRtc_Word16 *v, WebRtc_Word16 size)
-{
- int jj;
- WebRtc_Word16 *vptr1;
-
- WebRtc_Word32 index;
- WebRtc_Word32 factor = ((WebRtc_Word32)0x40000000);
-
- factor = WebRtcSpl_DivW32W16(factor, size);
- if (size < 513)
- index = (WebRtc_Word32)-0x200000;
- else
- index = (WebRtc_Word32)-0x100000;
- vptr1 = v;
-
- for (jj = 0; jj < size; jj++)
- {
- index += factor;
- (*vptr1++) = WebRtcSpl_kHanningTable[index >> 22];
- }
-
-}
diff --git a/src/common_audio/signal_processing_library/main/source/get_scaling_square.c b/src/common_audio/signal_processing_library/main/source/get_scaling_square.c
deleted file mode 100644
index dccbf33..0000000
--- a/src/common_audio/signal_processing_library/main/source/get_scaling_square.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_GetScalingSquare().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-int WebRtcSpl_GetScalingSquare(WebRtc_Word16 *in_vector, int in_vector_length, int times)
-{
- int nbits = WebRtcSpl_GetSizeInBits(times);
- int i;
- WebRtc_Word16 smax = -1;
- WebRtc_Word16 sabs;
- WebRtc_Word16 *sptr = in_vector;
- int t;
- int looptimes = in_vector_length;
-
- for (i = looptimes; i > 0; i--)
- {
- sabs = (*sptr > 0 ? *sptr++ : -*sptr++);
- smax = (sabs > smax ? sabs : smax);
- }
- t = WebRtcSpl_NormW32(WEBRTC_SPL_MUL(smax, smax));
-
- if (smax == 0)
- {
- return 0; // Since norm(0) returns 0
- } else
- {
- return (t > nbits) ? 0 : nbits - t;
- }
-}
diff --git a/src/common_audio/signal_processing_library/main/source/get_size_in_bits.c b/src/common_audio/signal_processing_library/main/source/get_size_in_bits.c
deleted file mode 100644
index 53853f0..0000000
--- a/src/common_audio/signal_processing_library/main/source/get_size_in_bits.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_GetSizeInBits().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-#ifndef SPL_NO_DOUBLE_IMPLEMENTATIONS
-
-WebRtc_Word16 WebRtcSpl_GetSizeInBits(WebRtc_UWord32 value)
-{
-
- int bits = 0;
-
- // Fast binary search to find the number of bits used
- if ((0xFFFF0000 & value))
- bits = 16;
- if ((0x0000FF00 & (value >> bits)))
- bits += 8;
- if ((0x000000F0 & (value >> bits)))
- bits += 4;
- if ((0x0000000C & (value >> bits)))
- bits += 2;
- if ((0x00000002 & (value >> bits)))
- bits += 1;
- if ((0x00000001 & (value >> bits)))
- bits += 1;
-
- return bits;
-}
-
-#endif
diff --git a/src/common_audio/signal_processing_library/main/source/hanning_table.c b/src/common_audio/signal_processing_library/main/source/hanning_table.c
deleted file mode 100644
index 112d0e5..0000000
--- a/src/common_audio/signal_processing_library/main/source/hanning_table.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the Hanning table with 256 entries.
- *
- */
-
-#include "signal_processing_library.h"
-
-// Hanning table with 256 entries
-WebRtc_Word16 WebRtcSpl_kHanningTable[] = {
- 1, 2, 6, 10, 15, 22, 30, 39,
- 50, 62, 75, 89, 104, 121, 138, 157,
- 178, 199, 222, 246, 271, 297, 324, 353,
- 383, 413, 446, 479, 513, 549, 586, 624,
- 663, 703, 744, 787, 830, 875, 920, 967,
- 1015, 1064, 1114, 1165, 1218, 1271, 1325, 1381,
- 1437, 1494, 1553, 1612, 1673, 1734, 1796, 1859,
- 1924, 1989, 2055, 2122, 2190, 2259, 2329, 2399,
- 2471, 2543, 2617, 2691, 2765, 2841, 2918, 2995,
- 3073, 3152, 3232, 3312, 3393, 3475, 3558, 3641,
- 3725, 3809, 3895, 3980, 4067, 4154, 4242, 4330,
- 4419, 4509, 4599, 4689, 4781, 4872, 4964, 5057,
- 5150, 5244, 5338, 5432, 5527, 5622, 5718, 5814,
- 5910, 6007, 6104, 6202, 6299, 6397, 6495, 6594,
- 6693, 6791, 6891, 6990, 7090, 7189, 7289, 7389,
- 7489, 7589, 7690, 7790, 7890, 7991, 8091, 8192,
- 8293, 8393, 8494, 8594, 8694, 8795, 8895, 8995,
- 9095, 9195, 9294, 9394, 9493, 9593, 9691, 9790,
- 9889, 9987, 10085, 10182, 10280, 10377, 10474, 10570,
-10666, 10762, 10857, 10952, 11046, 11140, 11234, 11327,
-11420, 11512, 11603, 11695, 11785, 11875, 11965, 12054,
-12142, 12230, 12317, 12404, 12489, 12575, 12659, 12743,
-12826, 12909, 12991, 13072, 13152, 13232, 13311, 13389,
-13466, 13543, 13619, 13693, 13767, 13841, 13913, 13985,
-14055, 14125, 14194, 14262, 14329, 14395, 14460, 14525,
-14588, 14650, 14711, 14772, 14831, 14890, 14947, 15003,
-15059, 15113, 15166, 15219, 15270, 15320, 15369, 15417,
-15464, 15509, 15554, 15597, 15640, 15681, 15721, 15760,
-15798, 15835, 15871, 15905, 15938, 15971, 16001, 16031,
-16060, 16087, 16113, 16138, 16162, 16185, 16206, 16227,
-16246, 16263, 16280, 16295, 16309, 16322, 16334, 16345,
-16354, 16362, 16369, 16374, 16378, 16382, 16383, 16384
-};
diff --git a/src/common_audio/signal_processing_library/main/source/ilbc_specific_functions.c b/src/common_audio/signal_processing_library/main/source/ilbc_specific_functions.c
deleted file mode 100644
index 5a9e577..0000000
--- a/src/common_audio/signal_processing_library/main/source/ilbc_specific_functions.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains implementations of the iLBC specific functions
- * WebRtcSpl_ScaleAndAddVectorsWithRound()
- * WebRtcSpl_ReverseOrderMultArrayElements()
- * WebRtcSpl_ElementwiseVectorMult()
- * WebRtcSpl_AddVectorsAndShift()
- * WebRtcSpl_AddAffineVectorToVector()
- * WebRtcSpl_AffineTransformVector()
- *
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-void WebRtcSpl_ScaleAndAddVectorsWithRound(WebRtc_Word16 *vector1, WebRtc_Word16 scale1,
- WebRtc_Word16 *vector2, WebRtc_Word16 scale2,
- WebRtc_Word16 right_shifts, WebRtc_Word16 *out,
- WebRtc_Word16 vector_length)
-{
- int i;
- WebRtc_Word16 roundVal;
- roundVal = 1 << right_shifts;
- roundVal = roundVal >> 1;
- for (i = 0; i < vector_length; i++)
- {
- out[i] = (WebRtc_Word16)((WEBRTC_SPL_MUL_16_16(vector1[i], scale1)
- + WEBRTC_SPL_MUL_16_16(vector2[i], scale2) + roundVal) >> right_shifts);
- }
-}
-
-void WebRtcSpl_ReverseOrderMultArrayElements(WebRtc_Word16 *out, G_CONST WebRtc_Word16 *in,
- G_CONST WebRtc_Word16 *win,
- WebRtc_Word16 vector_length,
- WebRtc_Word16 right_shifts)
-{
- int i;
- WebRtc_Word16 *outptr = out;
- G_CONST WebRtc_Word16 *inptr = in;
- G_CONST WebRtc_Word16 *winptr = win;
- for (i = 0; i < vector_length; i++)
- {
- (*outptr++) = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(*inptr++,
- *winptr--, right_shifts);
- }
-}
-
-void WebRtcSpl_ElementwiseVectorMult(WebRtc_Word16 *out, G_CONST WebRtc_Word16 *in,
- G_CONST WebRtc_Word16 *win, WebRtc_Word16 vector_length,
- WebRtc_Word16 right_shifts)
-{
- int i;
- WebRtc_Word16 *outptr = out;
- G_CONST WebRtc_Word16 *inptr = in;
- G_CONST WebRtc_Word16 *winptr = win;
- for (i = 0; i < vector_length; i++)
- {
- (*outptr++) = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(*inptr++,
- *winptr++, right_shifts);
- }
-}
-
-void WebRtcSpl_AddVectorsAndShift(WebRtc_Word16 *out, G_CONST WebRtc_Word16 *in1,
- G_CONST WebRtc_Word16 *in2, WebRtc_Word16 vector_length,
- WebRtc_Word16 right_shifts)
-{
- int i;
- WebRtc_Word16 *outptr = out;
- G_CONST WebRtc_Word16 *in1ptr = in1;
- G_CONST WebRtc_Word16 *in2ptr = in2;
- for (i = vector_length; i > 0; i--)
- {
- (*outptr++) = (WebRtc_Word16)(((*in1ptr++) + (*in2ptr++)) >> right_shifts);
- }
-}
-
-void WebRtcSpl_AddAffineVectorToVector(WebRtc_Word16 *out, WebRtc_Word16 *in,
- WebRtc_Word16 gain, WebRtc_Word32 add_constant,
- WebRtc_Word16 right_shifts, int vector_length)
-{
- WebRtc_Word16 *inPtr;
- WebRtc_Word16 *outPtr;
- int i;
-
- inPtr = in;
- outPtr = out;
- for (i = 0; i < vector_length; i++)
- {
- (*outPtr++) += (WebRtc_Word16)((WEBRTC_SPL_MUL_16_16((*inPtr++), gain)
- + (WebRtc_Word32)add_constant) >> right_shifts);
- }
-}
-
-void WebRtcSpl_AffineTransformVector(WebRtc_Word16 *out, WebRtc_Word16 *in,
- WebRtc_Word16 gain, WebRtc_Word32 add_constant,
- WebRtc_Word16 right_shifts, int vector_length)
-{
- WebRtc_Word16 *inPtr;
- WebRtc_Word16 *outPtr;
- int i;
-
- inPtr = in;
- outPtr = out;
- for (i = 0; i < vector_length; i++)
- {
- (*outPtr++) = (WebRtc_Word16)((WEBRTC_SPL_MUL_16_16((*inPtr++), gain)
- + (WebRtc_Word32)add_constant) >> right_shifts);
- }
-}
diff --git a/src/common_audio/signal_processing_library/main/source/levinson_durbin.c b/src/common_audio/signal_processing_library/main/source/levinson_durbin.c
deleted file mode 100644
index 4e11cdb..0000000
--- a/src/common_audio/signal_processing_library/main/source/levinson_durbin.c
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_LevinsonDurbin().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-#define SPL_LEVINSON_MAXORDER 20
-
-WebRtc_Word16 WebRtcSpl_LevinsonDurbin(WebRtc_Word32 *R, WebRtc_Word16 *A, WebRtc_Word16 *K,
- WebRtc_Word16 order)
-{
- WebRtc_Word16 i, j;
- // Auto-correlation coefficients in high precision
- WebRtc_Word16 R_hi[SPL_LEVINSON_MAXORDER + 1], R_low[SPL_LEVINSON_MAXORDER + 1];
- // LPC coefficients in high precision
- WebRtc_Word16 A_hi[SPL_LEVINSON_MAXORDER + 1], A_low[SPL_LEVINSON_MAXORDER + 1];
- // LPC coefficients for next iteration
- WebRtc_Word16 A_upd_hi[SPL_LEVINSON_MAXORDER + 1], A_upd_low[SPL_LEVINSON_MAXORDER + 1];
- // Reflection coefficient in high precision
- WebRtc_Word16 K_hi, K_low;
- // Prediction gain Alpha in high precision and with scale factor
- WebRtc_Word16 Alpha_hi, Alpha_low, Alpha_exp;
- WebRtc_Word16 tmp_hi, tmp_low;
- WebRtc_Word32 temp1W32, temp2W32, temp3W32;
- WebRtc_Word16 norm;
-
- // Normalize the autocorrelation R[0]...R[order+1]
-
- norm = WebRtcSpl_NormW32(R[0]);
-
- for (i = order; i >= 0; i--)
- {
- temp1W32 = WEBRTC_SPL_LSHIFT_W32(R[i], norm);
- // Put R in hi and low format
- R_hi[i] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(temp1W32, 16);
- R_low[i] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((temp1W32
- - WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)R_hi[i], 16)), 1);
- }
-
- // K = A[1] = -R[1] / R[0]
-
- temp2W32 = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)R_hi[1],16)
- + WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)R_low[1],1); // R[1] in Q31
- temp3W32 = WEBRTC_SPL_ABS_W32(temp2W32); // abs R[1]
- temp1W32 = WebRtcSpl_DivW32HiLow(temp3W32, R_hi[0], R_low[0]); // abs(R[1])/R[0] in Q31
- // Put back the sign on R[1]
- if (temp2W32 > 0)
- {
- temp1W32 = -temp1W32;
- }
-
- // Put K in hi and low format
- K_hi = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(temp1W32, 16);
- K_low = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((temp1W32
- - WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)K_hi, 16)), 1);
-
- // Store first reflection coefficient
- K[0] = K_hi;
-
- temp1W32 = WEBRTC_SPL_RSHIFT_W32(temp1W32, 4); // A[1] in Q27
-
- // Put A[1] in hi and low format
- A_hi[1] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(temp1W32, 16);
- A_low[1] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((temp1W32
- - WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)A_hi[1], 16)), 1);
-
- // Alpha = R[0] * (1-K^2)
-
- temp1W32 = (((WEBRTC_SPL_MUL_16_16(K_hi, K_low) >> 14) + WEBRTC_SPL_MUL_16_16(K_hi, K_hi))
- << 1); // temp1W32 = k^2 in Q31
-
- temp1W32 = WEBRTC_SPL_ABS_W32(temp1W32); // Guard against <0
- temp1W32 = (WebRtc_Word32)0x7fffffffL - temp1W32; // temp1W32 = (1 - K[0]*K[0]) in Q31
-
- // Store temp1W32 = 1 - K[0]*K[0] on hi and low format
- tmp_hi = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(temp1W32, 16);
- tmp_low = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((temp1W32
- - WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)tmp_hi, 16)), 1);
-
- // Calculate Alpha in Q31
- temp1W32 = ((WEBRTC_SPL_MUL_16_16(R_hi[0], tmp_hi)
- + (WEBRTC_SPL_MUL_16_16(R_hi[0], tmp_low) >> 15)
- + (WEBRTC_SPL_MUL_16_16(R_low[0], tmp_hi) >> 15)) << 1);
-
- // Normalize Alpha and put it in hi and low format
-
- Alpha_exp = WebRtcSpl_NormW32(temp1W32);
- temp1W32 = WEBRTC_SPL_LSHIFT_W32(temp1W32, Alpha_exp);
- Alpha_hi = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(temp1W32, 16);
- Alpha_low = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((temp1W32
- - WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)Alpha_hi, 16)), 1);
-
- // Perform the iterative calculations in the Levinson-Durbin algorithm
-
- for (i = 2; i <= order; i++)
- {
- /* ----
- temp1W32 = R[i] + > R[j]*A[i-j]
- /
- ----
- j=1..i-1
- */
-
- temp1W32 = 0;
-
- for (j = 1; j < i; j++)
- {
- // temp1W32 is in Q31
- temp1W32 += ((WEBRTC_SPL_MUL_16_16(R_hi[j], A_hi[i-j]) << 1)
- + (((WEBRTC_SPL_MUL_16_16(R_hi[j], A_low[i-j]) >> 15)
- + (WEBRTC_SPL_MUL_16_16(R_low[j], A_hi[i-j]) >> 15)) << 1));
- }
-
- temp1W32 = WEBRTC_SPL_LSHIFT_W32(temp1W32, 4);
- temp1W32 += (WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)R_hi[i], 16)
- + WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)R_low[i], 1));
-
- // K = -temp1W32 / Alpha
- temp2W32 = WEBRTC_SPL_ABS_W32(temp1W32); // abs(temp1W32)
- temp3W32 = WebRtcSpl_DivW32HiLow(temp2W32, Alpha_hi, Alpha_low); // abs(temp1W32)/Alpha
-
- // Put the sign of temp1W32 back again
- if (temp1W32 > 0)
- {
- temp3W32 = -temp3W32;
- }
-
- // Use the Alpha shifts from earlier to de-normalize
- norm = WebRtcSpl_NormW32(temp3W32);
- if ((Alpha_exp <= norm) || (temp3W32 == 0))
- {
- temp3W32 = WEBRTC_SPL_LSHIFT_W32(temp3W32, Alpha_exp);
- } else
- {
- if (temp3W32 > 0)
- {
- temp3W32 = (WebRtc_Word32)0x7fffffffL;
- } else
- {
- temp3W32 = (WebRtc_Word32)0x80000000L;
- }
- }
-
- // Put K on hi and low format
- K_hi = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(temp3W32, 16);
- K_low = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((temp3W32
- - WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)K_hi, 16)), 1);
-
- // Store Reflection coefficient in Q15
- K[i - 1] = K_hi;
-
- // Test for unstable filter.
- // If unstable return 0 and let the user decide what to do in that case
-
- if ((WebRtc_Word32)WEBRTC_SPL_ABS_W16(K_hi) > (WebRtc_Word32)32750)
- {
- return 0; // Unstable filter
- }
-
- /*
- Compute updated LPC coefficient: Anew[i]
- Anew[j]= A[j] + K*A[i-j] for j=1..i-1
- Anew[i]= K
- */
-
- for (j = 1; j < i; j++)
- {
- // temp1W32 = A[j] in Q27
- temp1W32 = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)A_hi[j],16)
- + WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)A_low[j],1);
-
- // temp1W32 += K*A[i-j] in Q27
- temp1W32 += ((WEBRTC_SPL_MUL_16_16(K_hi, A_hi[i-j])
- + (WEBRTC_SPL_MUL_16_16(K_hi, A_low[i-j]) >> 15)
- + (WEBRTC_SPL_MUL_16_16(K_low, A_hi[i-j]) >> 15)) << 1);
-
- // Put Anew in hi and low format
- A_upd_hi[j] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(temp1W32, 16);
- A_upd_low[j] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((temp1W32
- - WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)A_upd_hi[j], 16)), 1);
- }
-
- // temp3W32 = K in Q27 (Convert from Q31 to Q27)
- temp3W32 = WEBRTC_SPL_RSHIFT_W32(temp3W32, 4);
-
- // Store Anew in hi and low format
- A_upd_hi[i] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(temp3W32, 16);
- A_upd_low[i] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((temp3W32
- - WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)A_upd_hi[i], 16)), 1);
-
- // Alpha = Alpha * (1-K^2)
-
- temp1W32 = (((WEBRTC_SPL_MUL_16_16(K_hi, K_low) >> 14)
- + WEBRTC_SPL_MUL_16_16(K_hi, K_hi)) << 1); // K*K in Q31
-
- temp1W32 = WEBRTC_SPL_ABS_W32(temp1W32); // Guard against <0
- temp1W32 = (WebRtc_Word32)0x7fffffffL - temp1W32; // 1 - K*K in Q31
-
- // Convert 1- K^2 in hi and low format
- tmp_hi = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(temp1W32, 16);
- tmp_low = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((temp1W32
- - WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)tmp_hi, 16)), 1);
-
- // Calculate Alpha = Alpha * (1-K^2) in Q31
- temp1W32 = ((WEBRTC_SPL_MUL_16_16(Alpha_hi, tmp_hi)
- + (WEBRTC_SPL_MUL_16_16(Alpha_hi, tmp_low) >> 15)
- + (WEBRTC_SPL_MUL_16_16(Alpha_low, tmp_hi) >> 15)) << 1);
-
- // Normalize Alpha and store it on hi and low format
-
- norm = WebRtcSpl_NormW32(temp1W32);
- temp1W32 = WEBRTC_SPL_LSHIFT_W32(temp1W32, norm);
-
- Alpha_hi = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(temp1W32, 16);
- Alpha_low = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((temp1W32
- - WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)Alpha_hi, 16)), 1);
-
- // Update the total normalization of Alpha
- Alpha_exp = Alpha_exp + norm;
-
- // Update A[]
-
- for (j = 1; j <= i; j++)
- {
- A_hi[j] = A_upd_hi[j];
- A_low[j] = A_upd_low[j];
- }
- }
-
- /*
- Set A[0] to 1.0 and store the A[i] i=1...order in Q12
- (Convert from Q27 and use rounding)
- */
-
- A[0] = 4096;
-
- for (i = 1; i <= order; i++)
- {
- // temp1W32 in Q27
- temp1W32 = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)A_hi[i], 16)
- + WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)A_low[i], 1);
- // Round and store upper word
- A[i] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((temp1W32<<1)+(WebRtc_Word32)32768, 16);
- }
- return 1; // Stable filters
-}
diff --git a/src/common_audio/signal_processing_library/main/source/lpc_to_refl_coef.c b/src/common_audio/signal_processing_library/main/source/lpc_to_refl_coef.c
deleted file mode 100644
index 2cb83c2..0000000
--- a/src/common_audio/signal_processing_library/main/source/lpc_to_refl_coef.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_LpcToReflCoef().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-#define SPL_LPC_TO_REFL_COEF_MAX_AR_MODEL_ORDER 50
-
-void WebRtcSpl_LpcToReflCoef(WebRtc_Word16* a16, int use_order, WebRtc_Word16* k16)
-{
- int m, k;
- WebRtc_Word32 tmp32[SPL_LPC_TO_REFL_COEF_MAX_AR_MODEL_ORDER];
- WebRtc_Word32 tmp_inv_denom32;
- WebRtc_Word16 tmp_inv_denom16;
-
- k16[use_order - 1] = WEBRTC_SPL_LSHIFT_W16(a16[use_order], 3); //Q12<<3 => Q15
- for (m = use_order - 1; m > 0; m--)
- {
- // (1 - k^2) in Q30
- tmp_inv_denom32 = ((WebRtc_Word32)1073741823) - WEBRTC_SPL_MUL_16_16(k16[m], k16[m]);
- // (1 - k^2) in Q15
- tmp_inv_denom16 = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp_inv_denom32, 15);
-
- for (k = 1; k <= m; k++)
- {
- // tmp[k] = (a[k] - RC[m] * a[m-k+1]) / (1.0 - RC[m]*RC[m]);
-
- // [Q12<<16 - (Q15*Q12)<<1] = [Q28 - Q28] = Q28
- tmp32[k] = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)a16[k], 16)
- - WEBRTC_SPL_LSHIFT_W32(WEBRTC_SPL_MUL_16_16(k16[m], a16[m-k+1]), 1);
-
- tmp32[k] = WebRtcSpl_DivW32W16(tmp32[k], tmp_inv_denom16); //Q28/Q15 = Q13
- }
-
- for (k = 1; k < m; k++)
- {
- a16[k] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32[k], 1); //Q13>>1 => Q12
- }
-
- tmp32[m] = WEBRTC_SPL_SAT(8191, tmp32[m], -8191);
- k16[m - 1] = (WebRtc_Word16)WEBRTC_SPL_LSHIFT_W32(tmp32[m], 2); //Q13<<2 => Q15
- }
- return;
-}
diff --git a/src/common_audio/signal_processing_library/main/source/min_max_operations.c b/src/common_audio/signal_processing_library/main/source/min_max_operations.c
deleted file mode 100644
index cf5e9a7..0000000
--- a/src/common_audio/signal_processing_library/main/source/min_max_operations.c
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-/*
- * This file contains the implementation of functions
- * WebRtcSpl_MaxAbsValueW16()
- * WebRtcSpl_MaxAbsIndexW16()
- * WebRtcSpl_MaxAbsValueW32()
- * WebRtcSpl_MaxValueW16()
- * WebRtcSpl_MaxIndexW16()
- * WebRtcSpl_MaxValueW32()
- * WebRtcSpl_MaxIndexW32()
- * WebRtcSpl_MinValueW16()
- * WebRtcSpl_MinIndexW16()
- * WebRtcSpl_MinValueW32()
- * WebRtcSpl_MinIndexW32()
- *
- * The description header can be found in signal_processing_library.h.
- *
- */
-
-#include "signal_processing_library.h"
-
-// Maximum absolute value of word16 vector.
-WebRtc_Word16 WebRtcSpl_MaxAbsValueW16(G_CONST WebRtc_Word16 *vector, WebRtc_Word16 length)
-{
- WebRtc_Word32 tempMax = 0;
- WebRtc_Word32 absVal;
- WebRtc_Word16 totMax;
- int i;
- G_CONST WebRtc_Word16 *tmpvector = vector;
-
-#ifdef _ARM_OPT_
-#pragma message("NOTE: _ARM_OPT_ optimizations are used")
-
- WebRtc_Word16 len4 = (length >> 2) << 2;
-
- for (i = 0; i < len4; i = i + 4)
- {
- absVal = WEBRTC_SPL_ABS_W32((*tmpvector));
- if (absVal > tempMax)
- {
- tempMax = absVal;
- }
- tmpvector++;
- absVal = WEBRTC_SPL_ABS_W32((*tmpvector));
- if (absVal > tempMax)
- {
- tempMax = absVal;
- }
- tmpvector++;
- absVal = WEBRTC_SPL_ABS_W32((*tmpvector));
- if (absVal > tempMax)
- {
- tempMax = absVal;
- }
- tmpvector++;
- absVal = WEBRTC_SPL_ABS_W32((*tmpvector));
- if (absVal > tempMax)
- {
- tempMax = absVal;
- }
- tmpvector++;
- }
-
- for (i = len4; i < len; i++)
- {
- absVal = WEBRTC_SPL_ABS_W32((*tmpvector));
- if (absVal > tempMax)
- {
- tempMax = absVal;
- }
- tmpvector++;
- }
-#else
- for (i = 0; i < length; i++)
- {
- absVal = WEBRTC_SPL_ABS_W32((*tmpvector));
- if (absVal > tempMax)
- {
- tempMax = absVal;
- }
- tmpvector++;
- }
- totMax = (WebRtc_Word16)WEBRTC_SPL_MIN(tempMax, WEBRTC_SPL_WORD16_MAX);
- return totMax;
-#endif
-}
-
-// Index of maximum absolute value in a word16 vector.
-WebRtc_Word16 WebRtcSpl_MaxAbsIndexW16(G_CONST WebRtc_Word16* vector, WebRtc_Word16 length)
-{
- WebRtc_Word16 tempMax;
- WebRtc_Word16 absTemp;
- WebRtc_Word16 tempMaxIndex = 0;
- WebRtc_Word16 i = 0;
- G_CONST WebRtc_Word16 *tmpvector = vector;
-
- tempMax = WEBRTC_SPL_ABS_W16(*tmpvector);
- tmpvector++;
- for (i = 1; i < length; i++)
- {
- absTemp = WEBRTC_SPL_ABS_W16(*tmpvector);
- tmpvector++;
- if (absTemp > tempMax)
- {
- tempMax = absTemp;
- tempMaxIndex = i;
- }
- }
- return tempMaxIndex;
-}
-
-// Maximum absolute value of word32 vector.
-WebRtc_Word32 WebRtcSpl_MaxAbsValueW32(G_CONST WebRtc_Word32 *vector, WebRtc_Word16 length)
-{
- WebRtc_UWord32 tempMax = 0;
- WebRtc_UWord32 absVal;
- WebRtc_Word32 retval;
- int i;
- G_CONST WebRtc_Word32 *tmpvector = vector;
-
- for (i = 0; i < length; i++)
- {
- absVal = WEBRTC_SPL_ABS_W32((*tmpvector));
- if (absVal > tempMax)
- {
- tempMax = absVal;
- }
- tmpvector++;
- }
- retval = (WebRtc_Word32)(WEBRTC_SPL_MIN(tempMax, WEBRTC_SPL_WORD32_MAX));
- return retval;
-}
-
-// Maximum value of word16 vector.
-#ifndef XSCALE_OPT
-WebRtc_Word16 WebRtcSpl_MaxValueW16(G_CONST WebRtc_Word16* vector, WebRtc_Word16 length)
-{
- WebRtc_Word16 tempMax;
- WebRtc_Word16 i;
- G_CONST WebRtc_Word16 *tmpvector = vector;
-
- tempMax = *tmpvector++;
- for (i = 1; i < length; i++)
- {
- if (*tmpvector++ > tempMax)
- tempMax = vector[i];
- }
- return tempMax;
-}
-#else
-#pragma message(">> WebRtcSpl_MaxValueW16 is excluded from this build")
-#endif
-
-// Index of maximum value in a word16 vector.
-WebRtc_Word16 WebRtcSpl_MaxIndexW16(G_CONST WebRtc_Word16 *vector, WebRtc_Word16 length)
-{
- WebRtc_Word16 tempMax;
- WebRtc_Word16 tempMaxIndex = 0;
- WebRtc_Word16 i = 0;
- G_CONST WebRtc_Word16 *tmpvector = vector;
-
- tempMax = *tmpvector++;
- for (i = 1; i < length; i++)
- {
- if (*tmpvector++ > tempMax)
- {
- tempMax = vector[i];
- tempMaxIndex = i;
- }
- }
- return tempMaxIndex;
-}
-
-// Maximum value of word32 vector.
-#ifndef XSCALE_OPT
-WebRtc_Word32 WebRtcSpl_MaxValueW32(G_CONST WebRtc_Word32* vector, WebRtc_Word16 length)
-{
- WebRtc_Word32 tempMax;
- WebRtc_Word16 i;
- G_CONST WebRtc_Word32 *tmpvector = vector;
-
- tempMax = *tmpvector++;
- for (i = 1; i < length; i++)
- {
- if (*tmpvector++ > tempMax)
- tempMax = vector[i];
- }
- return tempMax;
-}
-#else
-#pragma message(">> WebRtcSpl_MaxValueW32 is excluded from this build")
-#endif
-
-// Index of maximum value in a word32 vector.
-WebRtc_Word16 WebRtcSpl_MaxIndexW32(G_CONST WebRtc_Word32* vector, WebRtc_Word16 length)
-{
- WebRtc_Word32 tempMax;
- WebRtc_Word16 tempMaxIndex = 0;
- WebRtc_Word16 i = 0;
- G_CONST WebRtc_Word32 *tmpvector = vector;
-
- tempMax = *tmpvector++;
- for (i = 1; i < length; i++)
- {
- if (*tmpvector++ > tempMax)
- {
- tempMax = vector[i];
- tempMaxIndex = i;
- }
- }
- return tempMaxIndex;
-}
-
-// Minimum value of word16 vector.
-WebRtc_Word16 WebRtcSpl_MinValueW16(G_CONST WebRtc_Word16 *vector, WebRtc_Word16 length)
-{
- WebRtc_Word16 tempMin;
- WebRtc_Word16 i;
- G_CONST WebRtc_Word16 *tmpvector = vector;
-
- // Find the minimum value
- tempMin = *tmpvector++;
- for (i = 1; i < length; i++)
- {
- if (*tmpvector++ < tempMin)
- tempMin = (vector[i]);
- }
- return tempMin;
-}
-
-// Index of minimum value in a word16 vector.
-#ifndef XSCALE_OPT
-WebRtc_Word16 WebRtcSpl_MinIndexW16(G_CONST WebRtc_Word16* vector, WebRtc_Word16 length)
-{
- WebRtc_Word16 tempMin;
- WebRtc_Word16 tempMinIndex = 0;
- WebRtc_Word16 i = 0;
- G_CONST WebRtc_Word16* tmpvector = vector;
-
- // Find index of smallest value
- tempMin = *tmpvector++;
- for (i = 1; i < length; i++)
- {
- if (*tmpvector++ < tempMin)
- {
- tempMin = vector[i];
- tempMinIndex = i;
- }
- }
- return tempMinIndex;
-}
-#else
-#pragma message(">> WebRtcSpl_MinIndexW16 is excluded from this build")
-#endif
-
-// Minimum value of word32 vector.
-WebRtc_Word32 WebRtcSpl_MinValueW32(G_CONST WebRtc_Word32 *vector, WebRtc_Word16 length)
-{
- WebRtc_Word32 tempMin;
- WebRtc_Word16 i;
- G_CONST WebRtc_Word32 *tmpvector = vector;
-
- // Find the minimum value
- tempMin = *tmpvector++;
- for (i = 1; i < length; i++)
- {
- if (*tmpvector++ < tempMin)
- tempMin = (vector[i]);
- }
- return tempMin;
-}
-
-// Index of minimum value in a word32 vector.
-#ifndef XSCALE_OPT
-WebRtc_Word16 WebRtcSpl_MinIndexW32(G_CONST WebRtc_Word32* vector, WebRtc_Word16 length)
-{
- WebRtc_Word32 tempMin;
- WebRtc_Word16 tempMinIndex = 0;
- WebRtc_Word16 i = 0;
- G_CONST WebRtc_Word32 *tmpvector = vector;
-
- // Find index of smallest value
- tempMin = *tmpvector++;
- for (i = 1; i < length; i++)
- {
- if (*tmpvector++ < tempMin)
- {
- tempMin = vector[i];
- tempMinIndex = i;
- }
- }
- return tempMinIndex;
-}
-#else
-#pragma message(">> WebRtcSpl_MinIndexW32 is excluded from this build")
-#endif
diff --git a/src/common_audio/signal_processing_library/main/source/norm_u32.c b/src/common_audio/signal_processing_library/main/source/norm_u32.c
deleted file mode 100644
index c903a64..0000000
--- a/src/common_audio/signal_processing_library/main/source/norm_u32.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_NormU32().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-#ifndef SPL_NO_DOUBLE_IMPLEMENTATIONS
-
-int WebRtcSpl_NormU32(WebRtc_UWord32 value)
-{
- int zeros = 0;
-
- if (value == 0)
- return 0;
-
- if (!(0xFFFF0000 & value))
- zeros = 16;
- if (!(0xFF000000 & (value << zeros)))
- zeros += 8;
- if (!(0xF0000000 & (value << zeros)))
- zeros += 4;
- if (!(0xC0000000 & (value << zeros)))
- zeros += 2;
- if (!(0x80000000 & (value << zeros)))
- zeros += 1;
-
- return zeros;
-}
-#endif
diff --git a/src/common_audio/signal_processing_library/main/source/norm_w16.c b/src/common_audio/signal_processing_library/main/source/norm_w16.c
deleted file mode 100644
index be6711d..0000000
--- a/src/common_audio/signal_processing_library/main/source/norm_w16.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_NormW16().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-#ifndef SPL_NO_DOUBLE_IMPLEMENTATIONS
-
-int WebRtcSpl_NormW16(WebRtc_Word16 value)
-{
- int zeros = 0;
-
- if (value <= 0)
- value ^= 0xFFFF;
-
- if ( !(0xFF80 & value))
- zeros = 8;
- if ( !(0xF800 & (value << zeros)))
- zeros += 4;
- if ( !(0xE000 & (value << zeros)))
- zeros += 2;
- if ( !(0xC000 & (value << zeros)))
- zeros += 1;
-
- return zeros;
-}
-#endif
diff --git a/src/common_audio/signal_processing_library/main/source/norm_w32.c b/src/common_audio/signal_processing_library/main/source/norm_w32.c
deleted file mode 100644
index d456335..0000000
--- a/src/common_audio/signal_processing_library/main/source/norm_w32.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_NormW32().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-#ifndef SPL_NO_DOUBLE_IMPLEMENTATIONS
-
-int WebRtcSpl_NormW32(WebRtc_Word32 value)
-{
- int zeros = 0;
-
- if (value <= 0)
- value ^= 0xFFFFFFFF;
-
- // Fast binary search to determine the number of left shifts required to 32-bit normalize
- // the value
- if (!(0xFFFF8000 & value))
- zeros = 16;
- if (!(0xFF800000 & (value << zeros)))
- zeros += 8;
- if (!(0xF8000000 & (value << zeros)))
- zeros += 4;
- if (!(0xE0000000 & (value << zeros)))
- zeros += 2;
- if (!(0xC0000000 & (value << zeros)))
- zeros += 1;
-
- return zeros;
-}
-
-#endif
diff --git a/src/common_audio/signal_processing_library/main/source/randn_table.c b/src/common_audio/signal_processing_library/main/source/randn_table.c
deleted file mode 100644
index 734fa79..0000000
--- a/src/common_audio/signal_processing_library/main/source/randn_table.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * Table with 512 samples from a normal distribution with mean 1 and std 1
- * The values are shifted up 13 steps (multiplied by 8192)
- */
-
-#include "signal_processing_library.h"
-
-WebRtc_Word16 WebRtcSpl_kRandNTable[] =
-{
- 9178, -7260, 40, 10189, 4894, -3531, -13779, 14764,
- -4008, -8884, -8990, 1008, 7368, 5184, 3251, -5817,
- -9786, 5963, 1770, 8066, -7135, 10772, -2298, 1361,
- 6484, 2241, -8633, 792, 199, -3344, 6553, -10079,
- -15040, 95, 11608, -12469, 14161, -4176, 2476, 6403,
- 13685, -16005, 6646, 2239, 10916, -3004, -602, -3141,
- 2142, 14144, -5829, 5305, 8209, 4713, 2697, -5112,
- 16092, -1210, -2891, -6631, -5360, -11878, -6781, -2739,
- -6392, 536, 10923, 10872, 5059, -4748, -7770, 5477,
- 38, -1025, -2892, 1638, 6304, 14375, -11028, 1553,
- -1565, 10762, -393, 4040, 5257, 12310, 6554, -4799,
- 4899, -6354, 1603, -1048, -2220, 8247, -186, -8944,
- -12004, 2332, 4801, -4933, 6371, 131, 8614, -5927,
- -8287, -22760, 4033, -15162, 3385, 3246, 3153, -5250,
- 3766, 784, 6494, -62, 3531, -1582, 15572, 662,
- -3952, -330, -3196, 669, 7236, -2678, -6569, 23319,
- -8645, -741, 14830, -15976, 4903, 315, -11342, 10311,
- 1858, -7777, 2145, 5436, 5677, -113, -10033, 826,
- -1353, 17210, 7768, 986, -1471, 8291, -4982, 8207,
- -14911, -6255, -2449, -11881, -7059, -11703, -4338, 8025,
- 7538, -2823, -12490, 9470, -1613, -2529, -10092, -7807,
- 9480, 6970, -12844, 5123, 3532, 4816, 4803, -8455,
- -5045, 14032, -4378, -1643, 5756, -11041, -2732, -16618,
- -6430, -18375, -3320, 6098, 5131, -4269, -8840, 2482,
- -7048, 1547, -21890, -6505, -7414, -424, -11722, 7955,
- 1653, -17299, 1823, 473, -9232, 3337, 1111, 873,
- 4018, -8982, 9889, 3531, -11763, -3799, 7373, -4539,
- 3231, 7054, -8537, 7616, 6244, 16635, 447, -2915,
- 13967, 705, -2669, -1520, -1771, -16188, 5956, 5117,
- 6371, -9936, -1448, 2480, 5128, 7550, -8130, 5236,
- 8213, -6443, 7707, -1950, -13811, 7218, 7031, -3883,
- 67, 5731, -2874, 13480, -3743, 9298, -3280, 3552,
- -4425, -18, -3785, -9988, -5357, 5477, -11794, 2117,
- 1416, -9935, 3376, 802, -5079, -8243, 12652, 66,
- 3653, -2368, 6781, -21895, -7227, 2487, 7839, -385,
- 6646, -7016, -4658, 5531, -1705, 834, 129, 3694,
- -1343, 2238, -22640, -6417, -11139, 11301, -2945, -3494,
- -5626, 185, -3615, -2041, -7972, -3106, -60, -23497,
- -1566, 17064, 3519, 2518, 304, -6805, -10269, 2105,
- 1936, -426, -736, -8122, -1467, 4238, -6939, -13309,
- 360, 7402, -7970, 12576, 3287, 12194, -6289, -16006,
- 9171, 4042, -9193, 9123, -2512, 6388, -4734, -8739,
- 1028, -5406, -1696, 5889, -666, -4736, 4971, 3565,
- 9362, -6292, 3876, -3652, -19666, 7523, -4061, 391,
- -11773, 7502, -3763, 4929, -9478, 13278, 2805, 4496,
- 7814, 16419, 12455, -14773, 2127, -2746, 3763, 4847,
- 3698, 6978, 4751, -6957, -3581, -45, 6252, 1513,
- -4797, -7925, 11270, 16188, -2359, -5269, 9376, -10777,
- 7262, 20031, -6515, -2208, -5353, 8085, -1341, -1303,
- 7333, 5576, 3625, 5763, -7931, 9833, -3371, -10305,
- 6534, -13539, -9971, 997, 8464, -4064, -1495, 1857,
- 13624, 5458, 9490, -11086, -4524, 12022, -550, -198,
- 408, -8455, -7068, 10289, 9712, -3366, 9028, -7621,
- -5243, 2362, 6909, 4672, -4933, -1799, 4709, -4563,
- -62, -566, 1624, -7010, 14730, -17791, -3697, -2344,
- -1741, 7099, -9509, -6855, -1989, 3495, -2289, 2031,
- 12784, 891, 14189, -3963, -5683, 421, -12575, 1724,
- -12682, -5970, -8169, 3143, -1824, -5488, -5130, 8536,
- 12799, 794, 5738, 3459, -11689, -258, -3738, -3775,
- -8742, 2333, 8312, -9383, 10331, 13119, 8398, 10644,
- -19433, -6446, -16277, -11793, 16284, 9345, 15222, 15834,
- 2009, -7349, 130, -14547, 338, -5998, 3337, 21492,
- 2406, 7703, -951, 11196, -564, 3406, 2217, 4806,
- 2374, -5797, 11839, 8940, -11874, 18213, 2855, 10492
-};
diff --git a/src/common_audio/signal_processing_library/main/source/randomization_functions.c b/src/common_audio/signal_processing_library/main/source/randomization_functions.c
deleted file mode 100644
index 6bc87c7..0000000
--- a/src/common_audio/signal_processing_library/main/source/randomization_functions.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains implementations of the randomization functions
- * WebRtcSpl_IncreaseSeed()
- * WebRtcSpl_RandU()
- * WebRtcSpl_RandN()
- * WebRtcSpl_RandUArray()
- *
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-WebRtc_UWord32 WebRtcSpl_IncreaseSeed(WebRtc_UWord32 *seed)
-{
- seed[0] = (seed[0] * ((WebRtc_Word32)69069) + 1) & (WEBRTC_SPL_MAX_SEED_USED - 1);
- return seed[0];
-}
-
-WebRtc_Word16 WebRtcSpl_RandU(WebRtc_UWord32 *seed)
-{
- return (WebRtc_Word16)(WebRtcSpl_IncreaseSeed(seed) >> 16);
-}
-
-WebRtc_Word16 WebRtcSpl_RandN(WebRtc_UWord32 *seed)
-{
- return WebRtcSpl_kRandNTable[WebRtcSpl_IncreaseSeed(seed) >> 23];
-}
-
-// Creates an array of uniformly distributed variables
-WebRtc_Word16 WebRtcSpl_RandUArray(WebRtc_Word16* vector,
- WebRtc_Word16 vector_length,
- WebRtc_UWord32* seed)
-{
- int i;
- for (i = 0; i < vector_length; i++)
- {
- vector[i] = WebRtcSpl_RandU(seed);
- }
- return vector_length;
-}
diff --git a/src/common_audio/signal_processing_library/main/source/refl_coef_to_lpc.c b/src/common_audio/signal_processing_library/main/source/refl_coef_to_lpc.c
deleted file mode 100644
index d07804d..0000000
--- a/src/common_audio/signal_processing_library/main/source/refl_coef_to_lpc.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_ReflCoefToLpc().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-void WebRtcSpl_ReflCoefToLpc(G_CONST WebRtc_Word16 *k, int use_order, WebRtc_Word16 *a)
-{
- WebRtc_Word16 any[WEBRTC_SPL_MAX_LPC_ORDER + 1];
- WebRtc_Word16 *aptr, *aptr2, *anyptr;
- G_CONST WebRtc_Word16 *kptr;
- int m, i;
-
- kptr = k;
- *a = 4096; // i.e., (Word16_MAX >> 3)+1.
- *any = *a;
- a[1] = WEBRTC_SPL_RSHIFT_W16((*k), 3);
-
- for (m = 1; m < use_order; m++)
- {
- kptr++;
- aptr = a;
- aptr++;
- aptr2 = &a[m];
- anyptr = any;
- anyptr++;
-
- any[m + 1] = WEBRTC_SPL_RSHIFT_W16((*kptr), 3);
- for (i = 0; i < m; i++)
- {
- *anyptr = (*aptr)
- + (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT((*aptr2), (*kptr), 15);
- anyptr++;
- aptr++;
- aptr2--;
- }
-
- aptr = a;
- anyptr = any;
- for (i = 0; i < (m + 2); i++)
- {
- *aptr = *anyptr;
- aptr++;
- anyptr++;
- }
- }
-}
diff --git a/src/common_audio/signal_processing_library/main/source/resample.c b/src/common_audio/signal_processing_library/main/source/resample.c
deleted file mode 100644
index 19d1778..0000000
--- a/src/common_audio/signal_processing_library/main/source/resample.c
+++ /dev/null
@@ -1,505 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the resampling functions for 22 kHz.
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-#include "resample_by_2_internal.h"
-
-// Declaration of internally used functions
-static void WebRtcSpl_32khzTo22khzIntToShort(const WebRtc_Word32 *In, WebRtc_Word16 *Out,
- const WebRtc_Word32 K);
-
-void WebRtcSpl_32khzTo22khzIntToInt(const WebRtc_Word32 *In, WebRtc_Word32 *Out,
- const WebRtc_Word32 K);
-
-// interpolation coefficients
-static const WebRtc_Word16 kCoefficients32To22[5][9] = {
- {127, -712, 2359, -6333, 23456, 16775, -3695, 945, -154},
- {-39, 230, -830, 2785, 32366, -2324, 760, -218, 38},
- {117, -663, 2222, -6133, 26634, 13070, -3174, 831, -137},
- {-77, 457, -1677, 5958, 31175, -4136, 1405, -408, 71},
- { 98, -560, 1900, -5406, 29240, 9423, -2480, 663, -110}
-};
-
-//////////////////////
-// 22 kHz -> 16 kHz //
-//////////////////////
-
-// number of subblocks; options: 1, 2, 4, 5, 10
-#define SUB_BLOCKS_22_16 5
-
-// 22 -> 16 resampler
-void WebRtcSpl_Resample22khzTo16khz(const WebRtc_Word16* in, WebRtc_Word16* out,
- WebRtcSpl_State22khzTo16khz* state, WebRtc_Word32* tmpmem)
-{
- int k;
-
- // process two blocks of 10/SUB_BLOCKS_22_16 ms (to reduce temp buffer size)
- for (k = 0; k < SUB_BLOCKS_22_16; k++)
- {
- ///// 22 --> 44 /////
- // WebRtc_Word16 in[220/SUB_BLOCKS_22_16]
- // WebRtc_Word32 out[440/SUB_BLOCKS_22_16]
- /////
- WebRtcSpl_UpBy2ShortToInt(in, 220 / SUB_BLOCKS_22_16, tmpmem + 16, state->S_22_44);
-
- ///// 44 --> 32 /////
- // WebRtc_Word32 in[440/SUB_BLOCKS_22_16]
- // WebRtc_Word32 out[320/SUB_BLOCKS_22_16]
- /////
- // copy state to and from input array
- tmpmem[8] = state->S_44_32[0];
- tmpmem[9] = state->S_44_32[1];
- tmpmem[10] = state->S_44_32[2];
- tmpmem[11] = state->S_44_32[3];
- tmpmem[12] = state->S_44_32[4];
- tmpmem[13] = state->S_44_32[5];
- tmpmem[14] = state->S_44_32[6];
- tmpmem[15] = state->S_44_32[7];
- state->S_44_32[0] = tmpmem[440 / SUB_BLOCKS_22_16 + 8];
- state->S_44_32[1] = tmpmem[440 / SUB_BLOCKS_22_16 + 9];
- state->S_44_32[2] = tmpmem[440 / SUB_BLOCKS_22_16 + 10];
- state->S_44_32[3] = tmpmem[440 / SUB_BLOCKS_22_16 + 11];
- state->S_44_32[4] = tmpmem[440 / SUB_BLOCKS_22_16 + 12];
- state->S_44_32[5] = tmpmem[440 / SUB_BLOCKS_22_16 + 13];
- state->S_44_32[6] = tmpmem[440 / SUB_BLOCKS_22_16 + 14];
- state->S_44_32[7] = tmpmem[440 / SUB_BLOCKS_22_16 + 15];
-
- WebRtcSpl_Resample44khzTo32khz(tmpmem + 8, tmpmem, 40 / SUB_BLOCKS_22_16);
-
- ///// 32 --> 16 /////
- // WebRtc_Word32 in[320/SUB_BLOCKS_22_16]
- // WebRtc_Word32 out[160/SUB_BLOCKS_22_16]
- /////
- WebRtcSpl_DownBy2IntToShort(tmpmem, 320 / SUB_BLOCKS_22_16, out, state->S_32_16);
-
- // move input/output pointers 10/SUB_BLOCKS_22_16 ms seconds ahead
- in += 220 / SUB_BLOCKS_22_16;
- out += 160 / SUB_BLOCKS_22_16;
- }
-}
-
-// initialize state of 22 -> 16 resampler
-void WebRtcSpl_ResetResample22khzTo16khz(WebRtcSpl_State22khzTo16khz* state)
-{
- int k;
- for (k = 0; k < 8; k++)
- {
- state->S_22_44[k] = 0;
- state->S_44_32[k] = 0;
- state->S_32_16[k] = 0;
- }
-}
-
-//////////////////////
-// 16 kHz -> 22 kHz //
-//////////////////////
-
-// number of subblocks; options: 1, 2, 4, 5, 10
-#define SUB_BLOCKS_16_22 4
-
-// 16 -> 22 resampler
-void WebRtcSpl_Resample16khzTo22khz(const WebRtc_Word16* in, WebRtc_Word16* out,
- WebRtcSpl_State16khzTo22khz* state, WebRtc_Word32* tmpmem)
-{
- int k;
-
- // process two blocks of 10/SUB_BLOCKS_16_22 ms (to reduce temp buffer size)
- for (k = 0; k < SUB_BLOCKS_16_22; k++)
- {
- ///// 16 --> 32 /////
- // WebRtc_Word16 in[160/SUB_BLOCKS_16_22]
- // WebRtc_Word32 out[320/SUB_BLOCKS_16_22]
- /////
- WebRtcSpl_UpBy2ShortToInt(in, 160 / SUB_BLOCKS_16_22, tmpmem + 8, state->S_16_32);
-
- ///// 32 --> 22 /////
- // WebRtc_Word32 in[320/SUB_BLOCKS_16_22]
- // WebRtc_Word32 out[220/SUB_BLOCKS_16_22]
- /////
- // copy state to and from input array
- tmpmem[0] = state->S_32_22[0];
- tmpmem[1] = state->S_32_22[1];
- tmpmem[2] = state->S_32_22[2];
- tmpmem[3] = state->S_32_22[3];
- tmpmem[4] = state->S_32_22[4];
- tmpmem[5] = state->S_32_22[5];
- tmpmem[6] = state->S_32_22[6];
- tmpmem[7] = state->S_32_22[7];
- state->S_32_22[0] = tmpmem[320 / SUB_BLOCKS_16_22];
- state->S_32_22[1] = tmpmem[320 / SUB_BLOCKS_16_22 + 1];
- state->S_32_22[2] = tmpmem[320 / SUB_BLOCKS_16_22 + 2];
- state->S_32_22[3] = tmpmem[320 / SUB_BLOCKS_16_22 + 3];
- state->S_32_22[4] = tmpmem[320 / SUB_BLOCKS_16_22 + 4];
- state->S_32_22[5] = tmpmem[320 / SUB_BLOCKS_16_22 + 5];
- state->S_32_22[6] = tmpmem[320 / SUB_BLOCKS_16_22 + 6];
- state->S_32_22[7] = tmpmem[320 / SUB_BLOCKS_16_22 + 7];
-
- WebRtcSpl_32khzTo22khzIntToShort(tmpmem, out, 20 / SUB_BLOCKS_16_22);
-
- // move input/output pointers 10/SUB_BLOCKS_16_22 ms seconds ahead
- in += 160 / SUB_BLOCKS_16_22;
- out += 220 / SUB_BLOCKS_16_22;
- }
-}
-
-// initialize state of 16 -> 22 resampler
-void WebRtcSpl_ResetResample16khzTo22khz(WebRtcSpl_State16khzTo22khz* state)
-{
- int k;
- for (k = 0; k < 8; k++)
- {
- state->S_16_32[k] = 0;
- state->S_32_22[k] = 0;
- }
-}
-
-//////////////////////
-// 22 kHz -> 8 kHz //
-//////////////////////
-
-// number of subblocks; options: 1, 2, 5, 10
-#define SUB_BLOCKS_22_8 2
-
-// 22 -> 8 resampler
-void WebRtcSpl_Resample22khzTo8khz(const WebRtc_Word16* in, WebRtc_Word16* out,
- WebRtcSpl_State22khzTo8khz* state, WebRtc_Word32* tmpmem)
-{
- int k;
-
- // process two blocks of 10/SUB_BLOCKS_22_8 ms (to reduce temp buffer size)
- for (k = 0; k < SUB_BLOCKS_22_8; k++)
- {
- ///// 22 --> 22 lowpass /////
- // WebRtc_Word16 in[220/SUB_BLOCKS_22_8]
- // WebRtc_Word32 out[220/SUB_BLOCKS_22_8]
- /////
- WebRtcSpl_LPBy2ShortToInt(in, 220 / SUB_BLOCKS_22_8, tmpmem + 16, state->S_22_22);
-
- ///// 22 --> 16 /////
- // WebRtc_Word32 in[220/SUB_BLOCKS_22_8]
- // WebRtc_Word32 out[160/SUB_BLOCKS_22_8]
- /////
- // copy state to and from input array
- tmpmem[8] = state->S_22_16[0];
- tmpmem[9] = state->S_22_16[1];
- tmpmem[10] = state->S_22_16[2];
- tmpmem[11] = state->S_22_16[3];
- tmpmem[12] = state->S_22_16[4];
- tmpmem[13] = state->S_22_16[5];
- tmpmem[14] = state->S_22_16[6];
- tmpmem[15] = state->S_22_16[7];
- state->S_22_16[0] = tmpmem[220 / SUB_BLOCKS_22_8 + 8];
- state->S_22_16[1] = tmpmem[220 / SUB_BLOCKS_22_8 + 9];
- state->S_22_16[2] = tmpmem[220 / SUB_BLOCKS_22_8 + 10];
- state->S_22_16[3] = tmpmem[220 / SUB_BLOCKS_22_8 + 11];
- state->S_22_16[4] = tmpmem[220 / SUB_BLOCKS_22_8 + 12];
- state->S_22_16[5] = tmpmem[220 / SUB_BLOCKS_22_8 + 13];
- state->S_22_16[6] = tmpmem[220 / SUB_BLOCKS_22_8 + 14];
- state->S_22_16[7] = tmpmem[220 / SUB_BLOCKS_22_8 + 15];
-
- WebRtcSpl_Resample44khzTo32khz(tmpmem + 8, tmpmem, 20 / SUB_BLOCKS_22_8);
-
- ///// 16 --> 8 /////
- // WebRtc_Word32 in[160/SUB_BLOCKS_22_8]
- // WebRtc_Word32 out[80/SUB_BLOCKS_22_8]
- /////
- WebRtcSpl_DownBy2IntToShort(tmpmem, 160 / SUB_BLOCKS_22_8, out, state->S_16_8);
-
- // move input/output pointers 10/SUB_BLOCKS_22_8 ms seconds ahead
- in += 220 / SUB_BLOCKS_22_8;
- out += 80 / SUB_BLOCKS_22_8;
- }
-}
-
-// initialize state of 22 -> 8 resampler
-void WebRtcSpl_ResetResample22khzTo8khz(WebRtcSpl_State22khzTo8khz* state)
-{
- int k;
- for (k = 0; k < 8; k++)
- {
- state->S_22_22[k] = 0;
- state->S_22_22[k + 8] = 0;
- state->S_22_16[k] = 0;
- state->S_16_8[k] = 0;
- }
-}
-
-//////////////////////
-// 8 kHz -> 22 kHz //
-//////////////////////
-
-// number of subblocks; options: 1, 2, 5, 10
-#define SUB_BLOCKS_8_22 2
-
-// 8 -> 22 resampler
-void WebRtcSpl_Resample8khzTo22khz(const WebRtc_Word16* in, WebRtc_Word16* out,
- WebRtcSpl_State8khzTo22khz* state, WebRtc_Word32* tmpmem)
-{
- int k;
-
- // process two blocks of 10/SUB_BLOCKS_8_22 ms (to reduce temp buffer size)
- for (k = 0; k < SUB_BLOCKS_8_22; k++)
- {
- ///// 8 --> 16 /////
- // WebRtc_Word16 in[80/SUB_BLOCKS_8_22]
- // WebRtc_Word32 out[160/SUB_BLOCKS_8_22]
- /////
- WebRtcSpl_UpBy2ShortToInt(in, 80 / SUB_BLOCKS_8_22, tmpmem + 18, state->S_8_16);
-
- ///// 16 --> 11 /////
- // WebRtc_Word32 in[160/SUB_BLOCKS_8_22]
- // WebRtc_Word32 out[110/SUB_BLOCKS_8_22]
- /////
- // copy state to and from input array
- tmpmem[10] = state->S_16_11[0];
- tmpmem[11] = state->S_16_11[1];
- tmpmem[12] = state->S_16_11[2];
- tmpmem[13] = state->S_16_11[3];
- tmpmem[14] = state->S_16_11[4];
- tmpmem[15] = state->S_16_11[5];
- tmpmem[16] = state->S_16_11[6];
- tmpmem[17] = state->S_16_11[7];
- state->S_16_11[0] = tmpmem[160 / SUB_BLOCKS_8_22 + 10];
- state->S_16_11[1] = tmpmem[160 / SUB_BLOCKS_8_22 + 11];
- state->S_16_11[2] = tmpmem[160 / SUB_BLOCKS_8_22 + 12];
- state->S_16_11[3] = tmpmem[160 / SUB_BLOCKS_8_22 + 13];
- state->S_16_11[4] = tmpmem[160 / SUB_BLOCKS_8_22 + 14];
- state->S_16_11[5] = tmpmem[160 / SUB_BLOCKS_8_22 + 15];
- state->S_16_11[6] = tmpmem[160 / SUB_BLOCKS_8_22 + 16];
- state->S_16_11[7] = tmpmem[160 / SUB_BLOCKS_8_22 + 17];
-
- WebRtcSpl_32khzTo22khzIntToInt(tmpmem + 10, tmpmem, 10 / SUB_BLOCKS_8_22);
-
- ///// 11 --> 22 /////
- // WebRtc_Word32 in[110/SUB_BLOCKS_8_22]
- // WebRtc_Word16 out[220/SUB_BLOCKS_8_22]
- /////
- WebRtcSpl_UpBy2IntToShort(tmpmem, 110 / SUB_BLOCKS_8_22, out, state->S_11_22);
-
- // move input/output pointers 10/SUB_BLOCKS_8_22 ms seconds ahead
- in += 80 / SUB_BLOCKS_8_22;
- out += 220 / SUB_BLOCKS_8_22;
- }
-}
-
-// initialize state of 8 -> 22 resampler
-void WebRtcSpl_ResetResample8khzTo22khz(WebRtcSpl_State8khzTo22khz* state)
-{
- int k;
- for (k = 0; k < 8; k++)
- {
- state->S_8_16[k] = 0;
- state->S_16_11[k] = 0;
- state->S_11_22[k] = 0;
- }
-}
-
-// compute two inner-products and store them to output array
-static void WebRtcSpl_DotProdIntToInt(const WebRtc_Word32* in1, const WebRtc_Word32* in2,
- const WebRtc_Word16* coef_ptr, WebRtc_Word32* out1,
- WebRtc_Word32* out2)
-{
- WebRtc_Word32 tmp1 = 16384;
- WebRtc_Word32 tmp2 = 16384;
- WebRtc_Word16 coef;
-
- coef = coef_ptr[0];
- tmp1 += coef * in1[0];
- tmp2 += coef * in2[-0];
-
- coef = coef_ptr[1];
- tmp1 += coef * in1[1];
- tmp2 += coef * in2[-1];
-
- coef = coef_ptr[2];
- tmp1 += coef * in1[2];
- tmp2 += coef * in2[-2];
-
- coef = coef_ptr[3];
- tmp1 += coef * in1[3];
- tmp2 += coef * in2[-3];
-
- coef = coef_ptr[4];
- tmp1 += coef * in1[4];
- tmp2 += coef * in2[-4];
-
- coef = coef_ptr[5];
- tmp1 += coef * in1[5];
- tmp2 += coef * in2[-5];
-
- coef = coef_ptr[6];
- tmp1 += coef * in1[6];
- tmp2 += coef * in2[-6];
-
- coef = coef_ptr[7];
- tmp1 += coef * in1[7];
- tmp2 += coef * in2[-7];
-
- coef = coef_ptr[8];
- *out1 = tmp1 + coef * in1[8];
- *out2 = tmp2 + coef * in2[-8];
-}
-
-// compute two inner-products and store them to output array
-static void WebRtcSpl_DotProdIntToShort(const WebRtc_Word32* in1, const WebRtc_Word32* in2,
- const WebRtc_Word16* coef_ptr, WebRtc_Word16* out1,
- WebRtc_Word16* out2)
-{
- WebRtc_Word32 tmp1 = 16384;
- WebRtc_Word32 tmp2 = 16384;
- WebRtc_Word16 coef;
-
- coef = coef_ptr[0];
- tmp1 += coef * in1[0];
- tmp2 += coef * in2[-0];
-
- coef = coef_ptr[1];
- tmp1 += coef * in1[1];
- tmp2 += coef * in2[-1];
-
- coef = coef_ptr[2];
- tmp1 += coef * in1[2];
- tmp2 += coef * in2[-2];
-
- coef = coef_ptr[3];
- tmp1 += coef * in1[3];
- tmp2 += coef * in2[-3];
-
- coef = coef_ptr[4];
- tmp1 += coef * in1[4];
- tmp2 += coef * in2[-4];
-
- coef = coef_ptr[5];
- tmp1 += coef * in1[5];
- tmp2 += coef * in2[-5];
-
- coef = coef_ptr[6];
- tmp1 += coef * in1[6];
- tmp2 += coef * in2[-6];
-
- coef = coef_ptr[7];
- tmp1 += coef * in1[7];
- tmp2 += coef * in2[-7];
-
- coef = coef_ptr[8];
- tmp1 += coef * in1[8];
- tmp2 += coef * in2[-8];
-
- // scale down, round and saturate
- tmp1 >>= 15;
- if (tmp1 > (WebRtc_Word32)0x00007FFF)
- tmp1 = 0x00007FFF;
- if (tmp1 < (WebRtc_Word32)0xFFFF8000)
- tmp1 = 0xFFFF8000;
- tmp2 >>= 15;
- if (tmp2 > (WebRtc_Word32)0x00007FFF)
- tmp2 = 0x00007FFF;
- if (tmp2 < (WebRtc_Word32)0xFFFF8000)
- tmp2 = 0xFFFF8000;
- *out1 = (WebRtc_Word16)tmp1;
- *out2 = (WebRtc_Word16)tmp2;
-}
-
-// Resampling ratio: 11/16
-// input: WebRtc_Word32 (normalized, not saturated) :: size 16 * K
-// output: WebRtc_Word32 (shifted 15 positions to the left, + offset 16384) :: size 11 * K
-// K: Number of blocks
-
-void WebRtcSpl_32khzTo22khzIntToInt(const WebRtc_Word32* In,
- WebRtc_Word32* Out,
- const WebRtc_Word32 K)
-{
- /////////////////////////////////////////////////////////////
- // Filter operation:
- //
- // Perform resampling (16 input samples -> 11 output samples);
- // process in sub blocks of size 16 samples.
- WebRtc_Word32 m;
-
- for (m = 0; m < K; m++)
- {
- // first output sample
- Out[0] = ((WebRtc_Word32)In[3] << 15) + (1 << 14);
-
- // sum and accumulate filter coefficients and input samples
- WebRtcSpl_DotProdIntToInt(&In[0], &In[22], kCoefficients32To22[0], &Out[1], &Out[10]);
-
- // sum and accumulate filter coefficients and input samples
- WebRtcSpl_DotProdIntToInt(&In[2], &In[20], kCoefficients32To22[1], &Out[2], &Out[9]);
-
- // sum and accumulate filter coefficients and input samples
- WebRtcSpl_DotProdIntToInt(&In[3], &In[19], kCoefficients32To22[2], &Out[3], &Out[8]);
-
- // sum and accumulate filter coefficients and input samples
- WebRtcSpl_DotProdIntToInt(&In[5], &In[17], kCoefficients32To22[3], &Out[4], &Out[7]);
-
- // sum and accumulate filter coefficients and input samples
- WebRtcSpl_DotProdIntToInt(&In[6], &In[16], kCoefficients32To22[4], &Out[5], &Out[6]);
-
- // update pointers
- In += 16;
- Out += 11;
- }
-}
-
-// Resampling ratio: 11/16
-// input: WebRtc_Word32 (normalized, not saturated) :: size 16 * K
-// output: WebRtc_Word16 (saturated) :: size 11 * K
-// K: Number of blocks
-
-void WebRtcSpl_32khzTo22khzIntToShort(const WebRtc_Word32 *In,
- WebRtc_Word16 *Out,
- const WebRtc_Word32 K)
-{
- /////////////////////////////////////////////////////////////
- // Filter operation:
- //
- // Perform resampling (16 input samples -> 11 output samples);
- // process in sub blocks of size 16 samples.
- WebRtc_Word32 tmp;
- WebRtc_Word32 m;
-
- for (m = 0; m < K; m++)
- {
- // first output sample
- tmp = In[3];
- if (tmp > (WebRtc_Word32)0x00007FFF)
- tmp = 0x00007FFF;
- if (tmp < (WebRtc_Word32)0xFFFF8000)
- tmp = 0xFFFF8000;
- Out[0] = (WebRtc_Word16)tmp;
-
- // sum and accumulate filter coefficients and input samples
- WebRtcSpl_DotProdIntToShort(&In[0], &In[22], kCoefficients32To22[0], &Out[1], &Out[10]);
-
- // sum and accumulate filter coefficients and input samples
- WebRtcSpl_DotProdIntToShort(&In[2], &In[20], kCoefficients32To22[1], &Out[2], &Out[9]);
-
- // sum and accumulate filter coefficients and input samples
- WebRtcSpl_DotProdIntToShort(&In[3], &In[19], kCoefficients32To22[2], &Out[3], &Out[8]);
-
- // sum and accumulate filter coefficients and input samples
- WebRtcSpl_DotProdIntToShort(&In[5], &In[17], kCoefficients32To22[3], &Out[4], &Out[7]);
-
- // sum and accumulate filter coefficients and input samples
- WebRtcSpl_DotProdIntToShort(&In[6], &In[16], kCoefficients32To22[4], &Out[5], &Out[6]);
-
- // update pointers
- In += 16;
- Out += 11;
- }
-}
diff --git a/src/common_audio/signal_processing_library/main/source/resample_48khz.c b/src/common_audio/signal_processing_library/main/source/resample_48khz.c
deleted file mode 100644
index 31cbe6b..0000000
--- a/src/common_audio/signal_processing_library/main/source/resample_48khz.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains resampling functions between 48 kHz and nb/wb.
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include <string.h>
-#include "signal_processing_library.h"
-#include "resample_by_2_internal.h"
-
-////////////////////////////
-///// 48 kHz -> 16 kHz /////
-////////////////////////////
-
-// 48 -> 16 resampler
-void WebRtcSpl_Resample48khzTo16khz(const WebRtc_Word16* in, WebRtc_Word16* out,
- WebRtcSpl_State48khzTo16khz* state, WebRtc_Word32* tmpmem)
-{
- ///// 48 --> 48(LP) /////
- // WebRtc_Word16 in[480]
- // WebRtc_Word32 out[480]
- /////
- WebRtcSpl_LPBy2ShortToInt(in, 480, tmpmem + 16, state->S_48_48);
-
- ///// 48 --> 32 /////
- // WebRtc_Word32 in[480]
- // WebRtc_Word32 out[320]
- /////
- // copy state to and from input array
- memcpy(tmpmem + 8, state->S_48_32, 8 * sizeof(WebRtc_Word32));
- memcpy(state->S_48_32, tmpmem + 488, 8 * sizeof(WebRtc_Word32));
- WebRtcSpl_Resample48khzTo32khz(tmpmem + 8, tmpmem, 160);
-
- ///// 32 --> 16 /////
- // WebRtc_Word32 in[320]
- // WebRtc_Word16 out[160]
- /////
- WebRtcSpl_DownBy2IntToShort(tmpmem, 320, out, state->S_32_16);
-}
-
-// initialize state of 48 -> 16 resampler
-void WebRtcSpl_ResetResample48khzTo16khz(WebRtcSpl_State48khzTo16khz* state)
-{
- memset(state->S_48_48, 0, 16 * sizeof(WebRtc_Word32));
- memset(state->S_48_32, 0, 8 * sizeof(WebRtc_Word32));
- memset(state->S_32_16, 0, 8 * sizeof(WebRtc_Word32));
-}
-
-////////////////////////////
-///// 16 kHz -> 48 kHz /////
-////////////////////////////
-
-// 16 -> 48 resampler
-void WebRtcSpl_Resample16khzTo48khz(const WebRtc_Word16* in, WebRtc_Word16* out,
- WebRtcSpl_State16khzTo48khz* state, WebRtc_Word32* tmpmem)
-{
- ///// 16 --> 32 /////
- // WebRtc_Word16 in[160]
- // WebRtc_Word32 out[320]
- /////
- WebRtcSpl_UpBy2ShortToInt(in, 160, tmpmem + 16, state->S_16_32);
-
- ///// 32 --> 24 /////
- // WebRtc_Word32 in[320]
- // WebRtc_Word32 out[240]
- // copy state to and from input array
- /////
- memcpy(tmpmem + 8, state->S_32_24, 8 * sizeof(WebRtc_Word32));
- memcpy(state->S_32_24, tmpmem + 328, 8 * sizeof(WebRtc_Word32));
- WebRtcSpl_Resample32khzTo24khz(tmpmem + 8, tmpmem, 80);
-
- ///// 24 --> 48 /////
- // WebRtc_Word32 in[240]
- // WebRtc_Word16 out[480]
- /////
- WebRtcSpl_UpBy2IntToShort(tmpmem, 240, out, state->S_24_48);
-}
-
-// initialize state of 16 -> 48 resampler
-void WebRtcSpl_ResetResample16khzTo48khz(WebRtcSpl_State16khzTo48khz* state)
-{
- memset(state->S_16_32, 0, 8 * sizeof(WebRtc_Word32));
- memset(state->S_32_24, 0, 8 * sizeof(WebRtc_Word32));
- memset(state->S_24_48, 0, 8 * sizeof(WebRtc_Word32));
-}
-
-////////////////////////////
-///// 48 kHz -> 8 kHz /////
-////////////////////////////
-
-// 48 -> 8 resampler
-void WebRtcSpl_Resample48khzTo8khz(const WebRtc_Word16* in, WebRtc_Word16* out,
- WebRtcSpl_State48khzTo8khz* state, WebRtc_Word32* tmpmem)
-{
- ///// 48 --> 24 /////
- // WebRtc_Word16 in[480]
- // WebRtc_Word32 out[240]
- /////
- WebRtcSpl_DownBy2ShortToInt(in, 480, tmpmem + 256, state->S_48_24);
-
- ///// 24 --> 24(LP) /////
- // WebRtc_Word32 in[240]
- // WebRtc_Word32 out[240]
- /////
- WebRtcSpl_LPBy2IntToInt(tmpmem + 256, 240, tmpmem + 16, state->S_24_24);
-
- ///// 24 --> 16 /////
- // WebRtc_Word32 in[240]
- // WebRtc_Word32 out[160]
- /////
- // copy state to and from input array
- memcpy(tmpmem + 8, state->S_24_16, 8 * sizeof(WebRtc_Word32));
- memcpy(state->S_24_16, tmpmem + 248, 8 * sizeof(WebRtc_Word32));
- WebRtcSpl_Resample48khzTo32khz(tmpmem + 8, tmpmem, 80);
-
- ///// 16 --> 8 /////
- // WebRtc_Word32 in[160]
- // WebRtc_Word16 out[80]
- /////
- WebRtcSpl_DownBy2IntToShort(tmpmem, 160, out, state->S_16_8);
-}
-
-// initialize state of 48 -> 8 resampler
-void WebRtcSpl_ResetResample48khzTo8khz(WebRtcSpl_State48khzTo8khz* state)
-{
- memset(state->S_48_24, 0, 8 * sizeof(WebRtc_Word32));
- memset(state->S_24_24, 0, 16 * sizeof(WebRtc_Word32));
- memset(state->S_24_16, 0, 8 * sizeof(WebRtc_Word32));
- memset(state->S_16_8, 0, 8 * sizeof(WebRtc_Word32));
-}
-
-////////////////////////////
-///// 8 kHz -> 48 kHz /////
-////////////////////////////
-
-// 8 -> 48 resampler
-void WebRtcSpl_Resample8khzTo48khz(const WebRtc_Word16* in, WebRtc_Word16* out,
- WebRtcSpl_State8khzTo48khz* state, WebRtc_Word32* tmpmem)
-{
- ///// 8 --> 16 /////
- // WebRtc_Word16 in[80]
- // WebRtc_Word32 out[160]
- /////
- WebRtcSpl_UpBy2ShortToInt(in, 80, tmpmem + 264, state->S_8_16);
-
- ///// 16 --> 12 /////
- // WebRtc_Word32 in[160]
- // WebRtc_Word32 out[120]
- /////
- // copy state to and from input array
- memcpy(tmpmem + 256, state->S_16_12, 8 * sizeof(WebRtc_Word32));
- memcpy(state->S_16_12, tmpmem + 416, 8 * sizeof(WebRtc_Word32));
- WebRtcSpl_Resample32khzTo24khz(tmpmem + 256, tmpmem + 240, 40);
-
- ///// 12 --> 24 /////
- // WebRtc_Word32 in[120]
- // WebRtc_Word16 out[240]
- /////
- WebRtcSpl_UpBy2IntToInt(tmpmem + 240, 120, tmpmem, state->S_12_24);
-
- ///// 24 --> 48 /////
- // WebRtc_Word32 in[240]
- // WebRtc_Word16 out[480]
- /////
- WebRtcSpl_UpBy2IntToShort(tmpmem, 240, out, state->S_24_48);
-}
-
-// initialize state of 8 -> 48 resampler
-void WebRtcSpl_ResetResample8khzTo48khz(WebRtcSpl_State8khzTo48khz* state)
-{
- memset(state->S_8_16, 0, 8 * sizeof(WebRtc_Word32));
- memset(state->S_16_12, 0, 8 * sizeof(WebRtc_Word32));
- memset(state->S_12_24, 0, 8 * sizeof(WebRtc_Word32));
- memset(state->S_24_48, 0, 8 * sizeof(WebRtc_Word32));
-}
diff --git a/src/common_audio/signal_processing_library/main/source/resample_by_2.c b/src/common_audio/signal_processing_library/main/source/resample_by_2.c
deleted file mode 100644
index 7ed4cfd..0000000
--- a/src/common_audio/signal_processing_library/main/source/resample_by_2.c
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the resampling by two functions.
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-// allpass filter coefficients.
-static const WebRtc_UWord16 kResampleAllpass1[3] = {3284, 24441, 49528};
-static const WebRtc_UWord16 kResampleAllpass2[3] = {12199, 37471, 60255};
-
-// decimator
-void WebRtcSpl_DownsampleBy2(const WebRtc_Word16* in, const WebRtc_Word16 len,
- WebRtc_Word16* out, WebRtc_Word32* filtState)
-{
- const WebRtc_Word16 *inptr;
- WebRtc_Word16 *outptr;
- WebRtc_Word32 *state;
- WebRtc_Word32 tmp1, tmp2, diff, in32, out32;
- WebRtc_Word16 i;
-
- // local versions of pointers to input and output arrays
- inptr = in; // input array
- outptr = out; // output array (of length len/2)
- state = filtState; // filter state array; length = 8
-
- for (i = (len >> 1); i > 0; i--)
- {
- // lower allpass filter
- in32 = (WebRtc_Word32)(*inptr++) << 10;
- diff = in32 - state[1];
- tmp1 = WEBRTC_SPL_SCALEDIFF32( kResampleAllpass2[0], diff, state[0] );
- state[0] = in32;
- diff = tmp1 - state[2];
- tmp2 = WEBRTC_SPL_SCALEDIFF32( kResampleAllpass2[1], diff, state[1] );
- state[1] = tmp1;
- diff = tmp2 - state[3];
- state[3] = WEBRTC_SPL_SCALEDIFF32( kResampleAllpass2[2], diff, state[2] );
- state[2] = tmp2;
-
- // upper allpass filter
- in32 = (WebRtc_Word32)(*inptr++) << 10;
- diff = in32 - state[5];
- tmp1 = WEBRTC_SPL_SCALEDIFF32( kResampleAllpass1[0], diff, state[4] );
- state[4] = in32;
- diff = tmp1 - state[6];
- tmp2 = WEBRTC_SPL_SCALEDIFF32( kResampleAllpass1[1], diff, state[5] );
- state[5] = tmp1;
- diff = tmp2 - state[7];
- state[7] = WEBRTC_SPL_SCALEDIFF32( kResampleAllpass1[2], diff, state[6] );
- state[6] = tmp2;
-
- // add two allpass outputs, divide by two and round
- out32 = (state[3] + state[7] + 1024) >> 11;
-
- // limit amplitude to prevent wrap-around, and write to output array
- if (out32 > 32767)
- *outptr++ = 32767;
- else if (out32 < -32768)
- *outptr++ = -32768;
- else
- *outptr++ = (WebRtc_Word16)out32;
- }
-}
-
-void WebRtcSpl_UpsampleBy2(const WebRtc_Word16* in, WebRtc_Word16 len, WebRtc_Word16* out,
- WebRtc_Word32* filtState)
-{
- const WebRtc_Word16 *inptr;
- WebRtc_Word16 *outptr;
- WebRtc_Word32 *state;
- WebRtc_Word32 tmp1, tmp2, diff, in32, out32;
- WebRtc_Word16 i;
-
- // local versions of pointers to input and output arrays
- inptr = in; // input array
- outptr = out; // output array (of length len*2)
- state = filtState; // filter state array; length = 8
-
- for (i = len; i > 0; i--)
- {
- // lower allpass filter
- in32 = (WebRtc_Word32)(*inptr++) << 10;
- diff = in32 - state[1];
- tmp1 = WEBRTC_SPL_SCALEDIFF32( kResampleAllpass1[0], diff, state[0] );
- state[0] = in32;
- diff = tmp1 - state[2];
- tmp2 = WEBRTC_SPL_SCALEDIFF32( kResampleAllpass1[1], diff, state[1] );
- state[1] = tmp1;
- diff = tmp2 - state[3];
- state[3] = WEBRTC_SPL_SCALEDIFF32( kResampleAllpass1[2], diff, state[2] );
- state[2] = tmp2;
-
- // round; limit amplitude to prevent wrap-around; write to output array
- out32 = (state[3] + 512) >> 10;
- if (out32 > 32767)
- *outptr++ = 32767;
- else if (out32 < -32768)
- *outptr++ = -32768;
- else
- *outptr++ = (WebRtc_Word16)out32;
-
- // upper allpass filter
- diff = in32 - state[5];
- tmp1 = WEBRTC_SPL_SCALEDIFF32( kResampleAllpass2[0], diff, state[4] );
- state[4] = in32;
- diff = tmp1 - state[6];
- tmp2 = WEBRTC_SPL_SCALEDIFF32( kResampleAllpass2[1], diff, state[5] );
- state[5] = tmp1;
- diff = tmp2 - state[7];
- state[7] = WEBRTC_SPL_SCALEDIFF32( kResampleAllpass2[2], diff, state[6] );
- state[6] = tmp2;
-
- // round; limit amplitude to prevent wrap-around; write to output array
- out32 = (state[7] + 512) >> 10;
- if (out32 > 32767)
- *outptr++ = 32767;
- else if (out32 < -32768)
- *outptr++ = -32768;
- else
- *outptr++ = (WebRtc_Word16)out32;
- }
-}
diff --git a/src/common_audio/signal_processing_library/main/source/resample_by_2_internal.c b/src/common_audio/signal_processing_library/main/source/resample_by_2_internal.c
deleted file mode 100644
index cbd2395..0000000
--- a/src/common_audio/signal_processing_library/main/source/resample_by_2_internal.c
+++ /dev/null
@@ -1,679 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This header file contains some internal resampling functions.
- *
- */
-
-#include "resample_by_2_internal.h"
-
-// allpass filter coefficients.
-static const WebRtc_Word16 kResampleAllpass[2][3] = {
- {821, 6110, 12382},
- {3050, 9368, 15063}
-};
-
-//
-// decimator
-// input: WebRtc_Word32 (shifted 15 positions to the left, + offset 16384) OVERWRITTEN!
-// output: WebRtc_Word16 (saturated) (of length len/2)
-// state: filter state array; length = 8
-
-void WebRtcSpl_DownBy2IntToShort(WebRtc_Word32 *in, WebRtc_Word32 len, WebRtc_Word16 *out,
- WebRtc_Word32 *state)
-{
- WebRtc_Word32 tmp0, tmp1, diff;
- WebRtc_Word32 i;
-
- len >>= 1;
-
- // lower allpass filter (operates on even input samples)
- for (i = 0; i < len; i++)
- {
- tmp0 = in[i << 1];
- diff = tmp0 - state[1];
- // scale down and round
- diff = (diff + (1 << 13)) >> 14;
- tmp1 = state[0] + diff * kResampleAllpass[1][0];
- state[0] = tmp0;
- diff = tmp1 - state[2];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- tmp0 = state[1] + diff * kResampleAllpass[1][1];
- state[1] = tmp1;
- diff = tmp0 - state[3];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- state[3] = state[2] + diff * kResampleAllpass[1][2];
- state[2] = tmp0;
-
- // divide by two and store temporarily
- in[i << 1] = (state[3] >> 1);
- }
-
- in++;
-
- // upper allpass filter (operates on odd input samples)
- for (i = 0; i < len; i++)
- {
- tmp0 = in[i << 1];
- diff = tmp0 - state[5];
- // scale down and round
- diff = (diff + (1 << 13)) >> 14;
- tmp1 = state[4] + diff * kResampleAllpass[0][0];
- state[4] = tmp0;
- diff = tmp1 - state[6];
- // scale down and round
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- tmp0 = state[5] + diff * kResampleAllpass[0][1];
- state[5] = tmp1;
- diff = tmp0 - state[7];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- state[7] = state[6] + diff * kResampleAllpass[0][2];
- state[6] = tmp0;
-
- // divide by two and store temporarily
- in[i << 1] = (state[7] >> 1);
- }
-
- in--;
-
- // combine allpass outputs
- for (i = 0; i < len; i += 2)
- {
- // divide by two, add both allpass outputs and round
- tmp0 = (in[i << 1] + in[(i << 1) + 1]) >> 15;
- tmp1 = (in[(i << 1) + 2] + in[(i << 1) + 3]) >> 15;
- if (tmp0 > (WebRtc_Word32)0x00007FFF)
- tmp0 = 0x00007FFF;
- if (tmp0 < (WebRtc_Word32)0xFFFF8000)
- tmp0 = 0xFFFF8000;
- out[i] = (WebRtc_Word16)tmp0;
- if (tmp1 > (WebRtc_Word32)0x00007FFF)
- tmp1 = 0x00007FFF;
- if (tmp1 < (WebRtc_Word32)0xFFFF8000)
- tmp1 = 0xFFFF8000;
- out[i + 1] = (WebRtc_Word16)tmp1;
- }
-}
-
-//
-// decimator
-// input: WebRtc_Word16
-// output: WebRtc_Word32 (shifted 15 positions to the left, + offset 16384) (of length len/2)
-// state: filter state array; length = 8
-
-void WebRtcSpl_DownBy2ShortToInt(const WebRtc_Word16 *in,
- WebRtc_Word32 len,
- WebRtc_Word32 *out,
- WebRtc_Word32 *state)
-{
- WebRtc_Word32 tmp0, tmp1, diff;
- WebRtc_Word32 i;
-
- len >>= 1;
-
- // lower allpass filter (operates on even input samples)
- for (i = 0; i < len; i++)
- {
- tmp0 = ((WebRtc_Word32)in[i << 1] << 15) + (1 << 14);
- diff = tmp0 - state[1];
- // scale down and round
- diff = (diff + (1 << 13)) >> 14;
- tmp1 = state[0] + diff * kResampleAllpass[1][0];
- state[0] = tmp0;
- diff = tmp1 - state[2];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- tmp0 = state[1] + diff * kResampleAllpass[1][1];
- state[1] = tmp1;
- diff = tmp0 - state[3];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- state[3] = state[2] + diff * kResampleAllpass[1][2];
- state[2] = tmp0;
-
- // divide by two and store temporarily
- out[i] = (state[3] >> 1);
- }
-
- in++;
-
- // upper allpass filter (operates on odd input samples)
- for (i = 0; i < len; i++)
- {
- tmp0 = ((WebRtc_Word32)in[i << 1] << 15) + (1 << 14);
- diff = tmp0 - state[5];
- // scale down and round
- diff = (diff + (1 << 13)) >> 14;
- tmp1 = state[4] + diff * kResampleAllpass[0][0];
- state[4] = tmp0;
- diff = tmp1 - state[6];
- // scale down and round
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- tmp0 = state[5] + diff * kResampleAllpass[0][1];
- state[5] = tmp1;
- diff = tmp0 - state[7];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- state[7] = state[6] + diff * kResampleAllpass[0][2];
- state[6] = tmp0;
-
- // divide by two and store temporarily
- out[i] += (state[7] >> 1);
- }
-
- in--;
-}
-
-//
-// interpolator
-// input: WebRtc_Word16
-// output: WebRtc_Word32 (normalized, not saturated) (of length len*2)
-// state: filter state array; length = 8
-void WebRtcSpl_UpBy2ShortToInt(const WebRtc_Word16 *in, WebRtc_Word32 len, WebRtc_Word32 *out,
- WebRtc_Word32 *state)
-{
- WebRtc_Word32 tmp0, tmp1, diff;
- WebRtc_Word32 i;
-
- // upper allpass filter (generates odd output samples)
- for (i = 0; i < len; i++)
- {
- tmp0 = ((WebRtc_Word32)in[i] << 15) + (1 << 14);
- diff = tmp0 - state[5];
- // scale down and round
- diff = (diff + (1 << 13)) >> 14;
- tmp1 = state[4] + diff * kResampleAllpass[0][0];
- state[4] = tmp0;
- diff = tmp1 - state[6];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- tmp0 = state[5] + diff * kResampleAllpass[0][1];
- state[5] = tmp1;
- diff = tmp0 - state[7];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- state[7] = state[6] + diff * kResampleAllpass[0][2];
- state[6] = tmp0;
-
- // scale down, round and store
- out[i << 1] = state[7] >> 15;
- }
-
- out++;
-
- // lower allpass filter (generates even output samples)
- for (i = 0; i < len; i++)
- {
- tmp0 = ((WebRtc_Word32)in[i] << 15) + (1 << 14);
- diff = tmp0 - state[1];
- // scale down and round
- diff = (diff + (1 << 13)) >> 14;
- tmp1 = state[0] + diff * kResampleAllpass[1][0];
- state[0] = tmp0;
- diff = tmp1 - state[2];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- tmp0 = state[1] + diff * kResampleAllpass[1][1];
- state[1] = tmp1;
- diff = tmp0 - state[3];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- state[3] = state[2] + diff * kResampleAllpass[1][2];
- state[2] = tmp0;
-
- // scale down, round and store
- out[i << 1] = state[3] >> 15;
- }
-}
-
-//
-// interpolator
-// input: WebRtc_Word32 (shifted 15 positions to the left, + offset 16384)
-// output: WebRtc_Word32 (shifted 15 positions to the left, + offset 16384) (of length len*2)
-// state: filter state array; length = 8
-void WebRtcSpl_UpBy2IntToInt(const WebRtc_Word32 *in, WebRtc_Word32 len, WebRtc_Word32 *out,
- WebRtc_Word32 *state)
-{
- WebRtc_Word32 tmp0, tmp1, diff;
- WebRtc_Word32 i;
-
- // upper allpass filter (generates odd output samples)
- for (i = 0; i < len; i++)
- {
- tmp0 = in[i];
- diff = tmp0 - state[5];
- // scale down and round
- diff = (diff + (1 << 13)) >> 14;
- tmp1 = state[4] + diff * kResampleAllpass[0][0];
- state[4] = tmp0;
- diff = tmp1 - state[6];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- tmp0 = state[5] + diff * kResampleAllpass[0][1];
- state[5] = tmp1;
- diff = tmp0 - state[7];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- state[7] = state[6] + diff * kResampleAllpass[0][2];
- state[6] = tmp0;
-
- // scale down, round and store
- out[i << 1] = state[7];
- }
-
- out++;
-
- // lower allpass filter (generates even output samples)
- for (i = 0; i < len; i++)
- {
- tmp0 = in[i];
- diff = tmp0 - state[1];
- // scale down and round
- diff = (diff + (1 << 13)) >> 14;
- tmp1 = state[0] + diff * kResampleAllpass[1][0];
- state[0] = tmp0;
- diff = tmp1 - state[2];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- tmp0 = state[1] + diff * kResampleAllpass[1][1];
- state[1] = tmp1;
- diff = tmp0 - state[3];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- state[3] = state[2] + diff * kResampleAllpass[1][2];
- state[2] = tmp0;
-
- // scale down, round and store
- out[i << 1] = state[3];
- }
-}
-
-//
-// interpolator
-// input: WebRtc_Word32 (shifted 15 positions to the left, + offset 16384)
-// output: WebRtc_Word16 (saturated) (of length len*2)
-// state: filter state array; length = 8
-void WebRtcSpl_UpBy2IntToShort(const WebRtc_Word32 *in, WebRtc_Word32 len, WebRtc_Word16 *out,
- WebRtc_Word32 *state)
-{
- WebRtc_Word32 tmp0, tmp1, diff;
- WebRtc_Word32 i;
-
- // upper allpass filter (generates odd output samples)
- for (i = 0; i < len; i++)
- {
- tmp0 = in[i];
- diff = tmp0 - state[5];
- // scale down and round
- diff = (diff + (1 << 13)) >> 14;
- tmp1 = state[4] + diff * kResampleAllpass[0][0];
- state[4] = tmp0;
- diff = tmp1 - state[6];
- // scale down and round
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- tmp0 = state[5] + diff * kResampleAllpass[0][1];
- state[5] = tmp1;
- diff = tmp0 - state[7];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- state[7] = state[6] + diff * kResampleAllpass[0][2];
- state[6] = tmp0;
-
- // scale down, saturate and store
- tmp1 = state[7] >> 15;
- if (tmp1 > (WebRtc_Word32)0x00007FFF)
- tmp1 = 0x00007FFF;
- if (tmp1 < (WebRtc_Word32)0xFFFF8000)
- tmp1 = 0xFFFF8000;
- out[i << 1] = (WebRtc_Word16)tmp1;
- }
-
- out++;
-
- // lower allpass filter (generates even output samples)
- for (i = 0; i < len; i++)
- {
- tmp0 = in[i];
- diff = tmp0 - state[1];
- // scale down and round
- diff = (diff + (1 << 13)) >> 14;
- tmp1 = state[0] + diff * kResampleAllpass[1][0];
- state[0] = tmp0;
- diff = tmp1 - state[2];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- tmp0 = state[1] + diff * kResampleAllpass[1][1];
- state[1] = tmp1;
- diff = tmp0 - state[3];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- state[3] = state[2] + diff * kResampleAllpass[1][2];
- state[2] = tmp0;
-
- // scale down, saturate and store
- tmp1 = state[3] >> 15;
- if (tmp1 > (WebRtc_Word32)0x00007FFF)
- tmp1 = 0x00007FFF;
- if (tmp1 < (WebRtc_Word32)0xFFFF8000)
- tmp1 = 0xFFFF8000;
- out[i << 1] = (WebRtc_Word16)tmp1;
- }
-}
-
-// lowpass filter
-// input: WebRtc_Word16
-// output: WebRtc_Word32 (normalized, not saturated)
-// state: filter state array; length = 8
-void WebRtcSpl_LPBy2ShortToInt(const WebRtc_Word16* in, WebRtc_Word32 len, WebRtc_Word32* out,
- WebRtc_Word32* state)
-{
- WebRtc_Word32 tmp0, tmp1, diff;
- WebRtc_Word32 i;
-
- len >>= 1;
-
- // lower allpass filter: odd input -> even output samples
- in++;
- // initial state of polyphase delay element
- tmp0 = state[12];
- for (i = 0; i < len; i++)
- {
- diff = tmp0 - state[1];
- // scale down and round
- diff = (diff + (1 << 13)) >> 14;
- tmp1 = state[0] + diff * kResampleAllpass[1][0];
- state[0] = tmp0;
- diff = tmp1 - state[2];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- tmp0 = state[1] + diff * kResampleAllpass[1][1];
- state[1] = tmp1;
- diff = tmp0 - state[3];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- state[3] = state[2] + diff * kResampleAllpass[1][2];
- state[2] = tmp0;
-
- // scale down, round and store
- out[i << 1] = state[3] >> 1;
- tmp0 = ((WebRtc_Word32)in[i << 1] << 15) + (1 << 14);
- }
- in--;
-
- // upper allpass filter: even input -> even output samples
- for (i = 0; i < len; i++)
- {
- tmp0 = ((WebRtc_Word32)in[i << 1] << 15) + (1 << 14);
- diff = tmp0 - state[5];
- // scale down and round
- diff = (diff + (1 << 13)) >> 14;
- tmp1 = state[4] + diff * kResampleAllpass[0][0];
- state[4] = tmp0;
- diff = tmp1 - state[6];
- // scale down and round
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- tmp0 = state[5] + diff * kResampleAllpass[0][1];
- state[5] = tmp1;
- diff = tmp0 - state[7];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- state[7] = state[6] + diff * kResampleAllpass[0][2];
- state[6] = tmp0;
-
- // average the two allpass outputs, scale down and store
- out[i << 1] = (out[i << 1] + (state[7] >> 1)) >> 15;
- }
-
- // switch to odd output samples
- out++;
-
- // lower allpass filter: even input -> odd output samples
- for (i = 0; i < len; i++)
- {
- tmp0 = ((WebRtc_Word32)in[i << 1] << 15) + (1 << 14);
- diff = tmp0 - state[9];
- // scale down and round
- diff = (diff + (1 << 13)) >> 14;
- tmp1 = state[8] + diff * kResampleAllpass[1][0];
- state[8] = tmp0;
- diff = tmp1 - state[10];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- tmp0 = state[9] + diff * kResampleAllpass[1][1];
- state[9] = tmp1;
- diff = tmp0 - state[11];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- state[11] = state[10] + diff * kResampleAllpass[1][2];
- state[10] = tmp0;
-
- // scale down, round and store
- out[i << 1] = state[11] >> 1;
- }
-
- // upper allpass filter: odd input -> odd output samples
- in++;
- for (i = 0; i < len; i++)
- {
- tmp0 = ((WebRtc_Word32)in[i << 1] << 15) + (1 << 14);
- diff = tmp0 - state[13];
- // scale down and round
- diff = (diff + (1 << 13)) >> 14;
- tmp1 = state[12] + diff * kResampleAllpass[0][0];
- state[12] = tmp0;
- diff = tmp1 - state[14];
- // scale down and round
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- tmp0 = state[13] + diff * kResampleAllpass[0][1];
- state[13] = tmp1;
- diff = tmp0 - state[15];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- state[15] = state[14] + diff * kResampleAllpass[0][2];
- state[14] = tmp0;
-
- // average the two allpass outputs, scale down and store
- out[i << 1] = (out[i << 1] + (state[15] >> 1)) >> 15;
- }
-}
-
-// lowpass filter
-// input: WebRtc_Word32 (shifted 15 positions to the left, + offset 16384)
-// output: WebRtc_Word32 (normalized, not saturated)
-// state: filter state array; length = 8
-void WebRtcSpl_LPBy2IntToInt(const WebRtc_Word32* in, WebRtc_Word32 len, WebRtc_Word32* out,
- WebRtc_Word32* state)
-{
- WebRtc_Word32 tmp0, tmp1, diff;
- WebRtc_Word32 i;
-
- len >>= 1;
-
- // lower allpass filter: odd input -> even output samples
- in++;
- // initial state of polyphase delay element
- tmp0 = state[12];
- for (i = 0; i < len; i++)
- {
- diff = tmp0 - state[1];
- // scale down and round
- diff = (diff + (1 << 13)) >> 14;
- tmp1 = state[0] + diff * kResampleAllpass[1][0];
- state[0] = tmp0;
- diff = tmp1 - state[2];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- tmp0 = state[1] + diff * kResampleAllpass[1][1];
- state[1] = tmp1;
- diff = tmp0 - state[3];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- state[3] = state[2] + diff * kResampleAllpass[1][2];
- state[2] = tmp0;
-
- // scale down, round and store
- out[i << 1] = state[3] >> 1;
- tmp0 = in[i << 1];
- }
- in--;
-
- // upper allpass filter: even input -> even output samples
- for (i = 0; i < len; i++)
- {
- tmp0 = in[i << 1];
- diff = tmp0 - state[5];
- // scale down and round
- diff = (diff + (1 << 13)) >> 14;
- tmp1 = state[4] + diff * kResampleAllpass[0][0];
- state[4] = tmp0;
- diff = tmp1 - state[6];
- // scale down and round
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- tmp0 = state[5] + diff * kResampleAllpass[0][1];
- state[5] = tmp1;
- diff = tmp0 - state[7];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- state[7] = state[6] + diff * kResampleAllpass[0][2];
- state[6] = tmp0;
-
- // average the two allpass outputs, scale down and store
- out[i << 1] = (out[i << 1] + (state[7] >> 1)) >> 15;
- }
-
- // switch to odd output samples
- out++;
-
- // lower allpass filter: even input -> odd output samples
- for (i = 0; i < len; i++)
- {
- tmp0 = in[i << 1];
- diff = tmp0 - state[9];
- // scale down and round
- diff = (diff + (1 << 13)) >> 14;
- tmp1 = state[8] + diff * kResampleAllpass[1][0];
- state[8] = tmp0;
- diff = tmp1 - state[10];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- tmp0 = state[9] + diff * kResampleAllpass[1][1];
- state[9] = tmp1;
- diff = tmp0 - state[11];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- state[11] = state[10] + diff * kResampleAllpass[1][2];
- state[10] = tmp0;
-
- // scale down, round and store
- out[i << 1] = state[11] >> 1;
- }
-
- // upper allpass filter: odd input -> odd output samples
- in++;
- for (i = 0; i < len; i++)
- {
- tmp0 = in[i << 1];
- diff = tmp0 - state[13];
- // scale down and round
- diff = (diff + (1 << 13)) >> 14;
- tmp1 = state[12] + diff * kResampleAllpass[0][0];
- state[12] = tmp0;
- diff = tmp1 - state[14];
- // scale down and round
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- tmp0 = state[13] + diff * kResampleAllpass[0][1];
- state[13] = tmp1;
- diff = tmp0 - state[15];
- // scale down and truncate
- diff = diff >> 14;
- if (diff < 0)
- diff += 1;
- state[15] = state[14] + diff * kResampleAllpass[0][2];
- state[14] = tmp0;
-
- // average the two allpass outputs, scale down and store
- out[i << 1] = (out[i << 1] + (state[15] >> 1)) >> 15;
- }
-}
diff --git a/src/common_audio/signal_processing_library/main/source/resample_by_2_internal.h b/src/common_audio/signal_processing_library/main/source/resample_by_2_internal.h
deleted file mode 100644
index b6ac9f0..0000000
--- a/src/common_audio/signal_processing_library/main/source/resample_by_2_internal.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This header file contains some internal resampling functions.
- *
- */
-
-#ifndef WEBRTC_SPL_RESAMPLE_BY_2_INTERNAL_H_
-#define WEBRTC_SPL_RESAMPLE_BY_2_INTERNAL_H_
-
-#include "typedefs.h"
-
-/*******************************************************************
- * resample_by_2_fast.c
- * Functions for internal use in the other resample functions
- ******************************************************************/
-void WebRtcSpl_DownBy2IntToShort(WebRtc_Word32 *in, WebRtc_Word32 len, WebRtc_Word16 *out,
- WebRtc_Word32 *state);
-
-void WebRtcSpl_DownBy2ShortToInt(const WebRtc_Word16 *in, WebRtc_Word32 len,
- WebRtc_Word32 *out, WebRtc_Word32 *state);
-
-void WebRtcSpl_UpBy2ShortToInt(const WebRtc_Word16 *in, WebRtc_Word32 len,
- WebRtc_Word32 *out, WebRtc_Word32 *state);
-
-void WebRtcSpl_UpBy2IntToInt(const WebRtc_Word32 *in, WebRtc_Word32 len, WebRtc_Word32 *out,
- WebRtc_Word32 *state);
-
-void WebRtcSpl_UpBy2IntToShort(const WebRtc_Word32 *in, WebRtc_Word32 len,
- WebRtc_Word16 *out, WebRtc_Word32 *state);
-
-void WebRtcSpl_LPBy2ShortToInt(const WebRtc_Word16* in, WebRtc_Word32 len,
- WebRtc_Word32* out, WebRtc_Word32* state);
-
-void WebRtcSpl_LPBy2IntToInt(const WebRtc_Word32* in, WebRtc_Word32 len, WebRtc_Word32* out,
- WebRtc_Word32* state);
-
-#endif // WEBRTC_SPL_RESAMPLE_BY_2_INTERNAL_H_
diff --git a/src/common_audio/signal_processing_library/main/source/resample_fractional.c b/src/common_audio/signal_processing_library/main/source/resample_fractional.c
deleted file mode 100644
index 51003d4..0000000
--- a/src/common_audio/signal_processing_library/main/source/resample_fractional.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the resampling functions between 48, 44, 32 and 24 kHz.
- * The description headers can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-// interpolation coefficients
-static const WebRtc_Word16 kCoefficients48To32[2][8] = {
- {778, -2050, 1087, 23285, 12903, -3783, 441, 222},
- {222, 441, -3783, 12903, 23285, 1087, -2050, 778}
-};
-
-static const WebRtc_Word16 kCoefficients32To24[3][8] = {
- {767, -2362, 2434, 24406, 10620, -3838, 721, 90},
- {386, -381, -2646, 19062, 19062, -2646, -381, 386},
- {90, 721, -3838, 10620, 24406, 2434, -2362, 767}
-};
-
-static const WebRtc_Word16 kCoefficients44To32[4][9] = {
- {117, -669, 2245, -6183, 26267, 13529, -3245, 845, -138},
- {-101, 612, -2283, 8532, 29790, -5138, 1789, -524, 91},
- {50, -292, 1016, -3064, 32010, 3933, -1147, 315, -53},
- {-156, 974, -3863, 18603, 21691, -6246, 2353, -712, 126}
-};
-
-// Resampling ratio: 2/3
-// input: WebRtc_Word32 (normalized, not saturated) :: size 3 * K
-// output: WebRtc_Word32 (shifted 15 positions to the left, + offset 16384) :: size 2 * K
-// K: number of blocks
-
-void WebRtcSpl_Resample48khzTo32khz(const WebRtc_Word32 *In, WebRtc_Word32 *Out,
- const WebRtc_Word32 K)
-{
- /////////////////////////////////////////////////////////////
- // Filter operation:
- //
- // Perform resampling (3 input samples -> 2 output samples);
- // process in sub blocks of size 3 samples.
- WebRtc_Word32 tmp;
- WebRtc_Word32 m;
-
- for (m = 0; m < K; m++)
- {
- tmp = 1 << 14;
- tmp += kCoefficients48To32[0][0] * In[0];
- tmp += kCoefficients48To32[0][1] * In[1];
- tmp += kCoefficients48To32[0][2] * In[2];
- tmp += kCoefficients48To32[0][3] * In[3];
- tmp += kCoefficients48To32[0][4] * In[4];
- tmp += kCoefficients48To32[0][5] * In[5];
- tmp += kCoefficients48To32[0][6] * In[6];
- tmp += kCoefficients48To32[0][7] * In[7];
- Out[0] = tmp;
-
- tmp = 1 << 14;
- tmp += kCoefficients48To32[1][0] * In[1];
- tmp += kCoefficients48To32[1][1] * In[2];
- tmp += kCoefficients48To32[1][2] * In[3];
- tmp += kCoefficients48To32[1][3] * In[4];
- tmp += kCoefficients48To32[1][4] * In[5];
- tmp += kCoefficients48To32[1][5] * In[6];
- tmp += kCoefficients48To32[1][6] * In[7];
- tmp += kCoefficients48To32[1][7] * In[8];
- Out[1] = tmp;
-
- // update pointers
- In += 3;
- Out += 2;
- }
-}
-
-// Resampling ratio: 3/4
-// input: WebRtc_Word32 (normalized, not saturated) :: size 4 * K
-// output: WebRtc_Word32 (shifted 15 positions to the left, + offset 16384) :: size 3 * K
-// K: number of blocks
-
-void WebRtcSpl_Resample32khzTo24khz(const WebRtc_Word32 *In, WebRtc_Word32 *Out,
- const WebRtc_Word32 K)
-{
- /////////////////////////////////////////////////////////////
- // Filter operation:
- //
- // Perform resampling (4 input samples -> 3 output samples);
- // process in sub blocks of size 4 samples.
- WebRtc_Word32 m;
- WebRtc_Word32 tmp;
-
- for (m = 0; m < K; m++)
- {
- tmp = 1 << 14;
- tmp += kCoefficients32To24[0][0] * In[0];
- tmp += kCoefficients32To24[0][1] * In[1];
- tmp += kCoefficients32To24[0][2] * In[2];
- tmp += kCoefficients32To24[0][3] * In[3];
- tmp += kCoefficients32To24[0][4] * In[4];
- tmp += kCoefficients32To24[0][5] * In[5];
- tmp += kCoefficients32To24[0][6] * In[6];
- tmp += kCoefficients32To24[0][7] * In[7];
- Out[0] = tmp;
-
- tmp = 1 << 14;
- tmp += kCoefficients32To24[1][0] * In[1];
- tmp += kCoefficients32To24[1][1] * In[2];
- tmp += kCoefficients32To24[1][2] * In[3];
- tmp += kCoefficients32To24[1][3] * In[4];
- tmp += kCoefficients32To24[1][4] * In[5];
- tmp += kCoefficients32To24[1][5] * In[6];
- tmp += kCoefficients32To24[1][6] * In[7];
- tmp += kCoefficients32To24[1][7] * In[8];
- Out[1] = tmp;
-
- tmp = 1 << 14;
- tmp += kCoefficients32To24[2][0] * In[2];
- tmp += kCoefficients32To24[2][1] * In[3];
- tmp += kCoefficients32To24[2][2] * In[4];
- tmp += kCoefficients32To24[2][3] * In[5];
- tmp += kCoefficients32To24[2][4] * In[6];
- tmp += kCoefficients32To24[2][5] * In[7];
- tmp += kCoefficients32To24[2][6] * In[8];
- tmp += kCoefficients32To24[2][7] * In[9];
- Out[2] = tmp;
-
- // update pointers
- In += 4;
- Out += 3;
- }
-}
-
-//
-// fractional resampling filters
-// Fout = 11/16 * Fin
-// Fout = 8/11 * Fin
-//
-
-// compute two inner-products and store them to output array
-static void WebRtcSpl_ResampDotProduct(const WebRtc_Word32 *in1, const WebRtc_Word32 *in2,
- const WebRtc_Word16 *coef_ptr, WebRtc_Word32 *out1,
- WebRtc_Word32 *out2)
-{
- WebRtc_Word32 tmp1 = 16384;
- WebRtc_Word32 tmp2 = 16384;
- WebRtc_Word16 coef;
-
- coef = coef_ptr[0];
- tmp1 += coef * in1[0];
- tmp2 += coef * in2[-0];
-
- coef = coef_ptr[1];
- tmp1 += coef * in1[1];
- tmp2 += coef * in2[-1];
-
- coef = coef_ptr[2];
- tmp1 += coef * in1[2];
- tmp2 += coef * in2[-2];
-
- coef = coef_ptr[3];
- tmp1 += coef * in1[3];
- tmp2 += coef * in2[-3];
-
- coef = coef_ptr[4];
- tmp1 += coef * in1[4];
- tmp2 += coef * in2[-4];
-
- coef = coef_ptr[5];
- tmp1 += coef * in1[5];
- tmp2 += coef * in2[-5];
-
- coef = coef_ptr[6];
- tmp1 += coef * in1[6];
- tmp2 += coef * in2[-6];
-
- coef = coef_ptr[7];
- tmp1 += coef * in1[7];
- tmp2 += coef * in2[-7];
-
- coef = coef_ptr[8];
- *out1 = tmp1 + coef * in1[8];
- *out2 = tmp2 + coef * in2[-8];
-}
-
-// Resampling ratio: 8/11
-// input: WebRtc_Word32 (normalized, not saturated) :: size 11 * K
-// output: WebRtc_Word32 (shifted 15 positions to the left, + offset 16384) :: size 8 * K
-// K: number of blocks
-
-void WebRtcSpl_Resample44khzTo32khz(const WebRtc_Word32 *In, WebRtc_Word32 *Out,
- const WebRtc_Word32 K)
-{
- /////////////////////////////////////////////////////////////
- // Filter operation:
- //
- // Perform resampling (11 input samples -> 8 output samples);
- // process in sub blocks of size 11 samples.
- WebRtc_Word32 tmp;
- WebRtc_Word32 m;
-
- for (m = 0; m < K; m++)
- {
- tmp = 1 << 14;
-
- // first output sample
- Out[0] = ((WebRtc_Word32)In[3] << 15) + tmp;
-
- // sum and accumulate filter coefficients and input samples
- tmp += kCoefficients44To32[3][0] * In[5];
- tmp += kCoefficients44To32[3][1] * In[6];
- tmp += kCoefficients44To32[3][2] * In[7];
- tmp += kCoefficients44To32[3][3] * In[8];
- tmp += kCoefficients44To32[3][4] * In[9];
- tmp += kCoefficients44To32[3][5] * In[10];
- tmp += kCoefficients44To32[3][6] * In[11];
- tmp += kCoefficients44To32[3][7] * In[12];
- tmp += kCoefficients44To32[3][8] * In[13];
- Out[4] = tmp;
-
- // sum and accumulate filter coefficients and input samples
- WebRtcSpl_ResampDotProduct(&In[0], &In[17], kCoefficients44To32[0], &Out[1], &Out[7]);
-
- // sum and accumulate filter coefficients and input samples
- WebRtcSpl_ResampDotProduct(&In[2], &In[15], kCoefficients44To32[1], &Out[2], &Out[6]);
-
- // sum and accumulate filter coefficients and input samples
- WebRtcSpl_ResampDotProduct(&In[3], &In[14], kCoefficients44To32[2], &Out[3], &Out[5]);
-
- // update pointers
- In += 11;
- Out += 8;
- }
-}
diff --git a/src/common_audio/signal_processing_library/main/source/sin_table.c b/src/common_audio/signal_processing_library/main/source/sin_table.c
deleted file mode 100644
index ea44666..0000000
--- a/src/common_audio/signal_processing_library/main/source/sin_table.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the 360 degree sine table.
- *
- */
-
-#include "signal_processing_library.h"
-
-WebRtc_Word16 WebRtcSpl_kSinTable[] = {
- 0, 142, 285, 428, 571, 713, 856, 998, 1140,
- 1281, 1422, 1563, 1703, 1842, 1981, 2120, 2258, 2395,
- 2531, 2667, 2801, 2935, 3068, 3200, 3331, 3462, 3591,
- 3719, 3845, 3971, 4095, 4219, 4341, 4461, 4580, 4698,
- 4815, 4930, 5043, 5155, 5265, 5374, 5481, 5586, 5690,
- 5792, 5892, 5991, 6087, 6182, 6275, 6366, 6455, 6542,
- 6627, 6710, 6791, 6870, 6947, 7021, 7094, 7164, 7233,
- 7299, 7362, 7424, 7483, 7540, 7595, 7647, 7697, 7745,
- 7791, 7834, 7874, 7912, 7948, 7982, 8012, 8041, 8067,
- 8091, 8112, 8130, 8147, 8160, 8172, 8180, 8187, 8190,
- 8191, 8190, 8187, 8180, 8172, 8160, 8147, 8130, 8112,
- 8091, 8067, 8041, 8012, 7982, 7948, 7912, 7874, 7834,
- 7791, 7745, 7697, 7647, 7595, 7540, 7483, 7424, 7362,
- 7299, 7233, 7164, 7094, 7021, 6947, 6870, 6791, 6710,
- 6627, 6542, 6455, 6366, 6275, 6182, 6087, 5991, 5892,
- 5792, 5690, 5586, 5481, 5374, 5265, 5155, 5043, 4930,
- 4815, 4698, 4580, 4461, 4341, 4219, 4096, 3971, 3845,
- 3719, 3591, 3462, 3331, 3200, 3068, 2935, 2801, 2667,
- 2531, 2395, 2258, 2120, 1981, 1842, 1703, 1563, 1422,
- 1281, 1140, 998, 856, 713, 571, 428, 285, 142,
- 0, -142, -285, -428, -571, -713, -856, -998, -1140,
- -1281, -1422, -1563, -1703, -1842, -1981, -2120, -2258, -2395,
- -2531, -2667, -2801, -2935, -3068, -3200, -3331, -3462, -3591,
- -3719, -3845, -3971, -4095, -4219, -4341, -4461, -4580, -4698,
- -4815, -4930, -5043, -5155, -5265, -5374, -5481, -5586, -5690,
- -5792, -5892, -5991, -6087, -6182, -6275, -6366, -6455, -6542,
- -6627, -6710, -6791, -6870, -6947, -7021, -7094, -7164, -7233,
- -7299, -7362, -7424, -7483, -7540, -7595, -7647, -7697, -7745,
- -7791, -7834, -7874, -7912, -7948, -7982, -8012, -8041, -8067,
- -8091, -8112, -8130, -8147, -8160, -8172, -8180, -8187, -8190,
- -8191, -8190, -8187, -8180, -8172, -8160, -8147, -8130, -8112,
- -8091, -8067, -8041, -8012, -7982, -7948, -7912, -7874, -7834,
- -7791, -7745, -7697, -7647, -7595, -7540, -7483, -7424, -7362,
- -7299, -7233, -7164, -7094, -7021, -6947, -6870, -6791, -6710,
- -6627, -6542, -6455, -6366, -6275, -6182, -6087, -5991, -5892,
- -5792, -5690, -5586, -5481, -5374, -5265, -5155, -5043, -4930,
- -4815, -4698, -4580, -4461, -4341, -4219, -4096, -3971, -3845,
- -3719, -3591, -3462, -3331, -3200, -3068, -2935, -2801, -2667,
- -2531, -2395, -2258, -2120, -1981, -1842, -1703, -1563, -1422,
- -1281, -1140, -998, -856, -713, -571, -428, -285, -142
-};
diff --git a/src/common_audio/signal_processing_library/main/source/sin_table_1024.c b/src/common_audio/signal_processing_library/main/source/sin_table_1024.c
deleted file mode 100644
index a2007f9..0000000
--- a/src/common_audio/signal_processing_library/main/source/sin_table_1024.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the 1024 point sine table.
- *
- */
-
-#include "signal_processing_library.h"
-
-WebRtc_Word16 WebRtcSpl_kSinTable1024[] =
-{
- 0, 201, 402, 603, 804, 1005, 1206, 1406,
- 1607, 1808, 2009, 2209, 2410, 2610, 2811, 3011,
- 3211, 3411, 3611, 3811, 4011, 4210, 4409, 4608,
- 4807, 5006, 5205, 5403, 5601, 5799, 5997, 6195,
- 6392, 6589, 6786, 6982, 7179, 7375, 7571, 7766,
- 7961, 8156, 8351, 8545, 8739, 8932, 9126, 9319,
- 9511, 9703, 9895, 10087, 10278, 10469, 10659, 10849,
- 11038, 11227, 11416, 11604, 11792, 11980, 12166, 12353,
- 12539, 12724, 12909, 13094, 13278, 13462, 13645, 13827,
- 14009, 14191, 14372, 14552, 14732, 14911, 15090, 15268,
- 15446, 15623, 15799, 15975, 16150, 16325, 16499, 16672,
- 16845, 17017, 17189, 17360, 17530, 17699, 17868, 18036,
- 18204, 18371, 18537, 18702, 18867, 19031, 19194, 19357,
- 19519, 19680, 19840, 20000, 20159, 20317, 20474, 20631,
- 20787, 20942, 21096, 21249, 21402, 21554, 21705, 21855,
- 22004, 22153, 22301, 22448, 22594, 22739, 22883, 23027,
- 23169, 23311, 23452, 23592, 23731, 23869, 24006, 24143,
- 24278, 24413, 24546, 24679, 24811, 24942, 25072, 25201,
- 25329, 25456, 25582, 25707, 25831, 25954, 26077, 26198,
- 26318, 26437, 26556, 26673, 26789, 26905, 27019, 27132,
- 27244, 27355, 27466, 27575, 27683, 27790, 27896, 28001,
- 28105, 28208, 28309, 28410, 28510, 28608, 28706, 28802,
- 28897, 28992, 29085, 29177, 29268, 29358, 29446, 29534,
- 29621, 29706, 29790, 29873, 29955, 30036, 30116, 30195,
- 30272, 30349, 30424, 30498, 30571, 30643, 30713, 30783,
- 30851, 30918, 30984, 31049,
- 31113, 31175, 31236, 31297,
- 31356, 31413, 31470, 31525, 31580, 31633, 31684, 31735,
- 31785, 31833, 31880, 31926, 31970, 32014, 32056, 32097,
- 32137, 32176, 32213, 32249, 32284, 32318, 32350, 32382,
- 32412, 32441, 32468, 32495, 32520, 32544, 32567, 32588,
- 32609, 32628, 32646, 32662, 32678, 32692, 32705, 32717,
- 32727, 32736, 32744, 32751, 32757, 32761, 32764, 32766,
- 32767, 32766, 32764, 32761, 32757, 32751, 32744, 32736,
- 32727, 32717, 32705, 32692, 32678, 32662, 32646, 32628,
- 32609, 32588, 32567, 32544, 32520, 32495, 32468, 32441,
- 32412, 32382, 32350, 32318, 32284, 32249, 32213, 32176,
- 32137, 32097, 32056, 32014, 31970, 31926, 31880, 31833,
- 31785, 31735, 31684, 31633, 31580, 31525, 31470, 31413,
- 31356, 31297, 31236, 31175, 31113, 31049, 30984, 30918,
- 30851, 30783, 30713, 30643, 30571, 30498, 30424, 30349,
- 30272, 30195, 30116, 30036, 29955, 29873, 29790, 29706,
- 29621, 29534, 29446, 29358, 29268, 29177, 29085, 28992,
- 28897, 28802, 28706, 28608, 28510, 28410, 28309, 28208,
- 28105, 28001, 27896, 27790, 27683, 27575, 27466, 27355,
- 27244, 27132, 27019, 26905, 26789, 26673, 26556, 26437,
- 26318, 26198, 26077, 25954, 25831, 25707, 25582, 25456,
- 25329, 25201, 25072, 24942, 24811, 24679, 24546, 24413,
- 24278, 24143, 24006, 23869, 23731, 23592, 23452, 23311,
- 23169, 23027, 22883, 22739, 22594, 22448, 22301, 22153,
- 22004, 21855, 21705, 21554, 21402, 21249, 21096, 20942,
- 20787, 20631, 20474, 20317, 20159, 20000, 19840, 19680,
- 19519, 19357, 19194, 19031, 18867, 18702, 18537, 18371,
- 18204, 18036, 17868, 17699, 17530, 17360, 17189, 17017,
- 16845, 16672, 16499, 16325, 16150, 15975, 15799, 15623,
- 15446, 15268, 15090, 14911, 14732, 14552, 14372, 14191,
- 14009, 13827, 13645, 13462, 13278, 13094, 12909, 12724,
- 12539, 12353, 12166, 11980, 11792, 11604, 11416, 11227,
- 11038, 10849, 10659, 10469, 10278, 10087, 9895, 9703,
- 9511, 9319, 9126, 8932, 8739, 8545, 8351, 8156,
- 7961, 7766, 7571, 7375, 7179, 6982, 6786, 6589,
- 6392, 6195, 5997, 5799, 5601, 5403, 5205, 5006,
- 4807, 4608, 4409, 4210, 4011, 3811, 3611, 3411,
- 3211, 3011, 2811, 2610, 2410, 2209, 2009, 1808,
- 1607, 1406, 1206, 1005, 804, 603, 402, 201,
- 0, -201, -402, -603, -804, -1005, -1206, -1406,
- -1607, -1808, -2009, -2209, -2410, -2610, -2811, -3011,
- -3211, -3411, -3611, -3811, -4011, -4210, -4409, -4608,
- -4807, -5006, -5205, -5403, -5601, -5799, -5997, -6195,
- -6392, -6589, -6786, -6982, -7179, -7375, -7571, -7766,
- -7961, -8156, -8351, -8545, -8739, -8932, -9126, -9319,
- -9511, -9703, -9895, -10087, -10278, -10469, -10659, -10849,
- -11038, -11227, -11416, -11604, -11792, -11980, -12166, -12353,
- -12539, -12724, -12909, -13094, -13278, -13462, -13645, -13827,
- -14009, -14191, -14372, -14552, -14732, -14911, -15090, -15268,
- -15446, -15623, -15799, -15975, -16150, -16325, -16499, -16672,
- -16845, -17017, -17189, -17360, -17530, -17699, -17868, -18036,
- -18204, -18371, -18537, -18702, -18867, -19031, -19194, -19357,
- -19519, -19680, -19840, -20000, -20159, -20317, -20474, -20631,
- -20787, -20942, -21096, -21249, -21402, -21554, -21705, -21855,
- -22004, -22153, -22301, -22448, -22594, -22739, -22883, -23027,
- -23169, -23311, -23452, -23592, -23731, -23869, -24006, -24143,
- -24278, -24413, -24546, -24679, -24811, -24942, -25072, -25201,
- -25329, -25456, -25582, -25707, -25831, -25954, -26077, -26198,
- -26318, -26437, -26556, -26673, -26789, -26905, -27019, -27132,
- -27244, -27355, -27466, -27575, -27683, -27790, -27896, -28001,
- -28105, -28208, -28309, -28410, -28510, -28608, -28706, -28802,
- -28897, -28992, -29085, -29177, -29268, -29358, -29446, -29534,
- -29621, -29706, -29790, -29873, -29955, -30036, -30116, -30195,
- -30272, -30349, -30424, -30498, -30571, -30643, -30713, -30783,
- -30851, -30918, -30984, -31049, -31113, -31175, -31236, -31297,
- -31356, -31413, -31470, -31525, -31580, -31633, -31684, -31735,
- -31785, -31833, -31880, -31926, -31970, -32014, -32056, -32097,
- -32137, -32176, -32213, -32249, -32284, -32318, -32350, -32382,
- -32412, -32441, -32468, -32495, -32520, -32544, -32567, -32588,
- -32609, -32628, -32646, -32662, -32678, -32692, -32705, -32717,
- -32727, -32736, -32744, -32751, -32757, -32761, -32764, -32766,
- -32767, -32766, -32764, -32761, -32757, -32751, -32744, -32736,
- -32727, -32717, -32705, -32692, -32678, -32662, -32646, -32628,
- -32609, -32588, -32567, -32544, -32520, -32495, -32468, -32441,
- -32412, -32382, -32350, -32318, -32284, -32249, -32213, -32176,
- -32137, -32097, -32056, -32014, -31970, -31926, -31880, -31833,
- -31785, -31735, -31684, -31633, -31580, -31525, -31470, -31413,
- -31356, -31297, -31236, -31175, -31113, -31049, -30984, -30918,
- -30851, -30783, -30713, -30643, -30571, -30498, -30424, -30349,
- -30272, -30195, -30116, -30036, -29955, -29873, -29790, -29706,
- -29621, -29534, -29446, -29358, -29268, -29177, -29085, -28992,
- -28897, -28802, -28706, -28608, -28510, -28410, -28309, -28208,
- -28105, -28001, -27896, -27790, -27683, -27575, -27466, -27355,
- -27244, -27132, -27019, -26905, -26789, -26673, -26556, -26437,
- -26318, -26198, -26077, -25954, -25831, -25707, -25582, -25456,
- -25329, -25201, -25072, -24942, -24811, -24679, -24546, -24413,
- -24278, -24143, -24006, -23869, -23731, -23592, -23452, -23311,
- -23169, -23027, -22883, -22739, -22594, -22448, -22301, -22153,
- -22004, -21855, -21705, -21554, -21402, -21249, -21096, -20942,
- -20787, -20631, -20474, -20317, -20159, -20000, -19840, -19680,
- -19519, -19357, -19194, -19031, -18867, -18702, -18537, -18371,
- -18204, -18036, -17868, -17699, -17530, -17360, -17189, -17017,
- -16845, -16672, -16499, -16325, -16150, -15975, -15799, -15623,
- -15446, -15268, -15090, -14911, -14732, -14552, -14372, -14191,
- -14009, -13827, -13645, -13462, -13278, -13094, -12909, -12724,
- -12539, -12353, -12166, -11980, -11792, -11604, -11416, -11227,
- -11038, -10849, -10659, -10469, -10278, -10087, -9895, -9703,
- -9511, -9319, -9126, -8932, -8739, -8545, -8351, -8156,
- -7961, -7766, -7571, -7375, -7179, -6982, -6786, -6589,
- -6392, -6195, -5997, -5799, -5601, -5403, -5205, -5006,
- -4807, -4608, -4409, -4210, -4011, -3811, -3611, -3411,
- -3211, -3011, -2811, -2610, -2410, -2209, -2009, -1808,
- -1607, -1406, -1206, -1005, -804, -603, -402, -201,
-};
diff --git a/src/common_audio/signal_processing_library/main/source/spl.gyp b/src/common_audio/signal_processing_library/main/source/spl.gyp
deleted file mode 100644
index 9c052fc..0000000
--- a/src/common_audio/signal_processing_library/main/source/spl.gyp
+++ /dev/null
@@ -1,84 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-{
- 'includes': [
- '../../../../common_settings.gypi', # Common settings
- ],
- 'targets': [
- {
- 'target_name': 'spl',
- 'type': '<(library)',
- 'include_dirs': [
- '../interface',
- ],
- 'direct_dependent_settings': {
- 'include_dirs': [
- '../interface',
- ],
- },
- 'sources': [
- '../interface/signal_processing_library.h',
- '../interface/spl_inl.h',
- 'add_sat_w16.c',
- 'add_sat_w32.c',
- 'auto_corr_to_refl_coef.c',
- 'auto_correlation.c',
- 'complex_fft.c',
- 'complex_ifft.c',
- 'complex_bit_reverse.c',
- 'copy_set_operations.c',
- 'cos_table.c',
- 'cross_correlation.c',
- 'division_operations.c',
- 'dot_product_with_scale.c',
- 'downsample_fast.c',
- 'energy.c',
- 'filter_ar.c',
- 'filter_ar_fast_q12.c',
- 'filter_ma_fast_q12.c',
- 'get_hanning_window.c',
- 'get_scaling_square.c',
- 'get_size_in_bits.c',
- 'hanning_table.c',
- 'ilbc_specific_functions.c',
- 'levinson_durbin.c',
- 'lpc_to_refl_coef.c',
- 'min_max_operations.c',
- 'norm_u32.c',
- 'norm_w16.c',
- 'norm_w32.c',
- 'randn_table.c',
- 'randomization_functions.c',
- 'refl_coef_to_lpc.c',
- 'resample.c',
- 'resample_48khz.c',
- 'resample_by_2.c',
- 'resample_by_2_internal.c',
- 'resample_by_2_internal.h',
- 'resample_fractional.c',
- 'sin_table.c',
- 'sin_table_1024.c',
- 'spl_sqrt.c',
- 'spl_sqrt_floor.c',
- 'spl_version.c',
- 'splitting_filter.c',
- 'sqrt_of_one_minus_x_squared.c',
- 'sub_sat_w16.c',
- 'sub_sat_w32.c',
- 'vector_scaling_operations.c',
- ],
- },
- ],
-}
-
-# Local Variables:
-# tab-width:2
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/src/common_audio/signal_processing_library/main/source/spl_sqrt.c b/src/common_audio/signal_processing_library/main/source/spl_sqrt.c
deleted file mode 100644
index cfe2cd3..0000000
--- a/src/common_audio/signal_processing_library/main/source/spl_sqrt.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_Sqrt().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-WebRtc_Word32 WebRtcSpl_SqrtLocal(WebRtc_Word32 in);
-
-WebRtc_Word32 WebRtcSpl_SqrtLocal(WebRtc_Word32 in)
-{
-
- WebRtc_Word16 x_half, t16;
- WebRtc_Word32 A, B, x2;
-
- /* The following block performs:
- y=in/2
- x=y-2^30
- x_half=x/2^31
- t = 1 + (x_half) - 0.5*((x_half)^2) + 0.5*((x_half)^3) - 0.625*((x_half)^4)
- + 0.875*((x_half)^5)
- */
-
- B = in;
-
- B = WEBRTC_SPL_RSHIFT_W32(B, 1); // B = in/2
- B = B - ((WebRtc_Word32)0x40000000); // B = in/2 - 1/2
- x_half = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(B, 16);// x_half = x/2 = (in-1)/2
- B = B + ((WebRtc_Word32)0x40000000); // B = 1 + x/2
- B = B + ((WebRtc_Word32)0x40000000); // Add 0.5 twice (since 1.0 does not exist in Q31)
-
- x2 = ((WebRtc_Word32)x_half) * ((WebRtc_Word32)x_half) * 2; // A = (x/2)^2
- A = -x2; // A = -(x/2)^2
- B = B + (A >> 1); // B = 1 + x/2 - 0.5*(x/2)^2
-
- A = WEBRTC_SPL_RSHIFT_W32(A, 16);
- A = A * A * 2; // A = (x/2)^4
- t16 = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(A, 16);
- B = B + WEBRTC_SPL_MUL_16_16(-20480, t16) * 2; // B = B - 0.625*A
- // After this, B = 1 + x/2 - 0.5*(x/2)^2 - 0.625*(x/2)^4
-
- t16 = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(A, 16);
- A = WEBRTC_SPL_MUL_16_16(x_half, t16) * 2; // A = (x/2)^5
- t16 = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(A, 16);
- B = B + WEBRTC_SPL_MUL_16_16(28672, t16) * 2; // B = B + 0.875*A
- // After this, B = 1 + x/2 - 0.5*(x/2)^2 - 0.625*(x/2)^4 + 0.875*(x/2)^5
-
- t16 = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(x2, 16);
- A = WEBRTC_SPL_MUL_16_16(x_half, t16) * 2; // A = x/2^3
-
- B = B + (A >> 1); // B = B + 0.5*A
- // After this, B = 1 + x/2 - 0.5*(x/2)^2 + 0.5*(x/2)^3 - 0.625*(x/2)^4 + 0.875*(x/2)^5
-
- B = B + ((WebRtc_Word32)32768); // Round off bit
-
- return B;
-}
-
-WebRtc_Word32 WebRtcSpl_Sqrt(WebRtc_Word32 value)
-{
- /*
- Algorithm:
-
- Six term Taylor Series is used here to compute the square root of a number
- y^0.5 = (1+x)^0.5 where x = y-1
- = 1+(x/2)-0.5*((x/2)^2+0.5*((x/2)^3-0.625*((x/2)^4+0.875*((x/2)^5)
- 0.5 <= x < 1
-
- Example of how the algorithm works, with ut=sqrt(in), and
- with in=73632 and ut=271 (even shift value case):
-
- in=73632
- y= in/131072
- x=y-1
- t = 1 + (x/2) - 0.5*((x/2)^2) + 0.5*((x/2)^3) - 0.625*((x/2)^4) + 0.875*((x/2)^5)
- ut=t*(1/sqrt(2))*512
-
- or:
-
- in=73632
- in2=73632*2^14
- y= in2/2^31
- x=y-1
- t = 1 + (x/2) - 0.5*((x/2)^2) + 0.5*((x/2)^3) - 0.625*((x/2)^4) + 0.875*((x/2)^5)
- ut=t*(1/sqrt(2))
- ut2=ut*2^9
-
- which gives:
-
- in = 73632
- in2 = 1206386688
- y = 0.56176757812500
- x = -0.43823242187500
- t = 0.74973506527313
- ut = 0.53014274874797
- ut2 = 2.714330873589594e+002
-
- or:
-
- in=73632
- in2=73632*2^14
- y=in2/2
- x=y-2^30
- x_half=x/2^31
- t = 1 + (x_half) - 0.5*((x_half)^2) + 0.5*((x_half)^3) - 0.625*((x_half)^4)
- + 0.875*((x_half)^5)
- ut=t*(1/sqrt(2))
- ut2=ut*2^9
-
- which gives:
-
- in = 73632
- in2 = 1206386688
- y = 603193344
- x = -470548480
- x_half = -0.21911621093750
- t = 0.74973506527313
- ut = 0.53014274874797
- ut2 = 2.714330873589594e+002
-
- */
-
- WebRtc_Word16 x_norm, nshift, t16, sh;
- WebRtc_Word32 A;
-
- WebRtc_Word16 k_sqrt_2 = 23170; // 1/sqrt2 (==5a82)
-
- A = value;
-
- if (A == 0)
- return (WebRtc_Word32)0; // sqrt(0) = 0
-
- sh = WebRtcSpl_NormW32(A); // # shifts to normalize A
- A = WEBRTC_SPL_LSHIFT_W32(A, sh); // Normalize A
- if (A < (WEBRTC_SPL_WORD32_MAX - 32767))
- {
- A = A + ((WebRtc_Word32)32768); // Round off bit
- } else
- {
- A = WEBRTC_SPL_WORD32_MAX;
- }
-
- x_norm = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(A, 16); // x_norm = AH
-
- nshift = WEBRTC_SPL_RSHIFT_W16(sh, 1); // nshift = sh>>1
- nshift = -nshift; // Negate the power for later de-normalization
-
- A = (WebRtc_Word32)WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)x_norm, 16);
- A = WEBRTC_SPL_ABS_W32(A); // A = abs(x_norm<<16)
- A = WebRtcSpl_SqrtLocal(A); // A = sqrt(A)
-
- if ((-2 * nshift) == sh)
- { // Even shift value case
-
- t16 = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(A, 16); // t16 = AH
-
- A = WEBRTC_SPL_MUL_16_16(k_sqrt_2, t16) * 2; // A = 1/sqrt(2)*t16
- A = A + ((WebRtc_Word32)32768); // Round off
- A = A & ((WebRtc_Word32)0x7fff0000); // Round off
-
- A = WEBRTC_SPL_RSHIFT_W32(A, 15); // A = A>>16
-
- } else
- {
- A = WEBRTC_SPL_RSHIFT_W32(A, 16); // A = A>>16
- }
-
- A = A & ((WebRtc_Word32)0x0000ffff);
- A = (WebRtc_Word32)WEBRTC_SPL_SHIFT_W32(A, nshift); // De-normalize the result
-
- return A;
-}
diff --git a/src/common_audio/signal_processing_library/main/source/spl_sqrt_floor.c b/src/common_audio/signal_processing_library/main/source/spl_sqrt_floor.c
deleted file mode 100644
index aa36459..0000000
--- a/src/common_audio/signal_processing_library/main/source/spl_sqrt_floor.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-/*
- * This file contains the function WebRtcSpl_SqrtFloor().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-#define WEBRTC_SPL_SQRT_ITER(N) \
- try1 = root + (1 << (N)); \
- if (value >= try1 << (N)) \
- { \
- value -= try1 << (N); \
- root |= 2 << (N); \
- }
-
-// (out) Square root of input parameter
-WebRtc_Word32 WebRtcSpl_SqrtFloor(WebRtc_Word32 value)
-{
- // new routine for performance, 4 cycles/bit in ARM
- // output precision is 16 bits
-
- WebRtc_Word32 root = 0, try1;
-
- WEBRTC_SPL_SQRT_ITER (15);
- WEBRTC_SPL_SQRT_ITER (14);
- WEBRTC_SPL_SQRT_ITER (13);
- WEBRTC_SPL_SQRT_ITER (12);
- WEBRTC_SPL_SQRT_ITER (11);
- WEBRTC_SPL_SQRT_ITER (10);
- WEBRTC_SPL_SQRT_ITER ( 9);
- WEBRTC_SPL_SQRT_ITER ( 8);
- WEBRTC_SPL_SQRT_ITER ( 7);
- WEBRTC_SPL_SQRT_ITER ( 6);
- WEBRTC_SPL_SQRT_ITER ( 5);
- WEBRTC_SPL_SQRT_ITER ( 4);
- WEBRTC_SPL_SQRT_ITER ( 3);
- WEBRTC_SPL_SQRT_ITER ( 2);
- WEBRTC_SPL_SQRT_ITER ( 1);
- WEBRTC_SPL_SQRT_ITER ( 0);
-
- return root >> 1;
-}
diff --git a/src/common_audio/signal_processing_library/main/source/spl_version.c b/src/common_audio/signal_processing_library/main/source/spl_version.c
deleted file mode 100644
index 936925e..0000000
--- a/src/common_audio/signal_processing_library/main/source/spl_version.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_get_version().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include <string.h>
-#include "signal_processing_library.h"
-
-WebRtc_Word16 WebRtcSpl_get_version(char* version, WebRtc_Word16 length_in_bytes)
-{
- strncpy(version, "1.2.0", length_in_bytes);
- return 0;
-}
diff --git a/src/common_audio/signal_processing_library/main/source/splitting_filter.c b/src/common_audio/signal_processing_library/main/source/splitting_filter.c
deleted file mode 100644
index 98442f4..0000000
--- a/src/common_audio/signal_processing_library/main/source/splitting_filter.c
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-/*
- * This file contains the splitting filter functions.
- *
- */
-
-#include "signal_processing_library.h"
-
-// Number of samples in a low/high-band frame.
-enum
-{
- kBandFrameLength = 160
-};
-
-// QMF filter coefficients in Q16.
-static const WebRtc_UWord16 WebRtcSpl_kAllPassFilter1[3] = {6418, 36982, 57261};
-static const WebRtc_UWord16 WebRtcSpl_kAllPassFilter2[3] = {21333, 49062, 63010};
-
-///////////////////////////////////////////////////////////////////////////////////////////////
-// WebRtcSpl_AllPassQMF(...)
-//
-// Allpass filter used by the analysis and synthesis parts of the QMF filter.
-//
-// Input:
-// - in_data : Input data sequence (Q10)
-// - data_length : Length of data sequence (>2)
-// - filter_coefficients : Filter coefficients (length 3, Q16)
-//
-// Input & Output:
-// - filter_state : Filter state (length 6, Q10).
-//
-// Output:
-// - out_data : Output data sequence (Q10), length equal to
-// |data_length|
-//
-
-void WebRtcSpl_AllPassQMF(WebRtc_Word32* in_data, const WebRtc_Word16 data_length,
- WebRtc_Word32* out_data, const WebRtc_UWord16* filter_coefficients,
- WebRtc_Word32* filter_state)
-{
- // The procedure is to filter the input with three first order all pass filters
- // (cascade operations).
- //
- // a_3 + q^-1 a_2 + q^-1 a_1 + q^-1
- // y[n] = ----------- ----------- ----------- x[n]
- // 1 + a_3q^-1 1 + a_2q^-1 1 + a_1q^-1
- //
- // The input vector |filter_coefficients| includes these three filter coefficients.
- // The filter state contains the in_data state, in_data[-1], followed by
- // the out_data state, out_data[-1]. This is repeated for each cascade.
- // The first cascade filter will filter the |in_data| and store the output in
- // |out_data|. The second will the take the |out_data| as input and make an
- // intermediate storage in |in_data|, to save memory. The third, and final, cascade
- // filter operation takes the |in_data| (which is the output from the previous cascade
- // filter) and store the output in |out_data|.
- // Note that the input vector values are changed during the process.
- WebRtc_Word16 k;
- WebRtc_Word32 diff;
- // First all-pass cascade; filter from in_data to out_data.
-
- // Let y_i[n] indicate the output of cascade filter i (with filter coefficient a_i) at
- // vector position n. Then the final output will be y[n] = y_3[n]
-
- // First loop, use the states stored in memory.
- // "diff" should be safe from wrap around since max values are 2^25
- diff = WEBRTC_SPL_SUB_SAT_W32(in_data[0], filter_state[1]); // = (x[0] - y_1[-1])
- // y_1[0] = x[-1] + a_1 * (x[0] - y_1[-1])
- out_data[0] = WEBRTC_SPL_SCALEDIFF32(filter_coefficients[0], diff, filter_state[0]);
-
- // For the remaining loops, use previous values.
- for (k = 1; k < data_length; k++)
- {
- diff = WEBRTC_SPL_SUB_SAT_W32(in_data[k], out_data[k - 1]); // = (x[n] - y_1[n-1])
- // y_1[n] = x[n-1] + a_1 * (x[n] - y_1[n-1])
- out_data[k] = WEBRTC_SPL_SCALEDIFF32(filter_coefficients[0], diff, in_data[k - 1]);
- }
-
- // Update states.
- filter_state[0] = in_data[data_length - 1]; // x[N-1], becomes x[-1] next time
- filter_state[1] = out_data[data_length - 1]; // y_1[N-1], becomes y_1[-1] next time
-
- // Second all-pass cascade; filter from out_data to in_data.
- diff = WEBRTC_SPL_SUB_SAT_W32(out_data[0], filter_state[3]); // = (y_1[0] - y_2[-1])
- // y_2[0] = y_1[-1] + a_2 * (y_1[0] - y_2[-1])
- in_data[0] = WEBRTC_SPL_SCALEDIFF32(filter_coefficients[1], diff, filter_state[2]);
- for (k = 1; k < data_length; k++)
- {
- diff = WEBRTC_SPL_SUB_SAT_W32(out_data[k], in_data[k - 1]); // =(y_1[n] - y_2[n-1])
- // y_2[0] = y_1[-1] + a_2 * (y_1[0] - y_2[-1])
- in_data[k] = WEBRTC_SPL_SCALEDIFF32(filter_coefficients[1], diff, out_data[k-1]);
- }
-
- filter_state[2] = out_data[data_length - 1]; // y_1[N-1], becomes y_1[-1] next time
- filter_state[3] = in_data[data_length - 1]; // y_2[N-1], becomes y_2[-1] next time
-
- // Third all-pass cascade; filter from in_data to out_data.
- diff = WEBRTC_SPL_SUB_SAT_W32(in_data[0], filter_state[5]); // = (y_2[0] - y[-1])
- // y[0] = y_2[-1] + a_3 * (y_2[0] - y[-1])
- out_data[0] = WEBRTC_SPL_SCALEDIFF32(filter_coefficients[2], diff, filter_state[4]);
- for (k = 1; k < data_length; k++)
- {
- diff = WEBRTC_SPL_SUB_SAT_W32(in_data[k], out_data[k - 1]); // = (y_2[n] - y[n-1])
- // y[n] = y_2[n-1] + a_3 * (y_2[n] - y[n-1])
- out_data[k] = WEBRTC_SPL_SCALEDIFF32(filter_coefficients[2], diff, in_data[k-1]);
- }
- filter_state[4] = in_data[data_length - 1]; // y_2[N-1], becomes y_2[-1] next time
- filter_state[5] = out_data[data_length - 1]; // y[N-1], becomes y[-1] next time
-}
-
-void WebRtcSpl_AnalysisQMF(const WebRtc_Word16* in_data, WebRtc_Word16* low_band,
- WebRtc_Word16* high_band, WebRtc_Word32* filter_state1,
- WebRtc_Word32* filter_state2)
-{
- WebRtc_Word16 i;
- WebRtc_Word16 k;
- WebRtc_Word32 tmp;
- WebRtc_Word32 half_in1[kBandFrameLength];
- WebRtc_Word32 half_in2[kBandFrameLength];
- WebRtc_Word32 filter1[kBandFrameLength];
- WebRtc_Word32 filter2[kBandFrameLength];
-
- // Split even and odd samples. Also shift them to Q10.
- for (i = 0, k = 0; i < kBandFrameLength; i++, k += 2)
- {
- half_in2[i] = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)in_data[k], 10);
- half_in1[i] = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)in_data[k + 1], 10);
- }
-
- // All pass filter even and odd samples, independently.
- WebRtcSpl_AllPassQMF(half_in1, kBandFrameLength, filter1, WebRtcSpl_kAllPassFilter1,
- filter_state1);
- WebRtcSpl_AllPassQMF(half_in2, kBandFrameLength, filter2, WebRtcSpl_kAllPassFilter2,
- filter_state2);
-
- // Take the sum and difference of filtered version of odd and even
- // branches to get upper & lower band.
- for (i = 0; i < kBandFrameLength; i++)
- {
- tmp = filter1[i] + filter2[i] + 1024;
- tmp = WEBRTC_SPL_RSHIFT_W32(tmp, 11);
- low_band[i] = (WebRtc_Word16)WEBRTC_SPL_SAT(WEBRTC_SPL_WORD16_MAX,
- tmp, WEBRTC_SPL_WORD16_MIN);
-
- tmp = filter1[i] - filter2[i] + 1024;
- tmp = WEBRTC_SPL_RSHIFT_W32(tmp, 11);
- high_band[i] = (WebRtc_Word16)WEBRTC_SPL_SAT(WEBRTC_SPL_WORD16_MAX,
- tmp, WEBRTC_SPL_WORD16_MIN);
- }
-}
-
-void WebRtcSpl_SynthesisQMF(const WebRtc_Word16* low_band, const WebRtc_Word16* high_band,
- WebRtc_Word16* out_data, WebRtc_Word32* filter_state1,
- WebRtc_Word32* filter_state2)
-{
- WebRtc_Word32 tmp;
- WebRtc_Word32 half_in1[kBandFrameLength];
- WebRtc_Word32 half_in2[kBandFrameLength];
- WebRtc_Word32 filter1[kBandFrameLength];
- WebRtc_Word32 filter2[kBandFrameLength];
- WebRtc_Word16 i;
- WebRtc_Word16 k;
-
- // Obtain the sum and difference channels out of upper and lower-band channels.
- // Also shift to Q10 domain.
- for (i = 0; i < kBandFrameLength; i++)
- {
- tmp = (WebRtc_Word32)low_band[i] + (WebRtc_Word32)high_band[i];
- half_in1[i] = WEBRTC_SPL_LSHIFT_W32(tmp, 10);
- tmp = (WebRtc_Word32)low_band[i] - (WebRtc_Word32)high_band[i];
- half_in2[i] = WEBRTC_SPL_LSHIFT_W32(tmp, 10);
- }
-
- // all-pass filter the sum and difference channels
- WebRtcSpl_AllPassQMF(half_in1, kBandFrameLength, filter1, WebRtcSpl_kAllPassFilter2,
- filter_state1);
- WebRtcSpl_AllPassQMF(half_in2, kBandFrameLength, filter2, WebRtcSpl_kAllPassFilter1,
- filter_state2);
-
- // The filtered signals are even and odd samples of the output. Combine
- // them. The signals are Q10 should shift them back to Q0 and take care of
- // saturation.
- for (i = 0, k = 0; i < kBandFrameLength; i++)
- {
- tmp = WEBRTC_SPL_RSHIFT_W32(filter2[i] + 512, 10);
- out_data[k++] = (WebRtc_Word16)WEBRTC_SPL_SAT(32767, tmp, -32768);
-
- tmp = WEBRTC_SPL_RSHIFT_W32(filter1[i] + 512, 10);
- out_data[k++] = (WebRtc_Word16)WEBRTC_SPL_SAT(32767, tmp, -32768);
- }
-
-}
diff --git a/src/common_audio/signal_processing_library/main/source/sqrt_of_one_minus_x_squared.c b/src/common_audio/signal_processing_library/main/source/sqrt_of_one_minus_x_squared.c
deleted file mode 100644
index 9fb2c73..0000000
--- a/src/common_audio/signal_processing_library/main/source/sqrt_of_one_minus_x_squared.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_SqrtOfOneMinusXSquared().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-void WebRtcSpl_SqrtOfOneMinusXSquared(WebRtc_Word16 *xQ15, int vector_length,
- WebRtc_Word16 *yQ15)
-{
- WebRtc_Word32 sq;
- int m;
- WebRtc_Word16 tmp;
-
- for (m = 0; m < vector_length; m++)
- {
- tmp = xQ15[m];
- sq = WEBRTC_SPL_MUL_16_16(tmp, tmp); // x^2 in Q30
- sq = 1073741823 - sq; // 1-x^2, where 1 ~= 0.99999999906 is 1073741823 in Q30
- sq = WebRtcSpl_Sqrt(sq); // sqrt(1-x^2) in Q15
- yQ15[m] = (WebRtc_Word16)sq;
- }
-}
diff --git a/src/common_audio/signal_processing_library/main/source/sub_sat_w16.c b/src/common_audio/signal_processing_library/main/source/sub_sat_w16.c
deleted file mode 100644
index a48c3d5..0000000
--- a/src/common_audio/signal_processing_library/main/source/sub_sat_w16.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_SubSatW16().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-#ifndef SPL_NO_DOUBLE_IMPLEMENTATIONS
-#ifndef XSCALE_OPT
-
-WebRtc_Word16 WebRtcSpl_SubSatW16(WebRtc_Word16 var1, WebRtc_Word16 var2)
-{
- WebRtc_Word32 l_diff;
- WebRtc_Word16 s_diff;
-
- // perform subtraction
- l_diff = (WebRtc_Word32)var1 - (WebRtc_Word32)var2;
-
- // default setting
- s_diff = (WebRtc_Word16)l_diff;
-
- // check for overflow
- if (l_diff > (WebRtc_Word32)32767)
- s_diff = (WebRtc_Word16)32767;
-
- // check for underflow
- if (l_diff < (WebRtc_Word32)-32768)
- s_diff = (WebRtc_Word16)-32768;
-
- return s_diff;
-}
-
-#else
-#pragma message(">> WebRtcSpl_SubSatW16.c is excluded from this build")
-#endif // XSCALE_OPT
-#endif // SPL_NO_DOUBLE_IMPLEMENTATIONS
diff --git a/src/common_audio/signal_processing_library/main/source/sub_sat_w32.c b/src/common_audio/signal_processing_library/main/source/sub_sat_w32.c
deleted file mode 100644
index add3675..0000000
--- a/src/common_audio/signal_processing_library/main/source/sub_sat_w32.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_SubSatW32().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-#ifndef SPL_NO_DOUBLE_IMPLEMENTATIONS
-
-WebRtc_Word32 WebRtcSpl_SubSatW32(WebRtc_Word32 var1, WebRtc_Word32 var2)
-{
- WebRtc_Word32 l_diff;
-
- // perform subtraction
- l_diff = var1 - var2;
-
- // check for underflow
- if ((var1 < 0) && (var2 > 0) && (l_diff > 0))
- l_diff = (WebRtc_Word32)0x80000000;
- // check for overflow
- if ((var1 > 0) && (var2 < 0) && (l_diff < 0))
- l_diff = (WebRtc_Word32)0x7FFFFFFF;
-
- return l_diff;
-}
-
-#endif
diff --git a/src/common_audio/signal_processing_library/main/source/vector_scaling_operations.c b/src/common_audio/signal_processing_library/main/source/vector_scaling_operations.c
deleted file mode 100644
index 47362ee..0000000
--- a/src/common_audio/signal_processing_library/main/source/vector_scaling_operations.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains implementations of the functions
- * WebRtcSpl_VectorBitShiftW16()
- * WebRtcSpl_VectorBitShiftW32()
- * WebRtcSpl_VectorBitShiftW32ToW16()
- * WebRtcSpl_ScaleVector()
- * WebRtcSpl_ScaleVectorWithSat()
- * WebRtcSpl_ScaleAndAddVectors()
- *
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "signal_processing_library.h"
-
-void WebRtcSpl_VectorBitShiftW16(WebRtc_Word16 *res,
- WebRtc_Word16 length,
- G_CONST WebRtc_Word16 *in,
- WebRtc_Word16 right_shifts)
-{
- int i;
-
- if (right_shifts > 0)
- {
- for (i = length; i > 0; i--)
- {
- (*res++) = ((*in++) >> right_shifts);
- }
- } else
- {
- for (i = length; i > 0; i--)
- {
- (*res++) = ((*in++) << (-right_shifts));
- }
- }
-}
-
-void WebRtcSpl_VectorBitShiftW32(WebRtc_Word32 *out_vector,
- WebRtc_Word16 vector_length,
- G_CONST WebRtc_Word32 *in_vector,
- WebRtc_Word16 right_shifts)
-{
- int i;
-
- if (right_shifts > 0)
- {
- for (i = vector_length; i > 0; i--)
- {
- (*out_vector++) = ((*in_vector++) >> right_shifts);
- }
- } else
- {
- for (i = vector_length; i > 0; i--)
- {
- (*out_vector++) = ((*in_vector++) << (-right_shifts));
- }
- }
-}
-
-void WebRtcSpl_VectorBitShiftW32ToW16(WebRtc_Word16 *res,
- WebRtc_Word16 length,
- G_CONST WebRtc_Word32 *in,
- WebRtc_Word16 right_shifts)
-{
- int i;
-
- if (right_shifts >= 0)
- {
- for (i = length; i > 0; i--)
- {
- (*res++) = (WebRtc_Word16)((*in++) >> right_shifts);
- }
- } else
- {
- WebRtc_Word16 left_shifts = -right_shifts;
- for (i = length; i > 0; i--)
- {
- (*res++) = (WebRtc_Word16)((*in++) << left_shifts);
- }
- }
-}
-
-void WebRtcSpl_ScaleVector(G_CONST WebRtc_Word16 *in_vector, WebRtc_Word16 *out_vector,
- WebRtc_Word16 gain, WebRtc_Word16 in_vector_length,
- WebRtc_Word16 right_shifts)
-{
- // Performs vector operation: out_vector = (gain*in_vector)>>right_shifts
- int i;
- G_CONST WebRtc_Word16 *inptr;
- WebRtc_Word16 *outptr;
-
- inptr = in_vector;
- outptr = out_vector;
-
- for (i = 0; i < in_vector_length; i++)
- {
- (*outptr++) = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(*inptr++, gain, right_shifts);
- }
-}
-
-void WebRtcSpl_ScaleVectorWithSat(G_CONST WebRtc_Word16 *in_vector, WebRtc_Word16 *out_vector,
- WebRtc_Word16 gain, WebRtc_Word16 in_vector_length,
- WebRtc_Word16 right_shifts)
-{
- // Performs vector operation: out_vector = (gain*in_vector)>>right_shifts
- int i;
- WebRtc_Word32 tmpW32;
- G_CONST WebRtc_Word16 *inptr;
- WebRtc_Word16 *outptr;
-
- inptr = in_vector;
- outptr = out_vector;
-
- for (i = 0; i < in_vector_length; i++)
- {
- tmpW32 = WEBRTC_SPL_MUL_16_16_RSFT(*inptr++, gain, right_shifts);
- ( *outptr++) = (WebRtc_Word16)WEBRTC_SPL_SAT(32767, tmpW32, -32768);
- }
-}
-
-void WebRtcSpl_ScaleAndAddVectors(G_CONST WebRtc_Word16 *in1, WebRtc_Word16 gain1, int shift1,
- G_CONST WebRtc_Word16 *in2, WebRtc_Word16 gain2, int shift2,
- WebRtc_Word16 *out, int vector_length)
-{
- // Performs vector operation: out = (gain1*in1)>>shift1 + (gain2*in2)>>shift2
- int i;
- G_CONST WebRtc_Word16 *in1ptr;
- G_CONST WebRtc_Word16 *in2ptr;
- WebRtc_Word16 *outptr;
-
- in1ptr = in1;
- in2ptr = in2;
- outptr = out;
-
- for (i = 0; i < vector_length; i++)
- {
- (*outptr++) = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(gain1, *in1ptr++, shift1)
- + (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(gain2, *in2ptr++, shift2);
- }
-}
diff --git a/src/common_audio/signal_processing_library/main/source/webrtc_fft_4ofq14_gcc_android.s b/src/common_audio/signal_processing_library/main/source/webrtc_fft_4ofq14_gcc_android.s
deleted file mode 100644
index c1a893b..0000000
--- a/src/common_audio/signal_processing_library/main/source/webrtc_fft_4ofq14_gcc_android.s
+++ /dev/null
@@ -1,227 +0,0 @@
- .globl FFT_4OFQ14
-
-FFT_4OFQ14:
- stmdb sp!, {r4 - r11, lr}
- ldr lr, =s_Q14S_8
- ldr lr, [lr]
- cmp r2, lr
- movgt r0, #1
- ldmgtia sp!, {r4 - r11, pc}
- stmdb sp!, {r1, r2}
- mov r3, #0
- mov r2, r2
-
-LBL1:
- add r12, r0, r3, lsl #2
- add r12, r12, r2, lsr #1
- ldrsh r5, [r12, #2]
- ldrsh r4, [r12], +r2
- ldrsh r9, [r12, #2]
- ldrsh r8, [r12], +r2
- ldrsh r7, [r12, #2]
- ldrsh r6, [r12], +r2
- ldrsh r11, [r12, #2]
- ldrsh r10, [r12], +r2
- add r4, r4, r6
- add r5, r5, r7
- sub r6, r4, r6, lsl #1
- sub r7, r5, r7, lsl #1
- sub r12, r8, r10
- sub lr, r9, r11
- add r10, r8, r10
- add r11, r9, r11
- sub r9, r4, r10
- sub r8, r5, r11
- add r4, r4, r10
- add r5, r5, r11
- sub r10, r6, lr
- add r11, r7, r12
- add r6, r6, lr
- sub r7, r7, r12
- ldr lr, =t_Q14R_rad8
- ldrsh lr, [lr]
- stmdb sp!, {r2}
- add r12, r6, r7
- mul r6, r12, lr
- rsb r12, r12, r7, lsl #1
- mul r7, r12, lr
- sub r12, r11, r10
- mul r10, r12, lr
- sub r12, r12, r11, lsl #1
- mul r11, r12, lr
- ldmia sp!, {r2}
- stmdb sp!, {r4 - r11}
- add r4, r0, r3, lsl #2
- ldrsh r7, [r4, #2]
- ldrsh r6, [r4], +r2
- ldrsh r11, [r4, #2]
- ldrsh r10, [r4], +r2
- ldrsh r9, [r4, #2]
- ldrsh r8, [r4], +r2
- ldrsh lr, [r4, #2]
- ldrsh r12, [r4], +r2
- mov r7, r7, asr #3
- mov r6, r6, asr #3
- add r6, r6, r8, asr #3
- add r7, r7, r9, asr #3
- sub r8, r6, r8, asr #2
- sub r9, r7, r9, asr #2
- sub r4, r10, r12
- sub r5, r11, lr
- add r10, r10, r12
- add r11, r11, lr
- add r6, r6, r10, asr #3
- add r7, r7, r11, asr #3
- sub r10, r6, r10, asr #2
- sub r11, r7, r11, asr #2
- sub r12, r8, r5, asr #3
- add lr, r9, r4, asr #3
- add r8, r8, r5, asr #3
- sub r9, r9, r4, asr #3
- ldmia sp!, {r4, r5}
- add r6, r6, r4, asr #3
- add r7, r7, r5, asr #3
- sub r4, r6, r4, asr #2
- sub r5, r7, r5, asr #2
- strh r7, [r1, #2]
- strh r6, [r1], #4
- ldmia sp!, {r6, r7}
- add r8, r8, r6, asr #17
- add r9, r9, r7, asr #17
- sub r6, r8, r6, asr #16
- sub r7, r9, r7, asr #16
- strh r9, [r1, #2]
- strh r8, [r1], #4
- ldmia sp!, {r8, r9}
- add r10, r10, r8, asr #3
- sub r11, r11, r9, asr #3
- sub r8, r10, r8, asr #2
- add r9, r11, r9, asr #2
- strh r11, [r1, #2]
- strh r10, [r1], #4
- ldmia sp!, {r10, r11}
- add r12, r12, r10, asr #17
- add lr, lr, r11, asr #17
- sub r10, r12, r10, asr #16
- sub r11, lr, r11, asr #16
- strh lr, [r1, #2]
- strh r12, [r1], #4
- strh r5, [r1, #2]
- strh r4, [r1], #4
- strh r7, [r1, #2]
- strh r6, [r1], #4
- strh r9, [r1, #2]
- strh r8, [r1], #4
- strh r11, [r1, #2]
- strh r10, [r1], #4
- eor r3, r3, r2, lsr #4
- tst r3, r2, lsr #4
- bne LBL1
-
- eor r3, r3, r2, lsr #5
- tst r3, r2, lsr #5
- bne LBL1
-
- mov r12, r2, lsr #6
-
-LBL2:
- eor r3, r3, r12
- tst r3, r12
- bne LBL1
-
- movs r12, r12, lsr #1
- bne LBL2
-
- ldmia sp!, {r1, r2}
- mov r3, r2, lsr #3
- mov r2, #0x20
- ldr r0, =t_Q14S_8
- cmp r3, #1
- beq LBL3
-
-LBL6:
- mov r3, r3, lsr #2
- stmdb sp!, {r1, r3}
- add r12, r2, r2, lsl #1
- add r1, r1, r12
- sub r3, r3, #1, 16
-
-LBL5:
- add r3, r3, r2, lsl #14
-
-LBL4:
- ldrsh r6, [r0], #2
- ldrsh r7, [r0], #2
- ldrsh r8, [r0], #2
- ldrsh r9, [r0], #2
- ldrsh r10, [r0], #2
- ldrsh r11, [r0], #2
- ldrsh r5, [r1, #2]
- ldrsh r4, [r1], -r2
- sub lr, r5, r4
- mul r12, lr, r11
- add lr, r10, r11, lsl #1
- mla r11, r5, r10, r12
- mla r10, r4, lr, r12
- ldrsh r5, [r1, #2]
- ldrsh r4, [r1], -r2
- sub lr, r5, r4
- mul r12, lr, r9
- add lr, r8, r9, lsl #1
- mla r9, r5, r8, r12
- mla r8, r4, lr, r12
- ldrsh r5, [r1, #2]
- ldrsh r4, [r1], -r2
- sub lr, r5, r4
- mul r12, lr, r7
- add lr, r6, r7, lsl #1
- mla r7, r5, r6, r12
- mla r6, r4, lr, r12
- ldrsh r5, [r1, #2]
- ldrsh r4, [r1]
- mov r5, r5, asr #2
- mov r4, r4, asr #2
- add r12, r4, r6, asr #16
- add lr, r5, r7, asr #16
- sub r4, r4, r6, asr #16
- sub r5, r5, r7, asr #16
- add r6, r8, r10
- add r7, r9, r11
- sub r8, r8, r10
- sub r9, r9, r11
- add r10, r12, r6, asr #16
- add r11, lr, r7, asr #16
- strh r11, [r1, #2]
- strh r10, [r1], +r2
- add r10, r4, r9, asr #16
- sub r11, r5, r8, asr #16
- strh r11, [r1, #2]
- strh r10, [r1], +r2
- sub r10, r12, r6, asr #16
- sub r11, lr, r7, asr #16
- strh r11, [r1, #2]
- strh r10, [r1], +r2
- sub r10, r4, r9, asr #16
- add r11, r5, r8, asr #16
- strh r11, [r1, #2]
- strh r10, [r1], #4
- subs r3, r3, #1, 16
- bge LBL4
- add r12, r2, r2, lsl #1
- add r1, r1, r12
- sub r0, r0, r12
- sub r3, r3, #1
- movs lr, r3, lsl #16
- bne LBL5
- add r0, r0, r12
- ldmia sp!, {r1, r3}
- mov r2, r2, lsl #2
- cmp r3, #2
- bgt LBL6
-
-LBL3:
- mov r0, #0
- ldmia sp!, {r4 - r11, pc}
- andeq r3, r1, r0, lsr #32
- andeq r10, r1, r12, ror #31
- andeq r3, r1, r8, lsr #32
diff --git a/src/common_audio/signal_processing_library/main/source/webrtc_fft_4oiq14_gcc_android.s b/src/common_audio/signal_processing_library/main/source/webrtc_fft_4oiq14_gcc_android.s
deleted file mode 100644
index cc93291..0000000
--- a/src/common_audio/signal_processing_library/main/source/webrtc_fft_4oiq14_gcc_android.s
+++ /dev/null
@@ -1,221 +0,0 @@
- .globl FFT_4OIQ14
-
-FFT_4OIQ14:
- stmdb sp!, {r4 - r11, lr}
- ldr lr, =s_Q14S_8
- ldr lr, [lr]
- cmp r2, lr
- movgt r0, #1
- ldmgtia sp!, {r4 - r11, pc}
- stmdb sp!, {r1, r2}
- mov r3, #0
- mov r2, r2
-
-LBL1:
- add r12, r0, r3, lsl #2
- add r12, r12, r2, lsr #1
- ldrsh r5, [r12, #2]
- ldrsh r4, [r12], +r2
- ldrsh r9, [r12, #2]
- ldrsh r8, [r12], +r2
- ldrsh r7, [r12, #2]
- ldrsh r6, [r12], +r2
- ldrsh r11, [r12, #2]
- ldrsh r10, [r12], +r2
- add r4, r4, r6
- add r5, r5, r7
- sub r6, r4, r6, lsl #1
- sub r7, r5, r7, lsl #1
- sub r12, r8, r10
- sub lr, r9, r11
- add r10, r8, r10
- add r11, r9, r11
- sub r9, r4, r10
- sub r8, r5, r11
- add r4, r4, r10
- add r5, r5, r11
- add r10, r6, lr
- sub r11, r7, r12
- sub r6, r6, lr
- add r7, r7, r12
- ldr lr, =t_Q14R_rad8
- ldrsh lr, [lr]
- stmdb sp!, {r2}
- sub r12, r6, r7
- mul r6, r12, lr
- add r12, r12, r7, lsl #1
- mul r7, r12, lr
- sub r12, r10, r11
- mul r11, r12, lr
- sub r12, r12, r10, lsl #1
- mul r10, r12, lr
- ldmia sp!, {r2}
- stmdb sp!, {r4 - r11}
- add r4, r0, r3, lsl #2
- ldrsh r7, [r4, #2]
- ldrsh r6, [r4], +r2
- ldrsh r11, [r4, #2]
- ldrsh r10, [r4], +r2
- ldrsh r9, [r4, #2]
- ldrsh r8, [r4], +r2
- ldrsh lr, [r4, #2]
- ldrsh r12, [r4], +r2
- add r6, r6, r8
- add r7, r7, r9
- sub r8, r6, r8, lsl #1
- sub r9, r7, r9, lsl #1
- sub r4, r10, r12
- sub r5, r11, lr
- add r10, r10, r12
- add r11, r11, lr
- add r6, r6, r10
- add r7, r7, r11
- sub r10, r6, r10, lsl #1
- sub r11, r7, r11, lsl #1
- add r12, r8, r5
- sub lr, r9, r4
- sub r8, r8, r5
- add r9, r9, r4
- ldmia sp!, {r4, r5}
- add r6, r6, r4
- add r7, r7, r5
- sub r4, r6, r4, lsl #1
- sub r5, r7, r5, lsl #1
- strh r7, [r1, #2]
- strh r6, [r1], #4
- ldmia sp!, {r6, r7}
- add r8, r8, r6, asr #14
- add r9, r9, r7, asr #14
- sub r6, r8, r6, asr #13
- sub r7, r9, r7, asr #13
- strh r9, [r1, #2]
- strh r8, [r1], #4
- ldmia sp!, {r8, r9}
- sub r10, r10, r8
- add r11, r11, r9
- add r8, r10, r8, lsl #1
- sub r9, r11, r9, lsl #1
- strh r11, [r1, #2]
- strh r10, [r1], #4
- ldmia sp!, {r10, r11}
- add r12, r12, r10, asr #14
- add lr, lr, r11, asr #14
- sub r10, r12, r10, asr #13
- sub r11, lr, r11, asr #13
- strh lr, [r1, #2]
- strh r12, [r1], #4
- strh r5, [r1, #2]
- strh r4, [r1], #4
- strh r7, [r1, #2]
- strh r6, [r1], #4
- strh r9, [r1, #2]
- strh r8, [r1], #4
- strh r11, [r1, #2]
- strh r10, [r1], #4
- eor r3, r3, r2, lsr #4
- tst r3, r2, lsr #4
- bne LBL1
- eor r3, r3, r2, lsr #5
- tst r3, r2, lsr #5
- bne LBL1
- mov r12, r2, lsr #6
-
-
-LBL2:
- eor r3, r3, r12
- tst r3, r12
- bne LBL1
- movs r12, r12, lsr #1
- bne LBL2
- ldmia sp!, {r1, r2}
- mov r3, r2, lsr #3
- mov r2, #0x20
- ldr r0, =t_Q14S_8
- cmp r3, #1
- beq LBL3
-
-LBL6:
- mov r3, r3, lsr #2
- stmdb sp!, {r1, r3}
- add r12, r2, r2, lsl #1
- add r1, r1, r12
- sub r3, r3, #1, 16
-
-LBL5:
- add r3, r3, r2, lsl #14
-
-LBL4:
- ldrsh r6, [r0], #2
- ldrsh r7, [r0], #2
- ldrsh r8, [r0], #2
- ldrsh r9, [r0], #2
- ldrsh r10, [r0], #2
- ldrsh r11, [r0], #2
- ldrsh r5, [r1, #2]
- ldrsh r4, [r1], -r2
- sub lr, r4, r5
- mul r12, lr, r11
- add r11, r10, r11, lsl #1
- mla r10, r4, r10, r12
- mla r11, r5, r11, r12
- ldrsh r5, [r1, #2]
- ldrsh r4, [r1], -r2
- sub lr, r4, r5
- mul r12, lr, r9
- add r9, r8, r9, lsl #1
- mla r8, r4, r8, r12
- mla r9, r5, r9, r12
- ldrsh r5, [r1, #2]
- ldrsh r4, [r1], -r2
- sub lr, r4, r5
- mul r12, lr, r7
- add r7, r6, r7, lsl #1
- mla r6, r4, r6, r12
- mla r7, r5, r7, r12
- ldrsh r5, [r1, #2]
- ldrsh r4, [r1]
- add r12, r4, r6, asr #14
- add lr, r5, r7, asr #14
- sub r4, r4, r6, asr #14
- sub r5, r5, r7, asr #14
- add r6, r8, r10
- add r7, r9, r11
- sub r8, r8, r10
- sub r9, r9, r11
- add r10, r12, r6, asr #14
- add r11, lr, r7, asr #14
- strh r11, [r1, #2]
- strh r10, [r1], +r2
- sub r10, r4, r9, asr #14
- add r11, r5, r8, asr #14
- strh r11, [r1, #2]
- strh r10, [r1], +r2
- sub r10, r12, r6, asr #14
- sub r11, lr, r7, asr #14
- strh r11, [r1, #2]
- strh r10, [r1], +r2
- add r10, r4, r9, asr #14
- sub r11, r5, r8, asr #14
- strh r11, [r1, #2]
- strh r10, [r1], #4
- subs r3, r3, #1, 16
- bge LBL4
- add r12, r2, r2, lsl #1
- add r1, r1, r12
- sub r0, r0, r12
- sub r3, r3, #1
- movs lr, r3, lsl #16
- bne LBL5
- add r0, r0, r12
- ldmia sp!, {r1, r3}
- mov r2, r2, lsl #2
- cmp r3, #2
- bgt LBL6
-
-LBL3:
- mov r0, #0
- ldmia sp!, {r4 - r11, pc}
- andeq r3, r1, r0, lsr #32
- andeq r10, r1, r12, ror #31
- andeq r3, r1, r8, lsr #32
-
diff --git a/src/common_audio/signal_processing_library/main/source/webrtc_fft_t_1024_8.c b/src/common_audio/signal_processing_library/main/source/webrtc_fft_t_1024_8.c
deleted file mode 100644
index b587380..0000000
--- a/src/common_audio/signal_processing_library/main/source/webrtc_fft_t_1024_8.c
+++ /dev/null
@@ -1,704 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the Q14 radix-8 tables used in ARM9e optimizations.
- *
- */
-
-extern const int s_Q14S_8;
-const int s_Q14S_8 = 1024;
-extern const unsigned short t_Q14S_8[2032];
-const unsigned short t_Q14S_8[2032] = {
- 0x4000,0x0000 ,0x4000,0x0000 ,0x4000,0x0000 ,
- 0x22a3,0x187e ,0x3249,0x0c7c ,0x11a8,0x238e ,
- 0x0000,0x2d41 ,0x22a3,0x187e ,0xdd5d,0x3b21 ,
- 0xdd5d,0x3b21 ,0x11a8,0x238e ,0xb4be,0x3ec5 ,
- 0xc000,0x4000 ,0x0000,0x2d41 ,0xa57e,0x2d41 ,
- 0xac61,0x3b21 ,0xee58,0x3537 ,0xb4be,0x0c7c ,
- 0xa57e,0x2d41 ,0xdd5d,0x3b21 ,0xdd5d,0xe782 ,
- 0xac61,0x187e ,0xcdb7,0x3ec5 ,0x11a8,0xcac9 ,
- 0x4000,0x0000 ,0x4000,0x0000 ,0x4000,0x0000 ,
- 0x396b,0x0646 ,0x3cc8,0x0324 ,0x35eb,0x0964 ,
- 0x3249,0x0c7c ,0x396b,0x0646 ,0x2aaa,0x1294 ,
- 0x2aaa,0x1294 ,0x35eb,0x0964 ,0x1e7e,0x1b5d ,
- 0x22a3,0x187e ,0x3249,0x0c7c ,0x11a8,0x238e ,
- 0x1a46,0x1e2b ,0x2e88,0x0f8d ,0x0471,0x2afb ,
- 0x11a8,0x238e ,0x2aaa,0x1294 ,0xf721,0x3179 ,
- 0x08df,0x289a ,0x26b3,0x1590 ,0xea02,0x36e5 ,
- 0x0000,0x2d41 ,0x22a3,0x187e ,0xdd5d,0x3b21 ,
- 0xf721,0x3179 ,0x1e7e,0x1b5d ,0xd178,0x3e15 ,
- 0xee58,0x3537 ,0x1a46,0x1e2b ,0xc695,0x3fb1 ,
- 0xe5ba,0x3871 ,0x15fe,0x20e7 ,0xbcf0,0x3fec ,
- 0xdd5d,0x3b21 ,0x11a8,0x238e ,0xb4be,0x3ec5 ,
- 0xd556,0x3d3f ,0x0d48,0x2620 ,0xae2e,0x3c42 ,
- 0xcdb7,0x3ec5 ,0x08df,0x289a ,0xa963,0x3871 ,
- 0xc695,0x3fb1 ,0x0471,0x2afb ,0xa678,0x3368 ,
- 0xc000,0x4000 ,0x0000,0x2d41 ,0xa57e,0x2d41 ,
- 0xba09,0x3fb1 ,0xfb8f,0x2f6c ,0xa678,0x2620 ,
- 0xb4be,0x3ec5 ,0xf721,0x3179 ,0xa963,0x1e2b ,
- 0xb02d,0x3d3f ,0xf2b8,0x3368 ,0xae2e,0x1590 ,
- 0xac61,0x3b21 ,0xee58,0x3537 ,0xb4be,0x0c7c ,
- 0xa963,0x3871 ,0xea02,0x36e5 ,0xbcf0,0x0324 ,
- 0xa73b,0x3537 ,0xe5ba,0x3871 ,0xc695,0xf9ba ,
- 0xa5ed,0x3179 ,0xe182,0x39db ,0xd178,0xf073 ,
- 0xa57e,0x2d41 ,0xdd5d,0x3b21 ,0xdd5d,0xe782 ,
- 0xa5ed,0x289a ,0xd94d,0x3c42 ,0xea02,0xdf19 ,
- 0xa73b,0x238e ,0xd556,0x3d3f ,0xf721,0xd766 ,
- 0xa963,0x1e2b ,0xd178,0x3e15 ,0x0471,0xd094 ,
- 0xac61,0x187e ,0xcdb7,0x3ec5 ,0x11a8,0xcac9 ,
- 0xb02d,0x1294 ,0xca15,0x3f4f ,0x1e7e,0xc625 ,
- 0xb4be,0x0c7c ,0xc695,0x3fb1 ,0x2aaa,0xc2c1 ,
- 0xba09,0x0646 ,0xc338,0x3fec ,0x35eb,0xc0b1 ,
- 0x4000,0x0000 ,0x4000,0x0000 ,0x4000,0x0000 ,
- 0x3e69,0x0192 ,0x3f36,0x00c9 ,0x3d9a,0x025b ,
- 0x3cc8,0x0324 ,0x3e69,0x0192 ,0x3b1e,0x04b5 ,
- 0x3b1e,0x04b5 ,0x3d9a,0x025b ,0x388e,0x070e ,
- 0x396b,0x0646 ,0x3cc8,0x0324 ,0x35eb,0x0964 ,
- 0x37af,0x07d6 ,0x3bf4,0x03ed ,0x3334,0x0bb7 ,
- 0x35eb,0x0964 ,0x3b1e,0x04b5 ,0x306c,0x0e06 ,
- 0x341e,0x0af1 ,0x3a46,0x057e ,0x2d93,0x1050 ,
- 0x3249,0x0c7c ,0x396b,0x0646 ,0x2aaa,0x1294 ,
- 0x306c,0x0e06 ,0x388e,0x070e ,0x27b3,0x14d2 ,
- 0x2e88,0x0f8d ,0x37af,0x07d6 ,0x24ae,0x1709 ,
- 0x2c9d,0x1112 ,0x36ce,0x089d ,0x219c,0x1937 ,
- 0x2aaa,0x1294 ,0x35eb,0x0964 ,0x1e7e,0x1b5d ,
- 0x28b2,0x1413 ,0x3505,0x0a2b ,0x1b56,0x1d79 ,
- 0x26b3,0x1590 ,0x341e,0x0af1 ,0x1824,0x1f8c ,
- 0x24ae,0x1709 ,0x3334,0x0bb7 ,0x14ea,0x2193 ,
- 0x22a3,0x187e ,0x3249,0x0c7c ,0x11a8,0x238e ,
- 0x2093,0x19ef ,0x315b,0x0d41 ,0x0e61,0x257e ,
- 0x1e7e,0x1b5d ,0x306c,0x0e06 ,0x0b14,0x2760 ,
- 0x1c64,0x1cc6 ,0x2f7b,0x0eca ,0x07c4,0x2935 ,
- 0x1a46,0x1e2b ,0x2e88,0x0f8d ,0x0471,0x2afb ,
- 0x1824,0x1f8c ,0x2d93,0x1050 ,0x011c,0x2cb2 ,
- 0x15fe,0x20e7 ,0x2c9d,0x1112 ,0xfdc7,0x2e5a ,
- 0x13d5,0x223d ,0x2ba4,0x11d3 ,0xfa73,0x2ff2 ,
- 0x11a8,0x238e ,0x2aaa,0x1294 ,0xf721,0x3179 ,
- 0x0f79,0x24da ,0x29af,0x1354 ,0xf3d2,0x32ef ,
- 0x0d48,0x2620 ,0x28b2,0x1413 ,0xf087,0x3453 ,
- 0x0b14,0x2760 ,0x27b3,0x14d2 ,0xed41,0x35a5 ,
- 0x08df,0x289a ,0x26b3,0x1590 ,0xea02,0x36e5 ,
- 0x06a9,0x29ce ,0x25b1,0x164c ,0xe6cb,0x3812 ,
- 0x0471,0x2afb ,0x24ae,0x1709 ,0xe39c,0x392b ,
- 0x0239,0x2c21 ,0x23a9,0x17c4 ,0xe077,0x3a30 ,
- 0x0000,0x2d41 ,0x22a3,0x187e ,0xdd5d,0x3b21 ,
- 0xfdc7,0x2e5a ,0x219c,0x1937 ,0xda4f,0x3bfd ,
- 0xfb8f,0x2f6c ,0x2093,0x19ef ,0xd74e,0x3cc5 ,
- 0xf957,0x3076 ,0x1f89,0x1aa7 ,0xd45c,0x3d78 ,
- 0xf721,0x3179 ,0x1e7e,0x1b5d ,0xd178,0x3e15 ,
- 0xf4ec,0x3274 ,0x1d72,0x1c12 ,0xcea5,0x3e9d ,
- 0xf2b8,0x3368 ,0x1c64,0x1cc6 ,0xcbe2,0x3f0f ,
- 0xf087,0x3453 ,0x1b56,0x1d79 ,0xc932,0x3f6b ,
- 0xee58,0x3537 ,0x1a46,0x1e2b ,0xc695,0x3fb1 ,
- 0xec2b,0x3612 ,0x1935,0x1edc ,0xc40c,0x3fe1 ,
- 0xea02,0x36e5 ,0x1824,0x1f8c ,0xc197,0x3ffb ,
- 0xe7dc,0x37b0 ,0x1711,0x203a ,0xbf38,0x3fff ,
- 0xe5ba,0x3871 ,0x15fe,0x20e7 ,0xbcf0,0x3fec ,
- 0xe39c,0x392b ,0x14ea,0x2193 ,0xbabf,0x3fc4 ,
- 0xe182,0x39db ,0x13d5,0x223d ,0xb8a6,0x3f85 ,
- 0xdf6d,0x3a82 ,0x12bf,0x22e7 ,0xb6a5,0x3f30 ,
- 0xdd5d,0x3b21 ,0x11a8,0x238e ,0xb4be,0x3ec5 ,
- 0xdb52,0x3bb6 ,0x1091,0x2435 ,0xb2f2,0x3e45 ,
- 0xd94d,0x3c42 ,0x0f79,0x24da ,0xb140,0x3daf ,
- 0xd74e,0x3cc5 ,0x0e61,0x257e ,0xafa9,0x3d03 ,
- 0xd556,0x3d3f ,0x0d48,0x2620 ,0xae2e,0x3c42 ,
- 0xd363,0x3daf ,0x0c2e,0x26c1 ,0xacd0,0x3b6d ,
- 0xd178,0x3e15 ,0x0b14,0x2760 ,0xab8e,0x3a82 ,
- 0xcf94,0x3e72 ,0x09fa,0x27fe ,0xaa6a,0x3984 ,
- 0xcdb7,0x3ec5 ,0x08df,0x289a ,0xa963,0x3871 ,
- 0xcbe2,0x3f0f ,0x07c4,0x2935 ,0xa87b,0x374b ,
- 0xca15,0x3f4f ,0x06a9,0x29ce ,0xa7b1,0x3612 ,
- 0xc851,0x3f85 ,0x058d,0x2a65 ,0xa705,0x34c6 ,
- 0xc695,0x3fb1 ,0x0471,0x2afb ,0xa678,0x3368 ,
- 0xc4e2,0x3fd4 ,0x0355,0x2b8f ,0xa60b,0x31f8 ,
- 0xc338,0x3fec ,0x0239,0x2c21 ,0xa5bc,0x3076 ,
- 0xc197,0x3ffb ,0x011c,0x2cb2 ,0xa58d,0x2ee4 ,
- 0xc000,0x4000 ,0x0000,0x2d41 ,0xa57e,0x2d41 ,
- 0xbe73,0x3ffb ,0xfee4,0x2dcf ,0xa58d,0x2b8f ,
- 0xbcf0,0x3fec ,0xfdc7,0x2e5a ,0xa5bc,0x29ce ,
- 0xbb77,0x3fd4 ,0xfcab,0x2ee4 ,0xa60b,0x27fe ,
- 0xba09,0x3fb1 ,0xfb8f,0x2f6c ,0xa678,0x2620 ,
- 0xb8a6,0x3f85 ,0xfa73,0x2ff2 ,0xa705,0x2435 ,
- 0xb74d,0x3f4f ,0xf957,0x3076 ,0xa7b1,0x223d ,
- 0xb600,0x3f0f ,0xf83c,0x30f9 ,0xa87b,0x203a ,
- 0xb4be,0x3ec5 ,0xf721,0x3179 ,0xa963,0x1e2b ,
- 0xb388,0x3e72 ,0xf606,0x31f8 ,0xaa6a,0x1c12 ,
- 0xb25e,0x3e15 ,0xf4ec,0x3274 ,0xab8e,0x19ef ,
- 0xb140,0x3daf ,0xf3d2,0x32ef ,0xacd0,0x17c4 ,
- 0xb02d,0x3d3f ,0xf2b8,0x3368 ,0xae2e,0x1590 ,
- 0xaf28,0x3cc5 ,0xf19f,0x33df ,0xafa9,0x1354 ,
- 0xae2e,0x3c42 ,0xf087,0x3453 ,0xb140,0x1112 ,
- 0xad41,0x3bb6 ,0xef6f,0x34c6 ,0xb2f2,0x0eca ,
- 0xac61,0x3b21 ,0xee58,0x3537 ,0xb4be,0x0c7c ,
- 0xab8e,0x3a82 ,0xed41,0x35a5 ,0xb6a5,0x0a2b ,
- 0xaac8,0x39db ,0xec2b,0x3612 ,0xb8a6,0x07d6 ,
- 0xaa0f,0x392b ,0xeb16,0x367d ,0xbabf,0x057e ,
- 0xa963,0x3871 ,0xea02,0x36e5 ,0xbcf0,0x0324 ,
- 0xa8c5,0x37b0 ,0xe8ef,0x374b ,0xbf38,0x00c9 ,
- 0xa834,0x36e5 ,0xe7dc,0x37b0 ,0xc197,0xfe6e ,
- 0xa7b1,0x3612 ,0xe6cb,0x3812 ,0xc40c,0xfc13 ,
- 0xa73b,0x3537 ,0xe5ba,0x3871 ,0xc695,0xf9ba ,
- 0xa6d3,0x3453 ,0xe4aa,0x38cf ,0xc932,0xf763 ,
- 0xa678,0x3368 ,0xe39c,0x392b ,0xcbe2,0xf50f ,
- 0xa62c,0x3274 ,0xe28e,0x3984 ,0xcea5,0xf2bf ,
- 0xa5ed,0x3179 ,0xe182,0x39db ,0xd178,0xf073 ,
- 0xa5bc,0x3076 ,0xe077,0x3a30 ,0xd45c,0xee2d ,
- 0xa599,0x2f6c ,0xdf6d,0x3a82 ,0xd74e,0xebed ,
- 0xa585,0x2e5a ,0xde64,0x3ad3 ,0xda4f,0xe9b4 ,
- 0xa57e,0x2d41 ,0xdd5d,0x3b21 ,0xdd5d,0xe782 ,
- 0xa585,0x2c21 ,0xdc57,0x3b6d ,0xe077,0xe559 ,
- 0xa599,0x2afb ,0xdb52,0x3bb6 ,0xe39c,0xe33a ,
- 0xa5bc,0x29ce ,0xda4f,0x3bfd ,0xe6cb,0xe124 ,
- 0xa5ed,0x289a ,0xd94d,0x3c42 ,0xea02,0xdf19 ,
- 0xa62c,0x2760 ,0xd84d,0x3c85 ,0xed41,0xdd19 ,
- 0xa678,0x2620 ,0xd74e,0x3cc5 ,0xf087,0xdb26 ,
- 0xa6d3,0x24da ,0xd651,0x3d03 ,0xf3d2,0xd93f ,
- 0xa73b,0x238e ,0xd556,0x3d3f ,0xf721,0xd766 ,
- 0xa7b1,0x223d ,0xd45c,0x3d78 ,0xfa73,0xd59b ,
- 0xa834,0x20e7 ,0xd363,0x3daf ,0xfdc7,0xd3df ,
- 0xa8c5,0x1f8c ,0xd26d,0x3de3 ,0x011c,0xd231 ,
- 0xa963,0x1e2b ,0xd178,0x3e15 ,0x0471,0xd094 ,
- 0xaa0f,0x1cc6 ,0xd085,0x3e45 ,0x07c4,0xcf07 ,
- 0xaac8,0x1b5d ,0xcf94,0x3e72 ,0x0b14,0xcd8c ,
- 0xab8e,0x19ef ,0xcea5,0x3e9d ,0x0e61,0xcc21 ,
- 0xac61,0x187e ,0xcdb7,0x3ec5 ,0x11a8,0xcac9 ,
- 0xad41,0x1709 ,0xcccc,0x3eeb ,0x14ea,0xc983 ,
- 0xae2e,0x1590 ,0xcbe2,0x3f0f ,0x1824,0xc850 ,
- 0xaf28,0x1413 ,0xcafb,0x3f30 ,0x1b56,0xc731 ,
- 0xb02d,0x1294 ,0xca15,0x3f4f ,0x1e7e,0xc625 ,
- 0xb140,0x1112 ,0xc932,0x3f6b ,0x219c,0xc52d ,
- 0xb25e,0x0f8d ,0xc851,0x3f85 ,0x24ae,0xc44a ,
- 0xb388,0x0e06 ,0xc772,0x3f9c ,0x27b3,0xc37b ,
- 0xb4be,0x0c7c ,0xc695,0x3fb1 ,0x2aaa,0xc2c1 ,
- 0xb600,0x0af1 ,0xc5ba,0x3fc4 ,0x2d93,0xc21d ,
- 0xb74d,0x0964 ,0xc4e2,0x3fd4 ,0x306c,0xc18e ,
- 0xb8a6,0x07d6 ,0xc40c,0x3fe1 ,0x3334,0xc115 ,
- 0xba09,0x0646 ,0xc338,0x3fec ,0x35eb,0xc0b1 ,
- 0xbb77,0x04b5 ,0xc266,0x3ff5 ,0x388e,0xc064 ,
- 0xbcf0,0x0324 ,0xc197,0x3ffb ,0x3b1e,0xc02c ,
- 0xbe73,0x0192 ,0xc0ca,0x3fff ,0x3d9a,0xc00b ,
- 0x4000,0x0000 ,0x3f9b,0x0065 ,0x3f36,0x00c9 ,
- 0x3ed0,0x012e ,0x3e69,0x0192 ,0x3e02,0x01f7 ,
- 0x3d9a,0x025b ,0x3d31,0x02c0 ,0x3cc8,0x0324 ,
- 0x3c5f,0x0388 ,0x3bf4,0x03ed ,0x3b8a,0x0451 ,
- 0x3b1e,0x04b5 ,0x3ab2,0x051a ,0x3a46,0x057e ,
- 0x39d9,0x05e2 ,0x396b,0x0646 ,0x38fd,0x06aa ,
- 0x388e,0x070e ,0x381f,0x0772 ,0x37af,0x07d6 ,
- 0x373f,0x0839 ,0x36ce,0x089d ,0x365d,0x0901 ,
- 0x35eb,0x0964 ,0x3578,0x09c7 ,0x3505,0x0a2b ,
- 0x3492,0x0a8e ,0x341e,0x0af1 ,0x33a9,0x0b54 ,
- 0x3334,0x0bb7 ,0x32bf,0x0c1a ,0x3249,0x0c7c ,
- 0x31d2,0x0cdf ,0x315b,0x0d41 ,0x30e4,0x0da4 ,
- 0x306c,0x0e06 ,0x2ff4,0x0e68 ,0x2f7b,0x0eca ,
- 0x2f02,0x0f2b ,0x2e88,0x0f8d ,0x2e0e,0x0fee ,
- 0x2d93,0x1050 ,0x2d18,0x10b1 ,0x2c9d,0x1112 ,
- 0x2c21,0x1173 ,0x2ba4,0x11d3 ,0x2b28,0x1234 ,
- 0x2aaa,0x1294 ,0x2a2d,0x12f4 ,0x29af,0x1354 ,
- 0x2931,0x13b4 ,0x28b2,0x1413 ,0x2833,0x1473 ,
- 0x27b3,0x14d2 ,0x2733,0x1531 ,0x26b3,0x1590 ,
- 0x2632,0x15ee ,0x25b1,0x164c ,0x252f,0x16ab ,
- 0x24ae,0x1709 ,0x242b,0x1766 ,0x23a9,0x17c4 ,
- 0x2326,0x1821 ,0x22a3,0x187e ,0x221f,0x18db ,
- 0x219c,0x1937 ,0x2117,0x1993 ,0x2093,0x19ef ,
- 0x200e,0x1a4b ,0x1f89,0x1aa7 ,0x1f04,0x1b02 ,
- 0x1e7e,0x1b5d ,0x1df8,0x1bb8 ,0x1d72,0x1c12 ,
- 0x1ceb,0x1c6c ,0x1c64,0x1cc6 ,0x1bdd,0x1d20 ,
- 0x1b56,0x1d79 ,0x1ace,0x1dd3 ,0x1a46,0x1e2b ,
- 0x19be,0x1e84 ,0x1935,0x1edc ,0x18ad,0x1f34 ,
- 0x1824,0x1f8c ,0x179b,0x1fe3 ,0x1711,0x203a ,
- 0x1688,0x2091 ,0x15fe,0x20e7 ,0x1574,0x213d ,
- 0x14ea,0x2193 ,0x145f,0x21e8 ,0x13d5,0x223d ,
- 0x134a,0x2292 ,0x12bf,0x22e7 ,0x1234,0x233b ,
- 0x11a8,0x238e ,0x111d,0x23e2 ,0x1091,0x2435 ,
- 0x1005,0x2488 ,0x0f79,0x24da ,0x0eed,0x252c ,
- 0x0e61,0x257e ,0x0dd4,0x25cf ,0x0d48,0x2620 ,
- 0x0cbb,0x2671 ,0x0c2e,0x26c1 ,0x0ba1,0x2711 ,
- 0x0b14,0x2760 ,0x0a87,0x27af ,0x09fa,0x27fe ,
- 0x096d,0x284c ,0x08df,0x289a ,0x0852,0x28e7 ,
- 0x07c4,0x2935 ,0x0736,0x2981 ,0x06a9,0x29ce ,
- 0x061b,0x2a1a ,0x058d,0x2a65 ,0x04ff,0x2ab0 ,
- 0x0471,0x2afb ,0x03e3,0x2b45 ,0x0355,0x2b8f ,
- 0x02c7,0x2bd8 ,0x0239,0x2c21 ,0x01aa,0x2c6a ,
- 0x011c,0x2cb2 ,0x008e,0x2cfa ,0x0000,0x2d41 ,
- 0xff72,0x2d88 ,0xfee4,0x2dcf ,0xfe56,0x2e15 ,
- 0xfdc7,0x2e5a ,0xfd39,0x2e9f ,0xfcab,0x2ee4 ,
- 0xfc1d,0x2f28 ,0xfb8f,0x2f6c ,0xfb01,0x2faf ,
- 0xfa73,0x2ff2 ,0xf9e5,0x3034 ,0xf957,0x3076 ,
- 0xf8ca,0x30b8 ,0xf83c,0x30f9 ,0xf7ae,0x3139 ,
- 0xf721,0x3179 ,0xf693,0x31b9 ,0xf606,0x31f8 ,
- 0xf579,0x3236 ,0xf4ec,0x3274 ,0xf45f,0x32b2 ,
- 0xf3d2,0x32ef ,0xf345,0x332c ,0xf2b8,0x3368 ,
- 0xf22c,0x33a3 ,0xf19f,0x33df ,0xf113,0x3419 ,
- 0xf087,0x3453 ,0xeffb,0x348d ,0xef6f,0x34c6 ,
- 0xeee3,0x34ff ,0xee58,0x3537 ,0xedcc,0x356e ,
- 0xed41,0x35a5 ,0xecb6,0x35dc ,0xec2b,0x3612 ,
- 0xeba1,0x3648 ,0xeb16,0x367d ,0xea8c,0x36b1 ,
- 0xea02,0x36e5 ,0xe978,0x3718 ,0xe8ef,0x374b ,
- 0xe865,0x377e ,0xe7dc,0x37b0 ,0xe753,0x37e1 ,
- 0xe6cb,0x3812 ,0xe642,0x3842 ,0xe5ba,0x3871 ,
- 0xe532,0x38a1 ,0xe4aa,0x38cf ,0xe423,0x38fd ,
- 0xe39c,0x392b ,0xe315,0x3958 ,0xe28e,0x3984 ,
- 0xe208,0x39b0 ,0xe182,0x39db ,0xe0fc,0x3a06 ,
- 0xe077,0x3a30 ,0xdff2,0x3a59 ,0xdf6d,0x3a82 ,
- 0xdee9,0x3aab ,0xde64,0x3ad3 ,0xdde1,0x3afa ,
- 0xdd5d,0x3b21 ,0xdcda,0x3b47 ,0xdc57,0x3b6d ,
- 0xdbd5,0x3b92 ,0xdb52,0x3bb6 ,0xdad1,0x3bda ,
- 0xda4f,0x3bfd ,0xd9ce,0x3c20 ,0xd94d,0x3c42 ,
- 0xd8cd,0x3c64 ,0xd84d,0x3c85 ,0xd7cd,0x3ca5 ,
- 0xd74e,0x3cc5 ,0xd6cf,0x3ce4 ,0xd651,0x3d03 ,
- 0xd5d3,0x3d21 ,0xd556,0x3d3f ,0xd4d8,0x3d5b ,
- 0xd45c,0x3d78 ,0xd3df,0x3d93 ,0xd363,0x3daf ,
- 0xd2e8,0x3dc9 ,0xd26d,0x3de3 ,0xd1f2,0x3dfc ,
- 0xd178,0x3e15 ,0xd0fe,0x3e2d ,0xd085,0x3e45 ,
- 0xd00c,0x3e5c ,0xcf94,0x3e72 ,0xcf1c,0x3e88 ,
- 0xcea5,0x3e9d ,0xce2e,0x3eb1 ,0xcdb7,0x3ec5 ,
- 0xcd41,0x3ed8 ,0xcccc,0x3eeb ,0xcc57,0x3efd ,
- 0xcbe2,0x3f0f ,0xcb6e,0x3f20 ,0xcafb,0x3f30 ,
- 0xca88,0x3f40 ,0xca15,0x3f4f ,0xc9a3,0x3f5d ,
- 0xc932,0x3f6b ,0xc8c1,0x3f78 ,0xc851,0x3f85 ,
- 0xc7e1,0x3f91 ,0xc772,0x3f9c ,0xc703,0x3fa7 ,
- 0xc695,0x3fb1 ,0xc627,0x3fbb ,0xc5ba,0x3fc4 ,
- 0xc54e,0x3fcc ,0xc4e2,0x3fd4 ,0xc476,0x3fdb ,
- 0xc40c,0x3fe1 ,0xc3a1,0x3fe7 ,0xc338,0x3fec ,
- 0xc2cf,0x3ff1 ,0xc266,0x3ff5 ,0xc1fe,0x3ff8 ,
- 0xc197,0x3ffb ,0xc130,0x3ffd ,0xc0ca,0x3fff ,
- 0xc065,0x4000 ,0xc000,0x4000 ,0xbf9c,0x4000 ,
- 0xbf38,0x3fff ,0xbed5,0x3ffd ,0xbe73,0x3ffb ,
- 0xbe11,0x3ff8 ,0xbdb0,0x3ff5 ,0xbd50,0x3ff1 ,
- 0xbcf0,0x3fec ,0xbc91,0x3fe7 ,0xbc32,0x3fe1 ,
- 0xbbd4,0x3fdb ,0xbb77,0x3fd4 ,0xbb1b,0x3fcc ,
- 0xbabf,0x3fc4 ,0xba64,0x3fbb ,0xba09,0x3fb1 ,
- 0xb9af,0x3fa7 ,0xb956,0x3f9c ,0xb8fd,0x3f91 ,
- 0xb8a6,0x3f85 ,0xb84f,0x3f78 ,0xb7f8,0x3f6b ,
- 0xb7a2,0x3f5d ,0xb74d,0x3f4f ,0xb6f9,0x3f40 ,
- 0xb6a5,0x3f30 ,0xb652,0x3f20 ,0xb600,0x3f0f ,
- 0xb5af,0x3efd ,0xb55e,0x3eeb ,0xb50e,0x3ed8 ,
- 0xb4be,0x3ec5 ,0xb470,0x3eb1 ,0xb422,0x3e9d ,
- 0xb3d5,0x3e88 ,0xb388,0x3e72 ,0xb33d,0x3e5c ,
- 0xb2f2,0x3e45 ,0xb2a7,0x3e2d ,0xb25e,0x3e15 ,
- 0xb215,0x3dfc ,0xb1cd,0x3de3 ,0xb186,0x3dc9 ,
- 0xb140,0x3daf ,0xb0fa,0x3d93 ,0xb0b5,0x3d78 ,
- 0xb071,0x3d5b ,0xb02d,0x3d3f ,0xafeb,0x3d21 ,
- 0xafa9,0x3d03 ,0xaf68,0x3ce4 ,0xaf28,0x3cc5 ,
- 0xaee8,0x3ca5 ,0xaea9,0x3c85 ,0xae6b,0x3c64 ,
- 0xae2e,0x3c42 ,0xadf2,0x3c20 ,0xadb6,0x3bfd ,
- 0xad7b,0x3bda ,0xad41,0x3bb6 ,0xad08,0x3b92 ,
- 0xacd0,0x3b6d ,0xac98,0x3b47 ,0xac61,0x3b21 ,
- 0xac2b,0x3afa ,0xabf6,0x3ad3 ,0xabc2,0x3aab ,
- 0xab8e,0x3a82 ,0xab5b,0x3a59 ,0xab29,0x3a30 ,
- 0xaaf8,0x3a06 ,0xaac8,0x39db ,0xaa98,0x39b0 ,
- 0xaa6a,0x3984 ,0xaa3c,0x3958 ,0xaa0f,0x392b ,
- 0xa9e3,0x38fd ,0xa9b7,0x38cf ,0xa98d,0x38a1 ,
- 0xa963,0x3871 ,0xa93a,0x3842 ,0xa912,0x3812 ,
- 0xa8eb,0x37e1 ,0xa8c5,0x37b0 ,0xa89f,0x377e ,
- 0xa87b,0x374b ,0xa857,0x3718 ,0xa834,0x36e5 ,
- 0xa812,0x36b1 ,0xa7f1,0x367d ,0xa7d0,0x3648 ,
- 0xa7b1,0x3612 ,0xa792,0x35dc ,0xa774,0x35a5 ,
- 0xa757,0x356e ,0xa73b,0x3537 ,0xa71f,0x34ff ,
- 0xa705,0x34c6 ,0xa6eb,0x348d ,0xa6d3,0x3453 ,
- 0xa6bb,0x3419 ,0xa6a4,0x33df ,0xa68e,0x33a3 ,
- 0xa678,0x3368 ,0xa664,0x332c ,0xa650,0x32ef ,
- 0xa63e,0x32b2 ,0xa62c,0x3274 ,0xa61b,0x3236 ,
- 0xa60b,0x31f8 ,0xa5fb,0x31b9 ,0xa5ed,0x3179 ,
- 0xa5e0,0x3139 ,0xa5d3,0x30f9 ,0xa5c7,0x30b8 ,
- 0xa5bc,0x3076 ,0xa5b2,0x3034 ,0xa5a9,0x2ff2 ,
- 0xa5a1,0x2faf ,0xa599,0x2f6c ,0xa593,0x2f28 ,
- 0xa58d,0x2ee4 ,0xa588,0x2e9f ,0xa585,0x2e5a ,
- 0xa581,0x2e15 ,0xa57f,0x2dcf ,0xa57e,0x2d88 ,
- 0xa57e,0x2d41 ,0xa57e,0x2cfa ,0xa57f,0x2cb2 ,
- 0xa581,0x2c6a ,0xa585,0x2c21 ,0xa588,0x2bd8 ,
- 0xa58d,0x2b8f ,0xa593,0x2b45 ,0xa599,0x2afb ,
- 0xa5a1,0x2ab0 ,0xa5a9,0x2a65 ,0xa5b2,0x2a1a ,
- 0xa5bc,0x29ce ,0xa5c7,0x2981 ,0xa5d3,0x2935 ,
- 0xa5e0,0x28e7 ,0xa5ed,0x289a ,0xa5fb,0x284c ,
- 0xa60b,0x27fe ,0xa61b,0x27af ,0xa62c,0x2760 ,
- 0xa63e,0x2711 ,0xa650,0x26c1 ,0xa664,0x2671 ,
- 0xa678,0x2620 ,0xa68e,0x25cf ,0xa6a4,0x257e ,
- 0xa6bb,0x252c ,0xa6d3,0x24da ,0xa6eb,0x2488 ,
- 0xa705,0x2435 ,0xa71f,0x23e2 ,0xa73b,0x238e ,
- 0xa757,0x233b ,0xa774,0x22e7 ,0xa792,0x2292 ,
- 0xa7b1,0x223d ,0xa7d0,0x21e8 ,0xa7f1,0x2193 ,
- 0xa812,0x213d ,0xa834,0x20e7 ,0xa857,0x2091 ,
- 0xa87b,0x203a ,0xa89f,0x1fe3 ,0xa8c5,0x1f8c ,
- 0xa8eb,0x1f34 ,0xa912,0x1edc ,0xa93a,0x1e84 ,
- 0xa963,0x1e2b ,0xa98d,0x1dd3 ,0xa9b7,0x1d79 ,
- 0xa9e3,0x1d20 ,0xaa0f,0x1cc6 ,0xaa3c,0x1c6c ,
- 0xaa6a,0x1c12 ,0xaa98,0x1bb8 ,0xaac8,0x1b5d ,
- 0xaaf8,0x1b02 ,0xab29,0x1aa7 ,0xab5b,0x1a4b ,
- 0xab8e,0x19ef ,0xabc2,0x1993 ,0xabf6,0x1937 ,
- 0xac2b,0x18db ,0xac61,0x187e ,0xac98,0x1821 ,
- 0xacd0,0x17c4 ,0xad08,0x1766 ,0xad41,0x1709 ,
- 0xad7b,0x16ab ,0xadb6,0x164c ,0xadf2,0x15ee ,
- 0xae2e,0x1590 ,0xae6b,0x1531 ,0xaea9,0x14d2 ,
- 0xaee8,0x1473 ,0xaf28,0x1413 ,0xaf68,0x13b4 ,
- 0xafa9,0x1354 ,0xafeb,0x12f4 ,0xb02d,0x1294 ,
- 0xb071,0x1234 ,0xb0b5,0x11d3 ,0xb0fa,0x1173 ,
- 0xb140,0x1112 ,0xb186,0x10b1 ,0xb1cd,0x1050 ,
- 0xb215,0x0fee ,0xb25e,0x0f8d ,0xb2a7,0x0f2b ,
- 0xb2f2,0x0eca ,0xb33d,0x0e68 ,0xb388,0x0e06 ,
- 0xb3d5,0x0da4 ,0xb422,0x0d41 ,0xb470,0x0cdf ,
- 0xb4be,0x0c7c ,0xb50e,0x0c1a ,0xb55e,0x0bb7 ,
- 0xb5af,0x0b54 ,0xb600,0x0af1 ,0xb652,0x0a8e ,
- 0xb6a5,0x0a2b ,0xb6f9,0x09c7 ,0xb74d,0x0964 ,
- 0xb7a2,0x0901 ,0xb7f8,0x089d ,0xb84f,0x0839 ,
- 0xb8a6,0x07d6 ,0xb8fd,0x0772 ,0xb956,0x070e ,
- 0xb9af,0x06aa ,0xba09,0x0646 ,0xba64,0x05e2 ,
- 0xbabf,0x057e ,0xbb1b,0x051a ,0xbb77,0x04b5 ,
- 0xbbd4,0x0451 ,0xbc32,0x03ed ,0xbc91,0x0388 ,
- 0xbcf0,0x0324 ,0xbd50,0x02c0 ,0xbdb0,0x025b ,
- 0xbe11,0x01f7 ,0xbe73,0x0192 ,0xbed5,0x012e ,
- 0xbf38,0x00c9 ,0xbf9c,0x0065 };
-
-
-extern const int s_Q14R_8;
-const int s_Q14R_8 = 1024;
-extern const unsigned short t_Q14R_8[2032];
-const unsigned short t_Q14R_8[2032] = {
- 0x4000,0x0000 ,0x4000,0x0000 ,0x4000,0x0000 ,
- 0x3b21,0x187e ,0x3ec5,0x0c7c ,0x3537,0x238e ,
- 0x2d41,0x2d41 ,0x3b21,0x187e ,0x187e,0x3b21 ,
- 0x187e,0x3b21 ,0x3537,0x238e ,0xf384,0x3ec5 ,
- 0x0000,0x4000 ,0x2d41,0x2d41 ,0xd2bf,0x2d41 ,
- 0xe782,0x3b21 ,0x238e,0x3537 ,0xc13b,0x0c7c ,
- 0xd2bf,0x2d41 ,0x187e,0x3b21 ,0xc4df,0xe782 ,
- 0xc4df,0x187e ,0x0c7c,0x3ec5 ,0xdc72,0xcac9 ,
- 0x4000,0x0000 ,0x4000,0x0000 ,0x4000,0x0000 ,
- 0x3fb1,0x0646 ,0x3fec,0x0324 ,0x3f4f,0x0964 ,
- 0x3ec5,0x0c7c ,0x3fb1,0x0646 ,0x3d3f,0x1294 ,
- 0x3d3f,0x1294 ,0x3f4f,0x0964 ,0x39db,0x1b5d ,
- 0x3b21,0x187e ,0x3ec5,0x0c7c ,0x3537,0x238e ,
- 0x3871,0x1e2b ,0x3e15,0x0f8d ,0x2f6c,0x2afb ,
- 0x3537,0x238e ,0x3d3f,0x1294 ,0x289a,0x3179 ,
- 0x3179,0x289a ,0x3c42,0x1590 ,0x20e7,0x36e5 ,
- 0x2d41,0x2d41 ,0x3b21,0x187e ,0x187e,0x3b21 ,
- 0x289a,0x3179 ,0x39db,0x1b5d ,0x0f8d,0x3e15 ,
- 0x238e,0x3537 ,0x3871,0x1e2b ,0x0646,0x3fb1 ,
- 0x1e2b,0x3871 ,0x36e5,0x20e7 ,0xfcdc,0x3fec ,
- 0x187e,0x3b21 ,0x3537,0x238e ,0xf384,0x3ec5 ,
- 0x1294,0x3d3f ,0x3368,0x2620 ,0xea70,0x3c42 ,
- 0x0c7c,0x3ec5 ,0x3179,0x289a ,0xe1d5,0x3871 ,
- 0x0646,0x3fb1 ,0x2f6c,0x2afb ,0xd9e0,0x3368 ,
- 0x0000,0x4000 ,0x2d41,0x2d41 ,0xd2bf,0x2d41 ,
- 0xf9ba,0x3fb1 ,0x2afb,0x2f6c ,0xcc98,0x2620 ,
- 0xf384,0x3ec5 ,0x289a,0x3179 ,0xc78f,0x1e2b ,
- 0xed6c,0x3d3f ,0x2620,0x3368 ,0xc3be,0x1590 ,
- 0xe782,0x3b21 ,0x238e,0x3537 ,0xc13b,0x0c7c ,
- 0xe1d5,0x3871 ,0x20e7,0x36e5 ,0xc014,0x0324 ,
- 0xdc72,0x3537 ,0x1e2b,0x3871 ,0xc04f,0xf9ba ,
- 0xd766,0x3179 ,0x1b5d,0x39db ,0xc1eb,0xf073 ,
- 0xd2bf,0x2d41 ,0x187e,0x3b21 ,0xc4df,0xe782 ,
- 0xce87,0x289a ,0x1590,0x3c42 ,0xc91b,0xdf19 ,
- 0xcac9,0x238e ,0x1294,0x3d3f ,0xce87,0xd766 ,
- 0xc78f,0x1e2b ,0x0f8d,0x3e15 ,0xd505,0xd094 ,
- 0xc4df,0x187e ,0x0c7c,0x3ec5 ,0xdc72,0xcac9 ,
- 0xc2c1,0x1294 ,0x0964,0x3f4f ,0xe4a3,0xc625 ,
- 0xc13b,0x0c7c ,0x0646,0x3fb1 ,0xed6c,0xc2c1 ,
- 0xc04f,0x0646 ,0x0324,0x3fec ,0xf69c,0xc0b1 ,
- 0x4000,0x0000 ,0x4000,0x0000 ,0x4000,0x0000 ,
- 0x3ffb,0x0192 ,0x3fff,0x00c9 ,0x3ff5,0x025b ,
- 0x3fec,0x0324 ,0x3ffb,0x0192 ,0x3fd4,0x04b5 ,
- 0x3fd4,0x04b5 ,0x3ff5,0x025b ,0x3f9c,0x070e ,
- 0x3fb1,0x0646 ,0x3fec,0x0324 ,0x3f4f,0x0964 ,
- 0x3f85,0x07d6 ,0x3fe1,0x03ed ,0x3eeb,0x0bb7 ,
- 0x3f4f,0x0964 ,0x3fd4,0x04b5 ,0x3e72,0x0e06 ,
- 0x3f0f,0x0af1 ,0x3fc4,0x057e ,0x3de3,0x1050 ,
- 0x3ec5,0x0c7c ,0x3fb1,0x0646 ,0x3d3f,0x1294 ,
- 0x3e72,0x0e06 ,0x3f9c,0x070e ,0x3c85,0x14d2 ,
- 0x3e15,0x0f8d ,0x3f85,0x07d6 ,0x3bb6,0x1709 ,
- 0x3daf,0x1112 ,0x3f6b,0x089d ,0x3ad3,0x1937 ,
- 0x3d3f,0x1294 ,0x3f4f,0x0964 ,0x39db,0x1b5d ,
- 0x3cc5,0x1413 ,0x3f30,0x0a2b ,0x38cf,0x1d79 ,
- 0x3c42,0x1590 ,0x3f0f,0x0af1 ,0x37b0,0x1f8c ,
- 0x3bb6,0x1709 ,0x3eeb,0x0bb7 ,0x367d,0x2193 ,
- 0x3b21,0x187e ,0x3ec5,0x0c7c ,0x3537,0x238e ,
- 0x3a82,0x19ef ,0x3e9d,0x0d41 ,0x33df,0x257e ,
- 0x39db,0x1b5d ,0x3e72,0x0e06 ,0x3274,0x2760 ,
- 0x392b,0x1cc6 ,0x3e45,0x0eca ,0x30f9,0x2935 ,
- 0x3871,0x1e2b ,0x3e15,0x0f8d ,0x2f6c,0x2afb ,
- 0x37b0,0x1f8c ,0x3de3,0x1050 ,0x2dcf,0x2cb2 ,
- 0x36e5,0x20e7 ,0x3daf,0x1112 ,0x2c21,0x2e5a ,
- 0x3612,0x223d ,0x3d78,0x11d3 ,0x2a65,0x2ff2 ,
- 0x3537,0x238e ,0x3d3f,0x1294 ,0x289a,0x3179 ,
- 0x3453,0x24da ,0x3d03,0x1354 ,0x26c1,0x32ef ,
- 0x3368,0x2620 ,0x3cc5,0x1413 ,0x24da,0x3453 ,
- 0x3274,0x2760 ,0x3c85,0x14d2 ,0x22e7,0x35a5 ,
- 0x3179,0x289a ,0x3c42,0x1590 ,0x20e7,0x36e5 ,
- 0x3076,0x29ce ,0x3bfd,0x164c ,0x1edc,0x3812 ,
- 0x2f6c,0x2afb ,0x3bb6,0x1709 ,0x1cc6,0x392b ,
- 0x2e5a,0x2c21 ,0x3b6d,0x17c4 ,0x1aa7,0x3a30 ,
- 0x2d41,0x2d41 ,0x3b21,0x187e ,0x187e,0x3b21 ,
- 0x2c21,0x2e5a ,0x3ad3,0x1937 ,0x164c,0x3bfd ,
- 0x2afb,0x2f6c ,0x3a82,0x19ef ,0x1413,0x3cc5 ,
- 0x29ce,0x3076 ,0x3a30,0x1aa7 ,0x11d3,0x3d78 ,
- 0x289a,0x3179 ,0x39db,0x1b5d ,0x0f8d,0x3e15 ,
- 0x2760,0x3274 ,0x3984,0x1c12 ,0x0d41,0x3e9d ,
- 0x2620,0x3368 ,0x392b,0x1cc6 ,0x0af1,0x3f0f ,
- 0x24da,0x3453 ,0x38cf,0x1d79 ,0x089d,0x3f6b ,
- 0x238e,0x3537 ,0x3871,0x1e2b ,0x0646,0x3fb1 ,
- 0x223d,0x3612 ,0x3812,0x1edc ,0x03ed,0x3fe1 ,
- 0x20e7,0x36e5 ,0x37b0,0x1f8c ,0x0192,0x3ffb ,
- 0x1f8c,0x37b0 ,0x374b,0x203a ,0xff37,0x3fff ,
- 0x1e2b,0x3871 ,0x36e5,0x20e7 ,0xfcdc,0x3fec ,
- 0x1cc6,0x392b ,0x367d,0x2193 ,0xfa82,0x3fc4 ,
- 0x1b5d,0x39db ,0x3612,0x223d ,0xf82a,0x3f85 ,
- 0x19ef,0x3a82 ,0x35a5,0x22e7 ,0xf5d5,0x3f30 ,
- 0x187e,0x3b21 ,0x3537,0x238e ,0xf384,0x3ec5 ,
- 0x1709,0x3bb6 ,0x34c6,0x2435 ,0xf136,0x3e45 ,
- 0x1590,0x3c42 ,0x3453,0x24da ,0xeeee,0x3daf ,
- 0x1413,0x3cc5 ,0x33df,0x257e ,0xecac,0x3d03 ,
- 0x1294,0x3d3f ,0x3368,0x2620 ,0xea70,0x3c42 ,
- 0x1112,0x3daf ,0x32ef,0x26c1 ,0xe83c,0x3b6d ,
- 0x0f8d,0x3e15 ,0x3274,0x2760 ,0xe611,0x3a82 ,
- 0x0e06,0x3e72 ,0x31f8,0x27fe ,0xe3ee,0x3984 ,
- 0x0c7c,0x3ec5 ,0x3179,0x289a ,0xe1d5,0x3871 ,
- 0x0af1,0x3f0f ,0x30f9,0x2935 ,0xdfc6,0x374b ,
- 0x0964,0x3f4f ,0x3076,0x29ce ,0xddc3,0x3612 ,
- 0x07d6,0x3f85 ,0x2ff2,0x2a65 ,0xdbcb,0x34c6 ,
- 0x0646,0x3fb1 ,0x2f6c,0x2afb ,0xd9e0,0x3368 ,
- 0x04b5,0x3fd4 ,0x2ee4,0x2b8f ,0xd802,0x31f8 ,
- 0x0324,0x3fec ,0x2e5a,0x2c21 ,0xd632,0x3076 ,
- 0x0192,0x3ffb ,0x2dcf,0x2cb2 ,0xd471,0x2ee4 ,
- 0x0000,0x4000 ,0x2d41,0x2d41 ,0xd2bf,0x2d41 ,
- 0xfe6e,0x3ffb ,0x2cb2,0x2dcf ,0xd11c,0x2b8f ,
- 0xfcdc,0x3fec ,0x2c21,0x2e5a ,0xcf8a,0x29ce ,
- 0xfb4b,0x3fd4 ,0x2b8f,0x2ee4 ,0xce08,0x27fe ,
- 0xf9ba,0x3fb1 ,0x2afb,0x2f6c ,0xcc98,0x2620 ,
- 0xf82a,0x3f85 ,0x2a65,0x2ff2 ,0xcb3a,0x2435 ,
- 0xf69c,0x3f4f ,0x29ce,0x3076 ,0xc9ee,0x223d ,
- 0xf50f,0x3f0f ,0x2935,0x30f9 ,0xc8b5,0x203a ,
- 0xf384,0x3ec5 ,0x289a,0x3179 ,0xc78f,0x1e2b ,
- 0xf1fa,0x3e72 ,0x27fe,0x31f8 ,0xc67c,0x1c12 ,
- 0xf073,0x3e15 ,0x2760,0x3274 ,0xc57e,0x19ef ,
- 0xeeee,0x3daf ,0x26c1,0x32ef ,0xc493,0x17c4 ,
- 0xed6c,0x3d3f ,0x2620,0x3368 ,0xc3be,0x1590 ,
- 0xebed,0x3cc5 ,0x257e,0x33df ,0xc2fd,0x1354 ,
- 0xea70,0x3c42 ,0x24da,0x3453 ,0xc251,0x1112 ,
- 0xe8f7,0x3bb6 ,0x2435,0x34c6 ,0xc1bb,0x0eca ,
- 0xe782,0x3b21 ,0x238e,0x3537 ,0xc13b,0x0c7c ,
- 0xe611,0x3a82 ,0x22e7,0x35a5 ,0xc0d0,0x0a2b ,
- 0xe4a3,0x39db ,0x223d,0x3612 ,0xc07b,0x07d6 ,
- 0xe33a,0x392b ,0x2193,0x367d ,0xc03c,0x057e ,
- 0xe1d5,0x3871 ,0x20e7,0x36e5 ,0xc014,0x0324 ,
- 0xe074,0x37b0 ,0x203a,0x374b ,0xc001,0x00c9 ,
- 0xdf19,0x36e5 ,0x1f8c,0x37b0 ,0xc005,0xfe6e ,
- 0xddc3,0x3612 ,0x1edc,0x3812 ,0xc01f,0xfc13 ,
- 0xdc72,0x3537 ,0x1e2b,0x3871 ,0xc04f,0xf9ba ,
- 0xdb26,0x3453 ,0x1d79,0x38cf ,0xc095,0xf763 ,
- 0xd9e0,0x3368 ,0x1cc6,0x392b ,0xc0f1,0xf50f ,
- 0xd8a0,0x3274 ,0x1c12,0x3984 ,0xc163,0xf2bf ,
- 0xd766,0x3179 ,0x1b5d,0x39db ,0xc1eb,0xf073 ,
- 0xd632,0x3076 ,0x1aa7,0x3a30 ,0xc288,0xee2d ,
- 0xd505,0x2f6c ,0x19ef,0x3a82 ,0xc33b,0xebed ,
- 0xd3df,0x2e5a ,0x1937,0x3ad3 ,0xc403,0xe9b4 ,
- 0xd2bf,0x2d41 ,0x187e,0x3b21 ,0xc4df,0xe782 ,
- 0xd1a6,0x2c21 ,0x17c4,0x3b6d ,0xc5d0,0xe559 ,
- 0xd094,0x2afb ,0x1709,0x3bb6 ,0xc6d5,0xe33a ,
- 0xcf8a,0x29ce ,0x164c,0x3bfd ,0xc7ee,0xe124 ,
- 0xce87,0x289a ,0x1590,0x3c42 ,0xc91b,0xdf19 ,
- 0xcd8c,0x2760 ,0x14d2,0x3c85 ,0xca5b,0xdd19 ,
- 0xcc98,0x2620 ,0x1413,0x3cc5 ,0xcbad,0xdb26 ,
- 0xcbad,0x24da ,0x1354,0x3d03 ,0xcd11,0xd93f ,
- 0xcac9,0x238e ,0x1294,0x3d3f ,0xce87,0xd766 ,
- 0xc9ee,0x223d ,0x11d3,0x3d78 ,0xd00e,0xd59b ,
- 0xc91b,0x20e7 ,0x1112,0x3daf ,0xd1a6,0xd3df ,
- 0xc850,0x1f8c ,0x1050,0x3de3 ,0xd34e,0xd231 ,
- 0xc78f,0x1e2b ,0x0f8d,0x3e15 ,0xd505,0xd094 ,
- 0xc6d5,0x1cc6 ,0x0eca,0x3e45 ,0xd6cb,0xcf07 ,
- 0xc625,0x1b5d ,0x0e06,0x3e72 ,0xd8a0,0xcd8c ,
- 0xc57e,0x19ef ,0x0d41,0x3e9d ,0xda82,0xcc21 ,
- 0xc4df,0x187e ,0x0c7c,0x3ec5 ,0xdc72,0xcac9 ,
- 0xc44a,0x1709 ,0x0bb7,0x3eeb ,0xde6d,0xc983 ,
- 0xc3be,0x1590 ,0x0af1,0x3f0f ,0xe074,0xc850 ,
- 0xc33b,0x1413 ,0x0a2b,0x3f30 ,0xe287,0xc731 ,
- 0xc2c1,0x1294 ,0x0964,0x3f4f ,0xe4a3,0xc625 ,
- 0xc251,0x1112 ,0x089d,0x3f6b ,0xe6c9,0xc52d ,
- 0xc1eb,0x0f8d ,0x07d6,0x3f85 ,0xe8f7,0xc44a ,
- 0xc18e,0x0e06 ,0x070e,0x3f9c ,0xeb2e,0xc37b ,
- 0xc13b,0x0c7c ,0x0646,0x3fb1 ,0xed6c,0xc2c1 ,
- 0xc0f1,0x0af1 ,0x057e,0x3fc4 ,0xefb0,0xc21d ,
- 0xc0b1,0x0964 ,0x04b5,0x3fd4 ,0xf1fa,0xc18e ,
- 0xc07b,0x07d6 ,0x03ed,0x3fe1 ,0xf449,0xc115 ,
- 0xc04f,0x0646 ,0x0324,0x3fec ,0xf69c,0xc0b1 ,
- 0xc02c,0x04b5 ,0x025b,0x3ff5 ,0xf8f2,0xc064 ,
- 0xc014,0x0324 ,0x0192,0x3ffb ,0xfb4b,0xc02c ,
- 0xc005,0x0192 ,0x00c9,0x3fff ,0xfda5,0xc00b ,
- 0x4000,0x0000 ,0x4000,0x0065 ,0x3fff,0x00c9 ,
- 0x3ffd,0x012e ,0x3ffb,0x0192 ,0x3ff8,0x01f7 ,
- 0x3ff5,0x025b ,0x3ff1,0x02c0 ,0x3fec,0x0324 ,
- 0x3fe7,0x0388 ,0x3fe1,0x03ed ,0x3fdb,0x0451 ,
- 0x3fd4,0x04b5 ,0x3fcc,0x051a ,0x3fc4,0x057e ,
- 0x3fbb,0x05e2 ,0x3fb1,0x0646 ,0x3fa7,0x06aa ,
- 0x3f9c,0x070e ,0x3f91,0x0772 ,0x3f85,0x07d6 ,
- 0x3f78,0x0839 ,0x3f6b,0x089d ,0x3f5d,0x0901 ,
- 0x3f4f,0x0964 ,0x3f40,0x09c7 ,0x3f30,0x0a2b ,
- 0x3f20,0x0a8e ,0x3f0f,0x0af1 ,0x3efd,0x0b54 ,
- 0x3eeb,0x0bb7 ,0x3ed8,0x0c1a ,0x3ec5,0x0c7c ,
- 0x3eb1,0x0cdf ,0x3e9d,0x0d41 ,0x3e88,0x0da4 ,
- 0x3e72,0x0e06 ,0x3e5c,0x0e68 ,0x3e45,0x0eca ,
- 0x3e2d,0x0f2b ,0x3e15,0x0f8d ,0x3dfc,0x0fee ,
- 0x3de3,0x1050 ,0x3dc9,0x10b1 ,0x3daf,0x1112 ,
- 0x3d93,0x1173 ,0x3d78,0x11d3 ,0x3d5b,0x1234 ,
- 0x3d3f,0x1294 ,0x3d21,0x12f4 ,0x3d03,0x1354 ,
- 0x3ce4,0x13b4 ,0x3cc5,0x1413 ,0x3ca5,0x1473 ,
- 0x3c85,0x14d2 ,0x3c64,0x1531 ,0x3c42,0x1590 ,
- 0x3c20,0x15ee ,0x3bfd,0x164c ,0x3bda,0x16ab ,
- 0x3bb6,0x1709 ,0x3b92,0x1766 ,0x3b6d,0x17c4 ,
- 0x3b47,0x1821 ,0x3b21,0x187e ,0x3afa,0x18db ,
- 0x3ad3,0x1937 ,0x3aab,0x1993 ,0x3a82,0x19ef ,
- 0x3a59,0x1a4b ,0x3a30,0x1aa7 ,0x3a06,0x1b02 ,
- 0x39db,0x1b5d ,0x39b0,0x1bb8 ,0x3984,0x1c12 ,
- 0x3958,0x1c6c ,0x392b,0x1cc6 ,0x38fd,0x1d20 ,
- 0x38cf,0x1d79 ,0x38a1,0x1dd3 ,0x3871,0x1e2b ,
- 0x3842,0x1e84 ,0x3812,0x1edc ,0x37e1,0x1f34 ,
- 0x37b0,0x1f8c ,0x377e,0x1fe3 ,0x374b,0x203a ,
- 0x3718,0x2091 ,0x36e5,0x20e7 ,0x36b1,0x213d ,
- 0x367d,0x2193 ,0x3648,0x21e8 ,0x3612,0x223d ,
- 0x35dc,0x2292 ,0x35a5,0x22e7 ,0x356e,0x233b ,
- 0x3537,0x238e ,0x34ff,0x23e2 ,0x34c6,0x2435 ,
- 0x348d,0x2488 ,0x3453,0x24da ,0x3419,0x252c ,
- 0x33df,0x257e ,0x33a3,0x25cf ,0x3368,0x2620 ,
- 0x332c,0x2671 ,0x32ef,0x26c1 ,0x32b2,0x2711 ,
- 0x3274,0x2760 ,0x3236,0x27af ,0x31f8,0x27fe ,
- 0x31b9,0x284c ,0x3179,0x289a ,0x3139,0x28e7 ,
- 0x30f9,0x2935 ,0x30b8,0x2981 ,0x3076,0x29ce ,
- 0x3034,0x2a1a ,0x2ff2,0x2a65 ,0x2faf,0x2ab0 ,
- 0x2f6c,0x2afb ,0x2f28,0x2b45 ,0x2ee4,0x2b8f ,
- 0x2e9f,0x2bd8 ,0x2e5a,0x2c21 ,0x2e15,0x2c6a ,
- 0x2dcf,0x2cb2 ,0x2d88,0x2cfa ,0x2d41,0x2d41 ,
- 0x2cfa,0x2d88 ,0x2cb2,0x2dcf ,0x2c6a,0x2e15 ,
- 0x2c21,0x2e5a ,0x2bd8,0x2e9f ,0x2b8f,0x2ee4 ,
- 0x2b45,0x2f28 ,0x2afb,0x2f6c ,0x2ab0,0x2faf ,
- 0x2a65,0x2ff2 ,0x2a1a,0x3034 ,0x29ce,0x3076 ,
- 0x2981,0x30b8 ,0x2935,0x30f9 ,0x28e7,0x3139 ,
- 0x289a,0x3179 ,0x284c,0x31b9 ,0x27fe,0x31f8 ,
- 0x27af,0x3236 ,0x2760,0x3274 ,0x2711,0x32b2 ,
- 0x26c1,0x32ef ,0x2671,0x332c ,0x2620,0x3368 ,
- 0x25cf,0x33a3 ,0x257e,0x33df ,0x252c,0x3419 ,
- 0x24da,0x3453 ,0x2488,0x348d ,0x2435,0x34c6 ,
- 0x23e2,0x34ff ,0x238e,0x3537 ,0x233b,0x356e ,
- 0x22e7,0x35a5 ,0x2292,0x35dc ,0x223d,0x3612 ,
- 0x21e8,0x3648 ,0x2193,0x367d ,0x213d,0x36b1 ,
- 0x20e7,0x36e5 ,0x2091,0x3718 ,0x203a,0x374b ,
- 0x1fe3,0x377e ,0x1f8c,0x37b0 ,0x1f34,0x37e1 ,
- 0x1edc,0x3812 ,0x1e84,0x3842 ,0x1e2b,0x3871 ,
- 0x1dd3,0x38a1 ,0x1d79,0x38cf ,0x1d20,0x38fd ,
- 0x1cc6,0x392b ,0x1c6c,0x3958 ,0x1c12,0x3984 ,
- 0x1bb8,0x39b0 ,0x1b5d,0x39db ,0x1b02,0x3a06 ,
- 0x1aa7,0x3a30 ,0x1a4b,0x3a59 ,0x19ef,0x3a82 ,
- 0x1993,0x3aab ,0x1937,0x3ad3 ,0x18db,0x3afa ,
- 0x187e,0x3b21 ,0x1821,0x3b47 ,0x17c4,0x3b6d ,
- 0x1766,0x3b92 ,0x1709,0x3bb6 ,0x16ab,0x3bda ,
- 0x164c,0x3bfd ,0x15ee,0x3c20 ,0x1590,0x3c42 ,
- 0x1531,0x3c64 ,0x14d2,0x3c85 ,0x1473,0x3ca5 ,
- 0x1413,0x3cc5 ,0x13b4,0x3ce4 ,0x1354,0x3d03 ,
- 0x12f4,0x3d21 ,0x1294,0x3d3f ,0x1234,0x3d5b ,
- 0x11d3,0x3d78 ,0x1173,0x3d93 ,0x1112,0x3daf ,
- 0x10b1,0x3dc9 ,0x1050,0x3de3 ,0x0fee,0x3dfc ,
- 0x0f8d,0x3e15 ,0x0f2b,0x3e2d ,0x0eca,0x3e45 ,
- 0x0e68,0x3e5c ,0x0e06,0x3e72 ,0x0da4,0x3e88 ,
- 0x0d41,0x3e9d ,0x0cdf,0x3eb1 ,0x0c7c,0x3ec5 ,
- 0x0c1a,0x3ed8 ,0x0bb7,0x3eeb ,0x0b54,0x3efd ,
- 0x0af1,0x3f0f ,0x0a8e,0x3f20 ,0x0a2b,0x3f30 ,
- 0x09c7,0x3f40 ,0x0964,0x3f4f ,0x0901,0x3f5d ,
- 0x089d,0x3f6b ,0x0839,0x3f78 ,0x07d6,0x3f85 ,
- 0x0772,0x3f91 ,0x070e,0x3f9c ,0x06aa,0x3fa7 ,
- 0x0646,0x3fb1 ,0x05e2,0x3fbb ,0x057e,0x3fc4 ,
- 0x051a,0x3fcc ,0x04b5,0x3fd4 ,0x0451,0x3fdb ,
- 0x03ed,0x3fe1 ,0x0388,0x3fe7 ,0x0324,0x3fec ,
- 0x02c0,0x3ff1 ,0x025b,0x3ff5 ,0x01f7,0x3ff8 ,
- 0x0192,0x3ffb ,0x012e,0x3ffd ,0x00c9,0x3fff ,
- 0x0065,0x4000 ,0x0000,0x4000 ,0xff9b,0x4000 ,
- 0xff37,0x3fff ,0xfed2,0x3ffd ,0xfe6e,0x3ffb ,
- 0xfe09,0x3ff8 ,0xfda5,0x3ff5 ,0xfd40,0x3ff1 ,
- 0xfcdc,0x3fec ,0xfc78,0x3fe7 ,0xfc13,0x3fe1 ,
- 0xfbaf,0x3fdb ,0xfb4b,0x3fd4 ,0xfae6,0x3fcc ,
- 0xfa82,0x3fc4 ,0xfa1e,0x3fbb ,0xf9ba,0x3fb1 ,
- 0xf956,0x3fa7 ,0xf8f2,0x3f9c ,0xf88e,0x3f91 ,
- 0xf82a,0x3f85 ,0xf7c7,0x3f78 ,0xf763,0x3f6b ,
- 0xf6ff,0x3f5d ,0xf69c,0x3f4f ,0xf639,0x3f40 ,
- 0xf5d5,0x3f30 ,0xf572,0x3f20 ,0xf50f,0x3f0f ,
- 0xf4ac,0x3efd ,0xf449,0x3eeb ,0xf3e6,0x3ed8 ,
- 0xf384,0x3ec5 ,0xf321,0x3eb1 ,0xf2bf,0x3e9d ,
- 0xf25c,0x3e88 ,0xf1fa,0x3e72 ,0xf198,0x3e5c ,
- 0xf136,0x3e45 ,0xf0d5,0x3e2d ,0xf073,0x3e15 ,
- 0xf012,0x3dfc ,0xefb0,0x3de3 ,0xef4f,0x3dc9 ,
- 0xeeee,0x3daf ,0xee8d,0x3d93 ,0xee2d,0x3d78 ,
- 0xedcc,0x3d5b ,0xed6c,0x3d3f ,0xed0c,0x3d21 ,
- 0xecac,0x3d03 ,0xec4c,0x3ce4 ,0xebed,0x3cc5 ,
- 0xeb8d,0x3ca5 ,0xeb2e,0x3c85 ,0xeacf,0x3c64 ,
- 0xea70,0x3c42 ,0xea12,0x3c20 ,0xe9b4,0x3bfd ,
- 0xe955,0x3bda ,0xe8f7,0x3bb6 ,0xe89a,0x3b92 ,
- 0xe83c,0x3b6d ,0xe7df,0x3b47 ,0xe782,0x3b21 ,
- 0xe725,0x3afa ,0xe6c9,0x3ad3 ,0xe66d,0x3aab ,
- 0xe611,0x3a82 ,0xe5b5,0x3a59 ,0xe559,0x3a30 ,
- 0xe4fe,0x3a06 ,0xe4a3,0x39db ,0xe448,0x39b0 ,
- 0xe3ee,0x3984 ,0xe394,0x3958 ,0xe33a,0x392b ,
- 0xe2e0,0x38fd ,0xe287,0x38cf ,0xe22d,0x38a1 ,
- 0xe1d5,0x3871 ,0xe17c,0x3842 ,0xe124,0x3812 ,
- 0xe0cc,0x37e1 ,0xe074,0x37b0 ,0xe01d,0x377e ,
- 0xdfc6,0x374b ,0xdf6f,0x3718 ,0xdf19,0x36e5 ,
- 0xdec3,0x36b1 ,0xde6d,0x367d ,0xde18,0x3648 ,
- 0xddc3,0x3612 ,0xdd6e,0x35dc ,0xdd19,0x35a5 ,
- 0xdcc5,0x356e ,0xdc72,0x3537 ,0xdc1e,0x34ff ,
- 0xdbcb,0x34c6 ,0xdb78,0x348d ,0xdb26,0x3453 ,
- 0xdad4,0x3419 ,0xda82,0x33df ,0xda31,0x33a3 ,
- 0xd9e0,0x3368 ,0xd98f,0x332c ,0xd93f,0x32ef ,
- 0xd8ef,0x32b2 ,0xd8a0,0x3274 ,0xd851,0x3236 ,
- 0xd802,0x31f8 ,0xd7b4,0x31b9 ,0xd766,0x3179 ,
- 0xd719,0x3139 ,0xd6cb,0x30f9 ,0xd67f,0x30b8 ,
- 0xd632,0x3076 ,0xd5e6,0x3034 ,0xd59b,0x2ff2 ,
- 0xd550,0x2faf ,0xd505,0x2f6c ,0xd4bb,0x2f28 ,
- 0xd471,0x2ee4 ,0xd428,0x2e9f ,0xd3df,0x2e5a ,
- 0xd396,0x2e15 ,0xd34e,0x2dcf ,0xd306,0x2d88 ,
- 0xd2bf,0x2d41 ,0xd278,0x2cfa ,0xd231,0x2cb2 ,
- 0xd1eb,0x2c6a ,0xd1a6,0x2c21 ,0xd161,0x2bd8 ,
- 0xd11c,0x2b8f ,0xd0d8,0x2b45 ,0xd094,0x2afb ,
- 0xd051,0x2ab0 ,0xd00e,0x2a65 ,0xcfcc,0x2a1a ,
- 0xcf8a,0x29ce ,0xcf48,0x2981 ,0xcf07,0x2935 ,
- 0xcec7,0x28e7 ,0xce87,0x289a ,0xce47,0x284c ,
- 0xce08,0x27fe ,0xcdca,0x27af ,0xcd8c,0x2760 ,
- 0xcd4e,0x2711 ,0xcd11,0x26c1 ,0xccd4,0x2671 ,
- 0xcc98,0x2620 ,0xcc5d,0x25cf ,0xcc21,0x257e ,
- 0xcbe7,0x252c ,0xcbad,0x24da ,0xcb73,0x2488 ,
- 0xcb3a,0x2435 ,0xcb01,0x23e2 ,0xcac9,0x238e ,
- 0xca92,0x233b ,0xca5b,0x22e7 ,0xca24,0x2292 ,
- 0xc9ee,0x223d ,0xc9b8,0x21e8 ,0xc983,0x2193 ,
- 0xc94f,0x213d ,0xc91b,0x20e7 ,0xc8e8,0x2091 ,
- 0xc8b5,0x203a ,0xc882,0x1fe3 ,0xc850,0x1f8c ,
- 0xc81f,0x1f34 ,0xc7ee,0x1edc ,0xc7be,0x1e84 ,
- 0xc78f,0x1e2b ,0xc75f,0x1dd3 ,0xc731,0x1d79 ,
- 0xc703,0x1d20 ,0xc6d5,0x1cc6 ,0xc6a8,0x1c6c ,
- 0xc67c,0x1c12 ,0xc650,0x1bb8 ,0xc625,0x1b5d ,
- 0xc5fa,0x1b02 ,0xc5d0,0x1aa7 ,0xc5a7,0x1a4b ,
- 0xc57e,0x19ef ,0xc555,0x1993 ,0xc52d,0x1937 ,
- 0xc506,0x18db ,0xc4df,0x187e ,0xc4b9,0x1821 ,
- 0xc493,0x17c4 ,0xc46e,0x1766 ,0xc44a,0x1709 ,
- 0xc426,0x16ab ,0xc403,0x164c ,0xc3e0,0x15ee ,
- 0xc3be,0x1590 ,0xc39c,0x1531 ,0xc37b,0x14d2 ,
- 0xc35b,0x1473 ,0xc33b,0x1413 ,0xc31c,0x13b4 ,
- 0xc2fd,0x1354 ,0xc2df,0x12f4 ,0xc2c1,0x1294 ,
- 0xc2a5,0x1234 ,0xc288,0x11d3 ,0xc26d,0x1173 ,
- 0xc251,0x1112 ,0xc237,0x10b1 ,0xc21d,0x1050 ,
- 0xc204,0x0fee ,0xc1eb,0x0f8d ,0xc1d3,0x0f2b ,
- 0xc1bb,0x0eca ,0xc1a4,0x0e68 ,0xc18e,0x0e06 ,
- 0xc178,0x0da4 ,0xc163,0x0d41 ,0xc14f,0x0cdf ,
- 0xc13b,0x0c7c ,0xc128,0x0c1a ,0xc115,0x0bb7 ,
- 0xc103,0x0b54 ,0xc0f1,0x0af1 ,0xc0e0,0x0a8e ,
- 0xc0d0,0x0a2b ,0xc0c0,0x09c7 ,0xc0b1,0x0964 ,
- 0xc0a3,0x0901 ,0xc095,0x089d ,0xc088,0x0839 ,
- 0xc07b,0x07d6 ,0xc06f,0x0772 ,0xc064,0x070e ,
- 0xc059,0x06aa ,0xc04f,0x0646 ,0xc045,0x05e2 ,
- 0xc03c,0x057e ,0xc034,0x051a ,0xc02c,0x04b5 ,
- 0xc025,0x0451 ,0xc01f,0x03ed ,0xc019,0x0388 ,
- 0xc014,0x0324 ,0xc00f,0x02c0 ,0xc00b,0x025b ,
- 0xc008,0x01f7 ,0xc005,0x0192 ,0xc003,0x012e ,
- 0xc001,0x00c9 ,0xc000,0x0065 };
diff --git a/src/common_audio/signal_processing_library/main/source/webrtc_fft_t_rad.c b/src/common_audio/signal_processing_library/main/source/webrtc_fft_t_rad.c
deleted file mode 100644
index 13fbd9f..0000000
--- a/src/common_audio/signal_processing_library/main/source/webrtc_fft_t_rad.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the Q14 radix-2 tables used in ARM9E optimization routines.
- *
- */
-
-extern const unsigned short t_Q14S_rad8[2];
-const unsigned short t_Q14S_rad8[2] = { 0x0000,0x2d41 };
-
-//extern const int t_Q30S_rad8[2];
-//const int t_Q30S_rad8[2] = { 0x00000000,0x2d413ccd };
-
-extern const unsigned short t_Q14R_rad8[2];
-const unsigned short t_Q14R_rad8[2] = { 0x2d41,0x2d41 };
-
-//extern const int t_Q30R_rad8[2];
-//const int t_Q30R_rad8[2] = { 0x2d413ccd,0x2d413ccd };
diff --git a/src/common_audio/signal_processing_library/main/test/unit_test/unit_test.cc b/src/common_audio/signal_processing_library/main/test/unit_test/unit_test.cc
deleted file mode 100644
index 5adc339..0000000
--- a/src/common_audio/signal_processing_library/main/test/unit_test/unit_test.cc
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file contains the SPL unit_test.
- *
- */
-
-#include "unit_test.h"
-#include "signal_processing_library.h"
-
-class SplEnvironment : public ::testing::Environment {
- public:
- virtual void SetUp() {
- }
- virtual void TearDown() {
- }
-};
-
-SplTest::SplTest()
-{
-}
-
-void SplTest::SetUp() {
-}
-
-void SplTest::TearDown() {
-}
-
-TEST_F(SplTest, MacroTest) {
- // Macros with inputs.
- int A = 10;
- int B = 21;
- int a = -3;
- int b = WEBRTC_SPL_WORD32_MAX;
- int nr = 2;
- int d_ptr1 = 0;
- int d_ptr2 = 0;
-
- EXPECT_EQ(10, WEBRTC_SPL_MIN(A, B));
- EXPECT_EQ(21, WEBRTC_SPL_MAX(A, B));
-
- EXPECT_EQ(3, WEBRTC_SPL_ABS_W16(a));
- EXPECT_EQ(3, WEBRTC_SPL_ABS_W32(a));
- EXPECT_EQ(0, WEBRTC_SPL_GET_BYTE(&B, nr));
- WEBRTC_SPL_SET_BYTE(&d_ptr2, 1, nr);
- EXPECT_EQ(65536, d_ptr2);
-
- EXPECT_EQ(-63, WEBRTC_SPL_MUL(a, B));
- EXPECT_EQ(-2147483645, WEBRTC_SPL_MUL(a, b));
- EXPECT_EQ(-2147483645, WEBRTC_SPL_UMUL(a, b));
- b = WEBRTC_SPL_WORD16_MAX >> 1;
- EXPECT_EQ(65535, WEBRTC_SPL_UMUL_RSFT16(a, b));
- EXPECT_EQ(1073627139, WEBRTC_SPL_UMUL_16_16(a, b));
- EXPECT_EQ(16382, WEBRTC_SPL_UMUL_16_16_RSFT16(a, b));
- EXPECT_EQ(-49149, WEBRTC_SPL_UMUL_32_16(a, b));
- EXPECT_EQ(65535, WEBRTC_SPL_UMUL_32_16_RSFT16(a, b));
- EXPECT_EQ(-49149, WEBRTC_SPL_MUL_16_U16(a, b));
-
- a = b;
- b = -3;
- EXPECT_EQ(-5461, WEBRTC_SPL_DIV(a, b));
- EXPECT_EQ(0, WEBRTC_SPL_UDIV(a, b));
-
- EXPECT_EQ(-1, WEBRTC_SPL_MUL_16_32_RSFT16(a, b));
- EXPECT_EQ(-1, WEBRTC_SPL_MUL_16_32_RSFT15(a, b));
- EXPECT_EQ(-3, WEBRTC_SPL_MUL_16_32_RSFT14(a, b));
- EXPECT_EQ(-24, WEBRTC_SPL_MUL_16_32_RSFT11(a, b));
-
- int a32 = WEBRTC_SPL_WORD32_MAX;
- int a32a = (WEBRTC_SPL_WORD32_MAX >> 16);
- int a32b = (WEBRTC_SPL_WORD32_MAX & 0x0000ffff);
- EXPECT_EQ(5, WEBRTC_SPL_MUL_32_32_RSFT32(a32a, a32b, A));
- EXPECT_EQ(5, WEBRTC_SPL_MUL_32_32_RSFT32BI(a32, A));
-
- EXPECT_EQ(-49149, WEBRTC_SPL_MUL_16_16(a, b));
- EXPECT_EQ(-12288, WEBRTC_SPL_MUL_16_16_RSFT(a, b, 2));
-
- EXPECT_EQ(-12287, WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(a, b, 2));
- EXPECT_EQ(-1, WEBRTC_SPL_MUL_16_16_RSFT_WITH_FIXROUND(a, b));
-
- EXPECT_EQ(16380, WEBRTC_SPL_ADD_SAT_W32(a, b));
- EXPECT_EQ(21, WEBRTC_SPL_SAT(a, A, B));
- EXPECT_EQ(21, WEBRTC_SPL_SAT(a, B, A));
- EXPECT_EQ(-49149, WEBRTC_SPL_MUL_32_16(a, b));
-
- EXPECT_EQ(16386, WEBRTC_SPL_SUB_SAT_W32(a, b));
- EXPECT_EQ(16380, WEBRTC_SPL_ADD_SAT_W16(a, b));
- EXPECT_EQ(16386, WEBRTC_SPL_SUB_SAT_W16(a, b));
-
- EXPECT_TRUE(WEBRTC_SPL_IS_NEG(b));
-
- // Shifting with negative numbers allowed
- // Positive means left shift
- EXPECT_EQ(32766, WEBRTC_SPL_SHIFT_W16(a, 1));
- EXPECT_EQ(32766, WEBRTC_SPL_SHIFT_W32(a, 1));
-
- // Shifting with negative numbers not allowed
- // We cannot do casting here due to signed/unsigned problem
- EXPECT_EQ(8191, WEBRTC_SPL_RSHIFT_W16(a, 1));
- EXPECT_EQ(32766, WEBRTC_SPL_LSHIFT_W16(a, 1));
- EXPECT_EQ(8191, WEBRTC_SPL_RSHIFT_W32(a, 1));
- EXPECT_EQ(32766, WEBRTC_SPL_LSHIFT_W32(a, 1));
-
- EXPECT_EQ(8191, WEBRTC_SPL_RSHIFT_U16(a, 1));
- EXPECT_EQ(32766, WEBRTC_SPL_LSHIFT_U16(a, 1));
- EXPECT_EQ(8191, WEBRTC_SPL_RSHIFT_U32(a, 1));
- EXPECT_EQ(32766, WEBRTC_SPL_LSHIFT_U32(a, 1));
-
- EXPECT_EQ(1470, WEBRTC_SPL_RAND(A));
-}
-
-TEST_F(SplTest, InlineTest) {
-
- WebRtc_Word16 a = 121;
- WebRtc_Word16 b = -17;
- WebRtc_Word32 A = 111121;
- WebRtc_Word32 B = -1711;
- char* bVersion = (char*) malloc(8);
-
- EXPECT_EQ(104, WebRtcSpl_AddSatW16(a, b));
- EXPECT_EQ(138, WebRtcSpl_SubSatW16(a, b));
-
- EXPECT_EQ(109410, WebRtcSpl_AddSatW32(A, B));
- EXPECT_EQ(112832, WebRtcSpl_SubSatW32(A, B));
-
- EXPECT_EQ(17, WebRtcSpl_GetSizeInBits(A));
- EXPECT_EQ(14, WebRtcSpl_NormW32(A));
- EXPECT_EQ(4, WebRtcSpl_NormW16(B));
- EXPECT_EQ(15, WebRtcSpl_NormU32(A));
-
- EXPECT_EQ(0, WebRtcSpl_get_version(bVersion, 8));
-}
-
-TEST_F(SplTest, MathOperationsTest) {
-
- int A = 117;
- WebRtc_Word32 num = 117;
- WebRtc_Word32 den = -5;
- WebRtc_UWord16 denU = 5;
- EXPECT_EQ(10, WebRtcSpl_Sqrt(A));
- EXPECT_EQ(10, WebRtcSpl_SqrtFloor(A));
-
-
- EXPECT_EQ(-91772805, WebRtcSpl_DivResultInQ31(den, num));
- EXPECT_EQ(-23, WebRtcSpl_DivW32W16ResW16(num, (WebRtc_Word16)den));
- EXPECT_EQ(-23, WebRtcSpl_DivW32W16(num, (WebRtc_Word16)den));
- EXPECT_EQ(23, WebRtcSpl_DivU32U16(num, denU));
- EXPECT_EQ(0, WebRtcSpl_DivW32HiLow(128, 0, 256));
-}
-
-TEST_F(SplTest, BasicArrayOperationsTest) {
-
-
- int B[] = {4, 12, 133, 1100};
- int Bs[] = {2, 6, 66, 550};
- WebRtc_UWord8* b8 = (WebRtc_UWord8*) malloc(4);
- WebRtc_Word16* b16 = (WebRtc_Word16*) malloc(4);
- WebRtc_Word32* b32 = (WebRtc_Word32*) malloc(4);
-
- WebRtc_UWord8* bTmp8 = (WebRtc_UWord8*) malloc(4);
- WebRtc_Word16* bTmp16 = (WebRtc_Word16*) malloc(4);
- WebRtc_Word32* bTmp32 = (WebRtc_Word32*) malloc(4);
-
- WebRtcSpl_MemSetW16(b16, 3, 4);
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ(3, b16[kk]);
- }
- EXPECT_EQ(4, WebRtcSpl_ZerosArrayW16(b16, 4));
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ(0, b16[kk]);
- }
- EXPECT_EQ(4, WebRtcSpl_OnesArrayW16(b16, 4));
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ(1, b16[kk]);
- }
- WebRtcSpl_MemSetW32(b32, 3, 4);
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ(3, b32[kk]);
- }
- EXPECT_EQ(4, WebRtcSpl_ZerosArrayW32(b32, 4));
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ(0, b32[kk]);
- }
- EXPECT_EQ(4, WebRtcSpl_OnesArrayW32(b32, 4));
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ(1, b32[kk]);
- }
- for (int kk = 0; kk < 4; ++kk) {
- bTmp8[kk] = (WebRtc_Word8)kk;
- bTmp16[kk] = (WebRtc_Word16)kk;
- bTmp32[kk] = (WebRtc_Word32)kk;
- }
- WEBRTC_SPL_MEMCPY_W8(b8, bTmp8, 4);
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ(b8[kk], bTmp8[kk]);
- }
- WEBRTC_SPL_MEMCPY_W16(b16, bTmp16, 4);
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ(b16[kk], bTmp16[kk]);
- }
-// WEBRTC_SPL_MEMCPY_W32(b32, bTmp32, 4);
-// for (int kk = 0; kk < 4; ++kk) {
-// EXPECT_EQ(b32[kk], bTmp32[kk]);
-// }
- EXPECT_EQ(2, WebRtcSpl_CopyFromEndW16(b16, 4, 2, bTmp16));
- for (int kk = 0; kk < 2; ++kk) {
- EXPECT_EQ(kk+2, bTmp16[kk]);
- }
-
- for (int kk = 0; kk < 4; ++kk) {
- b32[kk] = B[kk];
- b16[kk] = (WebRtc_Word16)B[kk];
- }
- WebRtcSpl_VectorBitShiftW32ToW16(bTmp16, 4, b32, 1);
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ((B[kk]>>1), bTmp16[kk]);
- }
- WebRtcSpl_VectorBitShiftW16(bTmp16, 4, b16, 1);
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ((B[kk]>>1), bTmp16[kk]);
- }
- WebRtcSpl_VectorBitShiftW32(bTmp32, 4, b32, 1);
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ((B[kk]>>1), bTmp32[kk]);
- }
-
- WebRtcSpl_MemCpyReversedOrder(&bTmp16[3], b16, 4);
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ(b16[3-kk], bTmp16[kk]);
- }
-
-}
-
-TEST_F(SplTest, MinMaxOperationsTest) {
-
-
- int B[] = {4, 12, 133, -1100};
- WebRtc_Word16* b16 = (WebRtc_Word16*) malloc(4);
- WebRtc_Word32* b32 = (WebRtc_Word32*) malloc(4);
-
- for (int kk = 0; kk < 4; ++kk) {
- b16[kk] = B[kk];
- b32[kk] = B[kk];
- }
-
- EXPECT_EQ(1100, WebRtcSpl_MaxAbsValueW16(b16, 4));
- EXPECT_EQ(1100, WebRtcSpl_MaxAbsValueW32(b32, 4));
- EXPECT_EQ(133, WebRtcSpl_MaxValueW16(b16, 4));
- EXPECT_EQ(133, WebRtcSpl_MaxValueW32(b32, 4));
- EXPECT_EQ(3, WebRtcSpl_MaxAbsIndexW16(b16, 4));
- EXPECT_EQ(2, WebRtcSpl_MaxIndexW16(b16, 4));
- EXPECT_EQ(2, WebRtcSpl_MaxIndexW32(b32, 4));
-
- EXPECT_EQ(-1100, WebRtcSpl_MinValueW16(b16, 4));
- EXPECT_EQ(-1100, WebRtcSpl_MinValueW32(b32, 4));
- EXPECT_EQ(3, WebRtcSpl_MinIndexW16(b16, 4));
- EXPECT_EQ(3, WebRtcSpl_MinIndexW32(b32, 4));
-
- EXPECT_EQ(0, WebRtcSpl_GetScalingSquare(b16, 4, 1));
-
-}
-
-TEST_F(SplTest, VectorOperationsTest) {
-
-
- int B[] = {4, 12, 133, 1100};
- WebRtc_Word16* a16 = (WebRtc_Word16*) malloc(4);
- WebRtc_Word16* b16 = (WebRtc_Word16*) malloc(4);
- WebRtc_Word32* b32 = (WebRtc_Word32*) malloc(4);
- WebRtc_Word16* bTmp16 = (WebRtc_Word16*) malloc(4);
-
- for (int kk = 0; kk < 4; ++kk) {
- a16[kk] = B[kk];
- b16[kk] = B[kk];
- }
-
- WebRtcSpl_AffineTransformVector(bTmp16, b16, 3, 7, 2, 4);
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ((B[kk]*3+7)>>2, bTmp16[kk]);
- }
- WebRtcSpl_ScaleAndAddVectorsWithRound(b16, 3, b16, 2, 2, bTmp16, 4);
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ((B[kk]*3+B[kk]*2+2)>>2, bTmp16[kk]);
- }
-
- WebRtcSpl_AddAffineVectorToVector(bTmp16, b16, 3, 7, 2, 4);
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ(((B[kk]*3+B[kk]*2+2)>>2)+((b16[kk]*3+7)>>2), bTmp16[kk]);
- }
-
- WebRtcSpl_CrossCorrelation(b32, b16, bTmp16, 4, 2, 2, 0);
- for (int kk = 0; kk < 2; ++kk) {
- EXPECT_EQ(614236, b32[kk]);
- }
-// EXPECT_EQ(, WebRtcSpl_DotProduct(b16, bTmp16, 4));
- EXPECT_EQ(306962, WebRtcSpl_DotProductWithScale(b16, b16, 4, 2));
-
- WebRtcSpl_ScaleVector(b16, bTmp16, 13, 4, 2);
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ((b16[kk]*13)>>2, bTmp16[kk]);
- }
- WebRtcSpl_ScaleVectorWithSat(b16, bTmp16, 13, 4, 2);
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ((b16[kk]*13)>>2, bTmp16[kk]);
- }
- WebRtcSpl_ScaleAndAddVectors(a16, 13, 2, b16, 7, 2, bTmp16, 4);
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ(((a16[kk]*13)>>2)+((b16[kk]*7)>>2), bTmp16[kk]);
- }
-
- WebRtcSpl_AddVectorsAndShift(bTmp16, a16, b16, 4, 2);
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ(B[kk] >> 1, bTmp16[kk]);
- }
- WebRtcSpl_ReverseOrderMultArrayElements(bTmp16, a16, &b16[3], 4, 2);
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ((a16[kk]*b16[3-kk])>>2, bTmp16[kk]);
- }
- WebRtcSpl_ElementwiseVectorMult(bTmp16, a16, b16, 4, 6);
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ((a16[kk]*b16[kk])>>6, bTmp16[kk]);
- }
-
- WebRtcSpl_SqrtOfOneMinusXSquared(b16, 4, bTmp16);
- for (int kk = 0; kk < 3; ++kk) {
- EXPECT_EQ(32767, bTmp16[kk]);
- }
- EXPECT_EQ(32749, bTmp16[3]);
-}
-
-TEST_F(SplTest, EstimatorsTest) {
-
-
- int B[] = {4, 12, 133, 1100};
- WebRtc_Word16* b16 = (WebRtc_Word16*) malloc(4);
- WebRtc_Word32* b32 = (WebRtc_Word32*) malloc(4);
- WebRtc_Word16* bTmp16 = (WebRtc_Word16*) malloc(4);
-
- for (int kk = 0; kk < 4; ++kk) {
- b16[kk] = B[kk];
- b32[kk] = B[kk];
- }
-
- EXPECT_EQ(0, WebRtcSpl_LevinsonDurbin(b32, b16, bTmp16, 2));
-
-}
-
-TEST_F(SplTest, FilterTest) {
-
-
- WebRtc_Word16 A[] = {1, 2, 33, 100};
- WebRtc_Word16 A5[] = {1, 2, 33, 100, -5};
- WebRtc_Word16 B[] = {4, 12, 133, 110};
- WebRtc_Word16* b16 = (WebRtc_Word16*) malloc(4);
- WebRtc_Word16* bTmp16 = (WebRtc_Word16*) malloc(4);
- WebRtc_Word16* bTmp16Low = (WebRtc_Word16*) malloc(4);
- WebRtc_Word16* bState = (WebRtc_Word16*) malloc(4);
- WebRtc_Word16* bStateLow = (WebRtc_Word16*) malloc(4);
-
- WebRtcSpl_ZerosArrayW16(bState, 4);
- WebRtcSpl_ZerosArrayW16(bStateLow, 4);
-
- for (int kk = 0; kk < 4; ++kk) {
- b16[kk] = A[kk];
- }
-
- // MA filters
- WebRtcSpl_FilterMAFastQ12(b16, bTmp16, B, 4, 4);
- for (int kk = 0; kk < 4; ++kk) {
- //EXPECT_EQ(aTmp16[kk], bTmp16[kk]);
- }
- // AR filters
- WebRtcSpl_FilterARFastQ12(b16, bTmp16, A, 4, 4);
- for (int kk = 0; kk < 4; ++kk) {
-// EXPECT_EQ(aTmp16[kk], bTmp16[kk]);
- }
- EXPECT_EQ(4, WebRtcSpl_FilterAR(A5, 5, b16, 4, bState, 4, bStateLow, 4, bTmp16, bTmp16Low, 4));
-
-}
-
-TEST_F(SplTest, RandTest) {
-
-
- WebRtc_Word16 BU[] = {3653, 12446, 8525, 30691};
- WebRtc_Word16 BN[] = {3459, -11689, -258, -3738};
- WebRtc_Word16* b16 = (WebRtc_Word16*) malloc(4);
- WebRtc_UWord32* bSeed = (WebRtc_UWord32*) malloc(1);
-
- bSeed[0] = 100000;
-
- EXPECT_EQ(464449057, WebRtcSpl_IncreaseSeed(bSeed));
- EXPECT_EQ(31565, WebRtcSpl_RandU(bSeed));
- EXPECT_EQ(-9786, WebRtcSpl_RandN(bSeed));
- EXPECT_EQ(4, WebRtcSpl_RandUArray(b16, 4, bSeed));
- for (int kk = 0; kk < 4; ++kk) {
- EXPECT_EQ(BU[kk], b16[kk]);
- }
-}
-
-TEST_F(SplTest, SignalProcessingTest) {
-
-
- int A[] = {1, 2, 33, 100};
- WebRtc_Word16* b16 = (WebRtc_Word16*) malloc(4);
- WebRtc_Word32* b32 = (WebRtc_Word32*) malloc(4);
-
- WebRtc_Word16* bTmp16 = (WebRtc_Word16*) malloc(4);
- WebRtc_Word32* bTmp32 = (WebRtc_Word32*) malloc(4);
-
- int bScale = 0;
-
- for (int kk = 0; kk < 4; ++kk) {
- b16[kk] = A[kk];
- b32[kk] = A[kk];
- }
-
- EXPECT_EQ(2, WebRtcSpl_AutoCorrelation(b16, 4, 1, bTmp32, &bScale));
- WebRtcSpl_ReflCoefToLpc(b16, 4, bTmp16);
-// for (int kk = 0; kk < 4; ++kk) {
-// EXPECT_EQ(aTmp16[kk], bTmp16[kk]);
-// }
- WebRtcSpl_LpcToReflCoef(bTmp16, 4, b16);
-// for (int kk = 0; kk < 4; ++kk) {
-// EXPECT_EQ(a16[kk], b16[kk]);
-// }
- WebRtcSpl_AutoCorrToReflCoef(b32, 4, bTmp16);
-// for (int kk = 0; kk < 4; ++kk) {
-// EXPECT_EQ(aTmp16[kk], bTmp16[kk]);
-// }
- WebRtcSpl_GetHanningWindow(bTmp16, 4);
-// for (int kk = 0; kk < 4; ++kk) {
-// EXPECT_EQ(aTmp16[kk], bTmp16[kk]);
-// }
-
- for (int kk = 0; kk < 4; ++kk) {
- b16[kk] = A[kk];
- }
- EXPECT_EQ(11094 , WebRtcSpl_Energy(b16, 4, &bScale));
- EXPECT_EQ(0, bScale);
-}
-
-TEST_F(SplTest, FFTTest) {
-
-
- WebRtc_Word16 B[] = {1, 2, 33, 100,
- 2, 3, 34, 101,
- 3, 4, 35, 102,
- 4, 5, 36, 103};
-
- EXPECT_EQ(0, WebRtcSpl_ComplexFFT(B, 3, 1));
-// for (int kk = 0; kk < 16; ++kk) {
-// EXPECT_EQ(A[kk], B[kk]);
-// }
- EXPECT_EQ(0, WebRtcSpl_ComplexIFFT(B, 3, 1));
-// for (int kk = 0; kk < 16; ++kk) {
-// EXPECT_EQ(A[kk], B[kk]);
-// }
- WebRtcSpl_ComplexBitReverse(B, 3);
- for (int kk = 0; kk < 16; ++kk) {
- //EXPECT_EQ(A[kk], B[kk]);
- }
-}
-
-int main(int argc, char** argv) {
- ::testing::InitGoogleTest(&argc, argv);
- SplEnvironment* env = new SplEnvironment;
- ::testing::AddGlobalTestEnvironment(env);
-
- return RUN_ALL_TESTS();
-}
diff --git a/src/common_audio/signal_processing_library/main/test/unit_test/unit_test.h b/src/common_audio/signal_processing_library/main/test/unit_test/unit_test.h
deleted file mode 100644
index d7babe7..0000000
--- a/src/common_audio/signal_processing_library/main/test/unit_test/unit_test.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-/*
- * This header file contains the function WebRtcSpl_CopyFromBeginU8().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#ifndef WEBRTC_SPL_UNIT_TEST_H_
-#define WEBRTC_SPL_UNIT_TEST_H_
-
-#include <gtest/gtest.h>
-
-class SplTest: public ::testing::Test
-{
-protected:
- SplTest();
- virtual void SetUp();
- virtual void TearDown();
-};
-
-#endif // WEBRTC_SPL_UNIT_TEST_H_
diff --git a/src/common_audio/vad/OWNERS b/src/common_audio/vad/OWNERS
deleted file mode 100644
index 9132851..0000000
--- a/src/common_audio/vad/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-bjornv@google.com
-jks@google.com
diff --git a/src/common_audio/vad/main/interface/webrtc_vad.h b/src/common_audio/vad/main/interface/webrtc_vad.h
deleted file mode 100644
index 6e3eb74..0000000
--- a/src/common_audio/vad/main/interface/webrtc_vad.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This header file includes the VAD API calls. Specific function calls are given below.
- */
-
-#ifndef WEBRTC_VAD_WEBRTC_VAD_H_
-#define WEBRTC_VAD_WEBRTC_VAD_H_
-
-#include "typedefs.h"
-
-typedef struct WebRtcVadInst VadInst;
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/****************************************************************************
- * WebRtcVad_get_version(...)
- *
- * This function returns the version number of the code.
- *
- * Output:
- * - version : Pointer to a buffer where the version info will
- * be stored.
- * Input:
- * - size_bytes : Size of the buffer.
- *
- */
-WebRtc_Word16 WebRtcVad_get_version(char *version, size_t size_bytes);
-
-/****************************************************************************
- * WebRtcVad_AssignSize(...)
- *
- * This functions get the size needed for storing the instance for encoder
- * and decoder, respectively
- *
- * Input/Output:
- * - size_in_bytes : Pointer to integer where the size is returned
- *
- * Return value : 0
- */
-WebRtc_Word16 WebRtcVad_AssignSize(int *size_in_bytes);
-
-/****************************************************************************
- * WebRtcVad_Assign(...)
- *
- * This functions Assigns memory for the instances.
- *
- * Input:
- * - vad_inst_addr : Address to where to assign memory
- * Output:
- * - vad_inst : Pointer to the instance that should be created
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-WebRtc_Word16 WebRtcVad_Assign(VadInst **vad_inst, void *vad_inst_addr);
-
-/****************************************************************************
- * WebRtcVad_Create(...)
- *
- * This function creates an instance to the VAD structure
- *
- * Input:
- * - vad_inst : Pointer to VAD instance that should be created
- *
- * Output:
- * - vad_inst : Pointer to created VAD instance
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-WebRtc_Word16 WebRtcVad_Create(VadInst **vad_inst);
-
-/****************************************************************************
- * WebRtcVad_Free(...)
- *
- * This function frees the dynamic memory of a specified VAD instance
- *
- * Input:
- * - vad_inst : Pointer to VAD instance that should be freed
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-WebRtc_Word16 WebRtcVad_Free(VadInst *vad_inst);
-
-/****************************************************************************
- * WebRtcVad_Init(...)
- *
- * This function initializes a VAD instance
- *
- * Input:
- * - vad_inst : Instance that should be initialized
- *
- * Output:
- * - vad_inst : Initialized instance
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-WebRtc_Word16 WebRtcVad_Init(VadInst *vad_inst);
-
-/****************************************************************************
- * WebRtcVad_set_mode(...)
- *
- * This function initializes a VAD instance
- *
- * Input:
- * - vad_inst : VAD instance
- * - mode : Aggressiveness setting (0, 1, 2, or 3)
- *
- * Output:
- * - vad_inst : Initialized instance
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-WebRtc_Word16 WebRtcVad_set_mode(VadInst *vad_inst, WebRtc_Word16 mode);
-
-/****************************************************************************
- * WebRtcVad_Process(...)
- *
- * This functions does a VAD for the inserted speech frame
- *
- * Input
- * - vad_inst : VAD Instance. Needs to be initiated before call.
- * - fs : sampling frequency (Hz): 8000, 16000, or 32000
- * - speech_frame : Pointer to speech frame buffer
- * - frame_length : Length of speech frame buffer in number of samples
- *
- * Output:
- * - vad_inst : Updated VAD instance
- *
- * Return value : 1 - Active Voice
- * 0 - Non-active Voice
- * -1 - Error
- */
-WebRtc_Word16 WebRtcVad_Process(VadInst *vad_inst,
- WebRtc_Word16 fs,
- WebRtc_Word16 *speech_frame,
- WebRtc_Word16 frame_length);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // WEBRTC_VAD_WEBRTC_VAD_H_
diff --git a/src/common_audio/vad/main/source/Android.mk b/src/common_audio/vad/main/source/Android.mk
deleted file mode 100644
index fba6ca1..0000000
--- a/src/common_audio/vad/main/source/Android.mk
+++ /dev/null
@@ -1,61 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_ARM_MODE := arm
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_MODULE := libwebrtc_vad
-LOCAL_MODULE_TAGS := optional
-LOCAL_GENERATED_SOURCES :=
-LOCAL_SRC_FILES := webrtc_vad.c \
- vad_const.c \
- vad_core.c \
- vad_filterbank.c \
- vad_gmm.c \
- vad_sp.c
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS :=
-MY_CFLAGS_C :=
-MY_DEFS := '-DNO_TCMALLOC' \
- '-DNO_HEAPCHECKER' \
- '-DWEBRTC_TARGET_PC' \
- '-DWEBRTC_LINUX' \
- '-DWEBRTC_ANDROID' \
- '-DANDROID'
-LOCAL_CFLAGS := $(MY_CFLAGS_C) $(MY_CFLAGS) $(MY_DEFS)
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../.. \
- $(LOCAL_PATH)/../interface \
- $(LOCAL_PATH)/../../../signal_processing_library/main/interface
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS :=
-
-LOCAL_LDFLAGS :=
-
-LOCAL_STATIC_LIBRARIES :=
-
-LOCAL_SHARED_LIBRARIES := libdl \
- libstlport
-LOCAL_ADDITIONAL_DEPENDENCIES :=
-
-ifeq ($(TARGET_OS)-$(TARGET_SIMULATOR),linux-true)
-LOCAL_LDLIBS += -ldl -lpthread
-endif
-
-ifneq ($(TARGET_SIMULATOR),true)
-LOCAL_SHARED_LIBRARIES += libdl
-endif
-
-include external/stlport/libstlport.mk
-include $(BUILD_STATIC_LIBRARY)
diff --git a/src/common_audio/vad/main/source/vad.gyp b/src/common_audio/vad/main/source/vad.gyp
deleted file mode 100644
index 754b684..0000000
--- a/src/common_audio/vad/main/source/vad.gyp
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-{
- 'includes': [
- '../../../../common_settings.gypi', # Common settings
- ],
- 'targets': [
- {
- 'target_name': 'vad',
- 'type': '<(library)',
- 'dependencies': [
- '../../../signal_processing_library/main/source/spl.gyp:spl',
- ],
- 'include_dirs': [
- '../interface',
- ],
- 'direct_dependent_settings': {
- 'include_dirs': [
- '../interface',
- ],
- },
- 'sources': [
- '../interface/webrtc_vad.h',
- 'webrtc_vad.c',
- 'vad_const.c',
- 'vad_const.h',
- 'vad_defines.h',
- 'vad_core.c',
- 'vad_core.h',
- 'vad_filterbank.c',
- 'vad_filterbank.h',
- 'vad_gmm.c',
- 'vad_gmm.h',
- 'vad_sp.c',
- 'vad_sp.h',
- ],
- },
- ],
-}
-
-# Local Variables:
-# tab-width:2
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/src/common_audio/vad/main/source/vad_const.c b/src/common_audio/vad/main/source/vad_const.c
deleted file mode 100644
index 47b6a4b..0000000
--- a/src/common_audio/vad/main/source/vad_const.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-/*
- * This file includes the constant values used internally in VAD.
- */
-
-#include "vad_const.h"
-
-// Spectrum Weighting
-const WebRtc_Word16 kSpectrumWeight[6] = {6, 8, 10, 12, 14, 16};
-
-const WebRtc_Word16 kCompVar = 22005;
-
-// Constant 160*log10(2) in Q9
-const WebRtc_Word16 kLogConst = 24660;
-
-// Constant log2(exp(1)) in Q12
-const WebRtc_Word16 kLog10Const = 5909;
-
-// Q15
-const WebRtc_Word16 kNoiseUpdateConst = 655;
-const WebRtc_Word16 kSpeechUpdateConst = 6554;
-
-// Q8
-const WebRtc_Word16 kBackEta = 154;
-
-// Coefficients used by WebRtcVad_HpOutput, Q14
-const WebRtc_Word16 kHpZeroCoefs[3] = {6631, -13262, 6631};
-const WebRtc_Word16 kHpPoleCoefs[3] = {16384, -7756, 5620};
-
-// Allpass filter coefficients, upper and lower, in Q15
-// Upper: 0.64, Lower: 0.17
-const WebRtc_Word16 kAllPassCoefsQ15[2] = {20972, 5571};
-const WebRtc_Word16 kAllPassCoefsQ13[2] = {5243, 1392}; // Q13
-
-// Minimum difference between the two models, Q5
-const WebRtc_Word16 kMinimumDifference[6] = {544, 544, 576, 576, 576, 576};
-
-// Upper limit of mean value for speech model, Q7
-const WebRtc_Word16 kMaximumSpeech[6] = {11392, 11392, 11520, 11520, 11520, 11520};
-
-// Minimum value for mean value
-const WebRtc_Word16 kMinimumMean[2] = {640, 768};
-
-// Upper limit of mean value for noise model, Q7
-const WebRtc_Word16 kMaximumNoise[6] = {9216, 9088, 8960, 8832, 8704, 8576};
-
-// Adjustment for division with two in WebRtcVad_SplitFilter
-const WebRtc_Word16 kOffsetVector[6] = {368, 368, 272, 176, 176, 176};
-
-// Start values for the Gaussian models, Q7
-// Weights for the two Gaussians for the six channels (noise)
-const WebRtc_Word16 kNoiseDataWeights[12] = {34, 62, 72, 66, 53, 25, 94, 66, 56, 62, 75, 103};
-
-// Weights for the two Gaussians for the six channels (speech)
-const WebRtc_Word16 kSpeechDataWeights[12] = {48, 82, 45, 87, 50, 47, 80, 46, 83, 41, 78, 81};
-
-// Means for the two Gaussians for the six channels (noise)
-const WebRtc_Word16 kNoiseDataMeans[12] = {6738, 4892, 7065, 6715, 6771, 3369, 7646, 3863,
- 7820, 7266, 5020, 4362};
-
-// Means for the two Gaussians for the six channels (speech)
-const WebRtc_Word16 kSpeechDataMeans[12] = {8306, 10085, 10078, 11823, 11843, 6309, 9473,
- 9571, 10879, 7581, 8180, 7483};
-
-// Stds for the two Gaussians for the six channels (noise)
-const WebRtc_Word16 kNoiseDataStds[12] = {378, 1064, 493, 582, 688, 593, 474, 697, 475, 688,
- 421, 455};
-
-// Stds for the two Gaussians for the six channels (speech)
-const WebRtc_Word16 kSpeechDataStds[12] = {555, 505, 567, 524, 585, 1231, 509, 828, 492, 1540,
- 1079, 850};
diff --git a/src/common_audio/vad/main/source/vad_const.h b/src/common_audio/vad/main/source/vad_const.h
deleted file mode 100644
index 8980437..0000000
--- a/src/common_audio/vad/main/source/vad_const.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This header file includes the declarations of the internally used constants.
- */
-
-#ifndef WEBRTC_VAD_CONST_H_
-#define WEBRTC_VAD_CONST_H_
-
-#include "typedefs.h"
-
-// TODO(ajm): give these internal-linkage by moving to the appropriate file
-// where possible, and otherwise tag with WebRtcVad_.
-
-// Spectrum Weighting
-extern const WebRtc_Word16 kSpectrumWeight[];
-extern const WebRtc_Word16 kCompVar;
-// Logarithm constant
-extern const WebRtc_Word16 kLogConst;
-extern const WebRtc_Word16 kLog10Const;
-// Q15
-extern const WebRtc_Word16 kNoiseUpdateConst;
-extern const WebRtc_Word16 kSpeechUpdateConst;
-// Q8
-extern const WebRtc_Word16 kBackEta;
-// Coefficients used by WebRtcVad_HpOutput, Q14
-extern const WebRtc_Word16 kHpZeroCoefs[];
-extern const WebRtc_Word16 kHpPoleCoefs[];
-// Allpass filter coefficients, upper and lower, in Q15 resp. Q13
-extern const WebRtc_Word16 kAllPassCoefsQ15[];
-extern const WebRtc_Word16 kAllPassCoefsQ13[];
-// Minimum difference between the two models, Q5
-extern const WebRtc_Word16 kMinimumDifference[];
-// Maximum value when updating the speech model, Q7
-extern const WebRtc_Word16 kMaximumSpeech[];
-// Minimum value for mean value
-extern const WebRtc_Word16 kMinimumMean[];
-// Upper limit of mean value for noise model, Q7
-extern const WebRtc_Word16 kMaximumNoise[];
-// Adjustment for division with two in WebRtcVad_SplitFilter
-extern const WebRtc_Word16 kOffsetVector[];
-// Start values for the Gaussian models, Q7
-extern const WebRtc_Word16 kNoiseDataWeights[];
-extern const WebRtc_Word16 kSpeechDataWeights[];
-extern const WebRtc_Word16 kNoiseDataMeans[];
-extern const WebRtc_Word16 kSpeechDataMeans[];
-extern const WebRtc_Word16 kNoiseDataStds[];
-extern const WebRtc_Word16 kSpeechDataStds[];
-
-#endif // WEBRTC_VAD_CONST_H_
diff --git a/src/common_audio/vad/main/source/vad_core.c b/src/common_audio/vad/main/source/vad_core.c
deleted file mode 100644
index e882999..0000000
--- a/src/common_audio/vad/main/source/vad_core.c
+++ /dev/null
@@ -1,685 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file includes the implementation of the core functionality in VAD.
- * For function description, see vad_core.h.
- */
-
-#include "vad_core.h"
-#include "vad_const.h"
-#include "vad_defines.h"
-#include "vad_filterbank.h"
-#include "vad_gmm.h"
-#include "vad_sp.h"
-#include "signal_processing_library.h"
-
-static const int kInitCheck = 42;
-
-// Initialize VAD
-int WebRtcVad_InitCore(VadInstT *inst, short mode)
-{
- int i;
-
- // Initialization of struct
- inst->vad = 1;
- inst->frame_counter = 0;
- inst->over_hang = 0;
- inst->num_of_speech = 0;
-
- // Initialization of downsampling filter state
- inst->downsampling_filter_states[0] = 0;
- inst->downsampling_filter_states[1] = 0;
- inst->downsampling_filter_states[2] = 0;
- inst->downsampling_filter_states[3] = 0;
-
- // Read initial PDF parameters
- for (i = 0; i < NUM_TABLE_VALUES; i++)
- {
- inst->noise_means[i] = kNoiseDataMeans[i];
- inst->speech_means[i] = kSpeechDataMeans[i];
- inst->noise_stds[i] = kNoiseDataStds[i];
- inst->speech_stds[i] = kSpeechDataStds[i];
- }
-
- // Index and Minimum value vectors are initialized
- for (i = 0; i < 16 * NUM_CHANNELS; i++)
- {
- inst->low_value_vector[i] = 10000;
- inst->index_vector[i] = 0;
- }
-
- for (i = 0; i < 5; i++)
- {
- inst->upper_state[i] = 0;
- inst->lower_state[i] = 0;
- }
-
- for (i = 0; i < 4; i++)
- {
- inst->hp_filter_state[i] = 0;
- }
-
- // Init mean value memory, for FindMin function
- inst->mean_value[0] = 1600;
- inst->mean_value[1] = 1600;
- inst->mean_value[2] = 1600;
- inst->mean_value[3] = 1600;
- inst->mean_value[4] = 1600;
- inst->mean_value[5] = 1600;
-
- if (mode == 0)
- {
- // Quality mode
- inst->over_hang_max_1[0] = OHMAX1_10MS_Q; // Overhang short speech burst
- inst->over_hang_max_1[1] = OHMAX1_20MS_Q; // Overhang short speech burst
- inst->over_hang_max_1[2] = OHMAX1_30MS_Q; // Overhang short speech burst
- inst->over_hang_max_2[0] = OHMAX2_10MS_Q; // Overhang long speech burst
- inst->over_hang_max_2[1] = OHMAX2_20MS_Q; // Overhang long speech burst
- inst->over_hang_max_2[2] = OHMAX2_30MS_Q; // Overhang long speech burst
-
- inst->individual[0] = INDIVIDUAL_10MS_Q;
- inst->individual[1] = INDIVIDUAL_20MS_Q;
- inst->individual[2] = INDIVIDUAL_30MS_Q;
-
- inst->total[0] = TOTAL_10MS_Q;
- inst->total[1] = TOTAL_20MS_Q;
- inst->total[2] = TOTAL_30MS_Q;
- } else if (mode == 1)
- {
- // Low bitrate mode
- inst->over_hang_max_1[0] = OHMAX1_10MS_LBR; // Overhang short speech burst
- inst->over_hang_max_1[1] = OHMAX1_20MS_LBR; // Overhang short speech burst
- inst->over_hang_max_1[2] = OHMAX1_30MS_LBR; // Overhang short speech burst
- inst->over_hang_max_2[0] = OHMAX2_10MS_LBR; // Overhang long speech burst
- inst->over_hang_max_2[1] = OHMAX2_20MS_LBR; // Overhang long speech burst
- inst->over_hang_max_2[2] = OHMAX2_30MS_LBR; // Overhang long speech burst
-
- inst->individual[0] = INDIVIDUAL_10MS_LBR;
- inst->individual[1] = INDIVIDUAL_20MS_LBR;
- inst->individual[2] = INDIVIDUAL_30MS_LBR;
-
- inst->total[0] = TOTAL_10MS_LBR;
- inst->total[1] = TOTAL_20MS_LBR;
- inst->total[2] = TOTAL_30MS_LBR;
- } else if (mode == 2)
- {
- // Aggressive mode
- inst->over_hang_max_1[0] = OHMAX1_10MS_AGG; // Overhang short speech burst
- inst->over_hang_max_1[1] = OHMAX1_20MS_AGG; // Overhang short speech burst
- inst->over_hang_max_1[2] = OHMAX1_30MS_AGG; // Overhang short speech burst
- inst->over_hang_max_2[0] = OHMAX2_10MS_AGG; // Overhang long speech burst
- inst->over_hang_max_2[1] = OHMAX2_20MS_AGG; // Overhang long speech burst
- inst->over_hang_max_2[2] = OHMAX2_30MS_AGG; // Overhang long speech burst
-
- inst->individual[0] = INDIVIDUAL_10MS_AGG;
- inst->individual[1] = INDIVIDUAL_20MS_AGG;
- inst->individual[2] = INDIVIDUAL_30MS_AGG;
-
- inst->total[0] = TOTAL_10MS_AGG;
- inst->total[1] = TOTAL_20MS_AGG;
- inst->total[2] = TOTAL_30MS_AGG;
- } else
- {
- // Very aggressive mode
- inst->over_hang_max_1[0] = OHMAX1_10MS_VAG; // Overhang short speech burst
- inst->over_hang_max_1[1] = OHMAX1_20MS_VAG; // Overhang short speech burst
- inst->over_hang_max_1[2] = OHMAX1_30MS_VAG; // Overhang short speech burst
- inst->over_hang_max_2[0] = OHMAX2_10MS_VAG; // Overhang long speech burst
- inst->over_hang_max_2[1] = OHMAX2_20MS_VAG; // Overhang long speech burst
- inst->over_hang_max_2[2] = OHMAX2_30MS_VAG; // Overhang long speech burst
-
- inst->individual[0] = INDIVIDUAL_10MS_VAG;
- inst->individual[1] = INDIVIDUAL_20MS_VAG;
- inst->individual[2] = INDIVIDUAL_30MS_VAG;
-
- inst->total[0] = TOTAL_10MS_VAG;
- inst->total[1] = TOTAL_20MS_VAG;
- inst->total[2] = TOTAL_30MS_VAG;
- }
-
- inst->init_flag = kInitCheck;
-
- return 0;
-}
-
-// Set aggressiveness mode
-int WebRtcVad_set_mode_core(VadInstT *inst, short mode)
-{
-
- if (mode == 0)
- {
- // Quality mode
- inst->over_hang_max_1[0] = OHMAX1_10MS_Q; // Overhang short speech burst
- inst->over_hang_max_1[1] = OHMAX1_20MS_Q; // Overhang short speech burst
- inst->over_hang_max_1[2] = OHMAX1_30MS_Q; // Overhang short speech burst
- inst->over_hang_max_2[0] = OHMAX2_10MS_Q; // Overhang long speech burst
- inst->over_hang_max_2[1] = OHMAX2_20MS_Q; // Overhang long speech burst
- inst->over_hang_max_2[2] = OHMAX2_30MS_Q; // Overhang long speech burst
-
- inst->individual[0] = INDIVIDUAL_10MS_Q;
- inst->individual[1] = INDIVIDUAL_20MS_Q;
- inst->individual[2] = INDIVIDUAL_30MS_Q;
-
- inst->total[0] = TOTAL_10MS_Q;
- inst->total[1] = TOTAL_20MS_Q;
- inst->total[2] = TOTAL_30MS_Q;
- } else if (mode == 1)
- {
- // Low bitrate mode
- inst->over_hang_max_1[0] = OHMAX1_10MS_LBR; // Overhang short speech burst
- inst->over_hang_max_1[1] = OHMAX1_20MS_LBR; // Overhang short speech burst
- inst->over_hang_max_1[2] = OHMAX1_30MS_LBR; // Overhang short speech burst
- inst->over_hang_max_2[0] = OHMAX2_10MS_LBR; // Overhang long speech burst
- inst->over_hang_max_2[1] = OHMAX2_20MS_LBR; // Overhang long speech burst
- inst->over_hang_max_2[2] = OHMAX2_30MS_LBR; // Overhang long speech burst
-
- inst->individual[0] = INDIVIDUAL_10MS_LBR;
- inst->individual[1] = INDIVIDUAL_20MS_LBR;
- inst->individual[2] = INDIVIDUAL_30MS_LBR;
-
- inst->total[0] = TOTAL_10MS_LBR;
- inst->total[1] = TOTAL_20MS_LBR;
- inst->total[2] = TOTAL_30MS_LBR;
- } else if (mode == 2)
- {
- // Aggressive mode
- inst->over_hang_max_1[0] = OHMAX1_10MS_AGG; // Overhang short speech burst
- inst->over_hang_max_1[1] = OHMAX1_20MS_AGG; // Overhang short speech burst
- inst->over_hang_max_1[2] = OHMAX1_30MS_AGG; // Overhang short speech burst
- inst->over_hang_max_2[0] = OHMAX2_10MS_AGG; // Overhang long speech burst
- inst->over_hang_max_2[1] = OHMAX2_20MS_AGG; // Overhang long speech burst
- inst->over_hang_max_2[2] = OHMAX2_30MS_AGG; // Overhang long speech burst
-
- inst->individual[0] = INDIVIDUAL_10MS_AGG;
- inst->individual[1] = INDIVIDUAL_20MS_AGG;
- inst->individual[2] = INDIVIDUAL_30MS_AGG;
-
- inst->total[0] = TOTAL_10MS_AGG;
- inst->total[1] = TOTAL_20MS_AGG;
- inst->total[2] = TOTAL_30MS_AGG;
- } else if (mode == 3)
- {
- // Very aggressive mode
- inst->over_hang_max_1[0] = OHMAX1_10MS_VAG; // Overhang short speech burst
- inst->over_hang_max_1[1] = OHMAX1_20MS_VAG; // Overhang short speech burst
- inst->over_hang_max_1[2] = OHMAX1_30MS_VAG; // Overhang short speech burst
- inst->over_hang_max_2[0] = OHMAX2_10MS_VAG; // Overhang long speech burst
- inst->over_hang_max_2[1] = OHMAX2_20MS_VAG; // Overhang long speech burst
- inst->over_hang_max_2[2] = OHMAX2_30MS_VAG; // Overhang long speech burst
-
- inst->individual[0] = INDIVIDUAL_10MS_VAG;
- inst->individual[1] = INDIVIDUAL_20MS_VAG;
- inst->individual[2] = INDIVIDUAL_30MS_VAG;
-
- inst->total[0] = TOTAL_10MS_VAG;
- inst->total[1] = TOTAL_20MS_VAG;
- inst->total[2] = TOTAL_30MS_VAG;
- } else
- {
- return -1;
- }
-
- return 0;
-}
-
-// Calculate VAD decision by first extracting feature values and then calculate
-// probability for both speech and background noise.
-
-WebRtc_Word16 WebRtcVad_CalcVad32khz(VadInstT *inst, WebRtc_Word16 *speech_frame,
- int frame_length)
-{
- WebRtc_Word16 len, vad;
- WebRtc_Word16 speechWB[480]; // Downsampled speech frame: 960 samples (30ms in SWB)
- WebRtc_Word16 speechNB[240]; // Downsampled speech frame: 480 samples (30ms in WB)
-
-
- // Downsample signal 32->16->8 before doing VAD
- WebRtcVad_Downsampling(speech_frame, speechWB, &(inst->downsampling_filter_states[2]),
- frame_length);
- len = WEBRTC_SPL_RSHIFT_W16(frame_length, 1);
-
- WebRtcVad_Downsampling(speechWB, speechNB, inst->downsampling_filter_states, len);
- len = WEBRTC_SPL_RSHIFT_W16(len, 1);
-
- // Do VAD on an 8 kHz signal
- vad = WebRtcVad_CalcVad8khz(inst, speechNB, len);
-
- return vad;
-}
-
-WebRtc_Word16 WebRtcVad_CalcVad16khz(VadInstT *inst, WebRtc_Word16 *speech_frame,
- int frame_length)
-{
- WebRtc_Word16 len, vad;
- WebRtc_Word16 speechNB[240]; // Downsampled speech frame: 480 samples (30ms in WB)
-
- // Wideband: Downsample signal before doing VAD
- WebRtcVad_Downsampling(speech_frame, speechNB, inst->downsampling_filter_states,
- frame_length);
-
- len = WEBRTC_SPL_RSHIFT_W16(frame_length, 1);
- vad = WebRtcVad_CalcVad8khz(inst, speechNB, len);
-
- return vad;
-}
-
-WebRtc_Word16 WebRtcVad_CalcVad8khz(VadInstT *inst, WebRtc_Word16 *speech_frame,
- int frame_length)
-{
- WebRtc_Word16 feature_vector[NUM_CHANNELS], total_power;
-
- // Get power in the bands
- total_power = WebRtcVad_get_features(inst, speech_frame, frame_length, feature_vector);
-
- // Make a VAD
- inst->vad = WebRtcVad_GmmProbability(inst, feature_vector, total_power, frame_length);
-
- return inst->vad;
-}
-
-// Calculate probability for both speech and background noise, and perform a
-// hypothesis-test.
-WebRtc_Word16 WebRtcVad_GmmProbability(VadInstT *inst, WebRtc_Word16 *feature_vector,
- WebRtc_Word16 total_power, int frame_length)
-{
- int n, k;
- WebRtc_Word16 backval;
- WebRtc_Word16 h0, h1;
- WebRtc_Word16 ratvec, xval;
- WebRtc_Word16 vadflag;
- WebRtc_Word16 shifts0, shifts1;
- WebRtc_Word16 tmp16, tmp16_1, tmp16_2;
- WebRtc_Word16 diff, nr, pos;
- WebRtc_Word16 nmk, nmk2, nmk3, smk, smk2, nsk, ssk;
- WebRtc_Word16 delt, ndelt;
- WebRtc_Word16 maxspe, maxmu;
- WebRtc_Word16 deltaN[NUM_TABLE_VALUES], deltaS[NUM_TABLE_VALUES];
- WebRtc_Word16 ngprvec[NUM_TABLE_VALUES], sgprvec[NUM_TABLE_VALUES];
- WebRtc_Word32 h0test, h1test;
- WebRtc_Word32 tmp32_1, tmp32_2;
- WebRtc_Word32 dotVal;
- WebRtc_Word32 nmid, smid;
- WebRtc_Word32 probn[NUM_MODELS], probs[NUM_MODELS];
- WebRtc_Word16 *nmean1ptr, *nmean2ptr, *smean1ptr, *smean2ptr, *nstd1ptr, *nstd2ptr,
- *sstd1ptr, *sstd2ptr;
- WebRtc_Word16 overhead1, overhead2, individualTest, totalTest;
-
- // Set the thresholds to different values based on frame length
- if (frame_length == 80)
- {
- // 80 input samples
- overhead1 = inst->over_hang_max_1[0];
- overhead2 = inst->over_hang_max_2[0];
- individualTest = inst->individual[0];
- totalTest = inst->total[0];
- } else if (frame_length == 160)
- {
- // 160 input samples
- overhead1 = inst->over_hang_max_1[1];
- overhead2 = inst->over_hang_max_2[1];
- individualTest = inst->individual[1];
- totalTest = inst->total[1];
- } else
- {
- // 240 input samples
- overhead1 = inst->over_hang_max_1[2];
- overhead2 = inst->over_hang_max_2[2];
- individualTest = inst->individual[2];
- totalTest = inst->total[2];
- }
-
- if (total_power > MIN_ENERGY)
- { // If signal present at all
-
- // Set pointers to the gaussian parameters
- nmean1ptr = &inst->noise_means[0];
- nmean2ptr = &inst->noise_means[NUM_CHANNELS];
- smean1ptr = &inst->speech_means[0];
- smean2ptr = &inst->speech_means[NUM_CHANNELS];
- nstd1ptr = &inst->noise_stds[0];
- nstd2ptr = &inst->noise_stds[NUM_CHANNELS];
- sstd1ptr = &inst->speech_stds[0];
- sstd2ptr = &inst->speech_stds[NUM_CHANNELS];
-
- vadflag = 0;
- dotVal = 0;
- for (n = 0; n < NUM_CHANNELS; n++)
- { // For all channels
-
- pos = WEBRTC_SPL_LSHIFT_W16(n, 1);
- xval = feature_vector[n];
-
- // Probability for Noise, Q7 * Q20 = Q27
- tmp32_1 = WebRtcVad_GaussianProbability(xval, *nmean1ptr++, *nstd1ptr++,
- &deltaN[pos]);
- probn[0] = (WebRtc_Word32)(kNoiseDataWeights[n] * tmp32_1);
- tmp32_1 = WebRtcVad_GaussianProbability(xval, *nmean2ptr++, *nstd2ptr++,
- &deltaN[pos + 1]);
- probn[1] = (WebRtc_Word32)(kNoiseDataWeights[n + NUM_CHANNELS] * tmp32_1);
- h0test = probn[0] + probn[1]; // Q27
- h0 = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(h0test, 12); // Q15
-
- // Probability for Speech
- tmp32_1 = WebRtcVad_GaussianProbability(xval, *smean1ptr++, *sstd1ptr++,
- &deltaS[pos]);
- probs[0] = (WebRtc_Word32)(kSpeechDataWeights[n] * tmp32_1);
- tmp32_1 = WebRtcVad_GaussianProbability(xval, *smean2ptr++, *sstd2ptr++,
- &deltaS[pos + 1]);
- probs[1] = (WebRtc_Word32)(kSpeechDataWeights[n + NUM_CHANNELS] * tmp32_1);
- h1test = probs[0] + probs[1]; // Q27
- h1 = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(h1test, 12); // Q15
-
- // Get likelihood ratio. Approximate log2(H1/H0) with shifts0 - shifts1
- shifts0 = WebRtcSpl_NormW32(h0test);
- shifts1 = WebRtcSpl_NormW32(h1test);
-
- if ((h0test > 0) && (h1test > 0))
- {
- ratvec = shifts0 - shifts1;
- } else if (h1test > 0)
- {
- ratvec = 31 - shifts1;
- } else if (h0test > 0)
- {
- ratvec = shifts0 - 31;
- } else
- {
- ratvec = 0;
- }
-
- // VAD decision with spectrum weighting
- dotVal += WEBRTC_SPL_MUL_16_16(ratvec, kSpectrumWeight[n]);
-
- // Individual channel test
- if ((ratvec << 2) > individualTest)
- {
- vadflag = 1;
- }
-
- // Probabilities used when updating model
- if (h0 > 0)
- {
- tmp32_1 = probn[0] & 0xFFFFF000; // Q27
- tmp32_2 = WEBRTC_SPL_LSHIFT_W32(tmp32_1, 2); // Q29
- ngprvec[pos] = (WebRtc_Word16)WebRtcSpl_DivW32W16(tmp32_2, h0);
- ngprvec[pos + 1] = 16384 - ngprvec[pos];
- } else
- {
- ngprvec[pos] = 16384;
- ngprvec[pos + 1] = 0;
- }
-
- // Probabilities used when updating model
- if (h1 > 0)
- {
- tmp32_1 = probs[0] & 0xFFFFF000;
- tmp32_2 = WEBRTC_SPL_LSHIFT_W32(tmp32_1, 2);
- sgprvec[pos] = (WebRtc_Word16)WebRtcSpl_DivW32W16(tmp32_2, h1);
- sgprvec[pos + 1] = 16384 - sgprvec[pos];
- } else
- {
- sgprvec[pos] = 0;
- sgprvec[pos + 1] = 0;
- }
- }
-
- // Overall test
- if (dotVal >= totalTest)
- {
- vadflag |= 1;
- }
-
- // Set pointers to the means and standard deviations.
- nmean1ptr = &inst->noise_means[0];
- smean1ptr = &inst->speech_means[0];
- nstd1ptr = &inst->noise_stds[0];
- sstd1ptr = &inst->speech_stds[0];
-
- maxspe = 12800;
-
- // Update the model's parameters
- for (n = 0; n < NUM_CHANNELS; n++)
- {
-
- pos = WEBRTC_SPL_LSHIFT_W16(n, 1);
-
- // Get min value in past which is used for long term correction
- backval = WebRtcVad_FindMinimum(inst, feature_vector[n], n); // Q4
-
- // Compute the "global" mean, that is the sum of the two means weighted
- nmid = WEBRTC_SPL_MUL_16_16(kNoiseDataWeights[n], *nmean1ptr); // Q7 * Q7
- nmid += WEBRTC_SPL_MUL_16_16(kNoiseDataWeights[n+NUM_CHANNELS],
- *(nmean1ptr+NUM_CHANNELS));
- tmp16_1 = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(nmid, 6); // Q8
-
- for (k = 0; k < NUM_MODELS; k++)
- {
-
- nr = pos + k;
-
- nmean2ptr = nmean1ptr + k * NUM_CHANNELS;
- smean2ptr = smean1ptr + k * NUM_CHANNELS;
- nstd2ptr = nstd1ptr + k * NUM_CHANNELS;
- sstd2ptr = sstd1ptr + k * NUM_CHANNELS;
- nmk = *nmean2ptr;
- smk = *smean2ptr;
- nsk = *nstd2ptr;
- ssk = *sstd2ptr;
-
- // Update noise mean vector if the frame consists of noise only
- nmk2 = nmk;
- if (!vadflag)
- {
- // deltaN = (x-mu)/sigma^2
- // ngprvec[k] = probn[k]/(probn[0] + probn[1])
-
- delt = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(ngprvec[nr],
- deltaN[nr], 11); // Q14*Q11
- nmk2 = nmk + (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(delt,
- kNoiseUpdateConst,
- 22); // Q7+(Q14*Q15>>22)
- }
-
- // Long term correction of the noise mean
- ndelt = WEBRTC_SPL_LSHIFT_W16(backval, 4);
- ndelt -= tmp16_1; // Q8 - Q8
- nmk3 = nmk2 + (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(ndelt,
- kBackEta,
- 9); // Q7+(Q8*Q8)>>9
-
- // Control that the noise mean does not drift to much
- tmp16 = WEBRTC_SPL_LSHIFT_W16(k+5, 7);
- if (nmk3 < tmp16)
- nmk3 = tmp16;
- tmp16 = WEBRTC_SPL_LSHIFT_W16(72+k-n, 7);
- if (nmk3 > tmp16)
- nmk3 = tmp16;
- *nmean2ptr = nmk3;
-
- if (vadflag)
- {
- // Update speech mean vector:
- // deltaS = (x-mu)/sigma^2
- // sgprvec[k] = probn[k]/(probn[0] + probn[1])
-
- delt = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(sgprvec[nr],
- deltaS[nr],
- 11); // (Q14*Q11)>>11=Q14
- tmp16 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(delt,
- kSpeechUpdateConst,
- 21) + 1;
- smk2 = smk + (tmp16 >> 1); // Q7 + (Q14 * Q15 >> 22)
-
- // Control that the speech mean does not drift to much
- maxmu = maxspe + 640;
- if (smk2 < kMinimumMean[k])
- smk2 = kMinimumMean[k];
- if (smk2 > maxmu)
- smk2 = maxmu;
-
- *smean2ptr = smk2;
-
- // (Q7>>3) = Q4
- tmp16 = WEBRTC_SPL_RSHIFT_W16((smk + 4), 3);
-
- tmp16 = feature_vector[n] - tmp16; // Q4
- tmp32_1 = WEBRTC_SPL_MUL_16_16_RSFT(deltaS[nr], tmp16, 3);
- tmp32_2 = tmp32_1 - (WebRtc_Word32)4096; // Q12
- tmp16 = WEBRTC_SPL_RSHIFT_W16((sgprvec[nr]), 2);
- tmp32_1 = (WebRtc_Word32)(tmp16 * tmp32_2);// (Q15>>3)*(Q14>>2)=Q12*Q12=Q24
-
- tmp32_2 = WEBRTC_SPL_RSHIFT_W32(tmp32_1, 4); // Q20
-
- // 0.1 * Q20 / Q7 = Q13
- if (tmp32_2 > 0)
- tmp16 = (WebRtc_Word16)WebRtcSpl_DivW32W16(tmp32_2, ssk * 10);
- else
- {
- tmp16 = (WebRtc_Word16)WebRtcSpl_DivW32W16(-tmp32_2, ssk * 10);
- tmp16 = -tmp16;
- }
- // divide by 4 giving an update factor of 0.025
- tmp16 += 128; // Rounding
- ssk += WEBRTC_SPL_RSHIFT_W16(tmp16, 8);
- // Division with 8 plus Q7
- if (ssk < MIN_STD)
- ssk = MIN_STD;
- *sstd2ptr = ssk;
- } else
- {
- // Update GMM variance vectors
- // deltaN * (feature_vector[n] - nmk) - 1, Q11 * Q4
- tmp16 = feature_vector[n] - WEBRTC_SPL_RSHIFT_W16(nmk, 3);
-
- // (Q15>>3) * (Q14>>2) = Q12 * Q12 = Q24
- tmp32_1 = WEBRTC_SPL_MUL_16_16_RSFT(deltaN[nr], tmp16, 3) - 4096;
- tmp16 = WEBRTC_SPL_RSHIFT_W16((ngprvec[nr]+2), 2);
- tmp32_2 = (WebRtc_Word32)(tmp16 * tmp32_1);
- tmp32_1 = WEBRTC_SPL_RSHIFT_W32(tmp32_2, 14);
- // Q20 * approx 0.001 (2^-10=0.0009766)
-
- // Q20 / Q7 = Q13
- tmp16 = (WebRtc_Word16)WebRtcSpl_DivW32W16(tmp32_1, nsk);
- if (tmp32_1 > 0)
- tmp16 = (WebRtc_Word16)WebRtcSpl_DivW32W16(tmp32_1, nsk);
- else
- {
- tmp16 = (WebRtc_Word16)WebRtcSpl_DivW32W16(-tmp32_1, nsk);
- tmp16 = -tmp16;
- }
- tmp16 += 32; // Rounding
- nsk += WEBRTC_SPL_RSHIFT_W16(tmp16, 6);
-
- if (nsk < MIN_STD)
- nsk = MIN_STD;
-
- *nstd2ptr = nsk;
- }
- }
-
- // Separate models if they are too close - nmid in Q14
- nmid = WEBRTC_SPL_MUL_16_16(kNoiseDataWeights[n], *nmean1ptr);
- nmid += WEBRTC_SPL_MUL_16_16(kNoiseDataWeights[n+NUM_CHANNELS], *nmean2ptr);
-
- // smid in Q14
- smid = WEBRTC_SPL_MUL_16_16(kSpeechDataWeights[n], *smean1ptr);
- smid += WEBRTC_SPL_MUL_16_16(kSpeechDataWeights[n+NUM_CHANNELS], *smean2ptr);
-
- // diff = "global" speech mean - "global" noise mean
- diff = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(smid, 9);
- tmp16 = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(nmid, 9);
- diff -= tmp16;
-
- if (diff < kMinimumDifference[n])
- {
-
- tmp16 = kMinimumDifference[n] - diff; // Q5
-
- // tmp16_1 = ~0.8 * (kMinimumDifference - diff) in Q7
- // tmp16_2 = ~0.2 * (kMinimumDifference - diff) in Q7
- tmp16_1 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(13, tmp16, 2);
- tmp16_2 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(3, tmp16, 2);
-
- // First Gauss, speech model
- tmp16 = tmp16_1 + *smean1ptr;
- *smean1ptr = tmp16;
- smid = WEBRTC_SPL_MUL_16_16(tmp16, kSpeechDataWeights[n]);
-
- // Second Gauss, speech model
- tmp16 = tmp16_1 + *smean2ptr;
- *smean2ptr = tmp16;
- smid += WEBRTC_SPL_MUL_16_16(tmp16, kSpeechDataWeights[n+NUM_CHANNELS]);
-
- // First Gauss, noise model
- tmp16 = *nmean1ptr - tmp16_2;
- *nmean1ptr = tmp16;
-
- nmid = WEBRTC_SPL_MUL_16_16(tmp16, kNoiseDataWeights[n]);
-
- // Second Gauss, noise model
- tmp16 = *nmean2ptr - tmp16_2;
- *nmean2ptr = tmp16;
- nmid += WEBRTC_SPL_MUL_16_16(tmp16, kNoiseDataWeights[n+NUM_CHANNELS]);
- }
-
- // Control that the speech & noise means do not drift to much
- maxspe = kMaximumSpeech[n];
- tmp16_2 = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(smid, 7);
- if (tmp16_2 > maxspe)
- { // Upper limit of speech model
- tmp16_2 -= maxspe;
-
- *smean1ptr -= tmp16_2;
- *smean2ptr -= tmp16_2;
- }
-
- tmp16_2 = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(nmid, 7);
- if (tmp16_2 > kMaximumNoise[n])
- {
- tmp16_2 -= kMaximumNoise[n];
-
- *nmean1ptr -= tmp16_2;
- *nmean2ptr -= tmp16_2;
- }
-
- *nmean1ptr++;
- *smean1ptr++;
- *nstd1ptr++;
- *sstd1ptr++;
- }
- inst->frame_counter++;
- } else
- {
- vadflag = 0;
- }
-
- // Hangover smoothing
- if (!vadflag)
- {
- if (inst->over_hang > 0)
- {
- vadflag = 2 + inst->over_hang;
- inst->over_hang = inst->over_hang - 1;
- }
- inst->num_of_speech = 0;
- } else
- {
- inst->num_of_speech = inst->num_of_speech + 1;
- if (inst->num_of_speech > NSP_MAX)
- {
- inst->num_of_speech = NSP_MAX;
- inst->over_hang = overhead2;
- } else
- inst->over_hang = overhead1;
- }
- return vadflag;
-}
diff --git a/src/common_audio/vad/main/source/vad_core.h b/src/common_audio/vad/main/source/vad_core.h
deleted file mode 100644
index 544caf5..0000000
--- a/src/common_audio/vad/main/source/vad_core.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This header file includes the descriptions of the core VAD calls.
- */
-
-#ifndef WEBRTC_VAD_CORE_H_
-#define WEBRTC_VAD_CORE_H_
-
-#include "typedefs.h"
-#include "vad_defines.h"
-
-typedef struct VadInstT_
-{
-
- WebRtc_Word16 vad;
- WebRtc_Word32 downsampling_filter_states[4];
- WebRtc_Word16 noise_means[NUM_TABLE_VALUES];
- WebRtc_Word16 speech_means[NUM_TABLE_VALUES];
- WebRtc_Word16 noise_stds[NUM_TABLE_VALUES];
- WebRtc_Word16 speech_stds[NUM_TABLE_VALUES];
- WebRtc_Word32 frame_counter;
- WebRtc_Word16 over_hang; // Over Hang
- WebRtc_Word16 num_of_speech;
- WebRtc_Word16 index_vector[16 * NUM_CHANNELS];
- WebRtc_Word16 low_value_vector[16 * NUM_CHANNELS];
- WebRtc_Word16 mean_value[NUM_CHANNELS];
- WebRtc_Word16 upper_state[5];
- WebRtc_Word16 lower_state[5];
- WebRtc_Word16 hp_filter_state[4];
- WebRtc_Word16 over_hang_max_1[3];
- WebRtc_Word16 over_hang_max_2[3];
- WebRtc_Word16 individual[3];
- WebRtc_Word16 total[3];
-
- short init_flag;
-
-} VadInstT;
-
-/****************************************************************************
- * WebRtcVad_InitCore(...)
- *
- * This function initializes a VAD instance
- *
- * Input:
- * - inst : Instance that should be initialized
- * - mode : Aggressiveness degree
- * 0 (High quality) - 3 (Highly aggressive)
- *
- * Output:
- * - inst : Initialized instance
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-int WebRtcVad_InitCore(VadInstT* inst, short mode);
-
-/****************************************************************************
- * WebRtcVad_set_mode_core(...)
- *
- * This function changes the VAD settings
- *
- * Input:
- * - inst : VAD instance
- * - mode : Aggressiveness degree
- * 0 (High quality) - 3 (Highly aggressive)
- *
- * Output:
- * - inst : Changed instance
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-
-int WebRtcVad_set_mode_core(VadInstT* inst, short mode);
-
-/****************************************************************************
- * WebRtcVad_CalcVad32khz(...)
- * WebRtcVad_CalcVad16khz(...)
- * WebRtcVad_CalcVad8khz(...)
- *
- * Calculate probability for active speech and make VAD decision.
- *
- * Input:
- * - inst : Instance that should be initialized
- * - speech_frame : Input speech frame
- * - frame_length : Number of input samples
- *
- * Output:
- * - inst : Updated filter states etc.
- *
- * Return value : VAD decision
- * 0 - No active speech
- * 1-6 - Active speech
- */
-WebRtc_Word16 WebRtcVad_CalcVad32khz(VadInstT* inst, WebRtc_Word16* speech_frame,
- int frame_length);
-WebRtc_Word16 WebRtcVad_CalcVad16khz(VadInstT* inst, WebRtc_Word16* speech_frame,
- int frame_length);
-WebRtc_Word16 WebRtcVad_CalcVad8khz(VadInstT* inst, WebRtc_Word16* speech_frame,
- int frame_length);
-
-/****************************************************************************
- * WebRtcVad_GmmProbability(...)
- *
- * This function calculates the probabilities for background noise and
- * speech using Gaussian Mixture Models. A hypothesis-test is performed to decide
- * which type of signal is most probable.
- *
- * Input:
- * - inst : Pointer to VAD instance
- * - feature_vector : Feature vector = log10(energy in frequency band)
- * - total_power : Total power in frame.
- * - frame_length : Number of input samples
- *
- * Output:
- * VAD decision : 0 - noise, 1 - speech
- *
- */
-WebRtc_Word16 WebRtcVad_GmmProbability(VadInstT* inst, WebRtc_Word16* feature_vector,
- WebRtc_Word16 total_power, int frame_length);
-
-#endif // WEBRTC_VAD_CORE_H_
diff --git a/src/common_audio/vad/main/source/vad_defines.h b/src/common_audio/vad/main/source/vad_defines.h
deleted file mode 100644
index b33af2e..0000000
--- a/src/common_audio/vad/main/source/vad_defines.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This header file includes the macros used in VAD.
- */
-
-#ifndef WEBRTC_VAD_DEFINES_H_
-#define WEBRTC_VAD_DEFINES_H_
-
-#define NUM_CHANNELS 6 // Eight frequency bands
-#define NUM_MODELS 2 // Number of Gaussian models
-#define NUM_TABLE_VALUES NUM_CHANNELS * NUM_MODELS
-
-#define MIN_ENERGY 10
-#define ALPHA1 6553 // 0.2 in Q15
-#define ALPHA2 32439 // 0.99 in Q15
-#define NSP_MAX 6 // Maximum number of VAD=1 frames in a row counted
-#define MIN_STD 384 // Minimum standard deviation
-// Mode 0, Quality thresholds - Different thresholds for the different frame lengths
-#define INDIVIDUAL_10MS_Q 24
-#define INDIVIDUAL_20MS_Q 21 // (log10(2)*66)<<2 ~=16
-#define INDIVIDUAL_30MS_Q 24
-
-#define TOTAL_10MS_Q 57
-#define TOTAL_20MS_Q 48
-#define TOTAL_30MS_Q 57
-
-#define OHMAX1_10MS_Q 8 // Max Overhang 1
-#define OHMAX2_10MS_Q 14 // Max Overhang 2
-#define OHMAX1_20MS_Q 4 // Max Overhang 1
-#define OHMAX2_20MS_Q 7 // Max Overhang 2
-#define OHMAX1_30MS_Q 3
-#define OHMAX2_30MS_Q 5
-
-// Mode 1, Low bitrate thresholds - Different thresholds for the different frame lengths
-#define INDIVIDUAL_10MS_LBR 37
-#define INDIVIDUAL_20MS_LBR 32
-#define INDIVIDUAL_30MS_LBR 37
-
-#define TOTAL_10MS_LBR 100
-#define TOTAL_20MS_LBR 80
-#define TOTAL_30MS_LBR 100
-
-#define OHMAX1_10MS_LBR 8 // Max Overhang 1
-#define OHMAX2_10MS_LBR 14 // Max Overhang 2
-#define OHMAX1_20MS_LBR 4
-#define OHMAX2_20MS_LBR 7
-
-#define OHMAX1_30MS_LBR 3
-#define OHMAX2_30MS_LBR 5
-
-// Mode 2, Very aggressive thresholds - Different thresholds for the different frame lengths
-#define INDIVIDUAL_10MS_AGG 82
-#define INDIVIDUAL_20MS_AGG 78
-#define INDIVIDUAL_30MS_AGG 82
-
-#define TOTAL_10MS_AGG 285 //580
-#define TOTAL_20MS_AGG 260
-#define TOTAL_30MS_AGG 285
-
-#define OHMAX1_10MS_AGG 6 // Max Overhang 1
-#define OHMAX2_10MS_AGG 9 // Max Overhang 2
-#define OHMAX1_20MS_AGG 3
-#define OHMAX2_20MS_AGG 5
-
-#define OHMAX1_30MS_AGG 2
-#define OHMAX2_30MS_AGG 3
-
-// Mode 3, Super aggressive thresholds - Different thresholds for the different frame lengths
-#define INDIVIDUAL_10MS_VAG 94
-#define INDIVIDUAL_20MS_VAG 94
-#define INDIVIDUAL_30MS_VAG 94
-
-#define TOTAL_10MS_VAG 1100 //1700
-#define TOTAL_20MS_VAG 1050
-#define TOTAL_30MS_VAG 1100
-
-#define OHMAX1_10MS_VAG 6 // Max Overhang 1
-#define OHMAX2_10MS_VAG 9 // Max Overhang 2
-#define OHMAX1_20MS_VAG 3
-#define OHMAX2_20MS_VAG 5
-
-#define OHMAX1_30MS_VAG 2
-#define OHMAX2_30MS_VAG 3
-
-#endif // WEBRTC_VAD_DEFINES_H_
diff --git a/src/common_audio/vad/main/source/vad_filterbank.c b/src/common_audio/vad/main/source/vad_filterbank.c
deleted file mode 100644
index 11392c9..0000000
--- a/src/common_audio/vad/main/source/vad_filterbank.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file includes the implementation of the internal filterbank associated functions.
- * For function description, see vad_filterbank.h.
- */
-
-#include "vad_filterbank.h"
-#include "vad_defines.h"
-#include "vad_const.h"
-#include "signal_processing_library.h"
-
-void WebRtcVad_HpOutput(WebRtc_Word16 *in_vector,
- WebRtc_Word16 in_vector_length,
- WebRtc_Word16 *out_vector,
- WebRtc_Word16 *filter_state)
-{
- WebRtc_Word16 i, *pi, *outPtr;
- WebRtc_Word32 tmpW32;
-
- pi = &in_vector[0];
- outPtr = &out_vector[0];
-
- // The sum of the absolute values of the impulse response:
- // The zero/pole-filter has a max amplification of a single sample of: 1.4546
- // Impulse response: 0.4047 -0.6179 -0.0266 0.1993 0.1035 -0.0194
- // The all-zero section has a max amplification of a single sample of: 1.6189
- // Impulse response: 0.4047 -0.8094 0.4047 0 0 0
- // The all-pole section has a max amplification of a single sample of: 1.9931
- // Impulse response: 1.0000 0.4734 -0.1189 -0.2187 -0.0627 0.04532
-
- for (i = 0; i < in_vector_length; i++)
- {
- // all-zero section (filter coefficients in Q14)
- tmpW32 = (WebRtc_Word32)WEBRTC_SPL_MUL_16_16(kHpZeroCoefs[0], (*pi));
- tmpW32 += (WebRtc_Word32)WEBRTC_SPL_MUL_16_16(kHpZeroCoefs[1], filter_state[0]);
- tmpW32 += (WebRtc_Word32)WEBRTC_SPL_MUL_16_16(kHpZeroCoefs[2], filter_state[1]); // Q14
- filter_state[1] = filter_state[0];
- filter_state[0] = *pi++;
-
- // all-pole section
- tmpW32 -= (WebRtc_Word32)WEBRTC_SPL_MUL_16_16(kHpPoleCoefs[1], filter_state[2]); // Q14
- tmpW32 -= (WebRtc_Word32)WEBRTC_SPL_MUL_16_16(kHpPoleCoefs[2], filter_state[3]);
- filter_state[3] = filter_state[2];
- filter_state[2] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32 (tmpW32, 14);
- *outPtr++ = filter_state[2];
- }
-}
-
-void WebRtcVad_Allpass(WebRtc_Word16 *in_vector,
- WebRtc_Word16 *out_vector,
- WebRtc_Word16 filter_coefficients,
- int vector_length,
- WebRtc_Word16 *filter_state)
-{
- // The filter can only cause overflow (in the w16 output variable)
- // if more than 4 consecutive input numbers are of maximum value and
- // has the the same sign as the impulse responses first taps.
- // First 6 taps of the impulse response: 0.6399 0.5905 -0.3779
- // 0.2418 -0.1547 0.0990
-
- int n;
- WebRtc_Word16 tmp16;
- WebRtc_Word32 tmp32, in32, state32;
-
- state32 = WEBRTC_SPL_LSHIFT_W32(((WebRtc_Word32)(*filter_state)), 16); // Q31
-
- for (n = 0; n < vector_length; n++)
- {
-
- tmp32 = state32 + WEBRTC_SPL_MUL_16_16(filter_coefficients, (*in_vector));
- tmp16 = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32, 16);
- *out_vector++ = tmp16;
- in32 = WEBRTC_SPL_LSHIFT_W32(((WebRtc_Word32)(*in_vector)), 14);
- state32 = in32 - WEBRTC_SPL_MUL_16_16(filter_coefficients, tmp16);
- state32 = WEBRTC_SPL_LSHIFT_W32(state32, 1);
- in_vector += 2;
- }
-
- *filter_state = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(state32, 16);
-}
-
-void WebRtcVad_SplitFilter(WebRtc_Word16 *in_vector,
- WebRtc_Word16 *out_vector_hp,
- WebRtc_Word16 *out_vector_lp,
- WebRtc_Word16 *upper_state,
- WebRtc_Word16 *lower_state,
- int in_vector_length)
-{
- WebRtc_Word16 tmpOut;
- int k, halflen;
-
- // Downsampling by 2 and get two branches
- halflen = WEBRTC_SPL_RSHIFT_W16(in_vector_length, 1);
-
- // All-pass filtering upper branch
- WebRtcVad_Allpass(&in_vector[0], out_vector_hp, kAllPassCoefsQ15[0], halflen, upper_state);
-
- // All-pass filtering lower branch
- WebRtcVad_Allpass(&in_vector[1], out_vector_lp, kAllPassCoefsQ15[1], halflen, lower_state);
-
- // Make LP and HP signals
- for (k = 0; k < halflen; k++)
- {
- tmpOut = *out_vector_hp;
- *out_vector_hp++ -= *out_vector_lp;
- *out_vector_lp++ += tmpOut;
- }
-}
-
-WebRtc_Word16 WebRtcVad_get_features(VadInstT *inst,
- WebRtc_Word16 *in_vector,
- int frame_size,
- WebRtc_Word16 *out_vector)
-{
- int curlen, filtno;
- WebRtc_Word16 vecHP1[120], vecLP1[120];
- WebRtc_Word16 vecHP2[60], vecLP2[60];
- WebRtc_Word16 *ptin;
- WebRtc_Word16 *hptout, *lptout;
- WebRtc_Word16 power = 0;
-
- // Split at 2000 Hz and downsample
- filtno = 0;
- ptin = in_vector;
- hptout = vecHP1;
- lptout = vecLP1;
- curlen = frame_size;
- WebRtcVad_SplitFilter(ptin, hptout, lptout, &inst->upper_state[filtno],
- &inst->lower_state[filtno], curlen);
-
- // Split at 3000 Hz and downsample
- filtno = 1;
- ptin = vecHP1;
- hptout = vecHP2;
- lptout = vecLP2;
- curlen = WEBRTC_SPL_RSHIFT_W16(frame_size, 1);
-
- WebRtcVad_SplitFilter(ptin, hptout, lptout, &inst->upper_state[filtno],
- &inst->lower_state[filtno], curlen);
-
- // Energy in 3000 Hz - 4000 Hz
- curlen = WEBRTC_SPL_RSHIFT_W16(curlen, 1);
- WebRtcVad_LogOfEnergy(vecHP2, &out_vector[5], &power, kOffsetVector[5], curlen);
-
- // Energy in 2000 Hz - 3000 Hz
- WebRtcVad_LogOfEnergy(vecLP2, &out_vector[4], &power, kOffsetVector[4], curlen);
-
- // Split at 1000 Hz and downsample
- filtno = 2;
- ptin = vecLP1;
- hptout = vecHP2;
- lptout = vecLP2;
- curlen = WEBRTC_SPL_RSHIFT_W16(frame_size, 1);
- WebRtcVad_SplitFilter(ptin, hptout, lptout, &inst->upper_state[filtno],
- &inst->lower_state[filtno], curlen);
-
- // Energy in 1000 Hz - 2000 Hz
- curlen = WEBRTC_SPL_RSHIFT_W16(curlen, 1);
- WebRtcVad_LogOfEnergy(vecHP2, &out_vector[3], &power, kOffsetVector[3], curlen);
-
- // Split at 500 Hz
- filtno = 3;
- ptin = vecLP2;
- hptout = vecHP1;
- lptout = vecLP1;
-
- WebRtcVad_SplitFilter(ptin, hptout, lptout, &inst->upper_state[filtno],
- &inst->lower_state[filtno], curlen);
-
- // Energy in 500 Hz - 1000 Hz
- curlen = WEBRTC_SPL_RSHIFT_W16(curlen, 1);
- WebRtcVad_LogOfEnergy(vecHP1, &out_vector[2], &power, kOffsetVector[2], curlen);
- // Split at 250 Hz
- filtno = 4;
- ptin = vecLP1;
- hptout = vecHP2;
- lptout = vecLP2;
-
- WebRtcVad_SplitFilter(ptin, hptout, lptout, &inst->upper_state[filtno],
- &inst->lower_state[filtno], curlen);
-
- // Energy in 250 Hz - 500 Hz
- curlen = WEBRTC_SPL_RSHIFT_W16(curlen, 1);
- WebRtcVad_LogOfEnergy(vecHP2, &out_vector[1], &power, kOffsetVector[1], curlen);
-
- // Remove DC and LFs
- WebRtcVad_HpOutput(vecLP2, curlen, vecHP1, inst->hp_filter_state);
-
- // Power in 80 Hz - 250 Hz
- WebRtcVad_LogOfEnergy(vecHP1, &out_vector[0], &power, kOffsetVector[0], curlen);
-
- return power;
-}
-
-void WebRtcVad_LogOfEnergy(WebRtc_Word16 *vector,
- WebRtc_Word16 *enerlogval,
- WebRtc_Word16 *power,
- WebRtc_Word16 offset,
- int vector_length)
-{
- WebRtc_Word16 enerSum = 0;
- WebRtc_Word16 zeros, frac, log2;
- WebRtc_Word32 energy;
-
- int shfts = 0, shfts2;
-
- energy = WebRtcSpl_Energy(vector, vector_length, &shfts);
-
- if (energy > 0)
- {
-
- shfts2 = 16 - WebRtcSpl_NormW32(energy);
- shfts += shfts2;
- // "shfts" is the total number of right shifts that has been done to enerSum.
- enerSum = (WebRtc_Word16)WEBRTC_SPL_SHIFT_W32(energy, -shfts2);
-
- // Find:
- // 160*log10(enerSum*2^shfts) = 160*log10(2)*log2(enerSum*2^shfts) =
- // 160*log10(2)*(log2(enerSum) + log2(2^shfts)) =
- // 160*log10(2)*(log2(enerSum) + shfts)
-
- zeros = WebRtcSpl_NormU32(enerSum);
- frac = (WebRtc_Word16)(((WebRtc_UWord32)((WebRtc_Word32)(enerSum) << zeros)
- & 0x7FFFFFFF) >> 21);
- log2 = (WebRtc_Word16)(((31 - zeros) << 10) + frac);
-
- *enerlogval = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(kLogConst, log2, 19)
- + (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(shfts, kLogConst, 9);
-
- if (*enerlogval < 0)
- {
- *enerlogval = 0;
- }
- } else
- {
- *enerlogval = 0;
- shfts = -15;
- enerSum = 0;
- }
-
- *enerlogval += offset;
-
- // Total power in frame
- if (*power <= MIN_ENERGY)
- {
- if (shfts > 0)
- {
- *power += MIN_ENERGY + 1;
- } else if (WEBRTC_SPL_SHIFT_W16(enerSum, shfts) > MIN_ENERGY)
- {
- *power += MIN_ENERGY + 1;
- } else
- {
- *power += WEBRTC_SPL_SHIFT_W16(enerSum, shfts);
- }
- }
-}
diff --git a/src/common_audio/vad/main/source/vad_filterbank.h b/src/common_audio/vad/main/source/vad_filterbank.h
deleted file mode 100644
index a5507ea..0000000
--- a/src/common_audio/vad/main/source/vad_filterbank.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This header file includes the description of the internal VAD call
- * WebRtcVad_GaussianProbability.
- */
-
-#ifndef WEBRTC_VAD_FILTERBANK_H_
-#define WEBRTC_VAD_FILTERBANK_H_
-
-#include "vad_core.h"
-
-/****************************************************************************
- * WebRtcVad_HpOutput(...)
- *
- * This function removes DC from the lowest frequency band
- *
- * Input:
- * - in_vector : Samples in the frequency interval 0 - 250 Hz
- * - in_vector_length : Length of input and output vector
- * - filter_state : Current state of the filter
- *
- * Output:
- * - out_vector : Samples in the frequency interval 80 - 250 Hz
- * - filter_state : Updated state of the filter
- *
- */
-void WebRtcVad_HpOutput(WebRtc_Word16* in_vector,
- WebRtc_Word16 in_vector_length,
- WebRtc_Word16* out_vector,
- WebRtc_Word16* filter_state);
-
-/****************************************************************************
- * WebRtcVad_Allpass(...)
- *
- * This function is used when before splitting a speech file into
- * different frequency bands
- *
- * Note! Do NOT let the arrays in_vector and out_vector correspond to the same address.
- *
- * Input:
- * - in_vector : (Q0)
- * - filter_coefficients : (Q15)
- * - vector_length : Length of input and output vector
- * - filter_state : Current state of the filter (Q(-1))
- *
- * Output:
- * - out_vector : Output speech signal (Q(-1))
- * - filter_state : Updated state of the filter (Q(-1))
- *
- */
-void WebRtcVad_Allpass(WebRtc_Word16* in_vector,
- WebRtc_Word16* outw16,
- WebRtc_Word16 filter_coefficients,
- int vector_length,
- WebRtc_Word16* filter_state);
-
-/****************************************************************************
- * WebRtcVad_SplitFilter(...)
- *
- * This function is used when before splitting a speech file into
- * different frequency bands
- *
- * Input:
- * - in_vector : Input signal to be split into two frequency bands.
- * - upper_state : Current state of the upper filter
- * - lower_state : Current state of the lower filter
- * - in_vector_length : Length of input vector
- *
- * Output:
- * - out_vector_hp : Upper half of the spectrum
- * - out_vector_lp : Lower half of the spectrum
- * - upper_state : Updated state of the upper filter
- * - lower_state : Updated state of the lower filter
- *
- */
-void WebRtcVad_SplitFilter(WebRtc_Word16* in_vector,
- WebRtc_Word16* out_vector_hp,
- WebRtc_Word16* out_vector_lp,
- WebRtc_Word16* upper_state,
- WebRtc_Word16* lower_state,
- int in_vector_length);
-
-/****************************************************************************
- * WebRtcVad_get_features(...)
- *
- * This function is used to get the logarithm of the power of each of the
- * 6 frequency bands used by the VAD:
- * 80 Hz - 250 Hz
- * 250 Hz - 500 Hz
- * 500 Hz - 1000 Hz
- * 1000 Hz - 2000 Hz
- * 2000 Hz - 3000 Hz
- * 3000 Hz - 4000 Hz
- *
- * Input:
- * - inst : Pointer to VAD instance
- * - in_vector : Input speech signal
- * - frame_size : Frame size, in number of samples
- *
- * Output:
- * - out_vector : 10*log10(power in each freq. band), Q4
- *
- * Return: total power in the signal (NOTE! This value is not exact since it
- * is only used in a comparison.
- */
-WebRtc_Word16 WebRtcVad_get_features(VadInstT* inst,
- WebRtc_Word16* in_vector,
- int frame_size,
- WebRtc_Word16* out_vector);
-
-/****************************************************************************
- * WebRtcVad_LogOfEnergy(...)
- *
- * This function is used to get the logarithm of the power of one frequency band.
- *
- * Input:
- * - vector : Input speech samples for one frequency band
- * - offset : Offset value for the current frequency band
- * - vector_length : Length of input vector
- *
- * Output:
- * - enerlogval : 10*log10(energy);
- * - power : Update total power in speech frame. NOTE! This value
- * is not exact since it is only used in a comparison.
- *
- */
-void WebRtcVad_LogOfEnergy(WebRtc_Word16* vector,
- WebRtc_Word16* enerlogval,
- WebRtc_Word16* power,
- WebRtc_Word16 offset,
- int vector_length);
-
-#endif // WEBRTC_VAD_FILTERBANK_H_
diff --git a/src/common_audio/vad/main/source/vad_gmm.c b/src/common_audio/vad/main/source/vad_gmm.c
deleted file mode 100644
index 23d12fb..0000000
--- a/src/common_audio/vad/main/source/vad_gmm.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file includes the implementation of the internal VAD call
- * WebRtcVad_GaussianProbability. For function description, see vad_gmm.h.
- */
-
-#include "vad_gmm.h"
-#include "signal_processing_library.h"
-#include "vad_const.h"
-
-WebRtc_Word32 WebRtcVad_GaussianProbability(WebRtc_Word16 in_sample,
- WebRtc_Word16 mean,
- WebRtc_Word16 std,
- WebRtc_Word16 *delta)
-{
- WebRtc_Word16 tmp16, tmpDiv, tmpDiv2, expVal, tmp16_1, tmp16_2;
- WebRtc_Word32 tmp32, y32;
-
- // Calculate tmpDiv=1/std, in Q10
- tmp32 = (WebRtc_Word32)WEBRTC_SPL_RSHIFT_W16(std,1) + (WebRtc_Word32)131072; // 1 in Q17
- tmpDiv = (WebRtc_Word16)WebRtcSpl_DivW32W16(tmp32, std); // Q17/Q7 = Q10
-
- // Calculate tmpDiv2=1/std^2, in Q14
- tmp16 = WEBRTC_SPL_RSHIFT_W16(tmpDiv, 2); // From Q10 to Q8
- tmpDiv2 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(tmp16, tmp16, 2); // (Q8 * Q8)>>2 = Q14
-
- tmp16 = WEBRTC_SPL_LSHIFT_W16(in_sample, 3); // Q7
- tmp16 = tmp16 - mean; // Q7 - Q7 = Q7
-
- // To be used later, when updating noise/speech model
- // delta = (x-m)/std^2, in Q11
- *delta = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(tmpDiv2, tmp16, 10); //(Q14*Q7)>>10 = Q11
-
- // Calculate tmp32=(x-m)^2/(2*std^2), in Q10
- tmp32 = (WebRtc_Word32)WEBRTC_SPL_MUL_16_16_RSFT(*delta, tmp16, 9); // One shift for /2
-
- // Calculate expVal ~= exp(-(x-m)^2/(2*std^2)) ~= exp2(-log2(exp(1))*tmp32)
- if (tmp32 < kCompVar)
- {
- // Calculate tmp16 = log2(exp(1))*tmp32 , in Q10
- tmp16 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT((WebRtc_Word16)tmp32,
- kLog10Const, 12);
- tmp16 = -tmp16;
- tmp16_2 = (WebRtc_Word16)(0x0400 | (tmp16 & 0x03FF));
- tmp16_1 = (WebRtc_Word16)(tmp16 ^ 0xFFFF);
- tmp16 = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W16(tmp16_1, 10);
- tmp16 += 1;
- // Calculate expVal=log2(-tmp32), in Q10
- expVal = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((WebRtc_Word32)tmp16_2, tmp16);
-
- } else
- {
- expVal = 0;
- }
-
- // Calculate y32=(1/std)*exp(-(x-m)^2/(2*std^2)), in Q20
- y32 = WEBRTC_SPL_MUL_16_16(tmpDiv, expVal); // Q10 * Q10 = Q20
-
- return y32; // Q20
-}
diff --git a/src/common_audio/vad/main/source/vad_gmm.h b/src/common_audio/vad/main/source/vad_gmm.h
deleted file mode 100644
index e0747fb..0000000
--- a/src/common_audio/vad/main/source/vad_gmm.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This header file includes the description of the internal VAD call
- * WebRtcVad_GaussianProbability.
- */
-
-#ifndef WEBRTC_VAD_GMM_H_
-#define WEBRTC_VAD_GMM_H_
-
-#include "typedefs.h"
-
-/****************************************************************************
- * WebRtcVad_GaussianProbability(...)
- *
- * This function calculates the probability for the value 'in_sample', given that in_sample
- * comes from a normal distribution with mean 'mean' and standard deviation 'std'.
- *
- * Input:
- * - in_sample : Input sample in Q4
- * - mean : mean value in the statistical model, Q7
- * - std : standard deviation, Q7
- *
- * Output:
- *
- * - delta : Value used when updating the model, Q11
- *
- * Return:
- * - out : out = 1/std * exp(-(x-m)^2/(2*std^2));
- * Probability for x.
- *
- */
-WebRtc_Word32 WebRtcVad_GaussianProbability(WebRtc_Word16 in_sample,
- WebRtc_Word16 mean,
- WebRtc_Word16 std,
- WebRtc_Word16 *delta);
-
-#endif // WEBRTC_VAD_GMM_H_
diff --git a/src/common_audio/vad/main/source/vad_sp.c b/src/common_audio/vad/main/source/vad_sp.c
deleted file mode 100644
index f347ab5..0000000
--- a/src/common_audio/vad/main/source/vad_sp.c
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file includes the implementation of the VAD internal calls for Downsampling and
- * FindMinimum.
- * For function call descriptions; See vad_sp.h.
- */
-
-#include "vad_sp.h"
-#include "vad_defines.h"
-#include "vad_const.h"
-#include "signal_processing_library.h"
-
-// Downsampling filter based on the splitting filter and the allpass functions
-// in vad_filterbank.c
-void WebRtcVad_Downsampling(WebRtc_Word16* signal_in,
- WebRtc_Word16* signal_out,
- WebRtc_Word32* filter_state,
- int inlen)
-{
- WebRtc_Word16 tmp16_1, tmp16_2;
- WebRtc_Word32 tmp32_1, tmp32_2;
- int n, halflen;
-
- // Downsampling by 2 and get two branches
- halflen = WEBRTC_SPL_RSHIFT_W16(inlen, 1);
-
- tmp32_1 = filter_state[0];
- tmp32_2 = filter_state[1];
-
- // Filter coefficients in Q13, filter state in Q0
- for (n = 0; n < halflen; n++)
- {
- // All-pass filtering upper branch
- tmp16_1 = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32_1, 1)
- + (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT((kAllPassCoefsQ13[0]),
- *signal_in, 14);
- *signal_out = tmp16_1;
- tmp32_1 = (WebRtc_Word32)(*signal_in++)
- - (WebRtc_Word32)WEBRTC_SPL_MUL_16_16_RSFT((kAllPassCoefsQ13[0]), tmp16_1, 12);
-
- // All-pass filtering lower branch
- tmp16_2 = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32_2, 1)
- + (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT((kAllPassCoefsQ13[1]),
- *signal_in, 14);
- *signal_out++ += tmp16_2;
- tmp32_2 = (WebRtc_Word32)(*signal_in++)
- - (WebRtc_Word32)WEBRTC_SPL_MUL_16_16_RSFT((kAllPassCoefsQ13[1]), tmp16_2, 12);
- }
- filter_state[0] = tmp32_1;
- filter_state[1] = tmp32_2;
-}
-
-WebRtc_Word16 WebRtcVad_FindMinimum(VadInstT* inst,
- WebRtc_Word16 x,
- int n)
-{
- int i, j, k, II = -1, offset;
- WebRtc_Word16 meanV, alpha;
- WebRtc_Word32 tmp32, tmp32_1;
- WebRtc_Word16 *valptr, *idxptr, *p1, *p2, *p3;
-
- // Offset to beginning of the 16 minimum values in memory
- offset = WEBRTC_SPL_LSHIFT_W16(n, 4);
-
- // Pointer to memory for the 16 minimum values and the age of each value
- idxptr = &inst->index_vector[offset];
- valptr = &inst->low_value_vector[offset];
-
- // Each value in low_value_vector is getting 1 loop older.
- // Update age of each value in indexVal, and remove old values.
- for (i = 0; i < 16; i++)
- {
- p3 = idxptr + i;
- if (*p3 != 100)
- {
- *p3 += 1;
- } else
- {
- p1 = valptr + i + 1;
- p2 = p3 + 1;
- for (j = i; j < 16; j++)
- {
- *(valptr + j) = *p1++;
- *(idxptr + j) = *p2++;
- }
- *(idxptr + 15) = 101;
- *(valptr + 15) = 10000;
- }
- }
-
- // Check if x smaller than any of the values in low_value_vector.
- // If so, find position.
- if (x < *(valptr + 7))
- {
- if (x < *(valptr + 3))
- {
- if (x < *(valptr + 1))
- {
- if (x < *valptr)
- {
- II = 0;
- } else
- {
- II = 1;
- }
- } else if (x < *(valptr + 2))
- {
- II = 2;
- } else
- {
- II = 3;
- }
- } else if (x < *(valptr + 5))
- {
- if (x < *(valptr + 4))
- {
- II = 4;
- } else
- {
- II = 5;
- }
- } else if (x < *(valptr + 6))
- {
- II = 6;
- } else
- {
- II = 7;
- }
- } else if (x < *(valptr + 15))
- {
- if (x < *(valptr + 11))
- {
- if (x < *(valptr + 9))
- {
- if (x < *(valptr + 8))
- {
- II = 8;
- } else
- {
- II = 9;
- }
- } else if (x < *(valptr + 10))
- {
- II = 10;
- } else
- {
- II = 11;
- }
- } else if (x < *(valptr + 13))
- {
- if (x < *(valptr + 12))
- {
- II = 12;
- } else
- {
- II = 13;
- }
- } else if (x < *(valptr + 14))
- {
- II = 14;
- } else
- {
- II = 15;
- }
- }
-
- // Put new min value on right position and shift bigger values up
- if (II > -1)
- {
- for (i = 15; i > II; i--)
- {
- k = i - 1;
- *(valptr + i) = *(valptr + k);
- *(idxptr + i) = *(idxptr + k);
- }
- *(valptr + II) = x;
- *(idxptr + II) = 1;
- }
-
- meanV = 0;
- if ((inst->frame_counter) > 4)
- {
- j = 5;
- } else
- {
- j = inst->frame_counter;
- }
-
- if (j > 2)
- {
- meanV = *(valptr + 2);
- } else if (j > 0)
- {
- meanV = *valptr;
- } else
- {
- meanV = 1600;
- }
-
- if (inst->frame_counter > 0)
- {
- if (meanV < inst->mean_value[n])
- {
- alpha = (WebRtc_Word16)ALPHA1; // 0.2 in Q15
- } else
- {
- alpha = (WebRtc_Word16)ALPHA2; // 0.99 in Q15
- }
- } else
- {
- alpha = 0;
- }
-
- tmp32 = WEBRTC_SPL_MUL_16_16((alpha+1), inst->mean_value[n]);
- tmp32_1 = WEBRTC_SPL_MUL_16_16(WEBRTC_SPL_WORD16_MAX - alpha, meanV);
- tmp32 += tmp32_1;
- tmp32 += 16384;
- inst->mean_value[n] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32, 15);
-
- return inst->mean_value[n];
-}
diff --git a/src/common_audio/vad/main/source/vad_sp.h b/src/common_audio/vad/main/source/vad_sp.h
deleted file mode 100644
index ae15c11..0000000
--- a/src/common_audio/vad/main/source/vad_sp.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This header file includes the VAD internal calls for Downsampling and FindMinimum.
- * Specific function calls are given below.
- */
-
-#ifndef WEBRTC_VAD_SP_H_
-#define WEBRTC_VAD_SP_H_
-
-#include "vad_core.h"
-
-/****************************************************************************
- * WebRtcVad_Downsampling(...)
- *
- * Downsamples the signal a factor 2, eg. 32->16 or 16->8
- *
- * Input:
- * - signal_in : Input signal
- * - in_length : Length of input signal in samples
- *
- * Input & Output:
- * - filter_state : Filter state for first all-pass filters
- *
- * Output:
- * - signal_out : Downsampled signal (of length len/2)
- */
-void WebRtcVad_Downsampling(WebRtc_Word16* signal_in,
- WebRtc_Word16* signal_out,
- WebRtc_Word32* filter_state,
- int in_length);
-
-/****************************************************************************
- * WebRtcVad_FindMinimum(...)
- *
- * Find the five lowest values of x in 100 frames long window. Return a mean
- * value of these five values.
- *
- * Input:
- * - feature_value : Feature value
- * - channel : Channel number
- *
- * Input & Output:
- * - inst : State information
- *
- * Output:
- * return value : Weighted minimum value for a moving window.
- */
-WebRtc_Word16 WebRtcVad_FindMinimum(VadInstT* inst, WebRtc_Word16 feature_value, int channel);
-
-#endif // WEBRTC_VAD_SP_H_
diff --git a/src/common_audio/vad/main/source/webrtc_vad.c b/src/common_audio/vad/main/source/webrtc_vad.c
deleted file mode 100644
index dcfbda1..0000000
--- a/src/common_audio/vad/main/source/webrtc_vad.c
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file includes the VAD API calls. For a specific function call description,
- * see webrtc_vad.h
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "webrtc_vad.h"
-#include "vad_core.h"
-
-static const int kInitCheck = 42;
-
-WebRtc_Word16 WebRtcVad_get_version(char *version, size_t size_bytes)
-{
- const char my_version[] = "VAD 1.2.0";
-
- if (version == NULL)
- {
- return -1;
- }
-
- if (size_bytes < sizeof(my_version))
- {
- return -1;
- }
-
- memcpy(version, my_version, sizeof(my_version));
- return 0;
-}
-
-WebRtc_Word16 WebRtcVad_AssignSize(int *size_in_bytes)
-{
- *size_in_bytes = sizeof(VadInstT) * 2 / sizeof(WebRtc_Word16);
- return 0;
-}
-
-WebRtc_Word16 WebRtcVad_Assign(VadInst **vad_inst, void *vad_inst_addr)
-{
-
- if (vad_inst == NULL)
- {
- return -1;
- }
-
- if (vad_inst_addr != NULL)
- {
- *vad_inst = (VadInst*)vad_inst_addr;
- return 0;
- } else
- {
- return -1;
- }
-}
-
-WebRtc_Word16 WebRtcVad_Create(VadInst **vad_inst)
-{
-
- VadInstT *vad_ptr = NULL;
-
- if (vad_inst == NULL)
- {
- return -1;
- }
-
- *vad_inst = NULL;
-
- vad_ptr = (VadInstT *)malloc(sizeof(VadInstT));
- *vad_inst = (VadInst *)vad_ptr;
-
- if (vad_ptr == NULL)
- {
- return -1;
- }
-
- vad_ptr->init_flag = 0;
-
- return 0;
-}
-
-WebRtc_Word16 WebRtcVad_Free(VadInst *vad_inst)
-{
-
- if (vad_inst == NULL)
- {
- return -1;
- }
-
- free(vad_inst);
- return 0;
-}
-
-WebRtc_Word16 WebRtcVad_Init(VadInst *vad_inst)
-{
- short mode = 0; // Default high quality
-
- if (vad_inst == NULL)
- {
- return -1;
- }
-
- return WebRtcVad_InitCore((VadInstT*)vad_inst, mode);
-}
-
-WebRtc_Word16 WebRtcVad_set_mode(VadInst *vad_inst, WebRtc_Word16 mode)
-{
- VadInstT* vad_ptr;
-
- if (vad_inst == NULL)
- {
- return -1;
- }
-
- vad_ptr = (VadInstT*)vad_inst;
- if (vad_ptr->init_flag != kInitCheck)
- {
- return -1;
- }
-
- return WebRtcVad_set_mode_core((VadInstT*)vad_inst, mode);
-}
-
-WebRtc_Word16 WebRtcVad_Process(VadInst *vad_inst,
- WebRtc_Word16 fs,
- WebRtc_Word16 *speech_frame,
- WebRtc_Word16 frame_length)
-{
- WebRtc_Word16 vad;
- VadInstT* vad_ptr;
-
- if (vad_inst == NULL)
- {
- return -1;
- }
-
- vad_ptr = (VadInstT*)vad_inst;
- if (vad_ptr->init_flag != kInitCheck)
- {
- return -1;
- }
-
- if (speech_frame == NULL)
- {
- return -1;
- }
-
- if (fs == 32000)
- {
- if ((frame_length != 320) && (frame_length != 640) && (frame_length != 960))
- {
- return -1;
- }
- vad = WebRtcVad_CalcVad32khz((VadInstT*)vad_inst, speech_frame, frame_length);
-
- } else if (fs == 16000)
- {
- if ((frame_length != 160) && (frame_length != 320) && (frame_length != 480))
- {
- return -1;
- }
- vad = WebRtcVad_CalcVad16khz((VadInstT*)vad_inst, speech_frame, frame_length);
-
- } else if (fs == 8000)
- {
- if ((frame_length != 80) && (frame_length != 160) && (frame_length != 240))
- {
- return -1;
- }
- vad = WebRtcVad_CalcVad8khz((VadInstT*)vad_inst, speech_frame, frame_length);
-
- } else
- {
- return -1; // Not a supported sampling frequency
- }
-
- if (vad > 0)
- {
- return 1;
- } else if (vad == 0)
- {
- return 0;
- } else
- {
- return -1;
- }
-}
diff --git a/src/common_audio/vad/main/test/unit_test/unit_test.cc b/src/common_audio/vad/main/test/unit_test/unit_test.cc
deleted file mode 100644
index 8ac793e..0000000
--- a/src/common_audio/vad/main/test/unit_test/unit_test.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This file includes the implementation of the VAD unit tests.
- */
-
-#include <cstring>
-#include "unit_test.h"
-#include "webrtc_vad.h"
-
-
-class VadEnvironment : public ::testing::Environment {
- public:
- virtual void SetUp() {
- }
-
- virtual void TearDown() {
- }
-};
-
-VadTest::VadTest()
-{
-}
-
-void VadTest::SetUp() {
-}
-
-void VadTest::TearDown() {
-}
-
-TEST_F(VadTest, ApiTest) {
- VadInst *vad_inst;
- int i, j, k;
- short zeros[960];
- short speech[960];
- char version[32];
-
- // Valid test cases
- int fs[3] = {8000, 16000, 32000};
- int nMode[4] = {0, 1, 2, 3};
- int framelen[3][3] = {{80, 160, 240},
- {160, 320, 480}, {320, 640, 960}} ;
- int vad_counter = 0;
-
- memset(zeros, 0, sizeof(short) * 960);
- memset(speech, 1, sizeof(short) * 960);
- speech[13] = 1374;
- speech[73] = -3747;
-
-
-
- // WebRtcVad_get_version()
- WebRtcVad_get_version(version);
- //printf("API Test for %s\n", version);
-
- // Null instance tests
- EXPECT_EQ(-1, WebRtcVad_Create(NULL));
- EXPECT_EQ(-1, WebRtcVad_Init(NULL));
- EXPECT_EQ(-1, WebRtcVad_Assign(NULL, NULL));
- EXPECT_EQ(-1, WebRtcVad_Free(NULL));
- EXPECT_EQ(-1, WebRtcVad_set_mode(NULL, nMode[0]));
- EXPECT_EQ(-1, WebRtcVad_Process(NULL, fs[0], speech, framelen[0][0]));
-
-
- EXPECT_EQ(WebRtcVad_Create(&vad_inst), 0);
-
- // Not initialized tests
- EXPECT_EQ(-1, WebRtcVad_Process(vad_inst, fs[0], speech, framelen[0][0]));
- EXPECT_EQ(-1, WebRtcVad_set_mode(vad_inst, nMode[0]));
-
- // WebRtcVad_Init() tests
- EXPECT_EQ(WebRtcVad_Init(vad_inst), 0);
-
- // WebRtcVad_set_mode() tests
- EXPECT_EQ(-1, WebRtcVad_set_mode(vad_inst, -1));
- EXPECT_EQ(-1, WebRtcVad_set_mode(vad_inst, 4));
-
- for (i = 0; i < sizeof(nMode)/sizeof(nMode[0]); i++) {
- EXPECT_EQ(WebRtcVad_set_mode(vad_inst, nMode[i]), 0);
- }
-
- // WebRtcVad_Process() tests
- EXPECT_EQ(-1, WebRtcVad_Process(vad_inst, fs[0], NULL, framelen[0][0]));
- EXPECT_EQ(-1, WebRtcVad_Process(vad_inst, 12000, speech, framelen[0][0]));
- EXPECT_EQ(-1, WebRtcVad_Process(vad_inst, fs[0], speech, framelen[1][1]));
- EXPECT_EQ(WebRtcVad_Process(vad_inst, fs[0], zeros, framelen[0][0]), 0);
- for (i = 0; i < sizeof(fs)/sizeof(fs[0]); i++) {
- for (j = 0; j < sizeof(framelen[0])/sizeof(framelen[0][0]); j++) {
- for (k = 0; k < sizeof(nMode)/sizeof(nMode[0]); k++) {
- EXPECT_EQ(WebRtcVad_set_mode(vad_inst, nMode[k]), 0);
-// printf("%d\n", WebRtcVad_Process(vad_inst, fs[i], speech, framelen[i][j]));
- if (vad_counter < 9)
- {
- EXPECT_EQ(WebRtcVad_Process(vad_inst, fs[i], speech, framelen[i][j]), 1);
- } else
- {
- EXPECT_EQ(WebRtcVad_Process(vad_inst, fs[i], speech, framelen[i][j]), 0);
- }
- vad_counter++;
- }
- }
- }
-
- EXPECT_EQ(0, WebRtcVad_Free(vad_inst));
-
-}
-
-int main(int argc, char** argv) {
- ::testing::InitGoogleTest(&argc, argv);
- VadEnvironment* env = new VadEnvironment;
- ::testing::AddGlobalTestEnvironment(env);
-
- return RUN_ALL_TESTS();
-}
diff --git a/src/common_audio/vad/main/test/unit_test/unit_test.h b/src/common_audio/vad/main/test/unit_test/unit_test.h
deleted file mode 100644
index 62dac11..0000000
--- a/src/common_audio/vad/main/test/unit_test/unit_test.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/*
- * This header file includes the declaration of the VAD unit test.
- */
-
-#ifndef WEBRTC_VAD_UNIT_TEST_H_
-#define WEBRTC_VAD_UNIT_TEST_H_
-
-#include <gtest/gtest.h>
-
-class VadTest : public ::testing::Test {
- protected:
- VadTest();
- virtual void SetUp();
- virtual void TearDown();
-};
-
-#endif // WEBRTC_VAD_UNIT_TEST_H_
diff --git a/src/common_types.h b/src/common_types.h
deleted file mode 100644
index 8b0b8a5..0000000
--- a/src/common_types.h
+++ /dev/null
@@ -1,595 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_COMMON_TYPES_H
-#define WEBRTC_COMMON_TYPES_H
-
-#include "typedefs.h"
-
-#ifdef WEBRTC_EXPORT
- #define WEBRTC_DLLEXPORT _declspec(dllexport)
-#elif WEBRTC_DLL
- #define WEBRTC_DLLEXPORT _declspec(dllimport)
-#else
- #define WEBRTC_DLLEXPORT
-#endif
-
-#ifndef NULL
- #define NULL 0
-#endif
-
-namespace webrtc {
-
-class InStream
-{
-public:
- virtual int Read(void *buf,int len) = 0;
- virtual int Rewind() {return -1;}
- virtual ~InStream() {}
-protected:
- InStream() {}
-};
-
-class OutStream
-{
-public:
- virtual bool Write(const void *buf,int len) = 0;
- virtual int Rewind() {return -1;}
- virtual ~OutStream() {}
-protected:
- OutStream() {}
-};
-
-enum TraceModule
-{
- // not a module, triggered from the engine code
- kTraceVoice = 0x0001,
- // not a module, triggered from the engine code
- kTraceVideo = 0x0002,
- // not a module, triggered from the utility code
- kTraceUtility = 0x0003,
- kTraceRtpRtcp = 0x0004,
- kTraceTransport = 0x0005,
- kTraceSrtp = 0x0006,
- kTraceAudioCoding = 0x0007,
- kTraceAudioMixerServer = 0x0008,
- kTraceAudioMixerClient = 0x0009,
- kTraceFile = 0x000a,
- kTraceAudioProcessing = 0x000b,
- kTraceVideoCoding = 0x0010,
- kTraceVideoMixer = 0x0011,
- kTraceAudioDevice = 0x0012,
- kTraceVideoRenderer = 0x0014,
- kTraceVideoCapture = 0x0015,
- kTraceVideoPreocessing = 0x0016
-};
-
-enum TraceLevel
-{
- kTraceNone = 0x0000, // no trace
- kTraceStateInfo = 0x0001,
- kTraceWarning = 0x0002,
- kTraceError = 0x0004,
- kTraceCritical = 0x0008,
- kTraceApiCall = 0x0010,
- kTraceDefault = 0x00ff,
-
- kTraceModuleCall = 0x0020,
- kTraceMemory = 0x0100, // memory info
- kTraceTimer = 0x0200, // timing info
- kTraceStream = 0x0400, // "continuous" stream of data
-
- // used for debug purposes
- kTraceDebug = 0x0800, // debug
- kTraceInfo = 0x1000, // debug info
-
- kTraceAll = 0xffff
-};
-
-// External Trace API
-class TraceCallback
-{
-public:
- virtual void Print(const TraceLevel level,
- const char *traceString,
- const int length) = 0;
-protected:
- virtual ~TraceCallback() {}
- TraceCallback() {}
-};
-
-
-enum FileFormats
-{
- kFileFormatWavFile = 1,
- kFileFormatCompressedFile = 2,
- kFileFormatAviFile = 3,
- kFileFormatPreencodedFile = 4,
- kFileFormatPcm16kHzFile = 7,
- kFileFormatPcm8kHzFile = 8,
- kFileFormatPcm32kHzFile = 9
-};
-
-
-enum ProcessingTypes
-{
- kPlaybackPerChannel = 0,
- kPlaybackAllChannelsMixed,
- kRecordingPerChannel,
- kRecordingAllChannelsMixed
-};
-
-// Encryption enums
-enum CipherTypes
-{
- kCipherNull = 0,
- kCipherAes128CounterMode = 1
-};
-
-enum AuthenticationTypes
-{
- kAuthNull = 0,
- kAuthHmacSha1 = 3
-};
-
-enum SecurityLevels
-{
- kNoProtection = 0,
- kEncryption = 1,
- kAuthentication = 2,
- kEncryptionAndAuthentication = 3
-};
-
-class Encryption
-{
-public:
- virtual void encrypt(
- int channel_no,
- unsigned char* in_data,
- unsigned char* out_data,
- int bytes_in,
- int* bytes_out) = 0;
-
- virtual void decrypt(
- int channel_no,
- unsigned char* in_data,
- unsigned char* out_data,
- int bytes_in,
- int* bytes_out) = 0;
-
- virtual void encrypt_rtcp(
- int channel_no,
- unsigned char* in_data,
- unsigned char* out_data,
- int bytes_in,
- int* bytes_out) = 0;
-
- virtual void decrypt_rtcp(
- int channel_no,
- unsigned char* in_data,
- unsigned char* out_data,
- int bytes_in,
- int* bytes_out) = 0;
-
-protected:
- virtual ~Encryption() {}
- Encryption() {}
-};
-
-// External transport callback interface
-class Transport
-{
-public:
- virtual int SendPacket(int channel, const void *data, int len) = 0;
- virtual int SendRTCPPacket(int channel, const void *data, int len) = 0;
-
-protected:
- virtual ~Transport() {}
- Transport() {}
-};
-
-// ==================================================================
-// Voice specific types
-// ==================================================================
-
-// Each codec supported can be described by this structure.
-struct CodecInst
-{
- int pltype;
- char plname[32];
- int plfreq;
- int pacsize;
- int channels;
- int rate;
-};
-
-enum FrameType
-{
- kFrameEmpty = 0,
- kAudioFrameSpeech = 1,
- kAudioFrameCN = 2,
- kVideoFrameKey = 3, // independent frame
- kVideoFrameDelta = 4, // depends on the previus frame
- kVideoFrameGolden = 5, // depends on a old known previus frame
- kVideoFrameAltRef = 6
-};
-
-// RTP
-enum {kRtpCsrcSize = 15}; // RFC 3550 page 13
-
-enum RTPDirections
-{
- kRtpIncoming = 0,
- kRtpOutgoing
-};
-
-enum PayloadFrequencies
-{
- kFreq8000Hz = 8000,
- kFreq16000Hz = 16000,
- kFreq32000Hz = 32000
-};
-
-enum VadModes // degree of bandwidth reduction
-{
- kVadConventional = 0, // lowest reduction
- kVadAggressiveLow,
- kVadAggressiveMid,
- kVadAggressiveHigh // highest reduction
-};
-
-struct NetworkStatistics // NETEQ statistics
-{
- // current jitter buffer size in ms
- WebRtc_UWord16 currentBufferSize;
- // preferred (optimal) buffer size in ms
- WebRtc_UWord16 preferredBufferSize;
- // loss rate (network + late) in percent (in Q14)
- WebRtc_UWord16 currentPacketLossRate;
- // late loss rate in percent (in Q14)
- WebRtc_UWord16 currentDiscardRate;
- // fraction (of original stream) of synthesized speech inserted through
- // expansion (in Q14)
- WebRtc_UWord16 currentExpandRate;
- // fraction of synthesized speech inserted through pre-emptive expansion
- // (in Q14)
- WebRtc_UWord16 currentPreemptiveRate;
- // fraction of data removed through acceleration (in Q14)
- WebRtc_UWord16 currentAccelerateRate;
-};
-
-struct JitterStatistics
-{
- // smallest Jitter Buffer size during call in ms
- WebRtc_UWord32 jbMinSize;
- // largest Jitter Buffer size during call in ms
- WebRtc_UWord32 jbMaxSize;
- // the average JB size, measured over time - ms
- WebRtc_UWord32 jbAvgSize;
- // number of times the Jitter Buffer changed (using Accelerate or
- // Pre-emptive Expand)
- WebRtc_UWord32 jbChangeCount;
- // amount (in ms) of audio data received late
- WebRtc_UWord32 lateLossMs;
- // milliseconds removed to reduce jitter buffer size
- WebRtc_UWord32 accelerateMs;
- // milliseconds discarded through buffer flushing
- WebRtc_UWord32 flushedMs;
- // milliseconds of generated silence
- WebRtc_UWord32 generatedSilentMs;
- // milliseconds of synthetic audio data (non-background noise)
- WebRtc_UWord32 interpolatedVoiceMs;
- // milliseconds of synthetic audio data (background noise level)
- WebRtc_UWord32 interpolatedSilentMs;
- // count of tiny expansions in output audio
- WebRtc_UWord32 countExpandMoreThan120ms;
- // count of small expansions in output audio
- WebRtc_UWord32 countExpandMoreThan250ms;
- // count of medium expansions in output audio
- WebRtc_UWord32 countExpandMoreThan500ms;
- // count of long expansions in output audio
- WebRtc_UWord32 countExpandMoreThan2000ms;
- // duration of longest audio drop-out
- WebRtc_UWord32 longestExpandDurationMs;
- // count of times we got small network outage (inter-arrival time in
- // [500, 1000) ms)
- WebRtc_UWord32 countIAT500ms;
- // count of times we got medium network outage (inter-arrival time in
- // [1000, 2000) ms)
- WebRtc_UWord32 countIAT1000ms;
- // count of times we got large network outage (inter-arrival time >=
- // 2000 ms)
- WebRtc_UWord32 countIAT2000ms;
- // longest packet inter-arrival time in ms
- WebRtc_UWord32 longestIATms;
- // min time incoming Packet "waited" to be played
- WebRtc_UWord32 minPacketDelayMs;
- // max time incoming Packet "waited" to be played
- WebRtc_UWord32 maxPacketDelayMs;
- // avg time incoming Packet "waited" to be played
- WebRtc_UWord32 avgPacketDelayMs;
-};
-
-typedef struct
-{
- int min; // minumum
- int max; // maximum
- int average; // average
-} StatVal;
-
-typedef struct // All levels are reported in dBm0
-{
- StatVal speech_rx; // long-term speech levels on receiving side
- StatVal speech_tx; // long-term speech levels on transmitting side
- StatVal noise_rx; // long-term noise/silence levels on receiving side
- StatVal noise_tx; // long-term noise/silence levels on transmitting side
-} LevelStatistics;
-
-typedef struct // All levels are reported in dB
-{
- StatVal erl; // Echo Return Loss
- StatVal erle; // Echo Return Loss Enhancement
- StatVal rerl; // RERL = ERL + ERLE
- // Echo suppression inside EC at the point just before its NLP
- StatVal a_nlp;
-} EchoStatistics;
-
-enum TelephoneEventDetectionMethods
-{
- kInBand = 0,
- kOutOfBand = 1,
- kInAndOutOfBand = 2
-};
-
-enum NsModes // type of Noise Suppression
-{
- kNsUnchanged = 0, // previously set mode
- kNsDefault, // platform default
- kNsConference, // conferencing default
- kNsLowSuppression, // lowest suppression
- kNsModerateSuppression,
- kNsHighSuppression,
- kNsVeryHighSuppression, // highest suppression
-};
-
-enum AgcModes // type of Automatic Gain Control
-{
- kAgcUnchanged = 0, // previously set mode
- kAgcDefault, // platform default
- // adaptive mode for use when analog volume control exists (e.g. for
- // PC softphone)
- kAgcAdaptiveAnalog,
- // scaling takes place in the digital domain (e.g. for conference servers
- // and embedded devices)
- kAgcAdaptiveDigital,
- // can be used on embedded devices where the the capture signal is level
- // is predictable
- kAgcFixedDigital
-};
-
-// EC modes
-enum EcModes // type of Echo Control
-{
- kEcUnchanged = 0, // previously set mode
- kEcDefault, // platform default
- kEcConference, // conferencing default (aggressive AEC)
- kEcAec, // Acoustic Echo Cancellation
- kEcAecm, // AEC mobile
-};
-
-// AECM modes
-enum AecmModes // mode of AECM
-{
- kAecmQuietEarpieceOrHeadset = 0,
- // Quiet earpiece or headset use
- kAecmEarpiece, // most earpiece use
- kAecmLoudEarpiece, // Loud earpiece or quiet speakerphone use
- kAecmSpeakerphone, // most speakerphone use (default)
- kAecmLoudSpeakerphone // Loud speakerphone
-};
-
-// AGC configuration
-typedef struct
-{
- unsigned short targetLeveldBOv;
- unsigned short digitalCompressionGaindB;
- bool limiterEnable;
-} AgcConfig; // AGC configuration parameters
-
-enum StereoChannel
-{
- kStereoLeft = 0,
- kStereoRight,
- kStereoBoth
-};
-
-// Audio device layers
-enum AudioLayers
-{
- kAudioPlatformDefault = 0,
- kAudioWindowsWave = 1,
- kAudioWindowsCore = 2,
- kAudioLinuxAlsa = 3,
- kAudioLinuxPulse = 4
-};
-
-enum NetEqModes // NetEQ playout configurations
-{
- // Optimized trade-off between low delay and jitter robustness for two-way
- // communication.
- kNetEqDefault = 0,
- // Improved jitter robustness at the cost of increased delay. Can be
- // used in one-way communication.
- kNetEqStreaming = 1,
- // Optimzed for decodability of fax signals rather than for perceived audio
- // quality.
- kNetEqFax = 2,
-};
-
-enum NetEqBgnModes // NetEQ Background Noise (BGN) configurations
-{
- // BGN is always on and will be generated when the incoming RTP stream
- // stops (default).
- kBgnOn = 0,
- // The BGN is faded to zero (complete silence) after a few seconds.
- kBgnFade = 1,
- // BGN is not used at all. Silence is produced after speech extrapolation
- // has faded.
- kBgnOff = 2,
-};
-
-enum OnHoldModes // On Hold direction
-{
- kHoldSendAndPlay = 0, // Put both sending and playing in on-hold state.
- kHoldSendOnly, // Put only sending in on-hold state.
- kHoldPlayOnly // Put only playing in on-hold state.
-};
-
-enum AmrMode
-{
- kRfc3267BwEfficient = 0,
- kRfc3267OctetAligned = 1,
- kRfc3267FileStorage = 2,
-};
-
-// ==================================================================
-// Video specific types
-// ==================================================================
-
-// Raw video types
-enum RawVideoType
-{
- kVideoI420 = 0,
- kVideoYV12 = 1,
- kVideoYUY2 = 2,
- kVideoUYVY = 3,
- kVideoIYUV = 4,
- kVideoARGB = 5,
- kVideoRGB24 = 6,
- kVideoRGB565 = 7,
- kVideoARGB4444 = 8,
- kVideoARGB1555 = 9,
- kVideoMJPEG = 10,
- kVideoNV12 = 11,
- kVideoNV21 = 12,
- kVideoUnknown = 99
-};
-
-// Video codec
-enum { kConfigParameterSize = 128};
-enum { kPayloadNameSize = 32};
-
-// H.263 specific
-struct VideoCodecH263
-{
- char quality;
-};
-
-// H.264 specific
-enum H264Packetization
-{
- kH264SingleMode = 0,
- kH264NonInterleavedMode = 1
-};
-
-enum VideoCodecComplexity
-{
- kComplexityNormal = 0,
- kComplexityHigh = 1,
- kComplexityHigher = 2,
- kComplexityMax = 3
-};
-
-enum VideoCodecProfile
-{
- kProfileBase = 0x00,
- kProfileMain = 0x01
-};
-
-struct VideoCodecH264
-{
- H264Packetization packetization;
- VideoCodecComplexity complexity;
- VideoCodecProfile profile;
- char level;
- char quality;
-
- bool useFMO;
-
- unsigned char configParameters[kConfigParameterSize];
- unsigned char configParametersSize;
-};
-
-// VP8 specific
-struct VideoCodecVP8
-{
- bool pictureLossIndicationOn;
- bool feedbackModeOn;
- VideoCodecComplexity complexity;
-};
-
-// MPEG-4 specific
-struct VideoCodecMPEG4
-{
- unsigned char configParameters[kConfigParameterSize];
- unsigned char configParametersSize;
- char level;
-};
-
-// Unknown specific
-struct VideoCodecGeneric
-{
-};
-
-// Video codec types
-enum VideoCodecType
-{
- kVideoCodecH263,
- kVideoCodecH264,
- kVideoCodecVP8,
- kVideoCodecMPEG4,
- kVideoCodecI420,
- kVideoCodecRED,
- kVideoCodecULPFEC,
- kVideoCodecUnknown
-};
-
-union VideoCodecUnion
-{
- VideoCodecH263 H263;
- VideoCodecH264 H264;
- VideoCodecVP8 VP8;
- VideoCodecMPEG4 MPEG4;
- VideoCodecGeneric Generic;
-};
-
-// Common video codec properties
-struct VideoCodec
-{
- VideoCodecType codecType;
- char plName[kPayloadNameSize];
- unsigned char plType;
-
- unsigned short width;
- unsigned short height;
-
- unsigned int startBitrate;
- unsigned int maxBitrate;
- unsigned int minBitrate;
- unsigned char maxFramerate;
-
- VideoCodecUnion codecSpecific;
-
- unsigned int qpMax;
-};
-
-} // namespace webrtc
-
-#endif // WEBRTC_COMMON_TYPES_H
diff --git a/src/modules/audio_processing/OWNERS b/src/modules/audio_processing/OWNERS
deleted file mode 100644
index aecf56e..0000000
--- a/src/modules/audio_processing/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-ajm@google.com
-bjornv@google.com
diff --git a/src/modules/audio_processing/aec/main/interface/echo_cancellation.h b/src/modules/audio_processing/aec/main/interface/echo_cancellation.h
deleted file mode 100644
index 883357d..0000000
--- a/src/modules/audio_processing/aec/main/interface/echo_cancellation.h
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_INTERFACE_ECHO_CANCELLATION_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_INTERFACE_ECHO_CANCELLATION_H_
-
-#include "typedefs.h"
-
-// Errors
-#define AEC_UNSPECIFIED_ERROR 12000
-#define AEC_UNSUPPORTED_FUNCTION_ERROR 12001
-#define AEC_UNINITIALIZED_ERROR 12002
-#define AEC_NULL_POINTER_ERROR 12003
-#define AEC_BAD_PARAMETER_ERROR 12004
-
-// Warnings
-#define AEC_BAD_PARAMETER_WARNING 12050
-
-enum {
- kAecNlpConservative = 0,
- kAecNlpModerate,
- kAecNlpAggressive
-};
-
-enum {
- kAecFalse = 0,
- kAecTrue
-};
-
-typedef struct {
- WebRtc_Word16 nlpMode; // default kAecNlpModerate
- WebRtc_Word16 skewMode; // default kAecFalse
- WebRtc_Word16 metricsMode; // default kAecFalse
- //float realSkew;
-} AecConfig;
-
-typedef struct {
- WebRtc_Word16 instant;
- WebRtc_Word16 average;
- WebRtc_Word16 max;
- WebRtc_Word16 min;
-} AecLevel;
-
-typedef struct {
- AecLevel rerl;
- AecLevel erl;
- AecLevel erle;
- AecLevel aNlp;
-} AecMetrics;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Allocates the memory needed by the AEC. The memory needs to be initialized
- * separately using the WebRtcAec_Init() function.
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * void **aecInst Pointer to the AEC instance to be created
- * and initilized
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * WebRtc_Word32 return 0: OK
- * -1: error
- */
-WebRtc_Word32 WebRtcAec_Create(void **aecInst);
-
-/*
- * This function releases the memory allocated by WebRtcAec_Create().
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * void *aecInst Pointer to the AEC instance
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * WebRtc_Word32 return 0: OK
- * -1: error
- */
-WebRtc_Word32 WebRtcAec_Free(void *aecInst);
-
-/*
- * Initializes an AEC instance.
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * void *aecInst Pointer to the AEC instance
- * WebRtc_Word32 sampFreq Sampling frequency of data
- * WebRtc_Word32 scSampFreq Soundcard sampling frequency
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * WebRtc_Word32 return 0: OK
- * -1: error
- */
-WebRtc_Word32 WebRtcAec_Init(void *aecInst,
- WebRtc_Word32 sampFreq,
- WebRtc_Word32 scSampFreq);
-
-/*
- * Inserts an 80 or 160 sample block of data into the farend buffer.
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * void *aecInst Pointer to the AEC instance
- * WebRtc_Word16 *farend In buffer containing one frame of
- * farend signal for L band
- * WebRtc_Word16 nrOfSamples Number of samples in farend buffer
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * WebRtc_Word32 return 0: OK
- * -1: error
- */
-WebRtc_Word32 WebRtcAec_BufferFarend(void *aecInst,
- const WebRtc_Word16 *farend,
- WebRtc_Word16 nrOfSamples);
-
-/*
- * Runs the echo canceller on an 80 or 160 sample blocks of data.
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * void *aecInst Pointer to the AEC instance
- * WebRtc_Word16 *nearend In buffer containing one frame of
- * nearend+echo signal for L band
- * WebRtc_Word16 *nearendH In buffer containing one frame of
- * nearend+echo signal for H band
- * WebRtc_Word16 nrOfSamples Number of samples in nearend buffer
- * WebRtc_Word16 msInSndCardBuf Delay estimate for sound card and
- * system buffers
- * WebRtc_Word16 skew Difference between number of samples played
- * and recorded at the soundcard (for clock skew
- * compensation)
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * WebRtc_Word16 *out Out buffer, one frame of processed nearend
- * for L band
- * WebRtc_Word16 *outH Out buffer, one frame of processed nearend
- * for H band
- * WebRtc_Word32 return 0: OK
- * -1: error
- */
-WebRtc_Word32 WebRtcAec_Process(void *aecInst,
- const WebRtc_Word16 *nearend,
- const WebRtc_Word16 *nearendH,
- WebRtc_Word16 *out,
- WebRtc_Word16 *outH,
- WebRtc_Word16 nrOfSamples,
- WebRtc_Word16 msInSndCardBuf,
- WebRtc_Word32 skew);
-
-/*
- * This function enables the user to set certain parameters on-the-fly.
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * void *aecInst Pointer to the AEC instance
- * AecConfig config Config instance that contains all
- * properties to be set
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * WebRtc_Word32 return 0: OK
- * -1: error
- */
-WebRtc_Word32 WebRtcAec_set_config(void *aecInst, AecConfig config);
-
-/*
- * Gets the on-the-fly paramters.
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * void *aecInst Pointer to the AEC instance
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * AecConfig *config Pointer to the config instance that
- * all properties will be written to
- * WebRtc_Word32 return 0: OK
- * -1: error
- */
-WebRtc_Word32 WebRtcAec_get_config(void *aecInst, AecConfig *config);
-
-/*
- * Gets the current echo status of the nearend signal.
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * void *aecInst Pointer to the AEC instance
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * WebRtc_Word16 *status 0: Almost certainly nearend single-talk
- * 1: Might not be neared single-talk
- * WebRtc_Word32 return 0: OK
- * -1: error
- */
-WebRtc_Word32 WebRtcAec_get_echo_status(void *aecInst, WebRtc_Word16 *status);
-
-/*
- * Gets the current echo metrics for the session.
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * void *aecInst Pointer to the AEC instance
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * AecMetrics *metrics Struct which will be filled out with the
- * current echo metrics.
- * WebRtc_Word32 return 0: OK
- * -1: error
- */
-WebRtc_Word32 WebRtcAec_GetMetrics(void *aecInst, AecMetrics *metrics);
-
-/*
- * Gets the last error code.
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * void *aecInst Pointer to the AEC instance
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * WebRtc_Word32 return 11000-11100: error code
- */
-WebRtc_Word32 WebRtcAec_get_error_code(void *aecInst);
-
-/*
- * Gets a version string.
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * char *versionStr Pointer to a string array
- * WebRtc_Word16 len The maximum length of the string
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * WebRtc_Word8 *versionStr Pointer to a string array
- * WebRtc_Word32 return 0: OK
- * -1: error
- */
-WebRtc_Word32 WebRtcAec_get_version(WebRtc_Word8 *versionStr, WebRtc_Word16 len);
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_INTERFACE_ECHO_CANCELLATION_H_ */
diff --git a/src/modules/audio_processing/aec/main/matlab/fullaec.m b/src/modules/audio_processing/aec/main/matlab/fullaec.m
deleted file mode 100644
index 0f86a8c..0000000
--- a/src/modules/audio_processing/aec/main/matlab/fullaec.m
+++ /dev/null
@@ -1,953 +0,0 @@
-% Partitioned block frequency domain adaptive filtering NLMS and
-% standard time-domain sample-based NLMS
-%fid=fopen('aecFar-samsung.pcm', 'rb'); % Load far end
-fid=fopen('aecFar.pcm', 'rb'); % Load far end
-%fid=fopen(farFile, 'rb'); % Load far end
-rrin=fread(fid,inf,'int16');
-fclose(fid);
-%rrin=loadsl('data/far_me2.pcm'); % Load far end
-%fid=fopen('aecNear-samsung.pcm', 'rb'); % Load near end
-fid=fopen('aecNear.pcm', 'rb'); % Load near end
-%fid=fopen(nearFile, 'rb'); % Load near end
-ssin=fread(fid,inf,'int16');
-%ssin = [zeros(1024,1) ; ssin(1:end-1024)];
-
-fclose(fid);
-rand('state',13);
-fs=16000;
-mult=fs/8000;
-%rrin=rrin(fs*0+1:round(fs*120));
-%ssin=ssin(fs*0+1:round(fs*120));
-if fs == 8000
- cohRange = 2:3;
-elseif fs==16000
- cohRange = 2;
-end
-
-% Flags
-NLPon=1; % NLP
-CNon=1; % Comfort noise
-PLTon=1; % Plotting
-
-M = 16; % Number of partitions
-N = 64; % Partition length
-L = M*N; % Filter length
-if fs == 8000
- mufb = 0.6;
-else
- mufb = 0.5;
-end
-%mufb=1;
-VADtd=48;
-alp = 0.1; % Power estimation factor alc = 0.1; % Coherence estimation factor
-beta = 0.9; % Plotting factor
-%% Changed a little %%
-step = 0.3;%0.1875; % Downward step size
-%%
-if fs == 8000
- threshold=2e-6; % DTrob threshold
-else
- %threshold=0.7e-6;
- threshold=1.5e-6; end
-
-if fs == 8000
- echoBandRange = ceil(300*2/fs*N):floor(1800*2/fs*N);
- %echoBandRange = ceil(1500*2/fs*N):floor(2500*2/fs*N);
-else
- echoBandRange = ceil(300*2/fs*N):floor(1800*2/fs*N);
- %echoBandRange = ceil(300*2/fs*N):floor(1800*2/fs*N);
-end
-%echoBandRange = ceil(1600*2/fs*N):floor(1900*2/fs*N);
-%echoBandRange = ceil(2000*2/fs*N):floor(4000*2/fs*N);
-suppState = 1;
-transCtr = 0;
-
-Nt=1;
-vt=1;
-
-ramp = 1.0003; % Upward ramp
-rampd = 0.999; % Downward ramp
-cvt = 20; % Subband VAD threshold;
-nnthres = 20; % Noise threshold
-
-shh=logspace(-1.3,-2.2,N+1)';
-sh=[shh;flipud(shh(2:end-1))]; % Suppression profile
-
-len=length(ssin);
-w=zeros(L,1); % Sample-based TD NLMS
-WFb=zeros(N+1,M); % Block-based FD NLMS
-WFbOld=zeros(N+1,M); % Block-based FD NLMS
-YFb=zeros(N+1,M);
-erfb=zeros(len,1);
-erfb3=zeros(len,1);
-
-ercn=zeros(len,1);
-zm=zeros(N,1);
-XFm=zeros(N+1,M);
-YFm=zeros(N+1,M);
-pn0=10*ones(N+1,1);
-pn=zeros(N+1,1);
-NN=len;
-Nb=floor(NN/N)-M;
-erifb=zeros(Nb+1,1)+0.1;
-erifb3=zeros(Nb+1,1)+0.1;
-ericn=zeros(Nb+1,1)+0.1;
-dri=zeros(Nb+1,1)+0.1;
-start=1;
-xo=zeros(N,1);
-do=xo;
-eo=xo;
-
-echoBands=zeros(Nb+1,1);
-cohxdAvg=zeros(Nb+1,1);
-cohxdSlow=zeros(Nb+1,N+1);
-cohedSlow=zeros(Nb+1,N+1);
-%overdriveM=zeros(Nb+1,N+1);
-cohxdFastAvg=zeros(Nb+1,1);
-cohxdAvgBad=zeros(Nb+1,1);
-cohedAvg=zeros(Nb+1,1);
-cohedFastAvg=zeros(Nb+1,1);
-hnledAvg=zeros(Nb+1,1);
-hnlxdAvg=zeros(Nb+1,1);
-ovrdV=zeros(Nb+1,1);
-dIdxV=zeros(Nb+1,1);
-SLxV=zeros(Nb+1,1);
-hnlSortQV=zeros(Nb+1,1);
-hnlPrefAvgV=zeros(Nb+1,1);
-mutInfAvg=zeros(Nb+1,1);
-%overdrive=zeros(Nb+1,1);
-hnled = zeros(N+1, 1);
-weight=zeros(N+1,1);
-hnlMax = zeros(N+1, 1);
-hnl = zeros(N+1, 1);
-overdrive = ones(1, N+1);
-xfwm=zeros(N+1,M);
-dfm=zeros(N+1,M);
-WFbD=ones(N+1,1);
-
-fbSupp = 0;
-hnlLocalMin = 1;
-cohxdLocalMin = 1;
-hnlLocalMinV=zeros(Nb+1,1);
-cohxdLocalMinV=zeros(Nb+1,1);
-hnlMinV=zeros(Nb+1,1);
-dkEnV=zeros(Nb+1,1);
-ekEnV=zeros(Nb+1,1);
-ovrd = 2;
-ovrdPos = floor((N+1)/4);
-ovrdSm = 2;
-hnlMin = 1;
-minCtr = 0;
-SeMin = 0;
-SdMin = 0;
-SeLocalAvg = 0;
-SeMinSm = 0;
-divergeFact = 1;
-dIdx = 1;
-hnlMinCtr = 0;
-hnlNewMin = 0;
-divergeState = 0;
-
-Sy=ones(N+1,1);
-Sym=1e7*ones(N+1,1);
-
-wins=[0;sqrt(hanning(2*N-1))];
-ubufn=zeros(2*N,1);
-ebuf=zeros(2*N,1);
-ebuf2=zeros(2*N,1);
-ebuf4=zeros(2*N,1);
-mbuf=zeros(2*N,1);
-
-cohedFast = zeros(N+1,1);
-cohxdFast = zeros(N+1,1);
-cohxd = zeros(N+1,1);
-Se = zeros(N+1,1);
-Sd = zeros(N+1,1);
-Sx = zeros(N+1,1);
-SxBad = zeros(N+1,1);
-Sed = zeros(N+1,1);
-Sxd = zeros(N+1,1);
-SxdBad = zeros(N+1,1);
-hnledp=[];
-
-cohxdMax = 0;
-
-%hh=waitbar(0,'Please wait...');
-progressbar(0);
-
-%spaces = ' ';
-%spaces = repmat(spaces, 50, 1);
-%spaces = ['[' ; spaces ; ']'];
-%fprintf(1, spaces);
-%fprintf(1, '\n');
-
-for kk=1:Nb
- pos = N * (kk-1) + start;
-
- % FD block method
- % ---------------------- Organize data
- xk = rrin(pos:pos+N-1);
- dk = ssin(pos:pos+N-1);
-
- xx = [xo;xk];
- xo = xk;
- tmp = fft(xx);
- XX = tmp(1:N+1);
-
- dd = [do;dk]; % Overlap
- do = dk;
- tmp = fft(dd); % Frequency domain
- DD = tmp(1:N+1);
-
- % ------------------------ Power estimation
- pn0 = (1 - alp) * pn0 + alp * real(XX.* conj(XX));
- pn = pn0;
- %pn = (1 - alp) * pn + alp * M * pn0;
- if (CNon)
- Yp = real(conj(DD).*DD); % Instantaneous power
- Sy = (1 - alp) * Sy + alp * Yp; % Averaged power
-
- mm = min(Sy,Sym);
- diff = Sym - mm;
- if (kk>50)
- Sym = (mm + step*diff) * ramp; % Estimated background noise power
- end
- end
-
- % ---------------------- Filtering
- XFm(:,1) = XX;
- for mm=0:(M-1)
- m=mm+1;
- YFb(:,m) = XFm(:,m) .* WFb(:,m);
- end
- yfk = sum(YFb,2);
- tmp = [yfk ; flipud(conj(yfk(2:N)))];
- ykt = real(ifft(tmp));
- ykfb = ykt(end-N+1:end);
-
- % ---------------------- Error estimation
- ekfb = dk - ykfb;
- %if sum(abs(ekfb)) < sum(abs(dk))
- %ekfb = dk - ykfb;
- % erfb(pos:pos+N-1) = ekfb;
- %else
- %ekfb = dk;
- % erfb(pos:pos+N-1) = dk;
- %end
- %(kk-1)*(N*2)+1
- erfb(pos:pos+N-1) = ekfb;
- tmp = fft([zm;ekfb]); % FD version for cancelling part (overlap-save)
- Ek = tmp(1:N+1);
-
- % ------------------------ Adaptation
- Ek2 = Ek ./(M*pn + 0.001); % Normalized error
- %Ek2 = Ek ./(pn + 0.001); % Normalized error
- %Ek2 = Ek ./(100*pn + 0.001); % Normalized error
-
- absEf = max(abs(Ek2), threshold);
- absEf = ones(N+1,1)*threshold./absEf;
- Ek2 = Ek2.*absEf;
-
- mEk = mufb.*Ek2;
- PP = conj(XFm).*(ones(M,1) * mEk')';
- tmp = [PP ; flipud(conj(PP(2:N,:)))];
- IFPP = real(ifft(tmp));
- PH = IFPP(1:N,:);
- tmp = fft([PH;zeros(N,M)]);
- FPH = tmp(1:N+1,:);
- WFb = WFb + FPH;
-
- if mod(kk, 10*mult) == 0
- WFbEn = sum(real(WFb.*conj(WFb)));
- %WFbEn = sum(abs(WFb));
- [tmp, dIdx] = max(WFbEn);
-
- WFbD = sum(abs(WFb(:, dIdx)),2);
- %WFbD = WFbD / (mean(WFbD) + 1e-10);
- WFbD = min(max(WFbD, 0.5), 4);
- end
- dIdxV(kk) = dIdx;
-
- % NLP
- if (NLPon)
-
- ee = [eo;ekfb];
- eo = ekfb;
- window = wins;
- if fs == 8000
- %gamma = 0.88;
- gamma = 0.9;
- else
- %gamma = 0.92;
- gamma = 0.93;
- end
- %gamma = 0.9;
-
- tmp = fft(xx.*window);
- xf = tmp(1:N+1);
- tmp = fft(dd.*window);
- df = tmp(1:N+1);
- tmp = fft(ee.*window);
- ef = tmp(1:N+1);
-
- xfwm(:,1) = xf;
- xf = xfwm(:,dIdx);
- %fprintf(1,'%d: %f\n', kk, xf(4));
- dfm(:,1) = df;
-
- SxOld = Sx;
-
- Se = gamma*Se + (1-gamma)*real(ef.*conj(ef));
- Sd = gamma*Sd + (1-gamma)*real(df.*conj(df));
- Sx = gamma*Sx + (1 - gamma)*real(xf.*conj(xf));
-
- %xRatio = real(xfwm(:,1).*conj(xfwm(:,1))) ./ ...
- % (real(xfwm(:,2).*conj(xfwm(:,2))) + 1e-10);
- %xRatio = Sx ./ (SxOld + 1e-10);
- %SLx = log(1/(N+1)*sum(xRatio)) - 1/(N+1)*sum(log(xRatio));
- %SLxV(kk) = SLx;
-
- %freqSm = 0.9;
- %Sx = filter(freqSm, [1 -(1-freqSm)], Sx);
- %Sx(end:1) = filter(freqSm, [1 -(1-freqSm)], Sx(end:1));
- %Se = filter(freqSm, [1 -(1-freqSm)], Se);
- %Se(end:1) = filter(freqSm, [1 -(1-freqSm)], Se(end:1));
- %Sd = filter(freqSm, [1 -(1-freqSm)], Sd);
- %Sd(end:1) = filter(freqSm, [1 -(1-freqSm)], Sd(end:1));
-
- %SeFast = ef.*conj(ef);
- %SdFast = df.*conj(df);
- %SxFast = xf.*conj(xf);
- %cohedFast = 0.9*cohedFast + 0.1*SeFast ./ (SdFast + 1e-10);
- %cohedFast(find(cohedFast > 1)) = 1;
- %cohedFast(find(cohedFast > 1)) = 1 ./ cohedFast(find(cohedFast>1));
- %cohedFastAvg(kk) = mean(cohedFast(echoBandRange));
- %cohedFastAvg(kk) = min(cohedFast);
-
- %cohxdFast = 0.8*cohxdFast + 0.2*log(SdFast ./ (SxFast + 1e-10));
- %cohxdFastAvg(kk) = mean(cohxdFast(echoBandRange));
-
- % coherence
- Sxd = gamma*Sxd + (1 - gamma)*xf.*conj(df);
- Sed = gamma*Sed + (1-gamma)*ef.*conj(df);
-
- %Sxd = filter(freqSm, [1 -(1-freqSm)], Sxd);
- %Sxd(end:1) = filter(freqSm, [1 -(1-freqSm)], Sxd(end:1));
- %Sed = filter(freqSm, [1 -(1-freqSm)], Sed);
- %Sed(end:1) = filter(freqSm, [1 -(1-freqSm)], Sed(end:1));
-
- cohed = real(Sed.*conj(Sed))./(Se.*Sd + 1e-10);
- %cohedAvg(kk) = mean(cohed(echoBandRange));
- %cohedAvg(kk) = cohed(6);
- %cohedAvg(kk) = min(cohed);
-
- cohxd = real(Sxd.*conj(Sxd))./(Sx.*Sd + 1e-10);
- %freqSm = 0.5;
- %cohxd(3:end) = filter(freqSm, [1 -(1-freqSm)], cohxd(3:end));
- %cohxd(end:3) = filter(freqSm, [1 -(1-freqSm)], cohxd(end:3));
- %cohxdAvg(kk) = mean(cohxd(echoBandRange));
- %cohxdAvg(kk) = (cohxd(32));
- %cohxdAvg(kk) = max(cohxd);
-
- %xf = xfm(:,dIdx);
- %SxBad = gamma*SxBad + (1 - gamma)*real(xf.*conj(xf));
- %SxdBad = gamma*SxdBad + (1 - gamma)*xf.*conj(df);
- %cohxdBad = real(SxdBad.*conj(SxdBad))./(SxBad.*Sd + 0.01);
- %cohxdAvgBad(kk) = mean(cohxdBad);
-
- %for j=1:N+1
- % mutInf(j) = 0.9*mutInf(j) + 0.1*information(abs(xfm(j,:)), abs(dfm(j,:)));
- %end
- %mutInfAvg(kk) = mean(mutInf);
-
- %hnled = cohedFast;
- %xIdx = find(cohxd > 1 - cohed);
- %hnled(xIdx) = 1 - cohxd(xIdx);
- %hnled = 1 - max(cohxd, 1-cohedFast);
- hnled = min(1 - cohxd, cohed);
- %hnled = 1 - cohxd;
- %hnled = max(1 - (cohxd + (1-cohedFast)), 0);
- %hnled = 1 - max(cohxd, 1-cohed);
-
- if kk > 1
- cohxdSlow(kk,:) = 0.99*cohxdSlow(kk-1,:) + 0.01*cohxd';
- cohedSlow(kk,:) = 0.99*cohedSlow(kk-1,:) + 0.01*(1-cohed)';
- end
-
-
- if 0
- %if kk > 50
- %idx = find(hnled > 0.3);
- hnlMax = hnlMax*0.9999;
- %hnlMax(idx) = max(hnlMax(idx), hnled(idx));
- hnlMax = max(hnlMax, hnled);
- %overdrive(idx) = max(log(hnlMax(idx))/log(0.99), 1);
- avgHnl = mean(hnlMax(echoBandRange));
- if avgHnl > 0.3
- overdrive = max(log(avgHnl)/log(0.99), 1);
- end
- weight(4:end) = max(hnlMax) - hnlMax(4:end);
- end
-
-
-
- %[hg, gidx] = max(hnled);
- %fnrg = Sx(gidx) / (Sd(gidx) + 1e-10);
-
- %[tmp, bidx] = find((Sx / Sd + 1e-10) > fnrg);
- %hnled(bidx) = hg;
-
-
- %cohed1 = mean(cohed(cohRange)); % range depends on bandwidth
- %cohed1 = cohed1^2;
- %echoBands(kk) = length(find(cohed(echoBandRange) < 0.25))/length(echoBandRange);
-
- %if (fbSupp == 0)
- % if (echoBands(kk) > 0.8)
- % fbSupp = 1;
- % end
- %else
- % if (echoBands(kk) < 0.6)
- % fbSupp = 0;
- % end
- %end
- %overdrive(kk) = 7.5*echoBands(kk) + 0.5;
-
- % Factor by which to weight other bands
- %if (cohed1 < 0.1)
- % w = 0.8 - cohed1*10*0.4;
- %else
- % w = 0.4;
- %end
-
- % Weight coherence subbands
- %hnled = w*cohed1 + (1 - w)*cohed;
- %hnled = (hnled).^2;
- %cohed(floor(N/2):end) = cohed(floor(N/2):end).^2;
- %if fbSupp == 1
- % cohed = zeros(size(cohed));
- %end
- %cohed = cohed.^overdrive(kk);
-
- %hnled = gamma*hnled + (1 - gamma)*cohed;
- % Additional hf suppression
- %hnledp = [hnledp ; mean(hnled)];
- %hnled(floor(N/2):end) = hnled(floor(N/2):end).^2;
- %ef = ef.*((weight*(min(1 - hnled)).^2 + (1 - weight).*(1 - hnled)).^2);
-
- cohedMean = mean(cohed(echoBandRange));
- %aggrFact = 4*(1-mean(hnled(echoBandRange))) + 1;
- %[hnlSort, hnlSortIdx] = sort(hnled(echoBandRange));
- [hnlSort, hnlSortIdx] = sort(1-cohxd(echoBandRange));
- [xSort, xSortIdx] = sort(Sx);
- %aggrFact = (1-mean(hnled(echoBandRange)));
- %hnlSortQ = hnlSort(qIdx);
- hnlSortQ = mean(1 - cohxd(echoBandRange));
- %hnlSortQ = mean(1 - cohxd);
-
- [hnlSort2, hnlSortIdx2] = sort(hnled(echoBandRange));
- %[hnlSort2, hnlSortIdx2] = sort(hnled);
- hnlQuant = 0.75;
- hnlQuantLow = 0.5;
- qIdx = floor(hnlQuant*length(hnlSort2));
- qIdxLow = floor(hnlQuantLow*length(hnlSort2));
- hnlPrefAvg = hnlSort2(qIdx);
- hnlPrefAvgLow = hnlSort2(qIdxLow);
- %hnlPrefAvgLow = mean(hnled);
- %hnlPrefAvg = max(hnlSort2);
- %hnlPrefAvgLow = min(hnlSort2);
-
- %hnlPref = hnled(echoBandRange);
- %hnlPrefAvg = mean(hnlPref(xSortIdx((0.5*length(xSortIdx)):end)));
-
- %hnlPrefAvg = min(hnlPrefAvg, hnlSortQ);
-
- %hnlSortQIdx = hnlSortIdx(qIdx);
- %SeQ = Se(qIdx + echoBandRange(1) - 1);
- %SdQ = Sd(qIdx + echoBandRange(1) - 1);
- %SeQ = Se(qIdxLow + echoBandRange(1) - 1);
- %SdQ = Sd(qIdxLow + echoBandRange(1) - 1);
- %propLow = length(find(hnlSort < 0.1))/length(hnlSort);
- %aggrFact = min((1 - hnlSortQ)/2, 0.5);
- %aggrTerm = 1/aggrFact;
-
- %hnlg = mean(hnled(echoBandRange));
- %hnlg = hnlSortQ;
- %if suppState == 0
- % if hnlg < 0.05
- % suppState = 2;
- % transCtr = 0;
- % elseif hnlg < 0.75
- % suppState = 1;
- % transCtr = 0;
- % end
- %elseif suppState == 1
- % if hnlg > 0.8
- % suppState = 0;
- % transCtr = 0;
- % elseif hnlg < 0.05
- % suppState = 2;
- % transCtr = 0;
- % end
- %else
- % if hnlg > 0.8
- % suppState = 0;
- % transCtr = 0;
- % elseif hnlg > 0.25
- % suppState = 1;
- % transCtr = 0;
- % end
- %end
- %if kk > 50
-
- if cohedMean > 0.98 & hnlSortQ > 0.9
- %if suppState == 1
- % hnled = 0.5*hnled + 0.5*cohed;
- % %hnlSortQ = 0.5*hnlSortQ + 0.5*cohedMean;
- % hnlPrefAvg = 0.5*hnlPrefAvg + 0.5*cohedMean;
- %else
- % hnled = cohed;
- % %hnlSortQ = cohedMean;
- % hnlPrefAvg = cohedMean;
- %end
- suppState = 0;
- elseif cohedMean < 0.95 | hnlSortQ < 0.8
- %if suppState == 0
- % hnled = 0.5*hnled + 0.5*cohed;
- % %hnlSortQ = 0.5*hnlSortQ + 0.5*cohedMean;
- % hnlPrefAvg = 0.5*hnlPrefAvg + 0.5*cohedMean;
- %end
- suppState = 1;
- end
-
- if hnlSortQ < cohxdLocalMin & hnlSortQ < 0.75
- cohxdLocalMin = hnlSortQ;
- end
-
- if cohxdLocalMin == 1
- ovrd = 3;
- hnled = 1-cohxd;
- hnlPrefAvg = hnlSortQ;
- hnlPrefAvgLow = hnlSortQ;
- end
-
- if suppState == 0
- hnled = cohed;
- hnlPrefAvg = cohedMean;
- hnlPrefAvgLow = cohedMean;
- end
-
- %if hnlPrefAvg < hnlLocalMin & hnlPrefAvg < 0.6
- if hnlPrefAvgLow < hnlLocalMin & hnlPrefAvgLow < 0.6
- %hnlLocalMin = hnlPrefAvg;
- %hnlMin = hnlPrefAvg;
- hnlLocalMin = hnlPrefAvgLow;
- hnlMin = hnlPrefAvgLow;
- hnlNewMin = 1;
- hnlMinCtr = 0;
- %if hnlMinCtr == 0
- % hnlMinCtr = hnlMinCtr + 1;
- %else
- % hnlMinCtr = 0;
- % hnlMin = hnlLocalMin;
- %SeLocalMin = SeQ;
- %SdLocalMin = SdQ;
- %SeLocalAvg = 0;
- %minCtr = 0;
- % ovrd = max(log(0.0001)/log(hnlMin), 2);
- %divergeFact = hnlLocalMin;
- end
-
- if hnlNewMin == 1
- hnlMinCtr = hnlMinCtr + 1;
- end
- if hnlMinCtr == 2
- hnlNewMin = 0;
- hnlMinCtr = 0;
- %ovrd = max(log(0.0001)/log(hnlMin), 2);
- ovrd = max(log(0.00001)/(log(hnlMin + 1e-10) + 1e-10), 3);
- %ovrd = max(log(0.00000001)/(log(hnlMin + 1e-10) + 1e-10), 5);
- %ovrd = max(log(0.0001)/log(hnlPrefAvg), 2);
- %ovrd = max(log(0.001)/log(hnlMin), 2);
- end
- hnlLocalMin = min(hnlLocalMin + 0.0008/mult, 1);
- cohxdLocalMin = min(cohxdLocalMin + 0.0004/mult, 1);
- %divergeFact = hnlSortQ;
-
-
- %if minCtr > 0 & hnlLocalMin < 1
- % hnlMin = hnlLocalMin;
- % %SeMin = 0.9*SeMin + 0.1*sqrt(SeLocalMin);
- % SdMin = sqrt(SdLocalMin);
- % %SeMin = sqrt(SeLocalMin)*hnlSortQ;
- % SeMin = sqrt(SeLocalMin);
- % %ovrd = log(100/SeMin)/log(hnlSortQ);
- % %ovrd = log(100/SeMin)/log(hnlSortQ);
- % ovrd = log(0.01)/log(hnlMin);
- % ovrd = max(ovrd, 2);
- % ovrdPos = hnlSortQIdx;
- % %ovrd = max(ovrd, 1);
- % %SeMin = sqrt(SeLocalAvg/5);
- % minCtr = 0;
- %else
- % %SeLocalMin = 0.9*SeLocalMin +0.1*SeQ;
- % SeLocalAvg = SeLocalAvg + SeQ;
- % minCtr = minCtr + 1;
- %end
-
- if ovrd < ovrdSm
- ovrdSm = 0.99*ovrdSm + 0.01*ovrd;
- else
- ovrdSm = 0.9*ovrdSm + 0.1*ovrd;
- end
- %end
-
- %ekEn = sum(real(ekfb.^2));
- %dkEn = sum(real(dk.^2));
- ekEn = sum(Se);
- dkEn = sum(Sd);
-
- if divergeState == 0
- if ekEn > dkEn
- ef = df;
- divergeState = 1;
- %hnlPrefAvg = hnlSortQ;
- %hnled = (1 - cohxd);
- end
- else
- %if ekEn*1.1 < dkEn
- %if ekEn*1.26 < dkEn
- if ekEn*1.05 < dkEn
- divergeState = 0;
- else
- ef = df;
- end
- end
-
- if ekEn > dkEn*19.95
- WFb=zeros(N+1,M); % Block-based FD NLMS
- end
-
- ekEnV(kk) = ekEn;
- dkEnV(kk) = dkEn;
-
- hnlLocalMinV(kk) = hnlLocalMin;
- cohxdLocalMinV(kk) = cohxdLocalMin;
- hnlMinV(kk) = hnlMin;
- %cohxdMaxLocal = max(cohxdSlow(kk,:));
- %if kk > 50
- %cohxdMaxLocal = 1-hnlSortQ;
- %if cohxdMaxLocal > 0.5
- % %if cohxdMaxLocal > cohxdMax
- % odScale = max(log(cohxdMaxLocal)/log(0.95), 1);
- % %overdrive(7:end) = max(log(cohxdSlow(kk,7:end))/log(0.9), 1);
- % cohxdMax = cohxdMaxLocal;
- % end
- %end
- %end
- %cohxdMax = cohxdMax*0.999;
-
- %overdriveM(kk,:) = max(overdrive, 1);
- %aggrFact = 0.25;
- aggrFact = 0.3;
- %aggrFact = 0.5*propLow;
- %if fs == 8000
- % wCurve = [0 ; 0 ; aggrFact*sqrt(linspace(0,1,N-1))' + 0.1];
- %else
- % wCurve = [0; 0; 0; aggrFact*sqrt(linspace(0,1,N-2))' + 0.1];
- %end
- wCurve = [0; aggrFact*sqrt(linspace(0,1,N))' + 0.1];
- % For sync with C
- %if fs == 8000
- % wCurve = wCurve(2:end);
- %else
- % wCurve = wCurve(1:end-1);
- %end
- %weight = aggrFact*(sqrt(linspace(0,1,N+1)'));
- %weight = aggrFact*wCurve;
- weight = wCurve;
- %weight = aggrFact*ones(N+1,1);
- %weight = zeros(N+1,1);
- %hnled = weight.*min(hnled) + (1 - weight).*hnled;
- %hnled = weight.*min(mean(hnled(echoBandRange)), hnled) + (1 - weight).*hnled;
- %hnled = weight.*min(hnlSortQ, hnled) + (1 - weight).*hnled;
-
- %hnlSortQV(kk) = mean(hnled);
- %hnlPrefAvgV(kk) = mean(hnled(echoBandRange));
-
- hnled = weight.*min(hnlPrefAvg, hnled) + (1 - weight).*hnled;
-
- %od = aggrFact*(sqrt(linspace(0,1,N+1)') + aggrTerm);
- %od = 4*(sqrt(linspace(0,1,N+1)') + 1/4);
-
- %ovrdFact = (ovrdSm - 1) / sqrt(ovrdPos/(N+1));
- %ovrdFact = ovrdSm / sqrt(echoBandRange(floor(length(echoBandRange)/2))/(N+1));
- %od = ovrdFact*sqrt(linspace(0,1,N+1))' + 1;
- %od = ovrdSm*ones(N+1,1).*abs(WFb(:,dIdx))/(max(abs(WFb(:,dIdx)))+1e-10);
-
- %od = ovrdSm*ones(N+1,1);
- %od = ovrdSm*WFbD.*(sqrt(linspace(0,1,N+1))' + 1);
-
- od = ovrdSm*(sqrt(linspace(0,1,N+1))' + 1);
- %od = 4*(sqrt(linspace(0,1,N+1))' + 1);
-
- %od = 2*ones(N+1,1);
- %od = 2*ones(N+1,1);
- %sshift = ((1-hnled)*2-1).^3+1;
- sshift = ones(N+1,1);
-
- hnled = hnled.^(od.*sshift);
-
- %if hnlg > 0.75
- %if (suppState ~= 0)
- % transCtr = 0;
- %end
- % suppState = 0;
- %elseif hnlg < 0.6 & hnlg > 0.2
- % suppState = 1;
- %elseif hnlg < 0.1
- %hnled = zeros(N+1, 1);
- %if (suppState ~= 2)
- % transCtr = 0;
- %end
- % suppState = 2;
- %else
- % if (suppState ~= 2)
- % transCtr = 0;
- % end
- % suppState = 2;
- %end
- %if suppState == 0
- % hnled = ones(N+1, 1);
- %elseif suppState == 2
- % hnled = zeros(N+1, 1);
- %end
- %hnled(find(hnled < 0.1)) = 0;
- %hnled = hnled.^2;
- %if transCtr < 5
- %hnl = 0.75*hnl + 0.25*hnled;
- % transCtr = transCtr + 1;
- %else
- hnl = hnled;
- %end
- %hnled(find(hnled < 0.05)) = 0;
- ef = ef.*(hnl);
-
- %ef = ef.*(min(1 - cohxd, cohed).^2);
- %ef = ef.*((1-cohxd).^2);
-
- ovrdV(kk) = ovrdSm;
- %ovrdV(kk) = dIdx;
- %ovrdV(kk) = divergeFact;
- %hnledAvg(kk) = 1-mean(1-cohedFast(echoBandRange));
- hnledAvg(kk) = 1-mean(1-cohed(echoBandRange));
- hnlxdAvg(kk) = 1-mean(cohxd(echoBandRange));
- %hnlxdAvg(kk) = cohxd(5);
- %hnlSortQV(kk) = mean(hnled);
- hnlSortQV(kk) = hnlPrefAvgLow;
- hnlPrefAvgV(kk) = hnlPrefAvg;
- %hnlAvg(kk) = propLow;
- %ef(N/2:end) = 0;
- %ner = (sum(Sd) ./ (sum(Se.*(hnl.^2)) + 1e-10));
-
- % Comfort noise
- if (CNon)
- snn=sqrt(Sym);
- snn(1)=0; % Reject LF noise
- Un=snn.*exp(j*2*pi.*[0;rand(N-1,1);0]);
-
- % Weight comfort noise by suppression
- Un = sqrt(1-hnled.^2).*Un;
- Fmix = ef + Un;
- else
- Fmix = ef;
- end
-
- % Overlap and add in time domain for smoothness
- tmp = [Fmix ; flipud(conj(Fmix(2:N)))];
- mixw = wins.*real(ifft(tmp));
- mola = mbuf(end-N+1:end) + mixw(1:N);
- mbuf = mixw;
- ercn(pos:pos+N-1) = mola;
- end % NLPon
-
- % Filter update
- %Ek2 = Ek ./(12*pn + 0.001); % Normalized error
- %Ek2 = Ek2 * divergeFact;
- %Ek2 = Ek ./(pn + 0.001); % Normalized error
- %Ek2 = Ek ./(100*pn + 0.001); % Normalized error
-
- %divergeIdx = find(abs(Ek) > abs(DD));
- %divergeIdx = find(Se > Sd);
- %threshMod = threshold*ones(N+1,1);
- %if length(divergeIdx) > 0
- %if sum(abs(Ek)) > sum(abs(DD))
- %WFb(divergeIdx,:) = WFb(divergeIdx,:) .* repmat(sqrt(Sd(divergeIdx)./(Se(divergeIdx)+1e-10))),1,M);
- %Ek2(divergeIdx) = Ek2(divergeIdx) .* sqrt(Sd(divergeIdx)./(Se(divergeIdx)+1e-10));
- %Ek2(divergeIdx) = Ek2(divergeIdx) .* abs(DD(divergeIdx))./(abs(Ek(divergeIdx))+1e-10);
- %WFb(divergeIdx,:) = WFbOld(divergeIdx,:);
- %WFb = WFbOld;
- %threshMod(divergeIdx) = threshMod(divergeIdx) .* abs(DD(divergeIdx))./(abs(Ek(divergeIdx))+1e-10);
- % threshMod(divergeIdx) = threshMod(divergeIdx) .* sqrt(Sd(divergeIdx)./(Se(divergeIdx)+1e-10));
- %end
-
- %absEf = max(abs(Ek2), threshold);
- %absEf = ones(N+1,1)*threshold./absEf;
- %absEf = max(abs(Ek2), threshMod);
- %absEf = threshMod./absEf;
- %Ek2 = Ek2.*absEf;
-
- %if sum(Se) <= sum(Sd)
-
- % mEk = mufb.*Ek2;
- % PP = conj(XFm).*(ones(M,1) * mEk')';
- % tmp = [PP ; flipud(conj(PP(2:N,:)))];
- % IFPP = real(ifft(tmp));
- % PH = IFPP(1:N,:);
- % tmp = fft([PH;zeros(N,M)]);
- % FPH = tmp(1:N+1,:);
- % %WFbOld = WFb;
- % WFb = WFb + FPH;
-
- %else
- % WF = WFbOld;
- %end
-
- % Shift old FFTs
- %for m=M:-1:2
- % XFm(:,m) = XFm(:,m-1);
- % YFm(:,m) = YFm(:,m-1);
- %end
- XFm(:,2:end) = XFm(:,1:end-1);
- YFm(:,2:end) = YFm(:,1:end-1);
- xfwm(:,2:end) = xfwm(:,1:end-1);
- dfm(:,2:end) = dfm(:,1:end-1);
-
- %if mod(kk, floor(Nb/50)) == 0
- % fprintf(1, '.');
- %end
-
- if mod(kk, floor(Nb/100)) == 0
- %if mod(kk, floor(Nb/500)) == 0
- progressbar(kk/Nb);
- %figure(5)
- %plot(abs(WFb));
- %legend('1','2','3','4','5','6','7','8','9','10','11','12');
- %title(kk*N/fs);
- %figure(6)
- %plot(WFbD);
- %figure(6)
- %plot(threshMod)
- %if length(divergeIdx) > 0
- % plot(abs(DD))
- % hold on
- % plot(abs(Ek), 'r')
- % hold off
- %plot(min(sqrt(Sd./(Se+1e-10)),1))
- %axis([0 N 0 1]);
- %end
- %figure(6)
- %plot(cohedFast);
- %axis([1 N+1 0 1]);
- %plot(WFbEn);
-
- %figure(7)
- %plot(weight);
- %plot([cohxd 1-cohed]);
- %plot([cohxd 1-cohed 1-cohedFast hnled]);
- %plot([cohxd cohxdFast/max(cohxdFast)]);
- %legend('cohxd', '1-cohed', '1-cohedFast');
- %axis([1 65 0 1]);
- %pause(0.5);
- %overdrive
- end
-end
-progressbar(1);
-
-%figure(2);
-%plot([feat(:,1) feat(:,2)+1 feat(:,3)+2 mfeat+3]);
-%plot([feat(:,1) mfeat+1]);
-
-%figure(3);
-%plot(10*log10([dri erifb erifb3 ericn]));
-%legend('Near-end','Error','Post NLP','Final',4);
-% Compensate for delay
-%ercn=[ercn(N+1:end);zeros(N,1)];
-%ercn_=[ercn_(N+1:end);zeros(N,1)];
-
-%figure(11);
-%plot(cohxdSlow);
-
-%figure(12);
-%surf(cohxdSlow);
-%shading interp;
-
-%figure(13);
-%plot(overdriveM);
-
-%figure(14);
-%surf(overdriveM);
-%shading interp;
-
-figure(10);
-t = (0:Nb)*N/fs;
-rrinSubSamp = rrin(N*(1:(Nb+1)));
-plot(t, rrinSubSamp/max(abs(rrinSubSamp)),'b');
-hold on
-plot(t, hnledAvg, 'r');
-plot(t, hnlxdAvg, 'g');
-plot(t, hnlSortQV, 'y');
-plot(t, hnlLocalMinV, 'k');
-plot(t, cohxdLocalMinV, 'c');
-plot(t, hnlPrefAvgV, 'm');
-%plot(t, cohxdAvg, 'r');
-%plot(cohxdFastAvg, 'r');
-%plot(cohxdAvgBad, 'k');
-%plot(t, cohedAvg, 'k');
-%plot(t, 1-cohedFastAvg, 'k');
-%plot(ssin(N*(1:floor(length(ssin)/N)))/max(abs(ssin)));
-%plot(echoBands,'r');
-%plot(overdrive, 'g');
-%plot(erfb(N*(1:floor(length(erfb)/N)))/max(abs(erfb)));
-hold off
-tightx;
-
-figure(11)
-plot(t, ovrdV);
-tightx;
-%plot(mfeat,'r');
-%plot(1-cohxyp_,'r');
-%plot(Hnlxydp,'y');
-%plot(hnledp,'k');
-%plot(Hnlxydp, 'c');
-%plot(ccohpd_,'k');
-%plot(supplot_, 'g');
-%plot(ones(length(mfeat),1)*rr1_, 'k');
-%plot(ones(length(mfeat),1)*rr2_, 'k');
-%plot(N*(1:length(feat)), feat);
-%plot(Sep_,'r');
-%axis([1 floor(length(erfb)/N) -1 1])
-%hold off
-%plot(10*log10([Se_, Sx_, Seu_, real(sf_.*conj(sf_))]));
-%legend('Se','Sx','Seu','S');
-%figure(5)
-%plot([ercn ercn_]);
-
-figure(12)
-plot(t, dIdxV);
-%plot(t, SLxV);
-tightx;
-
-%figure(13)
-%plot(t, [ekEnV dkEnV]);
-%plot(t, dkEnV./(ekEnV+1e-10));
-%tightx;
-
-%close(hh);
-%spclab(fs,ssin,erfb,ercn,'outxd.pcm');
-%spclab(fs,rrin,ssin,erfb,1.78*ercn,'vqeOut-1.pcm');
-%spclab(fs,erfb,'aecOutLp.pcm');
-%spclab(fs,rrin,ssin,erfb,1.78*ercn,'aecOut25.pcm','vqeOut-1.pcm');
-%spclab(fs,rrin,ssin,erfb,ercn,'aecOut-mba.pcm');
-%spclab(fs,rrin,ssin,erfb,ercn,'aecOut.pcm');
-%spclab(fs, ssin, erfb, ercn, 'out0.pcm');
diff --git a/src/modules/audio_processing/aec/main/source/Android.mk b/src/modules/audio_processing/aec/main/source/Android.mk
deleted file mode 100644
index a0c1cd3..0000000
--- a/src/modules/audio_processing/aec/main/source/Android.mk
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_MODULE := libwebrtc_aec
-LOCAL_MODULE_TAGS := optional
-LOCAL_GENERATED_SOURCES :=
-LOCAL_SRC_FILES := \
- echo_cancellation.c \
- aec_core.c \
- aec_rdft.c \
- resampler.c
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS :=
-MY_CFLAGS_C :=
-MY_DEFS := '-DNO_TCMALLOC' \
- '-DNO_HEAPCHECKER' \
- '-DWEBRTC_TARGET_PC' \
- '-DWEBRTC_LINUX' \
- '-DWEBRTC_THREAD_RR' \
- '-DWEBRTC_ANDROID' \
- '-DANDROID'
-LOCAL_CFLAGS := $(MY_CFLAGS_C) $(MY_CFLAGS) $(MY_DEFS)
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../../.. \
- $(LOCAL_PATH)/../interface \
- $(LOCAL_PATH)/../../../utility \
- $(LOCAL_PATH)/../../../../../common_audio/signal_processing_library/main/interface
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS :=
-
-LOCAL_LDFLAGS :=
-
-LOCAL_STATIC_LIBRARIES :=
-
-LOCAL_SHARED_LIBRARIES := libcutils \
- libdl \
- libstlport
-LOCAL_ADDITIONAL_DEPENDENCIES :=
-
-include external/stlport/libstlport.mk
-include $(BUILD_STATIC_LIBRARY)
diff --git a/src/modules/audio_processing/aec/main/source/aec.gyp b/src/modules/audio_processing/aec/main/source/aec.gyp
deleted file mode 100644
index 0427e00..0000000
--- a/src/modules/audio_processing/aec/main/source/aec.gyp
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-{
- 'includes': [
- '../../../../../common_settings.gypi',
- ],
- 'targets': [
- {
- 'target_name': 'aec',
- 'type': '<(library)',
- 'dependencies': [
- '../../../../../common_audio/signal_processing_library/main/source/spl.gyp:spl',
- '../../../utility/util.gyp:apm_util'
- ],
- 'include_dirs': [
- '../interface',
- ],
- 'direct_dependent_settings': {
- 'include_dirs': [
- '../interface',
- ],
- },
- 'sources': [
- '../interface/echo_cancellation.h',
- 'echo_cancellation.c',
- 'aec_core.c',
- 'aec_core_sse2.c',
- 'aec_rdft.h',
- 'aec_rdft.c',
- 'aec_rdft_sse2.c',
- 'aec_core.h',
- 'resampler.c',
- 'resampler.h',
- ],
- },
- ],
-}
-
-# Local Variables:
-# tab-width:2
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/src/modules/audio_processing/aec/main/source/aec_core.c b/src/modules/audio_processing/aec/main/source/aec_core.c
deleted file mode 100644
index 81197ea..0000000
--- a/src/modules/audio_processing/aec/main/source/aec_core.c
+++ /dev/null
@@ -1,1456 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-/*
- * The core AEC algorithm, which is presented with time-aligned signals.
- */
-
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "aec_core.h"
-#include "aec_rdft.h"
-#include "ring_buffer.h"
-#include "system_wrappers/interface/cpu_features_wrapper.h"
-
-// Noise suppression
-static const int converged = 250;
-
-// Metrics
-static const int subCountLen = 4;
-static const int countLen = 50;
-
-// Quantities to control H band scaling for SWB input
-static const int flagHbandCn = 1; // flag for adding comfort noise in H band
-static const float cnScaleHband = (float)0.4; // scale for comfort noise in H band
-// Initial bin for averaging nlp gain in low band
-static const int freqAvgIc = PART_LEN / 2;
-
-/* Matlab code to produce table:
-win = sqrt(hanning(63)); win = [0 ; win(1:32)];
-fprintf(1, '\t%.14f, %.14f, %.14f,\n', win);
-*/
-/*
-static const float sqrtHanning[33] = {
- 0.00000000000000, 0.04906767432742, 0.09801714032956,
- 0.14673047445536, 0.19509032201613, 0.24298017990326,
- 0.29028467725446, 0.33688985339222, 0.38268343236509,
- 0.42755509343028, 0.47139673682600, 0.51410274419322,
- 0.55557023301960, 0.59569930449243, 0.63439328416365,
- 0.67155895484702, 0.70710678118655, 0.74095112535496,
- 0.77301045336274, 0.80320753148064, 0.83146961230255,
- 0.85772861000027, 0.88192126434835, 0.90398929312344,
- 0.92387953251129, 0.94154406518302, 0.95694033573221,
- 0.97003125319454, 0.98078528040323, 0.98917650996478,
- 0.99518472667220, 0.99879545620517, 1.00000000000000
-};
-*/
-
-static const float sqrtHanning[65] = {
- 0.00000000000000f, 0.02454122852291f, 0.04906767432742f,
- 0.07356456359967f, 0.09801714032956f, 0.12241067519922f,
- 0.14673047445536f, 0.17096188876030f, 0.19509032201613f,
- 0.21910124015687f, 0.24298017990326f, 0.26671275747490f,
- 0.29028467725446f, 0.31368174039889f, 0.33688985339222f,
- 0.35989503653499f, 0.38268343236509f, 0.40524131400499f,
- 0.42755509343028f, 0.44961132965461f, 0.47139673682600f,
- 0.49289819222978f, 0.51410274419322f, 0.53499761988710f,
- 0.55557023301960f, 0.57580819141785f, 0.59569930449243f,
- 0.61523159058063f, 0.63439328416365f, 0.65317284295378f,
- 0.67155895484702f, 0.68954054473707f, 0.70710678118655f,
- 0.72424708295147f, 0.74095112535496f, 0.75720884650648f,
- 0.77301045336274f, 0.78834642762661f, 0.80320753148064f,
- 0.81758481315158f, 0.83146961230255f, 0.84485356524971f,
- 0.85772861000027f, 0.87008699110871f, 0.88192126434835f,
- 0.89322430119552f, 0.90398929312344f, 0.91420975570353f,
- 0.92387953251129f, 0.93299279883474f, 0.94154406518302f,
- 0.94952818059304f, 0.95694033573221f, 0.96377606579544f,
- 0.97003125319454f, 0.97570213003853f, 0.98078528040323f,
- 0.98527764238894f, 0.98917650996478f, 0.99247953459871f,
- 0.99518472667220f, 0.99729045667869f, 0.99879545620517f,
- 0.99969881869620f, 1.00000000000000f
-};
-
-/* Matlab code to produce table:
-weightCurve = [0 ; 0.3 * sqrt(linspace(0,1,64))' + 0.1];
-fprintf(1, '\t%.4f, %.4f, %.4f, %.4f, %.4f, %.4f,\n', weightCurve);
-*/
-const float WebRtcAec_weightCurve[65] = {
- 0.0000f, 0.1000f, 0.1378f, 0.1535f, 0.1655f, 0.1756f,
- 0.1845f, 0.1926f, 0.2000f, 0.2069f, 0.2134f, 0.2195f,
- 0.2254f, 0.2309f, 0.2363f, 0.2414f, 0.2464f, 0.2512f,
- 0.2558f, 0.2604f, 0.2648f, 0.2690f, 0.2732f, 0.2773f,
- 0.2813f, 0.2852f, 0.2890f, 0.2927f, 0.2964f, 0.3000f,
- 0.3035f, 0.3070f, 0.3104f, 0.3138f, 0.3171f, 0.3204f,
- 0.3236f, 0.3268f, 0.3299f, 0.3330f, 0.3360f, 0.3390f,
- 0.3420f, 0.3449f, 0.3478f, 0.3507f, 0.3535f, 0.3563f,
- 0.3591f, 0.3619f, 0.3646f, 0.3673f, 0.3699f, 0.3726f,
- 0.3752f, 0.3777f, 0.3803f, 0.3828f, 0.3854f, 0.3878f,
- 0.3903f, 0.3928f, 0.3952f, 0.3976f, 0.4000f
-};
-
-/* Matlab code to produce table:
-overDriveCurve = [sqrt(linspace(0,1,65))' + 1];
-fprintf(1, '\t%.4f, %.4f, %.4f, %.4f, %.4f, %.4f,\n', overDriveCurve);
-*/
-const float WebRtcAec_overDriveCurve[65] = {
- 1.0000f, 1.1250f, 1.1768f, 1.2165f, 1.2500f, 1.2795f,
- 1.3062f, 1.3307f, 1.3536f, 1.3750f, 1.3953f, 1.4146f,
- 1.4330f, 1.4507f, 1.4677f, 1.4841f, 1.5000f, 1.5154f,
- 1.5303f, 1.5449f, 1.5590f, 1.5728f, 1.5863f, 1.5995f,
- 1.6124f, 1.6250f, 1.6374f, 1.6495f, 1.6614f, 1.6731f,
- 1.6847f, 1.6960f, 1.7071f, 1.7181f, 1.7289f, 1.7395f,
- 1.7500f, 1.7603f, 1.7706f, 1.7806f, 1.7906f, 1.8004f,
- 1.8101f, 1.8197f, 1.8292f, 1.8385f, 1.8478f, 1.8570f,
- 1.8660f, 1.8750f, 1.8839f, 1.8927f, 1.9014f, 1.9100f,
- 1.9186f, 1.9270f, 1.9354f, 1.9437f, 1.9520f, 1.9601f,
- 1.9682f, 1.9763f, 1.9843f, 1.9922f, 2.0000f
-};
-
-// "Private" function prototypes.
-static void ProcessBlock(aec_t *aec, const short *farend,
- const short *nearend, const short *nearendH,
- short *out, short *outH);
-
-static void BufferFar(aec_t *aec, const short *farend, int farLen);
-static void FetchFar(aec_t *aec, short *farend, int farLen, int knownDelay);
-
-static void NonLinearProcessing(aec_t *aec, short *output, short *outputH);
-
-static void GetHighbandGain(const float *lambda, float *nlpGainHband);
-
-// Comfort_noise also computes noise for H band returned in comfortNoiseHband
-static void ComfortNoise(aec_t *aec, float efw[2][PART_LEN1],
- complex_t *comfortNoiseHband,
- const float *noisePow, const float *lambda);
-
-static void WebRtcAec_InitLevel(power_level_t *level);
-static void WebRtcAec_InitStats(stats_t *stats);
-static void UpdateLevel(power_level_t *level, const short *in);
-static void UpdateMetrics(aec_t *aec);
-
-__inline static float MulRe(float aRe, float aIm, float bRe, float bIm)
-{
- return aRe * bRe - aIm * bIm;
-}
-
-__inline static float MulIm(float aRe, float aIm, float bRe, float bIm)
-{
- return aRe * bIm + aIm * bRe;
-}
-
-static int CmpFloat(const void *a, const void *b)
-{
- const float *da = (const float *)a;
- const float *db = (const float *)b;
-
- return (*da > *db) - (*da < *db);
-}
-
-int WebRtcAec_CreateAec(aec_t **aecInst)
-{
- aec_t *aec = malloc(sizeof(aec_t));
- *aecInst = aec;
- if (aec == NULL) {
- return -1;
- }
-
- if (WebRtcApm_CreateBuffer(&aec->farFrBuf, FRAME_LEN + PART_LEN) == -1) {
- WebRtcAec_FreeAec(aec);
- aec = NULL;
- return -1;
- }
-
- if (WebRtcApm_CreateBuffer(&aec->nearFrBuf, FRAME_LEN + PART_LEN) == -1) {
- WebRtcAec_FreeAec(aec);
- aec = NULL;
- return -1;
- }
-
- if (WebRtcApm_CreateBuffer(&aec->outFrBuf, FRAME_LEN + PART_LEN) == -1) {
- WebRtcAec_FreeAec(aec);
- aec = NULL;
- return -1;
- }
-
- if (WebRtcApm_CreateBuffer(&aec->nearFrBufH, FRAME_LEN + PART_LEN) == -1) {
- WebRtcAec_FreeAec(aec);
- aec = NULL;
- return -1;
- }
-
- if (WebRtcApm_CreateBuffer(&aec->outFrBufH, FRAME_LEN + PART_LEN) == -1) {
- WebRtcAec_FreeAec(aec);
- aec = NULL;
- return -1;
- }
-
- return 0;
-}
-
-int WebRtcAec_FreeAec(aec_t *aec)
-{
- if (aec == NULL) {
- return -1;
- }
-
- WebRtcApm_FreeBuffer(aec->farFrBuf);
- WebRtcApm_FreeBuffer(aec->nearFrBuf);
- WebRtcApm_FreeBuffer(aec->outFrBuf);
-
- WebRtcApm_FreeBuffer(aec->nearFrBufH);
- WebRtcApm_FreeBuffer(aec->outFrBufH);
-
- free(aec);
- return 0;
-}
-
-static void FilterFar(aec_t *aec, float yf[2][PART_LEN1])
-{
- int i;
- for (i = 0; i < NR_PART; i++) {
- int j;
- int xPos = (i + aec->xfBufBlockPos) * PART_LEN1;
- int pos = i * PART_LEN1;
- // Check for wrap
- if (i + aec->xfBufBlockPos >= NR_PART) {
- xPos -= NR_PART*(PART_LEN1);
- }
-
- for (j = 0; j < PART_LEN1; j++) {
- yf[0][j] += MulRe(aec->xfBuf[0][xPos + j], aec->xfBuf[1][xPos + j],
- aec->wfBuf[0][ pos + j], aec->wfBuf[1][ pos + j]);
- yf[1][j] += MulIm(aec->xfBuf[0][xPos + j], aec->xfBuf[1][xPos + j],
- aec->wfBuf[0][ pos + j], aec->wfBuf[1][ pos + j]);
- }
- }
-}
-
-static void ScaleErrorSignal(aec_t *aec, float ef[2][PART_LEN1])
-{
- int i;
- float absEf;
- for (i = 0; i < (PART_LEN1); i++) {
- ef[0][i] /= (aec->xPow[i] + 1e-10f);
- ef[1][i] /= (aec->xPow[i] + 1e-10f);
- absEf = sqrtf(ef[0][i] * ef[0][i] + ef[1][i] * ef[1][i]);
-
- if (absEf > aec->errThresh) {
- absEf = aec->errThresh / (absEf + 1e-10f);
- ef[0][i] *= absEf;
- ef[1][i] *= absEf;
- }
-
- // Stepsize factor
- ef[0][i] *= aec->mu;
- ef[1][i] *= aec->mu;
- }
-}
-
-static void FilterAdaptation(aec_t *aec, float *fft, float ef[2][PART_LEN1]) {
- int i, j;
- for (i = 0; i < NR_PART; i++) {
- int xPos = (i + aec->xfBufBlockPos)*(PART_LEN1);
- int pos;
- // Check for wrap
- if (i + aec->xfBufBlockPos >= NR_PART) {
- xPos -= NR_PART * PART_LEN1;
- }
-
- pos = i * PART_LEN1;
-
-#ifdef UNCONSTR
- for (j = 0; j < PART_LEN1; j++) {
- aec->wfBuf[pos + j][0] += MulRe(aec->xfBuf[xPos + j][0],
- -aec->xfBuf[xPos + j][1],
- ef[j][0], ef[j][1]);
- aec->wfBuf[pos + j][1] += MulIm(aec->xfBuf[xPos + j][0],
- -aec->xfBuf[xPos + j][1],
- ef[j][0], ef[j][1]);
- }
-#else
- for (j = 0; j < PART_LEN; j++) {
-
- fft[2 * j] = MulRe(aec->xfBuf[0][xPos + j],
- -aec->xfBuf[1][xPos + j],
- ef[0][j], ef[1][j]);
- fft[2 * j + 1] = MulIm(aec->xfBuf[0][xPos + j],
- -aec->xfBuf[1][xPos + j],
- ef[0][j], ef[1][j]);
- }
- fft[1] = MulRe(aec->xfBuf[0][xPos + PART_LEN],
- -aec->xfBuf[1][xPos + PART_LEN],
- ef[0][PART_LEN], ef[1][PART_LEN]);
-
- aec_rdft_inverse_128(fft);
- memset(fft + PART_LEN, 0, sizeof(float) * PART_LEN);
-
- // fft scaling
- {
- float scale = 2.0f / PART_LEN2;
- for (j = 0; j < PART_LEN; j++) {
- fft[j] *= scale;
- }
- }
- aec_rdft_forward_128(fft);
-
- aec->wfBuf[0][pos] += fft[0];
- aec->wfBuf[0][pos + PART_LEN] += fft[1];
-
- for (j = 1; j < PART_LEN; j++) {
- aec->wfBuf[0][pos + j] += fft[2 * j];
- aec->wfBuf[1][pos + j] += fft[2 * j + 1];
- }
-#endif // UNCONSTR
- }
-}
-
-static void OverdriveAndSuppress(aec_t *aec, float hNl[PART_LEN1],
- const float hNlFb,
- float efw[2][PART_LEN1]) {
- int i;
- for (i = 0; i < PART_LEN1; i++) {
- // Weight subbands
- if (hNl[i] > hNlFb) {
- hNl[i] = WebRtcAec_weightCurve[i] * hNlFb +
- (1 - WebRtcAec_weightCurve[i]) * hNl[i];
- }
- hNl[i] = powf(hNl[i], aec->overDriveSm * WebRtcAec_overDriveCurve[i]);
-
- // Suppress error signal
- efw[0][i] *= hNl[i];
- efw[1][i] *= hNl[i];
-
- // Ooura fft returns incorrect sign on imaginary component. It matters here
- // because we are making an additive change with comfort noise.
- efw[1][i] *= -1;
- }
-}
-
-WebRtcAec_FilterFar_t WebRtcAec_FilterFar;
-WebRtcAec_ScaleErrorSignal_t WebRtcAec_ScaleErrorSignal;
-WebRtcAec_FilterAdaptation_t WebRtcAec_FilterAdaptation;
-WebRtcAec_OverdriveAndSuppress_t WebRtcAec_OverdriveAndSuppress;
-
-int WebRtcAec_InitAec(aec_t *aec, int sampFreq)
-{
- int i;
-
- aec->sampFreq = sampFreq;
-
- if (sampFreq == 8000) {
- aec->mu = 0.6f;
- aec->errThresh = 2e-6f;
- }
- else {
- aec->mu = 0.5f;
- aec->errThresh = 1.5e-6f;
- }
-
- if (WebRtcApm_InitBuffer(aec->farFrBuf) == -1) {
- return -1;
- }
-
- if (WebRtcApm_InitBuffer(aec->nearFrBuf) == -1) {
- return -1;
- }
-
- if (WebRtcApm_InitBuffer(aec->outFrBuf) == -1) {
- return -1;
- }
-
- if (WebRtcApm_InitBuffer(aec->nearFrBufH) == -1) {
- return -1;
- }
-
- if (WebRtcApm_InitBuffer(aec->outFrBufH) == -1) {
- return -1;
- }
-
- // Default target suppression level
- aec->targetSupp = -11.5;
- aec->minOverDrive = 2.0;
-
- // Sampling frequency multiplier
- // SWB is processed as 160 frame size
- if (aec->sampFreq == 32000) {
- aec->mult = (short)aec->sampFreq / 16000;
- }
- else {
- aec->mult = (short)aec->sampFreq / 8000;
- }
-
- aec->farBufWritePos = 0;
- aec->farBufReadPos = 0;
-
- aec->inSamples = 0;
- aec->outSamples = 0;
- aec->knownDelay = 0;
-
- // Initialize buffers
- memset(aec->farBuf, 0, sizeof(aec->farBuf));
- memset(aec->xBuf, 0, sizeof(aec->xBuf));
- memset(aec->dBuf, 0, sizeof(aec->dBuf));
- memset(aec->eBuf, 0, sizeof(aec->eBuf));
- // For H band
- memset(aec->dBufH, 0, sizeof(aec->dBufH));
-
- memset(aec->xPow, 0, sizeof(aec->xPow));
- memset(aec->dPow, 0, sizeof(aec->dPow));
- memset(aec->dInitMinPow, 0, sizeof(aec->dInitMinPow));
- aec->noisePow = aec->dInitMinPow;
- aec->noiseEstCtr = 0;
-
- // Initial comfort noise power
- for (i = 0; i < PART_LEN1; i++) {
- aec->dMinPow[i] = 1.0e6f;
- }
-
- // Holds the last block written to
- aec->xfBufBlockPos = 0;
- // TODO: Investigate need for these initializations. Deleting them doesn't
- // change the output at all and yields 0.4% overall speedup.
- memset(aec->xfBuf, 0, sizeof(complex_t) * NR_PART * PART_LEN1);
- memset(aec->wfBuf, 0, sizeof(complex_t) * NR_PART * PART_LEN1);
- memset(aec->sde, 0, sizeof(complex_t) * PART_LEN1);
- memset(aec->sxd, 0, sizeof(complex_t) * PART_LEN1);
- memset(aec->xfwBuf, 0, sizeof(complex_t) * NR_PART * PART_LEN1);
- memset(aec->se, 0, sizeof(float) * PART_LEN1);
-
- // To prevent numerical instability in the first block.
- for (i = 0; i < PART_LEN1; i++) {
- aec->sd[i] = 1;
- }
- for (i = 0; i < PART_LEN1; i++) {
- aec->sx[i] = 1;
- }
-
- memset(aec->hNs, 0, sizeof(aec->hNs));
- memset(aec->outBuf, 0, sizeof(float) * PART_LEN);
-
- aec->hNlFbMin = 1;
- aec->hNlFbLocalMin = 1;
- aec->hNlXdAvgMin = 1;
- aec->hNlNewMin = 0;
- aec->hNlMinCtr = 0;
- aec->overDrive = 2;
- aec->overDriveSm = 2;
- aec->delayIdx = 0;
- aec->stNearState = 0;
- aec->echoState = 0;
- aec->divergeState = 0;
-
- aec->seed = 777;
- aec->delayEstCtr = 0;
-
- // Features on by default (G.167)
-#ifdef G167
- aec->adaptToggle = 1;
- aec->nlpToggle = 1;
- aec->cnToggle = 1;
-#endif
-
- // Metrics disabled by default
- aec->metricsMode = 0;
- WebRtcAec_InitMetrics(aec);
-
- // Assembly optimization
- WebRtcAec_FilterFar = FilterFar;
- WebRtcAec_ScaleErrorSignal = ScaleErrorSignal;
- WebRtcAec_FilterAdaptation = FilterAdaptation;
- WebRtcAec_OverdriveAndSuppress = OverdriveAndSuppress;
- if (WebRtc_GetCPUInfo(kSSE2)) {
-#if defined(__SSE2__)
- WebRtcAec_InitAec_SSE2();
-#endif
- }
- aec_rdft_init();
-
- return 0;
-}
-
-void WebRtcAec_InitMetrics(aec_t *aec)
-{
- aec->stateCounter = 0;
- WebRtcAec_InitLevel(&aec->farlevel);
- WebRtcAec_InitLevel(&aec->nearlevel);
- WebRtcAec_InitLevel(&aec->linoutlevel);
- WebRtcAec_InitLevel(&aec->nlpoutlevel);
-
- WebRtcAec_InitStats(&aec->erl);
- WebRtcAec_InitStats(&aec->erle);
- WebRtcAec_InitStats(&aec->aNlp);
- WebRtcAec_InitStats(&aec->rerl);
-}
-
-
-void WebRtcAec_ProcessFrame(aec_t *aec, const short *farend,
- const short *nearend, const short *nearendH,
- short *out, short *outH,
- int knownDelay)
-{
- short farBl[PART_LEN], nearBl[PART_LEN], outBl[PART_LEN];
- short farFr[FRAME_LEN];
- // For H band
- short nearBlH[PART_LEN], outBlH[PART_LEN];
-
- int size = 0;
-
- // initialize: only used for SWB
- memset(nearBlH, 0, sizeof(nearBlH));
- memset(outBlH, 0, sizeof(outBlH));
-
- // Buffer the current frame.
- // Fetch an older one corresponding to the delay.
- BufferFar(aec, farend, FRAME_LEN);
- FetchFar(aec, farFr, FRAME_LEN, knownDelay);
-
- // Buffer the synchronized far and near frames,
- // to pass the smaller blocks individually.
- WebRtcApm_WriteBuffer(aec->farFrBuf, farFr, FRAME_LEN);
- WebRtcApm_WriteBuffer(aec->nearFrBuf, nearend, FRAME_LEN);
- // For H band
- if (aec->sampFreq == 32000) {
- WebRtcApm_WriteBuffer(aec->nearFrBufH, nearendH, FRAME_LEN);
- }
-
- // Process as many blocks as possible.
- while (WebRtcApm_get_buffer_size(aec->farFrBuf) >= PART_LEN) {
-
- WebRtcApm_ReadBuffer(aec->farFrBuf, farBl, PART_LEN);
- WebRtcApm_ReadBuffer(aec->nearFrBuf, nearBl, PART_LEN);
-
- // For H band
- if (aec->sampFreq == 32000) {
- WebRtcApm_ReadBuffer(aec->nearFrBufH, nearBlH, PART_LEN);
- }
-
- ProcessBlock(aec, farBl, nearBl, nearBlH, outBl, outBlH);
-
- WebRtcApm_WriteBuffer(aec->outFrBuf, outBl, PART_LEN);
- // For H band
- if (aec->sampFreq == 32000) {
- WebRtcApm_WriteBuffer(aec->outFrBufH, outBlH, PART_LEN);
- }
- }
-
- // Stuff the out buffer if we have less than a frame to output.
- // This should only happen for the first frame.
- size = WebRtcApm_get_buffer_size(aec->outFrBuf);
- if (size < FRAME_LEN) {
- WebRtcApm_StuffBuffer(aec->outFrBuf, FRAME_LEN - size);
- if (aec->sampFreq == 32000) {
- WebRtcApm_StuffBuffer(aec->outFrBufH, FRAME_LEN - size);
- }
- }
-
- // Obtain an output frame.
- WebRtcApm_ReadBuffer(aec->outFrBuf, out, FRAME_LEN);
- // For H band
- if (aec->sampFreq == 32000) {
- WebRtcApm_ReadBuffer(aec->outFrBufH, outH, FRAME_LEN);
- }
-}
-
-static void ProcessBlock(aec_t *aec, const short *farend,
- const short *nearend, const short *nearendH,
- short *output, short *outputH)
-{
- int i;
- float d[PART_LEN], y[PART_LEN], e[PART_LEN], dH[PART_LEN];
- short eInt16[PART_LEN];
- float scale;
-
- float fft[PART_LEN2];
- float xf[2][PART_LEN1], yf[2][PART_LEN1], ef[2][PART_LEN1];
- complex_t df[PART_LEN1];
-
- const float gPow[2] = {0.9f, 0.1f};
-
- // Noise estimate constants.
- const int noiseInitBlocks = 500 * aec->mult;
- const float step = 0.1f;
- const float ramp = 1.0002f;
- const float gInitNoise[2] = {0.999f, 0.001f};
-
-#ifdef AEC_DEBUG
- fwrite(farend, sizeof(short), PART_LEN, aec->farFile);
- fwrite(nearend, sizeof(short), PART_LEN, aec->nearFile);
-#endif
-
- memset(dH, 0, sizeof(dH));
-
- // ---------- Ooura fft ----------
- // Concatenate old and new farend blocks.
- for (i = 0; i < PART_LEN; i++) {
- aec->xBuf[i + PART_LEN] = (float)farend[i];
- d[i] = (float)nearend[i];
- }
-
- if (aec->sampFreq == 32000) {
- for (i = 0; i < PART_LEN; i++) {
- dH[i] = (float)nearendH[i];
- }
- }
-
-
- memcpy(fft, aec->xBuf, sizeof(float) * PART_LEN2);
- memcpy(aec->dBuf + PART_LEN, d, sizeof(float) * PART_LEN);
- // For H band
- if (aec->sampFreq == 32000) {
- memcpy(aec->dBufH + PART_LEN, dH, sizeof(float) * PART_LEN);
- }
-
- aec_rdft_forward_128(fft);
-
- // Far fft
- xf[1][0] = 0;
- xf[1][PART_LEN] = 0;
- xf[0][0] = fft[0];
- xf[0][PART_LEN] = fft[1];
-
- for (i = 1; i < PART_LEN; i++) {
- xf[0][i] = fft[2 * i];
- xf[1][i] = fft[2 * i + 1];
- }
-
- // Near fft
- memcpy(fft, aec->dBuf, sizeof(float) * PART_LEN2);
- aec_rdft_forward_128(fft);
- df[0][1] = 0;
- df[PART_LEN][1] = 0;
- df[0][0] = fft[0];
- df[PART_LEN][0] = fft[1];
-
- for (i = 1; i < PART_LEN; i++) {
- df[i][0] = fft[2 * i];
- df[i][1] = fft[2 * i + 1];
- }
-
- // Power smoothing
- for (i = 0; i < PART_LEN1; i++) {
- aec->xPow[i] = gPow[0] * aec->xPow[i] + gPow[1] * NR_PART *
- (xf[0][i] * xf[0][i] + xf[1][i] * xf[1][i]);
- aec->dPow[i] = gPow[0] * aec->dPow[i] + gPow[1] *
- (df[i][0] * df[i][0] + df[i][1] * df[i][1]);
- }
-
- // Estimate noise power. Wait until dPow is more stable.
- if (aec->noiseEstCtr > 50) {
- for (i = 0; i < PART_LEN1; i++) {
- if (aec->dPow[i] < aec->dMinPow[i]) {
- aec->dMinPow[i] = (aec->dPow[i] + step * (aec->dMinPow[i] -
- aec->dPow[i])) * ramp;
- }
- else {
- aec->dMinPow[i] *= ramp;
- }
- }
- }
-
- // Smooth increasing noise power from zero at the start,
- // to avoid a sudden burst of comfort noise.
- if (aec->noiseEstCtr < noiseInitBlocks) {
- aec->noiseEstCtr++;
- for (i = 0; i < PART_LEN1; i++) {
- if (aec->dMinPow[i] > aec->dInitMinPow[i]) {
- aec->dInitMinPow[i] = gInitNoise[0] * aec->dInitMinPow[i] +
- gInitNoise[1] * aec->dMinPow[i];
- }
- else {
- aec->dInitMinPow[i] = aec->dMinPow[i];
- }
- }
- aec->noisePow = aec->dInitMinPow;
- }
- else {
- aec->noisePow = aec->dMinPow;
- }
-
-
- // Update the xfBuf block position.
- aec->xfBufBlockPos--;
- if (aec->xfBufBlockPos == -1) {
- aec->xfBufBlockPos = NR_PART - 1;
- }
-
- // Buffer xf
- memcpy(aec->xfBuf[0] + aec->xfBufBlockPos * PART_LEN1, xf[0],
- sizeof(float) * PART_LEN1);
- memcpy(aec->xfBuf[1] + aec->xfBufBlockPos * PART_LEN1, xf[1],
- sizeof(float) * PART_LEN1);
-
- memset(yf[0], 0, sizeof(float) * (PART_LEN1 * 2));
-
- // Filter far
- WebRtcAec_FilterFar(aec, yf);
-
- // Inverse fft to obtain echo estimate and error.
- fft[0] = yf[0][0];
- fft[1] = yf[0][PART_LEN];
- for (i = 1; i < PART_LEN; i++) {
- fft[2 * i] = yf[0][i];
- fft[2 * i + 1] = yf[1][i];
- }
- aec_rdft_inverse_128(fft);
-
- scale = 2.0f / PART_LEN2;
- for (i = 0; i < PART_LEN; i++) {
- y[i] = fft[PART_LEN + i] * scale; // fft scaling
- }
-
- for (i = 0; i < PART_LEN; i++) {
- e[i] = d[i] - y[i];
- }
-
- // Error fft
- memcpy(aec->eBuf + PART_LEN, e, sizeof(float) * PART_LEN);
- memset(fft, 0, sizeof(float) * PART_LEN);
- memcpy(fft + PART_LEN, e, sizeof(float) * PART_LEN);
- aec_rdft_forward_128(fft);
-
- ef[1][0] = 0;
- ef[1][PART_LEN] = 0;
- ef[0][0] = fft[0];
- ef[0][PART_LEN] = fft[1];
- for (i = 1; i < PART_LEN; i++) {
- ef[0][i] = fft[2 * i];
- ef[1][i] = fft[2 * i + 1];
- }
-
- // Scale error signal inversely with far power.
- WebRtcAec_ScaleErrorSignal(aec, ef);
-#ifdef G167
- if (aec->adaptToggle) {
-#endif
- // Filter adaptation
- WebRtcAec_FilterAdaptation(aec, fft, ef);
-#ifdef G167
- }
-#endif
-
- NonLinearProcessing(aec, output, outputH);
-
-#if defined(AEC_DEBUG) || defined(G167)
- for (i = 0; i < PART_LEN; i++) {
- eInt16[i] = (short)WEBRTC_SPL_SAT(WEBRTC_SPL_WORD16_MAX, e[i],
- WEBRTC_SPL_WORD16_MIN);
- }
-#endif
-#ifdef G167
- if (aec->nlpToggle == 0) {
- memcpy(output, eInt16, sizeof(eInt16));
- }
-#endif
-
- if (aec->metricsMode == 1) {
- for (i = 0; i < PART_LEN; i++) {
- eInt16[i] = (short)WEBRTC_SPL_SAT(WEBRTC_SPL_WORD16_MAX, e[i],
- WEBRTC_SPL_WORD16_MIN);
- }
-
- // Update power levels and echo metrics
- UpdateLevel(&aec->farlevel, farend);
- UpdateLevel(&aec->nearlevel, nearend);
- UpdateLevel(&aec->linoutlevel, eInt16);
- UpdateLevel(&aec->nlpoutlevel, output);
- UpdateMetrics(aec);
- }
-
-#ifdef AEC_DEBUG
- fwrite(eInt16, sizeof(short), PART_LEN, aec->outLpFile);
- fwrite(output, sizeof(short), PART_LEN, aec->outFile);
-#endif
-}
-
-static void NonLinearProcessing(aec_t *aec, short *output, short *outputH)
-{
- float efw[2][PART_LEN1], dfw[2][PART_LEN1];
- complex_t xfw[PART_LEN1];
- complex_t comfortNoiseHband[PART_LEN1];
- float fft[PART_LEN2];
- float scale, dtmp;
- float nlpGainHband;
- int i, j, pos;
-
- // Coherence and non-linear filter
- float cohde[PART_LEN1], cohxd[PART_LEN1];
- float hNlDeAvg, hNlXdAvg;
- float hNl[PART_LEN1];
- float hNlPref[PREF_BAND_SIZE];
- float hNlFb = 0, hNlFbLow = 0;
- const float prefBandQuant = 0.75f, prefBandQuantLow = 0.5f;
- const int prefBandSize = PREF_BAND_SIZE / aec->mult;
- const int minPrefBand = 4 / aec->mult;
-
- // Near and error power sums
- float sdSum = 0, seSum = 0;
-
- // Power estimate smoothing coefficients
- const float gCoh[2][2] = {{0.9f, 0.1f}, {0.93f, 0.07f}};
- const float *ptrGCoh = gCoh[aec->mult - 1];
-
- // Filter energey
- float wfEnMax = 0, wfEn = 0;
- const int delayEstInterval = 10 * aec->mult;
-
- aec->delayEstCtr++;
- if (aec->delayEstCtr == delayEstInterval) {
- aec->delayEstCtr = 0;
- }
-
- // initialize comfort noise for H band
- memset(comfortNoiseHband, 0, sizeof(comfortNoiseHband));
- nlpGainHband = (float)0.0;
- dtmp = (float)0.0;
-
- // Measure energy in each filter partition to determine delay.
- // TODO: Spread by computing one partition per block?
- if (aec->delayEstCtr == 0) {
- wfEnMax = 0;
- aec->delayIdx = 0;
- for (i = 0; i < NR_PART; i++) {
- pos = i * PART_LEN1;
- wfEn = 0;
- for (j = 0; j < PART_LEN1; j++) {
- wfEn += aec->wfBuf[0][pos + j] * aec->wfBuf[0][pos + j] +
- aec->wfBuf[1][pos + j] * aec->wfBuf[1][pos + j];
- }
-
- if (wfEn > wfEnMax) {
- wfEnMax = wfEn;
- aec->delayIdx = i;
- }
- }
- }
-
- // NLP
- // Windowed far fft
- for (i = 0; i < PART_LEN; i++) {
- fft[i] = aec->xBuf[i] * sqrtHanning[i];
- fft[PART_LEN + i] = aec->xBuf[PART_LEN + i] * sqrtHanning[PART_LEN - i];
- }
- aec_rdft_forward_128(fft);
-
- xfw[0][1] = 0;
- xfw[PART_LEN][1] = 0;
- xfw[0][0] = fft[0];
- xfw[PART_LEN][0] = fft[1];
- for (i = 1; i < PART_LEN; i++) {
- xfw[i][0] = fft[2 * i];
- xfw[i][1] = fft[2 * i + 1];
- }
-
- // Buffer far.
- memcpy(aec->xfwBuf, xfw, sizeof(xfw));
-
- // Use delayed far.
- memcpy(xfw, aec->xfwBuf + aec->delayIdx * PART_LEN1, sizeof(xfw));
-
- // Windowed near fft
- for (i = 0; i < PART_LEN; i++) {
- fft[i] = aec->dBuf[i] * sqrtHanning[i];
- fft[PART_LEN + i] = aec->dBuf[PART_LEN + i] * sqrtHanning[PART_LEN - i];
- }
- aec_rdft_forward_128(fft);
-
- dfw[1][0] = 0;
- dfw[1][PART_LEN] = 0;
- dfw[0][0] = fft[0];
- dfw[0][PART_LEN] = fft[1];
- for (i = 1; i < PART_LEN; i++) {
- dfw[0][i] = fft[2 * i];
- dfw[1][i] = fft[2 * i + 1];
- }
-
- // Windowed error fft
- for (i = 0; i < PART_LEN; i++) {
- fft[i] = aec->eBuf[i] * sqrtHanning[i];
- fft[PART_LEN + i] = aec->eBuf[PART_LEN + i] * sqrtHanning[PART_LEN - i];
- }
- aec_rdft_forward_128(fft);
- efw[1][0] = 0;
- efw[1][PART_LEN] = 0;
- efw[0][0] = fft[0];
- efw[0][PART_LEN] = fft[1];
- for (i = 1; i < PART_LEN; i++) {
- efw[0][i] = fft[2 * i];
- efw[1][i] = fft[2 * i + 1];
- }
-
- // Smoothed PSD
- for (i = 0; i < PART_LEN1; i++) {
- aec->sd[i] = ptrGCoh[0] * aec->sd[i] + ptrGCoh[1] *
- (dfw[0][i] * dfw[0][i] + dfw[1][i] * dfw[1][i]);
- aec->se[i] = ptrGCoh[0] * aec->se[i] + ptrGCoh[1] *
- (efw[0][i] * efw[0][i] + efw[1][i] * efw[1][i]);
- // We threshold here to protect against the ill-effects of a zero farend.
- // The threshold is not arbitrarily chosen, but balances protection and
- // adverse interaction with the algorithm's tuning.
- // TODO: investigate further why this is so sensitive.
- aec->sx[i] = ptrGCoh[0] * aec->sx[i] + ptrGCoh[1] *
- WEBRTC_SPL_MAX(xfw[i][0] * xfw[i][0] + xfw[i][1] * xfw[i][1], 15);
-
- aec->sde[i][0] = ptrGCoh[0] * aec->sde[i][0] + ptrGCoh[1] *
- (dfw[0][i] * efw[0][i] + dfw[1][i] * efw[1][i]);
- aec->sde[i][1] = ptrGCoh[0] * aec->sde[i][1] + ptrGCoh[1] *
- (dfw[0][i] * efw[1][i] - dfw[1][i] * efw[0][i]);
-
- aec->sxd[i][0] = ptrGCoh[0] * aec->sxd[i][0] + ptrGCoh[1] *
- (dfw[0][i] * xfw[i][0] + dfw[1][i] * xfw[i][1]);
- aec->sxd[i][1] = ptrGCoh[0] * aec->sxd[i][1] + ptrGCoh[1] *
- (dfw[0][i] * xfw[i][1] - dfw[1][i] * xfw[i][0]);
-
- sdSum += aec->sd[i];
- seSum += aec->se[i];
- }
-
- // Divergent filter safeguard.
- if (aec->divergeState == 0) {
- if (seSum > sdSum) {
- aec->divergeState = 1;
- }
- }
- else {
- if (seSum * 1.05f < sdSum) {
- aec->divergeState = 0;
- }
- }
-
- if (aec->divergeState == 1) {
- memcpy(efw, dfw, sizeof(efw));
- }
-
- // Reset if error is significantly larger than nearend (13 dB).
- if (seSum > (19.95f * sdSum)) {
- memset(aec->wfBuf, 0, sizeof(aec->wfBuf));
- }
-
- // Subband coherence
- for (i = 0; i < PART_LEN1; i++) {
- cohde[i] = (aec->sde[i][0] * aec->sde[i][0] + aec->sde[i][1] * aec->sde[i][1]) /
- (aec->sd[i] * aec->se[i] + 1e-10f);
- cohxd[i] = (aec->sxd[i][0] * aec->sxd[i][0] + aec->sxd[i][1] * aec->sxd[i][1]) /
- (aec->sx[i] * aec->sd[i] + 1e-10f);
- }
-
- hNlXdAvg = 0;
- for (i = minPrefBand; i < prefBandSize + minPrefBand; i++) {
- hNlXdAvg += cohxd[i];
- }
- hNlXdAvg /= prefBandSize;
- hNlXdAvg = 1 - hNlXdAvg;
-
- hNlDeAvg = 0;
- for (i = minPrefBand; i < prefBandSize + minPrefBand; i++) {
- hNlDeAvg += cohde[i];
- }
- hNlDeAvg /= prefBandSize;
-
- if (hNlXdAvg < 0.75f && hNlXdAvg < aec->hNlXdAvgMin) {
- aec->hNlXdAvgMin = hNlXdAvg;
- }
-
- if (hNlDeAvg > 0.98f && hNlXdAvg > 0.9f) {
- aec->stNearState = 1;
- }
- else if (hNlDeAvg < 0.95f || hNlXdAvg < 0.8f) {
- aec->stNearState = 0;
- }
-
- if (aec->hNlXdAvgMin == 1) {
- aec->echoState = 0;
- aec->overDrive = aec->minOverDrive;
-
- if (aec->stNearState == 1) {
- memcpy(hNl, cohde, sizeof(hNl));
- hNlFb = hNlDeAvg;
- hNlFbLow = hNlDeAvg;
- }
- else {
- for (i = 0; i < PART_LEN1; i++) {
- hNl[i] = 1 - cohxd[i];
- }
- hNlFb = hNlXdAvg;
- hNlFbLow = hNlXdAvg;
- }
- }
- else {
-
- if (aec->stNearState == 1) {
- aec->echoState = 0;
- memcpy(hNl, cohde, sizeof(hNl));
- hNlFb = hNlDeAvg;
- hNlFbLow = hNlDeAvg;
- }
- else {
- aec->echoState = 1;
- for (i = 0; i < PART_LEN1; i++) {
- hNl[i] = WEBRTC_SPL_MIN(cohde[i], 1 - cohxd[i]);
- }
-
- // Select an order statistic from the preferred bands.
- // TODO: Using quicksort now, but a selection algorithm may be preferred.
- memcpy(hNlPref, &hNl[minPrefBand], sizeof(float) * prefBandSize);
- qsort(hNlPref, prefBandSize, sizeof(float), CmpFloat);
- hNlFb = hNlPref[(int)floor(prefBandQuant * (prefBandSize - 1))];
- hNlFbLow = hNlPref[(int)floor(prefBandQuantLow * (prefBandSize - 1))];
- }
- }
-
- // Track the local filter minimum to determine suppression overdrive.
- if (hNlFbLow < 0.6f && hNlFbLow < aec->hNlFbLocalMin) {
- aec->hNlFbLocalMin = hNlFbLow;
- aec->hNlFbMin = hNlFbLow;
- aec->hNlNewMin = 1;
- aec->hNlMinCtr = 0;
- }
- aec->hNlFbLocalMin = WEBRTC_SPL_MIN(aec->hNlFbLocalMin + 0.0008f / aec->mult, 1);
- aec->hNlXdAvgMin = WEBRTC_SPL_MIN(aec->hNlXdAvgMin + 0.0006f / aec->mult, 1);
-
- if (aec->hNlNewMin == 1) {
- aec->hNlMinCtr++;
- }
- if (aec->hNlMinCtr == 2) {
- aec->hNlNewMin = 0;
- aec->hNlMinCtr = 0;
- aec->overDrive = WEBRTC_SPL_MAX(aec->targetSupp /
- ((float)log(aec->hNlFbMin + 1e-10f) + 1e-10f), aec->minOverDrive);
- }
-
- // Smooth the overdrive.
- if (aec->overDrive < aec->overDriveSm) {
- aec->overDriveSm = 0.99f * aec->overDriveSm + 0.01f * aec->overDrive;
- }
- else {
- aec->overDriveSm = 0.9f * aec->overDriveSm + 0.1f * aec->overDrive;
- }
-
- WebRtcAec_OverdriveAndSuppress(aec, hNl, hNlFb, efw);
-
-#ifdef G167
- if (aec->cnToggle) {
- ComfortNoise(aec, efw, comfortNoiseHband, aec->noisePow, hNl);
- }
-#else
- // Add comfort noise.
- ComfortNoise(aec, efw, comfortNoiseHband, aec->noisePow, hNl);
-#endif
-
- // Inverse error fft.
- fft[0] = efw[0][0];
- fft[1] = efw[0][PART_LEN];
- for (i = 1; i < PART_LEN; i++) {
- fft[2*i] = efw[0][i];
- // Sign change required by Ooura fft.
- fft[2*i + 1] = -efw[1][i];
- }
- aec_rdft_inverse_128(fft);
-
- // Overlap and add to obtain output.
- scale = 2.0f / PART_LEN2;
- for (i = 0; i < PART_LEN; i++) {
- fft[i] *= scale; // fft scaling
- fft[i] = fft[i]*sqrtHanning[i] + aec->outBuf[i];
-
- // Saturation protection
- output[i] = (short)WEBRTC_SPL_SAT(WEBRTC_SPL_WORD16_MAX, fft[i],
- WEBRTC_SPL_WORD16_MIN);
-
- fft[PART_LEN + i] *= scale; // fft scaling
- aec->outBuf[i] = fft[PART_LEN + i] * sqrtHanning[PART_LEN - i];
- }
-
- // For H band
- if (aec->sampFreq == 32000) {
-
- // H band gain
- // average nlp over low band: average over second half of freq spectrum
- // (4->8khz)
- GetHighbandGain(hNl, &nlpGainHband);
-
- // Inverse comfort_noise
- if (flagHbandCn == 1) {
- fft[0] = comfortNoiseHband[0][0];
- fft[1] = comfortNoiseHband[PART_LEN][0];
- for (i = 1; i < PART_LEN; i++) {
- fft[2*i] = comfortNoiseHband[i][0];
- fft[2*i + 1] = comfortNoiseHband[i][1];
- }
- aec_rdft_inverse_128(fft);
- scale = 2.0f / PART_LEN2;
- }
-
- // compute gain factor
- for (i = 0; i < PART_LEN; i++) {
- dtmp = (float)aec->dBufH[i];
- dtmp = (float)dtmp * nlpGainHband; // for variable gain
-
- // add some comfort noise where Hband is attenuated
- if (flagHbandCn == 1) {
- fft[i] *= scale; // fft scaling
- dtmp += cnScaleHband * fft[i];
- }
-
- // Saturation protection
- outputH[i] = (short)WEBRTC_SPL_SAT(WEBRTC_SPL_WORD16_MAX, dtmp,
- WEBRTC_SPL_WORD16_MIN);
- }
- }
-
- // Copy the current block to the old position.
- memcpy(aec->xBuf, aec->xBuf + PART_LEN, sizeof(float) * PART_LEN);
- memcpy(aec->dBuf, aec->dBuf + PART_LEN, sizeof(float) * PART_LEN);
- memcpy(aec->eBuf, aec->eBuf + PART_LEN, sizeof(float) * PART_LEN);
-
- // Copy the current block to the old position for H band
- if (aec->sampFreq == 32000) {
- memcpy(aec->dBufH, aec->dBufH + PART_LEN, sizeof(float) * PART_LEN);
- }
-
- memmove(aec->xfwBuf + PART_LEN1, aec->xfwBuf, sizeof(aec->xfwBuf) -
- sizeof(complex_t) * PART_LEN1);
-}
-
-static void GetHighbandGain(const float *lambda, float *nlpGainHband)
-{
- int i;
-
- nlpGainHband[0] = (float)0.0;
- for (i = freqAvgIc; i < PART_LEN1 - 1; i++) {
- nlpGainHband[0] += lambda[i];
- }
- nlpGainHband[0] /= (float)(PART_LEN1 - 1 - freqAvgIc);
-}
-
-static void ComfortNoise(aec_t *aec, float efw[2][PART_LEN1],
- complex_t *comfortNoiseHband, const float *noisePow, const float *lambda)
-{
- int i, num;
- float rand[PART_LEN];
- float noise, noiseAvg, tmp, tmpAvg;
- WebRtc_Word16 randW16[PART_LEN];
- complex_t u[PART_LEN1];
-
- const float pi2 = 6.28318530717959f;
-
- // Generate a uniform random array on [0 1]
- WebRtcSpl_RandUArray(randW16, PART_LEN, &aec->seed);
- for (i = 0; i < PART_LEN; i++) {
- rand[i] = ((float)randW16[i]) / 32768;
- }
-
- // Reject LF noise
- u[0][0] = 0;
- u[0][1] = 0;
- for (i = 1; i < PART_LEN1; i++) {
- tmp = pi2 * rand[i - 1];
-
- noise = sqrtf(noisePow[i]);
- u[i][0] = noise * (float)cos(tmp);
- u[i][1] = -noise * (float)sin(tmp);
- }
- u[PART_LEN][1] = 0;
-
- for (i = 0; i < PART_LEN1; i++) {
- // This is the proper weighting to match the background noise power
- tmp = sqrtf(WEBRTC_SPL_MAX(1 - lambda[i] * lambda[i], 0));
- //tmp = 1 - lambda[i];
- efw[0][i] += tmp * u[i][0];
- efw[1][i] += tmp * u[i][1];
- }
-
- // For H band comfort noise
- // TODO: don't compute noise and "tmp" twice. Use the previous results.
- noiseAvg = 0.0;
- tmpAvg = 0.0;
- num = 0;
- if (aec->sampFreq == 32000 && flagHbandCn == 1) {
-
- // average noise scale
- // average over second half of freq spectrum (i.e., 4->8khz)
- // TODO: we shouldn't need num. We know how many elements we're summing.
- for (i = PART_LEN1 >> 1; i < PART_LEN1; i++) {
- num++;
- noiseAvg += sqrtf(noisePow[i]);
- }
- noiseAvg /= (float)num;
-
- // average nlp scale
- // average over second half of freq spectrum (i.e., 4->8khz)
- // TODO: we shouldn't need num. We know how many elements we're summing.
- num = 0;
- for (i = PART_LEN1 >> 1; i < PART_LEN1; i++) {
- num++;
- tmpAvg += sqrtf(WEBRTC_SPL_MAX(1 - lambda[i] * lambda[i], 0));
- }
- tmpAvg /= (float)num;
-
- // Use average noise for H band
- // TODO: we should probably have a new random vector here.
- // Reject LF noise
- u[0][0] = 0;
- u[0][1] = 0;
- for (i = 1; i < PART_LEN1; i++) {
- tmp = pi2 * rand[i - 1];
-
- // Use average noise for H band
- u[i][0] = noiseAvg * (float)cos(tmp);
- u[i][1] = -noiseAvg * (float)sin(tmp);
- }
- u[PART_LEN][1] = 0;
-
- for (i = 0; i < PART_LEN1; i++) {
- // Use average NLP weight for H band
- comfortNoiseHband[i][0] = tmpAvg * u[i][0];
- comfortNoiseHband[i][1] = tmpAvg * u[i][1];
- }
- }
-}
-
-// Buffer the farend to account for knownDelay
-static void BufferFar(aec_t *aec, const short *farend, int farLen)
-{
- int writeLen = farLen, writePos = 0;
-
- // Check if the write position must be wrapped.
- while (aec->farBufWritePos + writeLen > FAR_BUF_LEN) {
-
- // Write to remaining buffer space before wrapping.
- writeLen = FAR_BUF_LEN - aec->farBufWritePos;
- memcpy(aec->farBuf + aec->farBufWritePos, farend + writePos,
- sizeof(short) * writeLen);
- aec->farBufWritePos = 0;
- writePos = writeLen;
- writeLen = farLen - writeLen;
- }
-
- memcpy(aec->farBuf + aec->farBufWritePos, farend + writePos,
- sizeof(short) * writeLen);
- aec->farBufWritePos += writeLen;
-}
-
-static void FetchFar(aec_t *aec, short *farend, int farLen, int knownDelay)
-{
- int readLen = farLen, readPos = 0, delayChange = knownDelay - aec->knownDelay;
-
- aec->farBufReadPos -= delayChange;
-
- // Check if delay forces a read position wrap.
- while(aec->farBufReadPos < 0) {
- aec->farBufReadPos += FAR_BUF_LEN;
- }
- while(aec->farBufReadPos > FAR_BUF_LEN - 1) {
- aec->farBufReadPos -= FAR_BUF_LEN;
- }
-
- aec->knownDelay = knownDelay;
-
- // Check if read position must be wrapped.
- while (aec->farBufReadPos + readLen > FAR_BUF_LEN) {
-
- // Read from remaining buffer space before wrapping.
- readLen = FAR_BUF_LEN - aec->farBufReadPos;
- memcpy(farend + readPos, aec->farBuf + aec->farBufReadPos,
- sizeof(short) * readLen);
- aec->farBufReadPos = 0;
- readPos = readLen;
- readLen = farLen - readLen;
- }
- memcpy(farend + readPos, aec->farBuf + aec->farBufReadPos,
- sizeof(short) * readLen);
- aec->farBufReadPos += readLen;
-}
-
-static void WebRtcAec_InitLevel(power_level_t *level)
-{
- const float bigFloat = 1E17f;
-
- level->averagelevel = 0;
- level->framelevel = 0;
- level->minlevel = bigFloat;
- level->frsum = 0;
- level->sfrsum = 0;
- level->frcounter = 0;
- level->sfrcounter = 0;
-}
-
-static void WebRtcAec_InitStats(stats_t *stats)
-{
- stats->instant = offsetLevel;
- stats->average = offsetLevel;
- stats->max = offsetLevel;
- stats->min = offsetLevel * (-1);
- stats->sum = 0;
- stats->hisum = 0;
- stats->himean = offsetLevel;
- stats->counter = 0;
- stats->hicounter = 0;
-}
-
-static void UpdateLevel(power_level_t *level, const short *in)
-{
- int k;
-
- for (k = 0; k < PART_LEN; k++) {
- level->sfrsum += in[k] * in[k];
- }
- level->sfrcounter++;
-
- if (level->sfrcounter > subCountLen) {
- level->framelevel = level->sfrsum / (subCountLen * PART_LEN);
- level->sfrsum = 0;
- level->sfrcounter = 0;
-
- if (level->framelevel > 0) {
- if (level->framelevel < level->minlevel) {
- level->minlevel = level->framelevel; // New minimum
- } else {
- level->minlevel *= (1 + 0.001f); // Small increase
- }
- }
- level->frcounter++;
- level->frsum += level->framelevel;
-
- if (level->frcounter > countLen) {
- level->averagelevel = level->frsum / countLen;
- level->frsum = 0;
- level->frcounter = 0;
- }
-
- }
-}
-
-static void UpdateMetrics(aec_t *aec)
-{
- float dtmp, dtmp2, dtmp3;
-
- const float actThresholdNoisy = 8.0f;
- const float actThresholdClean = 40.0f;
- const float safety = 0.99995f;
- const float noisyPower = 300000.0f;
-
- float actThreshold;
- float echo, suppressedEcho;
-
- if (aec->echoState) { // Check if echo is likely present
- aec->stateCounter++;
- }
-
- if (aec->farlevel.frcounter == countLen) {
-
- if (aec->farlevel.minlevel < noisyPower) {
- actThreshold = actThresholdClean;
- }
- else {
- actThreshold = actThresholdNoisy;
- }
-
- if ((aec->stateCounter > (0.5f * countLen * subCountLen))
- && (aec->farlevel.sfrcounter == 0)
-
- // Estimate in active far-end segments only
- && (aec->farlevel.averagelevel > (actThreshold * aec->farlevel.minlevel))
- ) {
-
- // Subtract noise power
- echo = aec->nearlevel.averagelevel - safety * aec->nearlevel.minlevel;
-
- // ERL
- dtmp = 10 * (float)log10(aec->farlevel.averagelevel /
- aec->nearlevel.averagelevel + 1e-10f);
- dtmp2 = 10 * (float)log10(aec->farlevel.averagelevel / echo + 1e-10f);
-
- aec->erl.instant = dtmp;
- if (dtmp > aec->erl.max) {
- aec->erl.max = dtmp;
- }
-
- if (dtmp < aec->erl.min) {
- aec->erl.min = dtmp;
- }
-
- aec->erl.counter++;
- aec->erl.sum += dtmp;
- aec->erl.average = aec->erl.sum / aec->erl.counter;
-
- // Upper mean
- if (dtmp > aec->erl.average) {
- aec->erl.hicounter++;
- aec->erl.hisum += dtmp;
- aec->erl.himean = aec->erl.hisum / aec->erl.hicounter;
- }
-
- // A_NLP
- dtmp = 10 * (float)log10(aec->nearlevel.averagelevel /
- aec->linoutlevel.averagelevel + 1e-10f);
-
- // subtract noise power
- suppressedEcho = aec->linoutlevel.averagelevel - safety * aec->linoutlevel.minlevel;
-
- dtmp2 = 10 * (float)log10(echo / suppressedEcho + 1e-10f);
- dtmp3 = 10 * (float)log10(aec->nearlevel.averagelevel / suppressedEcho + 1e-10f);
-
- aec->aNlp.instant = dtmp2;
- if (dtmp > aec->aNlp.max) {
- aec->aNlp.max = dtmp;
- }
-
- if (dtmp < aec->aNlp.min) {
- aec->aNlp.min = dtmp;
- }
-
- aec->aNlp.counter++;
- aec->aNlp.sum += dtmp;
- aec->aNlp.average = aec->aNlp.sum / aec->aNlp.counter;
-
- // Upper mean
- if (dtmp > aec->aNlp.average) {
- aec->aNlp.hicounter++;
- aec->aNlp.hisum += dtmp;
- aec->aNlp.himean = aec->aNlp.hisum / aec->aNlp.hicounter;
- }
-
- // ERLE
-
- // subtract noise power
- suppressedEcho = aec->nlpoutlevel.averagelevel - safety * aec->nlpoutlevel.minlevel;
-
- dtmp = 10 * (float)log10(aec->nearlevel.averagelevel /
- aec->nlpoutlevel.averagelevel + 1e-10f);
- dtmp2 = 10 * (float)log10(echo / suppressedEcho + 1e-10f);
-
- dtmp = dtmp2;
- aec->erle.instant = dtmp;
- if (dtmp > aec->erle.max) {
- aec->erle.max = dtmp;
- }
-
- if (dtmp < aec->erle.min) {
- aec->erle.min = dtmp;
- }
-
- aec->erle.counter++;
- aec->erle.sum += dtmp;
- aec->erle.average = aec->erle.sum / aec->erle.counter;
-
- // Upper mean
- if (dtmp > aec->erle.average) {
- aec->erle.hicounter++;
- aec->erle.hisum += dtmp;
- aec->erle.himean = aec->erle.hisum / aec->erle.hicounter;
- }
- }
-
- aec->stateCounter = 0;
- }
-}
-
diff --git a/src/modules/audio_processing/aec/main/source/aec_core.h b/src/modules/audio_processing/aec/main/source/aec_core.h
deleted file mode 100644
index 3386b92..0000000
--- a/src/modules/audio_processing/aec/main/source/aec_core.h
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-/*
- * Specifies the interface for the AEC core.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_SOURCE_AEC_CORE_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_SOURCE_AEC_CORE_H_
-
-#include <stdio.h>
-#include "typedefs.h"
-#include "signal_processing_library.h"
-
-//#define G167 // for running G167 tests
-//#define UNCONSTR // time-unconstrained filter
-//#define AEC_DEBUG // for recording files
-
-#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 NR_PART 12 // Number of partitions
-#define FILT_LEN (PART_LEN * NR_PART) // Filter length
-#define FILT_LEN2 (FILT_LEN * 2) // Double filter length
-#define FAR_BUF_LEN (FILT_LEN2 * 2)
-#define PREF_BAND_SIZE 24
-
-#define BLOCKL_MAX FRAME_LEN
-
-typedef float complex_t[2];
-// For performance reasons, some arrays of complex numbers are replaced by twice
-// as long arrays of float, all the real parts followed by all the imaginary
-// ones (complex_t[SIZE] -> float[2][SIZE]). This allows SIMD optimizations and
-// is better than two arrays (one for the real parts and one for the imaginary
-// parts) as this other way would require two pointers instead of one and cause
-// extra register spilling. This also allows the offsets to be calculated at
-// compile time.
-
-// Metrics
-enum {offsetLevel = -100};
-
-typedef struct {
- float sfrsum;
- int sfrcounter;
- float framelevel;
- float frsum;
- int frcounter;
- float minlevel;
- float averagelevel;
-} power_level_t;
-
-typedef struct {
- float instant;
- float average;
- float min;
- float max;
- float sum;
- float hisum;
- float himean;
- int counter;
- int hicounter;
-} stats_t;
-
-typedef struct {
- int farBufWritePos, farBufReadPos;
-
- int knownDelay;
- int inSamples, outSamples;
- int delayEstCtr;
-
- void *farFrBuf, *nearFrBuf, *outFrBuf;
-
- void *nearFrBufH;
- void *outFrBufH;
-
- float xBuf[PART_LEN2]; // farend
- float dBuf[PART_LEN2]; // nearend
- float eBuf[PART_LEN2]; // error
-
- float dBufH[PART_LEN2]; // nearend
-
- float xPow[PART_LEN1];
- float dPow[PART_LEN1];
- float dMinPow[PART_LEN1];
- float dInitMinPow[PART_LEN1];
- float *noisePow;
-#ifdef FFTW
- float fftR[PART_LEN2];
- fftw_complex fftC[PART_LEN2];
- fftw_plan fftPlan, ifftPlan;
-
- fftw_complex xfBuf[NR_PART * PART_LEN1];
- fftw_complex wfBuf[NR_PART * PART_LEN1];
- fftw_complex sde[PART_LEN1];
-#else
- 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
-#endif
- float sx[PART_LEN1], sd[PART_LEN1], se[PART_LEN1]; // far, near and error psd
- float hNs[PART_LEN1];
- float hNlFbMin, hNlFbLocalMin;
- float hNlXdAvgMin;
- int hNlNewMin, hNlMinCtr;
- float overDrive, overDriveSm;
- float targetSupp, minOverDrive;
- float outBuf[PART_LEN];
- int delayIdx;
-
- short stNearState, echoState;
- short divergeState;
-
- int xfBufBlockPos;
-
- short farBuf[FILT_LEN2 * 2];
-
- short mult; // sampling frequency multiple
- int sampFreq;
- WebRtc_UWord32 seed;
-
- float mu; // stepsize
- float errThresh; // error threshold
-
- int noiseEstCtr;
-
- // Toggles for G.167 testing
-#ifdef G167
- short adaptToggle; // Filter adaptation
- short nlpToggle; // Nonlinear processing
- short cnToggle; // Comfort noise
-#endif
-
- power_level_t farlevel;
- power_level_t nearlevel;
- power_level_t linoutlevel;
- power_level_t nlpoutlevel;
-
- int metricsMode;
- int stateCounter;
- stats_t erl;
- stats_t erle;
- stats_t aNlp;
- 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
-
-#ifdef AEC_DEBUG
- FILE *farFile;
- FILE *nearFile;
- FILE *outFile;
- FILE *outLpFile;
-#endif
-} aec_t;
-
-typedef void (*WebRtcAec_FilterFar_t)(aec_t *aec, float yf[2][PART_LEN1]);
-extern WebRtcAec_FilterFar_t WebRtcAec_FilterFar;
-typedef void (*WebRtcAec_ScaleErrorSignal_t)(aec_t *aec, float ef[2][PART_LEN1]);
-extern WebRtcAec_ScaleErrorSignal_t WebRtcAec_ScaleErrorSignal;
-#define IP_LEN PART_LEN // this must be at least ceil(2 + sqrt(PART_LEN))
-#define W_LEN PART_LEN
-typedef void (*WebRtcAec_FilterAdaptation_t)
- (aec_t *aec, float *fft, float ef[2][PART_LEN1]);
-extern WebRtcAec_FilterAdaptation_t WebRtcAec_FilterAdaptation;
-typedef void (*WebRtcAec_OverdriveAndSuppress_t)
- (aec_t *aec, float hNl[PART_LEN1], const float hNlFb, float efw[2][PART_LEN1]);
-extern WebRtcAec_OverdriveAndSuppress_t WebRtcAec_OverdriveAndSuppress;
-
-int WebRtcAec_CreateAec(aec_t **aec);
-int WebRtcAec_FreeAec(aec_t *aec);
-int WebRtcAec_InitAec(aec_t *aec, int sampFreq);
-void WebRtcAec_InitAec_SSE2(void);
-
-void WebRtcAec_InitMetrics(aec_t *aec);
-void WebRtcAec_ProcessFrame(aec_t *aec, const short *farend,
- const short *nearend, const short *nearendH,
- short *out, short *outH,
- int knownDelay);
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_SOURCE_AEC_CORE_H_
-
diff --git a/src/modules/audio_processing/aec/main/source/aec_core_sse2.c b/src/modules/audio_processing/aec/main/source/aec_core_sse2.c
deleted file mode 100644
index 524669f..0000000
--- a/src/modules/audio_processing/aec/main/source/aec_core_sse2.c
+++ /dev/null
@@ -1,435 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-/*
- * The core AEC algorithm, SSE2 version of speed-critical functions.
- */
-
-#if defined(__SSE2__)
-#include <emmintrin.h>
-#include <math.h>
-
-#include "aec_core.h"
-#include "aec_rdft.h"
-
-__inline static float MulRe(float aRe, float aIm, float bRe, float bIm)
-{
- return aRe * bRe - aIm * bIm;
-}
-
-__inline static float MulIm(float aRe, float aIm, float bRe, float bIm)
-{
- return aRe * bIm + aIm * bRe;
-}
-
-static void FilterFarSSE2(aec_t *aec, float yf[2][PART_LEN1])
-{
- int i;
- for (i = 0; i < NR_PART; i++) {
- int j;
- int xPos = (i + aec->xfBufBlockPos) * PART_LEN1;
- int pos = i * PART_LEN1;
- // Check for wrap
- if (i + aec->xfBufBlockPos >= NR_PART) {
- xPos -= NR_PART*(PART_LEN1);
- }
-
- // vectorized code (four at once)
- for (j = 0; j + 3 < PART_LEN1; j += 4) {
- const __m128 xfBuf_re = _mm_loadu_ps(&aec->xfBuf[0][xPos + j]);
- const __m128 xfBuf_im = _mm_loadu_ps(&aec->xfBuf[1][xPos + j]);
- const __m128 wfBuf_re = _mm_loadu_ps(&aec->wfBuf[0][pos + j]);
- const __m128 wfBuf_im = _mm_loadu_ps(&aec->wfBuf[1][pos + j]);
- const __m128 yf_re = _mm_loadu_ps(&yf[0][j]);
- const __m128 yf_im = _mm_loadu_ps(&yf[1][j]);
- const __m128 a = _mm_mul_ps(xfBuf_re, wfBuf_re);
- const __m128 b = _mm_mul_ps(xfBuf_im, wfBuf_im);
- const __m128 c = _mm_mul_ps(xfBuf_re, wfBuf_im);
- const __m128 d = _mm_mul_ps(xfBuf_im, wfBuf_re);
- const __m128 e = _mm_sub_ps(a, b);
- const __m128 f = _mm_add_ps(c, d);
- const __m128 g = _mm_add_ps(yf_re, e);
- const __m128 h = _mm_add_ps(yf_im, f);
- _mm_storeu_ps(&yf[0][j], g);
- _mm_storeu_ps(&yf[1][j], h);
- }
- // scalar code for the remaining items.
- for (; j < PART_LEN1; j++) {
- yf[0][j] += MulRe(aec->xfBuf[0][xPos + j], aec->xfBuf[1][xPos + j],
- aec->wfBuf[0][ pos + j], aec->wfBuf[1][ pos + j]);
- yf[1][j] += MulIm(aec->xfBuf[0][xPos + j], aec->xfBuf[1][xPos + j],
- aec->wfBuf[0][ pos + j], aec->wfBuf[1][ pos + j]);
- }
- }
-}
-
-static void ScaleErrorSignalSSE2(aec_t *aec, float ef[2][PART_LEN1])
-{
- const __m128 k1e_10f = _mm_set1_ps(1e-10f);
- const __m128 kThresh = _mm_set1_ps(aec->errThresh);
- const __m128 kMu = _mm_set1_ps(aec->mu);
-
- int i;
- // vectorized code (four at once)
- for (i = 0; i + 3 < PART_LEN1; i += 4) {
- const __m128 xPow = _mm_loadu_ps(&aec->xPow[i]);
- const __m128 ef_re_base = _mm_loadu_ps(&ef[0][i]);
- const __m128 ef_im_base = _mm_loadu_ps(&ef[1][i]);
-
- const __m128 xPowPlus = _mm_add_ps(xPow, k1e_10f);
- __m128 ef_re = _mm_div_ps(ef_re_base, xPowPlus);
- __m128 ef_im = _mm_div_ps(ef_im_base, xPowPlus);
- const __m128 ef_re2 = _mm_mul_ps(ef_re, ef_re);
- const __m128 ef_im2 = _mm_mul_ps(ef_im, ef_im);
- const __m128 ef_sum2 = _mm_add_ps(ef_re2, ef_im2);
- const __m128 absEf = _mm_sqrt_ps(ef_sum2);
- const __m128 bigger = _mm_cmpgt_ps(absEf, kThresh);
- __m128 absEfPlus = _mm_add_ps(absEf, k1e_10f);
- const __m128 absEfInv = _mm_div_ps(kThresh, absEfPlus);
- __m128 ef_re_if = _mm_mul_ps(ef_re, absEfInv);
- __m128 ef_im_if = _mm_mul_ps(ef_im, absEfInv);
- ef_re_if = _mm_and_ps(bigger, ef_re_if);
- ef_im_if = _mm_and_ps(bigger, ef_im_if);
- ef_re = _mm_andnot_ps(bigger, ef_re);
- ef_im = _mm_andnot_ps(bigger, ef_im);
- ef_re = _mm_or_ps(ef_re, ef_re_if);
- ef_im = _mm_or_ps(ef_im, ef_im_if);
- ef_re = _mm_mul_ps(ef_re, kMu);
- ef_im = _mm_mul_ps(ef_im, kMu);
-
- _mm_storeu_ps(&ef[0][i], ef_re);
- _mm_storeu_ps(&ef[1][i], ef_im);
- }
- // scalar code for the remaining items.
- for (; i < (PART_LEN1); i++) {
- float absEf;
- ef[0][i] /= (aec->xPow[i] + 1e-10f);
- ef[1][i] /= (aec->xPow[i] + 1e-10f);
- absEf = sqrtf(ef[0][i] * ef[0][i] + ef[1][i] * ef[1][i]);
-
- if (absEf > aec->errThresh) {
- absEf = aec->errThresh / (absEf + 1e-10f);
- ef[0][i] *= absEf;
- ef[1][i] *= absEf;
- }
-
- // Stepsize factor
- ef[0][i] *= aec->mu;
- ef[1][i] *= aec->mu;
- }
-}
-
-static void FilterAdaptationSSE2(aec_t *aec, float *fft, float ef[2][PART_LEN1]) {
- int i, j;
- for (i = 0; i < NR_PART; i++) {
- int xPos = (i + aec->xfBufBlockPos)*(PART_LEN1);
- int pos = i * PART_LEN1;
- // Check for wrap
- if (i + aec->xfBufBlockPos >= NR_PART) {
- xPos -= NR_PART * PART_LEN1;
- }
-
-#ifdef UNCONSTR
- for (j = 0; j < PART_LEN1; j++) {
- aec->wfBuf[pos + j][0] += MulRe(aec->xfBuf[xPos + j][0],
- -aec->xfBuf[xPos + j][1],
- ef[j][0], ef[j][1]);
- aec->wfBuf[pos + j][1] += MulIm(aec->xfBuf[xPos + j][0],
- -aec->xfBuf[xPos + j][1],
- ef[j][0], ef[j][1]);
- }
-#else
- // Process the whole array...
- for (j = 0; j < PART_LEN; j+= 4) {
- // Load xfBuf and ef.
- const __m128 xfBuf_re = _mm_loadu_ps(&aec->xfBuf[0][xPos + j]);
- const __m128 xfBuf_im = _mm_loadu_ps(&aec->xfBuf[1][xPos + j]);
- const __m128 ef_re = _mm_loadu_ps(&ef[0][j]);
- const __m128 ef_im = _mm_loadu_ps(&ef[1][j]);
- // Calculate the product of conjugate(xfBuf) by ef.
- // re(conjugate(a) * b) = aRe * bRe + aIm * bIm
- // im(conjugate(a) * b)= aRe * bIm - aIm * bRe
- const __m128 a = _mm_mul_ps(xfBuf_re, ef_re);
- const __m128 b = _mm_mul_ps(xfBuf_im, ef_im);
- const __m128 c = _mm_mul_ps(xfBuf_re, ef_im);
- const __m128 d = _mm_mul_ps(xfBuf_im, ef_re);
- const __m128 e = _mm_add_ps(a, b);
- const __m128 f = _mm_sub_ps(c, d);
- // Interleave real and imaginary parts.
- const __m128 g = _mm_unpacklo_ps(e, f);
- const __m128 h = _mm_unpackhi_ps(e, f);
- // Store
- _mm_storeu_ps(&fft[2*j + 0], g);
- _mm_storeu_ps(&fft[2*j + 4], h);
- }
- // ... and fixup the first imaginary entry.
- fft[1] = MulRe(aec->xfBuf[0][xPos + PART_LEN],
- -aec->xfBuf[1][xPos + PART_LEN],
- ef[0][PART_LEN], ef[1][PART_LEN]);
-
- aec_rdft_inverse_128(fft);
- memset(fft + PART_LEN, 0, sizeof(float)*PART_LEN);
-
- // fft scaling
- {
- float scale = 2.0f / PART_LEN2;
- const __m128 scale_ps = _mm_load_ps1(&scale);
- for (j = 0; j < PART_LEN; j+=4) {
- const __m128 fft_ps = _mm_loadu_ps(&fft[j]);
- const __m128 fft_scale = _mm_mul_ps(fft_ps, scale_ps);
- _mm_storeu_ps(&fft[j], fft_scale);
- }
- }
- aec_rdft_forward_128(fft);
-
- {
- float wt1 = aec->wfBuf[1][pos];
- aec->wfBuf[0][pos + PART_LEN] += fft[1];
- for (j = 0; j < PART_LEN; j+= 4) {
- __m128 wtBuf_re = _mm_loadu_ps(&aec->wfBuf[0][pos + j]);
- __m128 wtBuf_im = _mm_loadu_ps(&aec->wfBuf[1][pos + j]);
- const __m128 fft0 = _mm_loadu_ps(&fft[2 * j + 0]);
- const __m128 fft4 = _mm_loadu_ps(&fft[2 * j + 4]);
- const __m128 fft_re = _mm_shuffle_ps(fft0, fft4, _MM_SHUFFLE(2, 0, 2 ,0));
- const __m128 fft_im = _mm_shuffle_ps(fft0, fft4, _MM_SHUFFLE(3, 1, 3 ,1));
- wtBuf_re = _mm_add_ps(wtBuf_re, fft_re);
- wtBuf_im = _mm_add_ps(wtBuf_im, fft_im);
- _mm_storeu_ps(&aec->wfBuf[0][pos + j], wtBuf_re);
- _mm_storeu_ps(&aec->wfBuf[1][pos + j], wtBuf_im);
- }
- aec->wfBuf[1][pos] = wt1;
- }
-#endif // UNCONSTR
- }
-}
-
-#ifdef _MSC_VER /* visual c++ */
-# define ALIGN16_BEG __declspec(align(16))
-# define ALIGN16_END
-#else /* gcc or icc */
-# define ALIGN16_BEG
-# define ALIGN16_END __attribute__((aligned(16)))
-#endif
-
-static __m128 mm_pow_ps(__m128 a, __m128 b)
-{
- // a^b = exp2(b * log2(a))
- // exp2(x) and log2(x) are calculated using polynomial approximations.
- __m128 log2_a, b_log2_a, a_exp_b;
-
- // Calculate log2(x), x = a.
- {
- // To calculate log2(x), we decompose x like this:
- // x = y * 2^n
- // n is an integer
- // y is in the [1.0, 2.0) range
- //
- // log2(x) = log2(y) + n
- // n can be evaluated by playing with float representation.
- // log2(y) in a small range can be approximated, this code uses an order
- // five polynomial approximation. The coefficients have been
- // estimated with the Remez algorithm and the resulting
- // polynomial has a maximum relative error of 0.00086%.
-
- // Compute n.
- // This is done by masking the exponent, shifting it into the top bit of
- // the mantissa, putting eight into the biased exponent (to shift/
- // compensate the fact that the exponent has been shifted in the top/
- // fractional part and finally getting rid of the implicit leading one
- // from the mantissa by substracting it out.
- static const ALIGN16_BEG int float_exponent_mask[4] ALIGN16_END =
- {0x7F800000, 0x7F800000, 0x7F800000, 0x7F800000};
- static const ALIGN16_BEG int eight_biased_exponent[4] ALIGN16_END =
- {0x43800000, 0x43800000, 0x43800000, 0x43800000};
- static const ALIGN16_BEG int implicit_leading_one[4] ALIGN16_END =
- {0x43BF8000, 0x43BF8000, 0x43BF8000, 0x43BF8000};
- static const int shift_exponent_into_top_mantissa = 8;
- const __m128 two_n = _mm_and_ps(a, *((__m128 *)float_exponent_mask));
- const __m128 n_1 = (__m128)_mm_srli_epi32((__m128i)two_n,
- shift_exponent_into_top_mantissa);
- const __m128 n_0 = _mm_or_ps(
- (__m128)n_1, *((__m128 *)eight_biased_exponent));
- const __m128 n = _mm_sub_ps(n_0, *((__m128 *)implicit_leading_one));
-
- // Compute y.
- static const ALIGN16_BEG int mantissa_mask[4] ALIGN16_END =
- {0x007FFFFF, 0x007FFFFF, 0x007FFFFF, 0x007FFFFF};
- static const ALIGN16_BEG int zero_biased_exponent_is_one[4] ALIGN16_END =
- {0x3F800000, 0x3F800000, 0x3F800000, 0x3F800000};
- const __m128 mantissa = _mm_and_ps(a, *((__m128 *)mantissa_mask));
- const __m128 y = _mm_or_ps(
- mantissa, *((__m128 *)zero_biased_exponent_is_one));
-
- // Approximate log2(y) ~= (y - 1) * pol5(y).
- // pol5(y) = C5 * y^5 + C4 * y^4 + C3 * y^3 + C2 * y^2 + C1 * y + C0
- static const ALIGN16_BEG float ALIGN16_END C5[4] =
- {-3.4436006e-2f, -3.4436006e-2f, -3.4436006e-2f, -3.4436006e-2f};
- static const ALIGN16_BEG float ALIGN16_END C4[4] =
- {3.1821337e-1f, 3.1821337e-1f, 3.1821337e-1f, 3.1821337e-1f};
- static const ALIGN16_BEG float ALIGN16_END C3[4] =
- {-1.2315303f, -1.2315303f, -1.2315303f, -1.2315303f};
- static const ALIGN16_BEG float ALIGN16_END C2[4] =
- {2.5988452f, 2.5988452f, 2.5988452f, 2.5988452f};
- static const ALIGN16_BEG float ALIGN16_END C1[4] =
- {-3.3241990f, -3.3241990f, -3.3241990f, -3.3241990f};
- static const ALIGN16_BEG float ALIGN16_END C0[4] =
- {3.1157899f, 3.1157899f, 3.1157899f, 3.1157899f};
- const __m128 pol5_y_0 = _mm_mul_ps(y, *((__m128 *)C5));
- const __m128 pol5_y_1 = _mm_add_ps(pol5_y_0, *((__m128 *)C4));
- const __m128 pol5_y_2 = _mm_mul_ps(pol5_y_1, y);
- const __m128 pol5_y_3 = _mm_add_ps(pol5_y_2, *((__m128 *)C3));
- const __m128 pol5_y_4 = _mm_mul_ps(pol5_y_3, y);
- const __m128 pol5_y_5 = _mm_add_ps(pol5_y_4, *((__m128 *)C2));
- const __m128 pol5_y_6 = _mm_mul_ps(pol5_y_5, y);
- const __m128 pol5_y_7 = _mm_add_ps(pol5_y_6, *((__m128 *)C1));
- const __m128 pol5_y_8 = _mm_mul_ps(pol5_y_7, y);
- const __m128 pol5_y = _mm_add_ps(pol5_y_8, *((__m128 *)C0));
- const __m128 y_minus_one = _mm_sub_ps(
- y, *((__m128 *)zero_biased_exponent_is_one));
- const __m128 log2_y = _mm_mul_ps(y_minus_one , pol5_y);
-
- // Combine parts.
- log2_a = _mm_add_ps(n, log2_y);
- }
-
- // b * log2(a)
- b_log2_a = _mm_mul_ps(b, log2_a);
-
- // Calculate exp2(x), x = b * log2(a).
- {
- // To calculate 2^x, we decompose x like this:
- // x = n + y
- // n is an integer, the value of x - 0.5 rounded down, therefore
- // y is in the [0.5, 1.5) range
- //
- // 2^x = 2^n * 2^y
- // 2^n can be evaluated by playing with float representation.
- // 2^y in a small range can be approximated, this code uses an order two
- // polynomial approximation. The coefficients have been estimated
- // with the Remez algorithm and the resulting polynomial has a
- // maximum relative error of 0.17%.
-
- // To avoid over/underflow, we reduce the range of input to ]-127, 129].
- static const ALIGN16_BEG float max_input[4] ALIGN16_END =
- {129.f, 129.f, 129.f, 129.f};
- static const ALIGN16_BEG float min_input[4] ALIGN16_END =
- {-126.99999f, -126.99999f, -126.99999f, -126.99999f};
- const __m128 x_min = _mm_min_ps(b_log2_a, *((__m128 *)max_input));
- const __m128 x_max = _mm_max_ps(x_min, *((__m128 *)min_input));
- // Compute n.
- static const ALIGN16_BEG float half[4] ALIGN16_END =
- {0.5f, 0.5f, 0.5f, 0.5f};
- const __m128 x_minus_half = _mm_sub_ps(x_max, *((__m128 *)half));
- const __m128i x_minus_half_floor = _mm_cvtps_epi32(x_minus_half);
- // Compute 2^n.
- static const ALIGN16_BEG int float_exponent_bias[4] ALIGN16_END =
- {127, 127, 127, 127};
- static const int float_exponent_shift = 23;
- const __m128i two_n_exponent = _mm_add_epi32(
- x_minus_half_floor, *((__m128i *)float_exponent_bias));
- const __m128 two_n = (__m128)_mm_slli_epi32(
- two_n_exponent, float_exponent_shift);
- // Compute y.
- const __m128 y = _mm_sub_ps(x_max, _mm_cvtepi32_ps(x_minus_half_floor));
- // Approximate 2^y ~= C2 * y^2 + C1 * y + C0.
- static const ALIGN16_BEG float C2[4] ALIGN16_END =
- {3.3718944e-1f, 3.3718944e-1f, 3.3718944e-1f, 3.3718944e-1f};
- static const ALIGN16_BEG float C1[4] ALIGN16_END =
- {6.5763628e-1f, 6.5763628e-1f, 6.5763628e-1f, 6.5763628e-1f};
- static const ALIGN16_BEG float C0[4] ALIGN16_END =
- {1.0017247f, 1.0017247f, 1.0017247f, 1.0017247f};
- const __m128 exp2_y_0 = _mm_mul_ps(y, *((__m128 *)C2));
- const __m128 exp2_y_1 = _mm_add_ps(exp2_y_0, *((__m128 *)C1));
- const __m128 exp2_y_2 = _mm_mul_ps(exp2_y_1, y);
- const __m128 exp2_y = _mm_add_ps(exp2_y_2, *((__m128 *)C0));
-
- // Combine parts.
- a_exp_b = _mm_mul_ps(exp2_y, two_n);
- }
- return a_exp_b;
-}
-
-extern const float WebRtcAec_weightCurve[65];
-extern const float WebRtcAec_overDriveCurve[65];
-
-static void OverdriveAndSuppressSSE2(aec_t *aec, float hNl[PART_LEN1],
- const float hNlFb,
- float efw[2][PART_LEN1]) {
- int i;
- const __m128 vec_hNlFb = _mm_set1_ps(hNlFb);
- const __m128 vec_one = _mm_set1_ps(1.0f);
- const __m128 vec_minus_one = _mm_set1_ps(-1.0f);
- const __m128 vec_overDriveSm = _mm_set1_ps(aec->overDriveSm);
- // vectorized code (four at once)
- for (i = 0; i + 3 < PART_LEN1; i+=4) {
- // Weight subbands
- __m128 vec_hNl = _mm_loadu_ps(&hNl[i]);
- const __m128 vec_weightCurve = _mm_loadu_ps(&WebRtcAec_weightCurve[i]);
- const __m128 bigger = _mm_cmpgt_ps(vec_hNl, vec_hNlFb);
- const __m128 vec_weightCurve_hNlFb = _mm_mul_ps(
- vec_weightCurve, vec_hNlFb);
- const __m128 vec_one_weightCurve = _mm_sub_ps(vec_one, vec_weightCurve);
- const __m128 vec_one_weightCurve_hNl = _mm_mul_ps(
- vec_one_weightCurve, vec_hNl);
- const __m128 vec_if0 = _mm_andnot_ps(bigger, vec_hNl);
- const __m128 vec_if1 = _mm_and_ps(
- bigger, _mm_add_ps(vec_weightCurve_hNlFb, vec_one_weightCurve_hNl));
- vec_hNl = _mm_or_ps(vec_if0, vec_if1);
-
- {
- const __m128 vec_overDriveCurve = _mm_loadu_ps(
- &WebRtcAec_overDriveCurve[i]);
- const __m128 vec_overDriveSm_overDriveCurve = _mm_mul_ps(
- vec_overDriveSm, vec_overDriveCurve);
- vec_hNl = mm_pow_ps(vec_hNl, vec_overDriveSm_overDriveCurve);
- _mm_storeu_ps(&hNl[i], vec_hNl);
- }
-
- // Suppress error signal
- {
- __m128 vec_efw_re = _mm_loadu_ps(&efw[0][i]);
- __m128 vec_efw_im = _mm_loadu_ps(&efw[1][i]);
- vec_efw_re = _mm_mul_ps(vec_efw_re, vec_hNl);
- vec_efw_im = _mm_mul_ps(vec_efw_im, vec_hNl);
-
- // Ooura fft returns incorrect sign on imaginary component. It matters
- // here because we are making an additive change with comfort noise.
- vec_efw_im = _mm_mul_ps(vec_efw_im, vec_minus_one);
- _mm_storeu_ps(&efw[0][i], vec_efw_re);
- _mm_storeu_ps(&efw[1][i], vec_efw_im);
- }
- }
- // scalar code for the remaining items.
- for (; i < PART_LEN1; i++) {
- // Weight subbands
- if (hNl[i] > hNlFb) {
- hNl[i] = WebRtcAec_weightCurve[i] * hNlFb +
- (1 - WebRtcAec_weightCurve[i]) * hNl[i];
- }
- hNl[i] = powf(hNl[i], aec->overDriveSm * WebRtcAec_overDriveCurve[i]);
-
- // Suppress error signal
- efw[0][i] *= hNl[i];
- efw[1][i] *= hNl[i];
-
- // Ooura fft returns incorrect sign on imaginary component. It matters
- // here because we are making an additive change with comfort noise.
- efw[1][i] *= -1;
- }
-}
-
-void WebRtcAec_InitAec_SSE2(void) {
- WebRtcAec_FilterFar = FilterFarSSE2;
- WebRtcAec_ScaleErrorSignal = ScaleErrorSignalSSE2;
- WebRtcAec_FilterAdaptation = FilterAdaptationSSE2;
- WebRtcAec_OverdriveAndSuppress = OverdriveAndSuppressSSE2;
-}
-
-#endif //__SSE2__
diff --git a/src/modules/audio_processing/aec/main/source/aec_rdft.c b/src/modules/audio_processing/aec/main/source/aec_rdft.c
deleted file mode 100644
index 072a1c4..0000000
--- a/src/modules/audio_processing/aec/main/source/aec_rdft.c
+++ /dev/null
@@ -1,522 +0,0 @@
-/*
- * http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html
- * Copyright Takuya OOURA, 1996-2001
- *
- * You may use, copy, modify and distribute this code for any purpose (include
- * commercial use) and without fee. Please refer to this package when you modify
- * this code.
- *
- * Changes by the WebRTC authors:
- * - Trivial type modifications.
- * - Minimal code subset to do rdft of length 128.
- * - Optimizations because of known length.
- *
- * All changes are covered by the WebRTC license and IP grant:
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <math.h>
-
-#include "aec_rdft.h"
-#include "system_wrappers/interface/cpu_features_wrapper.h"
-
-float rdft_w[64];
-static int ip[16];
-
-static void bitrv2_32or128(int n, int *ip, float *a) {
- // n is 32 or 128
- int j, j1, k, k1, m, m2;
- float xr, xi, yr, yi;
-
- ip[0] = 0;
- {
- int l = n;
- m = 1;
- while ((m << 3) < l) {
- l >>= 1;
- for (j = 0; j < m; j++) {
- ip[m + j] = ip[j] + l;
- }
- m <<= 1;
- }
- }
- m2 = 2 * m;
- for (k = 0; k < m; k++) {
- for (j = 0; j < k; j++) {
- j1 = 2 * j + ip[k];
- k1 = 2 * k + ip[j];
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- j1 += m2;
- k1 += 2 * m2;
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- j1 += m2;
- k1 -= m2;
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- j1 += m2;
- k1 += 2 * m2;
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- }
- j1 = 2 * k + m2 + ip[k];
- k1 = j1 + m2;
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- }
-}
-
-static void makewt_32() {
- const int nw = 32;
- int j, nwh;
- float delta, x, y;
-
- ip[0] = nw;
- ip[1] = 1;
- nwh = nw >> 1;
- delta = atanf(1.0f) / nwh;
- rdft_w[0] = 1;
- rdft_w[1] = 0;
- rdft_w[nwh] = cosf(delta * nwh);
- rdft_w[nwh + 1] = rdft_w[nwh];
- for (j = 2; j < nwh; j += 2) {
- x = cosf(delta * j);
- y = sinf(delta * j);
- rdft_w[j] = x;
- rdft_w[j + 1] = y;
- rdft_w[nw - j] = y;
- rdft_w[nw - j + 1] = x;
- }
- bitrv2_32or128(nw, ip + 2, rdft_w);
-}
-
-static void makect_32() {
- float *c = rdft_w + 32;
- const int nc = 32;
- int j, nch;
- float delta;
-
- ip[1] = nc;
- nch = nc >> 1;
- delta = atanf(1.0f) / nch;
- c[0] = cosf(delta * nch);
- c[nch] = 0.5f * c[0];
- for (j = 1; j < nch; j++) {
- c[j] = 0.5f * cosf(delta * j);
- c[nc - j] = 0.5f * sinf(delta * j);
- }
-}
-
-static void cft1st_128(float *a) {
- const int n = 128;
- int j, k1, k2;
- float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
- float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
- x0r = a[0] + a[2];
- x0i = a[1] + a[3];
- x1r = a[0] - a[2];
- x1i = a[1] - a[3];
- x2r = a[4] + a[6];
- x2i = a[5] + a[7];
- x3r = a[4] - a[6];
- x3i = a[5] - a[7];
- a[0] = x0r + x2r;
- a[1] = x0i + x2i;
- a[4] = x0r - x2r;
- a[5] = x0i - x2i;
- a[2] = x1r - x3i;
- a[3] = x1i + x3r;
- a[6] = x1r + x3i;
- a[7] = x1i - x3r;
- wk1r = rdft_w[2];
- x0r = a[8] + a[10];
- x0i = a[9] + a[11];
- x1r = a[8] - a[10];
- x1i = a[9] - a[11];
- x2r = a[12] + a[14];
- x2i = a[13] + a[15];
- x3r = a[12] - a[14];
- x3i = a[13] - a[15];
- a[8] = x0r + x2r;
- a[9] = x0i + x2i;
- a[12] = x2i - x0i;
- a[13] = x0r - x2r;
- x0r = x1r - x3i;
- x0i = x1i + x3r;
- a[10] = wk1r * (x0r - x0i);
- a[11] = wk1r * (x0r + x0i);
- x0r = x3i + x1r;
- x0i = x3r - x1i;
- a[14] = wk1r * (x0i - x0r);
- a[15] = wk1r * (x0i + x0r);
- k1 = 0;
- for (j = 16; j < n; j += 16) {
- k1 += 2;
- k2 = 2 * k1;
- wk2r = rdft_w[k1];
- wk2i = rdft_w[k1 + 1];
- wk1r = rdft_w[k2];
- wk1i = rdft_w[k2 + 1];
- wk3r = wk1r - 2 * wk2i * wk1i;
- wk3i = 2 * wk2i * wk1r - wk1i;
- x0r = a[j] + a[j + 2];
- x0i = a[j + 1] + a[j + 3];
- x1r = a[j] - a[j + 2];
- x1i = a[j + 1] - a[j + 3];
- x2r = a[j + 4] + a[j + 6];
- x2i = a[j + 5] + a[j + 7];
- x3r = a[j + 4] - a[j + 6];
- x3i = a[j + 5] - a[j + 7];
- a[j] = x0r + x2r;
- a[j + 1] = x0i + x2i;
- x0r -= x2r;
- x0i -= x2i;
- a[j + 4] = wk2r * x0r - wk2i * x0i;
- a[j + 5] = wk2r * x0i + wk2i * x0r;
- x0r = x1r - x3i;
- x0i = x1i + x3r;
- a[j + 2] = wk1r * x0r - wk1i * x0i;
- a[j + 3] = wk1r * x0i + wk1i * x0r;
- x0r = x1r + x3i;
- x0i = x1i - x3r;
- a[j + 6] = wk3r * x0r - wk3i * x0i;
- a[j + 7] = wk3r * x0i + wk3i * x0r;
- wk1r = rdft_w[k2 + 2];
- wk1i = rdft_w[k2 + 3];
- wk3r = wk1r - 2 * wk2r * wk1i;
- wk3i = 2 * wk2r * wk1r - wk1i;
- x0r = a[j + 8] + a[j + 10];
- x0i = a[j + 9] + a[j + 11];
- x1r = a[j + 8] - a[j + 10];
- x1i = a[j + 9] - a[j + 11];
- x2r = a[j + 12] + a[j + 14];
- x2i = a[j + 13] + a[j + 15];
- x3r = a[j + 12] - a[j + 14];
- x3i = a[j + 13] - a[j + 15];
- a[j + 8] = x0r + x2r;
- a[j + 9] = x0i + x2i;
- x0r -= x2r;
- x0i -= x2i;
- a[j + 12] = -wk2i * x0r - wk2r * x0i;
- a[j + 13] = -wk2i * x0i + wk2r * x0r;
- x0r = x1r - x3i;
- x0i = x1i + x3r;
- a[j + 10] = wk1r * x0r - wk1i * x0i;
- a[j + 11] = wk1r * x0i + wk1i * x0r;
- x0r = x1r + x3i;
- x0i = x1i - x3r;
- a[j + 14] = wk3r * x0r - wk3i * x0i;
- a[j + 15] = wk3r * x0i + wk3i * x0r;
- }
-}
-
-static void cftmdl_128(int l, float *a) {
- const int n = 128;
- int j, j1, j2, j3, k, k1, k2, m, m2;
- float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
- float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
- m = l << 2;
- for (j = 0; j < l; j += 2) {
- j1 = j + l;
- j2 = j1 + l;
- j3 = j2 + l;
- x0r = a[j] + a[j1];
- x0i = a[j + 1] + a[j1 + 1];
- x1r = a[j] - a[j1];
- x1i = a[j + 1] - a[j1 + 1];
- x2r = a[j2] + a[j3];
- x2i = a[j2 + 1] + a[j3 + 1];
- x3r = a[j2] - a[j3];
- x3i = a[j2 + 1] - a[j3 + 1];
- a[j] = x0r + x2r;
- a[j + 1] = x0i + x2i;
- a[j2] = x0r - x2r;
- a[j2 + 1] = x0i - x2i;
- a[j1] = x1r - x3i;
- a[j1 + 1] = x1i + x3r;
- a[j3] = x1r + x3i;
- a[j3 + 1] = x1i - x3r;
- }
- wk1r = rdft_w[2];
- for (j = m; j < l + m; j += 2) {
- j1 = j + l;
- j2 = j1 + l;
- j3 = j2 + l;
- x0r = a[j] + a[j1];
- x0i = a[j + 1] + a[j1 + 1];
- x1r = a[j] - a[j1];
- x1i = a[j + 1] - a[j1 + 1];
- x2r = a[j2] + a[j3];
- x2i = a[j2 + 1] + a[j3 + 1];
- x3r = a[j2] - a[j3];
- x3i = a[j2 + 1] - a[j3 + 1];
- a[j] = x0r + x2r;
- a[j + 1] = x0i + x2i;
- a[j2] = x2i - x0i;
- a[j2 + 1] = x0r - x2r;
- x0r = x1r - x3i;
- x0i = x1i + x3r;
- a[j1] = wk1r * (x0r - x0i);
- a[j1 + 1] = wk1r * (x0r + x0i);
- x0r = x3i + x1r;
- x0i = x3r - x1i;
- a[j3] = wk1r * (x0i - x0r);
- a[j3 + 1] = wk1r * (x0i + x0r);
- }
- k1 = 0;
- m2 = 2 * m;
- for (k = m2; k < n; k += m2) {
- k1 += 2;
- k2 = 2 * k1;
- wk2r = rdft_w[k1];
- wk2i = rdft_w[k1 + 1];
- wk1r = rdft_w[k2];
- wk1i = rdft_w[k2 + 1];
- wk3r = wk1r - 2 * wk2i * wk1i;
- wk3i = 2 * wk2i * wk1r - wk1i;
- for (j = k; j < l + k; j += 2) {
- j1 = j + l;
- j2 = j1 + l;
- j3 = j2 + l;
- x0r = a[j] + a[j1];
- x0i = a[j + 1] + a[j1 + 1];
- x1r = a[j] - a[j1];
- x1i = a[j + 1] - a[j1 + 1];
- x2r = a[j2] + a[j3];
- x2i = a[j2 + 1] + a[j3 + 1];
- x3r = a[j2] - a[j3];
- x3i = a[j2 + 1] - a[j3 + 1];
- a[j] = x0r + x2r;
- a[j + 1] = x0i + x2i;
- x0r -= x2r;
- x0i -= x2i;
- a[j2] = wk2r * x0r - wk2i * x0i;
- a[j2 + 1] = wk2r * x0i + wk2i * x0r;
- x0r = x1r - x3i;
- x0i = x1i + x3r;
- a[j1] = wk1r * x0r - wk1i * x0i;
- a[j1 + 1] = wk1r * x0i + wk1i * x0r;
- x0r = x1r + x3i;
- x0i = x1i - x3r;
- a[j3] = wk3r * x0r - wk3i * x0i;
- a[j3 + 1] = wk3r * x0i + wk3i * x0r;
- }
- wk1r = rdft_w[k2 + 2];
- wk1i = rdft_w[k2 + 3];
- wk3r = wk1r - 2 * wk2r * wk1i;
- wk3i = 2 * wk2r * wk1r - wk1i;
- for (j = k + m; j < l + (k + m); j += 2) {
- j1 = j + l;
- j2 = j1 + l;
- j3 = j2 + l;
- x0r = a[j] + a[j1];
- x0i = a[j + 1] + a[j1 + 1];
- x1r = a[j] - a[j1];
- x1i = a[j + 1] - a[j1 + 1];
- x2r = a[j2] + a[j3];
- x2i = a[j2 + 1] + a[j3 + 1];
- x3r = a[j2] - a[j3];
- x3i = a[j2 + 1] - a[j3 + 1];
- a[j] = x0r + x2r;
- a[j + 1] = x0i + x2i;
- x0r -= x2r;
- x0i -= x2i;
- a[j2] = -wk2i * x0r - wk2r * x0i;
- a[j2 + 1] = -wk2i * x0i + wk2r * x0r;
- x0r = x1r - x3i;
- x0i = x1i + x3r;
- a[j1] = wk1r * x0r - wk1i * x0i;
- a[j1 + 1] = wk1r * x0i + wk1i * x0r;
- x0r = x1r + x3i;
- x0i = x1i - x3r;
- a[j3] = wk3r * x0r - wk3i * x0i;
- a[j3 + 1] = wk3r * x0i + wk3i * x0r;
- }
- }
-}
-
-static void cftfsub_128(float *a) {
- int j, j1, j2, j3, l;
- float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
- cft1st_128(a);
- cftmdl_128(8, a);
- l = 32;
- for (j = 0; j < l; j += 2) {
- j1 = j + l;
- j2 = j1 + l;
- j3 = j2 + l;
- x0r = a[j] + a[j1];
- x0i = a[j + 1] + a[j1 + 1];
- x1r = a[j] - a[j1];
- x1i = a[j + 1] - a[j1 + 1];
- x2r = a[j2] + a[j3];
- x2i = a[j2 + 1] + a[j3 + 1];
- x3r = a[j2] - a[j3];
- x3i = a[j2 + 1] - a[j3 + 1];
- a[j] = x0r + x2r;
- a[j + 1] = x0i + x2i;
- a[j2] = x0r - x2r;
- a[j2 + 1] = x0i - x2i;
- a[j1] = x1r - x3i;
- a[j1 + 1] = x1i + x3r;
- a[j3] = x1r + x3i;
- a[j3 + 1] = x1i - x3r;
- }
-}
-
-static void cftbsub_128(float *a) {
- int j, j1, j2, j3, l;
- float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
- cft1st_128(a);
- cftmdl_128(8, a);
- l = 32;
-
- for (j = 0; j < l; j += 2) {
- j1 = j + l;
- j2 = j1 + l;
- j3 = j2 + l;
- x0r = a[j] + a[j1];
- x0i = -a[j + 1] - a[j1 + 1];
- x1r = a[j] - a[j1];
- x1i = -a[j + 1] + a[j1 + 1];
- x2r = a[j2] + a[j3];
- x2i = a[j2 + 1] + a[j3 + 1];
- x3r = a[j2] - a[j3];
- x3i = a[j2 + 1] - a[j3 + 1];
- a[j] = x0r + x2r;
- a[j + 1] = x0i - x2i;
- a[j2] = x0r - x2r;
- a[j2 + 1] = x0i + x2i;
- a[j1] = x1r - x3i;
- a[j1 + 1] = x1i - x3r;
- a[j3] = x1r + x3i;
- a[j3 + 1] = x1i + x3r;
- }
-}
-
-static void rftfsub_128_C(float *a) {
- const float *c = rdft_w + 32;
- int j1, j2, k1, k2;
- float wkr, wki, xr, xi, yr, yi;
-
- for (j1 = 1, j2 = 2; j2 < 64; j1 += 1, j2 += 2) {
- k2 = 128 - j2;
- k1 = 32 - j1;
- wkr = 0.5f - c[k1];
- wki = c[j1];
- xr = a[j2 + 0] - a[k2 + 0];
- xi = a[j2 + 1] + a[k2 + 1];
- yr = wkr * xr - wki * xi;
- yi = wkr * xi + wki * xr;
- a[j2 + 0] -= yr;
- a[j2 + 1] -= yi;
- a[k2 + 0] += yr;
- a[k2 + 1] -= yi;
- }
-}
-
-static void rftbsub_128_C(float *a) {
- const float *c = rdft_w + 32;
- int j1, j2, k1, k2;
- float wkr, wki, xr, xi, yr, yi;
-
- a[1] = -a[1];
- for (j1 = 1, j2 = 2; j2 < 64; j1 += 1, j2 += 2) {
- k2 = 128 - j2;
- k1 = 32 - j1;
- wkr = 0.5f - c[k1];
- wki = c[j1];
- xr = a[j2 + 0] - a[k2 + 0];
- xi = a[j2 + 1] + a[k2 + 1];
- yr = wkr * xr + wki * xi;
- yi = wkr * xi - wki * xr;
- a[j2 + 0] = a[j2 + 0] - yr;
- a[j2 + 1] = yi - a[j2 + 1];
- a[k2 + 0] = yr + a[k2 + 0];
- a[k2 + 1] = yi - a[k2 + 1];
- }
- a[65] = -a[65];
-}
-
-void aec_rdft_forward_128(float *a) {
- const int n = 128;
- int nw;
- float xi;
-
- nw = ip[0];
- bitrv2_32or128(n, ip + 2, a);
- cftfsub_128(a);
- rftfsub_128(a);
- xi = a[0] - a[1];
- a[0] += a[1];
- a[1] = xi;
-}
-
-void aec_rdft_inverse_128(float *a) {
- const int n = 128;
- int nw;
- float xi;
-
- nw = ip[0];
- a[1] = 0.5f * (a[0] - a[1]);
- a[0] -= a[1];
- rftbsub_128(a);
- bitrv2_32or128(n, ip + 2, a);
- cftbsub_128(a);
-}
-
-// code path selection
-rft_sub_128_t rftfsub_128;
-rft_sub_128_t rftbsub_128;
-
-void aec_rdft_init(void) {
- rftfsub_128 = rftfsub_128_C;
- rftbsub_128 = rftbsub_128_C;
- if (WebRtc_GetCPUInfo(kSSE2)) {
-#if defined(__SSE2__)
- aec_rdft_init_sse2();
-#endif
- }
- // init library constants.
- makewt_32();
- makect_32();
-}
diff --git a/src/modules/audio_processing/aec/main/source/aec_rdft.h b/src/modules/audio_processing/aec/main/source/aec_rdft.h
deleted file mode 100644
index cf90882..0000000
--- a/src/modules/audio_processing/aec/main/source/aec_rdft.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-// constants shared by all paths (C, SSE2).
-extern float rdft_w[64];
-
-// code path selection function pointers
-typedef void (*rft_sub_128_t)(float *a);
-extern rft_sub_128_t rftfsub_128;
-extern rft_sub_128_t rftbsub_128;
-
-// entry points
-void aec_rdft_init(void);
-void aec_rdft_init_sse2(void);
-void aec_rdft_forward_128(float *a);
-void aec_rdft_inverse_128(float *a);
diff --git a/src/modules/audio_processing/aec/main/source/aec_rdft_sse2.c b/src/modules/audio_processing/aec/main/source/aec_rdft_sse2.c
deleted file mode 100644
index 901a1b1..0000000
--- a/src/modules/audio_processing/aec/main/source/aec_rdft_sse2.c
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <emmintrin.h>
-
-#include "aec_rdft.h"
-
-#ifdef _MSC_VER /* visual c++ */
-# define ALIGN16_BEG __declspec(align(16))
-# define ALIGN16_END
-#else /* gcc or icc */
-# define ALIGN16_BEG
-# define ALIGN16_END __attribute__((aligned(16)))
-#endif
-
-static void rftfsub_128_SSE2(float *a) {
- const float *c = rdft_w + 32;
- int j1, j2, k1, k2;
- float wkr, wki, xr, xi, yr, yi;
-
- static const ALIGN16_BEG float ALIGN16_END k_half[4] =
- {0.5f, 0.5f, 0.5f, 0.5f};
- const __m128 mm_half = _mm_load_ps(k_half);
-
- // Vectorized code (four at once).
- // Note: commented number are indexes for the first iteration of the loop.
- for (j1 = 1, j2 = 2; j2 + 7 < 64; j1 += 4, j2 += 8) {
- // Load 'wk'.
- const __m128 c_j1 = _mm_loadu_ps(&c[ j1]); // 1, 2, 3, 4,
- const __m128 c_k1 = _mm_loadu_ps(&c[29 - j1]); // 28, 29, 30, 31,
- const __m128 wkrt = _mm_sub_ps(mm_half, c_k1); // 28, 29, 30, 31,
- const __m128 wkr_ =
- _mm_shuffle_ps(wkrt, wkrt, _MM_SHUFFLE(0, 1, 2, 3)); // 31, 30, 29, 28,
- const __m128 wki_ = c_j1; // 1, 2, 3, 4,
- // Load and shuffle 'a'.
- const __m128 a_j2_0 = _mm_loadu_ps(&a[0 + j2]); // 2, 3, 4, 5,
- const __m128 a_j2_4 = _mm_loadu_ps(&a[4 + j2]); // 6, 7, 8, 9,
- const __m128 a_k2_0 = _mm_loadu_ps(&a[122 - j2]); // 120, 121, 122, 123,
- const __m128 a_k2_4 = _mm_loadu_ps(&a[126 - j2]); // 124, 125, 126, 127,
- const __m128 a_j2_p0 = _mm_shuffle_ps(a_j2_0, a_j2_4,
- _MM_SHUFFLE(2, 0, 2 ,0)); // 2, 4, 6, 8,
- const __m128 a_j2_p1 = _mm_shuffle_ps(a_j2_0, a_j2_4,
- _MM_SHUFFLE(3, 1, 3 ,1)); // 3, 5, 7, 9,
- const __m128 a_k2_p0 = _mm_shuffle_ps(a_k2_4, a_k2_0,
- _MM_SHUFFLE(0, 2, 0 ,2)); // 126, 124, 122, 120,
- const __m128 a_k2_p1 = _mm_shuffle_ps(a_k2_4, a_k2_0,
- _MM_SHUFFLE(1, 3, 1 ,3)); // 127, 125, 123, 121,
- // Calculate 'x'.
- const __m128 xr_ = _mm_sub_ps(a_j2_p0, a_k2_p0);
- // 2-126, 4-124, 6-122, 8-120,
- const __m128 xi_ = _mm_add_ps(a_j2_p1, a_k2_p1);
- // 3-127, 5-125, 7-123, 9-121,
- // Calculate product into 'y'.
- // yr = wkr * xr - wki * xi;
- // yi = wkr * xi + wki * xr;
- const __m128 a_ = _mm_mul_ps(wkr_, xr_);
- const __m128 b_ = _mm_mul_ps(wki_, xi_);
- const __m128 c_ = _mm_mul_ps(wkr_, xi_);
- const __m128 d_ = _mm_mul_ps(wki_, xr_);
- const __m128 yr_ = _mm_sub_ps(a_, b_); // 2-126, 4-124, 6-122, 8-120,
- const __m128 yi_ = _mm_add_ps(c_, d_); // 3-127, 5-125, 7-123, 9-121,
- // Update 'a'.
- // a[j2 + 0] -= yr;
- // a[j2 + 1] -= yi;
- // a[k2 + 0] += yr;
- // a[k2 + 1] -= yi;
- const __m128 a_j2_p0n = _mm_sub_ps(a_j2_p0, yr_); // 2, 4, 6, 8,
- const __m128 a_j2_p1n = _mm_sub_ps(a_j2_p1, yi_); // 3, 5, 7, 9,
- const __m128 a_k2_p0n = _mm_add_ps(a_k2_p0, yr_); // 126, 124, 122, 120,
- const __m128 a_k2_p1n = _mm_sub_ps(a_k2_p1, yi_); // 127, 125, 123, 121,
- // Shuffle in right order and store.
- const __m128 a_j2_0n = _mm_unpacklo_ps(a_j2_p0n, a_j2_p1n);
- // 2, 3, 4, 5,
- const __m128 a_j2_4n = _mm_unpackhi_ps(a_j2_p0n, a_j2_p1n);
- // 6, 7, 8, 9,
- const __m128 a_k2_0nt = _mm_unpackhi_ps(a_k2_p0n, a_k2_p1n);
- // 122, 123, 120, 121,
- const __m128 a_k2_4nt = _mm_unpacklo_ps(a_k2_p0n, a_k2_p1n);
- // 126, 127, 124, 125,
- const __m128 a_k2_0n = _mm_shuffle_ps(a_k2_0nt, a_k2_0nt,
- _MM_SHUFFLE(1, 0, 3 ,2)); // 120, 121, 122, 123,
- const __m128 a_k2_4n = _mm_shuffle_ps(a_k2_4nt, a_k2_4nt,
- _MM_SHUFFLE(1, 0, 3 ,2)); // 124, 125, 126, 127,
- _mm_storeu_ps(&a[0 + j2], a_j2_0n);
- _mm_storeu_ps(&a[4 + j2], a_j2_4n);
- _mm_storeu_ps(&a[122 - j2], a_k2_0n);
- _mm_storeu_ps(&a[126 - j2], a_k2_4n);
- }
- // Scalar code for the remaining items.
- for (; j2 < 64; j1 += 1, j2 += 2) {
- k2 = 128 - j2;
- k1 = 32 - j1;
- wkr = 0.5f - c[k1];
- wki = c[j1];
- xr = a[j2 + 0] - a[k2 + 0];
- xi = a[j2 + 1] + a[k2 + 1];
- yr = wkr * xr - wki * xi;
- yi = wkr * xi + wki * xr;
- a[j2 + 0] -= yr;
- a[j2 + 1] -= yi;
- a[k2 + 0] += yr;
- a[k2 + 1] -= yi;
- }
-}
-
-static void rftbsub_128_SSE2(float *a) {
- const float *c = rdft_w + 32;
- int j1, j2, k1, k2;
- float wkr, wki, xr, xi, yr, yi;
-
- static const ALIGN16_BEG float ALIGN16_END k_half[4] =
- {0.5f, 0.5f, 0.5f, 0.5f};
- const __m128 mm_half = _mm_load_ps(k_half);
-
- a[1] = -a[1];
- // Vectorized code (four at once).
- // Note: commented number are indexes for the first iteration of the loop.
- for (j1 = 1, j2 = 2; j2 + 7 < 64; j1 += 4, j2 += 8) {
- // Load 'wk'.
- const __m128 c_j1 = _mm_loadu_ps(&c[ j1]); // 1, 2, 3, 4,
- const __m128 c_k1 = _mm_loadu_ps(&c[29 - j1]); // 28, 29, 30, 31,
- const __m128 wkrt = _mm_sub_ps(mm_half, c_k1); // 28, 29, 30, 31,
- const __m128 wkr_ =
- _mm_shuffle_ps(wkrt, wkrt, _MM_SHUFFLE(0, 1, 2, 3)); // 31, 30, 29, 28,
- const __m128 wki_ = c_j1; // 1, 2, 3, 4,
- // Load and shuffle 'a'.
- const __m128 a_j2_0 = _mm_loadu_ps(&a[0 + j2]); // 2, 3, 4, 5,
- const __m128 a_j2_4 = _mm_loadu_ps(&a[4 + j2]); // 6, 7, 8, 9,
- const __m128 a_k2_0 = _mm_loadu_ps(&a[122 - j2]); // 120, 121, 122, 123,
- const __m128 a_k2_4 = _mm_loadu_ps(&a[126 - j2]); // 124, 125, 126, 127,
- const __m128 a_j2_p0 = _mm_shuffle_ps(a_j2_0, a_j2_4,
- _MM_SHUFFLE(2, 0, 2 ,0)); // 2, 4, 6, 8,
- const __m128 a_j2_p1 = _mm_shuffle_ps(a_j2_0, a_j2_4,
- _MM_SHUFFLE(3, 1, 3 ,1)); // 3, 5, 7, 9,
- const __m128 a_k2_p0 = _mm_shuffle_ps(a_k2_4, a_k2_0,
- _MM_SHUFFLE(0, 2, 0 ,2)); // 126, 124, 122, 120,
- const __m128 a_k2_p1 = _mm_shuffle_ps(a_k2_4, a_k2_0,
- _MM_SHUFFLE(1, 3, 1 ,3)); // 127, 125, 123, 121,
- // Calculate 'x'.
- const __m128 xr_ = _mm_sub_ps(a_j2_p0, a_k2_p0);
- // 2-126, 4-124, 6-122, 8-120,
- const __m128 xi_ = _mm_add_ps(a_j2_p1, a_k2_p1);
- // 3-127, 5-125, 7-123, 9-121,
- // Calculate product into 'y'.
- // yr = wkr * xr + wki * xi;
- // yi = wkr * xi - wki * xr;
- const __m128 a_ = _mm_mul_ps(wkr_, xr_);
- const __m128 b_ = _mm_mul_ps(wki_, xi_);
- const __m128 c_ = _mm_mul_ps(wkr_, xi_);
- const __m128 d_ = _mm_mul_ps(wki_, xr_);
- const __m128 yr_ = _mm_add_ps(a_, b_); // 2-126, 4-124, 6-122, 8-120,
- const __m128 yi_ = _mm_sub_ps(c_, d_); // 3-127, 5-125, 7-123, 9-121,
- // Update 'a'.
- // a[j2 + 0] = a[j2 + 0] - yr;
- // a[j2 + 1] = yi - a[j2 + 1];
- // a[k2 + 0] = yr + a[k2 + 0];
- // a[k2 + 1] = yi - a[k2 + 1];
- const __m128 a_j2_p0n = _mm_sub_ps(a_j2_p0, yr_); // 2, 4, 6, 8,
- const __m128 a_j2_p1n = _mm_sub_ps(yi_, a_j2_p1); // 3, 5, 7, 9,
- const __m128 a_k2_p0n = _mm_add_ps(a_k2_p0, yr_); // 126, 124, 122, 120,
- const __m128 a_k2_p1n = _mm_sub_ps(yi_, a_k2_p1); // 127, 125, 123, 121,
- // Shuffle in right order and store.
- // Shuffle in right order and store.
- const __m128 a_j2_0n = _mm_unpacklo_ps(a_j2_p0n, a_j2_p1n);
- // 2, 3, 4, 5,
- const __m128 a_j2_4n = _mm_unpackhi_ps(a_j2_p0n, a_j2_p1n);
- // 6, 7, 8, 9,
- const __m128 a_k2_0nt = _mm_unpackhi_ps(a_k2_p0n, a_k2_p1n);
- // 122, 123, 120, 121,
- const __m128 a_k2_4nt = _mm_unpacklo_ps(a_k2_p0n, a_k2_p1n);
- // 126, 127, 124, 125,
- const __m128 a_k2_0n = _mm_shuffle_ps(a_k2_0nt, a_k2_0nt,
- _MM_SHUFFLE(1, 0, 3 ,2)); // 120, 121, 122, 123,
- const __m128 a_k2_4n = _mm_shuffle_ps(a_k2_4nt, a_k2_4nt,
- _MM_SHUFFLE(1, 0, 3 ,2)); // 124, 125, 126, 127,
- _mm_storeu_ps(&a[0 + j2], a_j2_0n);
- _mm_storeu_ps(&a[4 + j2], a_j2_4n);
- _mm_storeu_ps(&a[122 - j2], a_k2_0n);
- _mm_storeu_ps(&a[126 - j2], a_k2_4n);
- }
- // Scalar code for the remaining items.
- for (; j2 < 64; j1 += 1, j2 += 2) {
- k2 = 128 - j2;
- k1 = 32 - j1;
- wkr = 0.5f - c[k1];
- wki = c[j1];
- xr = a[j2 + 0] - a[k2 + 0];
- xi = a[j2 + 1] + a[k2 + 1];
- yr = wkr * xr + wki * xi;
- yi = wkr * xi - wki * xr;
- a[j2 + 0] = a[j2 + 0] - yr;
- a[j2 + 1] = yi - a[j2 + 1];
- a[k2 + 0] = yr + a[k2 + 0];
- a[k2 + 1] = yi - a[k2 + 1];
- }
- a[65] = -a[65];
-}
-
-void aec_rdft_init_sse2(void) {
- rftfsub_128 = rftfsub_128_SSE2;
- rftbsub_128 = rftbsub_128_SSE2;
-}
diff --git a/src/modules/audio_processing/aec/main/source/echo_cancellation.c b/src/modules/audio_processing/aec/main/source/echo_cancellation.c
deleted file mode 100644
index 1313e35..0000000
--- a/src/modules/audio_processing/aec/main/source/echo_cancellation.c
+++ /dev/null
@@ -1,821 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-/*
- * Contains the API functions for the AEC.
- */
-#include <stdlib.h>
-#include <string.h>
-
-#include "echo_cancellation.h"
-#include "aec_core.h"
-#include "ring_buffer.h"
-#include "resampler.h"
-#ifdef AEC_DEBUG
- #include <stdio.h>
-#endif
-
-#define BUF_SIZE_FRAMES 50 // buffer size (frames)
-// Maximum length of resampled signal. Must be an integer multiple of frames
-// (ceil(1/(1 + MIN_SKEW)*2) + 1)*FRAME_LEN
-// The factor of 2 handles wb, and the + 1 is as a safety margin
-#define MAX_RESAMP_LEN (5 * FRAME_LEN)
-
-static const int bufSizeSamp = BUF_SIZE_FRAMES * FRAME_LEN; // buffer size (samples)
-static const int sampMsNb = 8; // samples per ms in nb
-// Target suppression levels for nlp modes
-// log{0.001, 0.00001, 0.00000001}
-static const float targetSupp[3] = {-6.9f, -11.5f, -18.4f};
-static const float minOverDrive[3] = {1.0f, 2.0f, 5.0f};
-static const int initCheck = 42;
-
-typedef struct {
- int delayCtr;
- int sampFreq;
- int splitSampFreq;
- int scSampFreq;
- float sampFactor; // scSampRate / sampFreq
- short nlpMode;
- short autoOnOff;
- short activity;
- short skewMode;
- short bufSizeStart;
- //short bufResetCtr; // counts number of noncausal frames
- int knownDelay;
-
- // Stores the last frame added to the farend buffer
- short farendOld[2][FRAME_LEN];
- short initFlag; // indicates if AEC has been initialized
-
- // Variables used for averaging far end buffer size
- short counter;
- short sum;
- short firstVal;
- short checkBufSizeCtr;
-
- // Variables used for delay shifts
- short msInSndCardBuf;
- short filtDelay;
- int timeForDelayChange;
- int ECstartup;
- int checkBuffSize;
- int delayChange;
- short lastDelayDiff;
-
-#ifdef AEC_DEBUG
- FILE *bufFile;
- FILE *delayFile;
- FILE *skewFile;
- FILE *preCompFile;
- FILE *postCompFile;
-#endif // AEC_DEBUG
-
- // Structures
- void *farendBuf;
- void *resampler;
-
- int skewFrCtr;
- int resample; // if the skew is small enough we don't resample
- int highSkewCtr;
- float skew;
-
- int lastError;
-
- aec_t *aec;
-} aecpc_t;
-
-// Estimates delay to set the position of the farend buffer read pointer
-// (controlled by knownDelay)
-static int EstBufDelay(aecpc_t *aecInst, short msInSndCardBuf);
-
-// Stuffs the farend buffer if the estimated delay is too large
-static int DelayComp(aecpc_t *aecInst);
-
-WebRtc_Word32 WebRtcAec_Create(void **aecInst)
-{
- aecpc_t *aecpc;
- if (aecInst == NULL) {
- return -1;
- }
-
- aecpc = malloc(sizeof(aecpc_t));
- *aecInst = aecpc;
- if (aecpc == NULL) {
- return -1;
- }
-
- if (WebRtcAec_CreateAec(&aecpc->aec) == -1) {
- WebRtcAec_Free(aecpc);
- aecpc = NULL;
- return -1;
- }
-
- if (WebRtcApm_CreateBuffer(&aecpc->farendBuf, bufSizeSamp) == -1) {
- WebRtcAec_Free(aecpc);
- aecpc = NULL;
- return -1;
- }
-
- if (WebRtcAec_CreateResampler(&aecpc->resampler) == -1) {
- WebRtcAec_Free(aecpc);
- aecpc = NULL;
- return -1;
- }
-
- aecpc->initFlag = 0;
- aecpc->lastError = 0;
-
-#ifdef AEC_DEBUG
- aecpc->aec->farFile = fopen("aecFar.pcm","wb");
- aecpc->aec->nearFile = fopen("aecNear.pcm","wb");
- aecpc->aec->outFile = fopen("aecOut.pcm","wb");
- aecpc->aec->outLpFile = fopen("aecOutLp.pcm","wb");
-
- aecpc->bufFile = fopen("aecBuf.dat", "wb");
- aecpc->skewFile = fopen("aecSkew.dat", "wb");
- aecpc->delayFile = fopen("aecDelay.dat", "wb");
- aecpc->preCompFile = fopen("preComp.pcm", "wb");
- aecpc->postCompFile = fopen("postComp.pcm", "wb");
-#endif // AEC_DEBUG
-
- return 0;
-}
-
-WebRtc_Word32 WebRtcAec_Free(void *aecInst)
-{
- aecpc_t *aecpc = aecInst;
-
- if (aecpc == NULL) {
- return -1;
- }
-
-#ifdef AEC_DEBUG
- fclose(aecpc->aec->farFile);
- fclose(aecpc->aec->nearFile);
- fclose(aecpc->aec->outFile);
- fclose(aecpc->aec->outLpFile);
-
- fclose(aecpc->bufFile);
- fclose(aecpc->skewFile);
- fclose(aecpc->delayFile);
- fclose(aecpc->preCompFile);
- fclose(aecpc->postCompFile);
-#endif // AEC_DEBUG
-
- WebRtcAec_FreeAec(aecpc->aec);
- WebRtcApm_FreeBuffer(aecpc->farendBuf);
- WebRtcAec_FreeResampler(aecpc->resampler);
- free(aecpc);
-
- return 0;
-}
-
-WebRtc_Word32 WebRtcAec_Init(void *aecInst, WebRtc_Word32 sampFreq, WebRtc_Word32 scSampFreq)
-{
- aecpc_t *aecpc = aecInst;
- AecConfig aecConfig;
-
- if (aecpc == NULL) {
- return -1;
- }
-
- if (sampFreq != 8000 && sampFreq != 16000 && sampFreq != 32000) {
- aecpc->lastError = AEC_BAD_PARAMETER_ERROR;
- return -1;
- }
- aecpc->sampFreq = sampFreq;
-
- if (scSampFreq < 1 || scSampFreq > 96000) {
- aecpc->lastError = AEC_BAD_PARAMETER_ERROR;
- return -1;
- }
- aecpc->scSampFreq = scSampFreq;
-
- // Initialize echo canceller core
- if (WebRtcAec_InitAec(aecpc->aec, aecpc->sampFreq) == -1) {
- aecpc->lastError = AEC_UNSPECIFIED_ERROR;
- return -1;
- }
-
- // Initialize farend buffer
- if (WebRtcApm_InitBuffer(aecpc->farendBuf) == -1) {
- aecpc->lastError = AEC_UNSPECIFIED_ERROR;
- return -1;
- }
-
- if (WebRtcAec_InitResampler(aecpc->resampler, aecpc->scSampFreq) == -1) {
- aecpc->lastError = AEC_UNSPECIFIED_ERROR;
- return -1;
- }
-
- aecpc->initFlag = initCheck; // indicates that initilisation has been done
-
- if (aecpc->sampFreq == 32000) {
- aecpc->splitSampFreq = 16000;
- }
- else {
- aecpc->splitSampFreq = sampFreq;
- }
-
- aecpc->skewFrCtr = 0;
- aecpc->activity = 0;
-
- aecpc->delayChange = 1;
- aecpc->delayCtr = 0;
-
- aecpc->sum = 0;
- aecpc->counter = 0;
- aecpc->checkBuffSize = 1;
- aecpc->firstVal = 0;
-
- aecpc->ECstartup = 1;
- aecpc->bufSizeStart = 0;
- aecpc->checkBufSizeCtr = 0;
- aecpc->filtDelay = 0;
- aecpc->timeForDelayChange =0;
- aecpc->knownDelay = 0;
- aecpc->lastDelayDiff = 0;
-
- aecpc->skew = 0;
- aecpc->resample = kAecFalse;
- aecpc->highSkewCtr = 0;
- aecpc->sampFactor = (aecpc->scSampFreq * 1.0f) / aecpc->splitSampFreq;
-
- memset(&aecpc->farendOld[0][0], 0, 160);
-
- // Default settings.
- aecConfig.nlpMode = kAecNlpModerate;
- aecConfig.skewMode = kAecFalse;
- aecConfig.metricsMode = kAecFalse;
-
- if (WebRtcAec_set_config(aecpc, aecConfig) == -1) {
- aecpc->lastError = AEC_UNSPECIFIED_ERROR;
- return -1;
- }
-
- return 0;
-}
-
-// only buffer L band for farend
-WebRtc_Word32 WebRtcAec_BufferFarend(void *aecInst, const WebRtc_Word16 *farend,
- WebRtc_Word16 nrOfSamples)
-{
- aecpc_t *aecpc = aecInst;
- WebRtc_Word32 retVal = 0;
- short newNrOfSamples;
- short newFarend[MAX_RESAMP_LEN];
- float skew;
-
- if (aecpc == NULL) {
- return -1;
- }
-
- if (farend == NULL) {
- aecpc->lastError = AEC_NULL_POINTER_ERROR;
- return -1;
- }
-
- if (aecpc->initFlag != initCheck) {
- aecpc->lastError = AEC_UNINITIALIZED_ERROR;
- return -1;
- }
-
- // number of samples == 160 for SWB input
- if (nrOfSamples != 80 && nrOfSamples != 160) {
- aecpc->lastError = AEC_BAD_PARAMETER_ERROR;
- return -1;
- }
-
- skew = aecpc->skew;
-
- // TODO: Is this really a good idea?
- if (!aecpc->ECstartup) {
- DelayComp(aecpc);
- }
-
- if (aecpc->skewMode == kAecTrue && aecpc->resample == kAecTrue) {
- // Resample and get a new number of samples
- newNrOfSamples = WebRtcAec_ResampleLinear(aecpc->resampler,
- farend,
- nrOfSamples,
- skew,
- newFarend);
- WebRtcApm_WriteBuffer(aecpc->farendBuf, newFarend, newNrOfSamples);
-
-#ifdef AEC_DEBUG
- fwrite(farend, 2, nrOfSamples, aecpc->preCompFile);
- fwrite(newFarend, 2, newNrOfSamples, aecpc->postCompFile);
-#endif
- }
- else {
- WebRtcApm_WriteBuffer(aecpc->farendBuf, farend, nrOfSamples);
- }
-
- return retVal;
-}
-
-WebRtc_Word32 WebRtcAec_Process(void *aecInst, const WebRtc_Word16 *nearend,
- const WebRtc_Word16 *nearendH, WebRtc_Word16 *out, WebRtc_Word16 *outH,
- WebRtc_Word16 nrOfSamples, WebRtc_Word16 msInSndCardBuf, WebRtc_Word32 skew)
-{
- aecpc_t *aecpc = aecInst;
- WebRtc_Word32 retVal = 0;
- short i;
- short farend[FRAME_LEN];
- short nmbrOfFilledBuffers;
- short nBlocks10ms;
- short nFrames;
-#ifdef AEC_DEBUG
- short msInAECBuf;
-#endif
- // Limit resampling to doubling/halving of signal
- const float minSkewEst = -0.5f;
- const float maxSkewEst = 1.0f;
-
- if (aecpc == NULL) {
- return -1;
- }
-
- if (nearend == NULL) {
- aecpc->lastError = AEC_NULL_POINTER_ERROR;
- return -1;
- }
-
- if (out == NULL) {
- aecpc->lastError = AEC_NULL_POINTER_ERROR;
- return -1;
- }
-
- if (aecpc->initFlag != initCheck) {
- aecpc->lastError = AEC_UNINITIALIZED_ERROR;
- return -1;
- }
-
- // number of samples == 160 for SWB input
- if (nrOfSamples != 80 && nrOfSamples != 160) {
- aecpc->lastError = AEC_BAD_PARAMETER_ERROR;
- return -1;
- }
-
- // Check for valid pointers based on sampling rate
- if (aecpc->sampFreq == 32000 && nearendH == NULL) {
- aecpc->lastError = AEC_NULL_POINTER_ERROR;
- return -1;
- }
-
- if (msInSndCardBuf < 0) {
- msInSndCardBuf = 0;
- aecpc->lastError = AEC_BAD_PARAMETER_WARNING;
- retVal = -1;
- }
- else if (msInSndCardBuf > 500) {
- msInSndCardBuf = 500;
- aecpc->lastError = AEC_BAD_PARAMETER_WARNING;
- retVal = -1;
- }
- msInSndCardBuf += 10;
- aecpc->msInSndCardBuf = msInSndCardBuf;
-
- if (aecpc->skewMode == kAecTrue) {
- if (aecpc->skewFrCtr < 25) {
- aecpc->skewFrCtr++;
- }
- else {
- retVal = WebRtcAec_GetSkew(aecpc->resampler, skew, &aecpc->skew);
- if (retVal == -1) {
- aecpc->skew = 0;
- aecpc->lastError = AEC_BAD_PARAMETER_WARNING;
- }
-
- aecpc->skew /= aecpc->sampFactor*nrOfSamples;
-
- if (aecpc->skew < 1.0e-3 && aecpc->skew > -1.0e-3) {
- aecpc->resample = kAecFalse;
- }
- else {
- aecpc->resample = kAecTrue;
- }
-
- if (aecpc->skew < minSkewEst) {
- aecpc->skew = minSkewEst;
- }
- else if (aecpc->skew > maxSkewEst) {
- aecpc->skew = maxSkewEst;
- }
-
-#ifdef AEC_DEBUG
- fwrite(&aecpc->skew, sizeof(aecpc->skew), 1, aecpc->skewFile);
-#endif
- }
- }
-
- nFrames = nrOfSamples / FRAME_LEN;
- nBlocks10ms = nFrames / aecpc->aec->mult;
-
- if (aecpc->ECstartup) {
- memcpy(out, nearend, sizeof(short) * nrOfSamples);
- nmbrOfFilledBuffers = WebRtcApm_get_buffer_size(aecpc->farendBuf) / FRAME_LEN;
-
- // The AEC is in the start up mode
- // AEC is disabled until the soundcard buffer and farend buffers are OK
-
- // Mechanism to ensure that the soundcard buffer is reasonably stable.
- if (aecpc->checkBuffSize) {
-
- aecpc->checkBufSizeCtr++;
- // Before we fill up the far end buffer we require the amount of data on the
- // sound card to be stable (+/-8 ms) compared to the first value. This
- // comparison is made during the following 4 consecutive frames. If it seems
- // to be stable then we start to fill up the far end buffer.
-
- if (aecpc->counter == 0) {
- aecpc->firstVal = aecpc->msInSndCardBuf;
- aecpc->sum = 0;
- }
-
- if (abs(aecpc->firstVal - aecpc->msInSndCardBuf) <
- WEBRTC_SPL_MAX(0.2 * aecpc->msInSndCardBuf, sampMsNb)) {
- aecpc->sum += aecpc->msInSndCardBuf;
- aecpc->counter++;
- }
- else {
- aecpc->counter = 0;
- }
-
- if (aecpc->counter*nBlocks10ms >= 6) {
- // The farend buffer size is determined in blocks of 80 samples
- // Use 75% of the average value of the soundcard buffer
- aecpc->bufSizeStart = WEBRTC_SPL_MIN((int) (0.75 * (aecpc->sum *
- aecpc->aec->mult) / (aecpc->counter * 10)), BUF_SIZE_FRAMES);
- // buffersize has now been determined
- aecpc->checkBuffSize = 0;
- }
-
- if (aecpc->checkBufSizeCtr * nBlocks10ms > 50) {
- // for really bad sound cards, don't disable echocanceller for more than 0.5 sec
- aecpc->bufSizeStart = WEBRTC_SPL_MIN((int) (0.75 * (aecpc->msInSndCardBuf *
- aecpc->aec->mult) / 10), BUF_SIZE_FRAMES);
- aecpc->checkBuffSize = 0;
- }
- }
-
- // if checkBuffSize changed in the if-statement above
- if (!aecpc->checkBuffSize) {
- // soundcard buffer is now reasonably stable
- // When the far end buffer is filled with approximately the same amount of
- // data as the amount on the sound card we end the start up phase and start
- // to cancel echoes.
-
- if (nmbrOfFilledBuffers == aecpc->bufSizeStart) {
- aecpc->ECstartup = 0; // Enable the AEC
- }
- else if (nmbrOfFilledBuffers > aecpc->bufSizeStart) {
- WebRtcApm_FlushBuffer(aecpc->farendBuf, WebRtcApm_get_buffer_size(aecpc->farendBuf) -
- aecpc->bufSizeStart * FRAME_LEN);
- aecpc->ECstartup = 0;
- }
- }
-
- }
- else {
- // AEC is enabled
-
- // Note only 1 block supported for nb and 2 blocks for wb
- for (i = 0; i < nFrames; i++) {
- nmbrOfFilledBuffers = WebRtcApm_get_buffer_size(aecpc->farendBuf) / FRAME_LEN;
-
- // Check that there is data in the far end buffer
- if (nmbrOfFilledBuffers > 0) {
- // Get the next 80 samples from the farend buffer
- WebRtcApm_ReadBuffer(aecpc->farendBuf, farend, FRAME_LEN);
-
- // Always store the last frame for use when we run out of data
- memcpy(&(aecpc->farendOld[i][0]), farend, FRAME_LEN * sizeof(short));
- }
- else {
- // We have no data so we use the last played frame
- memcpy(farend, &(aecpc->farendOld[i][0]), FRAME_LEN * sizeof(short));
- }
-
- // Call buffer delay estimator when all data is extracted,
- // i.e. i = 0 for NB and i = 1 for WB or SWB
- if ((i == 0 && aecpc->splitSampFreq == 8000) ||
- (i == 1 && (aecpc->splitSampFreq == 16000))) {
- EstBufDelay(aecpc, aecpc->msInSndCardBuf);
- }
-
- // Call the AEC
- WebRtcAec_ProcessFrame(aecpc->aec, farend, &nearend[FRAME_LEN * i], &nearendH[FRAME_LEN * i],
- &out[FRAME_LEN * i], &outH[FRAME_LEN * i], aecpc->knownDelay);
- }
- }
-
-#ifdef AEC_DEBUG
- msInAECBuf = WebRtcApm_get_buffer_size(aecpc->farendBuf) / (sampMsNb*aecpc->aec->mult);
- fwrite(&msInAECBuf, 2, 1, aecpc->bufFile);
- fwrite(&(aecpc->knownDelay), sizeof(aecpc->knownDelay), 1, aecpc->delayFile);
-#endif
-
- return retVal;
-}
-
-WebRtc_Word32 WebRtcAec_set_config(void *aecInst, AecConfig config)
-{
- aecpc_t *aecpc = aecInst;
-
- if (aecpc == NULL) {
- return -1;
- }
-
- if (aecpc->initFlag != initCheck) {
- aecpc->lastError = AEC_UNINITIALIZED_ERROR;
- return -1;
- }
-
- if (config.skewMode != kAecFalse && config.skewMode != kAecTrue) {
- aecpc->lastError = AEC_BAD_PARAMETER_ERROR;
- return -1;
- }
- aecpc->skewMode = config.skewMode;
-
- if (config.nlpMode != kAecNlpConservative && config.nlpMode !=
- kAecNlpModerate && config.nlpMode != kAecNlpAggressive) {
- aecpc->lastError = AEC_BAD_PARAMETER_ERROR;
- return -1;
- }
- aecpc->nlpMode = config.nlpMode;
- aecpc->aec->targetSupp = targetSupp[aecpc->nlpMode];
- aecpc->aec->minOverDrive = minOverDrive[aecpc->nlpMode];
-
- if (config.metricsMode != kAecFalse && config.metricsMode != kAecTrue) {
- aecpc->lastError = AEC_BAD_PARAMETER_ERROR;
- return -1;
- }
- aecpc->aec->metricsMode = config.metricsMode;
- if (aecpc->aec->metricsMode == kAecTrue) {
- WebRtcAec_InitMetrics(aecpc->aec);
- }
-
- return 0;
-}
-
-WebRtc_Word32 WebRtcAec_get_config(void *aecInst, AecConfig *config)
-{
- aecpc_t *aecpc = aecInst;
-
- if (aecpc == NULL) {
- return -1;
- }
-
- if (config == NULL) {
- aecpc->lastError = AEC_NULL_POINTER_ERROR;
- return -1;
- }
-
- if (aecpc->initFlag != initCheck) {
- aecpc->lastError = AEC_UNINITIALIZED_ERROR;
- return -1;
- }
-
- config->nlpMode = aecpc->nlpMode;
- config->skewMode = aecpc->skewMode;
- config->metricsMode = aecpc->aec->metricsMode;
-
- return 0;
-}
-
-WebRtc_Word32 WebRtcAec_get_echo_status(void *aecInst, WebRtc_Word16 *status)
-{
- aecpc_t *aecpc = aecInst;
-
- if (aecpc == NULL) {
- return -1;
- }
-
- if (status == NULL) {
- aecpc->lastError = AEC_NULL_POINTER_ERROR;
- return -1;
- }
-
- if (aecpc->initFlag != initCheck) {
- aecpc->lastError = AEC_UNINITIALIZED_ERROR;
- return -1;
- }
-
- *status = aecpc->aec->echoState;
-
- return 0;
-}
-
-WebRtc_Word32 WebRtcAec_GetMetrics(void *aecInst, AecMetrics *metrics)
-{
- const float upweight = 0.7f;
- float dtmp;
- short stmp;
- aecpc_t *aecpc = aecInst;
-
- if (aecpc == NULL) {
- return -1;
- }
-
- if (metrics == NULL) {
- aecpc->lastError = AEC_NULL_POINTER_ERROR;
- return -1;
- }
-
- if (aecpc->initFlag != initCheck) {
- aecpc->lastError = AEC_UNINITIALIZED_ERROR;
- return -1;
- }
-
- // ERL
- metrics->erl.instant = (short) aecpc->aec->erl.instant;
-
- if ((aecpc->aec->erl.himean > offsetLevel) && (aecpc->aec->erl.average > offsetLevel)) {
- // Use a mix between regular average and upper part average
- dtmp = upweight * aecpc->aec->erl.himean + (1 - upweight) * aecpc->aec->erl.average;
- metrics->erl.average = (short) dtmp;
- }
- else {
- metrics->erl.average = offsetLevel;
- }
-
- metrics->erl.max = (short) aecpc->aec->erl.max;
-
- if (aecpc->aec->erl.min < (offsetLevel * (-1))) {
- metrics->erl.min = (short) aecpc->aec->erl.min;
- }
- else {
- metrics->erl.min = offsetLevel;
- }
-
- // ERLE
- metrics->erle.instant = (short) aecpc->aec->erle.instant;
-
- if ((aecpc->aec->erle.himean > offsetLevel) && (aecpc->aec->erle.average > offsetLevel)) {
- // Use a mix between regular average and upper part average
- dtmp = upweight * aecpc->aec->erle.himean + (1 - upweight) * aecpc->aec->erle.average;
- metrics->erle.average = (short) dtmp;
- }
- else {
- metrics->erle.average = offsetLevel;
- }
-
- metrics->erle.max = (short) aecpc->aec->erle.max;
-
- if (aecpc->aec->erle.min < (offsetLevel * (-1))) {
- metrics->erle.min = (short) aecpc->aec->erle.min;
- } else {
- metrics->erle.min = offsetLevel;
- }
-
- // RERL
- if ((metrics->erl.average > offsetLevel) && (metrics->erle.average > offsetLevel)) {
- stmp = metrics->erl.average + metrics->erle.average;
- }
- else {
- stmp = offsetLevel;
- }
- metrics->rerl.average = stmp;
-
- // No other statistics needed, but returned for completeness
- metrics->rerl.instant = stmp;
- metrics->rerl.max = stmp;
- metrics->rerl.min = stmp;
-
- // A_NLP
- metrics->aNlp.instant = (short) aecpc->aec->aNlp.instant;
-
- if ((aecpc->aec->aNlp.himean > offsetLevel) && (aecpc->aec->aNlp.average > offsetLevel)) {
- // Use a mix between regular average and upper part average
- dtmp = upweight * aecpc->aec->aNlp.himean + (1 - upweight) * aecpc->aec->aNlp.average;
- metrics->aNlp.average = (short) dtmp;
- }
- else {
- metrics->aNlp.average = offsetLevel;
- }
-
- metrics->aNlp.max = (short) aecpc->aec->aNlp.max;
-
- if (aecpc->aec->aNlp.min < (offsetLevel * (-1))) {
- metrics->aNlp.min = (short) aecpc->aec->aNlp.min;
- }
- else {
- metrics->aNlp.min = offsetLevel;
- }
-
- return 0;
-}
-
-WebRtc_Word32 WebRtcAec_get_version(WebRtc_Word8 *versionStr, WebRtc_Word16 len)
-{
- const char version[] = "AEC 2.5.0";
- const short versionLen = (short)strlen(version) + 1; // +1 for null-termination
-
- if (versionStr == NULL) {
- return -1;
- }
-
- if (versionLen > len) {
- return -1;
- }
-
- strncpy(versionStr, version, versionLen);
- return 0;
-}
-
-WebRtc_Word32 WebRtcAec_get_error_code(void *aecInst)
-{
- aecpc_t *aecpc = aecInst;
-
- if (aecpc == NULL) {
- return -1;
- }
-
- return aecpc->lastError;
-}
-
-static int EstBufDelay(aecpc_t *aecpc, short msInSndCardBuf)
-{
- short delayNew, nSampFar, nSampSndCard;
- short diff;
-
- nSampFar = WebRtcApm_get_buffer_size(aecpc->farendBuf);
- nSampSndCard = msInSndCardBuf * sampMsNb * aecpc->aec->mult;
-
- delayNew = nSampSndCard - nSampFar;
-
- // Account for resampling frame delay
- if (aecpc->skewMode == kAecTrue && aecpc->resample == kAecTrue) {
- delayNew -= kResamplingDelay;
- }
-
- if (delayNew < FRAME_LEN) {
- WebRtcApm_FlushBuffer(aecpc->farendBuf, FRAME_LEN);
- delayNew += FRAME_LEN;
- }
-
- aecpc->filtDelay = WEBRTC_SPL_MAX(0, (short)(0.8*aecpc->filtDelay + 0.2*delayNew));
-
- diff = aecpc->filtDelay - aecpc->knownDelay;
- if (diff > 224) {
- if (aecpc->lastDelayDiff < 96) {
- aecpc->timeForDelayChange = 0;
- }
- else {
- aecpc->timeForDelayChange++;
- }
- }
- else if (diff < 96 && aecpc->knownDelay > 0) {
- if (aecpc->lastDelayDiff > 224) {
- aecpc->timeForDelayChange = 0;
- }
- else {
- aecpc->timeForDelayChange++;
- }
- }
- else {
- aecpc->timeForDelayChange = 0;
- }
- aecpc->lastDelayDiff = diff;
-
- if (aecpc->timeForDelayChange > 25) {
- aecpc->knownDelay = WEBRTC_SPL_MAX((int)aecpc->filtDelay - 160, 0);
- }
- return 0;
-}
-
-static int DelayComp(aecpc_t *aecpc)
-{
- int nSampFar, nSampSndCard, delayNew, nSampAdd;
- const int maxStuffSamp = 10 * FRAME_LEN;
-
- nSampFar = WebRtcApm_get_buffer_size(aecpc->farendBuf);
- nSampSndCard = aecpc->msInSndCardBuf * sampMsNb * aecpc->aec->mult;
- delayNew = nSampSndCard - nSampFar;
-
- // Account for resampling frame delay
- if (aecpc->skewMode == kAecTrue && aecpc->resample == kAecTrue) {
- delayNew -= kResamplingDelay;
- }
-
- if (delayNew > FAR_BUF_LEN - FRAME_LEN*aecpc->aec->mult) {
- // The difference of the buffersizes is larger than the maximum
- // allowed known delay. Compensate by stuffing the buffer.
- nSampAdd = (int)(WEBRTC_SPL_MAX((int)(0.5 * nSampSndCard - nSampFar),
- FRAME_LEN));
- nSampAdd = WEBRTC_SPL_MIN(nSampAdd, maxStuffSamp);
-
- WebRtcApm_StuffBuffer(aecpc->farendBuf, nSampAdd);
- aecpc->delayChange = 1; // the delay needs to be updated
- }
-
- return 0;
-}
diff --git a/src/modules/audio_processing/aec/main/source/resampler.c b/src/modules/audio_processing/aec/main/source/resampler.c
deleted file mode 100644
index 4caa6f4..0000000
--- a/src/modules/audio_processing/aec/main/source/resampler.c
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-/* Resamples a signal to an arbitrary rate. Used by the AEC to compensate for clock
- * skew by resampling the farend signal.
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-
-#include "resampler.h"
-#include "aec_core.h"
-
-enum { kFrameBufferSize = FRAME_LEN * 4 };
-enum { kEstimateLengthFrames = 400 };
-
-typedef struct {
- short buffer[kFrameBufferSize];
- float position;
-
- int deviceSampleRateHz;
- int skewData[kEstimateLengthFrames];
- int skewDataIndex;
- float skewEstimate;
-} resampler_t;
-
-static int EstimateSkew(const int* rawSkew,
- int size,
- int absLimit,
- float *skewEst);
-
-int WebRtcAec_CreateResampler(void **resampInst)
-{
- resampler_t *obj = malloc(sizeof(resampler_t));
- *resampInst = obj;
- if (obj == NULL) {
- return -1;
- }
-
- return 0;
-}
-
-int WebRtcAec_InitResampler(void *resampInst, int deviceSampleRateHz)
-{
- resampler_t *obj = (resampler_t*) resampInst;
- memset(obj->buffer, 0, sizeof(obj->buffer));
- obj->position = 0.0;
-
- obj->deviceSampleRateHz = deviceSampleRateHz;
- memset(obj->skewData, 0, sizeof(obj->skewData));
- obj->skewDataIndex = 0;
- obj->skewEstimate = 0.0;
-
- return 0;
-}
-
-int WebRtcAec_FreeResampler(void *resampInst)
-{
- resampler_t *obj = (resampler_t*) resampInst;
- free(obj);
-
- return 0;
-}
-
-int WebRtcAec_ResampleLinear(void *resampInst,
- const short *inspeech,
- int size,
- float skew,
- short *outspeech)
-{
- resampler_t *obj = (resampler_t*) resampInst;
-
- short *y;
- float be, tnew, interp;
- int tn, outsize, mm;
-
- if (size < 0 || size > 2 * FRAME_LEN) {
- return -1;
- }
-
- // Add new frame data in lookahead
- memcpy(&obj->buffer[FRAME_LEN + kResamplingDelay],
- inspeech,
- size * sizeof(short));
-
- // Sample rate ratio
- be = 1 + skew;
-
- // Loop over input frame
- mm = 0;
- y = &obj->buffer[FRAME_LEN]; // Point at current frame
-
- tnew = be * mm + obj->position;
- tn = (int) tnew;
-
- while (tn < size) {
-
- // Interpolation
- interp = y[tn] + (tnew - tn) * (y[tn+1] - y[tn]);
-
- if (interp > 32767) {
- interp = 32767;
- }
- else if (interp < -32768) {
- interp = -32768;
- }
-
- outspeech[mm] = (short) interp;
- mm++;
-
- tnew = be * mm + obj->position;
- tn = (int) tnew;
- }
-
- outsize = mm;
- obj->position += outsize * be - size;
-
- // Shift buffer
- memmove(obj->buffer,
- &obj->buffer[size],
- (kFrameBufferSize - size) * sizeof(short));
-
- return outsize;
-}
-
-int WebRtcAec_GetSkew(void *resampInst, int rawSkew, float *skewEst)
-{
- resampler_t *obj = (resampler_t*)resampInst;
- int err = 0;
-
- if (obj->skewDataIndex < kEstimateLengthFrames) {
- obj->skewData[obj->skewDataIndex] = rawSkew;
- obj->skewDataIndex++;
- }
- else if (obj->skewDataIndex == kEstimateLengthFrames) {
- err = EstimateSkew(obj->skewData,
- kEstimateLengthFrames,
- obj->deviceSampleRateHz,
- skewEst);
- obj->skewEstimate = *skewEst;
- obj->skewDataIndex++;
- }
- else {
- *skewEst = obj->skewEstimate;
- }
-
- return err;
-}
-
-int EstimateSkew(const int* rawSkew,
- const int size,
- const int deviceSampleRateHz,
- float *skewEst)
-{
- const int absLimitOuter = (int)(0.04f * deviceSampleRateHz);
- const int absLimitInner = (int)(0.0025f * deviceSampleRateHz);
- int i = 0;
- int n = 0;
- float rawAvg = 0;
- float err = 0;
- float rawAbsDev = 0;
- int upperLimit = 0;
- int lowerLimit = 0;
- float cumSum = 0;
- float x = 0;
- float x2 = 0;
- float y = 0;
- float xy = 0;
- float xAvg = 0;
- float yAvg = 0;
- float denom = 0;
- float skew = 0;
-
- *skewEst = 0; // Set in case of error below.
- for (i = 0; i < size; i++) {
- if ((rawSkew[i] < absLimitOuter && rawSkew[i] > -absLimitOuter)) {
- n++;
- rawAvg += rawSkew[i];
- }
- }
-
- if (n == 0) {
- return -1;
- }
- assert(n > 0);
- rawAvg /= n;
-
- for (i = 0; i < size; i++) {
- if ((rawSkew[i] < absLimitOuter && rawSkew[i] > -absLimitOuter)) {
- err = rawSkew[i] - rawAvg;
- rawAbsDev += err >= 0 ? err : -err;
- }
- }
- assert(n > 0);
- rawAbsDev /= n;
- upperLimit = (int)(rawAvg + 5 * rawAbsDev + 1); // +1 for ceiling.
- lowerLimit = (int)(rawAvg - 5 * rawAbsDev - 1); // -1 for floor.
-
- n = 0;
- for (i = 0; i < size; i++) {
- if ((rawSkew[i] < absLimitInner && rawSkew[i] > -absLimitInner) ||
- (rawSkew[i] < upperLimit && rawSkew[i] > lowerLimit)) {
- n++;
- cumSum += rawSkew[i];
- x += n;
- x2 += n*n;
- y += cumSum;
- xy += n * cumSum;
- }
- }
-
- if (n == 0) {
- return -1;
- }
- assert(n > 0);
- xAvg = x / n;
- yAvg = y / n;
- denom = x2 - xAvg*x;
-
- if (denom != 0) {
- skew = (xy - xAvg*y) / denom;
- }
-
- *skewEst = skew;
- return 0;
-}
diff --git a/src/modules/audio_processing/aec/main/source/resampler.h b/src/modules/audio_processing/aec/main/source/resampler.h
deleted file mode 100644
index 9cb2837..0000000
--- a/src/modules/audio_processing/aec/main/source/resampler.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_SOURCE_RESAMPLER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_SOURCE_RESAMPLER_H_
-
-enum { kResamplingDelay = 1 };
-
-// Unless otherwise specified, functions return 0 on success and -1 on error
-int WebRtcAec_CreateResampler(void **resampInst);
-int WebRtcAec_InitResampler(void *resampInst, int deviceSampleRateHz);
-int WebRtcAec_FreeResampler(void *resampInst);
-
-// Estimates skew from raw measurement.
-int WebRtcAec_GetSkew(void *resampInst, int rawSkew, float *skewEst);
-
-// Resamples input using linear interpolation.
-// Returns size of resampled array.
-int WebRtcAec_ResampleLinear(void *resampInst,
- const short *inspeech,
- int size,
- float skew,
- short *outspeech);
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_MAIN_SOURCE_RESAMPLER_H_
diff --git a/src/modules/audio_processing/aecm/main/interface/echo_control_mobile.h b/src/modules/audio_processing/aecm/main/interface/echo_control_mobile.h
deleted file mode 100644
index 26b1172..0000000
--- a/src/modules/audio_processing/aecm/main/interface/echo_control_mobile.h
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AECM_MAIN_INTERFACE_ECHO_CONTROL_MOBILE_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AECM_MAIN_INTERFACE_ECHO_CONTROL_MOBILE_H_
-
-#include "typedefs.h"
-
-enum {
- AecmFalse = 0,
- AecmTrue
-};
-
-// Errors
-#define AECM_UNSPECIFIED_ERROR 12000
-#define AECM_UNSUPPORTED_FUNCTION_ERROR 12001
-#define AECM_UNINITIALIZED_ERROR 12002
-#define AECM_NULL_POINTER_ERROR 12003
-#define AECM_BAD_PARAMETER_ERROR 12004
-
-// Warnings
-#define AECM_BAD_PARAMETER_WARNING 12100
-
-typedef struct {
- WebRtc_Word16 cngMode; // AECM_FALSE, AECM_TRUE (default)
- WebRtc_Word16 echoMode; // 0, 1, 2, 3 (default), 4
-} AecmConfig;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Allocates the memory needed by the AECM. The memory needs to be
- * initialized separately using the WebRtcAecm_Init() function.
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * void **aecmInst Pointer to the AECM instance to be
- * created and initialized
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * WebRtc_Word32 return 0: OK
- * -1: error
- */
-WebRtc_Word32 WebRtcAecm_Create(void **aecmInst);
-
-/*
- * This function releases the memory allocated by WebRtcAecm_Create()
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * void *aecmInst Pointer to the AECM instance
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * WebRtc_Word32 return 0: OK
- * -1: error
- */
-WebRtc_Word32 WebRtcAecm_Free(void *aecmInst);
-
-/*
- * Initializes an AECM instance.
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * void *aecmInst Pointer to the AECM instance
- * WebRtc_Word32 sampFreq Sampling frequency of data
- * WebRtc_Word32 scSampFreq Soundcard sampling frequency
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * WebRtc_Word32 return 0: OK
- * -1: error
- */
-WebRtc_Word32 WebRtcAecm_Init(void* aecmInst,
- WebRtc_Word32 sampFreq,
- WebRtc_Word32 scSampFreq);
-
-/*
- * Inserts an 80 or 160 sample block of data into the farend buffer.
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * void *aecmInst Pointer to the AECM instance
- * WebRtc_Word16 *farend In buffer containing one frame of
- * farend signal
- * WebRtc_Word16 nrOfSamples Number of samples in farend buffer
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * WebRtc_Word32 return 0: OK
- * -1: error
- */
-WebRtc_Word32 WebRtcAecm_BufferFarend(void* aecmInst,
- const WebRtc_Word16* farend,
- WebRtc_Word16 nrOfSamples);
-
-/*
- * Runs the AECM on an 80 or 160 sample blocks of data.
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * void *aecmInst Pointer to the AECM instance
- * WebRtc_Word16 *nearendNoisy In buffer containing one frame of
- * reference nearend+echo signal. If
- * noise reduction is active, provide
- * the noisy signal here.
- * WebRtc_Word16 *nearendClean In buffer containing one frame of
- * nearend+echo signal. If noise
- * reduction is active, provide the
- * clean signal here. Otherwise pass a
- * NULL pointer.
- * WebRtc_Word16 nrOfSamples Number of samples in nearend buffer
- * WebRtc_Word16 msInSndCardBuf Delay estimate for sound card and
- * system buffers
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * WebRtc_Word16 *out Out buffer, one frame of processed nearend
- * WebRtc_Word32 return 0: OK
- * -1: error
- */
-WebRtc_Word32 WebRtcAecm_Process(void* aecmInst,
- const WebRtc_Word16* nearendNoisy,
- const WebRtc_Word16* nearendClean,
- WebRtc_Word16* out,
- WebRtc_Word16 nrOfSamples,
- WebRtc_Word16 msInSndCardBuf);
-
-/*
- * This function enables the user to set certain parameters on-the-fly
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * void *aecmInst Pointer to the AECM instance
- * AecmConfig config Config instance that contains all
- * properties to be set
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * WebRtc_Word32 return 0: OK
- * -1: error
- */
-WebRtc_Word32 WebRtcAecm_set_config(void* aecmInst,
- AecmConfig config);
-
-/*
- * This function enables the user to set certain parameters on-the-fly
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * void *aecmInst Pointer to the AECM instance
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * AecmConfig *config Pointer to the config instance that
- * all properties will be written to
- * WebRtc_Word32 return 0: OK
- * -1: error
- */
-WebRtc_Word32 WebRtcAecm_get_config(void *aecmInst,
- AecmConfig *config);
-
-/*
- * Gets the last error code.
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * void *aecmInst Pointer to the AECM instance
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * WebRtc_Word32 return 11000-11100: error code
- */
-WebRtc_Word32 WebRtcAecm_get_error_code(void *aecmInst);
-
-/*
- * Gets a version string
- *
- * Inputs Description
- * -------------------------------------------------------------------
- * char *versionStr Pointer to a string array
- * WebRtc_Word16 len The maximum length of the string
- *
- * Outputs Description
- * -------------------------------------------------------------------
- * WebRtc_Word8 *versionStr Pointer to a string array
- * WebRtc_Word32 return 0: OK
- * -1: error
- */
-WebRtc_Word32 WebRtcAecm_get_version(WebRtc_Word8 *versionStr,
- WebRtc_Word16 len);
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* WEBRTC_MODULES_AUDIO_PROCESSING_AECM_MAIN_INTERFACE_ECHO_CONTROL_MOBILE_H_ */
diff --git a/src/modules/audio_processing/aecm/main/matlab/compsup.m b/src/modules/audio_processing/aecm/main/matlab/compsup.m
deleted file mode 100644
index 9575ec4..0000000
--- a/src/modules/audio_processing/aecm/main/matlab/compsup.m
+++ /dev/null
@@ -1,447 +0,0 @@
-function [emicrophone,aaa]=compsup(microphone,TheFarEnd,avtime,samplingfreq);
-% microphone = microphone signal
-% aaa = nonlinearity input variable
-% TheFarEnd = far end signal
-% avtime = interval to compute suppression from (seconds)
-% samplingfreq = sampling frequency
-
-%if(nargin==6)
-% fprintf(1,'suppress has received a delay sequence\n');
-%end
-
-
-Ap500=[ 1.00, -4.95, 9.801, -9.70299, 4.80298005, -0.9509900499];
-Bp500=[ 0.662743088639636, -2.5841655608125, 3.77668102146288, -2.45182477425154, 0.596566274575251, 0.0];
-
-
-Ap200=[ 1.00, -4.875, 9.50625, -9.26859375, 4.518439453125, -0.881095693359375];
-Bp200=[ 0.862545460994275, -3.2832804496114, 4.67892032308828, -2.95798023879133, 0.699796870041299, 0.0];
-
-maxDelay=0.4; %[s]
-histLen=1; %[s]
-
-
-% CONSTANTS THAT YOU CAN EXPERIMENT WITH
-A_GAIN=10.0; % for the suppress case
-oversampling = 2; % must be power of 2; minimum is 2; 4 works
-% fine for support=64, but for support=128,
-% 8 gives better results.
-support=64; %512 % fft support (frequency resolution; at low
-% settings you can hear more distortion
-% (e.g. pitch that is left-over from far-end))
-% 128 works well, 64 is ok)
-
-lowlevel = mean(abs(microphone))*0.0001;
-
-G_ol = 0; % Use overlapping sets of estimates
-
-% ECHO SUPPRESSION SPECIFIC PARAMETERS
-suppress_overdrive=1.0; % overdrive factor for suppression 1.4 is good
-gamma_echo=1.0; % same as suppress_overdrive but at different place
-de_echo_bound=0.0;
-mLim=10; % rank of matrix G
-%limBW = 1; % use bandwidth-limited response for G
-if mLim > (support/2+1)
- error('mLim in suppress.m too large\n');
-end
-
-
-dynrange=1.0000e-004;
-
-% other, constants
-hsupport = support/2;
-hsupport1 = hsupport+1;
-factor = 2 / oversampling;
-updatel = support/oversampling;
-win=sqrt(designwindow(0,support));
-estLen = round(avtime * samplingfreq/updatel)
-
-runningfmean =0.0;
-
-mLim = floor(hsupport1/2);
-V = sqrt(2/hsupport1)*cos(pi/hsupport1*(repmat((0:hsupport1-1) + 0.5, mLim, 1).* ...
- repmat((0:mLim-1)' + 0.5, 1, hsupport1)));
-
-fprintf(1,'updatel is %5.3f s\n', updatel/samplingfreq);
-
-
-
-bandfirst=8; bandlast=25;
-dosmooth=0; % to get rid of wavy bin counts (can be worse or better)
-
-% compute some constants
-blockLen = support/oversampling;
-maxDelayb = floor(samplingfreq*maxDelay/updatel); % in blocks
-histLenb = floor(samplingfreq*histLen/updatel); % in blocks
-
-x0=TheFarEnd;
-y0=microphone;
-
-
-%input
-tlength=min([length(microphone),length(TheFarEnd)]);
-updateno=floor(tlength/updatel);
-tlength=updatel*updateno;
-updateno = updateno - oversampling + 1;
-
-TheFarEnd =TheFarEnd(1:tlength);
-microphone =microphone(1:tlength);
-
-TheFarEnd =[zeros(hsupport,1);TheFarEnd(1:tlength)];
-microphone =[zeros(hsupport,1);microphone(1:tlength)];
-
-
-% signal length
-n = min([floor(length(x0)/support)*support,floor(length(y0)/support)*support]);
-nb = n/blockLen - oversampling + 1; % in blocks
-
-% initialize space
-win = sqrt([0 ; hanning(support-1)]);
-sxAll2 = zeros(hsupport1,nb);
-syAll2 = zeros(hsupport1,nb);
-
-z500=zeros(5,maxDelayb+1);
-z200=zeros(5,hsupport1);
-
-bxspectrum=uint32(zeros(nb,1));
-bxhist=uint32(zeros(maxDelayb+1,1));
-byspectrum=uint32(zeros(nb,1));
-bcount=zeros(1+maxDelayb,nb);
-fcount=zeros(1+maxDelayb,nb);
-fout=zeros(1+maxDelayb,nb);
-delay=zeros(nb,1);
-tdelay=zeros(nb,1);
-nlgains=zeros(nb,1);
-
-% create space (mainly for debugging)
-emicrophone=zeros(tlength,1);
-femicrophone=complex(zeros(hsupport1,updateno));
-thefilter=zeros(hsupport1,updateno);
-thelimiter=ones(hsupport1,updateno);
-fTheFarEnd=complex(zeros(hsupport1,updateno));
-afTheFarEnd=zeros(hsupport1,updateno);
-fmicrophone=complex(zeros(hsupport1,updateno));
-afmicrophone=zeros(hsupport1,updateno);
-
-G = zeros(hsupport1, hsupport1);
-zerovec = zeros(hsupport1,1);
-zeromat = zeros(hsupport1);
-
-% Reset sums
-mmxs_a = zerovec;
-mmys_a = zerovec;
-s2xs_a = zerovec;
-s2ys_a = zerovec;
-Rxxs_a = zeromat;
-Ryxs_a = zeromat;
-count_a = 1;
-
-mmxs_b = zerovec;
-mmys_b = zerovec;
-s2xs_b = zerovec;
-s2ys_b = zerovec;
-Rxxs_b = zeromat;
-Ryxs_b = zeromat;
-count_b = 1;
-
-nog=0;
-
-aaa=zeros(size(TheFarEnd));
-
-% loop over signal blocks
-fprintf(1,'.. Suppression; averaging G over %5.1f seconds; file length %5.1f seconds ..\n',avtime, length(microphone)/samplingfreq);
-fprintf(1,'.. SUPPRESSING ONLY AFTER %5.1f SECONDS! ..\n',avtime);
-fprintf(1,'.. 20 seconds is good ..\n');
-hh = waitbar_j(0,'Please wait...');
-
-
-for i=1:updateno
-
- sb = (i-1)*updatel + 1;
- se=sb+support-1;
-
- % analysis FFTs
- temp=fft(win .* TheFarEnd(sb:se));
- fTheFarEnd(:,i)=temp(1:hsupport1);
- xf=fTheFarEnd(:,i);
- afTheFarEnd(:,i)= abs(fTheFarEnd(:,i));
-
- temp=win .* microphone(sb:se);
-
- temp=fft(win .* microphone(sb:se));
- fmicrophone(:,i)=temp(1:hsupport1);
- yf=fmicrophone(:,i);
- afmicrophone(:,i)= abs(fmicrophone(:,i));
-
-
- ener_orig = afmicrophone(:,i)'*afmicrophone(:,i);
- if( ener_orig == 0)
- afmicrophone(:,i)=lowlevel*ones(size(afmicrophone(:,i)));
- end
-
-
- % use log domain (showed improved performance)
-xxf= sqrt(real(xf.*conj(xf))+1e-20);
-yyf= sqrt(real(yf.*conj(yf))+1e-20);
- sxAll2(:,i) = 20*log10(xxf);
- syAll2(:,i) = 20*log10(yyf);
-
- mD=min(i-1,maxDelayb);
- xthreshold = sum(sxAll2(:,i-mD:i),2)/(maxDelayb+1);
-
- [yout, z200] = filter(Bp200,Ap200,syAll2(:,i),z200,2);
- yout=yout/(maxDelayb+1);
- ythreshold = mean(syAll2(:,i-mD:i),2);
-
-
- bxspectrum(i)=getBspectrum(sxAll2(:,i),xthreshold,bandfirst,bandlast);
- byspectrum(i)=getBspectrum(syAll2(:,i),yout,bandfirst,bandlast);
-
- bxhist(end-mD:end)=bxspectrum(i-mD:i);
-
- bcount(:,i)=hisser2( ...
- byspectrum(i),flipud(bxhist),bandfirst,bandlast);
-
-
- [fout(:,i), z500] = filter(Bp500,Ap500,bcount(:,i),z500,2);
- fcount(:,i)=sum(bcount(:,max(1,i-histLenb+1):i),2); % using the history range
- fout(:,i)=round(fout(:,i));
- [value,delay(i)]=min(fout(:,i),[],1);
- tdelay(i)=(delay(i)-1)*support/(samplingfreq*oversampling);
-
- % compensate
-
- idel = max(i - delay(i) + 1,1);
-
-
- % echo suppression
-
- noisyspec = afmicrophone(:,i);
-
- % Estimate G using covariance matrices
-
- % Cumulative estimates
- xx = afTheFarEnd(:,idel);
- yy = afmicrophone(:,i);
-
- % Means
- mmxs_a = mmxs_a + xx;
- mmys_a = mmys_a + yy;
- if (G_ol)
- mmxs_b = mmxs_b + xx;
- mmys_b = mmys_b + yy;
- mmy = mean([mmys_a/count_a mmys_b/count_b],2);
- mmx = mean([mmxs_a/count_a mmxs_b/count_b],2);
- else
- mmx = mmxs_a/count_a;
- mmy = mmys_a/count_a;
- end
- count_a = count_a + 1;
- count_b = count_b + 1;
-
- % Mean removal
- xxm = xx - mmx;
- yym = yy - mmy;
-
- % Variances
- s2xs_a = s2xs_a + xxm .* xxm;
- s2ys_a = s2ys_a + yym .* yym;
- s2xs_b = s2xs_b + xxm .* xxm;
- s2ys_b = s2ys_b + yym .* yym;
-
- % Correlation matrices
- Rxxs_a = Rxxs_a + xxm * xxm';
- Ryxs_a = Ryxs_a + yym * xxm';
- Rxxs_b = Rxxs_b + xxm * xxm';
- Ryxs_b = Ryxs_b + yym * xxm';
-
-
- % Gain matrix A
-
- if mod(i, estLen) == 0
-
-
- % Cumulative based estimates
- Rxxf = Rxxs_a / (estLen - 1);
- Ryxf = Ryxs_a / (estLen - 1);
-
- % Variance normalization
- s2x2 = s2xs_a / (estLen - 1);
- s2x2 = sqrt(s2x2);
- % Sx = diag(max(s2x2,dynrange*max(s2x2)));
- Sx = diag(s2x2);
- if (sum(s2x2) > 0)
- iSx = inv(Sx);
- else
- iSx= Sx + 0.01;
- end
-
- s2y2 = s2ys_a / (estLen - 1);
- s2y2 = sqrt(s2y2);
- % Sy = diag(max(s2y2,dynrange*max(s2y2)));
- Sy = diag(s2y2);
- iSy = inv(Sy);
- rx = iSx * Rxxf * iSx;
- ryx = iSy * Ryxf * iSx;
-
-
-
- dbd= 7; % Us less than the full matrix
-
- % k x m
- % Bandlimited structure on G
- LSEon = 0; % Default is using MMSE
- if (LSEon)
- ryx = ryx*rx;
- rx = rx*rx;
- end
- p = dbd-1;
- gaj = min(min(hsupport1,2*p+1),min([p+(1:hsupport1); hsupport1+p+1-(1:hsupport1)]));
- cgaj = [0 cumsum(gaj)];
-
- G3 = zeros(hsupport1);
- for kk=1:hsupport1
- ki = max(0,kk-p-1);
- if (sum(sum(rx(ki+1:ki+gaj(kk),ki+1:ki+gaj(kk))))>0)
- G3(kk,ki+1:ki+gaj(kk)) = ryx(kk,ki+1:ki+gaj(kk))/rx(ki+1:ki+gaj(kk),ki+1:ki+gaj(kk));
- else
- G3(kk,ki+1:ki+gaj(kk)) = ryx(kk,ki+1:ki+gaj(kk));
- end
- end
- % End Bandlimited structure
-
- G = G3;
- G(abs(G)<0.01)=0;
- G = suppress_overdrive * Sy * G * iSx;
-
- if 1
- figure(32); mi=2;
- surf(max(min(G,mi),-mi)); view(2)
- title('Unscaled Masked Limited-bandwidth G');
- end
- pause(0.05);
-
- % Reset sums
- mmxs_a = zerovec;
- mmys_a = zerovec;
- s2xs_a = zerovec;
- s2ys_a = zerovec;
- Rxxs_a = zeromat;
- Ryxs_a = zeromat;
- count_a = 1;
-
- end
-
- if (G_ol)
- % Gain matrix B
-
- if ((mod((i-estLen/2), estLen) == 0) & i>estLen)
-
-
- % Cumulative based estimates
- Rxxf = Rxxs_b / (estLen - 1);
- Ryxf = Ryxs_b / (estLen - 1);
-
- % Variance normalization
- s2x2 = s2xs_b / (estLen - 1);
- s2x2 = sqrt(s2x2);
- Sx = diag(max(s2x2,dynrange*max(s2x2)));
- iSx = inv(Sx);
- s2y2 = s2ys_b / (estLen - 1);
- s2y2 = sqrt(s2y2);
- Sy = diag(max(s2y2,dynrange*max(s2y2)));
- iSy = inv(Sy);
- rx = iSx * Rxxf * iSx;
- ryx = iSy * Ryxf * iSx;
-
-
- % Bandlimited structure on G
- LSEon = 0; % Default is using MMSE
- if (LSEon)
- ryx = ryx*rx;
- rx = rx*rx;
- end
- p = dbd-1;
- gaj = min(min(hsupport1,2*p+1),min([p+(1:hsupport1); hsupport1+p+1-(1:hsupport1)]));
- cgaj = [0 cumsum(gaj)];
-
- G3 = zeros(hsupport1);
- for kk=1:hsupport1
- ki = max(0,kk-p-1);
- G3(kk,ki+1:ki+gaj(kk)) = ryx(kk,ki+1:ki+gaj(kk))/rx(ki+1:ki+gaj(kk),ki+1:ki+gaj(kk));
- end
- % End Bandlimited structure
-
- G = G3;
- G(abs(G)<0.01)=0;
- G = suppress_overdrive * Sy * G * iSx;
-
- if 1
- figure(32); mi=2;
- surf(max(min(G,mi),-mi)); view(2)
- title('Unscaled Masked Limited-bandwidth G');
- end
- pause(0.05);
-
-
- % Reset sums
- mmxs_b = zerovec;
- mmys_b = zerovec;
- s2xs_b = zerovec;
- s2ys_b = zerovec;
- Rxxs_b = zeromat;
- Ryxs_b = zeromat;
- count_b = 1;
-
- end
-
- end
-
- FECestimate2 = G*afTheFarEnd(:,idel);
-
- % compute Wiener filter and suppressor function
- thefilter(:,i) = (noisyspec - gamma_echo*FECestimate2) ./ noisyspec;
- ix0 = find(thefilter(:,i)<de_echo_bound); % bounding trick 1
- thefilter(ix0,i) = de_echo_bound; % bounding trick 2
- ix0 = find(thefilter(:,i)>1); % bounding in reasonable range
- thefilter(ix0,i) = 1;
-
- % NONLINEARITY
- nl_alpha=0.8; % memory; seems not very critical
- nlSeverity=0.3; % nonlinearity severity: 0 does nothing; 1 suppresses all
- thefmean=mean(thefilter(8:16,i));
- if (thefmean<1)
- disp('');
- end
- runningfmean = nl_alpha*runningfmean + (1-nl_alpha)*thefmean;
- aaa(sb+20+1:sb+20+updatel)=10000*runningfmean* ones(updatel,1); % debug
- slope0=1.0/(1.0-nlSeverity); %
- thegain = max(0.0,min(1.0,slope0*(runningfmean-nlSeverity)));
- % END NONLINEARITY
- thefilter(:,i) = thegain*thefilter(:,i);
-
-
- % Wiener filtering
- femicrophone(:,i) = fmicrophone(:,i) .* thefilter(:,i);
- thelimiter(:,i) = (noisyspec - A_GAIN*FECestimate2) ./ noisyspec;
- index = find(thelimiter(:,i)>1.0);
- thelimiter(index,i) = 1.0;
- index = find(thelimiter(:,i)<0.0);
- thelimiter(index,i) = 0.0;
-
- if (rem(i,floor(updateno/20))==0)
- fprintf(1,'.');
- end
- if mod(i,50)==0
- waitbar_j(i/updateno,hh);
- end
-
-
- % reconstruction; first make spectrum odd
- temp=[femicrophone(:,i);flipud(conj(femicrophone(2:hsupport,i)))];
- emicrophone(sb:se) = emicrophone(sb:se) + factor * win .* real(ifft(temp));
-
-end
-fprintf(1,'\n');
-
-close(hh);
\ No newline at end of file
diff --git a/src/modules/audio_processing/aecm/main/matlab/getBspectrum.m b/src/modules/audio_processing/aecm/main/matlab/getBspectrum.m
deleted file mode 100644
index a4a533d..0000000
--- a/src/modules/audio_processing/aecm/main/matlab/getBspectrum.m
+++ /dev/null
@@ -1,22 +0,0 @@
-function bspectrum=getBspectrum(ps,threshold,bandfirst,bandlast)
-% function bspectrum=getBspectrum(ps,threshold,bandfirst,bandlast)
-% compute binary spectrum using threshold spectrum as pivot
-% bspectrum = binary spectrum (binary)
-% ps=current power spectrum (float)
-% threshold=threshold spectrum (float)
-% bandfirst = first band considered
-% bandlast = last band considered
-
-% initialization stuff
- if( length(ps)<bandlast | bandlast>32 | length(ps)~=length(threshold))
- error('BinDelayEst:spectrum:invalid','Dimensionality error');
-end
-
-% get current binary spectrum
-diff = ps - threshold;
-bspectrum=uint32(0);
-for(i=bandfirst:bandlast)
- if( diff(i)>0 )
- bspectrum = bitset(bspectrum,i);
- end
-end
diff --git a/src/modules/audio_processing/aecm/main/matlab/hisser2.m b/src/modules/audio_processing/aecm/main/matlab/hisser2.m
deleted file mode 100644
index 5a414f9..0000000
--- a/src/modules/audio_processing/aecm/main/matlab/hisser2.m
+++ /dev/null
@@ -1,21 +0,0 @@
-function bcount=hisser2(bs,bsr,bandfirst,bandlast)
-% function bcount=hisser(bspectrum,bandfirst,bandlast)
-% histogram for the binary spectra
-% bcount= array of bit counts
-% bs=binary spectrum (one int32 number each)
-% bsr=reference binary spectra (one int32 number each)
-% blockSize = histogram over blocksize blocks
-% bandfirst = first band considered
-% bandlast = last band considered
-
-% weight all delays equally
-maxDelay = length(bsr);
-
-% compute counts (two methods; the first works better and is operational)
-bcount=zeros(maxDelay,1);
-for(i=1:maxDelay)
- % the delay should have low count for low-near&high-far and high-near&low-far
- bcount(i)= sum(bitget(bitxor(bs,bsr(i)),bandfirst:bandlast));
- % the delay should have low count for low-near&high-far (works less well)
-% bcount(i)= sum(bitget(bitand(bsr(i),bitxor(bs,bsr(i))),bandfirst:bandlast));
-end
diff --git a/src/modules/audio_processing/aecm/main/matlab/main2.m b/src/modules/audio_processing/aecm/main/matlab/main2.m
deleted file mode 100644
index 7e24c69..0000000
--- a/src/modules/audio_processing/aecm/main/matlab/main2.m
+++ /dev/null
@@ -1,19 +0,0 @@
-
-fid=fopen('aecfar.pcm'); far=fread(fid,'short'); fclose(fid);
-fid=fopen('aecnear.pcm'); mic=fread(fid,'short'); fclose(fid);
-
-%fid=fopen('QA1far.pcm'); far=fread(fid,'short'); fclose(fid);
-%fid=fopen('QA1near.pcm'); mic=fread(fid,'short'); fclose(fid);
-
-start=0 * 8000+1;
-stop= 30 * 8000;
-microphone=mic(start:stop);
-TheFarEnd=far(start:stop);
-avtime=1;
-
-% 16000 to make it compatible with the C-version
-[emicrophone,tdel]=compsup(microphone,TheFarEnd,avtime,16000);
-
-spclab(8000,TheFarEnd,microphone,emicrophone);
-
-
diff --git a/src/modules/audio_processing/aecm/main/matlab/matlab/AECMobile.m b/src/modules/audio_processing/aecm/main/matlab/matlab/AECMobile.m
deleted file mode 100644
index 2d3e686..0000000
--- a/src/modules/audio_processing/aecm/main/matlab/matlab/AECMobile.m
+++ /dev/null
@@ -1,269 +0,0 @@
-function [femicrophone, aecmStructNew, enerNear, enerFar] = AECMobile(fmicrophone, afTheFarEnd, setupStruct, aecmStruct)
-global NEARENDFFT;
-global F;
-
-aecmStructNew = aecmStruct;
-
-% Magnitude spectrum of near end signal
-afmicrophone = abs(fmicrophone);
-%afmicrophone = NEARENDFFT(setupStruct.currentBlock,:)'/2^F(setupStruct.currentBlock,end);
-% Near end energy level
-ener_orig = afmicrophone'*afmicrophone;
-if( ener_orig == 0)
- lowlevel = 0.01;
- afmicrophone = lowlevel*ones(size(afmicrophone));
-end
-%adiff = max(abs(afmicrophone - afTheFarEnd));
-%if (adiff > 0)
-% disp([setupStruct.currentBlock adiff])
-%end
-
-% Store the near end energy
-%aecmStructNew.enerNear(setupStruct.currentBlock) = log(afmicrophone'*afmicrophone);
-aecmStructNew.enerNear(setupStruct.currentBlock) = log(sum(afmicrophone));
-% Store the far end energy
-%aecmStructNew.enerFar(setupStruct.currentBlock) = log(afTheFarEnd'*afTheFarEnd);
-aecmStructNew.enerFar(setupStruct.currentBlock) = log(sum(afTheFarEnd));
-
-% Update subbands (We currently use all frequency bins, hence .useSubBand is turned off)
-if aecmStructNew.useSubBand
- internalIndex = 1;
- for kk=1:setupStruct.subBandLength+1
- ySubBand(kk) = mean(afmicrophone(internalIndex:internalIndex+setupStruct.numInBand(kk)-1).^aecmStructNew.bandFactor);
- xSubBand(kk) = mean(afTheFarEnd(internalIndex:internalIndex+setupStruct.numInBand(kk)-1).^aecmStructNew.bandFactor);
- internalIndex = internalIndex + setupStruct.numInBand(kk);
- end
-else
- ySubBand = afmicrophone.^aecmStructNew.bandFactor;
- xSubBand = afTheFarEnd.^aecmStructNew.bandFactor;
-end
-
-% Estimated echo energy
-if (aecmStructNew.bandFactor == 1)
- %aecmStructNew.enerEcho(setupStruct.currentBlock) = log((aecmStructNew.H.*xSubBand)'*(aecmStructNew.H.*xSubBand));
- %aecmStructNew.enerEchoStored(setupStruct.currentBlock) = log((aecmStructNew.HStored.*xSubBand)'*(aecmStructNew.HStored.*xSubBand));
- aecmStructNew.enerEcho(setupStruct.currentBlock) = log(sum(aecmStructNew.H.*xSubBand));
- aecmStructNew.enerEchoStored(setupStruct.currentBlock) = log(sum(aecmStructNew.HStored.*xSubBand));
-elseif (aecmStructNew.bandFactor == 2)
- aecmStructNew.enerEcho(setupStruct.currentBlock) = log(aecmStructNew.H'*xSubBand);
- aecmStructNew.enerEchoStored(setupStruct.currentBlock) = log(aecmStructNew.HStored'*xSubBand);
-end
-
-% Last 100 blocks of data, used for plotting
-n100 = max(1,setupStruct.currentBlock-99):setupStruct.currentBlock;
-enerError = aecmStructNew.enerNear(n100)-aecmStructNew.enerEcho(n100);
-enerErrorStored = aecmStructNew.enerNear(n100)-aecmStructNew.enerEchoStored(n100);
-
-% Store the far end sub band. This is needed if we use LSE instead of NLMS
-aecmStructNew.X = [xSubBand aecmStructNew.X(:,1:end-1)];
-
-% Update energy levels, which control the VAD
-if ((aecmStructNew.enerFar(setupStruct.currentBlock) < aecmStructNew.energyMin) & (aecmStructNew.enerFar(setupStruct.currentBlock) >= aecmStruct.FAR_ENERGY_MIN))
- aecmStructNew.energyMin = aecmStructNew.enerFar(setupStruct.currentBlock);
- %aecmStructNew.energyMin = max(aecmStructNew.energyMin,12);
- aecmStructNew.energyMin = max(aecmStructNew.energyMin,aecmStruct.FAR_ENERGY_MIN);
- aecmStructNew.energyLevel = (aecmStructNew.energyMax-aecmStructNew.energyMin)*aecmStructNew.energyThres+aecmStructNew.energyMin;
- aecmStructNew.energyLevelMSE = (aecmStructNew.energyMax-aecmStructNew.energyMin)*aecmStructNew.energyThresMSE+aecmStructNew.energyMin;
-end
-if (aecmStructNew.enerFar(setupStruct.currentBlock) > aecmStructNew.energyMax)
- aecmStructNew.energyMax = aecmStructNew.enerFar(setupStruct.currentBlock);
- aecmStructNew.energyLevel = (aecmStructNew.energyMax-aecmStructNew.energyMin)*aecmStructNew.energyThres+aecmStructNew.energyMin;
- aecmStructNew.energyLevelMSE = (aecmStructNew.energyMax-aecmStructNew.energyMin)*aecmStructNew.energyThresMSE+aecmStructNew.energyMin;
-end
-
-% Calculate current energy error in near end (estimated echo vs. near end)
-dE = aecmStructNew.enerNear(setupStruct.currentBlock)-aecmStructNew.enerEcho(setupStruct.currentBlock);
-
-%%%%%%%%
-% Calculate step size used in LMS algorithm, based on current far end energy and near end energy error (dE)
-%%%%%%%%
-if setupStruct.stepSize_flag
- [mu, aecmStructNew] = calcStepSize(aecmStructNew.enerFar(setupStruct.currentBlock), dE, aecmStructNew, setupStruct.currentBlock, 1);
-else
- mu = 0.25;
-end
-aecmStructNew.muLog(setupStruct.currentBlock) = mu; % Store the step size
-
-% Estimate Echo Spectral Shape
-[U, aecmStructNew.H] = fallerEstimator(ySubBand,aecmStructNew.X,aecmStructNew.H,mu);
-
-%%%%%
-% Determine if we should store or restore the channel
-%%%%%
-if ((setupStruct.currentBlock <= aecmStructNew.convLength) | (~setupStruct.channelUpdate_flag))
- aecmStructNew.HStored = aecmStructNew.H; % Store what you have after startup
-elseif ((setupStruct.currentBlock > aecmStructNew.convLength) & (setupStruct.channelUpdate_flag))
- if ((aecmStructNew.enerFar(setupStruct.currentBlock) < aecmStructNew.energyLevelMSE) & (aecmStructNew.enerFar(setupStruct.currentBlock-1) >= aecmStructNew.energyLevelMSE))
- xxx = aecmStructNew.countMseH;
- if (xxx > 20)
- mseStored = mean(abs(aecmStructNew.enerEchoStored(setupStruct.currentBlock-xxx:setupStruct.currentBlock-1)-aecmStructNew.enerNear(setupStruct.currentBlock-xxx:setupStruct.currentBlock-1)));
- mseLatest = mean(abs(aecmStructNew.enerEcho(setupStruct.currentBlock-xxx:setupStruct.currentBlock-1)-aecmStructNew.enerNear(setupStruct.currentBlock-xxx:setupStruct.currentBlock-1)));
- %fprintf('Stored: %4f Latest: %4f\n', mseStored, mseLatest) % Uncomment if you want to display the MSE values
- if ((mseStored < 0.8*mseLatest) & (aecmStructNew.mseHStoredOld < 0.8*aecmStructNew.mseHLatestOld))
- aecmStructNew.H = aecmStructNew.HStored;
- fprintf('Restored H at block %d\n',setupStruct.currentBlock)
- elseif (((0.8*mseStored > mseLatest) & (mseLatest < aecmStructNew.mseHThreshold) & (aecmStructNew.mseHLatestOld < aecmStructNew.mseHThreshold)) | (mseStored == Inf))
- aecmStructNew.HStored = aecmStructNew.H;
- fprintf('Stored new H at block %d\n',setupStruct.currentBlock)
- end
- aecmStructNew.mseHStoredOld = mseStored;
- aecmStructNew.mseHLatestOld = mseLatest;
- end
- elseif ((aecmStructNew.enerFar(setupStruct.currentBlock) >= aecmStructNew.energyLevelMSE) & (aecmStructNew.enerFar(setupStruct.currentBlock-1) < aecmStructNew.energyLevelMSE))
- aecmStructNew.countMseH = 1;
- elseif (aecmStructNew.enerFar(setupStruct.currentBlock) >= aecmStructNew.energyLevelMSE)
- aecmStructNew.countMseH = aecmStructNew.countMseH + 1;
- end
-end
-
-%%%%%
-% Check delay (calculate the delay offset (if we can))
-% The algorithm is not tuned and should be used with care. It runs separately from Bastiaan's algorithm.
-%%%%%
-yyy = 31; % Correlation buffer length (currently unfortunately hard coded)
-dxxx = 25; % Maximum offset (currently unfortunately hard coded)
-if (setupStruct.currentBlock > aecmStructNew.convLength)
- if (aecmStructNew.enerFar(setupStruct.currentBlock-(yyy+2*dxxx-1):setupStruct.currentBlock) > aecmStructNew.energyLevelMSE)
- for xxx = -dxxx:dxxx
- aecmStructNew.delayLatestS(xxx+dxxx+1) = sum(sign(aecmStructNew.enerEcho(setupStruct.currentBlock-(yyy+dxxx-xxx)+1:setupStruct.currentBlock+xxx-dxxx)-mean(aecmStructNew.enerEcho(setupStruct.currentBlock-(yyy++dxxx-xxx)+1:setupStruct.currentBlock+xxx-dxxx))).*sign(aecmStructNew.enerNear(setupStruct.currentBlock-yyy-dxxx+1:setupStruct.currentBlock-dxxx)-mean(aecmStructNew.enerNear(setupStruct.currentBlock-yyy-dxxx+1:setupStruct.currentBlock-dxxx))));
- end
- aecmStructNew.newDelayCurve = 1;
- end
-end
-if ((setupStruct.currentBlock > 2*aecmStructNew.convLength) & ~rem(setupStruct.currentBlock,yyy*2) & aecmStructNew.newDelayCurve)
- [maxV,maxP] = max(aecmStructNew.delayLatestS);
- if ((maxP > 2) & (maxP < 2*dxxx))
- maxVLeft = aecmStructNew.delayLatestS(max(1,maxP-4));
- maxVRight = aecmStructNew.delayLatestS(min(2*dxxx+1,maxP+4));
- %fprintf('Max %d, Left %d, Right %d\n',maxV,maxVLeft,maxVRight) % Uncomment if you want to see max value
- if ((maxV > 24) & (maxVLeft < maxV - 10) & (maxVRight < maxV - 10))
- aecmStructNew.feedbackDelay = maxP-dxxx-1;
- aecmStructNew.newDelayCurve = 0;
- aecmStructNew.feedbackDelayUpdate = 1;
- fprintf('Feedback Update at block %d\n',setupStruct.currentBlock)
- end
- end
-end
-% End of "Check delay"
-%%%%%%%%
-
-%%%%%
-% Calculate suppression gain, based on far end energy and near end energy error (dE)
-if (setupStruct.supGain_flag)
- [gamma_echo, aecmStructNew.cntIn, aecmStructNew.cntOut] = calcFilterGain(aecmStructNew.enerFar(setupStruct.currentBlock), dE, aecmStructNew, setupStruct.currentBlock, aecmStructNew.convLength, aecmStructNew.cntIn, aecmStructNew.cntOut);
-else
- gamma_echo = 1;
-end
-aecmStructNew.gammaLog(setupStruct.currentBlock) = gamma_echo; % Store the gain
-gamma_use = gamma_echo;
-
-% Use the stored channel
-U = aecmStructNew.HStored.*xSubBand;
-
-% compute Wiener filter and suppressor function
-Iy = find(ySubBand);
-subBandFilter = zeros(size(ySubBand));
-if (aecmStructNew.bandFactor == 2)
- subBandFilter(Iy) = (1 - gamma_use*sqrt(U(Iy)./ySubBand(Iy))); % For Faller
-else
- subBandFilter(Iy) = (1 - gamma_use*(U(Iy)./ySubBand(Iy))); % For COV
-end
-ix0 = find(subBandFilter < 0); % bounding trick 1
-subBandFilter(ix0) = 0;
-ix0 = find(subBandFilter > 1); % bounding trick 1
-subBandFilter(ix0) = 1;
-
-% Interpolate back to normal frequency bins if we use sub bands
-if aecmStructNew.useSubBand
- thefilter = interp1(setupStruct.centerFreq,subBandFilter,linspace(0,setupStruct.samplingfreq/2,setupStruct.hsupport1)','nearest');
- testfilter = interp1(setupStruct.centerFreq,subBandFilter,linspace(0,setupStruct.samplingfreq/2,1000),'nearest');
- thefilter(end) = subBandFilter(end);
-
- internalIndex = 1;
- for kk=1:setupStruct.subBandLength+1
- internalIndex:internalIndex+setupStruct.numInBand(kk)-1;
- thefilter(internalIndex:internalIndex+setupStruct.numInBand(kk)-1) = subBandFilter(kk);
- internalIndex = internalIndex + setupStruct.numInBand(kk);
- end
-else
- thefilter = subBandFilter;
- testfilter = subBandFilter;
-end
-
-% Bound the filter
-ix0 = find(thefilter < setupStruct.de_echo_bound); % bounding trick 1
-thefilter(ix0) = setupStruct.de_echo_bound; % bounding trick 2
-ix0 = find(thefilter > 1); % bounding in reasonable range
-thefilter(ix0) = 1;
-
-%%%%
-% NLP
-%%%%
-thefmean = mean(thefilter(8:16));
-if (thefmean < 1)
- disp('');
-end
-aecmStructNew.runningfmean = setupStruct.nl_alpha*aecmStructNew.runningfmean + (1-setupStruct.nl_alpha)*thefmean;
-slope0 = 1.0/(1.0 - setupStruct.nlSeverity); %
-thegain = max(0.0, min(1.0, slope0*(aecmStructNew.runningfmean - setupStruct.nlSeverity)));
-if ~setupStruct.nlp_flag
- thegain = 1;
-end
-% END NONLINEARITY
-thefilter = thegain*thefilter;
-
-%%%%
-% The suppression
-%%%%
-femicrophone = fmicrophone .* thefilter;
-% Store the output energy (used for plotting)
-%aecmStructNew.enerOut(setupStruct.currentBlock) = log(abs(femicrophone)'*abs(femicrophone));
-aecmStructNew.enerOut(setupStruct.currentBlock) = log(sum(abs(femicrophone)));
-
-if aecmStructNew.plotIt
- figure(13)
- subplot(311)
- %plot(n100,enerFar(n100),'b-',n100,enerNear(n100),'k--',n100,enerEcho(n100),'r-',[n100(1) n100(end)],[1 1]*vadThNew,'b:',[n100(1) n100(end)],[1 1]*((energyMax-energyMin)/4+energyMin),'r-.',[n100(1) n100(end)],[1 1]*vadNearThNew,'g:',[n100(1) n100(end)],[1 1]*energyMax,'r-.',[n100(1) n100(end)],[1 1]*energyMin,'r-.','LineWidth',2)
- plot(n100,aecmStructNew.enerFar(n100),'b-',n100,aecmStructNew.enerNear(n100),'k--',n100,aecmStructNew.enerOut(n100),'r-.',n100,aecmStructNew.enerEcho(n100),'r-',n100,aecmStructNew.enerEchoStored(n100),'c-',[n100(1) n100(end)],[1 1]*((aecmStructNew.energyMax-aecmStructNew.energyMin)/4+aecmStructNew.energyMin),'g-.',[n100(1) n100(end)],[1 1]*aecmStructNew.energyMax,'g-.',[n100(1) n100(end)],[1 1]*aecmStructNew.energyMin,'g-.','LineWidth',2)
- %title(['Frame ',int2str(i),' av ',int2str(setupStruct.updateno),' State = ',int2str(speechState),' \mu = ',num2str(mu)])
- title(['\gamma = ',num2str(gamma_echo),' \mu = ',num2str(mu)])
- subplot(312)
- %plot(n100,enerError,'b-',[n100(1) n100(end)],[1 1]*vadNearTh,'r:',[n100(1) n100(end)],[-1.5 -1.5]*vadNearTh,'r:','LineWidth',2)
- %plot(n100,enerError,'b-',[n100(1) n100(end)],[1 1],'r:',[n100(1) n100(end)],[-2 -2],'r:','LineWidth',2)
- plot(n100,enerError,'b-',n100,enerErrorStored,'c-',[n100(1) n100(end)],[1 1]*aecmStructNew.varMean,'k--',[n100(1) n100(end)],[1 1],'r:',[n100(1) n100(end)],[-2 -2],'r:','LineWidth',2)
- % Plot mu
- %plot(n100,log2(aecmStructNew.muLog(n100)),'b-','LineWidth',2)
- %plot(n100,log2(aecmStructNew.HGain(n100)),'b-',[n100(1) n100(end)],[1 1]*log2(sum(aecmStructNew.HStored)),'r:','LineWidth',2)
- title(['Block ',int2str(setupStruct.currentBlock),' av ',int2str(setupStruct.updateno)])
- subplot(313)
- %plot(n100,enerVar(n100),'b-',[n100(1) n100(end)],[1 1],'r:',[n100(1) n100(end)],[-2 -2],'r:','LineWidth',2)
- %plot(n100,enerVar(n100),'b-','LineWidth',2)
- % Plot correlation curve
-
- %plot(-25:25,aecmStructNew.delayStored/max(aecmStructNew.delayStored),'c-',-25:25,aecmStructNew.delayLatest/max(aecmStructNew.delayLatest),'r-',-25:25,(max(aecmStructNew.delayStoredS)-aecmStructNew.delayStoredS)/(max(aecmStructNew.delayStoredS)-min(aecmStructNew.delayStoredS)),'c:',-25:25,(max(aecmStructNew.delayLatestS)-aecmStructNew.delayLatestS)/(max(aecmStructNew.delayLatestS)-min(aecmStructNew.delayLatestS)),'r:','LineWidth',2)
- %plot(-25:25,aecmStructNew.delayStored,'c-',-25:25,aecmStructNew.delayLatest,'r-',-25:25,(max(aecmStructNew.delayStoredS)-aecmStructNew.delayStoredS)/(max(aecmStructNew.delayStoredS)-min(aecmStructNew.delayStoredS)),'c:',-25:25,(max(aecmStructNew.delayLatestS)-aecmStructNew.delayLatestS)/(max(aecmStructNew.delayLatestS)-min(aecmStructNew.delayLatestS)),'r:','LineWidth',2)
- %plot(-25:25,aecmStructNew.delayLatest,'r-',-25:25,(50-aecmStructNew.delayLatestS)/100,'r:','LineWidth',2)
- plot(-25:25,aecmStructNew.delayLatestS,'r:','LineWidth',2)
- %plot(-25:25,aecmStructNew.delayStored,'c-',-25:25,aecmStructNew.delayLatest,'r-','LineWidth',2)
- plot(0:32,aecmStruct.HStored,'bo-','LineWidth',2)
- %title(['\gamma | In = ',int2str(aecmStructNew.muStruct.countInInterval),' | Out High = ',int2str(aecmStructNew.muStruct.countOutHighInterval),' | Out Low = ',int2str(aecmStructNew.muStruct.countOutLowInterval)])
- pause(1)
- %if ((setupStruct.currentBlock == 860) | (setupStruct.currentBlock == 420) | (setupStruct.currentBlock == 960))
- if 0%(setupStruct.currentBlock == 960)
- figure(60)
- plot(n100,aecmStructNew.enerNear(n100),'k--',n100,aecmStructNew.enerEcho(n100),'k:','LineWidth',2)
- legend('Near End','Estimated Echo')
- title('Signal Energy witH offset compensation')
- figure(61)
- subplot(211)
- stem(sign(aecmStructNew.enerNear(n100)-mean(aecmStructNew.enerNear(n100))))
- title('Near End Energy Pattern (around mean value)')
- subplot(212)
- stem(sign(aecmStructNew.enerEcho(n100)-mean(aecmStructNew.enerEcho(n100))))
- title('Estimated Echo Energy Pattern (around mean value)')
- pause
- end
- drawnow%,pause
-elseif ~rem(setupStruct.currentBlock,100)
- fprintf('Block %d of %d\n',setupStruct.currentBlock,setupStruct.updateno)
-end
diff --git a/src/modules/audio_processing/aecm/main/matlab/matlab/align.m b/src/modules/audio_processing/aecm/main/matlab/matlab/align.m
deleted file mode 100644
index 9b9c0ba..0000000
--- a/src/modules/audio_processing/aecm/main/matlab/matlab/align.m
+++ /dev/null
@@ -1,98 +0,0 @@
-function [delayStructNew] = align(xf, yf, delayStruct, i, trueDelay);
-
-%%%%%%%
-% Bastiaan's algorithm copied
-%%%%%%%
-Ap500 = [1.00, -4.95, 9.801, -9.70299, 4.80298005, -0.9509900499];
-Bp500 = [0.662743088639636, -2.5841655608125, 3.77668102146288, -2.45182477425154, 0.596566274575251, 0.0];
-Ap200 = [1.00, -4.875, 9.50625, -9.26859375, 4.518439453125, -0.881095693359375];
-Bp200 = [0.862545460994275, -3.2832804496114, 4.67892032308828, -2.95798023879133, 0.699796870041299, 0.0];
-
-oldMethod = 1; % Turn on or off the old method. The new one is Bastiaan's August 2008 updates
-THReSHoLD = 2.0; % ADJUSTABLE threshold factor; 4.0 seems good
-%%%%%%%%%%%%%%%%%%%
-% use log domain (showed improved performance)
-xxf = sqrt(real(xf.*conj(xf))+1e-20);
-yyf = sqrt(real(yf.*conj(yf))+1e-20);
-delayStruct.sxAll2(:,i) = 20*log10(xxf);
-delayStruct.syAll2(:,i) = 20*log10(yyf);
-
-mD = min(i-1,delayStruct.maxDelayb);
-if oldMethod
- factor = 1.0;
- histLenb = 250;
- xthreshold = factor*median(delayStruct.sxAll2(:,i-mD:i),2);
- ythreshold = factor*median(delayStruct.syAll2(:,i-mD:i),2);
-else
- xthreshold = sum(delayStruct.sxAll2(:,i-mD:i),2)/(delayStruct.maxDelayb+1);
-
- [yout, delayStruct.z200] = filter(Bp200, Ap200, delayStruct.syAll2(:,i), delayStruct.z200, 2);
- yout = yout/(delayStruct.maxDelayb+1);
- ythreshold = mean(delayStruct.syAll2(:,i-mD:i),2);
- ythreshold = yout;
-end
-
-delayStruct.bxspectrum(i) = getBspectrum(delayStruct.sxAll2(:,i), xthreshold, delayStruct.bandfirst, delayStruct.bandlast);
-delayStruct.byspectrum(i) = getBspectrum(delayStruct.syAll2(:,i), ythreshold, delayStruct.bandfirst, delayStruct.bandlast);
-
-delayStruct.bxhist(end-mD:end) = delayStruct.bxspectrum(i-mD:i);
-
-delayStruct.bcount(:,i) = hisser2(delayStruct.byspectrum(i), flipud(delayStruct.bxhist), delayStruct.bandfirst, delayStruct.bandlast);
-[delayStruct.fout(:,i), delayStruct.z500] = filter(Bp500, Ap500, delayStruct.bcount(:,i), delayStruct.z500, 2);
-if oldMethod
- %delayStruct.new(:,i) = sum(delayStruct.bcount(:,max(1,i-histLenb+1):i),2); % using the history range
- tmpVec = [delayStruct.fout(1,i)*ones(2,1); delayStruct.fout(:,i); delayStruct.fout(end,i)*ones(2,1)]; % using the history range
- tmpVec = filter(ones(1,5), 1, tmpVec);
- delayStruct.new(:,i) = tmpVec(5:end);
- %delayStruct.new(:,i) = delayStruct.fout(:,i); % using the history range
-else
- [delayStruct.fout(:,i), delayStruct.z500] = filter(Bp500, Ap500, delayStruct.bcount(:,i), delayStruct.z500, 2);
- % NEW CODE
- delayStruct.new(:,i) = filter([-1,-2,1,4,1,-2,-1], 1, delayStruct.fout(:,i)); %remv smth component
- delayStruct.new(1:end-3,i) = delayStruct.new(1+3:end,i);
- delayStruct.new(1:6,i) = 0.0;
- delayStruct.new(end-6:end,i) = 0.0; % ends are no good
-end
-[valuen, tempdelay] = min(delayStruct.new(:,i)); % find minimum
-if oldMethod
- threshold = valuen + (max(delayStruct.new(:,i)) - valuen)/4;
- thIndex = find(delayStruct.new(:,i) <= threshold);
- if (i > 1)
- delayDiff = abs(delayStruct.delay(i-1)-tempdelay+1);
- if (delayStruct.oneGoodEstimate & (max(diff(thIndex)) > 1) & (delayDiff < 10))
- % We consider this minimum to be significant, hence update the delay
- delayStruct.delay(i) = tempdelay;
- elseif (~delayStruct.oneGoodEstimate & (max(diff(thIndex)) > 1))
- delayStruct.delay(i) = tempdelay;
- if (i > histLenb)
- delayStruct.oneGoodEstimate = 1;
- end
- else
- delayStruct.delay(i) = delayStruct.delay(i-1);
- end
- else
- delayStruct.delay(i) = tempdelay;
- end
-else
- threshold = THReSHoLD*std(delayStruct.new(:,i)); % set updata threshold
- if ((-valuen > threshold) | (i < delayStruct.smlength)) % see if you want to update delay
- delayStruct.delay(i) = tempdelay;
- else
- delayStruct.delay(i) = delayStruct.delay(i-1);
- end
- % END NEW CODE
-end
-delayStructNew = delayStruct;
-
-% administrative and plotting stuff
-if( 0)
- figure(10);
- plot([1:length(delayStructNew.new(:,i))],delayStructNew.new(:,i),trueDelay*[1 1],[min(delayStructNew.new(:,i)),max(delayStructNew.new(:,i))],'r',[1 length(delayStructNew.new(:,i))],threshold*[1 1],'r:', 'LineWidth',2);
- %plot([1:length(delayStructNew.bcount(:,i))],delayStructNew.bcount(:,i),trueDelay*[1 1],[min(delayStructNew.bcount(:,i)),max(delayStructNew.bcount(:,i))],'r','LineWidth',2);
- %plot([thedelay,thedelay],[min(fcount(:,i)),max(fcount(:,i))],'r');
- %title(sprintf('bin count and known delay at time %5.1f s\n',(i-1)*(support/(fs*oversampling))));
- title(delayStructNew.oneGoodEstimate)
- xlabel('delay in frames');
- %hold off;
- drawnow
-end
diff --git a/src/modules/audio_processing/aecm/main/matlab/matlab/calcFilterGain.m b/src/modules/audio_processing/aecm/main/matlab/matlab/calcFilterGain.m
deleted file mode 100644
index a09a7f2..0000000
--- a/src/modules/audio_processing/aecm/main/matlab/matlab/calcFilterGain.m
+++ /dev/null
@@ -1,88 +0,0 @@
-function [gam, cntIn2, cntOut2] = calcFilterGain(energy, dE, aecmStruct, t, T, cntIn, cntOut)
-
-defaultLevel = 1.2;
-cntIn2 = cntIn;
-cntOut2 = cntOut;
-if (t < T)
- gam = 1;
-else
- dE1 = -5;
- dE2 = 1;
- gamMid = 0.2;
- gam = max(0,min((energy - aecmStruct.energyMin)/(aecmStruct.energyLevel - aecmStruct.energyMin), 1-(1-gamMid)*(aecmStruct.energyMax-energy)/(aecmStruct.energyMax-aecmStruct.energyLevel)));
-
- dEOffset = -0.5;
- dEWidth = 1.5;
- %gam2 = max(1,2-((dE-dEOffset)/(dE2-dEOffset)).^2);
- gam2 = 1+(abs(dE-dEOffset)<(dE2-dEOffset));
-
- gam = gam*gam2;
-
-
- if (energy < aecmStruct.energyLevel)
- gam = 0;
- else
- gam = defaultLevel;
- end
- dEVec = aecmStruct.enerNear(t-63:t)-aecmStruct.enerEcho(t-63:t);
- %dEVec = aecmStruct.enerNear(t-20:t)-aecmStruct.enerEcho(t-20:t);
- numCross = 0;
- currentState = 0;
- for ii=1:64
- if (currentState == 0)
- currentState = (dEVec(ii) > dE2) - (dEVec(ii) < -2);
- elseif ((currentState == 1) & (dEVec(ii) < -2))
- numCross = numCross + 1;
- currentState = -1;
- elseif ((currentState == -1) & (dEVec(ii) > dE2))
- numCross = numCross + 1;
- currentState = 1;
- end
- end
- gam = max(0, gam - numCross/25);
- gam = 1;
-
- ener_A = 1;
- ener_B = 0.8;
- ener_C = aecmStruct.energyLevel + (aecmStruct.energyMax-aecmStruct.energyLevel)/5;
- dE_A = 4;%2;
- dE_B = 3.6;%1.8;
- dE_C = 0.9*dEWidth;
- dE_D = 1;
- timeFactorLength = 10;
- ddE = abs(dE-dEOffset);
- if (energy < aecmStruct.energyLevel)
- gam = 0;
- else
- gam = 1;
- gam2 = max(0, min(ener_B*(energy-aecmStruct.energyLevel)/(ener_C-aecmStruct.energyLevel), ener_B+(ener_A-ener_B)*(energy-ener_C)/(aecmStruct.energyMax-ener_C)));
- if (ddE < dEWidth)
- % Update counters
- cntIn2 = cntIn2 + 1;
- if (cntIn2 > 2)
- cntOut2 = 0;
- end
- gam3 = max(dE_D, min(dE_A-(dE_A-dE_B)*(ddE/dE_C), dE_D+(dE_B-dE_D)*(dEWidth-ddE)/(dEWidth-dE_C)));
- gam3 = dE_A;
- else
- % Update counters
- cntOut2 = cntOut2 + 1;
- if (cntOut2 > 2)
- cntIn2 = 0;
- end
- %gam2 = 1;
- gam3 = dE_D;
- end
- timeFactor = min(1, cntIn2/timeFactorLength);
- gam = gam*(1-timeFactor) + timeFactor*gam2*gam3;
- end
- %gam = gam/floor(numCross/2+1);
-end
-if isempty(gam)
- numCross
- timeFactor
- cntIn2
- cntOut2
- gam2
- gam3
-end
diff --git a/src/modules/audio_processing/aecm/main/matlab/matlab/calcStepSize.m b/src/modules/audio_processing/aecm/main/matlab/matlab/calcStepSize.m
deleted file mode 100644
index ae1365f..0000000
--- a/src/modules/audio_processing/aecm/main/matlab/matlab/calcStepSize.m
+++ /dev/null
@@ -1,105 +0,0 @@
-function [mu, aecmStructNew] = calcStepSize(energy, dE, aecmStruct, t, logscale)
-
-if (nargin < 4)
- t = 1;
- logscale = 1;
-elseif (nargin == 4)
- logscale = 1;
-end
-T = aecmStruct.convLength;
-
-if logscale
- currentMuMax = aecmStruct.MU_MIN + (aecmStruct.MU_MAX-aecmStruct.MU_MIN)*min(t,T)/T;
- if (aecmStruct.energyMin >= aecmStruct.energyMax)
- mu = aecmStruct.MU_MIN;
- else
- mu = (energy - aecmStruct.energyMin)/(aecmStruct.energyMax - aecmStruct.energyMin)*(currentMuMax-aecmStruct.MU_MIN) + aecmStruct.MU_MIN;
- end
- mu = 2^mu;
- if (energy < aecmStruct.energyLevel)
- mu = 0;
- end
-else
- muMin = 0;
- muMax = 0.5;
- currentMuMax = muMin + (muMax-muMin)*min(t,T)/T;
- if (aecmStruct.energyMin >= aecmStruct.energyMax)
- mu = muMin;
- else
- mu = (energy - aecmStruct.energyMin)/(aecmStruct.energyMax - aecmStruct.energyMin)*(currentMuMax-muMin) + muMin;
- end
-end
-dE2 = 1;
-dEOffset = -0.5;
-offBoost = 5;
-if (mu > 0)
- if (abs(dE-aecmStruct.ENERGY_DEV_OFFSET) > aecmStruct.ENERGY_DEV_TOL)
- aecmStruct.muStruct.countInInterval = 0;
- else
- aecmStruct.muStruct.countInInterval = aecmStruct.muStruct.countInInterval + 1;
- end
- if (dE < aecmStruct.ENERGY_DEV_OFFSET - aecmStruct.ENERGY_DEV_TOL)
- aecmStruct.muStruct.countOutLowInterval = aecmStruct.muStruct.countOutLowInterval + 1;
- else
- aecmStruct.muStruct.countOutLowInterval = 0;
- end
- if (dE > aecmStruct.ENERGY_DEV_OFFSET + aecmStruct.ENERGY_DEV_TOL)
- aecmStruct.muStruct.countOutHighInterval = aecmStruct.muStruct.countOutHighInterval + 1;
- else
- aecmStruct.muStruct.countOutHighInterval = 0;
- end
-end
-muVar = 2^min(-3,5/50*aecmStruct.muStruct.countInInterval-3);
-muOff = 2^max(offBoost,min(0,offBoost*(aecmStruct.muStruct.countOutLowInterval-aecmStruct.muStruct.minOutLowInterval)/(aecmStruct.muStruct.maxOutLowInterval-aecmStruct.muStruct.minOutLowInterval)));
-
-muLow = 1/64;
-muVar = 1;
-if (t < 2*T)
- muDT = 1;
- muVar = 1;
- mdEVec = 0;
- numCross = 0;
-else
- muDT = min(1,max(muLow,1-(1-muLow)*(dE-aecmStruct.ENERGY_DEV_OFFSET)/aecmStruct.ENERGY_DEV_TOL));
- dEVec = aecmStruct.enerNear(t-63:t)-aecmStruct.enerEcho(t-63:t);
- %dEVec = aecmStruct.enerNear(t-20:t)-aecmStruct.enerEcho(t-20:t);
- numCross = 0;
- currentState = 0;
- for ii=1:64
- if (currentState == 0)
- currentState = (dEVec(ii) > dE2) - (dEVec(ii) < -2);
- elseif ((currentState == 1) & (dEVec(ii) < -2))
- numCross = numCross + 1;
- currentState = -1;
- elseif ((currentState == -1) & (dEVec(ii) > dE2))
- numCross = numCross + 1;
- currentState = 1;
- end
- end
-
- %logicDEVec = (dEVec > dE2) - (dEVec < -2);
- %numCross = sum(abs(diff(logicDEVec)));
- %mdEVec = mean(abs(dEVec-dEOffset));
- %mdEVec = mean(abs(dEVec-mean(dEVec)));
- %mdEVec = max(dEVec)-min(dEVec);
- %if (mdEVec > 4)%1.5)
- % muVar = 0;
- %end
- muVar = 2^(-floor(numCross/2));
- muVar = 2^(-numCross);
-end
-%muVar = 1;
-
-
-% if (eStd > (dE2-dEOffset))
-% muVar = 1/8;
-% else
-% muVar = 1;
-% end
-
-%mu = mu*muDT*muVar*muOff;
-mu = mu*muDT*muVar;
-mu = min(mu,0.25);
-aecmStructNew = aecmStruct;
-%aecmStructNew.varMean = mdEVec;
-aecmStructNew.varMean = numCross;
diff --git a/src/modules/audio_processing/aecm/main/matlab/matlab/fallerEstimator.m b/src/modules/audio_processing/aecm/main/matlab/matlab/fallerEstimator.m
deleted file mode 100644
index d038b51..0000000
--- a/src/modules/audio_processing/aecm/main/matlab/matlab/fallerEstimator.m
+++ /dev/null
@@ -1,42 +0,0 @@
-function [U, Hnew] = fallerEstimator(Y, X, H, mu)
-
-% Near end signal is stacked frame by frame columnwise in matrix Y and far end in X
-%
-% Possible estimation procedures are
-% 1) LSE
-% 2) NLMS
-% 3) Separated numerator and denomerator filters
-regParam = 1;
-[numFreqs, numFrames] = size(Y);
-[numFreqs, Q] = size(X);
-U = zeros(numFreqs, 1);
-
-if ((nargin == 3) | (nargin == 5))
- dtd = 0;
-end
-if (nargin == 4)
- dtd = H;
-end
-Emax = 7;
-dEH = Emax-sum(sum(H));
-nu = 2*mu;
-% if (nargin < 5)
-% H = zeros(numFreqs, Q);
-% for kk = 1:numFreqs
-% Xmatrix = hankel(X(kk,1:Q),X(kk,Q:end));
-% y = Y(kk,1:end-Q+1)';
-% H(kk,:) = (y'*Xmatrix')*inv(Xmatrix*Xmatrix'+regParam);
-% U(kk,1) = H(kk,:)*Xmatrix(:,1);
-% end
-% else
- for kk = 1:numFreqs
- x = X(kk,1:Q)';
- y = Y(kk,1);
- Htmp = mu*(y-H(kk,:)*x)/(x'*x+regParam)*x;
- %Htmp = (mu*(y-H(kk,:)*x)/(x'*x+regParam) - nu/dEH)*x;
- H(kk,:) = H(kk,:) + Htmp';
- U(kk,1) = H(kk,:)*x;
- end
-% end
-
-Hnew = H;
diff --git a/src/modules/audio_processing/aecm/main/matlab/matlab/getBspectrum.m b/src/modules/audio_processing/aecm/main/matlab/matlab/getBspectrum.m
deleted file mode 100644
index a4a533d..0000000
--- a/src/modules/audio_processing/aecm/main/matlab/matlab/getBspectrum.m
+++ /dev/null
@@ -1,22 +0,0 @@
-function bspectrum=getBspectrum(ps,threshold,bandfirst,bandlast)
-% function bspectrum=getBspectrum(ps,threshold,bandfirst,bandlast)
-% compute binary spectrum using threshold spectrum as pivot
-% bspectrum = binary spectrum (binary)
-% ps=current power spectrum (float)
-% threshold=threshold spectrum (float)
-% bandfirst = first band considered
-% bandlast = last band considered
-
-% initialization stuff
- if( length(ps)<bandlast | bandlast>32 | length(ps)~=length(threshold))
- error('BinDelayEst:spectrum:invalid','Dimensionality error');
-end
-
-% get current binary spectrum
-diff = ps - threshold;
-bspectrum=uint32(0);
-for(i=bandfirst:bandlast)
- if( diff(i)>0 )
- bspectrum = bitset(bspectrum,i);
- end
-end
diff --git a/src/modules/audio_processing/aecm/main/matlab/matlab/hisser2.m b/src/modules/audio_processing/aecm/main/matlab/matlab/hisser2.m
deleted file mode 100644
index 5a414f9..0000000
--- a/src/modules/audio_processing/aecm/main/matlab/matlab/hisser2.m
+++ /dev/null
@@ -1,21 +0,0 @@
-function bcount=hisser2(bs,bsr,bandfirst,bandlast)
-% function bcount=hisser(bspectrum,bandfirst,bandlast)
-% histogram for the binary spectra
-% bcount= array of bit counts
-% bs=binary spectrum (one int32 number each)
-% bsr=reference binary spectra (one int32 number each)
-% blockSize = histogram over blocksize blocks
-% bandfirst = first band considered
-% bandlast = last band considered
-
-% weight all delays equally
-maxDelay = length(bsr);
-
-% compute counts (two methods; the first works better and is operational)
-bcount=zeros(maxDelay,1);
-for(i=1:maxDelay)
- % the delay should have low count for low-near&high-far and high-near&low-far
- bcount(i)= sum(bitget(bitxor(bs,bsr(i)),bandfirst:bandlast));
- % the delay should have low count for low-near&high-far (works less well)
-% bcount(i)= sum(bitget(bitand(bsr(i),bitxor(bs,bsr(i))),bandfirst:bandlast));
-end
diff --git a/src/modules/audio_processing/aecm/main/matlab/matlab/mainProgram.m b/src/modules/audio_processing/aecm/main/matlab/matlab/mainProgram.m
deleted file mode 100644
index eeb2aaa..0000000
--- a/src/modules/audio_processing/aecm/main/matlab/matlab/mainProgram.m
+++ /dev/null
@@ -1,283 +0,0 @@
-useHTC = 1; % Set this if you want to run a single file and set file names below. Otherwise use simEnvironment to run from several scenarios in a row
-delayCompensation_flag = 0; % Set this flag to one if you want to turn on the delay compensation/enhancement
-global FARENDFFT;
-global NEARENDFFT;
-global F;
-
-if useHTC
-% fid=fopen('./htcTouchHd/nb/aecFar.pcm'); xFar=fread(fid,'short'); fclose(fid);
-% fid=fopen('./htcTouchHd/nb/aecNear.pcm'); yNear=fread(fid,'short'); fclose(fid);
-% fid=fopen('./samsungBlackjack/nb/aecFar.pcm'); xFar=fread(fid,'short'); fclose(fid);
-% fid=fopen('./samsungBlackjack/nb/aecNear.pcm'); yNear=fread(fid,'short'); fclose(fid);
-% fid=fopen('aecFarPoor.pcm'); xFar=fread(fid,'short'); fclose(fid);
-% fid=fopen('aecNearPoor.pcm'); yNear=fread(fid,'short'); fclose(fid);
-% fid=fopen('out_aes.pcm'); outAES=fread(fid,'short'); fclose(fid);
- fid=fopen('aecFar4.pcm'); xFar=fread(fid,'short'); fclose(fid);
- fid=fopen('aecNear4.pcm'); yNear=fread(fid,'short'); fclose(fid);
- yNearSpeech = zeros(size(xFar));
- fs = 8000;
- frameSize = 64;
-% frameSize = 128;
- fs = 16000;
-% frameSize = 256;
-%F = load('fftValues.txt');
-%FARENDFFT = F(:,1:33);
-%NEARENDFFT = F(:,34:66);
-
-else
- loadFileFar = [speakerType, '_s_',scenario,'_far_b.wav'];
- [xFar,fs,nbits] = wavread(loadFileFar);
- xFar = xFar*2^(nbits-1);
- loadFileNear = [speakerType, '_s_',scenario,'_near_b.wav'];
- [yNear,fs,nbits] = wavread(loadFileNear);
- yNear = yNear*2^(nbits-1);
- loadFileNearSpeech = [speakerType, '_s_',scenario,'_nearSpeech_b.wav'];
- [yNearSpeech,fs,nbits] = wavread(loadFileNearSpeech);
- yNearSpeech = yNearSpeech*2^(nbits-1);
- frameSize = 256;
-end
-
-dtRegions = [];
-
-% General settings for the AECM
-setupStruct = struct(...
- 'stepSize_flag', 1,... % This flag turns on the step size calculation. If turned off, mu = 0.25.
- 'supGain_flag', 0,... % This flag turns on the suppression gain calculation. If turned off, gam = 1.
- 'channelUpdate_flag', 0,... % This flag turns on the channel update. If turned off, H is updated for convLength and then kept constant.
- 'nlp_flag', 0,... % Turn on/off NLP
- 'withVAD_flag', 0,... % Turn on/off NLP
- 'useSubBand', 0,... % Set to 1 if to use subBands
- 'useDelayEstimation', 1,... % Set to 1 if to use delay estimation
- 'support', frameSize,... % # of samples per frame
- 'samplingfreq',fs,... % Sampling frequency
- 'oversampling', 2,... % Overlap between blocks/frames
- 'updatel', 0,... % # of samples between blocks
- 'hsupport1', 0,... % # of bins in frequency domain
- 'factor', 0,... % synthesis window amplification
- 'tlength', 0,... % # of samples of entire file
- 'updateno', 0,... % # of updates
- 'nb', 1,... % # of blocks
- 'currentBlock', 0,... %
- 'win', zeros(frameSize,1),...% Window to apply for fft and synthesis
- 'avtime', 1,... % Time (in sec.) to perform averaging
- 'estLen', 0,... % Averaging in # of blocks
- 'A_GAIN', 10.0,... %
- 'suppress_overdrive', 1.0,... % overdrive factor for suppression 1.4 is good
- 'gamma_echo', 1.0,... % same as suppress_overdrive but at different place
- 'de_echo_bound', 0.0,... %
- 'nl_alpha', 0.4,... % memory; seems not very critical
- 'nlSeverity', 0.2,... % nonlinearity severity: 0 does nothing; 1 suppresses all
- 'numInBand', [],... % # of frequency bins in resp. subBand
- 'centerFreq', [],... % Center frequency of resp. subBand
- 'dtRegions', dtRegions,... % Regions where we have DT
- 'subBandLength', frameSize/2);%All bins
- %'subBandLength', 11); %Something's wrong when subBandLength even
- %'nl_alpha', 0.8,... % memory; seems not very critical
-
-delayStruct = struct(...
- 'bandfirst', 8,...
- 'bandlast', 25,...
- 'smlength', 600,...
- 'maxDelay', 0.4,...
- 'oneGoodEstimate', 0,...
- 'delayAdjust', 0,...
- 'maxDelayb', 0);
-% More parameters in delayStruct are constructed in "updateSettings" below
-
-% Make struct settings
-[setupStruct, delayStruct] = updateSettings(yNear, xFar, setupStruct, delayStruct);
-setupStruct.numInBand = ones(setupStruct.hsupport1,1);
-
-Q = 1; % Time diversity in channel
-% General settings for the step size calculation
-muStruct = struct(...
- 'countInInterval', 0,...
- 'countOutHighInterval', 0,...
- 'countOutLowInterval', 0,...
- 'minInInterval', 50,...
- 'minOutHighInterval', 10,...
- 'minOutLowInterval', 10,...
- 'maxOutLowInterval', 50);
-% General settings for the AECM
-aecmStruct = struct(...
- 'plotIt', 0,... % Set to 0 to turn off plotting
- 'useSubBand', 0,...
- 'bandFactor', 1,...
- 'H', zeros(setupStruct.subBandLength+1,Q),...
- 'HStored', zeros(setupStruct.subBandLength+1,Q),...
- 'X', zeros(setupStruct.subBandLength+1,Q),...
- 'energyThres', 0.28,...
- 'energyThresMSE', 0.4,...
- 'energyMin', inf,...
- 'energyMax', -inf,...
- 'energyLevel', 0,...
- 'energyLevelMSE', 0,...
- 'convLength', 100,...
- 'gammaLog', ones(setupStruct.updateno,1),...
- 'muLog', ones(setupStruct.updateno,1),...
- 'enerFar', zeros(setupStruct.updateno,1),...
- 'enerNear', zeros(setupStruct.updateno,1),...
- 'enerEcho', zeros(setupStruct.updateno,1),...
- 'enerEchoStored', zeros(setupStruct.updateno,1),...
- 'enerOut', zeros(setupStruct.updateno,1),...
- 'runningfmean', 0,...
- 'muStruct', muStruct,...
- 'varMean', 0,...
- 'countMseH', 0,...
- 'mseHThreshold', 1.1,...
- 'mseHStoredOld', inf,...
- 'mseHLatestOld', inf,...
- 'delayLatestS', zeros(1,51),...
- 'feedbackDelay', 0,...
- 'feedbackDelayUpdate', 0,...
- 'cntIn', 0,...
- 'cntOut', 0,...
- 'FAR_ENERGY_MIN', 1,...
- 'ENERGY_DEV_OFFSET', 0.5,...
- 'ENERGY_DEV_TOL', 1.5,...
- 'MU_MIN', -16,...
- 'MU_MAX', -2,...
- 'newDelayCurve', 0);
-
-% Adjust speech signals
-xFar = [zeros(setupStruct.hsupport1-1,1);xFar(1:setupStruct.tlength)];
-yNear = [zeros(setupStruct.hsupport1-1,1);yNear(1:setupStruct.tlength)];
-yNearSpeech = [zeros(setupStruct.hsupport1-1,1);yNearSpeech(1:setupStruct.tlength)];
-xFar = xFar(1:setupStruct.tlength);
-yNear = yNear(1:setupStruct.tlength);
-
-% Set figure settings
-if aecmStruct.plotIt
- figure(13)
- set(gcf,'doublebuffer','on')
-end
-%%%%%%%%%%
-% Here starts the algorithm
-% Dividing into frames and then estimating the near end speech
-%%%%%%%%%%
-fTheFarEnd = complex(zeros(setupStruct.hsupport1,1));
-afTheFarEnd = zeros(setupStruct.hsupport1,setupStruct.updateno+1);
-fFar = zeros(setupStruct.hsupport1,setupStruct.updateno+1);
-fmicrophone = complex(zeros(setupStruct.hsupport1,1));
-afmicrophone = zeros(setupStruct.hsupport1,setupStruct.updateno+1);
-fNear = zeros(setupStruct.hsupport1,setupStruct.updateno+1);
-femicrophone = complex(zeros(setupStruct.hsupport1,1));
-emicrophone = zeros(setupStruct.tlength,1);
-
-if (setupStruct.useDelayEstimation == 2)
- delSamples = [1641 1895 2032 1895 2311 2000 2350 2222 NaN 2332 2330 2290 2401 2415 NaN 2393 2305 2381 2398];
- delBlocks = round(delSamples/setupStruct.updatel);
- delStarts = floor([25138 46844 105991 169901 195739 218536 241803 333905 347703 362660 373753 745135 765887 788078 806257 823835 842443 860139 881869]/setupStruct.updatel);
-else
- delStarts = [];
-end
-
-for i=1:setupStruct.updateno
- setupStruct.currentBlock = i;
-
- sb = (i-1)*setupStruct.updatel + 1;
- se = sb + setupStruct.support - 1;
-
- %%%%%%%
- % Analysis FFTs
- %%%%%%%
- % Far end signal
- temp = fft(setupStruct.win .* xFar(sb:se))/frameSize;
- fTheFarEnd = temp(1:setupStruct.hsupport1);
- afTheFarEnd(:,i) = abs(fTheFarEnd);
- fFar(:,i) = fTheFarEnd;
- % Near end signal
- temp = fft(setupStruct.win .* yNear(sb:se))/frameSize;%,pause
- fmicrophone = temp(1:setupStruct.hsupport1);
- afmicrophone(:,i) = abs(fmicrophone);
- fNear(:,i) = fmicrophone;
- %abs(fmicrophone),pause
- % The true near end speaker (if we have such info)
- temp = fft(setupStruct.win .* yNearSpeech(sb:se));
- aftrueSpeech = abs(temp(1:setupStruct.hsupport1));
-
- if(i == 1000)
- %break;
- end
-
- % Perform delay estimation
- if (setupStruct.useDelayEstimation == 1)
- % Delay Estimation
- delayStruct = align(fTheFarEnd, fmicrophone, delayStruct, i);
- %delayStruct.delay(i) = 39;%19;
- idel = max(i - delayStruct.delay(i) + 1,1);
-
- if delayCompensation_flag
- % If we have a new delay estimate from Bastiaan's alg. update the offset
- if (delayStruct.delay(i) ~= delayStruct.delay(max(1,i-1)))
- delayStruct.delayAdjust = delayStruct.delayAdjust + delayStruct.delay(i) - delayStruct.delay(i-1);
- end
- % Store the compensated delay
- delayStruct.delayNew(i) = delayStruct.delay(i) - delayStruct.delayAdjust;
- if (delayStruct.delayNew(i) < 1)
- % Something's wrong
- pause,break
- end
- % Compensate with the offset estimate
- idel = idel + delayStruct.delayAdjust;
- end
- if 0%aecmStruct.plotIt
- figure(1)
- plot(1:i,delayStruct.delay(1:i),'k:',1:i,delayStruct.delayNew(1:i),'k--','LineWidth',2),drawnow
- end
- elseif (setupStruct.useDelayEstimation == 2)
- % Use "manual delay"
- delIndex = find(delStarts<i);
- if isempty(delIndex)
- idel = i;
- else
- idel = i - delBlocks(max(delIndex));
- if isnan(idel)
- idel = i - delBlocks(max(delIndex)-1);
- end
- end
- else
- % No delay estimation
- %idel = max(i - 18, 1);
- idel = max(i - 50, 1);
- end
-
- %%%%%%%%
- % This is the AECM algorithm
- %
- % Output is the new frequency domain signal (hopefully) echo compensated
- %%%%%%%%
- [femicrophone, aecmStruct] = AECMobile(fmicrophone, afTheFarEnd(:,idel), setupStruct, aecmStruct);
- %[femicrophone, aecmStruct] = AECMobile(fmicrophone, FARENDFFT(idel,:)'/2^F(idel,end-1), setupStruct, aecmStruct);
-
- if aecmStruct.feedbackDelayUpdate
- % If the feedback tells us there is a new offset out there update the enhancement
- delayStruct.delayAdjust = delayStruct.delayAdjust + aecmStruct.feedbackDelay;
- aecmStruct.feedbackDelayUpdate = 0;
- end
-
- % reconstruction; first make spectrum odd
- temp = [femicrophone; flipud(conj(femicrophone(2:(setupStruct.hsupport1-1))))];
- emicrophone(sb:se) = emicrophone(sb:se) + setupStruct.factor * setupStruct.win .* real(ifft(temp))*frameSize;
- if max(isnan(emicrophone(sb:se)))
- % Something's wrong with the output at block i
- i
- break
- end
-end
-
-
-if useHTC
- fid=fopen('aecOutMatlabC.pcm','w');fwrite(fid,int16(emicrophone),'short');fclose(fid);
- %fid=fopen('farendFFT.txt','w');fwrite(fid,int16(afTheFarEnd(:)),'short');fclose(fid);
- %fid=fopen('farendFFTreal.txt','w');fwrite(fid,int16(imag(fFar(:))),'short');fclose(fid);
- %fid=fopen('farendFFTimag.txt','w');fwrite(fid,int16(real(fFar(:))),'short');fclose(fid);
- %fid=fopen('nearendFFT.txt','w');fwrite(fid,int16(afmicrophone(:)),'short');fclose(fid);
- %fid=fopen('nearendFFTreal.txt','w');fwrite(fid,int16(real(fNear(:))),'short');fclose(fid);
- %fid=fopen('nearendFFTimag.txt','w');fwrite(fid,int16(imag(fNear(:))),'short');fclose(fid);
-end
-if useHTC
- %spclab(setupStruct.samplingfreq,xFar,yNear,emicrophone)
-else
- spclab(setupStruct.samplingfreq,xFar,yNear,emicrophone,yNearSpeech)
-end
diff --git a/src/modules/audio_processing/aecm/main/matlab/matlab/simEnvironment.m b/src/modules/audio_processing/aecm/main/matlab/matlab/simEnvironment.m
deleted file mode 100644
index 3ebe701..0000000
--- a/src/modules/audio_processing/aecm/main/matlab/matlab/simEnvironment.m
+++ /dev/null
@@ -1,15 +0,0 @@
-speakerType = 'fm';
-%for k=2:5
-%for k=[2 4 5]
-for k=3
- scenario = int2str(k);
- fprintf('Current scenario: %d\n',k)
- mainProgram
- %saveFile = [speakerType, '_s_',scenario,'_delayEst_v2_vad_man.wav'];
- %wavwrite(emic,fs,nbits,saveFile);
- %saveFile = ['P:\Engineering_share\BjornV\AECM\',speakerType, '_s_',scenario,'_delayEst_v2_vad_man.pcm'];
- %saveFile = [speakerType, '_s_',scenario,'_adaptMu_adaptGamma_withVar_gammFilt_HSt.pcm'];
- saveFile = ['scenario_',scenario,'_090417_backupH_nlp.pcm'];
- fid=fopen(saveFile,'w');fwrite(fid,int16(emicrophone),'short');fclose(fid);
- %pause
-end
diff --git a/src/modules/audio_processing/aecm/main/matlab/matlab/updateSettings.m b/src/modules/audio_processing/aecm/main/matlab/matlab/updateSettings.m
deleted file mode 100644
index c805f1d..0000000
--- a/src/modules/audio_processing/aecm/main/matlab/matlab/updateSettings.m
+++ /dev/null
@@ -1,94 +0,0 @@
-function [setupStructNew, delayStructNew] = updateSettings(microphone, TheFarEnd, setupStruct, delayStruct);
-
-% other, constants
-setupStruct.hsupport1 = setupStruct.support/2 + 1;
-setupStruct.factor = 2 / setupStruct.oversampling;
-setupStruct.updatel = setupStruct.support/setupStruct.oversampling;
-setupStruct.estLen = round(setupStruct.avtime * setupStruct.samplingfreq/setupStruct.updatel);
-
-% compute some constants
-blockLen = setupStruct.support/setupStruct.oversampling;
-delayStruct.maxDelayb = floor(setupStruct.samplingfreq*delayStruct.maxDelay/setupStruct.updatel); % in blocks
-
-%input
-tlength = min([length(microphone),length(TheFarEnd)]);
-updateno = floor(tlength/setupStruct.updatel);
-setupStruct.tlength = setupStruct.updatel*updateno;
-setupStruct.updateno = updateno - setupStruct.oversampling + 1;
-
-% signal length
-n = floor(min([length(TheFarEnd), length(microphone)])/setupStruct.support)*setupStruct.support;
-setupStruct.nb = n/blockLen - setupStruct.oversampling + 1; % in blocks
-
-setupStruct.win = sqrt([0 ; hanning(setupStruct.support-1)]);
-
-% Construct filterbank in Bark-scale
-
-K = setupStruct.subBandLength; %Something's wrong when K even
-erbs = 21.4*log10(0.00437*setupStruct.samplingfreq/2+1);
-fe = (10.^((0:K)'*erbs/K/21.4)-1)/0.00437;
-setupStruct.centerFreq = fe;
-H = diag(ones(1,K-1))+diag(ones(1,K-2),-1);
-Hinv = inv(H);
-aty = 2*Hinv(end,:)*fe(2:end-1);
-boundary = aty - (setupStruct.samplingfreq/2 + fe(end-1))/2;
-if rem(K,2)
- x1 = min([fe(2)/2, -boundary]);
-else
- x1 = max([0, boundary]);
-end
-%x1
-g = fe(2:end-1);
-g(1) = g(1) - x1/2;
-x = 2*Hinv*g;
-x = [x1;x];
-%figure(42), clf
-xy = zeros((K+1)*4,1);
-yy = zeros((K+1)*4,1);
-xy(1:4) = [fe(1) fe(1) x(1) x(1)]';
-yy(1:4) = [0 1 1 0]'/x(1);
-for kk=2:K
- xy((kk-1)*4+(1:4)) = [x(kk-1) x(kk-1) x(kk) x(kk)]';
- yy((kk-1)*4+(1:4)) = [0 1 1 0]'/(x(kk)-x(kk-1));
-end
-xy(end-3:end) = [x(K) x(K) fe(end) fe(end)]';
-yy(end-3:end) = [0 1 1 0]'/(fe(end)*2-2*x(K));
-%plot(xy,yy,'LineWidth',2)
-%fill(xy,yy,'y')
-
-x = [0;x];
-xk = x*setupStruct.hsupport1/setupStruct.samplingfreq*2;
-%setupStruct.erbBoundaries = xk;
-numInBand = zeros(length(xk),1);
-xh = (0:setupStruct.hsupport1-1);
-
-for kk=1:length(xk)
- if (kk==length(xk))
- numInBand(kk) = length(find(xh>=xk(kk)));
- else
- numInBand(kk) = length(intersect(find(xh>=xk(kk)),find(xh<xk(kk+1))));
- end
-end
-setupStruct.numInBand = numInBand;
-
-setupStructNew = setupStruct;
-
-delayStructNew = struct(...
- 'sxAll2',zeros(setupStructNew.hsupport1,setupStructNew.nb),...
- 'syAll2',zeros(setupStructNew.hsupport1,setupStructNew.nb),...
- 'z200',zeros(5,setupStructNew.hsupport1),...
- 'z500',zeros(5,delayStruct.maxDelayb+1),...
- 'bxspectrum',uint32(zeros(setupStructNew.nb,1)),...
- 'byspectrum',uint32(zeros(setupStructNew.nb,1)),...
- 'bandfirst',delayStruct.bandfirst,'bandlast',delayStruct.bandlast,...
- 'bxhist',uint32(zeros(delayStruct.maxDelayb+1,1)),...
- 'bcount',zeros(1+delayStruct.maxDelayb,setupStructNew.nb),...
- 'fout',zeros(1+delayStruct.maxDelayb,setupStructNew.nb),...
- 'new',zeros(1+delayStruct.maxDelayb,setupStructNew.nb),...
- 'smlength',delayStruct.smlength,...
- 'maxDelay', delayStruct.maxDelay,...
- 'maxDelayb', delayStruct.maxDelayb,...
- 'oneGoodEstimate', 0,...
- 'delayAdjust', 0,...
- 'delayNew',zeros(setupStructNew.nb,1),...
- 'delay',zeros(setupStructNew.nb,1));
diff --git a/src/modules/audio_processing/aecm/main/matlab/waitbar_j.m b/src/modules/audio_processing/aecm/main/matlab/waitbar_j.m
deleted file mode 100644
index 50b9ccf..0000000
--- a/src/modules/audio_processing/aecm/main/matlab/waitbar_j.m
+++ /dev/null
@@ -1,234 +0,0 @@
-function fout = waitbar_j(x,whichbar, varargin)
-%WAITBAR Display wait bar.
-% H = WAITBAR(X,'title', property, value, property, value, ...)
-% creates and displays a waitbar of fractional length X. The
-% handle to the waitbar figure is returned in H.
-% X should be between 0 and 1. Optional arguments property and
-% value allow to set corresponding waitbar figure properties.
-% Property can also be an action keyword 'CreateCancelBtn', in
-% which case a cancel button will be added to the figure, and
-% the passed value string will be executed upon clicking on the
-% cancel button or the close figure button.
-%
-% WAITBAR(X) will set the length of the bar in the most recently
-% created waitbar window to the fractional length X.
-%
-% WAITBAR(X,H) will set the length of the bar in waitbar H
-% to the fractional length X.
-%
-% WAITBAR(X,H,'updated title') will update the title text in
-% the waitbar figure, in addition to setting the fractional
-% length to X.
-%
-% WAITBAR is typically used inside a FOR loop that performs a
-% lengthy computation. A sample usage is shown below:
-%
-% h = waitbar(0,'Please wait...');
-% for i=1:100,
-% % computation here %
-% waitbar(i/100,h)
-% end
-% close(h)
-
-% Clay M. Thompson 11-9-92
-% Vlad Kolesnikov 06-7-99
-% Copyright 1984-2001 The MathWorks, Inc.
-% $Revision: 1.22 $ $Date: 2001/04/15 12:03:29 $
-
-if nargin>=2
- if ischar(whichbar)
- type=2; %we are initializing
- name=whichbar;
- elseif isnumeric(whichbar)
- type=1; %we are updating, given a handle
- f=whichbar;
- else
- error(['Input arguments of type ' class(whichbar) ' not valid.'])
- end
-elseif nargin==1
- f = findobj(allchild(0),'flat','Tag','TMWWaitbar');
-
- if isempty(f)
- type=2;
- name='Waitbar';
- else
- type=1;
- f=f(1);
- end
-else
- error('Input arguments not valid.');
-end
-
-x = max(0,min(100*x,100));
-
-switch type
- case 1, % waitbar(x) update
- p = findobj(f,'Type','patch');
- l = findobj(f,'Type','line');
- if isempty(f) | isempty(p) | isempty(l),
- error('Couldn''t find waitbar handles.');
- end
- xpatch = get(p,'XData');
- xpatch = [0 x x 0];
- set(p,'XData',xpatch)
- xline = get(l,'XData');
- set(l,'XData',xline);
-
- if nargin>2,
- % Update waitbar title:
- hAxes = findobj(f,'type','axes');
- hTitle = get(hAxes,'title');
- set(hTitle,'string',varargin{1});
- end
-
- case 2, % waitbar(x,name) initialize
- vertMargin = 0;
- if nargin > 2,
- % we have optional arguments: property-value pairs
- if rem (nargin, 2 ) ~= 0
- error( 'Optional initialization arguments must be passed in pairs' );
- end
- end
-
- oldRootUnits = get(0,'Units');
-
- set(0, 'Units', 'points');
- screenSize = get(0,'ScreenSize');
-
- axFontSize=get(0,'FactoryAxesFontSize');
-
- pointsPerPixel = 72/get(0,'ScreenPixelsPerInch');
-
- width = 360 * pointsPerPixel;
- height = 75 * pointsPerPixel;
- pos = [screenSize(3)/2-width/2 screenSize(4)/2-height/2 width height];
-
-%pos= [501.75 589.5 393.75 52.5];
- f = figure(...
- 'Units', 'points', ...
- 'BusyAction', 'queue', ...
- 'Position', pos, ...
- 'Resize','on', ...
- 'CreateFcn','', ...
- 'NumberTitle','off', ...
- 'IntegerHandle','off', ...
- 'MenuBar', 'none', ...
- 'Tag','TMWWaitbar',...
- 'Interruptible', 'off', ...
- 'Visible','on');
-
- %%%%%%%%%%%%%%%%%%%%%
- % set figure properties as passed to the fcn
- % pay special attention to the 'cancel' request
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- if nargin > 2,
- propList = varargin(1:2:end);
- valueList = varargin(2:2:end);
- cancelBtnCreated = 0;
- for ii = 1:length( propList )
- try
- if strcmp(lower(propList{ii}), 'createcancelbtn' ) & ~cancelBtnCreated
- cancelBtnHeight = 23 * pointsPerPixel;
- cancelBtnWidth = 60 * pointsPerPixel;
- newPos = pos;
- vertMargin = vertMargin + cancelBtnHeight;
- newPos(4) = newPos(4)+vertMargin;
- callbackFcn = [valueList{ii}];
- set( f, 'Position', newPos, 'CloseRequestFcn', callbackFcn );
- cancelButt = uicontrol('Parent',f, ...
- 'Units','points', ...
- 'Callback',callbackFcn, ...
- 'ButtonDownFcn', callbackFcn, ...
- 'Enable','on', ...
- 'Interruptible','off', ...
- 'Position', [pos(3)-cancelBtnWidth*1.4, 7, ...
- cancelBtnWidth, cancelBtnHeight], ...
- 'String','Cancel', ...
- 'Tag','TMWWaitbarCancelButton');
- cancelBtnCreated = 1;
- else
- % simply set the prop/value pair of the figure
- set( f, propList{ii}, valueList{ii});
- end
- catch
- disp ( ['Warning: could not set property ''' propList{ii} ''' with value ''' num2str(valueList{ii}) '''' ] );
- end
- end
- end
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
- colormap([]);
-
- axNorm=[.05 .3 .9 .2];
- % axNorm=[1 1 1 1];
- axPos=axNorm.*[pos(3:4),pos(3:4)] + [0 vertMargin 0 0];
-
- h = axes('XLim',[0 100],...
- 'YLim',[0 1],...
- 'Box','on', ...
- 'Units','Points',...
- 'FontSize', axFontSize,...
- 'Position',axPos,...
- 'XTickMode','manual',...
- 'YTickMode','manual',...
- 'XTick',[],...
- 'YTick',[],...
- 'XTickLabelMode','manual',...
- 'XTickLabel',[],...
- 'YTickLabelMode','manual',...
- 'YTickLabel',[]);
-
- tHandle=title(name);
- tHandle=get(h,'title');
- oldTitleUnits=get(tHandle,'Units');
- set(tHandle,...
- 'Units', 'points',...
- 'String', name);
-
- tExtent=get(tHandle,'Extent');
- set(tHandle,'Units',oldTitleUnits);
-
- titleHeight=tExtent(4)+axPos(2)+axPos(4)+5;
- if titleHeight>pos(4)
- pos(4)=titleHeight;
- pos(2)=screenSize(4)/2-pos(4)/2;
- figPosDirty=logical(1);
- else
- figPosDirty=logical(0);
- end
-
- if tExtent(3)>pos(3)*1.10;
- pos(3)=min(tExtent(3)*1.10,screenSize(3));
- pos(1)=screenSize(3)/2-pos(3)/2;
-
- axPos([1,3])=axNorm([1,3])*pos(3);
- set(h,'Position',axPos);
-
- figPosDirty=logical(1);
- end
-
- if figPosDirty
- set(f,'Position',pos);
- end
-
- xpatch = [0 x x 0];
- ypatch = [0 0 1 1];
- xline = [100 0 0 100 100];
- yline = [0 0 1 1 0];
-
- p = patch(xpatch,ypatch,'r','EdgeColor','r','EraseMode','none');
- l = line(xline,yline,'EraseMode','none');
- set(l,'Color',get(gca,'XColor'));
-
-
- set(f,'HandleVisibility','callback','visible','on', 'resize','off');
-
- set(0, 'Units', oldRootUnits);
-end % case
-drawnow;
-
-if nargout==1,
- fout = f;
-end
diff --git a/src/modules/audio_processing/aecm/main/source/Android.mk b/src/modules/audio_processing/aecm/main/source/Android.mk
deleted file mode 100644
index ec18258..0000000
--- a/src/modules/audio_processing/aecm/main/source/Android.mk
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_ARM_MODE := arm
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_MODULE := libwebrtc_aecm
-LOCAL_MODULE_TAGS := optional
-LOCAL_GENERATED_SOURCES :=
-LOCAL_SRC_FILES := echo_control_mobile.c \
- aecm_core.c
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS :=
-MY_CFLAGS_C :=
-MY_DEFS := '-DNO_TCMALLOC' \
- '-DNO_HEAPCHECKER' \
- '-DWEBRTC_TARGET_PC' \
- '-DWEBRTC_LINUX' \
- '-DWEBRTC_THREAD_RR' \
- '-DWEBRTC_ANDROID' \
- '-DANDROID'
-LOCAL_CFLAGS := $(MY_CFLAGS_C) $(MY_CFLAGS) $(MY_DEFS)
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../../.. \
- $(LOCAL_PATH)/../interface \
- $(LOCAL_PATH)/../../../utility \
- $(LOCAL_PATH)/../../../../../common_audio/signal_processing_library/main/interface
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS :=
-
-LOCAL_LDFLAGS :=
-
-LOCAL_STATIC_LIBRARIES :=
-
-LOCAL_SHARED_LIBRARIES := libcutils \
- libdl \
- libstlport
-LOCAL_ADDITIONAL_DEPENDENCIES :=
-
-include external/stlport/libstlport.mk
-include $(BUILD_STATIC_LIBRARY)
diff --git a/src/modules/audio_processing/aecm/main/source/aecm.gyp b/src/modules/audio_processing/aecm/main/source/aecm.gyp
deleted file mode 100644
index a535d2b..0000000
--- a/src/modules/audio_processing/aecm/main/source/aecm.gyp
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-{
- 'includes': [
- '../../../../../common_settings.gypi',
- ],
- 'targets': [
- {
- 'target_name': 'aecm',
- 'type': '<(library)',
- 'dependencies': [
- '../../../../../common_audio/signal_processing_library/main/source/spl.gyp:spl',
- '../../../utility/util.gyp:apm_util'
- ],
- 'include_dirs': [
- '../interface',
- ],
- 'direct_dependent_settings': {
- 'include_dirs': [
- '../interface',
- ],
- },
- 'sources': [
- '../interface/echo_control_mobile.h',
- 'echo_control_mobile.c',
- 'aecm_core.c',
- 'aecm_core.h',
- ],
- },
- ],
-}
-
-# Local Variables:
-# tab-width:2
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/src/modules/audio_processing/aecm/main/source/aecm_core.c b/src/modules/audio_processing/aecm/main/source/aecm_core.c
deleted file mode 100644
index f17f1bf..0000000
--- a/src/modules/audio_processing/aecm/main/source/aecm_core.c
+++ /dev/null
@@ -1,2534 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <stdlib.h>
-
-#include "aecm_core.h"
-#include "ring_buffer.h"
-#include "echo_control_mobile.h"
-#include "typedefs.h"
-
-// TODO(bjornv): Will be removed in final version.
-//#include <stdio.h>
-
-#ifdef ARM_WINM_LOG
-#include <stdio.h>
-#include <windows.h>
-#endif
-
-// BANDLAST - BANDFIRST must be < 32
-#define BANDFIRST 12 // Only bit BANDFIRST through bit BANDLAST are processed
-#define BANDLAST 43
-
-#ifdef ARM_WINM
-#define WebRtcSpl_AddSatW32(a,b) _AddSatInt(a,b)
-#define WebRtcSpl_SubSatW32(a,b) _SubSatInt(a,b)
-#endif
-// 16 instructions on most risc machines for 32-bit bitcount !
-
-#ifdef AEC_DEBUG
-FILE *dfile;
-FILE *testfile;
-#endif
-
-#ifdef AECM_SHORT
-
-// Square root of Hanning window in Q14
-static const WebRtc_Word16 kSqrtHanning[] =
-{
- 0, 804, 1606, 2404, 3196, 3981, 4756, 5520,
- 6270, 7005, 7723, 8423, 9102, 9760, 10394, 11003,
- 11585, 12140, 12665, 13160, 13623, 14053, 14449, 14811,
- 15137, 15426, 15679, 15893, 16069, 16207, 16305, 16364,
- 16384
-};
-
-#else
-
-// Square root of Hanning window in Q14
-static const WebRtc_Word16 kSqrtHanning[] = {0, 399, 798, 1196, 1594, 1990, 2386, 2780, 3172,
- 3562, 3951, 4337, 4720, 5101, 5478, 5853, 6224, 6591, 6954, 7313, 7668, 8019, 8364,
- 8705, 9040, 9370, 9695, 10013, 10326, 10633, 10933, 11227, 11514, 11795, 12068, 12335,
- 12594, 12845, 13089, 13325, 13553, 13773, 13985, 14189, 14384, 14571, 14749, 14918,
- 15079, 15231, 15373, 15506, 15631, 15746, 15851, 15947, 16034, 16111, 16179, 16237,
- 16286, 16325, 16354, 16373, 16384};
-
-#endif
-
-//Q15 alpha = 0.99439986968132 const Factor for magnitude approximation
-static const WebRtc_UWord16 kAlpha1 = 32584;
-//Q15 beta = 0.12967166976970 const Factor for magnitude approximation
-static const WebRtc_UWord16 kBeta1 = 4249;
-//Q15 alpha = 0.94234827210087 const Factor for magnitude approximation
-static const WebRtc_UWord16 kAlpha2 = 30879;
-//Q15 beta = 0.33787806009150 const Factor for magnitude approximation
-static const WebRtc_UWord16 kBeta2 = 11072;
-//Q15 alpha = 0.82247698684306 const Factor for magnitude approximation
-static const WebRtc_UWord16 kAlpha3 = 26951;
-//Q15 beta = 0.57762063060713 const Factor for magnitude approximation
-static const WebRtc_UWord16 kBeta3 = 18927;
-
-// Initialization table for echo channel in 8 kHz
-static const WebRtc_Word16 kChannelStored8kHz[PART_LEN1] = {
- 2040, 1815, 1590, 1498, 1405, 1395, 1385, 1418,
- 1451, 1506, 1562, 1644, 1726, 1804, 1882, 1918,
- 1953, 1982, 2010, 2025, 2040, 2034, 2027, 2021,
- 2014, 1997, 1980, 1925, 1869, 1800, 1732, 1683,
- 1635, 1604, 1572, 1545, 1517, 1481, 1444, 1405,
- 1367, 1331, 1294, 1270, 1245, 1239, 1233, 1247,
- 1260, 1282, 1303, 1338, 1373, 1407, 1441, 1470,
- 1499, 1524, 1549, 1565, 1582, 1601, 1621, 1649,
- 1676
-};
-
-// Initialization table for echo channel in 16 kHz
-static const WebRtc_Word16 kChannelStored16kHz[PART_LEN1] = {
- 2040, 1590, 1405, 1385, 1451, 1562, 1726, 1882,
- 1953, 2010, 2040, 2027, 2014, 1980, 1869, 1732,
- 1635, 1572, 1517, 1444, 1367, 1294, 1245, 1233,
- 1260, 1303, 1373, 1441, 1499, 1549, 1582, 1621,
- 1676, 1741, 1802, 1861, 1921, 1983, 2040, 2102,
- 2170, 2265, 2375, 2515, 2651, 2781, 2922, 3075,
- 3253, 3471, 3738, 3976, 4151, 4258, 4308, 4288,
- 4270, 4253, 4237, 4179, 4086, 3947, 3757, 3484,
- 3153
-};
-
-#ifdef ARM_WINM_LOG
-HANDLE logFile = NULL;
-#endif
-
-static void WebRtcAecm_ComfortNoise(AecmCore_t* const aecm, const WebRtc_UWord16 * const dfa,
- WebRtc_Word16 * const outReal,
- WebRtc_Word16 * const outImag,
- const WebRtc_Word16 * const lambda);
-
-static __inline WebRtc_UWord32 WebRtcAecm_SetBit(WebRtc_UWord32 in, WebRtc_Word32 pos)
-{
- WebRtc_UWord32 mask, out;
-
- mask = WEBRTC_SPL_SHIFT_W32(1, pos);
- out = (in | mask);
-
- return out;
-}
-
-// WebRtcAecm_Hisser(...)
-//
-// This function compares the binary vector specvec with all rows of the binary matrix specmat
-// and counts per row the number of times they have the same value.
-// Input:
-// - specvec : binary "vector" that is stored in a long
-// - specmat : binary "matrix" that is stored as a vector of long
-// Output:
-// - bcount : "Vector" stored as a long, containing for each row the number of times
-// the matrix row and the input vector have the same value
-//
-//
-void WebRtcAecm_Hisser(const WebRtc_UWord32 specvec, const WebRtc_UWord32 * const specmat,
- WebRtc_UWord32 * const bcount)
-{
- int n;
- WebRtc_UWord32 a, b;
- register WebRtc_UWord32 tmp;
-
- a = specvec;
- // compare binary vector specvec with all rows of the binary matrix specmat
- for (n = 0; n < MAX_DELAY; n++)
- {
- b = specmat[n];
- a = (specvec ^ b);
- // Returns bit counts in tmp
- tmp = a - ((a >> 1) & 033333333333) - ((a >> 2) & 011111111111);
- tmp = ((tmp + (tmp >> 3)) & 030707070707);
- tmp = (tmp + (tmp >> 6));
- tmp = (tmp + (tmp >> 12) + (tmp >> 24)) & 077;
-
- bcount[n] = tmp;
- }
-}
-
-// WebRtcAecm_BSpectrum(...)
-//
-// Computes the binary spectrum by comparing the input spectrum with a threshold spectrum.
-//
-// Input:
-// - spectrum : Spectrum of which the binary spectrum should be calculated.
-// - thresvec : Threshold spectrum with which the input spectrum is compared.
-// Return:
-// - out : Binary spectrum
-//
-WebRtc_UWord32 WebRtcAecm_BSpectrum(const WebRtc_UWord16 * const spectrum,
- const WebRtc_UWord16 * const thresvec)
-{
- int k;
- WebRtc_UWord32 out;
-
- out = 0;
- for (k = BANDFIRST; k <= BANDLAST; k++)
- {
- if (spectrum[k] > thresvec[k])
- {
- out = WebRtcAecm_SetBit(out, k - BANDFIRST);
- }
- }
-
- return out;
-}
-
-// WebRtcAecm_MedianEstimator(...)
-//
-// Calculates the median recursively.
-//
-// Input:
-// - newVal : new additional value
-// - medianVec : vector with current medians
-// - factor : factor for smoothing
-//
-// Output:
-// - medianVec : vector with updated median
-//
-int WebRtcAecm_MedianEstimator(const WebRtc_UWord16 newVal, WebRtc_UWord16 * const medianVec,
- const int factor)
-{
- WebRtc_Word32 median;
- WebRtc_Word32 diff;
-
- median = (WebRtc_Word32)medianVec[0];
-
- //median = median + ((newVal-median)>>factor);
- diff = (WebRtc_Word32)newVal - median;
- diff = WEBRTC_SPL_SHIFT_W32(diff, -factor);
- median = median + diff;
-
- medianVec[0] = (WebRtc_UWord16)median;
-
- return 0;
-}
-
-int WebRtcAecm_CreateCore(AecmCore_t **aecmInst)
-{
- AecmCore_t *aecm = malloc(sizeof(AecmCore_t));
- *aecmInst = aecm;
- if (aecm == NULL)
- {
- return -1;
- }
-
- if (WebRtcApm_CreateBuffer(&aecm->farFrameBuf, FRAME_LEN + PART_LEN) == -1)
- {
- WebRtcAecm_FreeCore(aecm);
- aecm = NULL;
- return -1;
- }
-
- if (WebRtcApm_CreateBuffer(&aecm->nearNoisyFrameBuf, FRAME_LEN + PART_LEN) == -1)
- {
- WebRtcAecm_FreeCore(aecm);
- aecm = NULL;
- return -1;
- }
-
- if (WebRtcApm_CreateBuffer(&aecm->nearCleanFrameBuf, FRAME_LEN + PART_LEN) == -1)
- {
- WebRtcAecm_FreeCore(aecm);
- aecm = NULL;
- return -1;
- }
-
- if (WebRtcApm_CreateBuffer(&aecm->outFrameBuf, FRAME_LEN + PART_LEN) == -1)
- {
- WebRtcAecm_FreeCore(aecm);
- aecm = NULL;
- return -1;
- }
-
- return 0;
-}
-
-// WebRtcAecm_InitCore(...)
-//
-// This function initializes the AECM instant created with WebRtcAecm_CreateCore(...)
-// Input:
-// - aecm : Pointer to the Echo Suppression instance
-// - samplingFreq : Sampling Frequency
-//
-// Output:
-// - aecm : Initialized instance
-//
-// Return value : 0 - Ok
-// -1 - Error
-//
-int WebRtcAecm_InitCore(AecmCore_t * const aecm, int samplingFreq)
-{
- int retVal = 0;
- WebRtc_Word16 i;
- WebRtc_Word16 tmp16;
-
- if (samplingFreq != 8000 && samplingFreq != 16000)
- {
- samplingFreq = 8000;
- retVal = -1;
- }
- // sanity check of sampling frequency
- aecm->mult = (WebRtc_Word16)samplingFreq / 8000;
-
- aecm->farBufWritePos = 0;
- aecm->farBufReadPos = 0;
- aecm->knownDelay = 0;
- aecm->lastKnownDelay = 0;
-
- WebRtcApm_InitBuffer(aecm->farFrameBuf);
- WebRtcApm_InitBuffer(aecm->nearNoisyFrameBuf);
- WebRtcApm_InitBuffer(aecm->nearCleanFrameBuf);
- WebRtcApm_InitBuffer(aecm->outFrameBuf);
-
- memset(aecm->xBuf, 0, sizeof(aecm->xBuf));
- memset(aecm->dBufClean, 0, sizeof(aecm->dBufClean));
- memset(aecm->dBufNoisy, 0, sizeof(aecm->dBufNoisy));
- memset(aecm->outBuf, 0, sizeof(WebRtc_Word16) * PART_LEN);
-
- aecm->seed = 666;
- aecm->totCount = 0;
-
- memset(aecm->xfaHistory, 0, sizeof(WebRtc_UWord16) * (PART_LEN1) * MAX_DELAY);
-
- aecm->delHistoryPos = MAX_DELAY;
-
- memset(aecm->medianYlogspec, 0, sizeof(WebRtc_UWord16) * PART_LEN1);
- memset(aecm->medianXlogspec, 0, sizeof(WebRtc_UWord16) * PART_LEN1);
- memset(aecm->medianBCount, 0, sizeof(WebRtc_UWord16) * MAX_DELAY);
- memset(aecm->bxHistory, 0, sizeof(aecm->bxHistory));
-
- // Initialize to reasonable values
- aecm->currentDelay = 8;
- aecm->previousDelay = 8;
- aecm->delayAdjust = 0;
-
- aecm->nlpFlag = 1;
- aecm->fixedDelay = -1;
-
- memset(aecm->xfaQDomainBuf, 0, sizeof(WebRtc_Word16) * MAX_DELAY);
- aecm->dfaCleanQDomain = 0;
- aecm->dfaCleanQDomainOld = 0;
- aecm->dfaNoisyQDomain = 0;
- aecm->dfaNoisyQDomainOld = 0;
-
- memset(aecm->nearLogEnergy, 0, sizeof(WebRtc_Word16) * MAX_BUF_LEN);
- memset(aecm->farLogEnergy, 0, sizeof(WebRtc_Word16) * MAX_BUF_LEN);
- memset(aecm->echoAdaptLogEnergy, 0, sizeof(WebRtc_Word16) * MAX_BUF_LEN);
- memset(aecm->echoStoredLogEnergy, 0, sizeof(WebRtc_Word16) * MAX_BUF_LEN);
-
- // Initialize the echo channels with a stored shape.
- if (samplingFreq == 8000)
- {
- memcpy(aecm->channelAdapt16, kChannelStored8kHz, sizeof(WebRtc_Word16) * PART_LEN1);
- }
- else
- {
- memcpy(aecm->channelAdapt16, kChannelStored16kHz, sizeof(WebRtc_Word16) * PART_LEN1);
- }
- memcpy(aecm->channelStored, aecm->channelAdapt16, sizeof(WebRtc_Word16) * PART_LEN1);
- for (i = 0; i < PART_LEN1; i++)
- {
- aecm->channelAdapt32[i] = WEBRTC_SPL_LSHIFT_W32(
- (WebRtc_Word32)(aecm->channelAdapt16[i]), 16);
- }
-
- memset(aecm->echoFilt, 0, sizeof(WebRtc_Word32) * PART_LEN1);
- memset(aecm->nearFilt, 0, sizeof(WebRtc_Word16) * PART_LEN1);
- aecm->noiseEstCtr = 0;
-
- aecm->cngMode = AecmTrue;
-
- // Increase the noise Q domain with increasing frequency, to correspond to the
- // expected energy levels.
- // Also shape the initial noise level with this consideration.
-#if (!defined ARM_WINM) && (!defined ARM9E_GCC) && (!defined ANDROID_AECOPT)
- for (i = 0; i < PART_LEN1; i++)
- {
- if (i < PART_LEN1 >> 2)
- {
- aecm->noiseEstQDomain[i] = 10;
- tmp16 = PART_LEN1 - i;
- aecm->noiseEst[i] = (tmp16 * tmp16) << 4;
- } else if (i < PART_LEN1 >> 1)
- {
- aecm->noiseEstQDomain[i] = 11;
- tmp16 = PART_LEN1 - i;
- aecm->noiseEst[i] = ((tmp16 * tmp16) << 4) << 1;
- } else
- {
- aecm->noiseEstQDomain[i] = 12;
- aecm->noiseEst[i] = aecm->noiseEst[(PART_LEN1 >> 1) - 1] << 1;
- }
- }
-#else
- for (i = 0; i < PART_LEN1 >> 2; i++)
- {
- aecm->noiseEstQDomain[i] = 10;
- tmp16 = PART_LEN1 - i;
- aecm->noiseEst[i] = (tmp16 * tmp16) << 4;
- }
- for (; i < PART_LEN1 >> 1; i++)
- {
- aecm->noiseEstQDomain[i] = 11;
- tmp16 = PART_LEN1 - i;
- aecm->noiseEst[i] = ((tmp16 * tmp16) << 4) << 1;
- }
- for (; i < PART_LEN1; i++)
- {
- aecm->noiseEstQDomain[i] = 12;
- aecm->noiseEst[i] = aecm->noiseEst[(PART_LEN1 >> 1) - 1] << 1;
- }
-#endif
-
- aecm->mseAdaptOld = 1000;
- aecm->mseStoredOld = 1000;
- aecm->mseThreshold = WEBRTC_SPL_WORD32_MAX;
-
- aecm->farEnergyMin = WEBRTC_SPL_WORD16_MAX;
- aecm->farEnergyMax = WEBRTC_SPL_WORD16_MIN;
- aecm->farEnergyMaxMin = 0;
- aecm->farEnergyVAD = FAR_ENERGY_MIN; // This prevents false speech detection at the
- // beginning.
- aecm->farEnergyMSE = 0;
- aecm->currentVADValue = 0;
- aecm->vadUpdateCount = 0;
- aecm->firstVAD = 1;
-
- aecm->delayCount = 0;
- aecm->newDelayCorrData = 0;
- aecm->lastDelayUpdateCount = 0;
- memset(aecm->delayCorrelation, 0, sizeof(WebRtc_Word16) * ((CORR_MAX << 1) + 1));
-
- aecm->startupState = 0;
- aecm->mseChannelCount = 0;
- aecm->supGain = SUPGAIN_DEFAULT;
- aecm->supGainOld = SUPGAIN_DEFAULT;
- aecm->delayOffsetFlag = 0;
-
- memset(aecm->delayHistogram, 0, sizeof(aecm->delayHistogram));
- aecm->delayVadCount = 0;
- aecm->maxDelayHistIdx = 0;
- aecm->lastMinPos = 0;
-
- aecm->supGainErrParamA = SUPGAIN_ERROR_PARAM_A;
- aecm->supGainErrParamD = SUPGAIN_ERROR_PARAM_D;
- aecm->supGainErrParamDiffAB = SUPGAIN_ERROR_PARAM_A - SUPGAIN_ERROR_PARAM_B;
- aecm->supGainErrParamDiffBD = SUPGAIN_ERROR_PARAM_B - SUPGAIN_ERROR_PARAM_D;
-
- return 0;
-}
-
-int WebRtcAecm_Control(AecmCore_t *aecm, int delay, int nlpFlag, int delayOffsetFlag)
-{
- aecm->nlpFlag = nlpFlag;
- aecm->fixedDelay = delay;
- aecm->delayOffsetFlag = delayOffsetFlag;
-
- return 0;
-}
-
-// WebRtcAecm_GetNewDelPos(...)
-//
-// Moves the pointer to the next entry. Returns to zero if max position reached.
-//
-// Input:
-// - aecm : Pointer to the AECM instance
-// Return:
-// - pos : New position in the history.
-//
-//
-WebRtc_Word16 WebRtcAecm_GetNewDelPos(AecmCore_t * const aecm)
-{
- WebRtc_Word16 pos;
-
- pos = aecm->delHistoryPos;
- pos++;
- if (pos >= MAX_DELAY)
- {
- pos = 0;
- }
- aecm->delHistoryPos = pos;
-
- return pos;
-}
-
-// WebRtcAecm_EstimateDelay(...)
-//
-// Estimate the delay of the echo signal.
-//
-// Inputs:
-// - aecm : Pointer to the AECM instance
-// - farSpec : Delayed farend magnitude spectrum
-// - nearSpec : Nearend magnitude spectrum
-// - stages : Q-domain of xxFIX and yyFIX (without dynamic Q-domain)
-// - xfaQ : normalization factor, i.e., Q-domain before FFT
-// Return:
-// - delay : Estimated delay
-//
-WebRtc_Word16 WebRtcAecm_EstimateDelay(AecmCore_t * const aecm,
- const WebRtc_UWord16 * const farSpec,
- const WebRtc_UWord16 * const nearSpec,
- const WebRtc_Word16 xfaQ)
-{
- WebRtc_UWord32 bxspectrum, byspectrum;
- WebRtc_UWord32 bcount[MAX_DELAY];
-
- int i, res;
-
- WebRtc_UWord16 xmean[PART_LEN1], ymean[PART_LEN1];
- WebRtc_UWord16 dtmp1;
- WebRtc_Word16 fcount[MAX_DELAY];
-
- //WebRtc_Word16 res;
- WebRtc_Word16 histpos;
- WebRtc_Word16 maxHistLvl;
- WebRtc_UWord16 *state;
- WebRtc_Word16 minpos = -1;
-
- enum
- {
- kVadCountThreshold = 25
- };
- enum
- {
- kMaxHistogram = 600
- };
-
- histpos = WebRtcAecm_GetNewDelPos(aecm);
-
- for (i = 0; i < PART_LEN1; i++)
- {
- aecm->xfaHistory[i][histpos] = farSpec[i];
-
- state = &(aecm->medianXlogspec[i]);
- res = WebRtcAecm_MedianEstimator(farSpec[i], state, 6);
-
- state = &(aecm->medianYlogspec[i]);
- res = WebRtcAecm_MedianEstimator(nearSpec[i], state, 6);
-
- // Mean:
- // FLOAT:
- // ymean = dtmp2/MAX_DELAY
- //
- // FIX:
- // input: dtmp2FIX in Q0
- // output: ymeanFIX in Q8
- // 20 = 1/MAX_DELAY in Q13 = 1/MAX_DELAY * 2^13
- xmean[i] = (aecm->medianXlogspec[i]);
- ymean[i] = (aecm->medianYlogspec[i]);
-
- }
- // Update Q-domain buffer
- aecm->xfaQDomainBuf[histpos] = xfaQ;
-
- // Get binary spectra
- // FLOAT:
- // bxspectrum = bspectrum(xlogspec, xmean);
- //
- // FIX:
- // input: xlogspecFIX,ylogspecFIX in Q8
- // xmeanFIX, ymeanFIX in Q8
- // output: unsigned long bxspectrum, byspectrum in Q0
- bxspectrum = WebRtcAecm_BSpectrum(farSpec, xmean);
- byspectrum = WebRtcAecm_BSpectrum(nearSpec, ymean);
-
- // Shift binary spectrum history
- memmove(&(aecm->bxHistory[1]), &(aecm->bxHistory[0]),
- (MAX_DELAY - 1) * sizeof(WebRtc_UWord32));
-
- aecm->bxHistory[0] = bxspectrum;
-
- // Compare with delayed spectra
- WebRtcAecm_Hisser(byspectrum, aecm->bxHistory, bcount);
-
- for (i = 0; i < MAX_DELAY; i++)
- {
- // Update sum
- // bcount is constrained to [0, 32], meaning we can smooth with a factor up to 2^11.
- dtmp1 = (WebRtc_UWord16)bcount[i];
- dtmp1 = WEBRTC_SPL_LSHIFT_W16(dtmp1, 9);
- state = &(aecm->medianBCount[i]);
- res = WebRtcAecm_MedianEstimator(dtmp1, state, 9);
- fcount[i] = (aecm->medianBCount[i]);
- }
-
- // Find minimum
- minpos = WebRtcSpl_MinIndexW16(fcount, MAX_DELAY);
-
- // If the farend has been active sufficiently long, begin accumulating a histogram
- // of the minimum positions. Search for the maximum bin to determine the delay.
- if (aecm->currentVADValue == 1)
- {
- if (aecm->delayVadCount >= kVadCountThreshold)
- {
- // Increment the histogram at the current minimum position.
- if (aecm->delayHistogram[minpos] < kMaxHistogram)
- {
- aecm->delayHistogram[minpos] += 3;
- }
-
-#if (!defined ARM_WINM) && (!defined ARM9E_GCC) && (!defined ANDROID_AECOPT)
- // Decrement the entire histogram.
- for (i = 0; i < MAX_DELAY; i++)
- {
- if (aecm->delayHistogram[i] > 0)
- {
- aecm->delayHistogram[i]--;
- }
- }
-
- // Select the histogram index corresponding to the maximum bin as the delay.
- maxHistLvl = 0;
- aecm->maxDelayHistIdx = 0;
- for (i = 0; i < MAX_DELAY; i++)
- {
- if (aecm->delayHistogram[i] > maxHistLvl)
- {
- maxHistLvl = aecm->delayHistogram[i];
- aecm->maxDelayHistIdx = i;
- }
- }
-#else
- maxHistLvl = 0;
- aecm->maxDelayHistIdx = 0;
-
- for (i = 0; i < MAX_DELAY; i++)
- {
- WebRtc_Word16 tempVar = aecm->delayHistogram[i];
-
- // Decrement the entire histogram.
- if (tempVar > 0)
- {
- tempVar--;
- aecm->delayHistogram[i] = tempVar;
-
- // Select the histogram index corresponding to the maximum bin as the delay.
- if (tempVar > maxHistLvl)
- {
- maxHistLvl = tempVar;
- aecm->maxDelayHistIdx = i;
- }
- }
- }
-#endif
- } else
- {
- aecm->delayVadCount++;
- }
- } else
- {
- aecm->delayVadCount = 0;
- }
-
- return aecm->maxDelayHistIdx;
-}
-
-int WebRtcAecm_FreeCore(AecmCore_t *aecm)
-{
- if (aecm == NULL)
- {
- return -1;
- }
-
- WebRtcApm_FreeBuffer(aecm->farFrameBuf);
- WebRtcApm_FreeBuffer(aecm->nearNoisyFrameBuf);
- WebRtcApm_FreeBuffer(aecm->nearCleanFrameBuf);
- WebRtcApm_FreeBuffer(aecm->outFrameBuf);
-
- free(aecm);
-
- return 0;
-}
-
-void WebRtcAecm_ProcessFrame(AecmCore_t * const aecm, const WebRtc_Word16 * const farend,
- const WebRtc_Word16 * const nearendNoisy,
- const WebRtc_Word16 * const nearendClean,
- WebRtc_Word16 * const out)
-{
- WebRtc_Word16 farBlock[PART_LEN];
- WebRtc_Word16 nearNoisyBlock[PART_LEN];
- WebRtc_Word16 nearCleanBlock[PART_LEN];
- WebRtc_Word16 outBlock[PART_LEN];
- WebRtc_Word16 farFrame[FRAME_LEN];
- int size = 0;
-
- // Buffer the current frame.
- // Fetch an older one corresponding to the delay.
- WebRtcAecm_BufferFarFrame(aecm, farend, FRAME_LEN);
- WebRtcAecm_FetchFarFrame(aecm, farFrame, FRAME_LEN, aecm->knownDelay);
-
- // Buffer the synchronized far and near frames,
- // to pass the smaller blocks individually.
- WebRtcApm_WriteBuffer(aecm->farFrameBuf, farFrame, FRAME_LEN);
- WebRtcApm_WriteBuffer(aecm->nearNoisyFrameBuf, nearendNoisy, FRAME_LEN);
- if (nearendClean != NULL)
- {
- WebRtcApm_WriteBuffer(aecm->nearCleanFrameBuf, nearendClean, FRAME_LEN);
- }
-
- // Process as many blocks as possible.
- while (WebRtcApm_get_buffer_size(aecm->farFrameBuf) >= PART_LEN)
- {
- WebRtcApm_ReadBuffer(aecm->farFrameBuf, farBlock, PART_LEN);
- WebRtcApm_ReadBuffer(aecm->nearNoisyFrameBuf, nearNoisyBlock, PART_LEN);
- if (nearendClean != NULL)
- {
- WebRtcApm_ReadBuffer(aecm->nearCleanFrameBuf, nearCleanBlock, PART_LEN);
- WebRtcAecm_ProcessBlock(aecm, farBlock, nearNoisyBlock, nearCleanBlock, outBlock);
- } else
- {
- WebRtcAecm_ProcessBlock(aecm, farBlock, nearNoisyBlock, NULL, outBlock);
- }
-
- WebRtcApm_WriteBuffer(aecm->outFrameBuf, outBlock, PART_LEN);
- }
-
- // Stuff the out buffer if we have less than a frame to output.
- // This should only happen for the first frame.
- size = WebRtcApm_get_buffer_size(aecm->outFrameBuf);
- if (size < FRAME_LEN)
- {
- WebRtcApm_StuffBuffer(aecm->outFrameBuf, FRAME_LEN - size);
- }
-
- // Obtain an output frame.
- WebRtcApm_ReadBuffer(aecm->outFrameBuf, out, FRAME_LEN);
-}
-
-// WebRtcAecm_AsymFilt(...)
-//
-// Performs asymmetric filtering.
-//
-// Inputs:
-// - filtOld : Previous filtered value.
-// - inVal : New input value.
-// - stepSizePos : Step size when we have a positive contribution.
-// - stepSizeNeg : Step size when we have a negative contribution.
-//
-// Output:
-//
-// Return: - Filtered value.
-//
-WebRtc_Word16 WebRtcAecm_AsymFilt(const WebRtc_Word16 filtOld, const WebRtc_Word16 inVal,
- const WebRtc_Word16 stepSizePos,
- const WebRtc_Word16 stepSizeNeg)
-{
- WebRtc_Word16 retVal;
-
- if ((filtOld == WEBRTC_SPL_WORD16_MAX) | (filtOld == WEBRTC_SPL_WORD16_MIN))
- {
- return inVal;
- }
- retVal = filtOld;
- if (filtOld > inVal)
- {
- retVal -= WEBRTC_SPL_RSHIFT_W16(filtOld - inVal, stepSizeNeg);
- } else
- {
- retVal += WEBRTC_SPL_RSHIFT_W16(inVal - filtOld, stepSizePos);
- }
-
- return retVal;
-}
-
-// WebRtcAecm_CalcEnergies(...)
-//
-// This function calculates the log of energies for nearend, farend and estimated
-// echoes. There is also an update of energy decision levels, i.e. internl VAD.
-//
-//
-// @param aecm [i/o] Handle of the AECM instance.
-// @param delayDiff [in] Delay position in farend buffer.
-// @param nearEner [in] Near end energy for current block (Q[aecm->dfaQDomain]).
-// @param echoEst [i/o] Estimated echo
-// (Q[aecm->xfaQDomain[delayDiff]+RESOLUTION_CHANNEL16]).
-//
-void WebRtcAecm_CalcEnergies(AecmCore_t * const aecm, const WebRtc_Word16 delayDiff,
- const WebRtc_UWord32 nearEner, WebRtc_Word32 * const echoEst)
-{
- // Local variables
- WebRtc_UWord32 tmpAdapt, tmpStored, tmpFar;
-
- int i;
-
- WebRtc_Word16 zeros, frac;
- WebRtc_Word16 tmp16;
- WebRtc_Word16 increase_max_shifts = 4;
- WebRtc_Word16 decrease_max_shifts = 11;
- WebRtc_Word16 increase_min_shifts = 11;
- WebRtc_Word16 decrease_min_shifts = 3;
-
- // Get log of near end energy and store in buffer
-
- // Shift buffer
- memmove(aecm->nearLogEnergy + 1, aecm->nearLogEnergy,
- sizeof(WebRtc_Word16) * (MAX_BUF_LEN - 1));
-
- // Logarithm of integrated magnitude spectrum (nearEner)
- if (nearEner)
- {
- zeros = WebRtcSpl_NormU32(nearEner);
- frac = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_U32(
- (WEBRTC_SPL_LSHIFT_U32(nearEner, zeros) & 0x7FFFFFFF),
- 23);
- // log2 in Q8
- aecm->nearLogEnergy[0] = WEBRTC_SPL_LSHIFT_W16((31 - zeros), 8) + frac;
- aecm->nearLogEnergy[0] -= WEBRTC_SPL_LSHIFT_W16(aecm->dfaNoisyQDomain, 8);
- } else
- {
- aecm->nearLogEnergy[0] = 0;
- }
- aecm->nearLogEnergy[0] += WEBRTC_SPL_LSHIFT_W16(PART_LEN_SHIFT, 7);
- // END: Get log of near end energy
-
- // Get energy for the delayed far end signal and estimated
- // echo using both stored and adapted channels.
- tmpAdapt = 0;
- tmpStored = 0;
- tmpFar = 0;
-
- for (i = 0; i < PART_LEN1; i++)
- {
- // Get estimated echo energies for adaptive channel and stored channel
- echoEst[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i],
- aecm->xfaHistory[i][delayDiff]);
- tmpFar += (WebRtc_UWord32)(aecm->xfaHistory[i][delayDiff]);
- tmpAdapt += WEBRTC_SPL_UMUL_16_16(aecm->channelAdapt16[i],
- aecm->xfaHistory[i][delayDiff]);
- tmpStored += (WebRtc_UWord32)echoEst[i];
- }
- // Shift buffers
- memmove(aecm->farLogEnergy + 1, aecm->farLogEnergy,
- sizeof(WebRtc_Word16) * (MAX_BUF_LEN - 1));
- memmove(aecm->echoAdaptLogEnergy + 1, aecm->echoAdaptLogEnergy,
- sizeof(WebRtc_Word16) * (MAX_BUF_LEN - 1));
- memmove(aecm->echoStoredLogEnergy + 1, aecm->echoStoredLogEnergy,
- sizeof(WebRtc_Word16) * (MAX_BUF_LEN - 1));
-
- // Logarithm of delayed far end energy
- if (tmpFar)
- {
- zeros = WebRtcSpl_NormU32(tmpFar);
- frac = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_U32((WEBRTC_SPL_LSHIFT_U32(tmpFar, zeros)
- & 0x7FFFFFFF), 23);
- // log2 in Q8
- aecm->farLogEnergy[0] = WEBRTC_SPL_LSHIFT_W16((31 - zeros), 8) + frac;
- aecm->farLogEnergy[0] -= WEBRTC_SPL_LSHIFT_W16(aecm->xfaQDomainBuf[delayDiff], 8);
- } else
- {
- aecm->farLogEnergy[0] = 0;
- }
- aecm->farLogEnergy[0] += WEBRTC_SPL_LSHIFT_W16(PART_LEN_SHIFT, 7);
-
- // Logarithm of estimated echo energy through adapted channel
- if (tmpAdapt)
- {
- zeros = WebRtcSpl_NormU32(tmpAdapt);
- frac = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_U32((WEBRTC_SPL_LSHIFT_U32(tmpAdapt, zeros)
- & 0x7FFFFFFF), 23);
- //log2 in Q8
- aecm->echoAdaptLogEnergy[0] = WEBRTC_SPL_LSHIFT_W16((31 - zeros), 8) + frac;
- aecm->echoAdaptLogEnergy[0]
- -= WEBRTC_SPL_LSHIFT_W16(RESOLUTION_CHANNEL16 + aecm->xfaQDomainBuf[delayDiff], 8);
- } else
- {
- aecm->echoAdaptLogEnergy[0] = 0;
- }
- aecm->echoAdaptLogEnergy[0] += WEBRTC_SPL_LSHIFT_W16(PART_LEN_SHIFT, 7);
-
- // Logarithm of estimated echo energy through stored channel
- if (tmpStored)
- {
- zeros = WebRtcSpl_NormU32(tmpStored);
- frac = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_U32((WEBRTC_SPL_LSHIFT_U32(tmpStored, zeros)
- & 0x7FFFFFFF), 23);
- //log2 in Q8
- aecm->echoStoredLogEnergy[0] = WEBRTC_SPL_LSHIFT_W16((31 - zeros), 8) + frac;
- aecm->echoStoredLogEnergy[0]
- -= WEBRTC_SPL_LSHIFT_W16(RESOLUTION_CHANNEL16 + aecm->xfaQDomainBuf[delayDiff], 8);
- } else
- {
- aecm->echoStoredLogEnergy[0] = 0;
- }
- aecm->echoStoredLogEnergy[0] += WEBRTC_SPL_LSHIFT_W16(PART_LEN_SHIFT, 7);
-
- // Update farend energy levels (min, max, vad, mse)
- if (aecm->farLogEnergy[0] > FAR_ENERGY_MIN)
- {
- if (aecm->startupState == 0)
- {
- increase_max_shifts = 2;
- decrease_min_shifts = 2;
- increase_min_shifts = 8;
- }
-
- aecm->farEnergyMin = WebRtcAecm_AsymFilt(aecm->farEnergyMin, aecm->farLogEnergy[0],
- increase_min_shifts, decrease_min_shifts);
- aecm->farEnergyMax = WebRtcAecm_AsymFilt(aecm->farEnergyMax, aecm->farLogEnergy[0],
- increase_max_shifts, decrease_max_shifts);
- aecm->farEnergyMaxMin = (aecm->farEnergyMax - aecm->farEnergyMin);
-
- // Dynamic VAD region size
- tmp16 = 2560 - aecm->farEnergyMin;
- if (tmp16 > 0)
- {
- tmp16 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(tmp16, FAR_ENERGY_VAD_REGION, 9);
- } else
- {
- tmp16 = 0;
- }
- tmp16 += FAR_ENERGY_VAD_REGION;
-
- if ((aecm->startupState == 0) | (aecm->vadUpdateCount > 1024))
- {
- // In startup phase or VAD update halted
- aecm->farEnergyVAD = aecm->farEnergyMin + tmp16;
- } else
- {
- if (aecm->farEnergyVAD > aecm->farLogEnergy[0])
- {
- aecm->farEnergyVAD += WEBRTC_SPL_RSHIFT_W16(aecm->farLogEnergy[0] + tmp16
- - aecm->farEnergyVAD, 6);
- aecm->vadUpdateCount = 0;
- } else
- {
- aecm->vadUpdateCount++;
- }
- }
- // Put MSE threshold higher than VAD
- aecm->farEnergyMSE = aecm->farEnergyVAD + (1 << 8);
- }
-
- // Update VAD variables
- if (aecm->farLogEnergy[0] > aecm->farEnergyVAD)
- {
- if ((aecm->startupState == 0) | (aecm->farEnergyMaxMin > FAR_ENERGY_DIFF))
- {
- // We are in startup or have significant dynamics in input speech level
- aecm->currentVADValue = 1;
- }
- } else
- {
- aecm->currentVADValue = 0;
- }
- if ((aecm->currentVADValue) && (aecm->firstVAD))
- {
- aecm->firstVAD = 0;
- if (aecm->echoAdaptLogEnergy[0] > aecm->nearLogEnergy[0])
- {
- // The estimated echo has higher energy than the near end signal. This means that
- // the initialization was too aggressive. Scale down by a factor 8
- for (i = 0; i < PART_LEN1; i++)
- {
- aecm->channelAdapt16[i] >>= 3;
- }
- // Compensate the adapted echo energy level accordingly.
- aecm->echoAdaptLogEnergy[0] -= (3 << 8);
- aecm->firstVAD = 1;
- }
- }
- // END: Energies of delayed far, echo estimates
- // TODO(bjornv): Will be removed in final version.
-#ifdef VAD_DATA
- fwrite(&(aecm->currentVADValue), sizeof(WebRtc_Word16), 1, aecm->vad_file);
- fwrite(&(aecm->currentDelay), sizeof(WebRtc_Word16), 1, aecm->delay_file);
- fwrite(&(aecm->farLogEnergy[0]), sizeof(WebRtc_Word16), 1, aecm->far_cur_file);
- fwrite(&(aecm->farEnergyMin), sizeof(WebRtc_Word16), 1, aecm->far_min_file);
- fwrite(&(aecm->farEnergyMax), sizeof(WebRtc_Word16), 1, aecm->far_max_file);
- fwrite(&(aecm->farEnergyVAD), sizeof(WebRtc_Word16), 1, aecm->far_vad_file);
-#endif
-}
-
-// WebRtcAecm_CalcStepSize(...)
-//
-// This function calculates the step size used in channel estimation
-//
-//
-// @param aecm [in] Handle of the AECM instance.
-// @param mu [out] (Return value) Stepsize in log2(), i.e. number of shifts.
-//
-//
-WebRtc_Word16 WebRtcAecm_CalcStepSize(AecmCore_t * const aecm)
-{
-
- WebRtc_Word32 tmp32;
- WebRtc_Word16 tmp16;
- WebRtc_Word16 mu;
-
- // Here we calculate the step size mu used in the
- // following NLMS based Channel estimation algorithm
- mu = MU_MAX;
- if (!aecm->currentVADValue)
- {
- // Far end energy level too low, no channel update
- mu = 0;
- } else if (aecm->startupState > 0)
- {
- if (aecm->farEnergyMin >= aecm->farEnergyMax)
- {
- mu = MU_MIN;
- } else
- {
- tmp16 = (aecm->farLogEnergy[0] - aecm->farEnergyMin);
- tmp32 = WEBRTC_SPL_MUL_16_16(tmp16, MU_DIFF);
- tmp32 = WebRtcSpl_DivW32W16(tmp32, aecm->farEnergyMaxMin);
- mu = MU_MIN - 1 - (WebRtc_Word16)(tmp32);
- // The -1 is an alternative to rounding. This way we get a larger
- // stepsize, so we in some sense compensate for truncation in NLMS
- }
- if (mu < MU_MAX)
- {
- mu = MU_MAX; // Equivalent with maximum step size of 2^-MU_MAX
- }
- }
- // END: Update step size
-
- return mu;
-}
-
-// WebRtcAecm_UpdateChannel(...)
-//
-// This function performs channel estimation. NLMS and decision on channel storage.
-//
-//
-// @param aecm [i/o] Handle of the AECM instance.
-// @param dfa [in] Absolute value of the nearend signal (Q[aecm->dfaQDomain])
-// @param delayDiff [in] Delay position in farend buffer.
-// @param mu [in] NLMS step size.
-// @param echoEst [i/o] Estimated echo
-// (Q[aecm->xfaQDomain[delayDiff]+RESOLUTION_CHANNEL16]).
-//
-void WebRtcAecm_UpdateChannel(AecmCore_t * const aecm, const WebRtc_UWord16 * const dfa,
- const WebRtc_Word16 delayDiff, const WebRtc_Word16 mu,
- WebRtc_Word32 * const echoEst)
-{
-
- WebRtc_UWord32 tmpU32no1, tmpU32no2;
- WebRtc_Word32 tmp32no1, tmp32no2;
- WebRtc_Word32 mseStored;
- WebRtc_Word32 mseAdapt;
-
- int i;
-
- WebRtc_Word16 zerosFar, zerosNum, zerosCh, zerosDfa;
- WebRtc_Word16 shiftChFar, shiftNum, shift2ResChan;
- WebRtc_Word16 tmp16no1;
- WebRtc_Word16 xfaQ, dfaQ;
-
- // This is the channel estimation algorithm. It is base on NLMS but has a variable step
- // length, which was calculated above.
- if (mu)
- {
- for (i = 0; i < PART_LEN1; i++)
- {
- // Determine norm of channel and farend to make sure we don't get overflow in
- // multiplication
- zerosCh = WebRtcSpl_NormU32(aecm->channelAdapt32[i]);
- zerosFar = WebRtcSpl_NormU32((WebRtc_UWord32)aecm->xfaHistory[i][delayDiff]);
- if (zerosCh + zerosFar > 31)
- {
- // Multiplication is safe
- tmpU32no1 = WEBRTC_SPL_UMUL_32_16(aecm->channelAdapt32[i],
- aecm->xfaHistory[i][delayDiff]);
- shiftChFar = 0;
- } else
- {
- // We need to shift down before multiplication
- shiftChFar = 32 - zerosCh - zerosFar;
- tmpU32no1
- = WEBRTC_SPL_UMUL_32_16(WEBRTC_SPL_RSHIFT_W32(aecm->channelAdapt32[i],
- shiftChFar),
- aecm->xfaHistory[i][delayDiff]);
- }
- // Determine Q-domain of numerator
- zerosNum = WebRtcSpl_NormU32(tmpU32no1);
- if (dfa[i])
- {
- zerosDfa = WebRtcSpl_NormU32((WebRtc_UWord32)dfa[i]);
- } else
- {
- zerosDfa = 32;
- }
- tmp16no1 = zerosDfa - 2 + aecm->dfaNoisyQDomain - RESOLUTION_CHANNEL32
- - aecm->xfaQDomainBuf[delayDiff] + shiftChFar;
- if (zerosNum > tmp16no1 + 1)
- {
- xfaQ = tmp16no1;
- dfaQ = zerosDfa - 2;
- } else
- {
- xfaQ = zerosNum - 2;
- dfaQ = RESOLUTION_CHANNEL32 + aecm->xfaQDomainBuf[delayDiff]
- - aecm->dfaNoisyQDomain - shiftChFar + xfaQ;
- }
- // Add in the same Q-domain
- tmpU32no1 = WEBRTC_SPL_SHIFT_W32(tmpU32no1, xfaQ);
- tmpU32no2 = WEBRTC_SPL_SHIFT_W32((WebRtc_UWord32)dfa[i], dfaQ);
- tmp32no1 = (WebRtc_Word32)tmpU32no2 - (WebRtc_Word32)tmpU32no1;
- zerosNum = WebRtcSpl_NormW32(tmp32no1);
- if ((tmp32no1) && (aecm->xfaHistory[i][delayDiff] > (CHANNEL_VAD
- << aecm->xfaQDomainBuf[delayDiff])))
- {
- //
- // Update is needed
- //
- // This is what we would like to compute
- //
- // tmp32no1 = dfa[i] - (aecm->channelAdapt[i] * aecm->xfaHistory[i][delayDiff])
- // tmp32norm = (i + 1)
- // aecm->channelAdapt[i] += (2^mu) * tmp32no1
- // / (tmp32norm * aecm->xfaHistory[i][delayDiff])
- //
-
- // Make sure we don't get overflow in multiplication.
- if (zerosNum + zerosFar > 31)
- {
- if (tmp32no1 > 0)
- {
- tmp32no2 = (WebRtc_Word32)WEBRTC_SPL_UMUL_32_16(tmp32no1,
- aecm->xfaHistory[i][delayDiff]);
- } else
- {
- tmp32no2 = -(WebRtc_Word32)WEBRTC_SPL_UMUL_32_16(-tmp32no1,
- aecm->xfaHistory[i][delayDiff]);
- }
- shiftNum = 0;
- } else
- {
- shiftNum = 32 - (zerosNum + zerosFar);
- if (tmp32no1 > 0)
- {
- tmp32no2 = (WebRtc_Word32)WEBRTC_SPL_UMUL_32_16(
- WEBRTC_SPL_RSHIFT_W32(tmp32no1, shiftNum),
- aecm->xfaHistory[i][delayDiff]);
- } else
- {
- tmp32no2 = -(WebRtc_Word32)WEBRTC_SPL_UMUL_32_16(
- WEBRTC_SPL_RSHIFT_W32(-tmp32no1, shiftNum),
- aecm->xfaHistory[i][delayDiff]);
- }
- }
- // Normalize with respect to frequency bin
- tmp32no2 = WebRtcSpl_DivW32W16(tmp32no2, i + 1);
- // Make sure we are in the right Q-domain
- shift2ResChan = shiftNum + shiftChFar - xfaQ - mu - ((30 - zerosFar) << 1);
- if (WebRtcSpl_NormW32(tmp32no2) < shift2ResChan)
- {
- tmp32no2 = WEBRTC_SPL_WORD32_MAX;
- } else
- {
- tmp32no2 = WEBRTC_SPL_SHIFT_W32(tmp32no2, shift2ResChan);
- }
- aecm->channelAdapt32[i] = WEBRTC_SPL_ADD_SAT_W32(aecm->channelAdapt32[i],
- tmp32no2);
- if (aecm->channelAdapt32[i] < 0)
- {
- // We can never have negative channel gain
- aecm->channelAdapt32[i] = 0;
- }
- aecm->channelAdapt16[i]
- = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(aecm->channelAdapt32[i], 16);
- }
- }
- }
- // END: Adaptive channel update
-
- // Determine if we should store or restore the channel
- if ((aecm->startupState == 0) & (aecm->currentVADValue))
- {
- // During startup we store the channel every block.
- memcpy(aecm->channelStored, aecm->channelAdapt16, sizeof(WebRtc_Word16) * PART_LEN1);
- // TODO(bjornv): Will be removed in final version.
-#ifdef STORE_CHANNEL_DATA
- fwrite(aecm->channelStored, sizeof(WebRtc_Word16), PART_LEN1, aecm->channel_file_init);
-#endif
- // Recalculate echo estimate
-#if (!defined ARM_WINM) && (!defined ARM9E_GCC) && (!defined ANDROID_AECOPT)
- for (i = 0; i < PART_LEN1; i++)
- {
- echoEst[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i],
- aecm->xfaHistory[i][delayDiff]);
- }
-#else
- for (i = 0; i < PART_LEN; ) //assume PART_LEN is 4's multiples
-
- {
- echoEst[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i],
- aecm->xfaHistory[i][delayDiff]);
- i++;
- echoEst[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i],
- aecm->xfaHistory[i][delayDiff]);
- i++;
- echoEst[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i],
- aecm->xfaHistory[i][delayDiff]);
- i++;
- echoEst[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i],
- aecm->xfaHistory[i][delayDiff]);
- i++;
- }
- echoEst[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i],
- aecm->xfaHistory[i][delayDiff]);
-#endif
- } else
- {
- if (aecm->farLogEnergy[0] < aecm->farEnergyMSE)
- {
- aecm->mseChannelCount = 0;
- aecm->delayCount = 0;
- } else
- {
- aecm->mseChannelCount++;
- aecm->delayCount++;
- }
- // Enough data for validation. Store channel if we can.
- if (aecm->mseChannelCount >= (MIN_MSE_COUNT + 10))
- {
- // We have enough data.
- // Calculate MSE of "Adapt" and "Stored" versions.
- // It is actually not MSE, but average absolute error.
- mseStored = 0;
- mseAdapt = 0;
- for (i = 0; i < MIN_MSE_COUNT; i++)
- {
- tmp32no1 = ((WebRtc_Word32)aecm->echoStoredLogEnergy[i]
- - (WebRtc_Word32)aecm->nearLogEnergy[i]);
- tmp32no2 = WEBRTC_SPL_ABS_W32(tmp32no1);
- mseStored += tmp32no2;
-
- tmp32no1 = ((WebRtc_Word32)aecm->echoAdaptLogEnergy[i]
- - (WebRtc_Word32)aecm->nearLogEnergy[i]);
- tmp32no2 = WEBRTC_SPL_ABS_W32(tmp32no1);
- mseAdapt += tmp32no2;
- }
- if (((mseStored << MSE_RESOLUTION) < (MIN_MSE_DIFF * mseAdapt))
- & ((aecm->mseStoredOld << MSE_RESOLUTION) < (MIN_MSE_DIFF
- * aecm->mseAdaptOld)))
- {
- // The stored channel has a significantly lower MSE than the adaptive one for
- // two consecutive calculations. Reset the adaptive channel.
- memcpy(aecm->channelAdapt16, aecm->channelStored,
- sizeof(WebRtc_Word16) * PART_LEN1);
- // Restore the W32 channel
-#if (!defined ARM_WINM) && (!defined ARM9E_GCC) && (!defined ANDROID_AECOPT)
- for (i = 0; i < PART_LEN1; i++)
- {
- aecm->channelAdapt32[i]
- = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)aecm->channelStored[i], 16);
- }
-#else
- for (i = 0; i < PART_LEN; ) //assume PART_LEN is 4's multiples
-
- {
- aecm->channelAdapt32[i] = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)aecm->channelStored[i], 16);
- i++;
- aecm->channelAdapt32[i] = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)aecm->channelStored[i], 16);
- i++;
- aecm->channelAdapt32[i] = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)aecm->channelStored[i], 16);
- i++;
- aecm->channelAdapt32[i] = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)aecm->channelStored[i], 16);
- i++;
- }
- aecm->channelAdapt32[i] = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)aecm->channelStored[i], 16);
-#endif
-
- } else if (((MIN_MSE_DIFF * mseStored) > (mseAdapt << MSE_RESOLUTION)) & (mseAdapt
- < aecm->mseThreshold) & (aecm->mseAdaptOld < aecm->mseThreshold))
- {
- // The adaptive channel has a significantly lower MSE than the stored one.
- // The MSE for the adaptive channel has also been low for two consecutive
- // calculations. Store the adaptive channel.
- memcpy(aecm->channelStored, aecm->channelAdapt16,
- sizeof(WebRtc_Word16) * PART_LEN1);
- // TODO(bjornv): Will be removed in final version.
-#ifdef STORE_CHANNEL_DATA
- fwrite(aecm->channelStored, sizeof(WebRtc_Word16), PART_LEN1,
- aecm->channel_file);
-#endif
-// Recalculate echo estimate
-#if (!defined ARM_WINM) && (!defined ARM9E_GCC) && (!defined ANDROID_AECOPT)
- for (i = 0; i < PART_LEN1; i++)
- {
- echoEst[i]
- = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i], aecm->xfaHistory[i][delayDiff]);
- }
-#else
- for (i = 0; i < PART_LEN; ) //assume PART_LEN is 4's multiples
-
- {
- echoEst[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i], aecm->xfaHistory[i][delayDiff]);
- i++;
- echoEst[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i], aecm->xfaHistory[i][delayDiff]);
- i++;
- echoEst[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i], aecm->xfaHistory[i][delayDiff]);
- i++;
- echoEst[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i], aecm->xfaHistory[i][delayDiff]);
- i++;
- }
- echoEst[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i], aecm->xfaHistory[i][delayDiff]);
-#endif
- // Update threshold
- if (aecm->mseThreshold == WEBRTC_SPL_WORD32_MAX)
- {
- aecm->mseThreshold = (mseAdapt + aecm->mseAdaptOld);
- } else
- {
- aecm->mseThreshold += WEBRTC_SPL_MUL_16_16_RSFT(mseAdapt
- - WEBRTC_SPL_MUL_16_16_RSFT(aecm->mseThreshold, 5, 3), 205, 8);
- }
-
- }
-
- // Reset counter
- aecm->mseChannelCount = 0;
-
- // Store the MSE values.
- aecm->mseStoredOld = mseStored;
- aecm->mseAdaptOld = mseAdapt;
- }
- }
- // END: Determine if we should store or reset channel estimate.
-}
-
-// WebRtcAecm_CalcSuppressionGain(...)
-//
-// This function calculates the suppression gain that is used in the Wiener filter.
-//
-//
-// @param aecm [i/n] Handle of the AECM instance.
-// @param supGain [out] (Return value) Suppression gain with which to scale the noise
-// level (Q14).
-//
-//
-WebRtc_Word16 WebRtcAecm_CalcSuppressionGain(AecmCore_t * const aecm)
-{
- WebRtc_Word32 tmp32no1;
-
- WebRtc_Word16 supGain;
- WebRtc_Word16 tmp16no1;
- WebRtc_Word16 dE = 0;
-
- // Determine suppression gain used in the Wiener filter. The gain is based on a mix of far
- // end energy and echo estimation error.
- supGain = SUPGAIN_DEFAULT;
- // Adjust for the far end signal level. A low signal level indicates no far end signal,
- // hence we set the suppression gain to 0
- if (!aecm->currentVADValue)
- {
- supGain = 0;
- } else
- {
- // Adjust for possible double talk. If we have large variations in estimation error we
- // likely have double talk (or poor channel).
- tmp16no1 = (aecm->nearLogEnergy[0] - aecm->echoStoredLogEnergy[0] - ENERGY_DEV_OFFSET);
- dE = WEBRTC_SPL_ABS_W16(tmp16no1);
-
- if (dE < ENERGY_DEV_TOL)
- {
- // Likely no double talk. The better estimation, the more we can suppress signal.
- // Update counters
- if (dE < SUPGAIN_EPC_DT)
- {
- tmp32no1 = WEBRTC_SPL_MUL_16_16(aecm->supGainErrParamDiffAB, dE);
- tmp32no1 += (SUPGAIN_EPC_DT >> 1);
- tmp16no1 = (WebRtc_Word16)WebRtcSpl_DivW32W16(tmp32no1, SUPGAIN_EPC_DT);
- supGain = aecm->supGainErrParamA - tmp16no1;
- } else
- {
- tmp32no1 = WEBRTC_SPL_MUL_16_16(aecm->supGainErrParamDiffBD,
- (ENERGY_DEV_TOL - dE));
- tmp32no1 += ((ENERGY_DEV_TOL - SUPGAIN_EPC_DT) >> 1);
- tmp16no1 = (WebRtc_Word16)WebRtcSpl_DivW32W16(tmp32no1, (ENERGY_DEV_TOL
- - SUPGAIN_EPC_DT));
- supGain = aecm->supGainErrParamD + tmp16no1;
- }
- } else
- {
- // Likely in double talk. Use default value
- supGain = aecm->supGainErrParamD;
- }
- }
-
- if (supGain > aecm->supGainOld)
- {
- tmp16no1 = supGain;
- } else
- {
- tmp16no1 = aecm->supGainOld;
- }
- aecm->supGainOld = supGain;
- if (tmp16no1 < aecm->supGain)
- {
- aecm->supGain += (WebRtc_Word16)((tmp16no1 - aecm->supGain) >> 4);
- } else
- {
- aecm->supGain += (WebRtc_Word16)((tmp16no1 - aecm->supGain) >> 4);
- }
-
- // END: Update suppression gain
-
- return aecm->supGain;
-}
-
-// WebRtcAecm_DelayCompensation(...)
-//
-// Secondary delay estimation that can be used as a backup or for validation. This function is
-// still under construction and not activated in current version.
-//
-//
-// @param aecm [i/o] Handle of the AECM instance.
-//
-//
-void WebRtcAecm_DelayCompensation(AecmCore_t * const aecm)
-{
- int i, j;
- WebRtc_Word32 delayMeanEcho[CORR_BUF_LEN];
- WebRtc_Word32 delayMeanNear[CORR_BUF_LEN];
- WebRtc_Word16 sumBitPattern, bitPatternEcho, bitPatternNear, maxPos, maxValue,
- maxValueLeft, maxValueRight;
-
- // Check delay (calculate the delay offset (if we can)).
- if ((aecm->startupState > 0) & (aecm->delayCount >= CORR_MAX_BUF) & aecm->delayOffsetFlag)
- {
- // Calculate mean values
- for (i = 0; i < CORR_BUF_LEN; i++)
- {
- delayMeanEcho[i] = 0;
- delayMeanNear[i] = 0;
-#if (!defined ARM_WINM) && (!defined ARM9E_GCC) && (!defined ANDROID_AECOPT)
- for (j = 0; j < CORR_WIDTH; j++)
- {
- delayMeanEcho[i] += (WebRtc_Word32)aecm->echoStoredLogEnergy[i + j];
- delayMeanNear[i] += (WebRtc_Word32)aecm->nearLogEnergy[i + j];
- }
-#else
- for (j = 0; j < CORR_WIDTH -1; )
- {
- delayMeanEcho[i] += (WebRtc_Word32)aecm->echoStoredLogEnergy[i + j];
- delayMeanNear[i] += (WebRtc_Word32)aecm->nearLogEnergy[i + j];
- j++;
- delayMeanEcho[i] += (WebRtc_Word32)aecm->echoStoredLogEnergy[i + j];
- delayMeanNear[i] += (WebRtc_Word32)aecm->nearLogEnergy[i + j];
- j++;
- }
- delayMeanEcho[i] += (WebRtc_Word32)aecm->echoStoredLogEnergy[i + j];
- delayMeanNear[i] += (WebRtc_Word32)aecm->nearLogEnergy[i + j];
-#endif
- }
- // Calculate correlation values
- for (i = 0; i < CORR_BUF_LEN; i++)
- {
- sumBitPattern = 0;
-#if (!defined ARM_WINM) && (!defined ARM9E_GCC) && (!defined ANDROID_AECOPT)
- for (j = 0; j < CORR_WIDTH; j++)
- {
- bitPatternEcho = (WebRtc_Word16)((WebRtc_Word32)aecm->echoStoredLogEnergy[i
- + j] * CORR_WIDTH > delayMeanEcho[i]);
- bitPatternNear = (WebRtc_Word16)((WebRtc_Word32)aecm->nearLogEnergy[CORR_MAX
- + j] * CORR_WIDTH > delayMeanNear[CORR_MAX]);
- sumBitPattern += !(bitPatternEcho ^ bitPatternNear);
- }
-#else
- for (j = 0; j < CORR_WIDTH -1; )
- {
- bitPatternEcho = (WebRtc_Word16)((WebRtc_Word32)aecm->echoStoredLogEnergy[i
- + j] * CORR_WIDTH > delayMeanEcho[i]);
- bitPatternNear = (WebRtc_Word16)((WebRtc_Word32)aecm->nearLogEnergy[CORR_MAX
- + j] * CORR_WIDTH > delayMeanNear[CORR_MAX]);
- sumBitPattern += !(bitPatternEcho ^ bitPatternNear);
- j++;
- bitPatternEcho = (WebRtc_Word16)((WebRtc_Word32)aecm->echoStoredLogEnergy[i
- + j] * CORR_WIDTH > delayMeanEcho[i]);
- bitPatternNear = (WebRtc_Word16)((WebRtc_Word32)aecm->nearLogEnergy[CORR_MAX
- + j] * CORR_WIDTH > delayMeanNear[CORR_MAX]);
- sumBitPattern += !(bitPatternEcho ^ bitPatternNear);
- j++;
- }
- bitPatternEcho = (WebRtc_Word16)((WebRtc_Word32)aecm->echoStoredLogEnergy[i + j]
- * CORR_WIDTH > delayMeanEcho[i]);
- bitPatternNear = (WebRtc_Word16)((WebRtc_Word32)aecm->nearLogEnergy[CORR_MAX + j]
- * CORR_WIDTH > delayMeanNear[CORR_MAX]);
- sumBitPattern += !(bitPatternEcho ^ bitPatternNear);
-#endif
- aecm->delayCorrelation[i] = sumBitPattern;
- }
- aecm->newDelayCorrData = 1; // Indicate we have new correlation data to evaluate
- }
- if ((aecm->startupState == 2) & (aecm->lastDelayUpdateCount > (CORR_WIDTH << 1))
- & aecm->newDelayCorrData)
- {
- // Find maximum value and maximum position as well as values on the sides.
- maxPos = 0;
- maxValue = aecm->delayCorrelation[0];
- maxValueLeft = maxValue;
- maxValueRight = aecm->delayCorrelation[CORR_DEV];
- for (i = 1; i < CORR_BUF_LEN; i++)
- {
- if (aecm->delayCorrelation[i] > maxValue)
- {
- maxValue = aecm->delayCorrelation[i];
- maxPos = i;
- if (maxPos < CORR_DEV)
- {
- maxValueLeft = aecm->delayCorrelation[0];
- maxValueRight = aecm->delayCorrelation[i + CORR_DEV];
- } else if (maxPos > (CORR_MAX << 1) - CORR_DEV)
- {
- maxValueLeft = aecm->delayCorrelation[i - CORR_DEV];
- maxValueRight = aecm->delayCorrelation[(CORR_MAX << 1)];
- } else
- {
- maxValueLeft = aecm->delayCorrelation[i - CORR_DEV];
- maxValueRight = aecm->delayCorrelation[i + CORR_DEV];
- }
- }
- }
- if ((maxPos > 0) & (maxPos < (CORR_MAX << 1)))
- {
- // Avoid maximum at boundaries. The maximum peak has to be higher than
- // CORR_MAX_LEVEL. It also has to be sharp, i.e. the value CORR_DEV bins off should
- // be CORR_MAX_LOW lower than the maximum.
- if ((maxValue > CORR_MAX_LEVEL) & (maxValueLeft < maxValue - CORR_MAX_LOW)
- & (maxValueRight < maxValue - CORR_MAX_LOW))
- {
- aecm->delayAdjust += CORR_MAX - maxPos;
- aecm->newDelayCorrData = 0;
- aecm->lastDelayUpdateCount = 0;
- }
- }
- }
- // END: "Check delay"
-}
-
-void WebRtcAecm_ProcessBlock(AecmCore_t * const aecm, const WebRtc_Word16 * const farend,
- const WebRtc_Word16 * const nearendNoisy,
- const WebRtc_Word16 * const nearendClean,
- WebRtc_Word16 * const output)
-{
- int i, j;
-
- WebRtc_UWord32 xfaSum;
- WebRtc_UWord32 dfaNoisySum;
- WebRtc_UWord32 echoEst32Gained;
- WebRtc_UWord32 tmpU32;
-
- WebRtc_Word32 tmp32no1;
- WebRtc_Word32 tmp32no2;
- WebRtc_Word32 echoEst32[PART_LEN1];
-
- WebRtc_UWord16 xfa[PART_LEN1];
- WebRtc_UWord16 dfaNoisy[PART_LEN1];
- WebRtc_UWord16 dfaClean[PART_LEN1];
- WebRtc_UWord16* ptrDfaClean = dfaClean;
-
- int outCFFT;
-
- WebRtc_Word16 fft[PART_LEN4];
-#if (defined ARM_WINM) || (defined ARM9E_GCC) || (defined ANDROID_AECOPT)
- WebRtc_Word16 postFft[PART_LEN4];
-#else
- WebRtc_Word16 postFft[PART_LEN2];
-#endif
- WebRtc_Word16 dfwReal[PART_LEN1];
- WebRtc_Word16 dfwImag[PART_LEN1];
- WebRtc_Word16 xfwReal[PART_LEN1];
- WebRtc_Word16 xfwImag[PART_LEN1];
- WebRtc_Word16 efwReal[PART_LEN1];
- WebRtc_Word16 efwImag[PART_LEN1];
- WebRtc_Word16 hnl[PART_LEN1];
- WebRtc_Word16 numPosCoef;
- WebRtc_Word16 nlpGain;
- WebRtc_Word16 delay, diff, diffMinusOne;
- WebRtc_Word16 tmp16no1;
- WebRtc_Word16 tmp16no2;
-#ifdef AECM_WITH_ABS_APPROX
- WebRtc_Word16 maxValue;
- WebRtc_Word16 minValue;
-#endif
- WebRtc_Word16 mu;
- WebRtc_Word16 supGain;
- WebRtc_Word16 zeros32, zeros16;
- WebRtc_Word16 zerosDBufNoisy, zerosDBufClean, zerosXBuf;
- WebRtc_Word16 resolutionDiff, qDomainDiff;
-
-#ifdef ARM_WINM_LOG_
- DWORD temp;
- static int flag0 = 0;
- __int64 freq, start, end, diff__;
- unsigned int milliseconds;
-#endif
-
-#ifdef AECM_WITH_ABS_APPROX
- WebRtc_UWord16 alpha, beta;
-#endif
-
- // Determine startup state. There are three states:
- // (0) the first CONV_LEN blocks
- // (1) another CONV_LEN blocks
- // (2) the rest
-
- if (aecm->startupState < 2)
- {
- aecm->startupState = (aecm->totCount >= CONV_LEN) + (aecm->totCount >= CONV_LEN2);
- }
- // END: Determine startup state
-
- // Buffer near and far end signals
- memcpy(aecm->xBuf + PART_LEN, farend, sizeof(WebRtc_Word16) * PART_LEN);
- memcpy(aecm->dBufNoisy + PART_LEN, nearendNoisy, sizeof(WebRtc_Word16) * PART_LEN);
- if (nearendClean != NULL)
- {
- memcpy(aecm->dBufClean + PART_LEN, nearendClean, sizeof(WebRtc_Word16) * PART_LEN);
- }
- // TODO(bjornv): Will be removed in final version.
-#ifdef VAD_DATA
- fwrite(aecm->xBuf, sizeof(WebRtc_Word16), PART_LEN, aecm->far_file);
-#endif
-
-#ifdef AECM_DYNAMIC_Q
- tmp16no1 = WebRtcSpl_MaxAbsValueW16(aecm->dBufNoisy, PART_LEN2);
- tmp16no2 = WebRtcSpl_MaxAbsValueW16(aecm->xBuf, PART_LEN2);
- zerosDBufNoisy = WebRtcSpl_NormW16(tmp16no1);
- zerosXBuf = WebRtcSpl_NormW16(tmp16no2);
-#else
- zerosDBufNoisy = 0;
- zerosXBuf = 0;
-#endif
- aecm->dfaNoisyQDomainOld = aecm->dfaNoisyQDomain;
- aecm->dfaNoisyQDomain = zerosDBufNoisy;
-
- if (nearendClean != NULL)
- {
-#ifdef AECM_DYNAMIC_Q
- tmp16no1 = WebRtcSpl_MaxAbsValueW16(aecm->dBufClean, PART_LEN2);
- zerosDBufClean = WebRtcSpl_NormW16(tmp16no1);
-#else
- zerosDBufClean = 0;
-#endif
- aecm->dfaCleanQDomainOld = aecm->dfaCleanQDomain;
- aecm->dfaCleanQDomain = zerosDBufClean;
- } else
- {
- zerosDBufClean = zerosDBufNoisy;
- aecm->dfaCleanQDomainOld = aecm->dfaNoisyQDomainOld;
- aecm->dfaCleanQDomain = aecm->dfaNoisyQDomain;
- }
-
-#ifdef ARM_WINM_LOG_
- // measure tick start
- QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
- QueryPerformanceCounter((LARGE_INTEGER*)&start);
-#endif
-
- // FFT of noisy near end signal
- for (i = 0; i < PART_LEN; i++)
- {
- j = WEBRTC_SPL_LSHIFT_W32(i, 1);
- // Window near end
- fft[j] = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT((aecm->dBufNoisy[i]
- << zerosDBufNoisy), kSqrtHanning[i], 14);
- fft[PART_LEN2 + j] = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(
- (aecm->dBufNoisy[PART_LEN + i] << zerosDBufNoisy),
- kSqrtHanning[PART_LEN - i], 14);
- // Inserting zeros in imaginary parts
- fft[j + 1] = 0;
- fft[PART_LEN2 + j + 1] = 0;
- }
-
- // Fourier transformation of near end signal.
- // The result is scaled with 1/PART_LEN2, that is, the result is in Q(-6) for PART_LEN = 32
-
-#if (defined ARM_WINM) || (defined ARM9E_GCC) || (defined ANDROID_AECOPT)
- outCFFT = WebRtcSpl_ComplexFFT2(fft, postFft, PART_LEN_SHIFT, 1);
-
- // The imaginary part has to switch sign
- for(i = 1; i < PART_LEN2-1;)
- {
- postFft[i] = -postFft[i];
- i += 2;
- postFft[i] = -postFft[i];
- i += 2;
- }
-#else
- WebRtcSpl_ComplexBitReverse(fft, PART_LEN_SHIFT);
- outCFFT = WebRtcSpl_ComplexFFT(fft, PART_LEN_SHIFT, 1);
-
- // Take only the first PART_LEN2 samples
- for (i = 0; i < PART_LEN2; i++)
- {
- postFft[i] = fft[i];
- }
- // The imaginary part has to switch sign
- for (i = 1; i < PART_LEN2;)
- {
- postFft[i] = -postFft[i];
- i += 2;
- }
-#endif
-
- // Extract imaginary and real part, calculate the magnitude for all frequency bins
- dfwImag[0] = 0;
- dfwImag[PART_LEN] = 0;
- dfwReal[0] = postFft[0];
-#if (defined ARM_WINM) || (defined ARM9E_GCC) || (defined ANDROID_AECOPT)
- dfwReal[PART_LEN] = postFft[PART_LEN2];
-#else
- dfwReal[PART_LEN] = fft[PART_LEN2];
-#endif
- dfaNoisy[0] = (WebRtc_UWord16)WEBRTC_SPL_ABS_W16(dfwReal[0]);
- dfaNoisy[PART_LEN] = (WebRtc_UWord16)WEBRTC_SPL_ABS_W16(dfwReal[PART_LEN]);
- dfaNoisySum = (WebRtc_UWord32)(dfaNoisy[0]);
- dfaNoisySum += (WebRtc_UWord32)(dfaNoisy[PART_LEN]);
-
- for (i = 1; i < PART_LEN; i++)
- {
- j = WEBRTC_SPL_LSHIFT_W32(i, 1);
- dfwReal[i] = postFft[j];
- dfwImag[i] = postFft[j + 1];
-
- if (dfwReal[i] == 0 || dfwImag[i] == 0)
- {
- dfaNoisy[i] = (WebRtc_UWord16)WEBRTC_SPL_ABS_W16(dfwReal[i] + dfwImag[i]);
- } else
- {
- // Approximation for magnitude of complex fft output
- // magn = sqrt(real^2 + imag^2)
- // magn ~= alpha * max(|imag|,|real|) + beta * min(|imag|,|real|)
- //
- // The parameters alpha and beta are stored in Q15
-
- tmp16no1 = WEBRTC_SPL_ABS_W16(postFft[j]);
- tmp16no2 = WEBRTC_SPL_ABS_W16(postFft[j + 1]);
-
-#ifdef AECM_WITH_ABS_APPROX
- if(tmp16no1 > tmp16no2)
- {
- maxValue = tmp16no1;
- minValue = tmp16no2;
- } else
- {
- maxValue = tmp16no2;
- minValue = tmp16no1;
- }
-
- // Magnitude in Q-6
- if ((maxValue >> 2) > minValue)
- {
- alpha = kAlpha1;
- beta = kBeta1;
- } else if ((maxValue >> 1) > minValue)
- {
- alpha = kAlpha2;
- beta = kBeta2;
- } else
- {
- alpha = kAlpha3;
- beta = kBeta3;
- }
- tmp16no1 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(maxValue, alpha, 15);
- tmp16no2 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(minValue, beta, 15);
- dfaNoisy[i] = (WebRtc_UWord16)tmp16no1 + (WebRtc_UWord16)tmp16no2;
-#else
- tmp32no1 = WEBRTC_SPL_MUL_16_16(tmp16no1, tmp16no1);
- tmp32no2 = WEBRTC_SPL_MUL_16_16(tmp16no2, tmp16no2);
- tmp32no2 = WEBRTC_SPL_ADD_SAT_W32(tmp32no1, tmp32no2);
- tmp32no1 = WebRtcSpl_Sqrt(tmp32no2);
- dfaNoisy[i] = (WebRtc_UWord16)tmp32no1;
-#endif
- }
- dfaNoisySum += (WebRtc_UWord32)dfaNoisy[i];
- }
- // END: FFT of noisy near end signal
-
- if (nearendClean == NULL)
- {
- ptrDfaClean = dfaNoisy;
- } else
- {
- // FFT of clean near end signal
- for (i = 0; i < PART_LEN; i++)
- {
- j = WEBRTC_SPL_LSHIFT_W32(i, 1);
- // Window near end
- fft[j]
- = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT((aecm->dBufClean[i] << zerosDBufClean), kSqrtHanning[i], 14);
- fft[PART_LEN2 + j]
- = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT((aecm->dBufClean[PART_LEN + i] << zerosDBufClean), kSqrtHanning[PART_LEN - i], 14);
- // Inserting zeros in imaginary parts
- fft[j + 1] = 0;
- fft[PART_LEN2 + j + 1] = 0;
- }
-
- // Fourier transformation of near end signal.
- // The result is scaled with 1/PART_LEN2, that is, in Q(-6) for PART_LEN = 32
-
-#if (defined ARM_WINM) || (defined ARM9E_GCC) || (defined ANDROID_AECOPT)
- outCFFT = WebRtcSpl_ComplexFFT2(fft, postFft, PART_LEN_SHIFT, 1);
-
- // The imaginary part has to switch sign
- for(i = 1; i < PART_LEN2-1;)
- {
- postFft[i] = -postFft[i];
- i += 2;
- postFft[i] = -postFft[i];
- i += 2;
- }
-#else
- WebRtcSpl_ComplexBitReverse(fft, PART_LEN_SHIFT);
- outCFFT = WebRtcSpl_ComplexFFT(fft, PART_LEN_SHIFT, 1);
-
- // Take only the first PART_LEN2 samples
- for (i = 0; i < PART_LEN2; i++)
- {
- postFft[i] = fft[i];
- }
- // The imaginary part has to switch sign
- for (i = 1; i < PART_LEN2;)
- {
- postFft[i] = -postFft[i];
- i += 2;
- }
-#endif
-
- // Extract imaginary and real part, calculate the magnitude for all frequency bins
- dfwImag[0] = 0;
- dfwImag[PART_LEN] = 0;
- dfwReal[0] = postFft[0];
-#if (defined ARM_WINM) || (defined ARM9E_GCC) || (defined ANDROID_AECOPT)
- dfwReal[PART_LEN] = postFft[PART_LEN2];
-#else
- dfwReal[PART_LEN] = fft[PART_LEN2];
-#endif
- dfaClean[0] = (WebRtc_UWord16)WEBRTC_SPL_ABS_W16(dfwReal[0]);
- dfaClean[PART_LEN] = (WebRtc_UWord16)WEBRTC_SPL_ABS_W16(dfwReal[PART_LEN]);
-
- for (i = 1; i < PART_LEN; i++)
- {
- j = WEBRTC_SPL_LSHIFT_W32(i, 1);
- dfwReal[i] = postFft[j];
- dfwImag[i] = postFft[j + 1];
-
- if (dfwReal[i] == 0 || dfwImag[i] == 0)
- {
- dfaClean[i] = (WebRtc_UWord16)WEBRTC_SPL_ABS_W16(dfwReal[i] + dfwImag[i]);
- } else
- {
- // Approximation for magnitude of complex fft output
- // magn = sqrt(real^2 + imag^2)
- // magn ~= alpha * max(|imag|,|real|) + beta * min(|imag|,|real|)
- //
- // The parameters alpha and beta are stored in Q15
-
- tmp16no1 = WEBRTC_SPL_ABS_W16(postFft[j]);
- tmp16no2 = WEBRTC_SPL_ABS_W16(postFft[j + 1]);
-
-#ifdef AECM_WITH_ABS_APPROX
- if(tmp16no1 > tmp16no2)
- {
- maxValue = tmp16no1;
- minValue = tmp16no2;
- } else
- {
- maxValue = tmp16no2;
- minValue = tmp16no1;
- }
-
- // Magnitude in Q-6
- if ((maxValue >> 2) > minValue)
- {
- alpha = kAlpha1;
- beta = kBeta1;
- } else if ((maxValue >> 1) > minValue)
- {
- alpha = kAlpha2;
- beta = kBeta2;
- } else
- {
- alpha = kAlpha3;
- beta = kBeta3;
- }
- tmp16no1 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(maxValue, alpha, 15);
- tmp16no2 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(minValue, beta, 15);
- dfaClean[i] = (WebRtc_UWord16)tmp16no1 + (WebRtc_UWord16)tmp16no2;
-#else
- tmp32no1 = WEBRTC_SPL_MUL_16_16(tmp16no1, tmp16no1);
- tmp32no2 = WEBRTC_SPL_MUL_16_16(tmp16no2, tmp16no2);
- tmp32no2 = WEBRTC_SPL_ADD_SAT_W32(tmp32no1, tmp32no2);
- tmp32no1 = WebRtcSpl_Sqrt(tmp32no2);
- dfaClean[i] = (WebRtc_UWord16)tmp32no1;
-#endif
- }
- }
- }
- // END: FFT of clean near end signal
-
- // FFT of far end signal
- for (i = 0; i < PART_LEN; i++)
- {
- j = WEBRTC_SPL_LSHIFT_W32(i, 1);
- // Window farend
- fft[j]
- = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT((aecm->xBuf[i] << zerosXBuf), kSqrtHanning[i], 14);
- fft[PART_LEN2 + j]
- = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT((aecm->xBuf[PART_LEN + i] << zerosXBuf), kSqrtHanning[PART_LEN - i], 14);
- // Inserting zeros in imaginary parts
- fft[j + 1] = 0;
- fft[PART_LEN2 + j + 1] = 0;
- }
- // Fourier transformation of far end signal.
- // The result is scaled with 1/PART_LEN2, that is the result is in Q(-6) for PART_LEN = 32
-#if (defined ARM_WINM) || (defined ARM9E_GCC) || (defined ANDROID_AECOPT)
- outCFFT = WebRtcSpl_ComplexFFT2(fft, postFft, PART_LEN_SHIFT, 1);
-
- // The imaginary part has to switch sign
- for(i = 1; i < PART_LEN2-1;)
- {
- postFft[i] = -postFft[i];
- i += 2;
- postFft[i] = -postFft[i];
- i += 2;
- }
-#else
- WebRtcSpl_ComplexBitReverse(fft, PART_LEN_SHIFT);
- outCFFT = WebRtcSpl_ComplexFFT(fft, PART_LEN_SHIFT, 1);
-
- // Take only the first PART_LEN2 samples
- for (i = 0; i < PART_LEN2; i++)
- {
- postFft[i] = fft[i];
- }
- // The imaginary part has to switch sign
- for (i = 1; i < PART_LEN2;)
- {
- postFft[i] = -postFft[i];
- i += 2;
- }
-#endif
-
- // Extract imaginary and real part, calculate the magnitude for all frequency bins
- xfwImag[0] = 0;
- xfwImag[PART_LEN] = 0;
- xfwReal[0] = postFft[0];
-#if (defined ARM_WINM) || (defined ARM9E_GCC) || (defined ANDROID_AECOPT)
- xfwReal[PART_LEN] = postFft[PART_LEN2];
-#else
- xfwReal[PART_LEN] = fft[PART_LEN2];
-#endif
- xfa[0] = (WebRtc_UWord16)WEBRTC_SPL_ABS_W16(xfwReal[0]);
- xfa[PART_LEN] = (WebRtc_UWord16)WEBRTC_SPL_ABS_W16(xfwReal[PART_LEN]);
- xfaSum = (WebRtc_UWord32)(xfa[0]) + (WebRtc_UWord32)(xfa[PART_LEN]);
-
- for (i = 1; i < PART_LEN; i++)
- {
- j = WEBRTC_SPL_LSHIFT_W32(i,1);
- xfwReal[i] = postFft[j];
- xfwImag[i] = postFft[j + 1];
-
- if (xfwReal[i] == 0 || xfwImag[i] == 0)
- {
- xfa[i] = (WebRtc_UWord16)WEBRTC_SPL_ABS_W16(xfwReal[i] + xfwImag[i]);
- } else
- {
- // Approximation for magnitude of complex fft output
- // magn = sqrt(real^2 + imag^2)
- // magn ~= alpha * max(|imag|,|real|) + beta * min(|imag|,|real|)
- //
- // The parameters alpha and beta are stored in Q15
-
- tmp16no1 = WEBRTC_SPL_ABS_W16(postFft[j]);
- tmp16no2 = WEBRTC_SPL_ABS_W16(postFft[j + 1]);
-
-#ifdef AECM_WITH_ABS_APPROX
- if(tmp16no1 > xfwImag[i])
- {
- maxValue = tmp16no1;
- minValue = tmp16no2;
- } else
- {
- maxValue = tmp16no2;
- minValue = tmp16no1;
- }
- // Magnitude in Q-6
- if ((maxValue >> 2) > minValue)
- {
- alpha = kAlpha1;
- beta = kBeta1;
- } else if ((maxValue >> 1) > minValue)
- {
- alpha = kAlpha2;
- beta = kBeta2;
- } else
- {
- alpha = kAlpha3;
- beta = kBeta3;
- }
- tmp16no1 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(maxValue, alpha, 15);
- tmp16no2 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(minValue, beta, 15);
- xfa[i] = (WebRtc_UWord16)tmp16no1 + (WebRtc_UWord16)tmp16no2;
-#else
- tmp32no1 = WEBRTC_SPL_MUL_16_16(tmp16no1, tmp16no1);
- tmp32no2 = WEBRTC_SPL_MUL_16_16(tmp16no2, tmp16no2);
- tmp32no2 = WEBRTC_SPL_ADD_SAT_W32(tmp32no1, tmp32no2);
- tmp32no1 = WebRtcSpl_Sqrt(tmp32no2);
- xfa[i] = (WebRtc_UWord16)tmp32no1;
-#endif
- }
- xfaSum += (WebRtc_UWord32)xfa[i];
- }
-
-#ifdef ARM_WINM_LOG_
- // measure tick end
- QueryPerformanceCounter((LARGE_INTEGER*)&end);
- diff__ = ((end - start) * 1000) / (freq/1000);
- milliseconds = (unsigned int)(diff__ & 0xffffffff);
- WriteFile (logFile, &milliseconds, sizeof(unsigned int), &temp, NULL);
-#endif
- // END: FFT of far end signal
-
- // Get the delay
-
- // Fixed delay estimation
- // input: dfaFIX, xfaFIX in Q-stages
- // output: delay in Q0
- //
- // comment on the fixed point accuracy of estimate_delayFIX
- // -> due to rounding the fixed point variables xfa and dfa contain a lot more zeros
- // than the corresponding floating point variables this results in big differences
- // between the floating point and the fixed point logarithmic spectra for small values
-#ifdef ARM_WINM_LOG_
- // measure tick start
- QueryPerformanceCounter((LARGE_INTEGER*)&start);
-#endif
-
- // Save far-end history and estimate delay
- delay = WebRtcAecm_EstimateDelay(aecm, xfa, dfaNoisy, zerosXBuf);
-
- if (aecm->fixedDelay >= 0)
- {
- // Use fixed delay
- delay = aecm->fixedDelay;
- }
-
- aecm->currentDelay = delay;
-
- if ((aecm->delayOffsetFlag) & (aecm->startupState > 0)) // If delay compensation is on
- {
- // If the delay estimate changed from previous block, update the offset
- if ((aecm->currentDelay != aecm->previousDelay) & !aecm->currentDelay
- & !aecm->previousDelay)
- {
- aecm->delayAdjust += (aecm->currentDelay - aecm->previousDelay);
- }
- // Compensate with the offset estimate
- aecm->currentDelay -= aecm->delayAdjust;
- aecm->previousDelay = delay;
- }
-
- diff = aecm->delHistoryPos - aecm->currentDelay;
- if (diff < 0)
- {
- diff = diff + MAX_DELAY;
- }
-
-#ifdef ARM_WINM_LOG_
- // measure tick end
- QueryPerformanceCounter((LARGE_INTEGER*)&end);
- diff__ = ((end - start) * 1000) / (freq/1000);
- milliseconds = (unsigned int)(diff__ & 0xffffffff);
- WriteFile (logFile, &milliseconds, sizeof(unsigned int), &temp, NULL);
-#endif
-
- // END: Get the delay
-
-#ifdef ARM_WINM_LOG_
- // measure tick start
- QueryPerformanceCounter((LARGE_INTEGER*)&start);
-#endif
- // Calculate log(energy) and update energy threshold levels
- WebRtcAecm_CalcEnergies(aecm, diff, dfaNoisySum, echoEst32);
-
- // Calculate stepsize
- mu = WebRtcAecm_CalcStepSize(aecm);
-
- // Update counters
- aecm->totCount++;
- aecm->lastDelayUpdateCount++;
-
- // This is the channel estimation algorithm.
- // It is base on NLMS but has a variable step length, which was calculated above.
- WebRtcAecm_UpdateChannel(aecm, dfaNoisy, diff, mu, echoEst32);
- WebRtcAecm_DelayCompensation(aecm);
- supGain = WebRtcAecm_CalcSuppressionGain(aecm);
-
-#ifdef ARM_WINM_LOG_
- // measure tick end
- QueryPerformanceCounter((LARGE_INTEGER*)&end);
- diff__ = ((end - start) * 1000) / (freq/1000);
- milliseconds = (unsigned int)(diff__ & 0xffffffff);
- WriteFile (logFile, &milliseconds, sizeof(unsigned int), &temp, NULL);
-#endif
-
-#ifdef ARM_WINM_LOG_
- // measure tick start
- QueryPerformanceCounter((LARGE_INTEGER*)&start);
-#endif
-
- // Calculate Wiener filter hnl[]
- numPosCoef = 0;
- diffMinusOne = diff - 1;
- if (diff == 0)
- {
- diffMinusOne = MAX_DELAY;
- }
- for (i = 0; i < PART_LEN1; i++)
- {
- // Far end signal through channel estimate in Q8
- // How much can we shift right to preserve resolution
- tmp32no1 = echoEst32[i] - aecm->echoFilt[i];
- aecm->echoFilt[i] += WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL_32_16(tmp32no1, 50), 8);
-
- zeros32 = WebRtcSpl_NormW32(aecm->echoFilt[i]) + 1;
- zeros16 = WebRtcSpl_NormW16(supGain) + 1;
- if (zeros32 + zeros16 > 16)
- {
- // Multiplication is safe
- // Result in Q(RESOLUTION_CHANNEL+RESOLUTION_SUPGAIN+aecm->xfaQDomainBuf[diff])
- echoEst32Gained = WEBRTC_SPL_UMUL_32_16((WebRtc_UWord32)aecm->echoFilt[i],
- (WebRtc_UWord16)supGain);
- resolutionDiff = 14 - RESOLUTION_CHANNEL16 - RESOLUTION_SUPGAIN;
- resolutionDiff += (aecm->dfaCleanQDomain - aecm->xfaQDomainBuf[diff]);
- } else
- {
- tmp16no1 = 17 - zeros32 - zeros16;
- resolutionDiff = 14 + tmp16no1 - RESOLUTION_CHANNEL16 - RESOLUTION_SUPGAIN;
- resolutionDiff += (aecm->dfaCleanQDomain - aecm->xfaQDomainBuf[diff]);
- if (zeros32 > tmp16no1)
- {
- echoEst32Gained = WEBRTC_SPL_UMUL_32_16((WebRtc_UWord32)aecm->echoFilt[i],
- (WebRtc_UWord16)WEBRTC_SPL_RSHIFT_W16(supGain,
- tmp16no1)); // Q-(RESOLUTION_CHANNEL+RESOLUTION_SUPGAIN-16)
- } else
- {
- // Result in Q-(RESOLUTION_CHANNEL+RESOLUTION_SUPGAIN-16)
- echoEst32Gained = WEBRTC_SPL_UMUL_32_16(
- (WebRtc_UWord32)WEBRTC_SPL_RSHIFT_W32(aecm->echoFilt[i], tmp16no1),
- (WebRtc_UWord16)supGain);
- }
- }
-
- zeros16 = WebRtcSpl_NormW16(aecm->nearFilt[i]);
- if ((zeros16 < (aecm->dfaCleanQDomain - aecm->dfaCleanQDomainOld))
- & (aecm->nearFilt[i]))
- {
- tmp16no1 = WEBRTC_SPL_SHIFT_W16(aecm->nearFilt[i], zeros16);
- qDomainDiff = zeros16 - aecm->dfaCleanQDomain + aecm->dfaCleanQDomainOld;
- } else
- {
- tmp16no1 = WEBRTC_SPL_SHIFT_W16(aecm->nearFilt[i], aecm->dfaCleanQDomain
- - aecm->dfaCleanQDomainOld);
- qDomainDiff = 0;
- }
- tmp16no2 = WEBRTC_SPL_SHIFT_W16(ptrDfaClean[i], qDomainDiff);
- tmp16no2 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(tmp16no2 - tmp16no1, 1, 4);
- tmp16no2 += tmp16no1;
- zeros16 = WebRtcSpl_NormW16(tmp16no2);
- if ((tmp16no2) & (-qDomainDiff > zeros16))
- {
- aecm->nearFilt[i] = WEBRTC_SPL_WORD16_MAX;
- } else
- {
- aecm->nearFilt[i] = WEBRTC_SPL_SHIFT_W16(tmp16no2, -qDomainDiff);
- }
-
- // Wiener filter coefficients, resulting hnl in Q14
- if (echoEst32Gained == 0)
- {
- hnl[i] = ONE_Q14;
- } else if (aecm->nearFilt[i] == 0)
- {
- hnl[i] = 0;
- } else
- {
- // Multiply the suppression gain
- // Rounding
- echoEst32Gained += (WebRtc_UWord32)(aecm->nearFilt[i] >> 1);
- tmpU32 = WebRtcSpl_DivU32U16(echoEst32Gained, (WebRtc_UWord16)aecm->nearFilt[i]);
-
- // Current resolution is
- // Q-(RESOLUTION_CHANNEL + RESOLUTION_SUPGAIN - max(0, 17 - zeros16 - zeros32))
- // Make sure we are in Q14
- tmp32no1 = (WebRtc_Word32)WEBRTC_SPL_SHIFT_W32(tmpU32, resolutionDiff);
- if (tmp32no1 > ONE_Q14)
- {
- hnl[i] = 0;
- } else if (tmp32no1 < 0)
- {
- hnl[i] = ONE_Q14;
- } else
- {
- // 1-echoEst/dfa
-#if (!defined ARM_WINM) && (!defined ARM9E_GCC) && (!defined ANDROID_AECOPT)
- hnl[i] = ONE_Q14 - (WebRtc_Word16)tmp32no1;
- if (hnl[i] < 0)
- {
- hnl[i] = 0;
- }
-#else
- hnl[i] = ((ONE_Q14 - (WebRtc_Word16)tmp32no1) > 0) ? (ONE_Q14 - (WebRtc_Word16)tmp32no1) : 0;
-#endif
- }
- }
- if (hnl[i])
- {
- numPosCoef++;
- }
- }
-
-#ifdef ARM_WINM_LOG_
- // measure tick end
- QueryPerformanceCounter((LARGE_INTEGER*)&end);
- diff__ = ((end - start) * 1000) / (freq/1000);
- milliseconds = (unsigned int)(diff__ & 0xffffffff);
- WriteFile (logFile, &milliseconds, sizeof(unsigned int), &temp, NULL);
-#endif
-
-#ifdef ARM_WINM_LOG_
- // measure tick start
- QueryPerformanceCounter((LARGE_INTEGER*)&start);
-#endif
-
- // Calculate NLP gain, result is in Q14
- for (i = 0; i < PART_LEN1; i++)
- {
- if (aecm->nlpFlag)
- {
- // Truncate values close to zero and one.
- if (hnl[i] > NLP_COMP_HIGH)
- {
- hnl[i] = ONE_Q14;
- } else if (hnl[i] < NLP_COMP_LOW)
- {
- hnl[i] = 0;
- }
-
- // Remove outliers
- if (numPosCoef < 3)
- {
- nlpGain = 0;
- } else
- {
- nlpGain = ONE_Q14;
- }
- // NLP
- if ((hnl[i] == ONE_Q14) && (nlpGain == ONE_Q14))
- {
- hnl[i] = ONE_Q14;
- } else
- {
- hnl[i] = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(hnl[i], nlpGain, 14);
- }
- }
-
- // multiply with Wiener coefficients
- efwReal[i] = (WebRtc_Word16)(WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(dfwReal[i], hnl[i],
- 14));
- efwImag[i] = (WebRtc_Word16)(WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(dfwImag[i], hnl[i],
- 14));
- }
-
- if (aecm->cngMode == AecmTrue)
- {
- WebRtcAecm_ComfortNoise(aecm, ptrDfaClean, efwReal, efwImag, hnl);
- }
-
-#ifdef ARM_WINM_LOG_
- // measure tick end
- QueryPerformanceCounter((LARGE_INTEGER*)&end);
- diff__ = ((end - start) * 1000) / (freq/1000);
- milliseconds = (unsigned int)(diff__ & 0xffffffff);
- WriteFile (logFile, &milliseconds, sizeof(unsigned int), &temp, NULL);
-#endif
-
-#ifdef ARM_WINM_LOG_
- // measure tick start
- QueryPerformanceCounter((LARGE_INTEGER*)&start);
-#endif
-
- // Synthesis
- for (i = 1; i < PART_LEN; i++)
- {
- j = WEBRTC_SPL_LSHIFT_W32(i, 1);
- fft[j] = efwReal[i];
-
- // mirrored data, even
- fft[PART_LEN4 - j] = efwReal[i];
- fft[j + 1] = -efwImag[i];
-
- //mirrored data, odd
- fft[PART_LEN4 - (j - 1)] = efwImag[i];
- }
- fft[0] = efwReal[0];
- fft[1] = -efwImag[0];
-
- fft[PART_LEN2] = efwReal[PART_LEN];
- fft[PART_LEN2 + 1] = -efwImag[PART_LEN];
-
-#if (!defined ARM_WINM) && (!defined ARM9E_GCC) && (!defined ANDROID_AECOPT)
- // inverse FFT, result should be scaled with outCFFT
- WebRtcSpl_ComplexBitReverse(fft, PART_LEN_SHIFT);
- outCFFT = WebRtcSpl_ComplexIFFT(fft, PART_LEN_SHIFT, 1);
-
- //take only the real values and scale with outCFFT
- for (i = 0; i < PART_LEN2; i++)
- {
- j = WEBRTC_SPL_LSHIFT_W32(i, 1);
- fft[i] = fft[j];
- }
-#else
- outCFFT = WebRtcSpl_ComplexIFFT2(fft, postFft, PART_LEN_SHIFT, 1);
-
- //take only the real values and scale with outCFFT
- for(i = 0, j = 0; i < PART_LEN2;)
- {
- fft[i] = postFft[j];
- i += 1;
- j += 2;
- fft[i] = postFft[j];
- i += 1;
- j += 2;
- }
-#endif
-
- for (i = 0; i < PART_LEN; i++)
- {
- fft[i] = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(
- fft[i],
- kSqrtHanning[i],
- 14);
- tmp32no1 = WEBRTC_SPL_SHIFT_W32((WebRtc_Word32)fft[i],
- outCFFT - aecm->dfaCleanQDomain);
- fft[i] = (WebRtc_Word16)WEBRTC_SPL_SAT(WEBRTC_SPL_WORD16_MAX,
- tmp32no1 + aecm->outBuf[i],
- WEBRTC_SPL_WORD16_MIN);
- output[i] = fft[i];
-
- tmp32no1 = WEBRTC_SPL_MUL_16_16_RSFT(
- fft[PART_LEN + i],
- kSqrtHanning[PART_LEN - i],
- 14);
- tmp32no1 = WEBRTC_SPL_SHIFT_W32(tmp32no1,
- outCFFT - aecm->dfaCleanQDomain);
- aecm->outBuf[i] = (WebRtc_Word16)WEBRTC_SPL_SAT(
- WEBRTC_SPL_WORD16_MAX,
- tmp32no1,
- WEBRTC_SPL_WORD16_MIN);
- }
-
-#ifdef ARM_WINM_LOG_
- // measure tick end
- QueryPerformanceCounter((LARGE_INTEGER*)&end);
- diff__ = ((end - start) * 1000) / (freq/1000);
- milliseconds = (unsigned int)(diff__ & 0xffffffff);
- WriteFile (logFile, &milliseconds, sizeof(unsigned int), &temp, NULL);
-#endif
- // Copy the current block to the old position (outBuf is shifted elsewhere)
- memcpy(aecm->xBuf, aecm->xBuf + PART_LEN, sizeof(WebRtc_Word16) * PART_LEN);
- memcpy(aecm->dBufNoisy, aecm->dBufNoisy + PART_LEN, sizeof(WebRtc_Word16) * PART_LEN);
- if (nearendClean != NULL)
- {
- memcpy(aecm->dBufClean, aecm->dBufClean + PART_LEN, sizeof(WebRtc_Word16) * PART_LEN);
- }
-}
-
-// Generate comfort noise and add to output signal.
-//
-// \param[in] aecm Handle of the AECM instance.
-// \param[in] dfa Absolute value of the nearend signal (Q[aecm->dfaQDomain]).
-// \param[in,out] outReal Real part of the output signal (Q[aecm->dfaQDomain]).
-// \param[in,out] outImag Imaginary part of the output signal (Q[aecm->dfaQDomain]).
-// \param[in] lambda Suppression gain with which to scale the noise level (Q14).
-//
-static void WebRtcAecm_ComfortNoise(AecmCore_t * const aecm, const WebRtc_UWord16 * const dfa,
- WebRtc_Word16 * const outReal,
- WebRtc_Word16 * const outImag,
- const WebRtc_Word16 * const lambda)
-{
- WebRtc_Word16 i;
- WebRtc_Word16 tmp16;
- WebRtc_Word32 tmp32;
-
- WebRtc_Word16 randW16[PART_LEN];
- WebRtc_Word16 uReal[PART_LEN1];
- WebRtc_Word16 uImag[PART_LEN1];
- WebRtc_Word32 outLShift32[PART_LEN1];
- WebRtc_Word16 noiseRShift16[PART_LEN1];
-
- WebRtc_Word16 shiftFromNearToNoise[PART_LEN1];
- WebRtc_Word16 minTrackShift;
- WebRtc_Word32 upper32;
- WebRtc_Word32 lower32;
-
- if (aecm->noiseEstCtr < 100)
- {
- // Track the minimum more quickly initially.
- aecm->noiseEstCtr++;
- minTrackShift = 7;
- } else
- {
- minTrackShift = 9;
- }
-
- // Estimate noise power.
- for (i = 0; i < PART_LEN1; i++)
- {
- shiftFromNearToNoise[i] = aecm->noiseEstQDomain[i] - aecm->dfaCleanQDomain;
-
- // Shift to the noise domain.
- tmp32 = (WebRtc_Word32)dfa[i];
- outLShift32[i] = WEBRTC_SPL_SHIFT_W32(tmp32, shiftFromNearToNoise[i]);
-
- if (outLShift32[i] < aecm->noiseEst[i])
- {
- // Track the minimum.
- aecm->noiseEst[i] += ((outLShift32[i] - aecm->noiseEst[i]) >> minTrackShift);
- } else
- {
- // Ramp slowly upwards until we hit the minimum again.
-
- // Avoid overflow.
- if (aecm->noiseEst[i] < 2146435583)
- {
- // Store the fractional portion.
- upper32 = (aecm->noiseEst[i] & 0xffff0000) >> 16;
- lower32 = aecm->noiseEst[i] & 0x0000ffff;
- upper32 = ((upper32 * 2049) >> 11);
- lower32 = ((lower32 * 2049) >> 11);
- aecm->noiseEst[i] = WEBRTC_SPL_ADD_SAT_W32(upper32 << 16, lower32);
- }
- }
- }
-
- for (i = 0; i < PART_LEN1; i++)
- {
- tmp32 = WEBRTC_SPL_SHIFT_W32(aecm->noiseEst[i], -shiftFromNearToNoise[i]);
- if (tmp32 > 32767)
- {
- tmp32 = 32767;
- aecm->noiseEst[i] = WEBRTC_SPL_SHIFT_W32(tmp32, shiftFromNearToNoise[i]);
- }
- noiseRShift16[i] = (WebRtc_Word16)tmp32;
-
- tmp16 = ONE_Q14 - lambda[i];
- noiseRShift16[i]
- = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(tmp16, noiseRShift16[i], 14);
- }
-
- // Generate a uniform random array on [0 2^15-1].
- WebRtcSpl_RandUArray(randW16, PART_LEN, &aecm->seed);
-
- // Generate noise according to estimated energy.
- uReal[0] = 0; // Reject LF noise.
- uImag[0] = 0;
- for (i = 1; i < PART_LEN1; i++)
- {
- // Get a random index for the cos and sin tables over [0 359].
- tmp16 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(359, randW16[i - 1], 15);
-
- // Tables are in Q13.
- uReal[i] = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(noiseRShift16[i],
- WebRtcSpl_kCosTable[tmp16], 13);
- uImag[i] = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(-noiseRShift16[i],
- WebRtcSpl_kSinTable[tmp16], 13);
- }
- uImag[PART_LEN] = 0;
-
-#if (!defined ARM_WINM) && (!defined ARM9E_GCC) && (!defined ANDROID_AECOPT)
- for (i = 0; i < PART_LEN1; i++)
- {
- outReal[i] = WEBRTC_SPL_ADD_SAT_W16(outReal[i], uReal[i]);
- outImag[i] = WEBRTC_SPL_ADD_SAT_W16(outImag[i], uImag[i]);
- }
-#else
- for (i = 0; i < PART_LEN1 -1; )
- {
- outReal[i] = WEBRTC_SPL_ADD_SAT_W16(outReal[i], uReal[i]);
- outImag[i] = WEBRTC_SPL_ADD_SAT_W16(outImag[i], uImag[i]);
- i++;
-
- outReal[i] = WEBRTC_SPL_ADD_SAT_W16(outReal[i], uReal[i]);
- outImag[i] = WEBRTC_SPL_ADD_SAT_W16(outImag[i], uImag[i]);
- i++;
- }
- outReal[i] = WEBRTC_SPL_ADD_SAT_W16(outReal[i], uReal[i]);
- outImag[i] = WEBRTC_SPL_ADD_SAT_W16(outImag[i], uImag[i]);
-#endif
-}
-
-void WebRtcAecm_BufferFarFrame(AecmCore_t * const aecm, const WebRtc_Word16 * const farend,
- const int farLen)
-{
- int writeLen = farLen, writePos = 0;
-
- // Check if the write position must be wrapped
- while (aecm->farBufWritePos + writeLen > FAR_BUF_LEN)
- {
- // Write to remaining buffer space before wrapping
- writeLen = FAR_BUF_LEN - aecm->farBufWritePos;
- memcpy(aecm->farBuf + aecm->farBufWritePos, farend + writePos,
- sizeof(WebRtc_Word16) * writeLen);
- aecm->farBufWritePos = 0;
- writePos = writeLen;
- writeLen = farLen - writeLen;
- }
-
- memcpy(aecm->farBuf + aecm->farBufWritePos, farend + writePos,
- sizeof(WebRtc_Word16) * writeLen);
- aecm->farBufWritePos += writeLen;
-}
-
-void WebRtcAecm_FetchFarFrame(AecmCore_t * const aecm, WebRtc_Word16 * const farend,
- const int farLen, const int knownDelay)
-{
- int readLen = farLen;
- int readPos = 0;
- int delayChange = knownDelay - aecm->lastKnownDelay;
-
- aecm->farBufReadPos -= delayChange;
-
- // Check if delay forces a read position wrap
- while (aecm->farBufReadPos < 0)
- {
- aecm->farBufReadPos += FAR_BUF_LEN;
- }
- while (aecm->farBufReadPos > FAR_BUF_LEN - 1)
- {
- aecm->farBufReadPos -= FAR_BUF_LEN;
- }
-
- aecm->lastKnownDelay = knownDelay;
-
- // Check if read position must be wrapped
- while (aecm->farBufReadPos + readLen > FAR_BUF_LEN)
- {
-
- // Read from remaining buffer space before wrapping
- readLen = FAR_BUF_LEN - aecm->farBufReadPos;
- memcpy(farend + readPos, aecm->farBuf + aecm->farBufReadPos,
- sizeof(WebRtc_Word16) * readLen);
- aecm->farBufReadPos = 0;
- readPos = readLen;
- readLen = farLen - readLen;
- }
- memcpy(farend + readPos, aecm->farBuf + aecm->farBufReadPos,
- sizeof(WebRtc_Word16) * readLen);
- aecm->farBufReadPos += readLen;
-}
diff --git a/src/modules/audio_processing/aecm/main/source/aecm_core.h b/src/modules/audio_processing/aecm/main/source/aecm_core.h
deleted file mode 100644
index 5defbe4..0000000
--- a/src/modules/audio_processing/aecm/main/source/aecm_core.h
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-// Performs echo control (suppression) with fft routines in fixed-point
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AECM_MAIN_SOURCE_AECM_CORE_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AECM_MAIN_SOURCE_AECM_CORE_H_
-
-#define AECM_DYNAMIC_Q // turn on/off dynamic Q-domain
-//#define AECM_WITH_ABS_APPROX
-//#define AECM_SHORT // for 32 sample partition length (otherwise 64)
-
-// TODO(bjornv): These defines will be removed in final version.
-//#define STORE_CHANNEL_DATA
-//#define VAD_DATA
-
-#include "typedefs.h"
-#include "signal_processing_library.h"
-// TODO(bjornv): Will be removed in final version.
-//#include <stdio.h>
-
-// Algorithm parameters
-
-#define FRAME_LEN 80 // Total frame length, 10 ms
-#ifdef AECM_SHORT
-
-#define PART_LEN 32 // Length of partition
-#define PART_LEN_SHIFT 6 // Length of (PART_LEN * 2) in base 2
-
-#else
-
-#define PART_LEN 64 // Length of partition
-#define PART_LEN_SHIFT 7 // Length of (PART_LEN * 2) in base 2
-
-#endif
-
-#define PART_LEN1 (PART_LEN + 1) // Unique fft coefficients
-#define PART_LEN2 (PART_LEN << 1) // Length of partition * 2
-#define PART_LEN4 (PART_LEN << 2) // Length of partition * 4
-#define FAR_BUF_LEN PART_LEN4 // Length of buffers
-#define MAX_DELAY 100
-
-// Counter parameters
-#ifdef AECM_SHORT
-
-#define CONV_LEN 1024 // Convergence length used at startup
-#else
-
-#define CONV_LEN 512 // Convergence length used at startup
-#endif
-
-#define CONV_LEN2 (CONV_LEN << 1) // Convergence length * 2 used at startup
-// Energy parameters
-#define MAX_BUF_LEN 64 // History length of energy signals
-
-#define FAR_ENERGY_MIN 1025 // Lowest Far energy level: At least 2 in energy
-#define FAR_ENERGY_DIFF 929 // Allowed difference between max and min
-
-#define ENERGY_DEV_OFFSET 0 // The energy error offset in Q8
-#define ENERGY_DEV_TOL 400 // The energy estimation tolerance in Q8
-#define FAR_ENERGY_VAD_REGION 230 // Far VAD tolerance region
-// Stepsize parameters
-#define MU_MIN 10 // Min stepsize 2^-MU_MIN (far end energy dependent)
-#define MU_MAX 1 // Max stepsize 2^-MU_MAX (far end energy dependent)
-#define MU_DIFF 9 // MU_MIN - MU_MAX
-// Channel parameters
-#define MIN_MSE_COUNT 20 // Min number of consecutive blocks with enough far end
- // energy to compare channel estimates
-#define MIN_MSE_DIFF 29 // The ratio between adapted and stored channel to
- // accept a new storage (0.8 in Q-MSE_RESOLUTION)
-#define MSE_RESOLUTION 5 // MSE parameter resolution
-#define RESOLUTION_CHANNEL16 12 // W16 Channel in Q-RESOLUTION_CHANNEL16
-#define RESOLUTION_CHANNEL32 28 // W32 Channel in Q-RESOLUTION_CHANNEL
-#define CHANNEL_VAD 16 // Minimum energy in frequency band to update channel
-// Suppression gain parameters: SUPGAIN_ parameters in Q-(RESOLUTION_SUPGAIN)
-#define RESOLUTION_SUPGAIN 8 // Channel in Q-(RESOLUTION_SUPGAIN)
-#define SUPGAIN_DEFAULT (1 << RESOLUTION_SUPGAIN) // Default suppression gain
-#define SUPGAIN_ERROR_PARAM_A 3072 // Estimation error parameter (Maximum gain) (8 in Q8)
-#define SUPGAIN_ERROR_PARAM_B 1536 // Estimation error parameter (Gain before going down)
-#define SUPGAIN_ERROR_PARAM_D SUPGAIN_DEFAULT // Estimation error parameter
- // (Should be the same as Default) (1 in Q8)
-#define SUPGAIN_EPC_DT 200 // = SUPGAIN_ERROR_PARAM_C * ENERGY_DEV_TOL
-// Defines for "check delay estimation"
-#define CORR_WIDTH 31 // Number of samples to correlate over.
-#define CORR_MAX 16 // Maximum correlation offset
-#define CORR_MAX_BUF 63
-#define CORR_DEV 4
-#define CORR_MAX_LEVEL 20
-#define CORR_MAX_LOW 4
-#define CORR_BUF_LEN (CORR_MAX << 1) + 1
-// Note that CORR_WIDTH + 2*CORR_MAX <= MAX_BUF_LEN
-
-#define ONE_Q14 (1 << 14)
-
-// NLP defines
-#define NLP_COMP_LOW 3277 // 0.2 in Q14
-#define NLP_COMP_HIGH ONE_Q14 // 1 in Q14
-
-typedef struct
-{
- int farBufWritePos;
- int farBufReadPos;
- int knownDelay;
- int lastKnownDelay;
- int firstVAD; // Parameter to control poorly initialized channels
-
- void *farFrameBuf;
- void *nearNoisyFrameBuf;
- void *nearCleanFrameBuf;
- void *outFrameBuf;
-
- WebRtc_Word16 xBuf[PART_LEN2]; // farend
- WebRtc_Word16 dBufClean[PART_LEN2]; // nearend
- WebRtc_Word16 dBufNoisy[PART_LEN2]; // nearend
- WebRtc_Word16 outBuf[PART_LEN];
-
- WebRtc_Word16 farBuf[FAR_BUF_LEN];
-
- WebRtc_Word16 mult;
- WebRtc_UWord32 seed;
-
- // Delay estimation variables
- WebRtc_UWord16 medianYlogspec[PART_LEN1];
- WebRtc_UWord16 medianXlogspec[PART_LEN1];
- WebRtc_UWord16 medianBCount[MAX_DELAY];
- WebRtc_UWord16 xfaHistory[PART_LEN1][MAX_DELAY];
- WebRtc_Word16 delHistoryPos;
- WebRtc_UWord32 bxHistory[MAX_DELAY];
- WebRtc_UWord16 currentDelay;
- WebRtc_UWord16 previousDelay;
- WebRtc_Word16 delayAdjust;
-
- WebRtc_Word16 nlpFlag;
- WebRtc_Word16 fixedDelay;
-
- WebRtc_UWord32 totCount;
-
- WebRtc_Word16 xfaQDomainBuf[MAX_DELAY];
- WebRtc_Word16 dfaCleanQDomain;
- WebRtc_Word16 dfaCleanQDomainOld;
- WebRtc_Word16 dfaNoisyQDomain;
- WebRtc_Word16 dfaNoisyQDomainOld;
-
- WebRtc_Word16 nearLogEnergy[MAX_BUF_LEN];
- WebRtc_Word16 farLogEnergy[MAX_BUF_LEN];
- WebRtc_Word16 echoAdaptLogEnergy[MAX_BUF_LEN];
- WebRtc_Word16 echoStoredLogEnergy[MAX_BUF_LEN];
-
- WebRtc_Word16 channelAdapt16[PART_LEN1];
- WebRtc_Word32 channelAdapt32[PART_LEN1];
- WebRtc_Word16 channelStored[PART_LEN1];
- WebRtc_Word32 echoFilt[PART_LEN1];
- WebRtc_Word16 nearFilt[PART_LEN1];
- WebRtc_Word32 noiseEst[PART_LEN1];
- WebRtc_Word16 noiseEstQDomain[PART_LEN1];
- WebRtc_Word16 noiseEstCtr;
- WebRtc_Word16 cngMode;
-
- WebRtc_Word32 mseAdaptOld;
- WebRtc_Word32 mseStoredOld;
- WebRtc_Word32 mseThreshold;
-
- WebRtc_Word16 farEnergyMin;
- WebRtc_Word16 farEnergyMax;
- WebRtc_Word16 farEnergyMaxMin;
- WebRtc_Word16 farEnergyVAD;
- WebRtc_Word16 farEnergyMSE;
- WebRtc_Word16 currentVADValue;
- WebRtc_Word16 vadUpdateCount;
-
- WebRtc_Word16 delayHistogram[MAX_DELAY];
- WebRtc_Word16 delayVadCount;
- WebRtc_Word16 maxDelayHistIdx;
- WebRtc_Word16 lastMinPos;
-
- WebRtc_Word16 startupState;
- WebRtc_Word16 mseChannelCount;
- WebRtc_Word16 delayCount;
- WebRtc_Word16 newDelayCorrData;
- WebRtc_Word16 lastDelayUpdateCount;
- WebRtc_Word16 delayCorrelation[CORR_BUF_LEN];
- WebRtc_Word16 supGain;
- WebRtc_Word16 supGainOld;
- WebRtc_Word16 delayOffsetFlag;
-
- WebRtc_Word16 supGainErrParamA;
- WebRtc_Word16 supGainErrParamD;
- WebRtc_Word16 supGainErrParamDiffAB;
- WebRtc_Word16 supGainErrParamDiffBD;
-
- // TODO(bjornv): Will be removed after final version has been committed.
-#ifdef VAD_DATA
- FILE *vad_file;
- FILE *delay_file;
- FILE *far_file;
- FILE *far_cur_file;
- FILE *far_min_file;
- FILE *far_max_file;
- FILE *far_vad_file;
-#endif
-
- // TODO(bjornv): Will be removed after final version has been committed.
-#ifdef STORE_CHANNEL_DATA
- FILE *channel_file;
- FILE *channel_file_init;
-#endif
-
-#ifdef AEC_DEBUG
- FILE *farFile;
- FILE *nearFile;
- FILE *outFile;
-#endif
-} AecmCore_t;
-
-///////////////////////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_CreateCore(...)
-//
-// Allocates the memory needed by the AECM. The memory needs to be
-// initialized separately using the WebRtcAecm_InitCore() function.
-//
-// Input:
-// - aecm : Instance that should be created
-//
-// Output:
-// - aecm : Created instance
-//
-// Return value : 0 - Ok
-// -1 - Error
-//
-int WebRtcAecm_CreateCore(AecmCore_t **aecm);
-
-///////////////////////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_InitCore(...)
-//
-// This function initializes the AECM instant created with WebRtcAecm_CreateCore(...)
-// Input:
-// - aecm : Pointer to the AECM instance
-// - samplingFreq : Sampling Frequency
-//
-// Output:
-// - aecm : Initialized instance
-//
-// Return value : 0 - Ok
-// -1 - Error
-//
-int WebRtcAecm_InitCore(AecmCore_t * const aecm, int samplingFreq);
-
-///////////////////////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_FreeCore(...)
-//
-// This function releases the memory allocated by WebRtcAecm_CreateCore()
-// Input:
-// - aecm : Pointer to the AECM instance
-//
-// Return value : 0 - Ok
-// -1 - Error
-// 11001-11016: Error
-//
-int WebRtcAecm_FreeCore(AecmCore_t *aecm);
-
-int WebRtcAecm_Control(AecmCore_t *aecm, int delay, int nlpFlag, int delayOffsetFlag);
-
-///////////////////////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_ProcessFrame(...)
-//
-// 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
-//
-// Output:
-// - out : Out buffer, one frame of nearend signal :
-//
-//
-void WebRtcAecm_ProcessFrame(AecmCore_t * const aecm, const WebRtc_Word16 * const farend,
- const WebRtc_Word16 * const nearendNoisy,
- const WebRtc_Word16 * const nearendClean,
- WebRtc_Word16 * const out);
-
-///////////////////////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_ProcessBlock(...)
-//
-// This function is called for every block within one frame
-// This function is called by WebRtcAecm_ProcessFrame(...)
-//
-// 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
-//
-// Output:
-// - out : Out buffer, one block of nearend signal :
-//
-//
-void WebRtcAecm_ProcessBlock(AecmCore_t * const aecm, const WebRtc_Word16 * const farend,
- const WebRtc_Word16 * const nearendNoisy,
- const WebRtc_Word16 * const noisyClean,
- WebRtc_Word16 * const out);
-
-///////////////////////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_BufferFarFrame()
-//
-// Inserts a frame of data into farend buffer.
-//
-// Inputs:
-// - aecm : Pointer to the AECM instance
-// - 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,
- const int farLen);
-
-///////////////////////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_FetchFarFrame()
-//
-// Read the farend buffer to account for known delay
-//
-// Inputs:
-// - aecm : Pointer to the AECM instance
-// - farend : In buffer containing one frame of farend signal
-// - farLen : Length of frame
-// - knownDelay : known delay
-//
-void WebRtcAecm_FetchFarFrame(AecmCore_t * const aecm, WebRtc_Word16 * const farend,
- const int farLen, const int knownDelay);
-
-#endif
diff --git a/src/modules/audio_processing/aecm/main/source/echo_control_mobile.c b/src/modules/audio_processing/aecm/main/source/echo_control_mobile.c
deleted file mode 100644
index f9d84f0..0000000
--- a/src/modules/audio_processing/aecm/main/source/echo_control_mobile.c
+++ /dev/null
@@ -1,733 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <stdlib.h>
-//#include <string.h>
-
-#include "echo_control_mobile.h"
-#include "aecm_core.h"
-#include "ring_buffer.h"
-#ifdef AEC_DEBUG
-#include <stdio.h>
-#endif
-#ifdef MAC_IPHONE_PRINT
-#include <time.h>
-#include <stdio.h>
-#elif defined ARM_WINM_LOG
-#include "windows.h"
-extern HANDLE logFile;
-#endif
-
-#define BUF_SIZE_FRAMES 50 // buffer size (frames)
-// Maximum length of resampled signal. Must be an integer multiple of frames
-// (ceil(1/(1 + MIN_SKEW)*2) + 1)*FRAME_LEN
-// The factor of 2 handles wb, and the + 1 is as a safety margin
-#define MAX_RESAMP_LEN (5 * FRAME_LEN)
-
-static const int kBufSizeSamp = BUF_SIZE_FRAMES * FRAME_LEN; // buffer size (samples)
-static const int kSampMsNb = 8; // samples per ms in nb
-// Target suppression levels for nlp modes
-// log{0.001, 0.00001, 0.00000001}
-static const int kInitCheck = 42;
-
-typedef struct
-{
- int sampFreq;
- int scSampFreq;
- short bufSizeStart;
- int knownDelay;
-
- // Stores the last frame added to the farend buffer
- short farendOld[2][FRAME_LEN];
- short initFlag; // indicates if AEC has been initialized
-
- // Variables used for averaging far end buffer size
- short counter;
- short sum;
- short firstVal;
- short checkBufSizeCtr;
-
- // Variables used for delay shifts
- short msInSndCardBuf;
- short filtDelay;
- int timeForDelayChange;
- int ECstartup;
- int checkBuffSize;
- int delayChange;
- short lastDelayDiff;
-
- WebRtc_Word16 echoMode;
-
-#ifdef AEC_DEBUG
- FILE *bufFile;
- FILE *delayFile;
- FILE *preCompFile;
- FILE *postCompFile;
-#endif // AEC_DEBUG
- // Structures
- void *farendBuf;
-
- int lastError;
-
- AecmCore_t *aecmCore;
-} aecmob_t;
-
-// Estimates delay to set the position of the farend buffer read pointer
-// (controlled by knownDelay)
-static int WebRtcAecm_EstBufDelay(aecmob_t *aecmInst, short msInSndCardBuf);
-
-// Stuffs the farend buffer if the estimated delay is too large
-static int WebRtcAecm_DelayComp(aecmob_t *aecmInst);
-
-WebRtc_Word32 WebRtcAecm_Create(void **aecmInst)
-{
- aecmob_t *aecm;
- if (aecmInst == NULL)
- {
- return -1;
- }
-
- aecm = malloc(sizeof(aecmob_t));
- *aecmInst = aecm;
- if (aecm == NULL)
- {
- return -1;
- }
-
- if (WebRtcAecm_CreateCore(&aecm->aecmCore) == -1)
- {
- WebRtcAecm_Free(aecm);
- aecm = NULL;
- return -1;
- }
-
- if (WebRtcApm_CreateBuffer(&aecm->farendBuf, kBufSizeSamp) == -1)
- {
- WebRtcAecm_Free(aecm);
- aecm = NULL;
- return -1;
- }
-
- aecm->initFlag = 0;
- aecm->lastError = 0;
-
-#ifdef AEC_DEBUG
- aecm->aecmCore->farFile = fopen("aecFar.pcm","wb");
- aecm->aecmCore->nearFile = fopen("aecNear.pcm","wb");
- aecm->aecmCore->outFile = fopen("aecOut.pcm","wb");
- //aecm->aecmCore->outLpFile = fopen("aecOutLp.pcm","wb");
-
- aecm->bufFile = fopen("aecBuf.dat", "wb");
- aecm->delayFile = fopen("aecDelay.dat", "wb");
- aecm->preCompFile = fopen("preComp.pcm", "wb");
- aecm->postCompFile = fopen("postComp.pcm", "wb");
-#endif // AEC_DEBUG
- return 0;
-}
-
-WebRtc_Word32 WebRtcAecm_Free(void *aecmInst)
-{
- aecmob_t *aecm = aecmInst;
-
- if (aecm == NULL)
- {
- return -1;
- }
-
-#ifdef AEC_DEBUG
- fclose(aecm->aecmCore->farFile);
- fclose(aecm->aecmCore->nearFile);
- fclose(aecm->aecmCore->outFile);
- //fclose(aecm->aecmCore->outLpFile);
-
- fclose(aecm->bufFile);
- fclose(aecm->delayFile);
- fclose(aecm->preCompFile);
- fclose(aecm->postCompFile);
-#endif // AEC_DEBUG
- WebRtcAecm_FreeCore(aecm->aecmCore);
- WebRtcApm_FreeBuffer(aecm->farendBuf);
- free(aecm);
-
- return 0;
-}
-
-WebRtc_Word32 WebRtcAecm_Init(void *aecmInst, WebRtc_Word32 sampFreq, WebRtc_Word32 scSampFreq)
-{
- aecmob_t *aecm = aecmInst;
- AecmConfig aecConfig;
-
- if (aecm == NULL)
- {
- return -1;
- }
-
- if (sampFreq != 8000 && sampFreq != 16000)
- {
- aecm->lastError = AECM_BAD_PARAMETER_ERROR;
- return -1;
- }
- aecm->sampFreq = sampFreq;
-
- if (scSampFreq < 1 || scSampFreq > 96000)
- {
- aecm->lastError = AECM_BAD_PARAMETER_ERROR;
- return -1;
- }
- aecm->scSampFreq = scSampFreq;
-
- // Initialize AECM core
- if (WebRtcAecm_InitCore(aecm->aecmCore, aecm->sampFreq) == -1)
- {
- aecm->lastError = AECM_UNSPECIFIED_ERROR;
- return -1;
- }
-
- // Initialize farend buffer
- if (WebRtcApm_InitBuffer(aecm->farendBuf) == -1)
- {
- aecm->lastError = AECM_UNSPECIFIED_ERROR;
- return -1;
- }
-
- aecm->initFlag = kInitCheck; // indicates that initialization has been done
-
- aecm->delayChange = 1;
-
- aecm->sum = 0;
- aecm->counter = 0;
- aecm->checkBuffSize = 1;
- aecm->firstVal = 0;
-
- aecm->ECstartup = 1;
- aecm->bufSizeStart = 0;
- aecm->checkBufSizeCtr = 0;
- aecm->filtDelay = 0;
- aecm->timeForDelayChange = 0;
- aecm->knownDelay = 0;
- aecm->lastDelayDiff = 0;
-
- memset(&aecm->farendOld[0][0], 0, 160);
-
- // Default settings.
- aecConfig.cngMode = AecmTrue;
- aecConfig.echoMode = 3;
-
- if (WebRtcAecm_set_config(aecm, aecConfig) == -1)
- {
- aecm->lastError = AECM_UNSPECIFIED_ERROR;
- return -1;
- }
-
- return 0;
-}
-
-WebRtc_Word32 WebRtcAecm_BufferFarend(void *aecmInst, const WebRtc_Word16 *farend,
- WebRtc_Word16 nrOfSamples)
-{
- aecmob_t *aecm = aecmInst;
- WebRtc_Word32 retVal = 0;
-
- if (aecm == NULL)
- {
- return -1;
- }
-
- if (farend == NULL)
- {
- aecm->lastError = AECM_NULL_POINTER_ERROR;
- return -1;
- }
-
- if (aecm->initFlag != kInitCheck)
- {
- aecm->lastError = AECM_UNINITIALIZED_ERROR;
- return -1;
- }
-
- if (nrOfSamples != 80 && nrOfSamples != 160)
- {
- aecm->lastError = AECM_BAD_PARAMETER_ERROR;
- return -1;
- }
-
- // TODO: Is this really a good idea?
- if (!aecm->ECstartup)
- {
- WebRtcAecm_DelayComp(aecm);
- }
-
- WebRtcApm_WriteBuffer(aecm->farendBuf, farend, nrOfSamples);
-
- return retVal;
-}
-
-WebRtc_Word32 WebRtcAecm_Process(void *aecmInst, const WebRtc_Word16 *nearendNoisy,
- const WebRtc_Word16 *nearendClean, WebRtc_Word16 *out,
- WebRtc_Word16 nrOfSamples, WebRtc_Word16 msInSndCardBuf)
-{
- aecmob_t *aecm = aecmInst;
- WebRtc_Word32 retVal = 0;
- short i;
- short farend[FRAME_LEN];
- short nmbrOfFilledBuffers;
- short nBlocks10ms;
- short nFrames;
-#ifdef AEC_DEBUG
- short msInAECBuf;
-#endif
-
-#ifdef ARM_WINM_LOG
- __int64 freq, start, end, diff;
- unsigned int milliseconds;
- DWORD temp;
-#elif defined MAC_IPHONE_PRINT
- // double endtime = 0, starttime = 0;
- struct timeval starttime;
- struct timeval endtime;
- static long int timeused = 0;
- static int timecount = 0;
-#endif
-
- if (aecm == NULL)
- {
- return -1;
- }
-
- if (nearendNoisy == NULL)
- {
- aecm->lastError = AECM_NULL_POINTER_ERROR;
- return -1;
- }
-
- if (out == NULL)
- {
- aecm->lastError = AECM_NULL_POINTER_ERROR;
- return -1;
- }
-
- if (aecm->initFlag != kInitCheck)
- {
- aecm->lastError = AECM_UNINITIALIZED_ERROR;
- return -1;
- }
-
- if (nrOfSamples != 80 && nrOfSamples != 160)
- {
- aecm->lastError = AECM_BAD_PARAMETER_ERROR;
- return -1;
- }
-
- if (msInSndCardBuf < 0)
- {
- msInSndCardBuf = 0;
- aecm->lastError = AECM_BAD_PARAMETER_WARNING;
- retVal = -1;
- } else if (msInSndCardBuf > 500)
- {
- msInSndCardBuf = 500;
- aecm->lastError = AECM_BAD_PARAMETER_WARNING;
- retVal = -1;
- }
- msInSndCardBuf += 10;
- aecm->msInSndCardBuf = msInSndCardBuf;
-
- nFrames = nrOfSamples / FRAME_LEN;
- nBlocks10ms = nFrames / aecm->aecmCore->mult;
-
- if (aecm->ECstartup)
- {
- if (nearendClean == NULL)
- {
- memcpy(out, nearendNoisy, sizeof(short) * nrOfSamples);
- } else
- {
- memcpy(out, nearendClean, sizeof(short) * nrOfSamples);
- }
-
- nmbrOfFilledBuffers = WebRtcApm_get_buffer_size(aecm->farendBuf) / FRAME_LEN;
- // The AECM is in the start up mode
- // AECM is disabled until the soundcard buffer and farend buffers are OK
-
- // Mechanism to ensure that the soundcard buffer is reasonably stable.
- if (aecm->checkBuffSize)
- {
- aecm->checkBufSizeCtr++;
- // Before we fill up the far end buffer we require the amount of data on the
- // sound card to be stable (+/-8 ms) compared to the first value. This
- // comparison is made during the following 4 consecutive frames. If it seems
- // to be stable then we start to fill up the far end buffer.
-
- if (aecm->counter == 0)
- {
- aecm->firstVal = aecm->msInSndCardBuf;
- aecm->sum = 0;
- }
-
- if (abs(aecm->firstVal - aecm->msInSndCardBuf)
- < WEBRTC_SPL_MAX(0.2 * aecm->msInSndCardBuf, kSampMsNb))
- {
- aecm->sum += aecm->msInSndCardBuf;
- aecm->counter++;
- } else
- {
- aecm->counter = 0;
- }
-
- if (aecm->counter * nBlocks10ms >= 6)
- {
- // The farend buffer size is determined in blocks of 80 samples
- // Use 75% of the average value of the soundcard buffer
- aecm->bufSizeStart
- = WEBRTC_SPL_MIN((3 * aecm->sum
- * aecm->aecmCore->mult) / (aecm->counter * 40), BUF_SIZE_FRAMES);
- // buffersize has now been determined
- aecm->checkBuffSize = 0;
- }
-
- if (aecm->checkBufSizeCtr * nBlocks10ms > 50)
- {
- // for really bad sound cards, don't disable echocanceller for more than 0.5 sec
- aecm->bufSizeStart = WEBRTC_SPL_MIN((3 * aecm->msInSndCardBuf
- * aecm->aecmCore->mult) / 40, BUF_SIZE_FRAMES);
- aecm->checkBuffSize = 0;
- }
- }
-
- // if checkBuffSize changed in the if-statement above
- if (!aecm->checkBuffSize)
- {
- // soundcard buffer is now reasonably stable
- // When the far end buffer is filled with approximately the same amount of
- // data as the amount on the sound card we end the start up phase and start
- // to cancel echoes.
-
- if (nmbrOfFilledBuffers == aecm->bufSizeStart)
- {
- aecm->ECstartup = 0; // Enable the AECM
- } else if (nmbrOfFilledBuffers > aecm->bufSizeStart)
- {
- WebRtcApm_FlushBuffer(
- aecm->farendBuf,
- WebRtcApm_get_buffer_size(aecm->farendBuf)
- - aecm->bufSizeStart * FRAME_LEN);
- aecm->ECstartup = 0;
- }
- }
-
- } else
- {
- // AECM is enabled
-
- // Note only 1 block supported for nb and 2 blocks for wb
- for (i = 0; i < nFrames; i++)
- {
- nmbrOfFilledBuffers = WebRtcApm_get_buffer_size(aecm->farendBuf) / FRAME_LEN;
-
- // Check that there is data in the far end buffer
- if (nmbrOfFilledBuffers > 0)
- {
- // Get the next 80 samples from the farend buffer
- WebRtcApm_ReadBuffer(aecm->farendBuf, farend, FRAME_LEN);
-
- // Always store the last frame for use when we run out of data
- memcpy(&(aecm->farendOld[i][0]), farend, FRAME_LEN * sizeof(short));
- } else
- {
- // We have no data so we use the last played frame
- memcpy(farend, &(aecm->farendOld[i][0]), FRAME_LEN * sizeof(short));
- }
-
- // Call buffer delay estimator when all data is extracted,
- // i,e. i = 0 for NB and i = 1 for WB
- if ((i == 0 && aecm->sampFreq == 8000) || (i == 1 && aecm->sampFreq == 16000))
- {
- WebRtcAecm_EstBufDelay(aecm, aecm->msInSndCardBuf);
- }
-
-#ifdef ARM_WINM_LOG
- // measure tick start
- QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
- QueryPerformanceCounter((LARGE_INTEGER*)&start);
-#elif defined MAC_IPHONE_PRINT
- // starttime = clock()/(double)CLOCKS_PER_SEC;
- gettimeofday(&starttime, NULL);
-#endif
- // Call the AECM
- /*WebRtcAecm_ProcessFrame(aecm->aecmCore, farend, &nearend[FRAME_LEN * i],
- &out[FRAME_LEN * i], aecm->knownDelay);*/
- if (nearendClean == NULL)
- {
- WebRtcAecm_ProcessFrame(aecm->aecmCore, farend, &nearendNoisy[FRAME_LEN * i],
- NULL, &out[FRAME_LEN * i]);
- } else
- {
- WebRtcAecm_ProcessFrame(aecm->aecmCore, farend, &nearendNoisy[FRAME_LEN * i],
- &nearendClean[FRAME_LEN * i], &out[FRAME_LEN * i]);
- }
-
-#ifdef ARM_WINM_LOG
-
- // measure tick end
- QueryPerformanceCounter((LARGE_INTEGER*)&end);
-
- if(end > start)
- {
- diff = ((end - start) * 1000) / (freq/1000);
- milliseconds = (unsigned int)(diff & 0xffffffff);
- WriteFile (logFile, &milliseconds, sizeof(unsigned int), &temp, NULL);
- }
-#elif defined MAC_IPHONE_PRINT
- // endtime = clock()/(double)CLOCKS_PER_SEC;
- // printf("%f\n", endtime - starttime);
-
- gettimeofday(&endtime, NULL);
-
- if( endtime.tv_usec > starttime.tv_usec)
- {
- timeused += endtime.tv_usec - starttime.tv_usec;
- } else
- {
- timeused += endtime.tv_usec + 1000000 - starttime.tv_usec;
- }
-
- if(++timecount == 1000)
- {
- timecount = 0;
- printf("AEC: %ld\n", timeused);
- timeused = 0;
- }
-#endif
-
- }
- }
-
-#ifdef AEC_DEBUG
- msInAECBuf = WebRtcApm_get_buffer_size(aecm->farendBuf) / (kSampMsNb*aecm->aecmCore->mult);
- fwrite(&msInAECBuf, 2, 1, aecm->bufFile);
- fwrite(&(aecm->knownDelay), sizeof(aecm->knownDelay), 1, aecm->delayFile);
-#endif
-
- return retVal;
-}
-
-WebRtc_Word32 WebRtcAecm_set_config(void *aecmInst, AecmConfig config)
-{
- aecmob_t *aecm = aecmInst;
-
- if (aecm == NULL)
- {
- return -1;
- }
-
- if (aecm->initFlag != kInitCheck)
- {
- aecm->lastError = AECM_UNINITIALIZED_ERROR;
- return -1;
- }
-
- if (config.cngMode != AecmFalse && config.cngMode != AecmTrue)
- {
- aecm->lastError = AECM_BAD_PARAMETER_ERROR;
- return -1;
- }
- aecm->aecmCore->cngMode = config.cngMode;
-
- if (config.echoMode < 0 || config.echoMode > 4)
- {
- aecm->lastError = AECM_BAD_PARAMETER_ERROR;
- return -1;
- }
- aecm->echoMode = config.echoMode;
-
- if (aecm->echoMode == 0)
- {
- aecm->aecmCore->supGain = SUPGAIN_DEFAULT >> 3;
- aecm->aecmCore->supGainOld = SUPGAIN_DEFAULT >> 3;
- aecm->aecmCore->supGainErrParamA = SUPGAIN_ERROR_PARAM_A >> 3;
- aecm->aecmCore->supGainErrParamD = SUPGAIN_ERROR_PARAM_D >> 3;
- aecm->aecmCore->supGainErrParamDiffAB = (SUPGAIN_ERROR_PARAM_A >> 3)
- - (SUPGAIN_ERROR_PARAM_B >> 3);
- aecm->aecmCore->supGainErrParamDiffBD = (SUPGAIN_ERROR_PARAM_B >> 3)
- - (SUPGAIN_ERROR_PARAM_D >> 3);
- } else if (aecm->echoMode == 1)
- {
- aecm->aecmCore->supGain = SUPGAIN_DEFAULT >> 2;
- aecm->aecmCore->supGainOld = SUPGAIN_DEFAULT >> 2;
- aecm->aecmCore->supGainErrParamA = SUPGAIN_ERROR_PARAM_A >> 2;
- aecm->aecmCore->supGainErrParamD = SUPGAIN_ERROR_PARAM_D >> 2;
- aecm->aecmCore->supGainErrParamDiffAB = (SUPGAIN_ERROR_PARAM_A >> 2)
- - (SUPGAIN_ERROR_PARAM_B >> 2);
- aecm->aecmCore->supGainErrParamDiffBD = (SUPGAIN_ERROR_PARAM_B >> 2)
- - (SUPGAIN_ERROR_PARAM_D >> 2);
- } else if (aecm->echoMode == 2)
- {
- aecm->aecmCore->supGain = SUPGAIN_DEFAULT >> 1;
- aecm->aecmCore->supGainOld = SUPGAIN_DEFAULT >> 1;
- aecm->aecmCore->supGainErrParamA = SUPGAIN_ERROR_PARAM_A >> 1;
- aecm->aecmCore->supGainErrParamD = SUPGAIN_ERROR_PARAM_D >> 1;
- aecm->aecmCore->supGainErrParamDiffAB = (SUPGAIN_ERROR_PARAM_A >> 1)
- - (SUPGAIN_ERROR_PARAM_B >> 1);
- aecm->aecmCore->supGainErrParamDiffBD = (SUPGAIN_ERROR_PARAM_B >> 1)
- - (SUPGAIN_ERROR_PARAM_D >> 1);
- } else if (aecm->echoMode == 3)
- {
- aecm->aecmCore->supGain = SUPGAIN_DEFAULT;
- aecm->aecmCore->supGainOld = SUPGAIN_DEFAULT;
- aecm->aecmCore->supGainErrParamA = SUPGAIN_ERROR_PARAM_A;
- aecm->aecmCore->supGainErrParamD = SUPGAIN_ERROR_PARAM_D;
- aecm->aecmCore->supGainErrParamDiffAB = SUPGAIN_ERROR_PARAM_A - SUPGAIN_ERROR_PARAM_B;
- aecm->aecmCore->supGainErrParamDiffBD = SUPGAIN_ERROR_PARAM_B - SUPGAIN_ERROR_PARAM_D;
- } else if (aecm->echoMode == 4)
- {
- aecm->aecmCore->supGain = SUPGAIN_DEFAULT << 1;
- aecm->aecmCore->supGainOld = SUPGAIN_DEFAULT << 1;
- aecm->aecmCore->supGainErrParamA = SUPGAIN_ERROR_PARAM_A << 1;
- aecm->aecmCore->supGainErrParamD = SUPGAIN_ERROR_PARAM_D << 1;
- aecm->aecmCore->supGainErrParamDiffAB = (SUPGAIN_ERROR_PARAM_A << 1)
- - (SUPGAIN_ERROR_PARAM_B << 1);
- aecm->aecmCore->supGainErrParamDiffBD = (SUPGAIN_ERROR_PARAM_B << 1)
- - (SUPGAIN_ERROR_PARAM_D << 1);
- }
-
- return 0;
-}
-
-WebRtc_Word32 WebRtcAecm_get_config(void *aecmInst, AecmConfig *config)
-{
- aecmob_t *aecm = aecmInst;
-
- if (aecm == NULL)
- {
- return -1;
- }
-
- if (config == NULL)
- {
- aecm->lastError = AECM_NULL_POINTER_ERROR;
- return -1;
- }
-
- if (aecm->initFlag != kInitCheck)
- {
- aecm->lastError = AECM_UNINITIALIZED_ERROR;
- return -1;
- }
-
- config->cngMode = aecm->aecmCore->cngMode;
- config->echoMode = aecm->echoMode;
-
- return 0;
-}
-
-WebRtc_Word32 WebRtcAecm_get_version(WebRtc_Word8 *versionStr, WebRtc_Word16 len)
-{
- const char version[] = "AECM 1.2.0";
- const short versionLen = (short)strlen(version) + 1; // +1 for null-termination
-
- if (versionStr == NULL)
- {
- return -1;
- }
-
- if (versionLen > len)
- {
- return -1;
- }
-
- strncpy(versionStr, version, versionLen);
- return 0;
-}
-
-WebRtc_Word32 WebRtcAecm_get_error_code(void *aecmInst)
-{
- aecmob_t *aecm = aecmInst;
-
- if (aecm == NULL)
- {
- return -1;
- }
-
- return aecm->lastError;
-}
-
-static int WebRtcAecm_EstBufDelay(aecmob_t *aecm, short msInSndCardBuf)
-{
- short delayNew, nSampFar, nSampSndCard;
- short diff;
-
- nSampFar = WebRtcApm_get_buffer_size(aecm->farendBuf);
- nSampSndCard = msInSndCardBuf * kSampMsNb * aecm->aecmCore->mult;
-
- delayNew = nSampSndCard - nSampFar;
-
- if (delayNew < FRAME_LEN)
- {
- WebRtcApm_FlushBuffer(aecm->farendBuf, FRAME_LEN);
- delayNew += FRAME_LEN;
- }
-
- aecm->filtDelay = WEBRTC_SPL_MAX(0, (8 * aecm->filtDelay + 2 * delayNew) / 10);
-
- diff = aecm->filtDelay - aecm->knownDelay;
- if (diff > 224)
- {
- if (aecm->lastDelayDiff < 96)
- {
- aecm->timeForDelayChange = 0;
- } else
- {
- aecm->timeForDelayChange++;
- }
- } else if (diff < 96 && aecm->knownDelay > 0)
- {
- if (aecm->lastDelayDiff > 224)
- {
- aecm->timeForDelayChange = 0;
- } else
- {
- aecm->timeForDelayChange++;
- }
- } else
- {
- aecm->timeForDelayChange = 0;
- }
- aecm->lastDelayDiff = diff;
-
- if (aecm->timeForDelayChange > 25)
- {
- aecm->knownDelay = WEBRTC_SPL_MAX((int)aecm->filtDelay - 160, 0);
- }
- return 0;
-}
-
-static int WebRtcAecm_DelayComp(aecmob_t *aecm)
-{
- int nSampFar, nSampSndCard, delayNew, nSampAdd;
- const int maxStuffSamp = 10 * FRAME_LEN;
-
- nSampFar = WebRtcApm_get_buffer_size(aecm->farendBuf);
- nSampSndCard = aecm->msInSndCardBuf * kSampMsNb * aecm->aecmCore->mult;
- delayNew = nSampSndCard - nSampFar;
-
- if (delayNew > FAR_BUF_LEN - FRAME_LEN * aecm->aecmCore->mult)
- {
- // The difference of the buffer sizes is larger than the maximum
- // allowed known delay. Compensate by stuffing the buffer.
- nSampAdd = (int)(WEBRTC_SPL_MAX(((nSampSndCard >> 1) - nSampFar),
- FRAME_LEN));
- nSampAdd = WEBRTC_SPL_MIN(nSampAdd, maxStuffSamp);
-
- WebRtcApm_StuffBuffer(aecm->farendBuf, nSampAdd);
- aecm->delayChange = 1; // the delay needs to be updated
- }
-
- return 0;
-}
diff --git a/src/modules/audio_processing/agc/main/interface/gain_control.h b/src/modules/audio_processing/agc/main/interface/gain_control.h
deleted file mode 100644
index 2893331..0000000
--- a/src/modules/audio_processing/agc/main/interface/gain_control.h
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AGC_MAIN_INTERFACE_GAIN_CONTROL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC_MAIN_INTERFACE_GAIN_CONTROL_H_
-
-#include "typedefs.h"
-
-// Errors
-#define AGC_UNSPECIFIED_ERROR 18000
-#define AGC_UNSUPPORTED_FUNCTION_ERROR 18001
-#define AGC_UNINITIALIZED_ERROR 18002
-#define AGC_NULL_POINTER_ERROR 18003
-#define AGC_BAD_PARAMETER_ERROR 18004
-
-// Warnings
-#define AGC_BAD_PARAMETER_WARNING 18050
-
-enum
-{
- kAgcModeUnchanged,
- kAgcModeAdaptiveAnalog,
- kAgcModeAdaptiveDigital,
- kAgcModeFixedDigital
-};
-
-enum
-{
- kAgcFalse = 0,
- kAgcTrue
-};
-
-typedef struct
-{
- WebRtc_Word16 targetLevelDbfs; // default 3 (-3 dBOv)
- WebRtc_Word16 compressionGaindB; // default 9 dB
- WebRtc_UWord8 limiterEnable; // default kAgcTrue (on)
-} WebRtcAgc_config_t;
-
-#if defined(__cplusplus)
-extern "C"
-{
-#endif
-
-/*
- * This function processes a 10/20ms frame of far-end speech to determine
- * if there is active speech. Far-end speech length can be either 10ms or
- * 20ms. The length of the input speech vector must be given in samples
- * (80/160 when FS=8000, and 160/320 when FS=16000 or FS=32000).
- *
- * Input:
- * - agcInst : AGC instance.
- * - inFar : Far-end input speech vector (10 or 20ms)
- * - samples : Number of samples in input vector
- *
- * Return value:
- * : 0 - Normal operation.
- * : -1 - Error
- */
-int WebRtcAgc_AddFarend(void* agcInst,
- const WebRtc_Word16* inFar,
- WebRtc_Word16 samples);
-
-/*
- * This function processes a 10/20ms frame of microphone speech to determine
- * if there is active speech. Microphone speech length can be either 10ms or
- * 20ms. The length of the input speech vector must be given in samples
- * (80/160 when FS=8000, and 160/320 when FS=16000 or FS=32000). For very low
- * input levels, the input signal is increased in level by multiplying and
- * overwriting the samples in inMic[].
- *
- * This function should be called before any further processing of the
- * near-end microphone signal.
- *
- * Input:
- * - agcInst : AGC instance.
- * - inMic : Microphone input speech vector (10 or 20 ms) for
- * L band
- * - inMic_H : Microphone input speech vector (10 or 20 ms) for
- * H band
- * - samples : Number of samples in input vector
- *
- * Return value:
- * : 0 - Normal operation.
- * : -1 - Error
- */
-int WebRtcAgc_AddMic(void* agcInst,
- WebRtc_Word16* inMic,
- WebRtc_Word16* inMic_H,
- WebRtc_Word16 samples);
-
-/*
- * This function replaces the analog microphone with a virtual one.
- * It is a digital gain applied to the input signal and is used in the
- * agcAdaptiveDigital mode where no microphone level is adjustable.
- * Microphone speech length can be either 10ms or 20ms. The length of the
- * input speech vector must be given in samples (80/160 when FS=8000, and
- * 160/320 when FS=16000 or FS=32000).
- *
- * Input:
- * - agcInst : AGC instance.
- * - inMic : Microphone input speech vector for (10 or 20 ms)
- * L band
- * - inMic_H : Microphone input speech vector for (10 or 20 ms)
- * H band
- * - samples : Number of samples in input vector
- * - micLevelIn : Input level of microphone (static)
- *
- * Output:
- * - inMic : Microphone output after processing (L band)
- * - inMic_H : Microphone output after processing (H band)
- * - micLevelOut : Adjusted microphone level after processing
- *
- * Return value:
- * : 0 - Normal operation.
- * : -1 - Error
- */
-int WebRtcAgc_VirtualMic(void* agcInst,
- WebRtc_Word16* inMic,
- WebRtc_Word16* inMic_H,
- WebRtc_Word16 samples,
- WebRtc_Word32 micLevelIn,
- WebRtc_Word32* micLevelOut);
-
-/*
- * This function processes a 10/20ms frame and adjusts (normalizes) the gain
- * both analog and digitally. The gain adjustments are done only during
- * active periods of speech. The input speech length can be either 10ms or
- * 20ms and the output is of the same length. The length of the speech
- * vectors must be given in samples (80/160 when FS=8000, and 160/320 when
- * FS=16000 or FS=32000). The echo parameter can be used to ensure the AGC will
- * not adjust upward in the presence of echo.
- *
- * This function should be called after processing the near-end microphone
- * signal, in any case after any echo cancellation.
- *
- * Input:
- * - agcInst : AGC instance
- * - inNear : Near-end input speech vector (10 or 20 ms) for
- * L band
- * - inNear_H : Near-end input speech vector (10 or 20 ms) for
- * H band
- * - samples : Number of samples in input/output vector
- * - inMicLevel : Current microphone volume level
- * - echo : Set to 0 if the signal passed to add_mic is
- * almost certainly free of echo; otherwise set
- * to 1. If you have no information regarding echo
- * set to 0.
- *
- * Output:
- * - outMicLevel : Adjusted microphone volume level
- * - out : Gain-adjusted near-end speech vector (L band)
- * : May be the same vector as the input.
- * - out_H : Gain-adjusted near-end speech vector (H band)
- * - saturationWarning : A returned value of 1 indicates a saturation event
- * has occurred and the volume cannot be further
- * reduced. Otherwise will be set to 0.
- *
- * Return value:
- * : 0 - Normal operation.
- * : -1 - Error
- */
-int WebRtcAgc_Process(void* agcInst,
- const WebRtc_Word16* inNear,
- const WebRtc_Word16* inNear_H,
- WebRtc_Word16 samples,
- WebRtc_Word16* out,
- WebRtc_Word16* out_H,
- WebRtc_Word32 inMicLevel,
- WebRtc_Word32* outMicLevel,
- WebRtc_Word16 echo,
- WebRtc_UWord8* saturationWarning);
-
-/*
- * This function sets the config parameters (targetLevelDbfs,
- * compressionGaindB and limiterEnable).
- *
- * Input:
- * - agcInst : AGC instance
- * - config : config struct
- *
- * Output:
- *
- * Return value:
- * : 0 - Normal operation.
- * : -1 - Error
- */
-int WebRtcAgc_set_config(void* agcInst, WebRtcAgc_config_t config);
-
-/*
- * This function returns the config parameters (targetLevelDbfs,
- * compressionGaindB and limiterEnable).
- *
- * Input:
- * - agcInst : AGC instance
- *
- * Output:
- * - config : config struct
- *
- * Return value:
- * : 0 - Normal operation.
- * : -1 - Error
- */
-int WebRtcAgc_get_config(void* agcInst, WebRtcAgc_config_t* config);
-
-/*
- * This function creates an AGC instance, which will contain the state
- * information for one (duplex) channel.
- *
- * Return value : AGC instance if successful
- * : 0 (i.e., a NULL pointer) if unsuccessful
- */
-int WebRtcAgc_Create(void **agcInst);
-
-/*
- * This function frees the AGC instance created at the beginning.
- *
- * Input:
- * - agcInst : AGC instance.
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-int WebRtcAgc_Free(void *agcInst);
-
-/*
- * This function initializes an AGC instance.
- *
- * Input:
- * - agcInst : AGC instance.
- * - minLevel : Minimum possible mic level
- * - maxLevel : Maximum possible mic level
- * - agcMode : 0 - Unchanged
- * : 1 - Adaptive Analog Automatic Gain Control -3dBOv
- * : 2 - Adaptive Digital Automatic Gain Control -3dBOv
- * : 3 - Fixed Digital Gain 0dB
- * - fs : Sampling frequency
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-int WebRtcAgc_Init(void *agcInst,
- WebRtc_Word32 minLevel,
- WebRtc_Word32 maxLevel,
- WebRtc_Word16 agcMode,
- WebRtc_UWord32 fs);
-
-/*
- * This function returns a text string containing the version.
- *
- * Input:
- * - length : Length of the char array pointed to by version
- * Output:
- * - version : Pointer to a char array of to which the version
- * : string will be copied.
- *
- * Return value : 0 - OK
- * -1 - Error
- */
-int WebRtcAgc_Version(WebRtc_Word8 *versionStr, WebRtc_Word16 length);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_AGC_MAIN_INTERFACE_GAIN_CONTROL_H_
diff --git a/src/modules/audio_processing/agc/main/matlab/getGains.m b/src/modules/audio_processing/agc/main/matlab/getGains.m
deleted file mode 100644
index e0234b8..0000000
--- a/src/modules/audio_processing/agc/main/matlab/getGains.m
+++ /dev/null
@@ -1,32 +0,0 @@
-% Outputs a file for testing purposes.
-%
-% Adjust the following parameters to suit. Their purpose becomes more clear on
-% viewing the gain plots.
-% MaxGain: Max gain in dB
-% MinGain: Min gain at overload (0 dBov) in dB
-% CompRatio: Compression ratio, essentially determines the slope of the gain
-% function between the max and min gains
-% Knee: The smoothness of the transition to max gain (smaller is smoother)
-MaxGain = 5; MinGain = 0; CompRatio = 3; Knee = 1;
-
-% Compute gains
-zeros = 0:31; lvl = 2.^(1-zeros);
-A = -10*log10(lvl) * (CompRatio - 1) / CompRatio;
-B = MaxGain - MinGain;
-gains = round(2^16*10.^(0.05 * (MinGain + B * ( log(exp(-Knee*A)+exp(-Knee*B)) - log(1+exp(-Knee*B)) ) / log(1/(1+exp(Knee*B))))));
-fprintf(1, '\t%i, %i, %i, %i,\n', gains);
-
-% Save gains to file
-fid = fopen('gains', 'wb');
-if fid == -1
- error(sprintf('Unable to open file %s', filename));
- return
-end
-fwrite(fid, gains, 'int32');
-fclose(fid);
-
-% Plotting
-in = 10*log10(lvl); out = 20*log10(gains/65536);
-subplot(121); plot(in, out); axis([-60, 0, -5, 30]); grid on; xlabel('Input (dB)'); ylabel('Gain (dB)');
-subplot(122); plot(in, in+out); axis([-60, 0, -60, 10]); grid on; xlabel('Input (dB)'); ylabel('Output (dB)');
-zoom on;
diff --git a/src/modules/audio_processing/agc/main/source/Android.mk b/src/modules/audio_processing/agc/main/source/Android.mk
deleted file mode 100644
index 2fd97bd..0000000
--- a/src/modules/audio_processing/agc/main/source/Android.mk
+++ /dev/null
@@ -1,46 +0,0 @@
-# This file is generated by gyp; do not edit. This means you!
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_ARM_MODE := arm
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_MODULE := libwebrtc_agc
-LOCAL_MODULE_TAGS := optional
-LOCAL_GENERATED_SOURCES :=
-LOCAL_SRC_FILES := analog_agc.c \
- digital_agc.c
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS :=
-MY_CFLAGS_C :=
-MY_DEFS := '-DNO_TCMALLOC' \
- '-DNO_HEAPCHECKER' \
- '-DWEBRTC_TARGET_PC' \
- '-DWEBRTC_LINUX' \
- '-DWEBRTC_THREAD_RR' \
- '-DWEBRTC_ANDROID' \
- '-DANDROID'
-LOCAL_CFLAGS := $(MY_CFLAGS_C) $(MY_CFLAGS) $(MY_DEFS)
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../../.. \
- $(LOCAL_PATH)/../interface \
- $(LOCAL_PATH)/../../../../../common_audio/signal_processing_library/main/interface
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS :=
-LOCAL_LDFLAGS :=
-
-LOCAL_STATIC_LIBRARIES :=
-# Duplicate the static libraries to fix circular references
-LOCAL_STATIC_LIBRARIES += $(LOCAL_STATIC_LIBRARIES)
-
-LOCAL_SHARED_LIBRARIES := libcutils \
- libdl \
- libstlport
-LOCAL_ADDITIONAL_DEPENDENCIES :=
-
-include external/stlport/libstlport.mk
-include $(BUILD_STATIC_LIBRARY)
diff --git a/src/modules/audio_processing/agc/main/source/agc.gyp b/src/modules/audio_processing/agc/main/source/agc.gyp
deleted file mode 100644
index e28a4c8..0000000
--- a/src/modules/audio_processing/agc/main/source/agc.gyp
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-{
- 'includes': [
- '../../../../../common_settings.gypi', # Common settings
- ],
- 'targets': [
- {
- 'target_name': 'agc',
- 'type': '<(library)',
- 'dependencies': [
- '../../../../../common_audio/signal_processing_library/main/source/spl.gyp:spl',
- ],
- 'include_dirs': [
- '../interface',
- ],
- 'direct_dependent_settings': {
- 'include_dirs': [
- '../interface',
- ],
- },
- 'sources': [
- '../interface/gain_control.h',
- 'analog_agc.c',
- 'analog_agc.h',
- 'digital_agc.c',
- 'digital_agc.h',
- ],
- },
- ],
-}
-
-# Local Variables:
-# tab-width:2
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/src/modules/audio_processing/agc/main/source/analog_agc.c b/src/modules/audio_processing/agc/main/source/analog_agc.c
deleted file mode 100644
index dfb7adc..0000000
--- a/src/modules/audio_processing/agc/main/source/analog_agc.c
+++ /dev/null
@@ -1,1700 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-/* analog_agc.c
- *
- * Using a feedback system, determines an appropriate analog volume level
- * given an input signal and current volume level. Targets a conservative
- * signal level and is intended for use with a digital AGC to apply
- * additional gain.
- *
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#ifdef AGC_DEBUG //test log
-#include <stdio.h>
-#endif
-#include "analog_agc.h"
-
-/* The slope of in Q13*/
-static const WebRtc_Word16 kSlope1[8] = {21793, 12517, 7189, 4129, 2372, 1362, 472, 78};
-
-/* The offset in Q14 */
-static const WebRtc_Word16 kOffset1[8] = {25395, 23911, 22206, 20737, 19612, 18805, 17951,
- 17367};
-
-/* The slope of in Q13*/
-static const WebRtc_Word16 kSlope2[8] = {2063, 1731, 1452, 1218, 1021, 857, 597, 337};
-
-/* The offset in Q14 */
-static const WebRtc_Word16 kOffset2[8] = {18432, 18379, 18290, 18177, 18052, 17920, 17670,
- 17286};
-
-static const WebRtc_Word16 kMuteGuardTimeMs = 8000;
-static const WebRtc_Word16 kInitCheck = 42;
-
-/* Default settings if config is not used */
-#define AGC_DEFAULT_TARGET_LEVEL 3
-#define AGC_DEFAULT_COMP_GAIN 9
-/* This is the target level for the analog part in ENV scale. To convert to RMS scale you
- * have to add OFFSET_ENV_TO_RMS.
- */
-#define ANALOG_TARGET_LEVEL 11
-#define ANALOG_TARGET_LEVEL_2 5 // ANALOG_TARGET_LEVEL / 2
-/* Offset between RMS scale (analog part) and ENV scale (digital part). This value actually
- * varies with the FIXED_ANALOG_TARGET_LEVEL, hence we should in the future replace it with
- * a table.
- */
-#define OFFSET_ENV_TO_RMS 9
-/* The reference input level at which the digital part gives an output of targetLevelDbfs
- * (desired level) if we have no compression gain. This level should be set high enough not
- * to compress the peaks due to the dynamics.
- */
-#define DIGITAL_REF_AT_0_COMP_GAIN 4
-/* Speed of reference level decrease.
- */
-#define DIFF_REF_TO_ANALOG 5
-
-#ifdef MIC_LEVEL_FEEDBACK
-#define NUM_BLOCKS_IN_SAT_BEFORE_CHANGE_TARGET 7
-#endif
-/* Size of analog gain table */
-#define GAIN_TBL_LEN 32
-/* Matlab code:
- * fprintf(1, '\t%i, %i, %i, %i,\n', round(10.^(linspace(0,10,32)/20) * 2^12));
- */
-/* Q12 */
-static const WebRtc_UWord16 kGainTableAnalog[GAIN_TBL_LEN] = {4096, 4251, 4412, 4579, 4752,
- 4932, 5118, 5312, 5513, 5722, 5938, 6163, 6396, 6638, 6889, 7150, 7420, 7701, 7992,
- 8295, 8609, 8934, 9273, 9623, 9987, 10365, 10758, 11165, 11587, 12025, 12480, 12953};
-
-/* Gain/Suppression tables for virtual Mic (in Q10) */
-static const WebRtc_UWord16 kGainTableVirtualMic[128] = {1052, 1081, 1110, 1141, 1172, 1204,
- 1237, 1271, 1305, 1341, 1378, 1416, 1454, 1494, 1535, 1577, 1620, 1664, 1710, 1757,
- 1805, 1854, 1905, 1957, 2010, 2065, 2122, 2180, 2239, 2301, 2364, 2428, 2495, 2563,
- 2633, 2705, 2779, 2855, 2933, 3013, 3096, 3180, 3267, 3357, 3449, 3543, 3640, 3739,
- 3842, 3947, 4055, 4166, 4280, 4397, 4517, 4640, 4767, 4898, 5032, 5169, 5311, 5456,
- 5605, 5758, 5916, 6078, 6244, 6415, 6590, 6770, 6956, 7146, 7341, 7542, 7748, 7960,
- 8178, 8402, 8631, 8867, 9110, 9359, 9615, 9878, 10148, 10426, 10711, 11004, 11305,
- 11614, 11932, 12258, 12593, 12938, 13292, 13655, 14029, 14412, 14807, 15212, 15628,
- 16055, 16494, 16945, 17409, 17885, 18374, 18877, 19393, 19923, 20468, 21028, 21603,
- 22194, 22801, 23425, 24065, 24724, 25400, 26095, 26808, 27541, 28295, 29069, 29864,
- 30681, 31520, 32382};
-static const WebRtc_UWord16 kSuppressionTableVirtualMic[128] = {1024, 1006, 988, 970, 952,
- 935, 918, 902, 886, 870, 854, 839, 824, 809, 794, 780, 766, 752, 739, 726, 713, 700,
- 687, 675, 663, 651, 639, 628, 616, 605, 594, 584, 573, 563, 553, 543, 533, 524, 514,
- 505, 496, 487, 478, 470, 461, 453, 445, 437, 429, 421, 414, 406, 399, 392, 385, 378,
- 371, 364, 358, 351, 345, 339, 333, 327, 321, 315, 309, 304, 298, 293, 288, 283, 278,
- 273, 268, 263, 258, 254, 249, 244, 240, 236, 232, 227, 223, 219, 215, 211, 208, 204,
- 200, 197, 193, 190, 186, 183, 180, 176, 173, 170, 167, 164, 161, 158, 155, 153, 150,
- 147, 145, 142, 139, 137, 134, 132, 130, 127, 125, 123, 121, 118, 116, 114, 112, 110,
- 108, 106, 104, 102};
-
-/* Table for target energy levels. Values in Q(-7)
- * Matlab code
- * targetLevelTable = fprintf('%d,\t%d,\t%d,\t%d,\n', round((32767*10.^(-(0:63)'/20)).^2*16/2^7) */
-
-static const WebRtc_Word32 kTargetLevelTable[64] = {134209536, 106606424, 84680493, 67264106,
- 53429779, 42440782, 33711911, 26778323, 21270778, 16895980, 13420954, 10660642,
- 8468049, 6726411, 5342978, 4244078, 3371191, 2677832, 2127078, 1689598, 1342095,
- 1066064, 846805, 672641, 534298, 424408, 337119, 267783, 212708, 168960, 134210,
- 106606, 84680, 67264, 53430, 42441, 33712, 26778, 21271, 16896, 13421, 10661, 8468,
- 6726, 5343, 4244, 3371, 2678, 2127, 1690, 1342, 1066, 847, 673, 534, 424, 337, 268,
- 213, 169, 134, 107, 85, 67};
-
-int WebRtcAgc_AddMic(void *state, WebRtc_Word16 *in_mic, WebRtc_Word16 *in_mic_H,
- WebRtc_Word16 samples)
-{
- WebRtc_Word32 nrg, max_nrg, sample, tmp32;
- WebRtc_Word32 *ptr;
- WebRtc_UWord16 targetGainIdx, gain;
- WebRtc_Word16 i, n, L, M, subFrames, tmp16, tmp_speech[16];
- Agc_t *stt;
- stt = (Agc_t *)state;
-
- //default/initial values corresponding to 10ms for wb and swb
- M = 10;
- L = 16;
- subFrames = 160;
-
- if (stt->fs == 8000)
- {
- if (samples == 80)
- {
- subFrames = 80;
- M = 10;
- L = 8;
- } else if (samples == 160)
- {
- subFrames = 80;
- M = 20;
- L = 8;
- } else
- {
-#ifdef AGC_DEBUG //test log
- fprintf(stt->fpt,
- "AGC->add_mic, frame %d: Invalid number of samples\n\n",
- (stt->fcount + 1));
-#endif
- return -1;
- }
- } else if (stt->fs == 16000)
- {
- if (samples == 160)
- {
- subFrames = 160;
- M = 10;
- L = 16;
- } else if (samples == 320)
- {
- subFrames = 160;
- M = 20;
- L = 16;
- } else
- {
-#ifdef AGC_DEBUG //test log
- fprintf(stt->fpt,
- "AGC->add_mic, frame %d: Invalid number of samples\n\n",
- (stt->fcount + 1));
-#endif
- return -1;
- }
- } else if (stt->fs == 32000)
- {
- /* SWB is processed as 160 sample for L and H bands */
- if (samples == 160)
- {
- subFrames = 160;
- M = 10;
- L = 16;
- } else
- {
-#ifdef AGC_DEBUG
- fprintf(stt->fpt,
- "AGC->add_mic, frame %d: Invalid sample rate\n\n",
- (stt->fcount + 1));
-#endif
- return -1;
- }
- }
-
- /* Check for valid pointers based on sampling rate */
- if ((stt->fs == 32000) && (in_mic_H == NULL))
- {
- return -1;
- }
- /* Check for valid pointer for low band */
- if (in_mic == NULL)
- {
- return -1;
- }
-
- /* apply slowly varying digital gain */
- if (stt->micVol > stt->maxAnalog)
- {
- /* Q1 */
- tmp16 = (WebRtc_Word16)(stt->micVol - stt->maxAnalog);
- tmp32 = WEBRTC_SPL_MUL_16_16(GAIN_TBL_LEN - 1, tmp16);
- tmp16 = (WebRtc_Word16)(stt->maxLevel - stt->maxAnalog);
- targetGainIdx = (WebRtc_UWord16)WEBRTC_SPL_DIV(tmp32, tmp16);
- assert(targetGainIdx < GAIN_TBL_LEN);
-
- /* Increment through the table towards the target gain.
- * If micVol drops below maxAnalog, we allow the gain
- * to be dropped immediately. */
- if (stt->gainTableIdx < targetGainIdx)
- {
- stt->gainTableIdx++;
- } else if (stt->gainTableIdx > targetGainIdx)
- {
- stt->gainTableIdx--;
- }
-
- /* Q12 */
- gain = kGainTableAnalog[stt->gainTableIdx];
-
- for (i = 0; i < samples; i++)
- {
- // For lower band
- tmp32 = WEBRTC_SPL_MUL_16_U16(in_mic[i], gain);
- sample = WEBRTC_SPL_RSHIFT_W32(tmp32, 12);
- if (sample > 32767)
- {
- in_mic[i] = 32767;
- } else if (sample < -32768)
- {
- in_mic[i] = -32768;
- } else
- {
- in_mic[i] = (WebRtc_Word16)sample;
- }
-
- // For higher band
- if (stt->fs == 32000)
- {
- tmp32 = WEBRTC_SPL_MUL_16_U16(in_mic_H[i], gain);
- sample = WEBRTC_SPL_RSHIFT_W32(tmp32, 12);
- if (sample > 32767)
- {
- in_mic_H[i] = 32767;
- } else if (sample < -32768)
- {
- in_mic_H[i] = -32768;
- } else
- {
- in_mic_H[i] = (WebRtc_Word16)sample;
- }
- }
- }
- } else
- {
- stt->gainTableIdx = 0;
- }
-
- /* compute envelope */
- if ((M == 10) && (stt->inQueue > 0))
- {
- ptr = stt->env[1];
- } else
- {
- ptr = stt->env[0];
- }
-
- for (i = 0; i < M; i++)
- {
- /* iterate over samples */
- max_nrg = 0;
- for (n = 0; n < L; n++)
- {
- nrg = WEBRTC_SPL_MUL_16_16(in_mic[i * L + n], in_mic[i * L + n]);
- if (nrg > max_nrg)
- {
- max_nrg = nrg;
- }
- }
- ptr[i] = max_nrg;
- }
-
- /* compute energy */
- if ((M == 10) && (stt->inQueue > 0))
- {
- ptr = stt->Rxx16w32_array[1];
- } else
- {
- ptr = stt->Rxx16w32_array[0];
- }
-
- for (i = 0; i < WEBRTC_SPL_RSHIFT_W16(M, 1); i++)
- {
- if (stt->fs == 16000)
- {
- WebRtcSpl_DownsampleBy2(&in_mic[i * 32], 32, tmp_speech, stt->filterState);
- } else
- {
- memcpy(tmp_speech, &in_mic[i * 16], 16 * sizeof(short));
- }
- /* Compute energy in blocks of 16 samples */
- ptr[i] = WebRtcSpl_DotProductWithScale(tmp_speech, tmp_speech, 16, 4);
- }
-
- /* update queue information */
- if ((stt->inQueue == 0) && (M == 10))
- {
- stt->inQueue = 1;
- } else
- {
- stt->inQueue = 2;
- }
-
- /* call VAD (use low band only) */
- for (i = 0; i < samples; i += subFrames)
- {
- WebRtcAgc_ProcessVad(&stt->vadMic, &in_mic[i], subFrames);
- }
-
- return 0;
-}
-
-int WebRtcAgc_AddFarend(void *state, const WebRtc_Word16 *in_far, WebRtc_Word16 samples)
-{
- WebRtc_Word32 errHandle = 0;
- WebRtc_Word16 i, subFrames;
- Agc_t *stt;
- stt = (Agc_t *)state;
-
- if (stt == NULL)
- {
- return -1;
- }
-
- if (stt->fs == 8000)
- {
- if ((samples != 80) && (samples != 160))
- {
-#ifdef AGC_DEBUG //test log
- fprintf(stt->fpt,
- "AGC->add_far_end, frame %d: Invalid number of samples\n\n",
- stt->fcount);
-#endif
- return -1;
- }
- subFrames = 80;
- } else if (stt->fs == 16000)
- {
- if ((samples != 160) && (samples != 320))
- {
-#ifdef AGC_DEBUG //test log
- fprintf(stt->fpt,
- "AGC->add_far_end, frame %d: Invalid number of samples\n\n",
- stt->fcount);
-#endif
- return -1;
- }
- subFrames = 160;
- } else if (stt->fs == 32000)
- {
- if ((samples != 160) && (samples != 320))
- {
-#ifdef AGC_DEBUG //test log
- fprintf(stt->fpt,
- "AGC->add_far_end, frame %d: Invalid number of samples\n\n",
- stt->fcount);
-#endif
- return -1;
- }
- subFrames = 160;
- } else
- {
-#ifdef AGC_DEBUG //test log
- fprintf(stt->fpt,
- "AGC->add_far_end, frame %d: Invalid sample rate\n\n",
- stt->fcount + 1);
-#endif
- return -1;
- }
-
- for (i = 0; i < samples; i += subFrames)
- {
- errHandle += WebRtcAgc_AddFarendToDigital(&stt->digitalAgc, &in_far[i], subFrames);
- }
-
- return errHandle;
-}
-
-int WebRtcAgc_VirtualMic(void *agcInst, WebRtc_Word16 *in_near, WebRtc_Word16 *in_near_H,
- WebRtc_Word16 samples, WebRtc_Word32 micLevelIn,
- WebRtc_Word32 *micLevelOut)
-{
- WebRtc_Word32 tmpFlt, micLevelTmp, gainIdx;
- WebRtc_UWord16 gain;
- WebRtc_Word16 ii;
- Agc_t *stt;
-
- WebRtc_UWord32 nrg;
- WebRtc_Word16 sampleCntr;
- WebRtc_UWord32 frameNrg = 0;
- WebRtc_UWord32 frameNrgLimit = 5500;
- WebRtc_Word16 numZeroCrossing = 0;
- const WebRtc_Word16 kZeroCrossingLowLim = 15;
- const WebRtc_Word16 kZeroCrossingHighLim = 20;
-
- stt = (Agc_t *)agcInst;
-
- /*
- * Before applying gain decide if this is a low-level signal.
- * The idea is that digital AGC will not adapt to low-level
- * signals.
- */
- if (stt->fs != 8000)
- {
- frameNrgLimit = frameNrgLimit << 1;
- }
-
- frameNrg = WEBRTC_SPL_MUL_16_16(in_near[0], in_near[0]);
- for (sampleCntr = 1; sampleCntr < samples; sampleCntr++)
- {
-
- // increment frame energy if it is less than the limit
- // the correct value of the energy is not important
- if (frameNrg < frameNrgLimit)
- {
- nrg = WEBRTC_SPL_MUL_16_16(in_near[sampleCntr], in_near[sampleCntr]);
- frameNrg += nrg;
- }
-
- // Count the zero crossings
- numZeroCrossing += ((in_near[sampleCntr] ^ in_near[sampleCntr - 1]) < 0);
- }
-
- if ((frameNrg < 500) || (numZeroCrossing <= 5))
- {
- stt->lowLevelSignal = 1;
- } else if (numZeroCrossing <= kZeroCrossingLowLim)
- {
- stt->lowLevelSignal = 0;
- } else if (frameNrg <= frameNrgLimit)
- {
- stt->lowLevelSignal = 1;
- } else if (numZeroCrossing >= kZeroCrossingHighLim)
- {
- stt->lowLevelSignal = 1;
- } else
- {
- stt->lowLevelSignal = 0;
- }
-
- micLevelTmp = WEBRTC_SPL_LSHIFT_W32(micLevelIn, stt->scale);
- /* Set desired level */
- gainIdx = stt->micVol;
- if (stt->micVol > stt->maxAnalog)
- {
- gainIdx = stt->maxAnalog;
- }
- if (micLevelTmp != stt->micRef)
- {
- /* Something has happened with the physical level, restart. */
- stt->micRef = micLevelTmp;
- stt->micVol = 127;
- *micLevelOut = 127;
- stt->micGainIdx = 127;
- gainIdx = 127;
- }
- /* Pre-process the signal to emulate the microphone level. */
- /* Take one step at a time in the gain table. */
- if (gainIdx > 127)
- {
- gain = kGainTableVirtualMic[gainIdx - 128];
- } else
- {
- gain = kSuppressionTableVirtualMic[127 - gainIdx];
- }
- for (ii = 0; ii < samples; ii++)
- {
- tmpFlt = WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL_16_U16(in_near[ii], gain), 10);
- if (tmpFlt > 32767)
- {
- tmpFlt = 32767;
- gainIdx--;
- if (gainIdx >= 127)
- {
- gain = kGainTableVirtualMic[gainIdx - 127];
- } else
- {
- gain = kSuppressionTableVirtualMic[127 - gainIdx];
- }
- }
- if (tmpFlt < -32768)
- {
- tmpFlt = -32768;
- gainIdx--;
- if (gainIdx >= 127)
- {
- gain = kGainTableVirtualMic[gainIdx - 127];
- } else
- {
- gain = kSuppressionTableVirtualMic[127 - gainIdx];
- }
- }
- in_near[ii] = (WebRtc_Word16)tmpFlt;
- if (stt->fs == 32000)
- {
- tmpFlt = WEBRTC_SPL_MUL_16_U16(in_near_H[ii], gain);
- tmpFlt = WEBRTC_SPL_RSHIFT_W32(tmpFlt, 10);
- if (tmpFlt > 32767)
- {
- tmpFlt = 32767;
- }
- if (tmpFlt < -32768)
- {
- tmpFlt = -32768;
- }
- in_near_H[ii] = (WebRtc_Word16)tmpFlt;
- }
- }
- /* Set the level we (finally) used */
- stt->micGainIdx = gainIdx;
-// *micLevelOut = stt->micGainIdx;
- *micLevelOut = WEBRTC_SPL_RSHIFT_W32(stt->micGainIdx, stt->scale);
- /* Add to Mic as if it was the output from a true microphone */
- if (WebRtcAgc_AddMic(agcInst, in_near, in_near_H, samples) != 0)
- {
- return -1;
- }
- return 0;
-}
-
-void WebRtcAgc_UpdateAgcThresholds(Agc_t *stt)
-{
-
- WebRtc_Word16 tmp16;
-#ifdef MIC_LEVEL_FEEDBACK
- int zeros;
-
- if (stt->micLvlSat)
- {
- /* Lower the analog target level since we have reached its maximum */
- zeros = WebRtcSpl_NormW32(stt->Rxx160_LPw32);
- stt->targetIdxOffset = WEBRTC_SPL_RSHIFT_W16((3 * zeros) - stt->targetIdx - 2, 2);
- }
-#endif
-
- /* Set analog target level in envelope dBOv scale */
- tmp16 = (DIFF_REF_TO_ANALOG * stt->compressionGaindB) + ANALOG_TARGET_LEVEL_2;
- tmp16 = WebRtcSpl_DivW32W16ResW16((WebRtc_Word32)tmp16, ANALOG_TARGET_LEVEL);
- stt->analogTarget = DIGITAL_REF_AT_0_COMP_GAIN + tmp16;
- if (stt->analogTarget < DIGITAL_REF_AT_0_COMP_GAIN)
- {
- stt->analogTarget = DIGITAL_REF_AT_0_COMP_GAIN;
- }
- if (stt->agcMode == kAgcModeFixedDigital)
- {
- /* Adjust for different parameter interpretation in FixedDigital mode */
- stt->analogTarget = stt->compressionGaindB;
- }
-#ifdef MIC_LEVEL_FEEDBACK
- stt->analogTarget += stt->targetIdxOffset;
-#endif
- /* Since the offset between RMS and ENV is not constant, we should make this into a
- * table, but for now, we'll stick with a constant, tuned for the chosen analog
- * target level.
- */
- stt->targetIdx = ANALOG_TARGET_LEVEL + OFFSET_ENV_TO_RMS;
-#ifdef MIC_LEVEL_FEEDBACK
- stt->targetIdx += stt->targetIdxOffset;
-#endif
- /* Analog adaptation limits */
- /* analogTargetLevel = round((32767*10^(-targetIdx/20))^2*16/2^7) */
- stt->analogTargetLevel = RXX_BUFFER_LEN * kTargetLevelTable[stt->targetIdx]; /* ex. -20 dBov */
- stt->startUpperLimit = RXX_BUFFER_LEN * kTargetLevelTable[stt->targetIdx - 1];/* -19 dBov */
- stt->startLowerLimit = RXX_BUFFER_LEN * kTargetLevelTable[stt->targetIdx + 1];/* -21 dBov */
- stt->upperPrimaryLimit = RXX_BUFFER_LEN * kTargetLevelTable[stt->targetIdx - 2];/* -18 dBov */
- stt->lowerPrimaryLimit = RXX_BUFFER_LEN * kTargetLevelTable[stt->targetIdx + 2];/* -22 dBov */
- stt->upperSecondaryLimit = RXX_BUFFER_LEN * kTargetLevelTable[stt->targetIdx - 5];/* -15 dBov */
- stt->lowerSecondaryLimit = RXX_BUFFER_LEN * kTargetLevelTable[stt->targetIdx + 5];/* -25 dBov */
- stt->upperLimit = stt->startUpperLimit;
- stt->lowerLimit = stt->startLowerLimit;
-}
-
-void WebRtcAgc_SaturationCtrl(Agc_t *stt, WebRtc_UWord8 *saturated, WebRtc_Word32 *env)
-{
- WebRtc_Word16 i, tmpW16;
-
- /* Check if the signal is saturated */
- for (i = 0; i < 10; i++)
- {
- tmpW16 = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(env[i], 20);
- if (tmpW16 > 875)
- {
- stt->envSum += tmpW16;
- }
- }
-
- if (stt->envSum > 25000)
- {
- *saturated = 1;
- stt->envSum = 0;
- }
-
- /* stt->envSum *= 0.99; */
- stt->envSum = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(stt->envSum,
- (WebRtc_Word16)32440, 15);
-}
-
-void WebRtcAgc_ZeroCtrl(Agc_t *stt, WebRtc_Word32 *inMicLevel, WebRtc_Word32 *env)
-{
- WebRtc_Word16 i;
- WebRtc_Word32 tmp32 = 0;
- WebRtc_Word32 midVal;
-
- /* Is the input signal zero? */
- for (i = 0; i < 10; i++)
- {
- tmp32 += env[i];
- }
-
- /* Each block is allowed to have a few non-zero
- * samples.
- */
- if (tmp32 < 500)
- {
- stt->msZero += 10;
- } else
- {
- stt->msZero = 0;
- }
-
- if (stt->muteGuardMs > 0)
- {
- stt->muteGuardMs -= 10;
- }
-
- if (stt->msZero > 500)
- {
- stt->msZero = 0;
-
- /* Increase microphone level only if it's less than 50% */
- midVal = WEBRTC_SPL_RSHIFT_W32(stt->maxAnalog + stt->minLevel + 1, 1);
- if (*inMicLevel < midVal)
- {
- /* *inMicLevel *= 1.1; */
- tmp32 = WEBRTC_SPL_MUL(1126, *inMicLevel);
- *inMicLevel = WEBRTC_SPL_RSHIFT_W32(tmp32, 10);
- /* Reduces risk of a muted mic repeatedly triggering excessive levels due
- * to zero signal detection. */
- *inMicLevel = WEBRTC_SPL_MIN(*inMicLevel, stt->zeroCtrlMax);
- stt->micVol = *inMicLevel;
- }
-
-#ifdef AGC_DEBUG //test log
- fprintf(stt->fpt,
- "\t\tAGC->zeroCntrl, frame %d: 500 ms under threshold, micVol:\n",
- stt->fcount, stt->micVol);
-#endif
-
- stt->activeSpeech = 0;
- stt->Rxx16_LPw32Max = 0;
-
- /* The AGC has a tendency (due to problems with the VAD parameters), to
- * vastly increase the volume after a muting event. This timer prevents
- * upwards adaptation for a short period. */
- stt->muteGuardMs = kMuteGuardTimeMs;
- }
-}
-
-void WebRtcAgc_SpeakerInactiveCtrl(Agc_t *stt)
-{
- /* Check if the near end speaker is inactive.
- * If that is the case the VAD threshold is
- * increased since the VAD speech model gets
- * more sensitive to any sound after a long
- * silence.
- */
-
- WebRtc_Word32 tmp32;
- WebRtc_Word16 vadThresh;
-
- if (stt->vadMic.stdLongTerm < 2500)
- {
- stt->vadThreshold = 1500;
- } else
- {
- vadThresh = kNormalVadThreshold;
- if (stt->vadMic.stdLongTerm < 4500)
- {
- /* Scale between min and max threshold */
- vadThresh += WEBRTC_SPL_RSHIFT_W16(4500 - stt->vadMic.stdLongTerm, 1);
- }
-
- /* stt->vadThreshold = (31 * stt->vadThreshold + vadThresh) / 32; */
- tmp32 = (WebRtc_Word32)vadThresh;
- tmp32 += WEBRTC_SPL_MUL_16_16((WebRtc_Word16)31, stt->vadThreshold);
- stt->vadThreshold = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32, 5);
- }
-}
-
-void WebRtcAgc_ExpCurve(WebRtc_Word16 volume, WebRtc_Word16 *index)
-{
- // volume in Q14
- // index in [0-7]
- /* 8 different curves */
- if (volume > 5243)
- {
- if (volume > 7864)
- {
- if (volume > 12124)
- {
- *index = 7;
- } else
- {
- *index = 6;
- }
- } else
- {
- if (volume > 6554)
- {
- *index = 5;
- } else
- {
- *index = 4;
- }
- }
- } else
- {
- if (volume > 2621)
- {
- if (volume > 3932)
- {
- *index = 3;
- } else
- {
- *index = 2;
- }
- } else
- {
- if (volume > 1311)
- {
- *index = 1;
- } else
- {
- *index = 0;
- }
- }
- }
-}
-
-WebRtc_Word32 WebRtcAgc_ProcessAnalog(void *state, WebRtc_Word32 inMicLevel,
- WebRtc_Word32 *outMicLevel,
- WebRtc_Word16 vadLogRatio,
- WebRtc_Word16 echo, WebRtc_UWord8 *saturationWarning)
-{
- WebRtc_UWord32 tmpU32;
- WebRtc_Word32 Rxx16w32, tmp32;
- WebRtc_Word32 inMicLevelTmp, lastMicVol;
- WebRtc_Word16 i;
- WebRtc_UWord8 saturated = 0;
- Agc_t *stt;
-
- stt = (Agc_t *)state;
- inMicLevelTmp = WEBRTC_SPL_LSHIFT_W32(inMicLevel, stt->scale);
-
- if (inMicLevelTmp > stt->maxAnalog)
- {
-#ifdef AGC_DEBUG //test log
- fprintf(stt->fpt, "\tAGC->ProcessAnalog, frame %d: micLvl > maxAnalog\n", stt->fcount);
-#endif
- return -1;
- } else if (inMicLevelTmp < stt->minLevel)
- {
-#ifdef AGC_DEBUG //test log
- fprintf(stt->fpt, "\tAGC->ProcessAnalog, frame %d: micLvl < minLevel\n", stt->fcount);
-#endif
- return -1;
- }
-
- if (stt->firstCall == 0)
- {
- WebRtc_Word32 tmpVol;
- stt->firstCall = 1;
- tmp32 = WEBRTC_SPL_RSHIFT_W32((stt->maxLevel - stt->minLevel) * (WebRtc_Word32)51, 9);
- tmpVol = (stt->minLevel + tmp32);
-
- /* If the mic level is very low at start, increase it! */
- if ((inMicLevelTmp < tmpVol) && (stt->agcMode == kAgcModeAdaptiveAnalog))
- {
- inMicLevelTmp = tmpVol;
- }
- stt->micVol = inMicLevelTmp;
- }
-
- /* Set the mic level to the previous output value if there is digital input gain */
- if ((inMicLevelTmp == stt->maxAnalog) && (stt->micVol > stt->maxAnalog))
- {
- inMicLevelTmp = stt->micVol;
- }
-
- /* If the mic level was manually changed to a very low value raise it! */
- if ((inMicLevelTmp != stt->micVol) && (inMicLevelTmp < stt->minOutput))
- {
- tmp32 = WEBRTC_SPL_RSHIFT_W32((stt->maxLevel - stt->minLevel) * (WebRtc_Word32)51, 9);
- inMicLevelTmp = (stt->minLevel + tmp32);
- stt->micVol = inMicLevelTmp;
-#ifdef MIC_LEVEL_FEEDBACK
- //stt->numBlocksMicLvlSat = 0;
-#endif
-#ifdef AGC_DEBUG //test log
- fprintf(stt->fpt,
- "\tAGC->ProcessAnalog, frame %d: micLvl < minLevel by manual decrease, raise vol\n",
- stt->fcount);
-#endif
- }
-
- if (inMicLevelTmp != stt->micVol)
- {
- // Incoming level mismatch; update our level.
- // This could be the case if the volume is changed manually, or if the
- // sound device has a low volume resolution.
- stt->micVol = inMicLevelTmp;
- }
-
- if (inMicLevelTmp > stt->maxLevel)
- {
- // Always allow the user to raise the volume above the maxLevel.
- stt->maxLevel = inMicLevelTmp;
- }
-
- // Store last value here, after we've taken care of manual updates etc.
- lastMicVol = stt->micVol;
-
- /* Checks if the signal is saturated. Also a check if individual samples
- * are larger than 12000 is done. If they are the counter for increasing
- * the volume level is set to -100ms
- */
- WebRtcAgc_SaturationCtrl(stt, &saturated, stt->env[0]);
-
- /* The AGC is always allowed to lower the level if the signal is saturated */
- if (saturated == 1)
- {
- /* Lower the recording level
- * Rxx160_LP is adjusted down because it is so slow it could
- * cause the AGC to make wrong decisions. */
- /* stt->Rxx160_LPw32 *= 0.875; */
- stt->Rxx160_LPw32 = WEBRTC_SPL_MUL(WEBRTC_SPL_RSHIFT_W32(stt->Rxx160_LPw32, 3), 7);
-
- stt->zeroCtrlMax = stt->micVol;
-
- /* stt->micVol *= 0.903; */
- tmp32 = inMicLevelTmp - stt->minLevel;
- tmpU32 = WEBRTC_SPL_UMUL(29591, (WebRtc_UWord32)(tmp32));
- stt->micVol = (WebRtc_Word32)WEBRTC_SPL_RSHIFT_U32(tmpU32, 15) + stt->minLevel;
- if (stt->micVol > lastMicVol - 2)
- {
- stt->micVol = lastMicVol - 2;
- }
- inMicLevelTmp = stt->micVol;
-
-#ifdef AGC_DEBUG //test log
- fprintf(stt->fpt,
- "\tAGC->ProcessAnalog, frame %d: saturated, micVol = %d\n",
- stt->fcount, stt->micVol);
-#endif
-
- if (stt->micVol < stt->minOutput)
- {
- *saturationWarning = 1;
- }
-
- /* Reset counter for decrease of volume level to avoid
- * decreasing too much. The saturation control can still
- * lower the level if needed. */
- stt->msTooHigh = -100;
-
- /* Enable the control mechanism to ensure that our measure,
- * Rxx160_LP, is in the correct range. This must be done since
- * the measure is very slow. */
- stt->activeSpeech = 0;
- stt->Rxx16_LPw32Max = 0;
-
- /* Reset to initial values */
- stt->msecSpeechInnerChange = kMsecSpeechInner;
- stt->msecSpeechOuterChange = kMsecSpeechOuter;
- stt->changeToSlowMode = 0;
-
- stt->muteGuardMs = 0;
-
- stt->upperLimit = stt->startUpperLimit;
- stt->lowerLimit = stt->startLowerLimit;
-#ifdef MIC_LEVEL_FEEDBACK
- //stt->numBlocksMicLvlSat = 0;
-#endif
- }
-
- /* Check if the input speech is zero. If so the mic volume
- * is increased. On some computers the input is zero up as high
- * level as 17% */
- WebRtcAgc_ZeroCtrl(stt, &inMicLevelTmp, stt->env[0]);
-
- /* Check if the near end speaker is inactive.
- * If that is the case the VAD threshold is
- * increased since the VAD speech model gets
- * more sensitive to any sound after a long
- * silence.
- */
- WebRtcAgc_SpeakerInactiveCtrl(stt);
-
- for (i = 0; i < 5; i++)
- {
- /* Computed on blocks of 16 samples */
-
- Rxx16w32 = stt->Rxx16w32_array[0][i];
-
- /* Rxx160w32 in Q(-7) */
- tmp32 = WEBRTC_SPL_RSHIFT_W32(Rxx16w32 - stt->Rxx16_vectorw32[stt->Rxx16pos], 3);
- stt->Rxx160w32 = stt->Rxx160w32 + tmp32;
- stt->Rxx16_vectorw32[stt->Rxx16pos] = Rxx16w32;
-
- /* Circular buffer */
- stt->Rxx16pos = stt->Rxx16pos++;
- if (stt->Rxx16pos == RXX_BUFFER_LEN)
- {
- stt->Rxx16pos = 0;
- }
-
- /* Rxx16_LPw32 in Q(-4) */
- tmp32 = WEBRTC_SPL_RSHIFT_W32(Rxx16w32 - stt->Rxx16_LPw32, kAlphaShortTerm);
- stt->Rxx16_LPw32 = (stt->Rxx16_LPw32) + tmp32;
-
- if (vadLogRatio > stt->vadThreshold)
- {
- /* Speech detected! */
-
- /* Check if Rxx160_LP is in the correct range. If
- * it is too high/low then we set it to the maximum of
- * Rxx16_LPw32 during the first 200ms of speech.
- */
- if (stt->activeSpeech < 250)
- {
- stt->activeSpeech += 2;
-
- if (stt->Rxx16_LPw32 > stt->Rxx16_LPw32Max)
- {
- stt->Rxx16_LPw32Max = stt->Rxx16_LPw32;
- }
- } else if (stt->activeSpeech == 250)
- {
- stt->activeSpeech += 2;
- tmp32 = WEBRTC_SPL_RSHIFT_W32(stt->Rxx16_LPw32Max, 3);
- stt->Rxx160_LPw32 = WEBRTC_SPL_MUL(tmp32, RXX_BUFFER_LEN);
- }
-
- tmp32 = WEBRTC_SPL_RSHIFT_W32(stt->Rxx160w32 - stt->Rxx160_LPw32, kAlphaLongTerm);
- stt->Rxx160_LPw32 = stt->Rxx160_LPw32 + tmp32;
-
- if (stt->Rxx160_LPw32 > stt->upperSecondaryLimit)
- {
- stt->msTooHigh += 2;
- stt->msTooLow = 0;
- stt->changeToSlowMode = 0;
-
- if (stt->msTooHigh > stt->msecSpeechOuterChange)
- {
- stt->msTooHigh = 0;
-
- /* Lower the recording level */
- /* Multiply by 0.828125 which corresponds to decreasing ~0.8dB */
- tmp32 = WEBRTC_SPL_RSHIFT_W32(stt->Rxx160_LPw32, 6);
- stt->Rxx160_LPw32 = WEBRTC_SPL_MUL(tmp32, 53);
-
- /* Reduce the max gain to avoid excessive oscillation
- * (but never drop below the maximum analog level).
- * stt->maxLevel = (15 * stt->maxLevel + stt->micVol) / 16;
- */
- tmp32 = (15 * stt->maxLevel) + stt->micVol;
- stt->maxLevel = WEBRTC_SPL_RSHIFT_W32(tmp32, 4);
- stt->maxLevel = WEBRTC_SPL_MAX(stt->maxLevel, stt->maxAnalog);
-
- stt->zeroCtrlMax = stt->micVol;
-
- /* 0.95 in Q15 */
- tmp32 = inMicLevelTmp - stt->minLevel;
- tmpU32 = WEBRTC_SPL_UMUL(31130, (WebRtc_UWord32)(tmp32));
- stt->micVol = (WebRtc_Word32)WEBRTC_SPL_RSHIFT_U32(tmpU32, 15) + stt->minLevel;
- if (stt->micVol > lastMicVol - 1)
- {
- stt->micVol = lastMicVol - 1;
- }
- inMicLevelTmp = stt->micVol;
-
- /* Enable the control mechanism to ensure that our measure,
- * Rxx160_LP, is in the correct range.
- */
- stt->activeSpeech = 0;
- stt->Rxx16_LPw32Max = 0;
-#ifdef MIC_LEVEL_FEEDBACK
- //stt->numBlocksMicLvlSat = 0;
-#endif
-#ifdef AGC_DEBUG //test log
- fprintf(stt->fpt,
- "\tAGC->ProcessAnalog, frame %d: measure > 2ndUpperLim, micVol = %d, maxLevel = %d\n",
- stt->fcount, stt->micVol, stt->maxLevel);
-#endif
- }
- } else if (stt->Rxx160_LPw32 > stt->upperLimit)
- {
- stt->msTooHigh += 2;
- stt->msTooLow = 0;
- stt->changeToSlowMode = 0;
-
- if (stt->msTooHigh > stt->msecSpeechInnerChange)
- {
- /* Lower the recording level */
- stt->msTooHigh = 0;
- /* Multiply by 0.828125 which corresponds to decreasing ~0.8dB */
- tmp32 = WEBRTC_SPL_RSHIFT_W32(stt->Rxx160_LPw32, 6);
- stt->Rxx160_LPw32 = WEBRTC_SPL_MUL(tmp32, 53);
-
- /* Reduce the max gain to avoid excessive oscillation
- * (but never drop below the maximum analog level).
- * stt->maxLevel = (15 * stt->maxLevel + stt->micVol) / 16;
- */
- tmp32 = (15 * stt->maxLevel) + stt->micVol;
- stt->maxLevel = WEBRTC_SPL_RSHIFT_W32(tmp32, 4);
- stt->maxLevel = WEBRTC_SPL_MAX(stt->maxLevel, stt->maxAnalog);
-
- stt->zeroCtrlMax = stt->micVol;
-
- /* 0.965 in Q15 */
- tmp32 = inMicLevelTmp - stt->minLevel;
- tmpU32 = WEBRTC_SPL_UMUL(31621, (WebRtc_UWord32)(inMicLevelTmp - stt->minLevel));
- stt->micVol = (WebRtc_Word32)WEBRTC_SPL_RSHIFT_U32(tmpU32, 15) + stt->minLevel;
- if (stt->micVol > lastMicVol - 1)
- {
- stt->micVol = lastMicVol - 1;
- }
- inMicLevelTmp = stt->micVol;
-
-#ifdef MIC_LEVEL_FEEDBACK
- //stt->numBlocksMicLvlSat = 0;
-#endif
-#ifdef AGC_DEBUG //test log
- fprintf(stt->fpt,
- "\tAGC->ProcessAnalog, frame %d: measure > UpperLim, micVol = %d, maxLevel = %d\n",
- stt->fcount, stt->micVol, stt->maxLevel);
-#endif
- }
- } else if (stt->Rxx160_LPw32 < stt->lowerSecondaryLimit)
- {
- stt->msTooHigh = 0;
- stt->changeToSlowMode = 0;
- stt->msTooLow += 2;
-
- if (stt->msTooLow > stt->msecSpeechOuterChange)
- {
- /* Raise the recording level */
- WebRtc_Word16 index, weightFIX;
- WebRtc_Word16 volNormFIX = 16384; // =1 in Q14.
-
- stt->msTooLow = 0;
-
- /* Normalize the volume level */
- tmp32 = WEBRTC_SPL_LSHIFT_W32(inMicLevelTmp - stt->minLevel, 14);
- if (stt->maxInit != stt->minLevel)
- {
- volNormFIX = (WebRtc_Word16)WEBRTC_SPL_DIV(tmp32,
- (stt->maxInit - stt->minLevel));
- }
-
- /* Find correct curve */
- WebRtcAgc_ExpCurve(volNormFIX, &index);
-
- /* Compute weighting factor for the volume increase, 32^(-2*X)/2+1.05 */
- weightFIX = kOffset1[index]
- - (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(kSlope1[index],
- volNormFIX, 13);
-
- /* stt->Rxx160_LPw32 *= 1.047 [~0.2 dB]; */
- tmp32 = WEBRTC_SPL_RSHIFT_W32(stt->Rxx160_LPw32, 6);
- stt->Rxx160_LPw32 = WEBRTC_SPL_MUL(tmp32, 67);
-
- tmp32 = inMicLevelTmp - stt->minLevel;
- tmpU32 = ((WebRtc_UWord32)weightFIX * (WebRtc_UWord32)(inMicLevelTmp - stt->minLevel));
- stt->micVol = (WebRtc_Word32)WEBRTC_SPL_RSHIFT_U32(tmpU32, 14) + stt->minLevel;
- if (stt->micVol < lastMicVol + 2)
- {
- stt->micVol = lastMicVol + 2;
- }
-
- inMicLevelTmp = stt->micVol;
-
-#ifdef MIC_LEVEL_FEEDBACK
- /* Count ms in level saturation */
- //if (stt->micVol > stt->maxAnalog) {
- if (stt->micVol > 150)
- {
- /* mic level is saturated */
- stt->numBlocksMicLvlSat++;
- fprintf(stderr, "Sat mic Level: %d\n", stt->numBlocksMicLvlSat);
- }
-#endif
-#ifdef AGC_DEBUG //test log
- fprintf(stt->fpt,
- "\tAGC->ProcessAnalog, frame %d: measure < 2ndLowerLim, micVol = %d\n",
- stt->fcount, stt->micVol);
-#endif
- }
- } else if (stt->Rxx160_LPw32 < stt->lowerLimit)
- {
- stt->msTooHigh = 0;
- stt->changeToSlowMode = 0;
- stt->msTooLow += 2;
-
- if (stt->msTooLow > stt->msecSpeechInnerChange)
- {
- /* Raise the recording level */
- WebRtc_Word16 index, weightFIX;
- WebRtc_Word16 volNormFIX = 16384; // =1 in Q14.
-
- stt->msTooLow = 0;
-
- /* Normalize the volume level */
- tmp32 = WEBRTC_SPL_LSHIFT_W32(inMicLevelTmp - stt->minLevel, 14);
- if (stt->maxInit != stt->minLevel)
- {
- volNormFIX = (WebRtc_Word16)WEBRTC_SPL_DIV(tmp32,
- (stt->maxInit - stt->minLevel));
- }
-
- /* Find correct curve */
- WebRtcAgc_ExpCurve(volNormFIX, &index);
-
- /* Compute weighting factor for the volume increase, (3.^(-2.*X))/8+1 */
- weightFIX = kOffset2[index]
- - (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(kSlope2[index],
- volNormFIX, 13);
-
- /* stt->Rxx160_LPw32 *= 1.047 [~0.2 dB]; */
- tmp32 = WEBRTC_SPL_RSHIFT_W32(stt->Rxx160_LPw32, 6);
- stt->Rxx160_LPw32 = WEBRTC_SPL_MUL(tmp32, 67);
-
- tmp32 = inMicLevelTmp - stt->minLevel;
- tmpU32 = ((WebRtc_UWord32)weightFIX * (WebRtc_UWord32)(inMicLevelTmp - stt->minLevel));
- stt->micVol = (WebRtc_Word32)WEBRTC_SPL_RSHIFT_U32(tmpU32, 14) + stt->minLevel;
- if (stt->micVol < lastMicVol + 1)
- {
- stt->micVol = lastMicVol + 1;
- }
-
- inMicLevelTmp = stt->micVol;
-
-#ifdef MIC_LEVEL_FEEDBACK
- /* Count ms in level saturation */
- //if (stt->micVol > stt->maxAnalog) {
- if (stt->micVol > 150)
- {
- /* mic level is saturated */
- stt->numBlocksMicLvlSat++;
- fprintf(stderr, "Sat mic Level: %d\n", stt->numBlocksMicLvlSat);
- }
-#endif
-#ifdef AGC_DEBUG //test log
- fprintf(stt->fpt,
- "\tAGC->ProcessAnalog, frame %d: measure < LowerLim, micVol = %d\n",
- stt->fcount, stt->micVol);
-#endif
-
- }
- } else
- {
- /* The signal is inside the desired range which is:
- * lowerLimit < Rxx160_LP/640 < upperLimit
- */
- if (stt->changeToSlowMode > 4000)
- {
- stt->msecSpeechInnerChange = 1000;
- stt->msecSpeechOuterChange = 500;
- stt->upperLimit = stt->upperPrimaryLimit;
- stt->lowerLimit = stt->lowerPrimaryLimit;
- } else
- {
- stt->changeToSlowMode += 2; // in milliseconds
- }
- stt->msTooLow = 0;
- stt->msTooHigh = 0;
-
- stt->micVol = inMicLevelTmp;
-
- }
-#ifdef MIC_LEVEL_FEEDBACK
- if (stt->numBlocksMicLvlSat > NUM_BLOCKS_IN_SAT_BEFORE_CHANGE_TARGET)
- {
- stt->micLvlSat = 1;
- fprintf(stderr, "target before = %d (%d)\n", stt->analogTargetLevel, stt->targetIdx);
- WebRtcAgc_UpdateAgcThresholds(stt);
- WebRtcAgc_CalculateGainTable(&(stt->digitalAgc.gainTable[0]),
- stt->compressionGaindB, stt->targetLevelDbfs, stt->limiterEnable,
- stt->analogTarget);
- stt->numBlocksMicLvlSat = 0;
- stt->micLvlSat = 0;
- fprintf(stderr, "target offset = %d\n", stt->targetIdxOffset);
- fprintf(stderr, "target after = %d (%d)\n", stt->analogTargetLevel, stt->targetIdx);
- }
-#endif
- }
- }
-
- /* Ensure gain is not increased in presence of echo or after a mute event
- * (but allow the zeroCtrl() increase on the frame of a mute detection).
- */
- if (echo == 1 || (stt->muteGuardMs > 0 && stt->muteGuardMs < kMuteGuardTimeMs))
- {
- if (stt->micVol > lastMicVol)
- {
- stt->micVol = lastMicVol;
- }
- }
-
- /* limit the gain */
- if (stt->micVol > stt->maxLevel)
- {
- stt->micVol = stt->maxLevel;
- } else if (stt->micVol < stt->minOutput)
- {
- stt->micVol = stt->minOutput;
- }
-
- *outMicLevel = WEBRTC_SPL_RSHIFT_W32(stt->micVol, stt->scale);
- if (*outMicLevel > WEBRTC_SPL_RSHIFT_W32(stt->maxAnalog, stt->scale))
- {
- *outMicLevel = WEBRTC_SPL_RSHIFT_W32(stt->maxAnalog, stt->scale);
- }
-
- return 0;
-}
-
-int WebRtcAgc_Process(void *agcInst, const WebRtc_Word16 *in_near,
- const WebRtc_Word16 *in_near_H, WebRtc_Word16 samples,
- WebRtc_Word16 *out, WebRtc_Word16 *out_H, WebRtc_Word32 inMicLevel,
- WebRtc_Word32 *outMicLevel, WebRtc_Word16 echo,
- WebRtc_UWord8 *saturationWarning)
-{
- Agc_t *stt;
- WebRtc_Word32 inMicLevelTmp;
- WebRtc_Word16 subFrames, i;
- WebRtc_UWord8 satWarningTmp = 0;
-
- stt = (Agc_t *)agcInst;
-
- //
- if (stt == NULL)
- {
- return -1;
- }
- //
-
-
- if (stt->fs == 8000)
- {
- if ((samples != 80) && (samples != 160))
- {
-#ifdef AGC_DEBUG //test log
- fprintf(stt->fpt,
- "AGC->Process, frame %d: Invalid number of samples\n\n", stt->fcount);
-#endif
- return -1;
- }
- subFrames = 80;
- } else if (stt->fs == 16000)
- {
- if ((samples != 160) && (samples != 320))
- {
-#ifdef AGC_DEBUG //test log
- fprintf(stt->fpt,
- "AGC->Process, frame %d: Invalid number of samples\n\n", stt->fcount);
-#endif
- return -1;
- }
- subFrames = 160;
- } else if (stt->fs == 32000)
- {
- if ((samples != 160) && (samples != 320))
- {
-#ifdef AGC_DEBUG //test log
- fprintf(stt->fpt,
- "AGC->Process, frame %d: Invalid number of samples\n\n", stt->fcount);
-#endif
- return -1;
- }
- subFrames = 160;
- } else
- {
-#ifdef AGC_DEBUG// test log
- fprintf(stt->fpt,
- "AGC->Process, frame %d: Invalid sample rate\n\n", stt->fcount);
-#endif
- return -1;
- }
-
- /* Check for valid pointers based on sampling rate */
- if (stt->fs == 32000 && in_near_H == NULL)
- {
- return -1;
- }
- /* Check for valid pointers for low band */
- if (in_near == NULL)
- {
- return -1;
- }
-
- *saturationWarning = 0;
- //TODO: PUT IN RANGE CHECKING FOR INPUT LEVELS
- *outMicLevel = inMicLevel;
- inMicLevelTmp = inMicLevel;
-
- memcpy(out, in_near, samples * sizeof(WebRtc_Word16));
- if (stt->fs == 32000)
- {
- memcpy(out_H, in_near_H, samples * sizeof(WebRtc_Word16));
- }
-
-#ifdef AGC_DEBUG//test log
- stt->fcount++;
-#endif
-
- for (i = 0; i < samples; i += subFrames)
- {
- if (WebRtcAgc_ProcessDigital(&stt->digitalAgc, &in_near[i], &in_near_H[i], &out[i], &out_H[i],
- stt->fs, stt->lowLevelSignal) == -1)
- {
-#ifdef AGC_DEBUG//test log
- fprintf(stt->fpt, "AGC->Process, frame %d: Error from DigAGC\n\n", stt->fcount);
-#endif
- return -1;
- }
- if ((stt->agcMode < kAgcModeFixedDigital) && ((stt->lowLevelSignal == 0)
- || (stt->agcMode != kAgcModeAdaptiveDigital)))
- {
- if (WebRtcAgc_ProcessAnalog(agcInst, inMicLevelTmp, outMicLevel,
- stt->vadMic.logRatio, echo, saturationWarning) == -1)
- {
- return -1;
- }
- }
-#ifdef AGC_DEBUG//test log
- fprintf(stt->agcLog, "%5d\t%d\t%d\t%d\n", stt->fcount, inMicLevelTmp, *outMicLevel, stt->maxLevel, stt->micVol);
-#endif
-
- /* update queue */
- if (stt->inQueue > 1)
- {
- memcpy(stt->env[0], stt->env[1], 10 * sizeof(WebRtc_Word32));
- memcpy(stt->Rxx16w32_array[0], stt->Rxx16w32_array[1], 5 * sizeof(WebRtc_Word32));
- }
-
- if (stt->inQueue > 0)
- {
- stt->inQueue--;
- }
-
- /* If 20ms frames are used the input mic level must be updated so that
- * the analog AGC does not think that there has been a manual volume
- * change. */
- inMicLevelTmp = *outMicLevel;
-
- /* Store a positive saturation warning. */
- if (*saturationWarning == 1)
- {
- satWarningTmp = 1;
- }
- }
-
- /* Trigger the saturation warning if displayed by any of the frames. */
- *saturationWarning = satWarningTmp;
-
- return 0;
-}
-
-int WebRtcAgc_set_config(void *agcInst, WebRtcAgc_config_t agcConfig)
-{
- Agc_t *stt;
- stt = (Agc_t *)agcInst;
-
- if (stt == NULL)
- {
- return -1;
- }
-
- if (stt->initFlag != kInitCheck)
- {
- stt->lastError = AGC_UNINITIALIZED_ERROR;
- return -1;
- }
-
- if (agcConfig.limiterEnable != kAgcFalse && agcConfig.limiterEnable != kAgcTrue)
- {
- stt->lastError = AGC_BAD_PARAMETER_ERROR;
- return -1;
- }
- stt->limiterEnable = agcConfig.limiterEnable;
- stt->compressionGaindB = agcConfig.compressionGaindB;
- if ((agcConfig.targetLevelDbfs < 0) || (agcConfig.targetLevelDbfs > 31))
- {
- stt->lastError = AGC_BAD_PARAMETER_ERROR;
- return -1;
- }
- stt->targetLevelDbfs = agcConfig.targetLevelDbfs;
-
- if (stt->agcMode == kAgcModeFixedDigital)
- {
- /* Adjust for different parameter interpretation in FixedDigital mode */
- stt->compressionGaindB += agcConfig.targetLevelDbfs;
- }
-
- /* Update threshold levels for analog adaptation */
- WebRtcAgc_UpdateAgcThresholds(stt);
-
- /* Recalculate gain table */
- if (WebRtcAgc_CalculateGainTable(&(stt->digitalAgc.gainTable[0]), stt->compressionGaindB,
- stt->targetLevelDbfs, stt->limiterEnable, stt->analogTarget) == -1)
- {
-#ifdef AGC_DEBUG//test log
- fprintf(stt->fpt, "AGC->set_config, frame %d: Error from calcGainTable\n\n", stt->fcount);
-#endif
- return -1;
- }
- /* Store the config in a WebRtcAgc_config_t */
- stt->usedConfig.compressionGaindB = agcConfig.compressionGaindB;
- stt->usedConfig.limiterEnable = agcConfig.limiterEnable;
- stt->usedConfig.targetLevelDbfs = agcConfig.targetLevelDbfs;
-
- return 0;
-}
-
-int WebRtcAgc_get_config(void *agcInst, WebRtcAgc_config_t *config)
-{
- Agc_t *stt;
- stt = (Agc_t *)agcInst;
-
- if (stt == NULL)
- {
- return -1;
- }
-
- if (config == NULL)
- {
- stt->lastError = AGC_NULL_POINTER_ERROR;
- return -1;
- }
-
- if (stt->initFlag != kInitCheck)
- {
- stt->lastError = AGC_UNINITIALIZED_ERROR;
- return -1;
- }
-
- config->limiterEnable = stt->usedConfig.limiterEnable;
- config->targetLevelDbfs = stt->usedConfig.targetLevelDbfs;
- config->compressionGaindB = stt->usedConfig.compressionGaindB;
-
- return 0;
-}
-
-int WebRtcAgc_Create(void **agcInst)
-{
- Agc_t *stt;
- if (agcInst == NULL)
- {
- return -1;
- }
- stt = (Agc_t *)malloc(sizeof(Agc_t));
-
- *agcInst = stt;
- if (stt == NULL)
- {
- return -1;
- }
-
-#ifdef AGC_DEBUG
- stt->fpt = fopen("./agc_test_log.txt", "wt");
- stt->agcLog = fopen("./agc_debug_log.txt", "wt");
- stt->digitalAgc.logFile = fopen("./agc_log.txt", "wt");
-#endif
-
- stt->initFlag = 0;
- stt->lastError = 0;
-
- return 0;
-}
-
-int WebRtcAgc_Free(void *state)
-{
- Agc_t *stt;
-
- stt = (Agc_t *)state;
-#ifdef AGC_DEBUG
- fclose(stt->fpt);
- fclose(stt->agcLog);
- fclose(stt->digitalAgc.logFile);
-#endif
- free(stt);
-
- return 0;
-}
-
-/* minLevel - Minimum volume level
- * maxLevel - Maximum volume level
- */
-int WebRtcAgc_Init(void *agcInst, WebRtc_Word32 minLevel, WebRtc_Word32 maxLevel,
- WebRtc_Word16 agcMode, WebRtc_UWord32 fs)
-{
- WebRtc_Word32 max_add, tmp32;
- WebRtc_Word16 i;
- int tmpNorm;
- Agc_t *stt;
-
- /* typecast state pointer */
- stt = (Agc_t *)agcInst;
-
- if (WebRtcAgc_InitDigital(&stt->digitalAgc, agcMode) != 0)
- {
- stt->lastError = AGC_UNINITIALIZED_ERROR;
- return -1;
- }
-
- /* Analog AGC variables */
- stt->envSum = 0;
-
- /* mode = 0 - Only saturation protection
- * 1 - Analog Automatic Gain Control [-targetLevelDbfs (default -3 dBOv)]
- * 2 - Digital Automatic Gain Control [-targetLevelDbfs (default -3 dBOv)]
- * 3 - Fixed Digital Gain [compressionGaindB (default 8 dB)]
- */
-#ifdef AGC_DEBUG//test log
- stt->fcount = 0;
- fprintf(stt->fpt, "AGC->Init\n");
-#endif
- if (agcMode < kAgcModeUnchanged || agcMode > kAgcModeFixedDigital)
- {
-#ifdef AGC_DEBUG//test log
- fprintf(stt->fpt, "AGC->Init: error, incorrect mode\n\n");
-#endif
- return -1;
- }
- stt->agcMode = agcMode;
- stt->fs = fs;
-
- /* initialize input VAD */
- WebRtcAgc_InitVad(&stt->vadMic);
-
- /* If the volume range is smaller than 0-256 then
- * the levels are shifted up to Q8-domain */
- tmpNorm = WebRtcSpl_NormU32((WebRtc_UWord32)maxLevel);
- stt->scale = tmpNorm - 23;
- if (stt->scale < 0)
- {
- stt->scale = 0;
- }
- // TODO(bjornv): Investigate if we really need to scale up a small range now when we have
- // a guard against zero-increments. For now, we do not support scale up (scale = 0).
- stt->scale = 0;
- maxLevel = WEBRTC_SPL_LSHIFT_W32(maxLevel, stt->scale);
- minLevel = WEBRTC_SPL_LSHIFT_W32(minLevel, stt->scale);
-
- /* Make minLevel and maxLevel static in AdaptiveDigital */
- if (stt->agcMode == kAgcModeAdaptiveDigital)
- {
- minLevel = 0;
- maxLevel = 255;
- stt->scale = 0;
- }
- /* The maximum supplemental volume range is based on a vague idea
- * of how much lower the gain will be than the real analog gain. */
- max_add = WEBRTC_SPL_RSHIFT_W32(maxLevel - minLevel, 2);
-
- /* Minimum/maximum volume level that can be set */
- stt->minLevel = minLevel;
- stt->maxAnalog = maxLevel;
- stt->maxLevel = maxLevel + max_add;
- stt->maxInit = stt->maxLevel;
-
- stt->zeroCtrlMax = stt->maxAnalog;
-
- /* Initialize micVol parameter */
- stt->micVol = stt->maxAnalog;
- if (stt->agcMode == kAgcModeAdaptiveDigital)
- {
- stt->micVol = 127; /* Mid-point of mic level */
- }
- stt->micRef = stt->micVol;
- stt->micGainIdx = 127;
-#ifdef MIC_LEVEL_FEEDBACK
- stt->numBlocksMicLvlSat = 0;
- stt->micLvlSat = 0;
-#endif
-#ifdef AGC_DEBUG//test log
- fprintf(stt->fpt,
- "AGC->Init: minLevel = %d, maxAnalog = %d, maxLevel = %d\n",
- stt->minLevel, stt->maxAnalog, stt->maxLevel);
-#endif
-
- /* Minimum output volume is 4% higher than the available lowest volume level */
- tmp32 = WEBRTC_SPL_RSHIFT_W32((stt->maxLevel - stt->minLevel) * (WebRtc_Word32)10, 8);
- stt->minOutput = (stt->minLevel + tmp32);
-
- stt->msTooLow = 0;
- stt->msTooHigh = 0;
- stt->changeToSlowMode = 0;
- stt->firstCall = 0;
- stt->msZero = 0;
- stt->muteGuardMs = 0;
- stt->gainTableIdx = 0;
-
- stt->msecSpeechInnerChange = kMsecSpeechInner;
- stt->msecSpeechOuterChange = kMsecSpeechOuter;
-
- stt->activeSpeech = 0;
- stt->Rxx16_LPw32Max = 0;
-
- stt->vadThreshold = kNormalVadThreshold;
- stt->inActive = 0;
-
- for (i = 0; i < RXX_BUFFER_LEN; i++)
- {
- stt->Rxx16_vectorw32[i] = (WebRtc_Word32)1000; /* -54dBm0 */
- }
- stt->Rxx160w32 = 125 * RXX_BUFFER_LEN; /* (stt->Rxx16_vectorw32[0]>>3) = 125 */
-
- stt->Rxx16pos = 0;
- stt->Rxx16_LPw32 = (WebRtc_Word32)16284; /* Q(-4) */
-
- for (i = 0; i < 5; i++)
- {
- stt->Rxx16w32_array[0][i] = 0;
- }
- for (i = 0; i < 20; i++)
- {
- stt->env[0][i] = 0;
- }
- stt->inQueue = 0;
-
-#ifdef MIC_LEVEL_FEEDBACK
- stt->targetIdxOffset = 0;
-#endif
-
- WebRtcSpl_MemSetW32(stt->filterState, 0, 8);
-
- stt->initFlag = kInitCheck;
- // Default config settings.
- stt->defaultConfig.limiterEnable = kAgcTrue;
- stt->defaultConfig.targetLevelDbfs = AGC_DEFAULT_TARGET_LEVEL;
- stt->defaultConfig.compressionGaindB = AGC_DEFAULT_COMP_GAIN;
-
- if (WebRtcAgc_set_config(stt, stt->defaultConfig) == -1)
- {
- stt->lastError = AGC_UNSPECIFIED_ERROR;
- return -1;
- }
- stt->Rxx160_LPw32 = stt->analogTargetLevel; // Initialize rms value
-
- stt->lowLevelSignal = 0;
-
- /* Only positive values are allowed that are not too large */
- if ((minLevel >= maxLevel) || (maxLevel & 0xFC000000))
- {
-#ifdef AGC_DEBUG//test log
- fprintf(stt->fpt, "minLevel, maxLevel value(s) are invalid\n\n");
-#endif
- return -1;
- } else
- {
-#ifdef AGC_DEBUG//test log
- fprintf(stt->fpt, "\n");
-#endif
- return 0;
- }
-}
-
-int WebRtcAgc_Version(WebRtc_Word8 *versionStr, WebRtc_Word16 length)
-{
- const WebRtc_Word8 version[] = "AGC 1.7.0";
- const WebRtc_Word16 versionLen = (WebRtc_Word16)strlen(version) + 1;
-
- if (versionStr == NULL)
- {
- return -1;
- }
-
- if (versionLen > length)
- {
- return -1;
- }
-
- strncpy(versionStr, version, versionLen);
- return 0;
-}
diff --git a/src/modules/audio_processing/agc/main/source/analog_agc.h b/src/modules/audio_processing/agc/main/source/analog_agc.h
deleted file mode 100644
index b32ac65..0000000
--- a/src/modules/audio_processing/agc/main/source/analog_agc.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AGC_MAIN_SOURCE_ANALOG_AGC_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC_MAIN_SOURCE_ANALOG_AGC_H_
-
-#include "typedefs.h"
-#include "gain_control.h"
-#include "digital_agc.h"
-
-//#define AGC_DEBUG
-//#define MIC_LEVEL_FEEDBACK
-#ifdef AGC_DEBUG
-#include <stdio.h>
-#endif
-
-/* Analog Automatic Gain Control variables:
- * Constant declarations (inner limits inside which no changes are done)
- * In the beginning the range is narrower to widen as soon as the measure
- * 'Rxx160_LP' is inside it. Currently the starting limits are -22.2+/-1dBm0
- * and the final limits -22.2+/-2.5dBm0. These levels makes the speech signal
- * go towards -25.4dBm0 (-31.4dBov). Tuned with wbfile-31.4dBov.pcm
- * The limits are created by running the AGC with a file having the desired
- * signal level and thereafter plotting Rxx160_LP in the dBm0-domain defined
- * by out=10*log10(in/260537279.7); Set the target level to the average level
- * of our measure Rxx160_LP. Remember that the levels are in blocks of 16 in
- * Q(-7). (Example matlab code: round(db2pow(-21.2)*16/2^7) )
- */
-#define RXX_BUFFER_LEN 10
-
-static const WebRtc_Word16 kMsecSpeechInner = 520;
-static const WebRtc_Word16 kMsecSpeechOuter = 340;
-
-static const WebRtc_Word16 kNormalVadThreshold = 400;
-
-static const WebRtc_Word16 kAlphaShortTerm = 6; // 1 >> 6 = 0.0156
-static const WebRtc_Word16 kAlphaLongTerm = 10; // 1 >> 10 = 0.000977
-
-typedef struct
-{
- // Configurable parameters/variables
- WebRtc_UWord32 fs; // Sampling frequency
- WebRtc_Word16 compressionGaindB; // Fixed gain level in dB
- WebRtc_Word16 targetLevelDbfs; // Target level in -dBfs of envelope (default -3)
- WebRtc_Word16 agcMode; // Hard coded mode (adaptAna/adaptDig/fixedDig)
- WebRtc_UWord8 limiterEnable; // Enabling limiter (on/off (default off))
- WebRtcAgc_config_t defaultConfig;
- WebRtcAgc_config_t usedConfig;
-
- // General variables
- WebRtc_Word16 initFlag;
- WebRtc_Word16 lastError;
-
- // Target level parameters
- // Based on the above: analogTargetLevel = round((32767*10^(-22/20))^2*16/2^7)
- WebRtc_Word32 analogTargetLevel; // = RXX_BUFFER_LEN * 846805; -22 dBfs
- WebRtc_Word32 startUpperLimit; // = RXX_BUFFER_LEN * 1066064; -21 dBfs
- WebRtc_Word32 startLowerLimit; // = RXX_BUFFER_LEN * 672641; -23 dBfs
- WebRtc_Word32 upperPrimaryLimit; // = RXX_BUFFER_LEN * 1342095; -20 dBfs
- WebRtc_Word32 lowerPrimaryLimit; // = RXX_BUFFER_LEN * 534298; -24 dBfs
- WebRtc_Word32 upperSecondaryLimit;// = RXX_BUFFER_LEN * 2677832; -17 dBfs
- WebRtc_Word32 lowerSecondaryLimit;// = RXX_BUFFER_LEN * 267783; -27 dBfs
- WebRtc_UWord16 targetIdx; // Table index for corresponding target level
-#ifdef MIC_LEVEL_FEEDBACK
- WebRtc_UWord16 targetIdxOffset; // Table index offset for level compensation
-#endif
- WebRtc_Word16 analogTarget; // Digital reference level in ENV scale
-
- // Analog AGC specific variables
- WebRtc_Word32 filterState[8]; // For downsampling wb to nb
- WebRtc_Word32 upperLimit; // Upper limit for mic energy
- WebRtc_Word32 lowerLimit; // Lower limit for mic energy
- WebRtc_Word32 Rxx160w32; // Average energy for one frame
- WebRtc_Word32 Rxx16_LPw32; // Low pass filtered subframe energies
- WebRtc_Word32 Rxx160_LPw32; // Low pass filtered frame energies
- WebRtc_Word32 Rxx16_LPw32Max; // Keeps track of largest energy subframe
- WebRtc_Word32 Rxx16_vectorw32[RXX_BUFFER_LEN];// Array with subframe energies
- WebRtc_Word32 Rxx16w32_array[2][5];// Energy values of microphone signal
- WebRtc_Word32 env[2][10]; // Envelope values of subframes
-
- WebRtc_Word16 Rxx16pos; // Current position in the Rxx16_vectorw32
- WebRtc_Word16 envSum; // Filtered scaled envelope in subframes
- WebRtc_Word16 vadThreshold; // Threshold for VAD decision
- WebRtc_Word16 inActive; // Inactive time in milliseconds
- WebRtc_Word16 msTooLow; // Milliseconds of speech at a too low level
- WebRtc_Word16 msTooHigh; // Milliseconds of speech at a too high level
- WebRtc_Word16 changeToSlowMode; // Change to slow mode after some time at target
- WebRtc_Word16 firstCall; // First call to the process-function
- WebRtc_Word16 msZero; // Milliseconds of zero input
- WebRtc_Word16 msecSpeechOuterChange;// Min ms of speech between volume changes
- WebRtc_Word16 msecSpeechInnerChange;// Min ms of speech between volume changes
- WebRtc_Word16 activeSpeech; // Milliseconds of active speech
- WebRtc_Word16 muteGuardMs; // Counter to prevent mute action
- WebRtc_Word16 inQueue; // 10 ms batch indicator
-
- // Microphone level variables
- WebRtc_Word32 micRef; // Remember ref. mic level for virtual mic
- WebRtc_UWord16 gainTableIdx; // Current position in virtual gain table
- WebRtc_Word32 micGainIdx; // Gain index of mic level to increase slowly
- WebRtc_Word32 micVol; // Remember volume between frames
- WebRtc_Word32 maxLevel; // Max possible vol level, incl dig gain
- WebRtc_Word32 maxAnalog; // Maximum possible analog volume level
- WebRtc_Word32 maxInit; // Initial value of "max"
- WebRtc_Word32 minLevel; // Minimum possible volume level
- WebRtc_Word32 minOutput; // Minimum output volume level
- WebRtc_Word32 zeroCtrlMax; // Remember max gain => don't amp low input
-
- WebRtc_Word16 scale; // Scale factor for internal volume levels
-#ifdef MIC_LEVEL_FEEDBACK
- WebRtc_Word16 numBlocksMicLvlSat;
- WebRtc_UWord8 micLvlSat;
-#endif
- // Structs for VAD and digital_agc
- AgcVad_t vadMic;
- DigitalAgc_t digitalAgc;
-
-#ifdef AGC_DEBUG
- FILE* fpt;
- FILE* agcLog;
- WebRtc_Word32 fcount;
-#endif
-
- WebRtc_Word16 lowLevelSignal;
-} Agc_t;
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_AGC_MAIN_SOURCE_ANALOG_AGC_H_
diff --git a/src/modules/audio_processing/agc/main/source/digital_agc.c b/src/modules/audio_processing/agc/main/source/digital_agc.c
deleted file mode 100644
index 2966586..0000000
--- a/src/modules/audio_processing/agc/main/source/digital_agc.c
+++ /dev/null
@@ -1,780 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-/* digital_agc.c
- *
- */
-
-#include <string.h>
-#ifdef AGC_DEBUG
-#include <stdio.h>
-#endif
-#include "digital_agc.h"
-#include "gain_control.h"
-
-// To generate the gaintable, copy&paste the following lines to a Matlab window:
-// MaxGain = 6; MinGain = 0; CompRatio = 3; Knee = 1;
-// zeros = 0:31; lvl = 2.^(1-zeros);
-// A = -10*log10(lvl) * (CompRatio - 1) / CompRatio;
-// B = MaxGain - MinGain;
-// gains = round(2^16*10.^(0.05 * (MinGain + B * ( log(exp(-Knee*A)+exp(-Knee*B)) - log(1+exp(-Knee*B)) ) / log(1/(1+exp(Knee*B))))));
-// fprintf(1, '\t%i, %i, %i, %i,\n', gains);
-// % Matlab code for plotting the gain and input/output level characteristic (copy/paste the following 3 lines):
-// in = 10*log10(lvl); out = 20*log10(gains/65536);
-// subplot(121); plot(in, out); axis([-30, 0, -5, 20]); grid on; xlabel('Input (dB)'); ylabel('Gain (dB)');
-// subplot(122); plot(in, in+out); axis([-30, 0, -30, 5]); grid on; xlabel('Input (dB)'); ylabel('Output (dB)');
-// zoom on;
-
-// Generator table for y=log2(1+e^x) in Q8.
-static const WebRtc_UWord16 kGenFuncTable[128] = {
- 256, 485, 786, 1126, 1484, 1849, 2217, 2586,
- 2955, 3324, 3693, 4063, 4432, 4801, 5171, 5540,
- 5909, 6279, 6648, 7017, 7387, 7756, 8125, 8495,
- 8864, 9233, 9603, 9972, 10341, 10711, 11080, 11449,
- 11819, 12188, 12557, 12927, 13296, 13665, 14035, 14404,
- 14773, 15143, 15512, 15881, 16251, 16620, 16989, 17359,
- 17728, 18097, 18466, 18836, 19205, 19574, 19944, 20313,
- 20682, 21052, 21421, 21790, 22160, 22529, 22898, 23268,
- 23637, 24006, 24376, 24745, 25114, 25484, 25853, 26222,
- 26592, 26961, 27330, 27700, 28069, 28438, 28808, 29177,
- 29546, 29916, 30285, 30654, 31024, 31393, 31762, 32132,
- 32501, 32870, 33240, 33609, 33978, 34348, 34717, 35086,
- 35456, 35825, 36194, 36564, 36933, 37302, 37672, 38041,
- 38410, 38780, 39149, 39518, 39888, 40257, 40626, 40996,
- 41365, 41734, 42104, 42473, 42842, 43212, 43581, 43950,
- 44320, 44689, 45058, 45428, 45797, 46166, 46536, 46905
-};
-
-static const WebRtc_Word16 kAvgDecayTime = 250; // frames; < 3000
-
-WebRtc_Word32 WebRtcAgc_CalculateGainTable(WebRtc_Word32 *gainTable, // Q16
- WebRtc_Word16 digCompGaindB, // Q0
- WebRtc_Word16 targetLevelDbfs,// Q0
- WebRtc_UWord8 limiterEnable,
- WebRtc_Word16 analogTarget) // Q0
-{
- // This function generates the compressor gain table used in the fixed digital part.
- WebRtc_UWord32 tmpU32no1, tmpU32no2, absInLevel, logApprox;
- WebRtc_Word32 inLevel, limiterLvl;
- WebRtc_Word32 tmp32, tmp32no1, tmp32no2, numFIX, den, y32;
- const WebRtc_UWord16 kLog10 = 54426; // log2(10) in Q14
- const WebRtc_UWord16 kLog10_2 = 49321; // 10*log10(2) in Q14
- const WebRtc_UWord16 kLogE_1 = 23637; // log2(e) in Q14
- WebRtc_UWord16 constMaxGain;
- WebRtc_UWord16 tmpU16, intPart, fracPart;
- const WebRtc_Word16 kCompRatio = 3;
- const WebRtc_Word16 kSoftLimiterLeft = 1;
- WebRtc_Word16 limiterOffset = 0; // Limiter offset
- WebRtc_Word16 limiterIdx, limiterLvlX;
- WebRtc_Word16 constLinApprox, zeroGainLvl, maxGain, diffGain;
- WebRtc_Word16 i, tmp16, tmp16no1;
- int zeros, zerosScale;
-
- // Constants
-// kLogE_1 = 23637; // log2(e) in Q14
-// kLog10 = 54426; // log2(10) in Q14
-// kLog10_2 = 49321; // 10*log10(2) in Q14
-
- // Calculate maximum digital gain and zero gain level
- tmp32no1 = WEBRTC_SPL_MUL_16_16(digCompGaindB - analogTarget, kCompRatio - 1);
- tmp16no1 = analogTarget - targetLevelDbfs;
- tmp16no1 += WebRtcSpl_DivW32W16ResW16(tmp32no1 + (kCompRatio >> 1), kCompRatio);
- maxGain = WEBRTC_SPL_MAX(tmp16no1, (analogTarget - targetLevelDbfs));
- tmp32no1 = WEBRTC_SPL_MUL_16_16(maxGain, kCompRatio);
- zeroGainLvl = digCompGaindB;
- zeroGainLvl -= WebRtcSpl_DivW32W16ResW16(tmp32no1 + ((kCompRatio - 1) >> 1),
- kCompRatio - 1);
- if ((digCompGaindB <= analogTarget) && (limiterEnable))
- {
- zeroGainLvl += (analogTarget - digCompGaindB + kSoftLimiterLeft);
- limiterOffset = 0;
- }
-
- // Calculate the difference between maximum gain and gain at 0dB0v:
- // diffGain = maxGain + (compRatio-1)*zeroGainLvl/compRatio
- // = (compRatio-1)*digCompGaindB/compRatio
- tmp32no1 = WEBRTC_SPL_MUL_16_16(digCompGaindB, kCompRatio - 1);
- diffGain = WebRtcSpl_DivW32W16ResW16(tmp32no1 + (kCompRatio >> 1), kCompRatio);
- if (diffGain < 0)
- {
- return -1;
- }
-
- // Calculate the limiter level and index:
- // limiterLvlX = analogTarget - limiterOffset
- // limiterLvl = targetLevelDbfs + limiterOffset/compRatio
- limiterLvlX = analogTarget - limiterOffset;
- limiterIdx = 2
- + WebRtcSpl_DivW32W16ResW16(WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)limiterLvlX, 13),
- WEBRTC_SPL_RSHIFT_U16(kLog10_2, 1));
- tmp16no1 = WebRtcSpl_DivW32W16ResW16(limiterOffset + (kCompRatio >> 1), kCompRatio);
- limiterLvl = targetLevelDbfs + tmp16no1;
-
- // Calculate (through table lookup):
- // constMaxGain = log2(1+2^(log2(e)*diffGain)); (in Q8)
- constMaxGain = kGenFuncTable[diffGain]; // in Q8
-
- // Calculate a parameter used to approximate the fractional part of 2^x with a
- // piecewise linear function in Q14:
- // constLinApprox = round(3/2*(4*(3-2*sqrt(2))/(log(2)^2)-0.5)*2^14);
- constLinApprox = 22817; // in Q14
-
- // Calculate a denominator used in the exponential part to convert from dB to linear scale:
- // den = 20*constMaxGain (in Q8)
- den = WEBRTC_SPL_MUL_16_U16(20, constMaxGain); // in Q8
-
- for (i = 0; i < 32; i++)
- {
- // Calculate scaled input level (compressor):
- // inLevel = fix((-constLog10_2*(compRatio-1)*(1-i)+fix(compRatio/2))/compRatio)
- tmp16 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16(kCompRatio - 1, i - 1); // Q0
- tmp32 = WEBRTC_SPL_MUL_16_U16(tmp16, kLog10_2) + 1; // Q14
- inLevel = WebRtcSpl_DivW32W16(tmp32, kCompRatio); // Q14
-
- // Calculate diffGain-inLevel, to map using the genFuncTable
- inLevel = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)diffGain, 14) - inLevel; // Q14
-
- // Make calculations on abs(inLevel) and compensate for the sign afterwards.
- absInLevel = (WebRtc_UWord32)WEBRTC_SPL_ABS_W32(inLevel); // Q14
-
- // LUT with interpolation
- intPart = (WebRtc_UWord16)WEBRTC_SPL_RSHIFT_U32(absInLevel, 14);
- fracPart = (WebRtc_UWord16)(absInLevel & 0x00003FFF); // extract the fractional part
- tmpU16 = kGenFuncTable[intPart + 1] - kGenFuncTable[intPart]; // Q8
- tmpU32no1 = WEBRTC_SPL_UMUL_16_16(tmpU16, fracPart); // Q22
- tmpU32no1 += WEBRTC_SPL_LSHIFT_U32((WebRtc_UWord32)kGenFuncTable[intPart], 14); // Q22
- logApprox = WEBRTC_SPL_RSHIFT_U32(tmpU32no1, 8); // Q14
- // Compensate for negative exponent using the relation:
- // log2(1 + 2^-x) = log2(1 + 2^x) - x
- if (inLevel < 0)
- {
- zeros = WebRtcSpl_NormU32(absInLevel);
- zerosScale = 0;
- if (zeros < 15)
- {
- // Not enough space for multiplication
- tmpU32no2 = WEBRTC_SPL_RSHIFT_U32(absInLevel, 15 - zeros); // Q(zeros-1)
- tmpU32no2 = WEBRTC_SPL_UMUL_32_16(tmpU32no2, kLogE_1); // Q(zeros+13)
- if (zeros < 9)
- {
- tmpU32no1 = WEBRTC_SPL_RSHIFT_U32(tmpU32no1, 9 - zeros); // Q(zeros+13)
- zerosScale = 9 - zeros;
- } else
- {
- tmpU32no2 = WEBRTC_SPL_RSHIFT_U32(tmpU32no2, zeros - 9); // Q22
- }
- } else
- {
- tmpU32no2 = WEBRTC_SPL_UMUL_32_16(absInLevel, kLogE_1); // Q28
- tmpU32no2 = WEBRTC_SPL_RSHIFT_U32(tmpU32no2, 6); // Q22
- }
- logApprox = 0;
- if (tmpU32no2 < tmpU32no1)
- {
- logApprox = WEBRTC_SPL_RSHIFT_U32(tmpU32no1 - tmpU32no2, 8 - zerosScale); //Q14
- }
- }
- numFIX = WEBRTC_SPL_LSHIFT_W32(WEBRTC_SPL_MUL_16_U16(maxGain, constMaxGain), 6); // Q14
- numFIX -= WEBRTC_SPL_MUL_32_16((WebRtc_Word32)logApprox, diffGain); // Q14
-
- // Calculate ratio
- // Shift numFIX as much as possible
- zeros = WebRtcSpl_NormW32(numFIX);
- numFIX = WEBRTC_SPL_LSHIFT_W32(numFIX, zeros); // Q(14+zeros)
-
- // Shift den so we end up in Qy1
- tmp32no1 = WEBRTC_SPL_SHIFT_W32(den, zeros - 8); // Q(zeros)
- if (numFIX < 0)
- {
- numFIX -= WEBRTC_SPL_RSHIFT_W32(tmp32no1, 1);
- } else
- {
- numFIX += WEBRTC_SPL_RSHIFT_W32(tmp32no1, 1);
- }
- y32 = WEBRTC_SPL_DIV(numFIX, tmp32no1); // in Q14
- if (limiterEnable && (i < limiterIdx))
- {
- tmp32 = WEBRTC_SPL_MUL_16_U16(i - 1, kLog10_2); // Q14
- tmp32 -= WEBRTC_SPL_LSHIFT_W32(limiterLvl, 14); // Q14
- y32 = WebRtcSpl_DivW32W16(tmp32 + 10, 20);
- }
- if (y32 > 39000)
- {
- tmp32 = WEBRTC_SPL_MUL(y32 >> 1, kLog10) + 4096; // in Q27
- tmp32 = WEBRTC_SPL_RSHIFT_W32(tmp32, 13); // in Q14
- } else
- {
- tmp32 = WEBRTC_SPL_MUL(y32, kLog10) + 8192; // in Q28
- tmp32 = WEBRTC_SPL_RSHIFT_W32(tmp32, 14); // in Q14
- }
- tmp32 += WEBRTC_SPL_LSHIFT_W32(16, 14); // in Q14 (Make sure final output is in Q16)
-
- // Calculate power
- if (tmp32 > 0)
- {
- intPart = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32, 14);
- fracPart = (WebRtc_UWord16)(tmp32 & 0x00003FFF); // in Q14
- if (WEBRTC_SPL_RSHIFT_W32(fracPart, 13))
- {
- tmp16 = WEBRTC_SPL_LSHIFT_W16(2, 14) - constLinApprox;
- tmp32no2 = WEBRTC_SPL_LSHIFT_W32(1, 14) - fracPart;
- tmp32no2 = WEBRTC_SPL_MUL_32_16(tmp32no2, tmp16);
- tmp32no2 = WEBRTC_SPL_RSHIFT_W32(tmp32no2, 13);
- tmp32no2 = WEBRTC_SPL_LSHIFT_W32(1, 14) - tmp32no2;
- } else
- {
- tmp16 = constLinApprox - WEBRTC_SPL_LSHIFT_W16(1, 14);
- tmp32no2 = WEBRTC_SPL_MUL_32_16(fracPart, tmp16);
- tmp32no2 = WEBRTC_SPL_RSHIFT_W32(tmp32no2, 13);
- }
- fracPart = (WebRtc_UWord16)tmp32no2;
- gainTable[i] = WEBRTC_SPL_LSHIFT_W32(1, intPart)
- + WEBRTC_SPL_SHIFT_W32(fracPart, intPart - 14);
- } else
- {
- gainTable[i] = 0;
- }
- }
-
- return 0;
-}
-
-WebRtc_Word32 WebRtcAgc_InitDigital(DigitalAgc_t *stt, WebRtc_Word16 agcMode)
-{
-
- if (agcMode == kAgcModeFixedDigital)
- {
- // start at minimum to find correct gain faster
- stt->capacitorSlow = 0;
- } else
- {
- // start out with 0 dB gain
- stt->capacitorSlow = 134217728; // (WebRtc_Word32)(0.125f * 32768.0f * 32768.0f);
- }
- stt->capacitorFast = 0;
- stt->gain = 65536;
- stt->gatePrevious = 0;
- stt->agcMode = agcMode;
-#ifdef AGC_DEBUG
- stt->frameCounter = 0;
-#endif
-
- // initialize VADs
- WebRtcAgc_InitVad(&stt->vadNearend);
- WebRtcAgc_InitVad(&stt->vadFarend);
-
- return 0;
-}
-
-WebRtc_Word32 WebRtcAgc_AddFarendToDigital(DigitalAgc_t *stt, const WebRtc_Word16 *in_far,
- WebRtc_Word16 nrSamples)
-{
- // Check for valid pointer
- if (&stt->vadFarend == NULL)
- {
- return -1;
- }
-
- // VAD for far end
- WebRtcAgc_ProcessVad(&stt->vadFarend, in_far, nrSamples);
-
- return 0;
-}
-
-WebRtc_Word32 WebRtcAgc_ProcessDigital(DigitalAgc_t *stt, const WebRtc_Word16 *in_near,
- const WebRtc_Word16 *in_near_H, WebRtc_Word16 *out,
- WebRtc_Word16 *out_H, WebRtc_UWord32 FS,
- WebRtc_Word16 lowlevelSignal)
-{
- // array for gains (one value per ms, incl start & end)
- WebRtc_Word32 gains[11];
-
- WebRtc_Word32 out_tmp, tmp32;
- WebRtc_Word32 env[10];
- WebRtc_Word32 nrg, max_nrg;
- WebRtc_Word32 cur_level;
- WebRtc_Word32 gain32, delta;
- WebRtc_Word16 logratio;
- WebRtc_Word16 lower_thr, upper_thr;
- WebRtc_Word16 zeros, zeros_fast, frac;
- WebRtc_Word16 decay;
- WebRtc_Word16 gate, gain_adj;
- WebRtc_Word16 k, n;
- WebRtc_Word16 L, L2; // samples/subframe
-
- // determine number of samples per ms
- if (FS == 8000)
- {
- L = 8;
- L2 = 3;
- } else if (FS == 16000)
- {
- L = 16;
- L2 = 4;
- } else if (FS == 32000)
- {
- L = 16;
- L2 = 4;
- } else
- {
- return -1;
- }
-
- memcpy(out, in_near, 10 * L * sizeof(WebRtc_Word16));
- if (FS == 32000)
- {
- memcpy(out_H, in_near_H, 10 * L * sizeof(WebRtc_Word16));
- }
- // VAD for near end
- logratio = WebRtcAgc_ProcessVad(&stt->vadNearend, out, L * 10);
-
- // Account for far end VAD
- if (stt->vadFarend.counter > 10)
- {
- tmp32 = WEBRTC_SPL_MUL_16_16(3, logratio);
- logratio = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32 - stt->vadFarend.logRatio, 2);
- }
-
- // Determine decay factor depending on VAD
- // upper_thr = 1.0f;
- // lower_thr = 0.25f;
- upper_thr = 1024; // Q10
- lower_thr = 0; // Q10
- if (logratio > upper_thr)
- {
- // decay = -2^17 / DecayTime; -> -65
- decay = -65;
- } else if (logratio < lower_thr)
- {
- decay = 0;
- } else
- {
- // decay = (WebRtc_Word16)(((lower_thr - logratio)
- // * (2^27/(DecayTime*(upper_thr-lower_thr)))) >> 10);
- // SUBSTITUTED: 2^27/(DecayTime*(upper_thr-lower_thr)) -> 65
- tmp32 = WEBRTC_SPL_MUL_16_16((lower_thr - logratio), 65);
- decay = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32, 10);
- }
-
- // adjust decay factor for long silence (detected as low standard deviation)
- // This is only done in the adaptive modes
- if (stt->agcMode != kAgcModeFixedDigital)
- {
- if (stt->vadNearend.stdLongTerm < 4000)
- {
- decay = 0;
- } else if (stt->vadNearend.stdLongTerm < 8096)
- {
- // decay = (WebRtc_Word16)(((stt->vadNearend.stdLongTerm - 4000) * decay) >> 12);
- tmp32 = WEBRTC_SPL_MUL_16_16((stt->vadNearend.stdLongTerm - 4000), decay);
- decay = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32, 12);
- }
-
- if (lowlevelSignal != 0)
- {
- decay = 0;
- }
- }
-#ifdef AGC_DEBUG
- stt->frameCounter++;
- fprintf(stt->logFile, "%5.2f\t%d\t%d\t%d\t", (float)(stt->frameCounter) / 100, logratio, decay, stt->vadNearend.stdLongTerm);
-#endif
- // Find max amplitude per sub frame
- // iterate over sub frames
- for (k = 0; k < 10; k++)
- {
- // iterate over samples
- max_nrg = 0;
- for (n = 0; n < L; n++)
- {
- nrg = WEBRTC_SPL_MUL_16_16(out[k * L + n], out[k * L + n]);
- if (nrg > max_nrg)
- {
- max_nrg = nrg;
- }
- }
- env[k] = max_nrg;
- }
-
- // Calculate gain per sub frame
- gains[0] = stt->gain;
- for (k = 0; k < 10; k++)
- {
- // Fast envelope follower
- // decay time = -131000 / -1000 = 131 (ms)
- stt->capacitorFast = AGC_SCALEDIFF32(-1000, stt->capacitorFast, stt->capacitorFast);
- if (env[k] > stt->capacitorFast)
- {
- stt->capacitorFast = env[k];
- }
- // Slow envelope follower
- if (env[k] > stt->capacitorSlow)
- {
- // increase capacitorSlow
- stt->capacitorSlow
- = AGC_SCALEDIFF32(500, (env[k] - stt->capacitorSlow), stt->capacitorSlow);
- } else
- {
- // decrease capacitorSlow
- stt->capacitorSlow
- = AGC_SCALEDIFF32(decay, stt->capacitorSlow, stt->capacitorSlow);
- }
-
- // use maximum of both capacitors as current level
- if (stt->capacitorFast > stt->capacitorSlow)
- {
- cur_level = stt->capacitorFast;
- } else
- {
- cur_level = stt->capacitorSlow;
- }
- // Translate signal level into gain, using a piecewise linear approximation
- // find number of leading zeros
- zeros = WebRtcSpl_NormU32((WebRtc_UWord32)cur_level);
- if (cur_level == 0)
- {
- zeros = 31;
- }
- tmp32 = (WEBRTC_SPL_LSHIFT_W32(cur_level, zeros) & 0x7FFFFFFF);
- frac = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32, 19); // Q12
- tmp32 = WEBRTC_SPL_MUL((stt->gainTable[zeros-1] - stt->gainTable[zeros]), frac);
- gains[k + 1] = stt->gainTable[zeros] + WEBRTC_SPL_RSHIFT_W32(tmp32, 12);
-#ifdef AGC_DEBUG
- if (k == 0)
- {
- fprintf(stt->logFile, "%d\t%d\t%d\t%d\t%d\n", env[0], cur_level, stt->capacitorFast, stt->capacitorSlow, zeros);
- }
-#endif
- }
-
- // Gate processing (lower gain during absence of speech)
- zeros = WEBRTC_SPL_LSHIFT_W16(zeros, 9) - WEBRTC_SPL_RSHIFT_W16(frac, 3);
- // find number of leading zeros
- zeros_fast = WebRtcSpl_NormU32((WebRtc_UWord32)stt->capacitorFast);
- if (stt->capacitorFast == 0)
- {
- zeros_fast = 31;
- }
- tmp32 = (WEBRTC_SPL_LSHIFT_W32(stt->capacitorFast, zeros_fast) & 0x7FFFFFFF);
- zeros_fast = WEBRTC_SPL_LSHIFT_W16(zeros_fast, 9);
- zeros_fast -= (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32, 22);
-
- gate = 1000 + zeros_fast - zeros - stt->vadNearend.stdShortTerm;
-
- if (gate < 0)
- {
- stt->gatePrevious = 0;
- } else
- {
- tmp32 = WEBRTC_SPL_MUL_16_16(stt->gatePrevious, 7);
- gate = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((WebRtc_Word32)gate + tmp32, 3);
- stt->gatePrevious = gate;
- }
- // gate < 0 -> no gate
- // gate > 2500 -> max gate
- if (gate > 0)
- {
- if (gate < 2500)
- {
- gain_adj = WEBRTC_SPL_RSHIFT_W16(2500 - gate, 5);
- } else
- {
- gain_adj = 0;
- }
- for (k = 0; k < 10; k++)
- {
- if ((gains[k + 1] - stt->gainTable[0]) > 8388608)
- {
- // To prevent wraparound
- tmp32 = WEBRTC_SPL_RSHIFT_W32((gains[k+1] - stt->gainTable[0]), 8);
- tmp32 = WEBRTC_SPL_MUL(tmp32, (178 + gain_adj));
- } else
- {
- tmp32 = WEBRTC_SPL_MUL((gains[k+1] - stt->gainTable[0]), (178 + gain_adj));
- tmp32 = WEBRTC_SPL_RSHIFT_W32(tmp32, 8);
- }
- gains[k + 1] = stt->gainTable[0] + tmp32;
- }
- }
-
- // Limit gain to avoid overload distortion
- for (k = 0; k < 10; k++)
- {
- // To prevent wrap around
- zeros = 10;
- if (gains[k + 1] > 47453132)
- {
- zeros = 16 - WebRtcSpl_NormW32(gains[k + 1]);
- }
- gain32 = WEBRTC_SPL_RSHIFT_W32(gains[k+1], zeros) + 1;
- gain32 = WEBRTC_SPL_MUL(gain32, gain32);
- // check for overflow
- while (AGC_MUL32(WEBRTC_SPL_RSHIFT_W32(env[k], 12) + 1, gain32)
- > WEBRTC_SPL_SHIFT_W32((WebRtc_Word32)32767, 2 * (1 - zeros + 10)))
- {
- // multiply by 253/256 ==> -0.1 dB
- if (gains[k + 1] > 8388607)
- {
- // Prevent wrap around
- gains[k + 1] = WEBRTC_SPL_MUL(WEBRTC_SPL_RSHIFT_W32(gains[k+1], 8), 253);
- } else
- {
- gains[k + 1] = WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL(gains[k+1], 253), 8);
- }
- gain32 = WEBRTC_SPL_RSHIFT_W32(gains[k+1], zeros) + 1;
- gain32 = WEBRTC_SPL_MUL(gain32, gain32);
- }
- }
- // gain reductions should be done 1 ms earlier than gain increases
- for (k = 1; k < 10; k++)
- {
- if (gains[k] > gains[k + 1])
- {
- gains[k] = gains[k + 1];
- }
- }
- // save start gain for next frame
- stt->gain = gains[10];
-
- // Apply gain
- // handle first sub frame separately
- delta = WEBRTC_SPL_LSHIFT_W32(gains[1] - gains[0], (4 - L2));
- gain32 = WEBRTC_SPL_LSHIFT_W32(gains[0], 4);
- // iterate over samples
- for (n = 0; n < L; n++)
- {
- // For lower band
- tmp32 = WEBRTC_SPL_MUL((WebRtc_Word32)out[n], WEBRTC_SPL_RSHIFT_W32(gain32 + 127, 7));
- out_tmp = WEBRTC_SPL_RSHIFT_W32(tmp32 , 16);
- if (out_tmp > 4095)
- {
- out[n] = (WebRtc_Word16)32767;
- } else if (out_tmp < -4096)
- {
- out[n] = (WebRtc_Word16)-32768;
- } else
- {
- tmp32 = WEBRTC_SPL_MUL((WebRtc_Word32)out[n], WEBRTC_SPL_RSHIFT_W32(gain32, 4));
- out[n] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32 , 16);
- }
- // For higher band
- if (FS == 32000)
- {
- tmp32 = WEBRTC_SPL_MUL((WebRtc_Word32)out_H[n],
- WEBRTC_SPL_RSHIFT_W32(gain32 + 127, 7));
- out_tmp = WEBRTC_SPL_RSHIFT_W32(tmp32 , 16);
- if (out_tmp > 4095)
- {
- out_H[n] = (WebRtc_Word16)32767;
- } else if (out_tmp < -4096)
- {
- out_H[n] = (WebRtc_Word16)-32768;
- } else
- {
- tmp32 = WEBRTC_SPL_MUL((WebRtc_Word32)out_H[n],
- WEBRTC_SPL_RSHIFT_W32(gain32, 4));
- out_H[n] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32 , 16);
- }
- }
- //
-
- gain32 += delta;
- }
- // iterate over subframes
- for (k = 1; k < 10; k++)
- {
- delta = WEBRTC_SPL_LSHIFT_W32(gains[k+1] - gains[k], (4 - L2));
- gain32 = WEBRTC_SPL_LSHIFT_W32(gains[k], 4);
- // iterate over samples
- for (n = 0; n < L; n++)
- {
- // For lower band
- tmp32 = WEBRTC_SPL_MUL((WebRtc_Word32)out[k * L + n],
- WEBRTC_SPL_RSHIFT_W32(gain32, 4));
- out[k * L + n] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32 , 16);
- // For higher band
- if (FS == 32000)
- {
- tmp32 = WEBRTC_SPL_MUL((WebRtc_Word32)out_H[k * L + n],
- WEBRTC_SPL_RSHIFT_W32(gain32, 4));
- out_H[k * L + n] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32 , 16);
- }
- gain32 += delta;
- }
- }
-
- return 0;
-}
-
-void WebRtcAgc_InitVad(AgcVad_t *state)
-{
- WebRtc_Word16 k;
-
- state->HPstate = 0; // state of high pass filter
- state->logRatio = 0; // log( P(active) / P(inactive) )
- // average input level (Q10)
- state->meanLongTerm = WEBRTC_SPL_LSHIFT_W16(15, 10);
-
- // variance of input level (Q8)
- state->varianceLongTerm = WEBRTC_SPL_LSHIFT_W32(500, 8);
-
- state->stdLongTerm = 0; // standard deviation of input level in dB
- // short-term average input level (Q10)
- state->meanShortTerm = WEBRTC_SPL_LSHIFT_W16(15, 10);
-
- // short-term variance of input level (Q8)
- state->varianceShortTerm = WEBRTC_SPL_LSHIFT_W32(500, 8);
-
- state->stdShortTerm = 0; // short-term standard deviation of input level in dB
- state->counter = 3; // counts updates
- for (k = 0; k < 8; k++)
- {
- // downsampling filter
- state->downState[k] = 0;
- }
-}
-
-WebRtc_Word16 WebRtcAgc_ProcessVad(AgcVad_t *state, // (i) VAD state
- const WebRtc_Word16 *in, // (i) Speech signal
- WebRtc_Word16 nrSamples) // (i) number of samples
-{
- WebRtc_Word32 out, nrg, tmp32, tmp32b;
- WebRtc_UWord16 tmpU16;
- WebRtc_Word16 k, subfr, tmp16;
- WebRtc_Word16 buf1[8];
- WebRtc_Word16 buf2[4];
- WebRtc_Word16 HPstate;
- WebRtc_Word16 zeros, dB;
- WebRtc_Word16 *buf1_ptr;
-
- // process in 10 sub frames of 1 ms (to save on memory)
- nrg = 0;
- buf1_ptr = &buf1[0];
- HPstate = state->HPstate;
- for (subfr = 0; subfr < 10; subfr++)
- {
- // downsample to 4 kHz
- if (nrSamples == 160)
- {
- for (k = 0; k < 8; k++)
- {
- tmp32 = (WebRtc_Word32)in[2 * k] + (WebRtc_Word32)in[2 * k + 1];
- tmp32 = WEBRTC_SPL_RSHIFT_W32(tmp32, 1);
- buf1[k] = (WebRtc_Word16)tmp32;
- }
- in += 16;
-
- WebRtcSpl_DownsampleBy2(buf1, 8, buf2, state->downState);
- } else
- {
- WebRtcSpl_DownsampleBy2(in, 8, buf2, state->downState);
- in += 8;
- }
-
- // high pass filter and compute energy
- for (k = 0; k < 4; k++)
- {
- out = buf2[k] + HPstate;
- tmp32 = WEBRTC_SPL_MUL(600, out);
- HPstate = (WebRtc_Word16)(WEBRTC_SPL_RSHIFT_W32(tmp32, 10) - buf2[k]);
- tmp32 = WEBRTC_SPL_MUL(out, out);
- nrg += WEBRTC_SPL_RSHIFT_W32(tmp32, 6);
- }
- }
- state->HPstate = HPstate;
-
- // find number of leading zeros
- if (!(0xFFFF0000 & nrg))
- {
- zeros = 16;
- } else
- {
- zeros = 0;
- }
- if (!(0xFF000000 & (nrg << zeros)))
- {
- zeros += 8;
- }
- if (!(0xF0000000 & (nrg << zeros)))
- {
- zeros += 4;
- }
- if (!(0xC0000000 & (nrg << zeros)))
- {
- zeros += 2;
- }
- if (!(0x80000000 & (nrg << zeros)))
- {
- zeros += 1;
- }
-
- // energy level (range {-32..30}) (Q10)
- dB = WEBRTC_SPL_LSHIFT_W16(15 - zeros, 11);
-
- // Update statistics
-
- if (state->counter < kAvgDecayTime)
- {
- // decay time = AvgDecTime * 10 ms
- state->counter++;
- }
-
- // update short-term estimate of mean energy level (Q10)
- tmp32 = (WEBRTC_SPL_MUL_16_16(state->meanShortTerm, 15) + (WebRtc_Word32)dB);
- state->meanShortTerm = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32, 4);
-
- // update short-term estimate of variance in energy level (Q8)
- tmp32 = WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL_16_16(dB, dB), 12);
- tmp32 += WEBRTC_SPL_MUL(state->varianceShortTerm, 15);
- state->varianceShortTerm = WEBRTC_SPL_RSHIFT_W32(tmp32, 4);
-
- // update short-term estimate of standard deviation in energy level (Q10)
- tmp32 = WEBRTC_SPL_MUL_16_16(state->meanShortTerm, state->meanShortTerm);
- tmp32 = WEBRTC_SPL_LSHIFT_W32(state->varianceShortTerm, 12) - tmp32;
- state->stdShortTerm = (WebRtc_Word16)WebRtcSpl_Sqrt(tmp32);
-
- // update long-term estimate of mean energy level (Q10)
- tmp32 = WEBRTC_SPL_MUL_16_16(state->meanLongTerm, state->counter) + (WebRtc_Word32)dB;
- state->meanLongTerm = WebRtcSpl_DivW32W16ResW16(tmp32,
- WEBRTC_SPL_ADD_SAT_W16(state->counter, 1));
-
- // update long-term estimate of variance in energy level (Q8)
- tmp32 = WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL_16_16(dB, dB), 12);
- tmp32 += WEBRTC_SPL_MUL(state->varianceLongTerm, state->counter);
- state->varianceLongTerm = WebRtcSpl_DivW32W16(tmp32,
- WEBRTC_SPL_ADD_SAT_W16(state->counter, 1));
-
- // update long-term estimate of standard deviation in energy level (Q10)
- tmp32 = WEBRTC_SPL_MUL_16_16(state->meanLongTerm, state->meanLongTerm);
- tmp32 = WEBRTC_SPL_LSHIFT_W32(state->varianceLongTerm, 12) - tmp32;
- state->stdLongTerm = (WebRtc_Word16)WebRtcSpl_Sqrt(tmp32);
-
- // update voice activity measure (Q10)
- tmp16 = WEBRTC_SPL_LSHIFT_W16(3, 12);
- tmp32 = WEBRTC_SPL_MUL_16_16(tmp16, (dB - state->meanLongTerm));
- tmp32 = WebRtcSpl_DivW32W16(tmp32, state->stdLongTerm);
- tmpU16 = WEBRTC_SPL_LSHIFT_U16((WebRtc_UWord16)13, 12);
- tmp32b = WEBRTC_SPL_MUL_16_U16(state->logRatio, tmpU16);
- tmp32 += WEBRTC_SPL_RSHIFT_W32(tmp32b, 10);
-
- state->logRatio = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32, 6);
-
- // limit
- if (state->logRatio > 2048)
- {
- state->logRatio = 2048;
- }
- if (state->logRatio < -2048)
- {
- state->logRatio = -2048;
- }
-
- return state->logRatio; // Q10
-}
diff --git a/src/modules/audio_processing/agc/main/source/digital_agc.h b/src/modules/audio_processing/agc/main/source/digital_agc.h
deleted file mode 100644
index 240b220..0000000
--- a/src/modules/audio_processing/agc/main/source/digital_agc.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AGC_MAIN_SOURCE_DIGITAL_AGC_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC_MAIN_SOURCE_DIGITAL_AGC_H_
-
-#ifdef AGC_DEBUG
-#include <stdio.h>
-#endif
-#include "typedefs.h"
-#include "signal_processing_library.h"
-
-// the 32 most significant bits of A(19) * B(26) >> 13
-#define AGC_MUL32(A, B) (((B)>>13)*(A) + ( ((0x00001FFF & (B))*(A)) >> 13 ))
-// C + the 32 most significant bits of A * B
-#define AGC_SCALEDIFF32(A, B, C) ((C) + ((B)>>16)*(A) + ( ((0x0000FFFF & (B))*(A)) >> 16 ))
-
-typedef struct
-{
- WebRtc_Word32 downState[8];
- WebRtc_Word16 HPstate;
- WebRtc_Word16 counter;
- WebRtc_Word16 logRatio; // log( P(active) / P(inactive) ) (Q10)
- WebRtc_Word16 meanLongTerm; // Q10
- WebRtc_Word32 varianceLongTerm; // Q8
- WebRtc_Word16 stdLongTerm; // Q10
- WebRtc_Word16 meanShortTerm; // Q10
- WebRtc_Word32 varianceShortTerm; // Q8
- WebRtc_Word16 stdShortTerm; // Q10
-} AgcVad_t; // total = 54 bytes
-
-typedef struct
-{
- WebRtc_Word32 capacitorSlow;
- WebRtc_Word32 capacitorFast;
- WebRtc_Word32 gain;
- WebRtc_Word32 gainTable[32];
- WebRtc_Word16 gatePrevious;
- WebRtc_Word16 agcMode;
- AgcVad_t vadNearend;
- AgcVad_t vadFarend;
-#ifdef AGC_DEBUG
- FILE* logFile;
- int frameCounter;
-#endif
-} DigitalAgc_t;
-
-WebRtc_Word32 WebRtcAgc_InitDigital(DigitalAgc_t *digitalAgcInst, WebRtc_Word16 agcMode);
-
-WebRtc_Word32 WebRtcAgc_ProcessDigital(DigitalAgc_t *digitalAgcInst, const WebRtc_Word16 *inNear,
- const WebRtc_Word16 *inNear_H, WebRtc_Word16 *out,
- WebRtc_Word16 *out_H, WebRtc_UWord32 FS,
- WebRtc_Word16 lowLevelSignal);
-
-WebRtc_Word32 WebRtcAgc_AddFarendToDigital(DigitalAgc_t *digitalAgcInst, const WebRtc_Word16 *inFar,
- WebRtc_Word16 nrSamples);
-
-void WebRtcAgc_InitVad(AgcVad_t *vadInst);
-
-WebRtc_Word16 WebRtcAgc_ProcessVad(AgcVad_t *vadInst, // (i) VAD state
- const WebRtc_Word16 *in, // (i) Speech signal
- WebRtc_Word16 nrSamples); // (i) number of samples
-
-WebRtc_Word32 WebRtcAgc_CalculateGainTable(WebRtc_Word32 *gainTable, // Q16
- WebRtc_Word16 compressionGaindB, // Q0 (in dB)
- WebRtc_Word16 targetLevelDbfs,// Q0 (in dB)
- WebRtc_UWord8 limiterEnable, WebRtc_Word16 analogTarget);
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_AGC_MAIN_SOURCE_ANALOG_AGC_H_
diff --git a/src/modules/audio_processing/main/apm_tests.gyp b/src/modules/audio_processing/main/apm_tests.gyp
deleted file mode 100644
index 441abeb..0000000
--- a/src/modules/audio_processing/main/apm_tests.gyp
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-{
- 'includes': [
- '../../../common_settings.gypi',
- ],
- 'targets': [
- {
- 'target_name': 'unit_test',
- 'type': 'executable',
- 'dependencies': [
- 'source/apm.gyp:audio_processing',
- '../../../system_wrappers/source/system_wrappers.gyp:system_wrappers',
- '../../../common_audio/signal_processing_library/main/source/spl.gyp:spl',
-
- '../../../../testing/gtest.gyp:gtest',
- '../../../../testing/gtest.gyp:gtest_main',
- '../../../../third_party/protobuf/protobuf.gyp:protobuf_lite',
- ],
- 'include_dirs': [
- '../../../../testing/gtest/include',
- ],
- 'sources': [
- 'test/unit_test/unit_test.cc',
- 'test/unit_test/audio_processing_unittest.pb.cc',
- 'test/unit_test/audio_processing_unittest.pb.h',
- ],
- },
- {
- 'target_name': 'process_test',
- 'type': 'executable',
- 'dependencies': [
- 'source/apm.gyp:audio_processing',
- '../../../system_wrappers/source/system_wrappers.gyp:system_wrappers',
-
- '../../../../testing/gtest.gyp:gtest',
- '../../../../testing/gtest.gyp:gtest_main',
- ],
- 'include_dirs': [
- '../../../../testing/gtest/include',
- ],
- 'sources': [
- 'test/process_test/process_test.cc',
- ],
- },
-
- ],
-}
-
-# Local Variables:
-# tab-width:2
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/src/modules/audio_processing/main/interface/audio_processing.h b/src/modules/audio_processing/main/interface/audio_processing.h
deleted file mode 100644
index dc9c232..0000000
--- a/src/modules/audio_processing/main/interface/audio_processing.h
+++ /dev/null
@@ -1,564 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_INTERFACE_AUDIO_PROCESSING_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_INTERFACE_AUDIO_PROCESSING_H_
-
-#include "typedefs.h"
-#include "module.h"
-
-namespace webrtc {
-
-class AudioFrame;
-class EchoCancellation;
-class EchoControlMobile;
-class GainControl;
-class HighPassFilter;
-class LevelEstimator;
-class NoiseSuppression;
-class VoiceDetection;
-
-// The Audio Processing Module (APM) provides a collection of voice processing
-// components designed for real-time communications software.
-//
-// APM operates on two audio streams on a frame-by-frame basis. Frames of the
-// primary stream, on which all processing is applied, are passed to
-// |ProcessStream()|. Frames of the reverse direction stream, which are used for
-// analysis by some components, are passed to |AnalyzeReverseStream()|. On the
-// client-side, this will typically be the near-end (capture) and far-end
-// (render) streams, respectively. APM should be placed in the signal chain as
-// close to the audio hardware abstraction layer (HAL) as possible.
-//
-// On the server-side, the reverse stream will normally not be used, with
-// processing occurring on each incoming stream.
-//
-// Component interfaces follow a similar pattern and are accessed through
-// corresponding getters in APM. All components are disabled at create-time,
-// with default settings that are recommended for most situations. New settings
-// can be applied without enabling a component. Enabling a component triggers
-// memory allocation and initialization to allow it to start processing the
-// streams.
-//
-// Thread safety is provided with the following assumptions to reduce locking
-// overhead:
-// 1. The stream getters and setters are called from the same thread as
-// ProcessStream(). More precisely, stream functions are never called
-// concurrently with ProcessStream().
-// 2. Parameter getters are never called concurrently with the corresponding
-// setter.
-//
-// APM accepts only 16-bit linear PCM audio data in frames of 10 ms. Multiple
-// channels should be interleaved.
-//
-// Usage example, omitting error checking:
-// AudioProcessing* apm = AudioProcessing::Create(0);
-// apm->set_sample_rate_hz(32000); // Super-wideband processing.
-//
-// // Mono capture and stereo render.
-// apm->set_num_channels(1, 1);
-// apm->set_num_reverse_channels(2);
-//
-// apm->high_pass_filter()->Enable(true);
-//
-// apm->echo_cancellation()->enable_drift_compensation(false);
-// apm->echo_cancellation()->Enable(true);
-//
-// apm->noise_reduction()->set_level(kHighSuppression);
-// apm->noise_reduction()->Enable(true);
-//
-// apm->gain_control()->set_analog_level_limits(0, 255);
-// apm->gain_control()->set_mode(kAdaptiveAnalog);
-// apm->gain_control()->Enable(true);
-//
-// apm->voice_detection()->Enable(true);
-//
-// // Start a voice call...
-//
-// // ... Render frame arrives bound for the audio HAL ...
-// apm->AnalyzeReverseStream(render_frame);
-//
-// // ... Capture frame arrives from the audio HAL ...
-// // Call required set_stream_ functions.
-// apm->set_stream_delay_ms(delay_ms);
-// apm->gain_control()->set_stream_analog_level(analog_level);
-//
-// apm->ProcessStream(capture_frame);
-//
-// // Call required stream_ functions.
-// analog_level = apm->gain_control()->stream_analog_level();
-// has_voice = apm->stream_has_voice();
-//
-// // Repeate render and capture processing for the duration of the call...
-// // Start a new call...
-// apm->Initialize();
-//
-// // Close the application...
-// AudioProcessing::Destroy(apm);
-// apm = NULL;
-//
-class AudioProcessing : public Module {
- public:
- // Creates a APM instance, with identifier |id|. Use one instance for every
- // primary audio stream requiring processing. On the client-side, this would
- // typically be one instance for the near-end stream, and additional instances
- // for each far-end stream which requires processing. On the server-side,
- // this would typically be one instance for every incoming stream.
- static AudioProcessing* Create(int id);
-
- // Destroys a |apm| instance.
- static void Destroy(AudioProcessing* apm);
-
- // Initializes internal states, while retaining all user settings. This
- // should be called before beginning to process a new audio stream. However,
- // it is not necessary to call before processing the first stream after
- // creation.
- virtual int Initialize() = 0;
-
- // Sets the sample |rate| in Hz for both the primary and reverse audio
- // streams. 8000, 16000 or 32000 Hz are permitted.
- virtual int set_sample_rate_hz(int rate) = 0;
- virtual int sample_rate_hz() const = 0;
-
- // Sets the number of channels for the primary audio stream. Input frames must
- // contain a number of channels given by |input_channels|, while output frames
- // will be returned with number of channels given by |output_channels|.
- virtual int set_num_channels(int input_channels, int output_channels) = 0;
- virtual int num_input_channels() const = 0;
- virtual int num_output_channels() const = 0;
-
- // Sets the number of channels for the reverse audio stream. Input frames must
- // contain a number of channels given by |channels|.
- virtual int set_num_reverse_channels(int channels) = 0;
- virtual int num_reverse_channels() const = 0;
-
- // Processes a 10 ms |frame| of the primary audio stream. On the client-side,
- // this is the near-end (or captured) audio.
- //
- // If needed for enabled functionality, any function with the set_stream_ tag
- // must be called prior to processing the current frame. Any getter function
- // with the stream_ tag which is needed should be called after processing.
- //
- // The |_frequencyInHz|, |_audioChannel|, and |_payloadDataLengthInSamples|
- // members of |frame| must be valid, and correspond to settings supplied
- // to APM.
- virtual int ProcessStream(AudioFrame* frame) = 0;
-
- // Analyzes a 10 ms |frame| of the reverse direction audio stream. The frame
- // will not be modified. On the client-side, this is the far-end (or to be
- // rendered) audio.
- //
- // It is only necessary to provide this if echo processing is enabled, as the
- // reverse stream forms the echo reference signal. It is recommended, but not
- // necessary, to provide if gain control is enabled. On the server-side this
- // typically will not be used. If you're not sure what to pass in here,
- // chances are you don't need to use it.
- //
- // The |_frequencyInHz|, |_audioChannel|, and |_payloadDataLengthInSamples|
- // members of |frame| must be valid.
- //
- // TODO(ajm): add const to input; requires an implementation fix.
- virtual int AnalyzeReverseStream(AudioFrame* frame) = 0;
-
- // This must be called if and only if echo processing is enabled.
- //
- // Sets the |delay| in ms between AnalyzeReverseStream() receiving a far-end
- // frame and ProcessStream() receiving a near-end frame containing the
- // corresponding echo. On the client-side this can be expressed as
- // delay = (t_render - t_analyze) + (t_process - t_capture)
- // where,
- // - t_analyze is the time a frame is passed to AnalyzeReverseStream() and
- // t_render is the time the first sample of the same frame is rendered by
- // the audio hardware.
- // - t_capture is the time the first sample of a frame is captured by the
- // audio hardware and t_pull is the time the same frame is passed to
- // ProcessStream().
- virtual int set_stream_delay_ms(int delay) = 0;
- virtual int stream_delay_ms() const = 0;
-
- // Starts recording debugging information to a file specified by |filename|,
- // a NULL-terminated string. If there is an ongoing recording, the old file
- // will be closed, and recording will continue in the newly specified file.
- // An already existing file will be overwritten without warning.
- static const int kMaxFilenameSize = 1024;
- virtual int StartDebugRecording(const char filename[kMaxFilenameSize]) = 0;
-
- // Stops recording debugging information, and closes the file. Recording
- // cannot be resumed in the same file (without overwriting it).
- virtual int StopDebugRecording() = 0;
-
- // These provide access to the component interfaces and should never return
- // NULL. The pointers will be valid for the lifetime of the APM instance.
- // The memory for these objects is entirely managed internally.
- virtual EchoCancellation* echo_cancellation() const = 0;
- virtual EchoControlMobile* echo_control_mobile() const = 0;
- virtual GainControl* gain_control() const = 0;
- virtual HighPassFilter* high_pass_filter() const = 0;
- virtual LevelEstimator* level_estimator() const = 0;
- virtual NoiseSuppression* noise_suppression() const = 0;
- virtual VoiceDetection* voice_detection() const = 0;
-
- struct Statistic {
- int instant; // Instantaneous value.
- int average; // Long-term average.
- int maximum; // Long-term maximum.
- int minimum; // Long-term minimum.
- };
-
- // Fatal errors.
- enum Errors {
- kNoError = 0,
- kUnspecifiedError = -1,
- kCreationFailedError = -2,
- kUnsupportedComponentError = -3,
- kUnsupportedFunctionError = -4,
- kNullPointerError = -5,
- kBadParameterError = -6,
- kBadSampleRateError = -7,
- kBadDataLengthError = -8,
- kBadNumberChannelsError = -9,
- kFileError = -10,
- kStreamParameterNotSetError = -11,
- kNotEnabledError = -12
- };
-
- // Warnings are non-fatal.
- enum Warnings {
- // This results when a set_stream_ parameter is out of range. Processing
- // will continue, but the parameter may have been truncated.
- kBadStreamParameterWarning = -13,
- };
-
- // Inherited from Module.
- virtual WebRtc_Word32 TimeUntilNextProcess() { return -1; };
- virtual WebRtc_Word32 Process() { return -1; };
-
- protected:
- virtual ~AudioProcessing() {};
-};
-
-// The acoustic echo cancellation (AEC) component provides better performance
-// than AECM but also requires more processing power and is dependent on delay
-// stability and reporting accuracy. As such it is well-suited and recommended
-// for PC and IP phone applications.
-//
-// Not recommended to be enabled on the server-side.
-class EchoCancellation {
- public:
- // EchoCancellation and EchoControlMobile may not be enabled simultaneously.
- // Enabling one will disable the other.
- virtual int Enable(bool enable) = 0;
- virtual bool is_enabled() const = 0;
-
- // Differences in clock speed on the primary and reverse streams can impact
- // the AEC performance. On the client-side, this could be seen when different
- // render and capture devices are used, particularly with webcams.
- //
- // This enables a compensation mechanism, and requires that
- // |set_device_sample_rate_hz()| and |set_stream_drift_samples()| be called.
- virtual int enable_drift_compensation(bool enable) = 0;
- virtual bool is_drift_compensation_enabled() const = 0;
-
- // Provides the sampling rate of the audio devices. It is assumed the render
- // and capture devices use the same nominal sample rate. Required if and only
- // if drift compensation is enabled.
- virtual int set_device_sample_rate_hz(int rate) = 0;
- virtual int device_sample_rate_hz() const = 0;
-
- // Sets the difference between the number of samples rendered and captured by
- // the audio devices since the last call to |ProcessStream()|. Must be called
- // if and only if drift compensation is enabled, prior to |ProcessStream()|.
- virtual int set_stream_drift_samples(int drift) = 0;
- virtual int stream_drift_samples() const = 0;
-
- enum SuppressionLevel {
- kLowSuppression,
- kModerateSuppression,
- kHighSuppression
- };
-
- // Sets the aggressiveness of the suppressor. A higher level trades off
- // double-talk performance for increased echo suppression.
- virtual int set_suppression_level(SuppressionLevel level) = 0;
- virtual SuppressionLevel suppression_level() const = 0;
-
- // Returns false if the current frame almost certainly contains no echo
- // and true if it _might_ contain echo.
- virtual bool stream_has_echo() const = 0;
-
- // Enables the computation of various echo metrics. These are obtained
- // through |GetMetrics()|.
- virtual int enable_metrics(bool enable) = 0;
- virtual bool are_metrics_enabled() const = 0;
-
- // Each statistic is reported in dB.
- // P_far: Far-end (render) signal power.
- // P_echo: Near-end (capture) echo signal power.
- // P_out: Signal power at the output of the AEC.
- // P_a: Internal signal power at the point before the AEC's non-linear
- // processor.
- struct Metrics {
- // RERL = ERL + ERLE
- AudioProcessing::Statistic residual_echo_return_loss;
-
- // ERL = 10log_10(P_far / P_echo)
- AudioProcessing::Statistic echo_return_loss;
-
- // ERLE = 10log_10(P_echo / P_out)
- AudioProcessing::Statistic echo_return_loss_enhancement;
-
- // (Pre non-linear processing suppression) A_NLP = 10log_10(P_echo / P_a)
- AudioProcessing::Statistic a_nlp;
- };
-
- // TODO(ajm): discuss the metrics update period.
- virtual int GetMetrics(Metrics* metrics) = 0;
-
- protected:
- virtual ~EchoCancellation() {};
-};
-
-// The acoustic echo control for mobile (AECM) component is a low complexity
-// robust option intended for use on mobile devices.
-//
-// Not recommended to be enabled on the server-side.
-class EchoControlMobile {
- public:
- // EchoCancellation and EchoControlMobile may not be enabled simultaneously.
- // Enabling one will disable the other.
- virtual int Enable(bool enable) = 0;
- virtual bool is_enabled() const = 0;
-
- // Recommended settings for particular audio routes. In general, the louder
- // the echo is expected to be, the higher this value should be set. The
- // preferred setting may vary from device to device.
- enum RoutingMode {
- kQuietEarpieceOrHeadset,
- kEarpiece,
- kLoudEarpiece,
- kSpeakerphone,
- kLoudSpeakerphone
- };
-
- // Sets echo control appropriate for the audio routing |mode| on the device.
- // It can and should be updated during a call if the audio routing changes.
- virtual int set_routing_mode(RoutingMode mode) = 0;
- virtual RoutingMode routing_mode() const = 0;
-
- // Comfort noise replaces suppressed background noise to maintain a
- // consistent signal level.
- virtual int enable_comfort_noise(bool enable) = 0;
- virtual bool is_comfort_noise_enabled() const = 0;
-
- protected:
- virtual ~EchoControlMobile() {};
-};
-
-// The automatic gain control (AGC) component brings the signal to an
-// appropriate range. This is done by applying a digital gain directly and, in
-// the analog mode, prescribing an analog gain to be applied at the audio HAL.
-//
-// Recommended to be enabled on the client-side.
-class GainControl {
- public:
- virtual int Enable(bool enable) = 0;
- virtual bool is_enabled() const = 0;
-
- // When an analog mode is set, this must be called prior to |ProcessStream()|
- // to pass the current analog level from the audio HAL. Must be within the
- // range provided to |set_analog_level_limits()|.
- virtual int set_stream_analog_level(int level) = 0;
-
- // When an analog mode is set, this should be called after |ProcessStream()|
- // to obtain the recommended new analog level for the audio HAL. It is the
- // users responsibility to apply this level.
- virtual int stream_analog_level() = 0;
-
- enum Mode {
- // Adaptive mode intended for use if an analog volume control is available
- // on the capture device. It will require the user to provide coupling
- // between the OS mixer controls and AGC through the |stream_analog_level()|
- // functions.
- //
- // It consists of an analog gain prescription for the audio device and a
- // digital compression stage.
- kAdaptiveAnalog,
-
- // Adaptive mode intended for situations in which an analog volume control
- // is unavailable. It operates in a similar fashion to the adaptive analog
- // mode, but with scaling instead applied in the digital domain. As with
- // the analog mode, it additionally uses a digital compression stage.
- kAdaptiveDigital,
-
- // Fixed mode which enables only the digital compression stage also used by
- // the two adaptive modes.
- //
- // It is distinguished from the adaptive modes by considering only a
- // short time-window of the input signal. It applies a fixed gain through
- // most of the input level range, and compresses (gradually reduces gain
- // with increasing level) the input signal at higher levels. This mode is
- // preferred on embedded devices where the capture signal level is
- // predictable, so that a known gain can be applied.
- kFixedDigital
- };
-
- virtual int set_mode(Mode mode) = 0;
- virtual Mode mode() const = 0;
-
- // Sets the target peak |level| (or envelope) of the AGC in dBFs (decibels
- // from digital full-scale). The convention is to use positive values. For
- // instance, passing in a value of 3 corresponds to -3 dBFs, or a target
- // level 3 dB below full-scale. Limited to [0, 31].
- //
- // TODO(ajm): use a negative value here instead, if/when VoE will similarly
- // update its interface.
- virtual int set_target_level_dbfs(int level) = 0;
- virtual int target_level_dbfs() const = 0;
-
- // Sets the maximum |gain| the digital compression stage may apply, in dB. A
- // higher number corresponds to greater compression, while a value of 0 will
- // leave the signal uncompressed. Limited to [0, 90].
- virtual int set_compression_gain_db(int gain) = 0;
- virtual int compression_gain_db() const = 0;
-
- // When enabled, the compression stage will hard limit the signal to the
- // target level. Otherwise, the signal will be compressed but not limited
- // above the target level.
- virtual int enable_limiter(bool enable) = 0;
- virtual bool is_limiter_enabled() const = 0;
-
- // Sets the |minimum| and |maximum| analog levels of the audio capture device.
- // Must be set if and only if an analog mode is used. Limited to [0, 65535].
- virtual int set_analog_level_limits(int minimum,
- int maximum) = 0;
- virtual int analog_level_minimum() const = 0;
- virtual int analog_level_maximum() const = 0;
-
- // Returns true if the AGC has detected a saturation event (period where the
- // signal reaches digital full-scale) in the current frame and the analog
- // level cannot be reduced.
- //
- // This could be used as an indicator to reduce or disable analog mic gain at
- // the audio HAL.
- virtual bool stream_is_saturated() const = 0;
-
- protected:
- virtual ~GainControl() {};
-};
-
-// A filtering component which removes DC offset and low-frequency noise.
-// Recommended to be enabled on the client-side.
-class HighPassFilter {
- public:
- virtual int Enable(bool enable) = 0;
- virtual bool is_enabled() const = 0;
-
- protected:
- virtual ~HighPassFilter() {};
-};
-
-// An estimation component used to retrieve level metrics.
-class LevelEstimator {
- public:
- virtual int Enable(bool enable) = 0;
- virtual bool is_enabled() const = 0;
-
- // The metrics are reported in dBFs calculated as:
- // Level = 10log_10(P_s / P_max) [dBFs], where
- // P_s is the signal power and P_max is the maximum possible (or peak)
- // power. With 16-bit signals, P_max = (2^15)^2.
- struct Metrics {
- AudioProcessing::Statistic signal; // Overall signal level.
- AudioProcessing::Statistic speech; // Speech level.
- AudioProcessing::Statistic noise; // Noise level.
- };
-
- virtual int GetMetrics(Metrics* metrics, Metrics* reverse_metrics) = 0;
-
- //virtual int enable_noise_warning(bool enable) = 0;
- //bool is_noise_warning_enabled() const = 0;
- //virtual bool stream_has_high_noise() const = 0;
-
- protected:
- virtual ~LevelEstimator() {};
-};
-
-// The noise suppression (NS) component attempts to remove noise while
-// retaining speech. Recommended to be enabled on the client-side.
-//
-// Recommended to be enabled on the client-side.
-class NoiseSuppression {
- public:
- virtual int Enable(bool enable) = 0;
- virtual bool is_enabled() const = 0;
-
- // Determines the aggressiveness of the suppression. Increasing the level
- // will reduce the noise level at the expense of a higher speech distortion.
- enum Level {
- kLow,
- kModerate,
- kHigh,
- kVeryHigh
- };
-
- virtual int set_level(Level level) = 0;
- virtual Level level() const = 0;
-
- protected:
- virtual ~NoiseSuppression() {};
-};
-
-// The voice activity detection (VAD) component analyzes the stream to
-// determine if voice is present. A facility is also provided to pass in an
-// external VAD decision.
-class VoiceDetection {
- public:
- virtual int Enable(bool enable) = 0;
- virtual bool is_enabled() const = 0;
-
- // Returns true if voice is detected in the current frame. Should be called
- // after |ProcessStream()|.
- virtual bool stream_has_voice() const = 0;
-
- // Some of the APM functionality requires a VAD decision. In the case that
- // a decision is externally available for the current frame, it can be passed
- // in here, before |ProcessStream()| is called.
- //
- // VoiceDetection does _not_ need to be enabled to use this. If it happens to
- // be enabled, detection will be skipped for any frame in which an external
- // VAD decision is provided.
- virtual int set_stream_has_voice(bool has_voice) = 0;
-
- // Specifies the likelihood that a frame will be declared to contain voice.
- // A higher value makes it more likely that speech will not be clipped, at
- // the expense of more noise being detected as voice.
- enum Likelihood {
- kVeryLowLikelihood,
- kLowLikelihood,
- kModerateLikelihood,
- kHighLikelihood
- };
-
- virtual int set_likelihood(Likelihood likelihood) = 0;
- virtual Likelihood likelihood() const = 0;
-
- // Sets the |size| of the frames in ms on which the VAD will operate. Larger
- // frames will improve detection accuracy, but reduce the frequency of
- // updates.
- //
- // This does not impact the size of frames passed to |ProcessStream()|.
- virtual int set_frame_size_ms(int size) = 0;
- virtual int frame_size_ms() const = 0;
-
- protected:
- virtual ~VoiceDetection() {};
-};
-} // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_INTERFACE_AUDIO_PROCESSING_H_
diff --git a/src/modules/audio_processing/main/source/Android.mk b/src/modules/audio_processing/main/source/Android.mk
deleted file mode 100644
index 12c7bc7..0000000
--- a/src/modules/audio_processing/main/source/Android.mk
+++ /dev/null
@@ -1,72 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_ARM_MODE := arm
-LOCAL_MODULE := libwebrtc_apm
-LOCAL_MODULE_TAGS := optional
-LOCAL_CPP_EXTENSION := .cc
-LOCAL_GENERATED_SOURCES :=
-LOCAL_SRC_FILES := audio_buffer.cc \
- audio_processing_impl.cc \
- echo_cancellation_impl.cc \
- echo_control_mobile_impl.cc \
- gain_control_impl.cc \
- high_pass_filter_impl.cc \
- level_estimator_impl.cc \
- noise_suppression_impl.cc \
- splitting_filter.cc \
- processing_component.cc \
- voice_detection_impl.cc
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS :=
-MY_CFLAGS_C :=
-MY_DEFS := '-DNO_TCMALLOC' \
- '-DNO_HEAPCHECKER' \
- '-DWEBRTC_TARGET_PC' \
- '-DWEBRTC_LINUX' \
- '-DWEBRTC_THREAD_RR' \
- '-DWEBRTC_ANDROID' \
- '-DANDROID' \
- '-DWEBRTC_NS_FIXED'
-# floating point
-# -DWEBRTC_NS_FLOAT'
-LOCAL_CFLAGS := $(MY_CFLAGS_C) $(MY_CFLAGS) $(MY_DEFS)
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../.. \
- $(LOCAL_PATH)/../interface \
- $(LOCAL_PATH)/../../../interface \
- $(LOCAL_PATH)/../../../../system_wrappers/interface \
- $(LOCAL_PATH)/../../aec/main/interface \
- $(LOCAL_PATH)/../../aecm/main/interface \
- $(LOCAL_PATH)/../../agc/main/interface \
- $(LOCAL_PATH)/../../ns/main/interface \
- $(LOCAL_PATH)/../../../../common_audio/signal_processing_library/main/interface \
- $(LOCAL_PATH)/../../../../common_audio/vad/main/interface
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS :=
-
-LOCAL_LDFLAGS :=
-
-LOCAL_STATIC_LIBRARIES :=
-
-LOCAL_SHARED_LIBRARIES := libcutils \
- libdl \
- libstlport
-
-LOCAL_ADDITIONAL_DEPENDENCIES :=
-
-include external/stlport/libstlport.mk
-include $(BUILD_STATIC_LIBRARY)
-
diff --git a/src/modules/audio_processing/main/source/apm.gyp b/src/modules/audio_processing/main/source/apm.gyp
deleted file mode 100644
index 93811c7..0000000
--- a/src/modules/audio_processing/main/source/apm.gyp
+++ /dev/null
@@ -1,77 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-{
- 'includes': [
- '../../../../common_settings.gypi', # Common settings
- ],
- 'targets': [
- {
- 'target_name': 'audio_processing',
- 'type': '<(library)',
- 'conditions': [
- ['prefer_fixed_point==1', {
- 'dependencies': ['../../ns/main/source/ns.gyp:ns_fix'],
- 'defines': ['WEBRTC_NS_FIXED'],
- }, { # else: prefer_fixed_point==0
- 'dependencies': ['../../ns/main/source/ns.gyp:ns'],
- 'defines': ['WEBRTC_NS_FLOAT'],
- }],
- ],
- 'dependencies': [
- '../../../../system_wrappers/source/system_wrappers.gyp:system_wrappers',
- '../../aec/main/source/aec.gyp:aec',
- '../../aecm/main/source/aecm.gyp:aecm',
- '../../agc/main/source/agc.gyp:agc',
- '../../../../common_audio/signal_processing_library/main/source/spl.gyp:spl',
- '../../../../common_audio/vad/main/source/vad.gyp:vad',
- ],
- 'include_dirs': [
- '../interface',
- '../../../interface',
- ],
- 'direct_dependent_settings': {
- 'include_dirs': [
- '../interface',
- '../../../interface',
- ],
- },
- 'sources': [
- '../interface/audio_processing.h',
- 'audio_buffer.cc',
- 'audio_buffer.h',
- 'audio_processing_impl.cc',
- 'audio_processing_impl.h',
- 'echo_cancellation_impl.cc',
- 'echo_cancellation_impl.h',
- 'echo_control_mobile_impl.cc',
- 'echo_control_mobile_impl.h',
- 'gain_control_impl.cc',
- 'gain_control_impl.h',
- 'high_pass_filter_impl.cc',
- 'high_pass_filter_impl.h',
- 'level_estimator_impl.cc',
- 'level_estimator_impl.h',
- 'noise_suppression_impl.cc',
- 'noise_suppression_impl.h',
- 'splitting_filter.cc',
- 'splitting_filter.h',
- 'processing_component.cc',
- 'processing_component.h',
- 'voice_detection_impl.cc',
- 'voice_detection_impl.h',
- ],
- },
- ],
-}
-
-# Local Variables:
-# tab-width:2
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/src/modules/audio_processing/main/source/audio_buffer.cc b/src/modules/audio_processing/main/source/audio_buffer.cc
deleted file mode 100644
index 6b20fce..0000000
--- a/src/modules/audio_processing/main/source/audio_buffer.cc
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "audio_buffer.h"
-
-#include "module_common_types.h"
-
-namespace webrtc {
-namespace {
-
-enum {
- kSamplesPer8kHzChannel = 80,
- kSamplesPer16kHzChannel = 160,
- kSamplesPer32kHzChannel = 320
-};
-
-void StereoToMono(const WebRtc_Word16* left, const WebRtc_Word16* right,
- WebRtc_Word16* out, int samples_per_channel) {
- WebRtc_Word32 data_int32 = 0;
- for (int i = 0; i < samples_per_channel; i++) {
- data_int32 = (left[i] + right[i]) >> 1;
- if (data_int32 > 32767) {
- data_int32 = 32767;
- } else if (data_int32 < -32768) {
- data_int32 = -32768;
- }
-
- out[i] = static_cast<WebRtc_Word16>(data_int32);
- }
-}
-} // namespace
-
-struct AudioChannel {
- AudioChannel() {
- memset(data, 0, sizeof(data));
- }
-
- WebRtc_Word16 data[kSamplesPer32kHzChannel];
-};
-
-struct SplitAudioChannel {
- SplitAudioChannel() {
- memset(low_pass_data, 0, sizeof(low_pass_data));
- memset(high_pass_data, 0, sizeof(high_pass_data));
- memset(analysis_filter_state1, 0, sizeof(analysis_filter_state1));
- memset(analysis_filter_state2, 0, sizeof(analysis_filter_state2));
- memset(synthesis_filter_state1, 0, sizeof(synthesis_filter_state1));
- memset(synthesis_filter_state2, 0, sizeof(synthesis_filter_state2));
- }
-
- WebRtc_Word16 low_pass_data[kSamplesPer16kHzChannel];
- WebRtc_Word16 high_pass_data[kSamplesPer16kHzChannel];
-
- WebRtc_Word32 analysis_filter_state1[6];
- WebRtc_Word32 analysis_filter_state2[6];
- WebRtc_Word32 synthesis_filter_state1[6];
- WebRtc_Word32 synthesis_filter_state2[6];
-};
-
-// TODO(am): check range of input parameters?
-AudioBuffer::AudioBuffer(WebRtc_Word32 max_num_channels,
- WebRtc_Word32 samples_per_channel)
- : max_num_channels_(max_num_channels),
- num_channels_(0),
- num_mixed_channels_(0),
- num_mixed_low_pass_channels_(0),
- samples_per_channel_(samples_per_channel),
- samples_per_split_channel_(samples_per_channel),
- reference_copied_(false),
- data_(NULL),
- channels_(NULL),
- split_channels_(NULL),
- mixed_low_pass_channels_(NULL),
- low_pass_reference_channels_(NULL) {
- if (max_num_channels_ > 1) {
- channels_ = new AudioChannel[max_num_channels_];
- mixed_low_pass_channels_ = new AudioChannel[max_num_channels_];
- }
- low_pass_reference_channels_ = new AudioChannel[max_num_channels_];
-
- if (samples_per_channel_ == kSamplesPer32kHzChannel) {
- split_channels_ = new SplitAudioChannel[max_num_channels_];
- samples_per_split_channel_ = kSamplesPer16kHzChannel;
- }
-}
-
-AudioBuffer::~AudioBuffer() {
- if (channels_ != NULL) {
- delete [] channels_;
- }
-
- if (mixed_low_pass_channels_ != NULL) {
- delete [] mixed_low_pass_channels_;
- }
-
- if (low_pass_reference_channels_ != NULL) {
- delete [] low_pass_reference_channels_;
- }
-
- if (split_channels_ != NULL) {
- delete [] split_channels_;
- }
-}
-
-WebRtc_Word16* AudioBuffer::data(WebRtc_Word32 channel) const {
- assert(channel >= 0 && channel < num_channels_);
- if (data_ != NULL) {
- return data_;
- }
-
- return channels_[channel].data;
-}
-
-WebRtc_Word16* AudioBuffer::low_pass_split_data(WebRtc_Word32 channel) const {
- assert(channel >= 0 && channel < num_channels_);
- if (split_channels_ == NULL) {
- return data(channel);
- }
-
- return split_channels_[channel].low_pass_data;
-}
-
-WebRtc_Word16* AudioBuffer::high_pass_split_data(WebRtc_Word32 channel) const {
- assert(channel >= 0 && channel < num_channels_);
- if (split_channels_ == NULL) {
- return NULL;
- }
-
- return split_channels_[channel].high_pass_data;
-}
-
-WebRtc_Word16* AudioBuffer::mixed_low_pass_data(WebRtc_Word32 channel) const {
- assert(channel >= 0 && channel < num_mixed_low_pass_channels_);
-
- return mixed_low_pass_channels_[channel].data;
-}
-
-WebRtc_Word16* AudioBuffer::low_pass_reference(WebRtc_Word32 channel) const {
- assert(channel >= 0 && channel < num_channels_);
- if (!reference_copied_) {
- return NULL;
- }
-
- return low_pass_reference_channels_[channel].data;
-}
-
-WebRtc_Word32* AudioBuffer::analysis_filter_state1(WebRtc_Word32 channel) const {
- assert(channel >= 0 && channel < num_channels_);
- return split_channels_[channel].analysis_filter_state1;
-}
-
-WebRtc_Word32* AudioBuffer::analysis_filter_state2(WebRtc_Word32 channel) const {
- assert(channel >= 0 && channel < num_channels_);
- return split_channels_[channel].analysis_filter_state2;
-}
-
-WebRtc_Word32* AudioBuffer::synthesis_filter_state1(WebRtc_Word32 channel) const {
- assert(channel >= 0 && channel < num_channels_);
- return split_channels_[channel].synthesis_filter_state1;
-}
-
-WebRtc_Word32* AudioBuffer::synthesis_filter_state2(WebRtc_Word32 channel) const {
- assert(channel >= 0 && channel < num_channels_);
- return split_channels_[channel].synthesis_filter_state2;
-}
-
-WebRtc_Word32 AudioBuffer::num_channels() const {
- return num_channels_;
-}
-
-WebRtc_Word32 AudioBuffer::samples_per_channel() const {
- return samples_per_channel_;
-}
-
-WebRtc_Word32 AudioBuffer::samples_per_split_channel() const {
- return samples_per_split_channel_;
-}
-
-// TODO(ajm): Do deinterleaving and mixing in one step?
-void AudioBuffer::DeinterleaveFrom(AudioFrame* audioFrame) {
- assert(audioFrame->_audioChannel <= max_num_channels_);
- assert(audioFrame->_payloadDataLengthInSamples == samples_per_channel_);
-
- num_channels_ = audioFrame->_audioChannel;
- num_mixed_channels_ = 0;
- num_mixed_low_pass_channels_ = 0;
- reference_copied_ = false;
-
- if (num_channels_ == 1) {
- // We can get away with a pointer assignment in this case.
- data_ = audioFrame->_payloadData;
- return;
- }
-
- for (int i = 0; i < num_channels_; i++) {
- WebRtc_Word16* deinterleaved = channels_[i].data;
- WebRtc_Word16* interleaved = audioFrame->_payloadData;
- WebRtc_Word32 interleaved_idx = i;
- for (int j = 0; j < samples_per_channel_; j++) {
- deinterleaved[j] = interleaved[interleaved_idx];
- interleaved_idx += num_channels_;
- }
- }
-}
-
-void AudioBuffer::InterleaveTo(AudioFrame* audioFrame) const {
- assert(audioFrame->_audioChannel == num_channels_);
- assert(audioFrame->_payloadDataLengthInSamples == samples_per_channel_);
-
- if (num_channels_ == 1) {
- if (num_mixed_channels_ == 1) {
- memcpy(audioFrame->_payloadData,
- channels_[0].data,
- sizeof(WebRtc_Word16) * samples_per_channel_);
- } else {
- // These should point to the same buffer in this case.
- assert(data_ == audioFrame->_payloadData);
- }
-
- return;
- }
-
- for (int i = 0; i < num_channels_; i++) {
- WebRtc_Word16* deinterleaved = channels_[i].data;
- WebRtc_Word16* interleaved = audioFrame->_payloadData;
- WebRtc_Word32 interleaved_idx = i;
- for (int j = 0; j < samples_per_channel_; j++) {
- interleaved[interleaved_idx] = deinterleaved[j];
- interleaved_idx += num_channels_;
- }
- }
-}
-
-// TODO(ajm): would be good to support the no-mix case with pointer assignment.
-// TODO(ajm): handle mixing to multiple channels?
-void AudioBuffer::Mix(WebRtc_Word32 num_mixed_channels) {
- // We currently only support the stereo to mono case.
- assert(num_channels_ == 2);
- assert(num_mixed_channels == 1);
-
- StereoToMono(channels_[0].data,
- channels_[1].data,
- channels_[0].data,
- samples_per_channel_);
-
- num_channels_ = num_mixed_channels;
- num_mixed_channels_ = num_mixed_channels;
-}
-
-void AudioBuffer::CopyAndMixLowPass(WebRtc_Word32 num_mixed_channels) {
- // We currently only support the stereo to mono case.
- assert(num_channels_ == 2);
- assert(num_mixed_channels == 1);
-
- StereoToMono(low_pass_split_data(0),
- low_pass_split_data(1),
- mixed_low_pass_channels_[0].data,
- samples_per_split_channel_);
-
- num_mixed_low_pass_channels_ = num_mixed_channels;
-}
-
-void AudioBuffer::CopyLowPassToReference() {
- reference_copied_ = true;
- for (int i = 0; i < num_channels_; i++) {
- memcpy(low_pass_reference_channels_[i].data,
- low_pass_split_data(i),
- sizeof(WebRtc_Word16) * samples_per_split_channel_);
- }
-}
-} // namespace webrtc
diff --git a/src/modules/audio_processing/main/source/audio_buffer.h b/src/modules/audio_processing/main/source/audio_buffer.h
deleted file mode 100644
index 15f850b..0000000
--- a/src/modules/audio_processing/main/source/audio_buffer.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_AUDIO_BUFFER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_AUDIO_BUFFER_H_
-
-#include "typedefs.h"
-
-
-namespace webrtc {
-
-struct AudioChannel;
-struct SplitAudioChannel;
-class AudioFrame;
-
-class AudioBuffer {
- public:
- AudioBuffer(WebRtc_Word32 max_num_channels, WebRtc_Word32 samples_per_channel);
- virtual ~AudioBuffer();
-
- WebRtc_Word32 num_channels() const;
- WebRtc_Word32 samples_per_channel() const;
- WebRtc_Word32 samples_per_split_channel() const;
-
- WebRtc_Word16* data(WebRtc_Word32 channel) const;
- WebRtc_Word16* low_pass_split_data(WebRtc_Word32 channel) const;
- WebRtc_Word16* high_pass_split_data(WebRtc_Word32 channel) const;
- WebRtc_Word16* mixed_low_pass_data(WebRtc_Word32 channel) const;
- WebRtc_Word16* low_pass_reference(WebRtc_Word32 channel) const;
-
- WebRtc_Word32* analysis_filter_state1(WebRtc_Word32 channel) const;
- WebRtc_Word32* analysis_filter_state2(WebRtc_Word32 channel) const;
- WebRtc_Word32* synthesis_filter_state1(WebRtc_Word32 channel) const;
- WebRtc_Word32* synthesis_filter_state2(WebRtc_Word32 channel) const;
-
- void DeinterleaveFrom(AudioFrame* audioFrame);
- void InterleaveTo(AudioFrame* audioFrame) const;
- void Mix(WebRtc_Word32 num_mixed_channels);
- void CopyAndMixLowPass(WebRtc_Word32 num_mixed_channels);
- void CopyLowPassToReference();
-
- private:
- const WebRtc_Word32 max_num_channels_;
- WebRtc_Word32 num_channels_;
- WebRtc_Word32 num_mixed_channels_;
- WebRtc_Word32 num_mixed_low_pass_channels_;
- const WebRtc_Word32 samples_per_channel_;
- WebRtc_Word32 samples_per_split_channel_;
- bool reference_copied_;
-
- WebRtc_Word16* data_;
- // TODO(ajm): Prefer to make these vectors if permitted...
- AudioChannel* channels_;
- SplitAudioChannel* split_channels_;
- // TODO(ajm): improve this, we don't need the full 32 kHz space here.
- AudioChannel* mixed_low_pass_channels_;
- AudioChannel* low_pass_reference_channels_;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_AUDIO_BUFFER_H_
diff --git a/src/modules/audio_processing/main/source/audio_processing_impl.cc b/src/modules/audio_processing/main/source/audio_processing_impl.cc
deleted file mode 100644
index 6440e36..0000000
--- a/src/modules/audio_processing/main/source/audio_processing_impl.cc
+++ /dev/null
@@ -1,636 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "audio_processing_impl.h"
-
-#include <cassert>
-
-#include "module_common_types.h"
-
-#include "critical_section_wrapper.h"
-#include "file_wrapper.h"
-
-#include "audio_buffer.h"
-#include "echo_cancellation_impl.h"
-#include "echo_control_mobile_impl.h"
-#include "high_pass_filter_impl.h"
-#include "gain_control_impl.h"
-#include "level_estimator_impl.h"
-#include "noise_suppression_impl.h"
-#include "processing_component.h"
-#include "splitting_filter.h"
-#include "voice_detection_impl.h"
-
-namespace webrtc {
-namespace {
-
-enum Events {
- kInitializeEvent,
- kRenderEvent,
- kCaptureEvent
-};
-
-const char kMagicNumber[] = "#!vqetrace1.2";
-} // namespace
-
-AudioProcessing* AudioProcessing::Create(int id) {
- /*WEBRTC_TRACE(webrtc::kTraceModuleCall,
- webrtc::kTraceAudioProcessing,
- id,
- "AudioProcessing::Create()");*/
-
- AudioProcessingImpl* apm = new AudioProcessingImpl(id);
- if (apm->Initialize() != kNoError) {
- delete apm;
- apm = NULL;
- }
-
- return apm;
-}
-
-void AudioProcessing::Destroy(AudioProcessing* apm) {
- delete static_cast<AudioProcessingImpl*>(apm);
-}
-
-AudioProcessingImpl::AudioProcessingImpl(int id)
- : id_(id),
- echo_cancellation_(NULL),
- echo_control_mobile_(NULL),
- gain_control_(NULL),
- high_pass_filter_(NULL),
- level_estimator_(NULL),
- noise_suppression_(NULL),
- voice_detection_(NULL),
- debug_file_(FileWrapper::Create()),
- crit_(CriticalSectionWrapper::CreateCriticalSection()),
- render_audio_(NULL),
- capture_audio_(NULL),
- sample_rate_hz_(kSampleRate16kHz),
- split_sample_rate_hz_(kSampleRate16kHz),
- samples_per_channel_(sample_rate_hz_ / 100),
- stream_delay_ms_(0),
- was_stream_delay_set_(false),
- num_render_input_channels_(1),
- num_capture_input_channels_(1),
- num_capture_output_channels_(1) {
-
- echo_cancellation_ = new EchoCancellationImpl(this);
- component_list_.push_back(echo_cancellation_);
-
- echo_control_mobile_ = new EchoControlMobileImpl(this);
- component_list_.push_back(echo_control_mobile_);
-
- gain_control_ = new GainControlImpl(this);
- component_list_.push_back(gain_control_);
-
- high_pass_filter_ = new HighPassFilterImpl(this);
- component_list_.push_back(high_pass_filter_);
-
- level_estimator_ = new LevelEstimatorImpl(this);
- component_list_.push_back(level_estimator_);
-
- noise_suppression_ = new NoiseSuppressionImpl(this);
- component_list_.push_back(noise_suppression_);
-
- voice_detection_ = new VoiceDetectionImpl(this);
- component_list_.push_back(voice_detection_);
-}
-
-AudioProcessingImpl::~AudioProcessingImpl() {
- while (!component_list_.empty()) {
- ProcessingComponent* component = component_list_.front();
- component->Destroy();
- delete component;
- component_list_.pop_front();
- }
-
- if (debug_file_->Open()) {
- debug_file_->CloseFile();
- }
- delete debug_file_;
- debug_file_ = NULL;
-
- delete crit_;
- crit_ = NULL;
-
- if (render_audio_ != NULL) {
- delete render_audio_;
- render_audio_ = NULL;
- }
-
- if (capture_audio_ != NULL) {
- delete capture_audio_;
- capture_audio_ = NULL;
- }
-}
-
-CriticalSectionWrapper* AudioProcessingImpl::crit() const {
- return crit_;
-}
-
-int AudioProcessingImpl::split_sample_rate_hz() const {
- return split_sample_rate_hz_;
-}
-
-int AudioProcessingImpl::Initialize() {
- CriticalSectionScoped crit_scoped(*crit_);
- return InitializeLocked();
-}
-
-int AudioProcessingImpl::InitializeLocked() {
- if (render_audio_ != NULL) {
- delete render_audio_;
- render_audio_ = NULL;
- }
-
- if (capture_audio_ != NULL) {
- delete capture_audio_;
- capture_audio_ = NULL;
- }
-
- render_audio_ = new AudioBuffer(num_render_input_channels_,
- samples_per_channel_);
- capture_audio_ = new AudioBuffer(num_capture_input_channels_,
- samples_per_channel_);
-
- was_stream_delay_set_ = false;
-
- // Initialize all components.
- std::list<ProcessingComponent*>::iterator it;
- for (it = component_list_.begin(); it != component_list_.end(); it++) {
- int err = (*it)->Initialize();
- if (err != kNoError) {
- return err;
- }
- }
-
- return kNoError;
-}
-
-int AudioProcessingImpl::set_sample_rate_hz(int rate) {
- CriticalSectionScoped crit_scoped(*crit_);
- if (rate != kSampleRate8kHz &&
- rate != kSampleRate16kHz &&
- rate != kSampleRate32kHz) {
- return kBadParameterError;
- }
-
- sample_rate_hz_ = rate;
- samples_per_channel_ = rate / 100;
-
- if (sample_rate_hz_ == kSampleRate32kHz) {
- split_sample_rate_hz_ = kSampleRate16kHz;
- } else {
- split_sample_rate_hz_ = sample_rate_hz_;
- }
-
- return InitializeLocked();
-}
-
-int AudioProcessingImpl::sample_rate_hz() const {
- return sample_rate_hz_;
-}
-
-int AudioProcessingImpl::set_num_reverse_channels(int channels) {
- CriticalSectionScoped crit_scoped(*crit_);
- // Only stereo supported currently.
- if (channels > 2 || channels < 1) {
- return kBadParameterError;
- }
-
- num_render_input_channels_ = channels;
-
- return InitializeLocked();
-}
-
-int AudioProcessingImpl::num_reverse_channels() const {
- return num_render_input_channels_;
-}
-
-int AudioProcessingImpl::set_num_channels(
- int input_channels,
- int output_channels) {
- CriticalSectionScoped crit_scoped(*crit_);
- if (output_channels > input_channels) {
- return kBadParameterError;
- }
-
- // Only stereo supported currently.
- if (input_channels > 2 || input_channels < 1) {
- return kBadParameterError;
- }
-
- if (output_channels > 2 || output_channels < 1) {
- return kBadParameterError;
- }
-
- num_capture_input_channels_ = input_channels;
- num_capture_output_channels_ = output_channels;
-
- return InitializeLocked();
-}
-
-int AudioProcessingImpl::num_input_channels() const {
- return num_capture_input_channels_;
-}
-
-int AudioProcessingImpl::num_output_channels() const {
- return num_capture_output_channels_;
-}
-
-int AudioProcessingImpl::ProcessStream(AudioFrame* frame) {
- CriticalSectionScoped crit_scoped(*crit_);
- int err = kNoError;
-
- if (frame == NULL) {
- return kNullPointerError;
- }
-
- if (frame->_frequencyInHz !=
- static_cast<WebRtc_UWord32>(sample_rate_hz_)) {
- return kBadSampleRateError;
- }
-
- if (frame->_audioChannel != num_capture_input_channels_) {
- return kBadNumberChannelsError;
- }
-
- if (frame->_payloadDataLengthInSamples != samples_per_channel_) {
- return kBadDataLengthError;
- }
-
- if (debug_file_->Open()) {
- WebRtc_UWord8 event = kCaptureEvent;
- if (!debug_file_->Write(&event, sizeof(event))) {
- return kFileError;
- }
-
- if (!debug_file_->Write(&frame->_frequencyInHz,
- sizeof(frame->_frequencyInHz))) {
- return kFileError;
- }
-
- if (!debug_file_->Write(&frame->_audioChannel,
- sizeof(frame->_audioChannel))) {
- return kFileError;
- }
-
- if (!debug_file_->Write(&frame->_payloadDataLengthInSamples,
- sizeof(frame->_payloadDataLengthInSamples))) {
- return kFileError;
- }
-
- if (!debug_file_->Write(frame->_payloadData,
- sizeof(WebRtc_Word16) * frame->_payloadDataLengthInSamples *
- frame->_audioChannel)) {
- return kFileError;
- }
- }
-
- capture_audio_->DeinterleaveFrom(frame);
-
- // TODO(ajm): experiment with mixing and AEC placement.
- if (num_capture_output_channels_ < num_capture_input_channels_) {
- capture_audio_->Mix(num_capture_output_channels_);
-
- frame->_audioChannel = num_capture_output_channels_;
- }
-
- if (sample_rate_hz_ == kSampleRate32kHz) {
- for (int i = 0; i < num_capture_input_channels_; i++) {
- // Split into a low and high band.
- SplittingFilterAnalysis(capture_audio_->data(i),
- capture_audio_->low_pass_split_data(i),
- capture_audio_->high_pass_split_data(i),
- capture_audio_->analysis_filter_state1(i),
- capture_audio_->analysis_filter_state2(i));
- }
- }
-
- err = high_pass_filter_->ProcessCaptureAudio(capture_audio_);
- if (err != kNoError) {
- return err;
- }
-
- err = gain_control_->AnalyzeCaptureAudio(capture_audio_);
- if (err != kNoError) {
- return err;
- }
-
- err = echo_cancellation_->ProcessCaptureAudio(capture_audio_);
- if (err != kNoError) {
- return err;
- }
-
- if (echo_control_mobile_->is_enabled() &&
- noise_suppression_->is_enabled()) {
- capture_audio_->CopyLowPassToReference();
- }
-
- err = noise_suppression_->ProcessCaptureAudio(capture_audio_);
- if (err != kNoError) {
- return err;
- }
-
- err = echo_control_mobile_->ProcessCaptureAudio(capture_audio_);
- if (err != kNoError) {
- return err;
- }
-
- err = voice_detection_->ProcessCaptureAudio(capture_audio_);
- if (err != kNoError) {
- return err;
- }
-
- err = gain_control_->ProcessCaptureAudio(capture_audio_);
- if (err != kNoError) {
- return err;
- }
-
- //err = level_estimator_->ProcessCaptureAudio(capture_audio_);
- //if (err != kNoError) {
- // return err;
- //}
-
- if (sample_rate_hz_ == kSampleRate32kHz) {
- for (int i = 0; i < num_capture_output_channels_; i++) {
- // Recombine low and high bands.
- SplittingFilterSynthesis(capture_audio_->low_pass_split_data(i),
- capture_audio_->high_pass_split_data(i),
- capture_audio_->data(i),
- capture_audio_->synthesis_filter_state1(i),
- capture_audio_->synthesis_filter_state2(i));
- }
- }
-
- capture_audio_->InterleaveTo(frame);
-
- return kNoError;
-}
-
-int AudioProcessingImpl::AnalyzeReverseStream(AudioFrame* frame) {
- CriticalSectionScoped crit_scoped(*crit_);
- int err = kNoError;
-
- if (frame == NULL) {
- return kNullPointerError;
- }
-
- if (frame->_frequencyInHz !=
- static_cast<WebRtc_UWord32>(sample_rate_hz_)) {
- return kBadSampleRateError;
- }
-
- if (frame->_audioChannel != num_render_input_channels_) {
- return kBadNumberChannelsError;
- }
-
- if (frame->_payloadDataLengthInSamples != samples_per_channel_) {
- return kBadDataLengthError;
- }
-
- if (debug_file_->Open()) {
- WebRtc_UWord8 event = kRenderEvent;
- if (!debug_file_->Write(&event, sizeof(event))) {
- return kFileError;
- }
-
- if (!debug_file_->Write(&frame->_frequencyInHz,
- sizeof(frame->_frequencyInHz))) {
- return kFileError;
- }
-
- if (!debug_file_->Write(&frame->_audioChannel,
- sizeof(frame->_audioChannel))) {
- return kFileError;
- }
-
- if (!debug_file_->Write(&frame->_payloadDataLengthInSamples,
- sizeof(frame->_payloadDataLengthInSamples))) {
- return kFileError;
- }
-
- if (!debug_file_->Write(frame->_payloadData,
- sizeof(WebRtc_Word16) * frame->_payloadDataLengthInSamples *
- frame->_audioChannel)) {
- return kFileError;
- }
- }
-
- render_audio_->DeinterleaveFrom(frame);
-
- // TODO(ajm): turn the splitting filter into a component?
- if (sample_rate_hz_ == kSampleRate32kHz) {
- for (int i = 0; i < num_render_input_channels_; i++) {
- // Split into low and high band.
- SplittingFilterAnalysis(render_audio_->data(i),
- render_audio_->low_pass_split_data(i),
- render_audio_->high_pass_split_data(i),
- render_audio_->analysis_filter_state1(i),
- render_audio_->analysis_filter_state2(i));
- }
- }
-
- // TODO(ajm): warnings possible from components?
- err = echo_cancellation_->ProcessRenderAudio(render_audio_);
- if (err != kNoError) {
- return err;
- }
-
- err = echo_control_mobile_->ProcessRenderAudio(render_audio_);
- if (err != kNoError) {
- return err;
- }
-
- err = gain_control_->ProcessRenderAudio(render_audio_);
- if (err != kNoError) {
- return err;
- }
-
- //err = level_estimator_->AnalyzeReverseStream(render_audio_);
- //if (err != kNoError) {
- // return err;
- //}
-
- was_stream_delay_set_ = false;
- return err; // TODO(ajm): this is for returning warnings; necessary?
-}
-
-int AudioProcessingImpl::set_stream_delay_ms(int delay) {
- was_stream_delay_set_ = true;
- if (delay < 0) {
- return kBadParameterError;
- }
-
- // TODO(ajm): the max is rather arbitrarily chosen; investigate.
- if (delay > 500) {
- stream_delay_ms_ = 500;
- return kBadStreamParameterWarning;
- }
-
- stream_delay_ms_ = delay;
- return kNoError;
-}
-
-int AudioProcessingImpl::stream_delay_ms() const {
- return stream_delay_ms_;
-}
-
-bool AudioProcessingImpl::was_stream_delay_set() const {
- return was_stream_delay_set_;
-}
-
-int AudioProcessingImpl::StartDebugRecording(
- const char filename[AudioProcessing::kMaxFilenameSize]) {
- CriticalSectionScoped crit_scoped(*crit_);
- assert(kMaxFilenameSize == FileWrapper::kMaxFileNameSize);
-
- if (filename == NULL) {
- return kNullPointerError;
- }
-
- // Stop any ongoing recording.
- if (debug_file_->Open()) {
- if (debug_file_->CloseFile() == -1) {
- return kFileError;
- }
- }
-
- if (debug_file_->OpenFile(filename, false) == -1) {
- debug_file_->CloseFile();
- return kFileError;
- }
-
- if (debug_file_->WriteText("%s\n", kMagicNumber) == -1) {
- debug_file_->CloseFile();
- return kFileError;
- }
-
- // TODO(ajm): should we do this? If so, we need the number of channels etc.
- // Record the default sample rate.
- WebRtc_UWord8 event = kInitializeEvent;
- if (!debug_file_->Write(&event, sizeof(event))) {
- return kFileError;
- }
-
- if (!debug_file_->Write(&sample_rate_hz_, sizeof(sample_rate_hz_))) {
- return kFileError;
- }
-
- return kNoError;
-}
-
-int AudioProcessingImpl::StopDebugRecording() {
- CriticalSectionScoped crit_scoped(*crit_);
- // We just return if recording hasn't started.
- if (debug_file_->Open()) {
- if (debug_file_->CloseFile() == -1) {
- return kFileError;
- }
- }
-
- return kNoError;
-}
-
-EchoCancellation* AudioProcessingImpl::echo_cancellation() const {
- return echo_cancellation_;
-}
-
-EchoControlMobile* AudioProcessingImpl::echo_control_mobile() const {
- return echo_control_mobile_;
-}
-
-GainControl* AudioProcessingImpl::gain_control() const {
- return gain_control_;
-}
-
-HighPassFilter* AudioProcessingImpl::high_pass_filter() const {
- return high_pass_filter_;
-}
-
-LevelEstimator* AudioProcessingImpl::level_estimator() const {
- return level_estimator_;
-}
-
-NoiseSuppression* AudioProcessingImpl::noise_suppression() const {
- return noise_suppression_;
-}
-
-VoiceDetection* AudioProcessingImpl::voice_detection() const {
- return voice_detection_;
-}
-
-WebRtc_Word32 AudioProcessingImpl::Version(WebRtc_Word8* version,
- WebRtc_UWord32& bytes_remaining, WebRtc_UWord32& position) const {
- if (version == NULL) {
- /*WEBRTC_TRACE(webrtc::kTraceError,
- webrtc::kTraceAudioProcessing,
- -1,
- "Null version pointer");*/
- return kNullPointerError;
- }
- memset(&version[position], 0, bytes_remaining);
-
- WebRtc_Word8 my_version[] = "AudioProcessing 1.0.0";
- // Includes null termination.
- WebRtc_UWord32 length = static_cast<WebRtc_UWord32>(strlen(my_version));
- if (bytes_remaining < length) {
- /*WEBRTC_TRACE(webrtc::kTraceError,
- webrtc::kTraceAudioProcessing,
- -1,
- "Buffer of insufficient length");*/
- return kBadParameterError;
- }
- memcpy(&version[position], my_version, length);
- bytes_remaining -= length;
- position += length;
-
- std::list<ProcessingComponent*>::const_iterator it;
- for (it = component_list_.begin(); it != component_list_.end(); it++) {
- char component_version[256];
- strcpy(component_version, "\n");
- int err = (*it)->get_version(&component_version[1],
- sizeof(component_version) - 1);
- if (err != kNoError) {
- return err;
- }
- if (strncmp(&component_version[1], "\0", 1) == 0) {
- // Assume empty if first byte is NULL.
- continue;
- }
-
- length = static_cast<WebRtc_UWord32>(strlen(component_version));
- if (bytes_remaining < length) {
- /*WEBRTC_TRACE(webrtc::kTraceError,
- webrtc::kTraceAudioProcessing,
- -1,
- "Buffer of insufficient length");*/
- return kBadParameterError;
- }
- memcpy(&version[position], component_version, length);
- bytes_remaining -= length;
- position += length;
- }
-
- return kNoError;
-}
-
-WebRtc_Word32 AudioProcessingImpl::ChangeUniqueId(const WebRtc_Word32 id) {
- CriticalSectionScoped crit_scoped(*crit_);
- /*WEBRTC_TRACE(webrtc::kTraceModuleCall,
- webrtc::kTraceAudioProcessing,
- id_,
- "ChangeUniqueId(new id = %d)",
- id);*/
- id_ = id;
-
- return kNoError;
-}
-} // namespace webrtc
diff --git a/src/modules/audio_processing/main/source/audio_processing_impl.h b/src/modules/audio_processing/main/source/audio_processing_impl.h
deleted file mode 100644
index 9707bde..0000000
--- a/src/modules/audio_processing/main/source/audio_processing_impl.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_AUDIO_PROCESSING_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_AUDIO_PROCESSING_IMPL_H_
-
-#include <list>
-
-#include "audio_processing.h"
-
-namespace webrtc {
-class CriticalSectionWrapper;
-class FileWrapper;
-
-class AudioBuffer;
-class EchoCancellationImpl;
-class EchoControlMobileImpl;
-class GainControlImpl;
-class HighPassFilterImpl;
-class LevelEstimatorImpl;
-class NoiseSuppressionImpl;
-class ProcessingComponent;
-class VoiceDetectionImpl;
-
-class AudioProcessingImpl : public AudioProcessing {
- public:
- enum {
- kSampleRate8kHz = 8000,
- kSampleRate16kHz = 16000,
- kSampleRate32kHz = 32000
- };
-
- explicit AudioProcessingImpl(int id);
- virtual ~AudioProcessingImpl();
-
- CriticalSectionWrapper* crit() const;
-
- int split_sample_rate_hz() const;
- bool was_stream_delay_set() const;
-
- // AudioProcessing methods.
- virtual int Initialize();
- virtual int InitializeLocked();
- virtual int set_sample_rate_hz(int rate);
- virtual int sample_rate_hz() const;
- virtual int set_num_channels(int input_channels, int output_channels);
- virtual int num_input_channels() const;
- virtual int num_output_channels() const;
- virtual int set_num_reverse_channels(int channels);
- virtual int num_reverse_channels() const;
- virtual int ProcessStream(AudioFrame* frame);
- virtual int AnalyzeReverseStream(AudioFrame* frame);
- virtual int set_stream_delay_ms(int delay);
- virtual int stream_delay_ms() const;
- virtual int StartDebugRecording(const char filename[kMaxFilenameSize]);
- virtual int StopDebugRecording();
- virtual EchoCancellation* echo_cancellation() const;
- virtual EchoControlMobile* echo_control_mobile() const;
- virtual GainControl* gain_control() const;
- virtual HighPassFilter* high_pass_filter() const;
- virtual LevelEstimator* level_estimator() const;
- virtual NoiseSuppression* noise_suppression() const;
- virtual VoiceDetection* voice_detection() const;
-
- // Module methods.
- virtual WebRtc_Word32 Version(WebRtc_Word8* version,
- WebRtc_UWord32& remainingBufferInBytes,
- WebRtc_UWord32& position) const;
- virtual WebRtc_Word32 ChangeUniqueId(const WebRtc_Word32 id);
-
- private:
- int id_;
-
- EchoCancellationImpl* echo_cancellation_;
- EchoControlMobileImpl* echo_control_mobile_;
- GainControlImpl* gain_control_;
- HighPassFilterImpl* high_pass_filter_;
- LevelEstimatorImpl* level_estimator_;
- NoiseSuppressionImpl* noise_suppression_;
- VoiceDetectionImpl* voice_detection_;
-
- std::list<ProcessingComponent*> component_list_;
-
- FileWrapper* debug_file_;
- CriticalSectionWrapper* crit_;
-
- AudioBuffer* render_audio_;
- AudioBuffer* capture_audio_;
-
- int sample_rate_hz_;
- int split_sample_rate_hz_;
- int samples_per_channel_;
- int stream_delay_ms_;
- bool was_stream_delay_set_;
-
- int num_render_input_channels_;
- int num_capture_input_channels_;
- int num_capture_output_channels_;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_AUDIO_PROCESSING_IMPL_H_
diff --git a/src/modules/audio_processing/main/source/echo_cancellation_impl.cc b/src/modules/audio_processing/main/source/echo_cancellation_impl.cc
deleted file mode 100644
index 886d5f1..0000000
--- a/src/modules/audio_processing/main/source/echo_cancellation_impl.cc
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "echo_cancellation_impl.h"
-
-#include <cassert>
-#include <string.h>
-
-#include "critical_section_wrapper.h"
-#include "echo_cancellation.h"
-
-#include "audio_processing_impl.h"
-#include "audio_buffer.h"
-
-namespace webrtc {
-
-typedef void Handle;
-
-namespace {
-WebRtc_Word16 MapSetting(EchoCancellation::SuppressionLevel level) {
- switch (level) {
- case EchoCancellation::kLowSuppression:
- return kAecNlpConservative;
- case EchoCancellation::kModerateSuppression:
- return kAecNlpModerate;
- case EchoCancellation::kHighSuppression:
- return kAecNlpAggressive;
- default:
- return -1;
- }
-}
-
-int MapError(int err) {
- switch (err) {
- case AEC_UNSUPPORTED_FUNCTION_ERROR:
- return AudioProcessing::kUnsupportedFunctionError;
- break;
- case AEC_BAD_PARAMETER_ERROR:
- return AudioProcessing::kBadParameterError;
- break;
- case AEC_BAD_PARAMETER_WARNING:
- return AudioProcessing::kBadStreamParameterWarning;
- break;
- default:
- // AEC_UNSPECIFIED_ERROR
- // AEC_UNINITIALIZED_ERROR
- // AEC_NULL_POINTER_ERROR
- return AudioProcessing::kUnspecifiedError;
- }
-}
-} // namespace
-
-EchoCancellationImpl::EchoCancellationImpl(const AudioProcessingImpl* apm)
- : ProcessingComponent(apm),
- apm_(apm),
- drift_compensation_enabled_(false),
- metrics_enabled_(false),
- suppression_level_(kModerateSuppression),
- device_sample_rate_hz_(48000),
- stream_drift_samples_(0),
- was_stream_drift_set_(false),
- stream_has_echo_(false) {}
-
-EchoCancellationImpl::~EchoCancellationImpl() {}
-
-int EchoCancellationImpl::ProcessRenderAudio(const AudioBuffer* audio) {
- if (!is_component_enabled()) {
- return apm_->kNoError;
- }
-
- assert(audio->samples_per_split_channel() <= 160);
- assert(audio->num_channels() == apm_->num_reverse_channels());
-
- int err = apm_->kNoError;
-
- // The ordering convention must be followed to pass to the correct AEC.
- size_t handle_index = 0;
- for (int i = 0; i < apm_->num_output_channels(); i++) {
- for (int j = 0; j < audio->num_channels(); j++) {
- Handle* my_handle = static_cast<Handle*>(handle(handle_index));
- err = WebRtcAec_BufferFarend(
- my_handle,
- audio->low_pass_split_data(j),
- static_cast<WebRtc_Word16>(audio->samples_per_split_channel()));
-
- if (err != apm_->kNoError) {
- return GetHandleError(my_handle); // TODO(ajm): warning possible?
- }
-
- handle_index++;
- }
- }
-
- return apm_->kNoError;
-}
-
-int EchoCancellationImpl::ProcessCaptureAudio(AudioBuffer* audio) {
- if (!is_component_enabled()) {
- return apm_->kNoError;
- }
-
- if (!apm_->was_stream_delay_set()) {
- return apm_->kStreamParameterNotSetError;
- }
-
- if (drift_compensation_enabled_ && !was_stream_drift_set_) {
- return apm_->kStreamParameterNotSetError;
- }
-
- assert(audio->samples_per_split_channel() <= 160);
- assert(audio->num_channels() == apm_->num_output_channels());
-
- int err = apm_->kNoError;
-
- // The ordering convention must be followed to pass to the correct AEC.
- size_t handle_index = 0;
- stream_has_echo_ = false;
- for (int i = 0; i < audio->num_channels(); i++) {
- for (int j = 0; j < apm_->num_reverse_channels(); j++) {
- Handle* my_handle = handle(handle_index);
- err = WebRtcAec_Process(
- my_handle,
- audio->low_pass_split_data(i),
- audio->high_pass_split_data(i),
- audio->low_pass_split_data(i),
- audio->high_pass_split_data(i),
- static_cast<WebRtc_Word16>(audio->samples_per_split_channel()),
- apm_->stream_delay_ms(),
- stream_drift_samples_);
-
- if (err != apm_->kNoError) {
- err = GetHandleError(my_handle);
- // TODO(ajm): Figure out how to return warnings properly.
- if (err != apm_->kBadStreamParameterWarning) {
- return err;
- }
- }
-
- WebRtc_Word16 status = 0;
- err = WebRtcAec_get_echo_status(my_handle, &status);
- if (err != apm_->kNoError) {
- return GetHandleError(my_handle);
- }
-
- if (status == 1) {
- stream_has_echo_ = true;
- }
-
- handle_index++;
- }
- }
-
- was_stream_drift_set_ = false;
- return apm_->kNoError;
-}
-
-int EchoCancellationImpl::Enable(bool enable) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- // Ensure AEC and AECM are not both enabled.
- if (enable && apm_->echo_control_mobile()->is_enabled()) {
- return apm_->kBadParameterError;
- }
-
- return EnableComponent(enable);
-}
-
-bool EchoCancellationImpl::is_enabled() const {
- return is_component_enabled();
-}
-
-int EchoCancellationImpl::set_suppression_level(SuppressionLevel level) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- if (MapSetting(level) == -1) {
- return apm_->kBadParameterError;
- }
-
- suppression_level_ = level;
- return Configure();
-}
-
-EchoCancellation::SuppressionLevel EchoCancellationImpl::suppression_level()
- const {
- return suppression_level_;
-}
-
-int EchoCancellationImpl::enable_drift_compensation(bool enable) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- drift_compensation_enabled_ = enable;
- return Configure();
-}
-
-bool EchoCancellationImpl::is_drift_compensation_enabled() const {
- return drift_compensation_enabled_;
-}
-
-int EchoCancellationImpl::set_device_sample_rate_hz(int rate) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- if (rate < 8000 || rate > 96000) {
- return apm_->kBadParameterError;
- }
-
- device_sample_rate_hz_ = rate;
- return Initialize();
-}
-
-int EchoCancellationImpl::device_sample_rate_hz() const {
- return device_sample_rate_hz_;
-}
-
-int EchoCancellationImpl::set_stream_drift_samples(int drift) {
- was_stream_drift_set_ = true;
- stream_drift_samples_ = drift;
- return apm_->kNoError;
-}
-
-int EchoCancellationImpl::stream_drift_samples() const {
- return stream_drift_samples_;
-}
-
-int EchoCancellationImpl::enable_metrics(bool enable) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- metrics_enabled_ = enable;
- return Configure();
-}
-
-bool EchoCancellationImpl::are_metrics_enabled() const {
- return metrics_enabled_;
-}
-
-// TODO(ajm): we currently just use the metrics from the first AEC. Think more
-// aboue the best way to extend this to multi-channel.
-int EchoCancellationImpl::GetMetrics(Metrics* metrics) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- if (metrics == NULL) {
- return apm_->kNullPointerError;
- }
-
- if (!is_component_enabled() || !metrics_enabled_) {
- return apm_->kNotEnabledError;
- }
-
- AecMetrics my_metrics;
- memset(&my_metrics, 0, sizeof(my_metrics));
- memset(metrics, 0, sizeof(Metrics));
-
- Handle* my_handle = static_cast<Handle*>(handle(0));
- int err = WebRtcAec_GetMetrics(my_handle, &my_metrics);
- if (err != apm_->kNoError) {
- return GetHandleError(my_handle);
- }
-
- metrics->residual_echo_return_loss.instant = my_metrics.rerl.instant;
- metrics->residual_echo_return_loss.average = my_metrics.rerl.average;
- metrics->residual_echo_return_loss.maximum = my_metrics.rerl.max;
- metrics->residual_echo_return_loss.minimum = my_metrics.rerl.min;
-
- metrics->echo_return_loss.instant = my_metrics.erl.instant;
- metrics->echo_return_loss.average = my_metrics.erl.average;
- metrics->echo_return_loss.maximum = my_metrics.erl.max;
- metrics->echo_return_loss.minimum = my_metrics.erl.min;
-
- metrics->echo_return_loss_enhancement.instant = my_metrics.erle.instant;
- metrics->echo_return_loss_enhancement.average = my_metrics.erle.average;
- metrics->echo_return_loss_enhancement.maximum = my_metrics.erle.max;
- metrics->echo_return_loss_enhancement.minimum = my_metrics.erle.min;
-
- metrics->a_nlp.instant = my_metrics.aNlp.instant;
- metrics->a_nlp.average = my_metrics.aNlp.average;
- metrics->a_nlp.maximum = my_metrics.aNlp.max;
- metrics->a_nlp.minimum = my_metrics.aNlp.min;
-
- return apm_->kNoError;
-}
-
-bool EchoCancellationImpl::stream_has_echo() const {
- return stream_has_echo_;
-}
-
-int EchoCancellationImpl::Initialize() {
- int err = ProcessingComponent::Initialize();
- if (err != apm_->kNoError || !is_component_enabled()) {
- return err;
- }
-
- was_stream_drift_set_ = false;
-
- return apm_->kNoError;
-}
-
-int EchoCancellationImpl::get_version(char* version,
- int version_len_bytes) const {
- if (WebRtcAec_get_version(version, version_len_bytes) != 0) {
- return apm_->kBadParameterError;
- }
-
- return apm_->kNoError;
-}
-
-void* EchoCancellationImpl::CreateHandle() const {
- Handle* handle = NULL;
- if (WebRtcAec_Create(&handle) != apm_->kNoError) {
- handle = NULL;
- } else {
- assert(handle != NULL);
- }
-
- return handle;
-}
-
-int EchoCancellationImpl::DestroyHandle(void* handle) const {
- assert(handle != NULL);
- return WebRtcAec_Free(static_cast<Handle*>(handle));
-}
-
-int EchoCancellationImpl::InitializeHandle(void* handle) const {
- assert(handle != NULL);
- return WebRtcAec_Init(static_cast<Handle*>(handle),
- apm_->sample_rate_hz(),
- device_sample_rate_hz_);
-}
-
-int EchoCancellationImpl::ConfigureHandle(void* handle) const {
- assert(handle != NULL);
- AecConfig config;
- config.metricsMode = metrics_enabled_;
- config.nlpMode = MapSetting(suppression_level_);
- config.skewMode = drift_compensation_enabled_;
-
- return WebRtcAec_set_config(static_cast<Handle*>(handle), config);
-}
-
-int EchoCancellationImpl::num_handles_required() const {
- return apm_->num_output_channels() *
- apm_->num_reverse_channels();
-}
-
-int EchoCancellationImpl::GetHandleError(void* handle) const {
- assert(handle != NULL);
- return MapError(WebRtcAec_get_error_code(static_cast<Handle*>(handle)));
-}
-} // namespace webrtc
diff --git a/src/modules/audio_processing/main/source/echo_cancellation_impl.h b/src/modules/audio_processing/main/source/echo_cancellation_impl.h
deleted file mode 100644
index 380a698..0000000
--- a/src/modules/audio_processing/main/source/echo_cancellation_impl.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_ECHO_CANCELLATION_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_ECHO_CANCELLATION_IMPL_H_
-
-#include "audio_processing.h"
-#include "processing_component.h"
-
-namespace webrtc {
-class AudioProcessingImpl;
-class AudioBuffer;
-
-class EchoCancellationImpl : public EchoCancellation,
- public ProcessingComponent {
- public:
- explicit EchoCancellationImpl(const AudioProcessingImpl* apm);
- virtual ~EchoCancellationImpl();
-
- int ProcessRenderAudio(const AudioBuffer* audio);
- int ProcessCaptureAudio(AudioBuffer* audio);
-
- // EchoCancellation implementation.
- virtual bool is_enabled() const;
-
- // ProcessingComponent implementation.
- virtual int Initialize();
- virtual int get_version(char* version, int version_len_bytes) const;
-
- private:
- // EchoCancellation implementation.
- virtual int Enable(bool enable);
- virtual int enable_drift_compensation(bool enable);
- virtual bool is_drift_compensation_enabled() const;
- virtual int set_device_sample_rate_hz(int rate);
- virtual int device_sample_rate_hz() const;
- virtual int set_stream_drift_samples(int drift);
- virtual int stream_drift_samples() const;
- virtual int set_suppression_level(SuppressionLevel level);
- virtual SuppressionLevel suppression_level() const;
- virtual int enable_metrics(bool enable);
- virtual bool are_metrics_enabled() const;
- virtual bool stream_has_echo() const;
- virtual int GetMetrics(Metrics* metrics);
-
- // ProcessingComponent implementation.
- virtual void* CreateHandle() const;
- virtual int InitializeHandle(void* handle) const;
- virtual int ConfigureHandle(void* handle) const;
- virtual int DestroyHandle(void* handle) const;
- virtual int num_handles_required() const;
- virtual int GetHandleError(void* handle) const;
-
- const AudioProcessingImpl* apm_;
- bool drift_compensation_enabled_;
- bool metrics_enabled_;
- SuppressionLevel suppression_level_;
- int device_sample_rate_hz_;
- int stream_drift_samples_;
- bool was_stream_drift_set_;
- bool stream_has_echo_;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_ECHO_CANCELLATION_IMPL_H_
diff --git a/src/modules/audio_processing/main/source/echo_control_mobile_impl.cc b/src/modules/audio_processing/main/source/echo_control_mobile_impl.cc
deleted file mode 100644
index 1cd2502..0000000
--- a/src/modules/audio_processing/main/source/echo_control_mobile_impl.cc
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "echo_control_mobile_impl.h"
-
-#include <cassert>
-
-#include "critical_section_wrapper.h"
-#include "echo_control_mobile.h"
-
-#include "audio_processing_impl.h"
-#include "audio_buffer.h"
-
-namespace webrtc {
-
-typedef void Handle;
-
-namespace {
-WebRtc_Word16 MapSetting(EchoControlMobile::RoutingMode mode) {
- switch (mode) {
- case EchoControlMobile::kQuietEarpieceOrHeadset:
- return 0;
- case EchoControlMobile::kEarpiece:
- return 1;
- case EchoControlMobile::kLoudEarpiece:
- return 2;
- case EchoControlMobile::kSpeakerphone:
- return 3;
- case EchoControlMobile::kLoudSpeakerphone:
- return 4;
- default:
- return -1;
- }
-}
-
-int MapError(int err) {
- switch (err) {
- case AECM_UNSUPPORTED_FUNCTION_ERROR:
- return AudioProcessing::kUnsupportedFunctionError;
- case AECM_BAD_PARAMETER_ERROR:
- return AudioProcessing::kBadParameterError;
- case AECM_BAD_PARAMETER_WARNING:
- return AudioProcessing::kBadStreamParameterWarning;
- default:
- // AECMOBFIX_UNSPECIFIED_ERROR
- // AECMOBFIX_UNINITIALIZED_ERROR
- // AECMOBFIX_NULL_POINTER_ERROR
- return AudioProcessing::kUnspecifiedError;
- }
-}
-} // namespace
-
-EchoControlMobileImpl::EchoControlMobileImpl(const AudioProcessingImpl* apm)
- : ProcessingComponent(apm),
- apm_(apm),
- routing_mode_(kSpeakerphone),
- comfort_noise_enabled_(true) {}
-
-EchoControlMobileImpl::~EchoControlMobileImpl() {}
-
-int EchoControlMobileImpl::ProcessRenderAudio(const AudioBuffer* audio) {
- if (!is_component_enabled()) {
- return apm_->kNoError;
- }
-
- assert(audio->samples_per_split_channel() <= 160);
- assert(audio->num_channels() == apm_->num_reverse_channels());
-
- int err = apm_->kNoError;
-
- // The ordering convention must be followed to pass to the correct AECM.
- size_t handle_index = 0;
- for (int i = 0; i < apm_->num_output_channels(); i++) {
- for (int j = 0; j < audio->num_channels(); j++) {
- Handle* my_handle = static_cast<Handle*>(handle(handle_index));
- err = WebRtcAecm_BufferFarend(
- my_handle,
- audio->low_pass_split_data(j),
- static_cast<WebRtc_Word16>(audio->samples_per_split_channel()));
-
- if (err != apm_->kNoError) {
- return GetHandleError(my_handle); // TODO(ajm): warning possible?
- }
-
- handle_index++;
- }
- }
-
- return apm_->kNoError;
-}
-
-int EchoControlMobileImpl::ProcessCaptureAudio(AudioBuffer* audio) {
- if (!is_component_enabled()) {
- return apm_->kNoError;
- }
-
- if (!apm_->was_stream_delay_set()) {
- return apm_->kStreamParameterNotSetError;
- }
-
- assert(audio->samples_per_split_channel() <= 160);
- assert(audio->num_channels() == apm_->num_output_channels());
-
- int err = apm_->kNoError;
-
- // The ordering convention must be followed to pass to the correct AECM.
- size_t handle_index = 0;
- for (int i = 0; i < audio->num_channels(); i++) {
- // TODO(ajm): improve how this works, possibly inside AECM.
- // This is kind of hacked up.
- WebRtc_Word16* noisy = audio->low_pass_reference(i);
- WebRtc_Word16* clean = audio->low_pass_split_data(i);
- if (noisy == NULL) {
- noisy = clean;
- clean = NULL;
- }
- for (int j = 0; j < apm_->num_reverse_channels(); j++) {
- Handle* my_handle = static_cast<Handle*>(handle(handle_index));
- err = WebRtcAecm_Process(
- my_handle,
- noisy,
- clean,
- audio->low_pass_split_data(i),
- static_cast<WebRtc_Word16>(audio->samples_per_split_channel()),
- apm_->stream_delay_ms());
-
- if (err != apm_->kNoError) {
- return GetHandleError(my_handle); // TODO(ajm): warning possible?
- }
-
- handle_index++;
- }
- }
-
- return apm_->kNoError;
-}
-
-int EchoControlMobileImpl::Enable(bool enable) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- // Ensure AEC and AECM are not both enabled.
- if (enable && apm_->echo_cancellation()->is_enabled()) {
- return apm_->kBadParameterError;
- }
-
- return EnableComponent(enable);
-}
-
-bool EchoControlMobileImpl::is_enabled() const {
- return is_component_enabled();
-}
-
-int EchoControlMobileImpl::set_routing_mode(RoutingMode mode) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- if (MapSetting(mode) == -1) {
- return apm_->kBadParameterError;
- }
-
- routing_mode_ = mode;
- return Configure();
-}
-
-EchoControlMobile::RoutingMode EchoControlMobileImpl::routing_mode()
- const {
- return routing_mode_;
-}
-
-int EchoControlMobileImpl::enable_comfort_noise(bool enable) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- comfort_noise_enabled_ = enable;
- return Configure();
-}
-
-bool EchoControlMobileImpl::is_comfort_noise_enabled() const {
- return comfort_noise_enabled_;
-}
-
-int EchoControlMobileImpl::Initialize() {
- if (!is_component_enabled()) {
- return apm_->kNoError;
- }
-
- if (apm_->sample_rate_hz() == apm_->kSampleRate32kHz) {
- // AECM doesn't support super-wideband.
- return apm_->kBadSampleRateError;
- }
-
- return ProcessingComponent::Initialize();
-}
-
-int EchoControlMobileImpl::get_version(char* version,
- int version_len_bytes) const {
- if (WebRtcAecm_get_version(version, version_len_bytes) != 0) {
- return apm_->kBadParameterError;
- }
-
- return apm_->kNoError;
-}
-
-void* EchoControlMobileImpl::CreateHandle() const {
- Handle* handle = NULL;
- if (WebRtcAecm_Create(&handle) != apm_->kNoError) {
- handle = NULL;
- } else {
- assert(handle != NULL);
- }
-
- return handle;
-}
-
-int EchoControlMobileImpl::DestroyHandle(void* handle) const {
- return WebRtcAecm_Free(static_cast<Handle*>(handle));
-}
-
-int EchoControlMobileImpl::InitializeHandle(void* handle) const {
- return WebRtcAecm_Init(static_cast<Handle*>(handle),
- apm_->sample_rate_hz(),
- 48000); // Dummy value. This isn't actually
- // required by AECM.
-}
-
-int EchoControlMobileImpl::ConfigureHandle(void* handle) const {
- AecmConfig config;
- config.cngMode = comfort_noise_enabled_;
- config.echoMode = MapSetting(routing_mode_);
-
- return WebRtcAecm_set_config(static_cast<Handle*>(handle), config);
-}
-
-int EchoControlMobileImpl::num_handles_required() const {
- return apm_->num_output_channels() *
- apm_->num_reverse_channels();
-}
-
-int EchoControlMobileImpl::GetHandleError(void* handle) const {
- assert(handle != NULL);
- return MapError(WebRtcAecm_get_error_code(static_cast<Handle*>(handle)));
-}
-} // namespace webrtc
diff --git a/src/modules/audio_processing/main/source/echo_control_mobile_impl.h b/src/modules/audio_processing/main/source/echo_control_mobile_impl.h
deleted file mode 100644
index 2fd6248..0000000
--- a/src/modules/audio_processing/main/source/echo_control_mobile_impl.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_ECHO_CONTROL_MOBILE_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_ECHO_CONTROL_MOBILE_IMPL_H_
-
-#include "audio_processing.h"
-#include "processing_component.h"
-
-namespace webrtc {
-class AudioProcessingImpl;
-class AudioBuffer;
-
-class EchoControlMobileImpl : public EchoControlMobile,
- public ProcessingComponent {
- public:
- explicit EchoControlMobileImpl(const AudioProcessingImpl* apm);
- virtual ~EchoControlMobileImpl();
-
- int ProcessRenderAudio(const AudioBuffer* audio);
- int ProcessCaptureAudio(AudioBuffer* audio);
-
- // EchoControlMobile implementation.
- virtual bool is_enabled() const;
-
- // ProcessingComponent implementation.
- virtual int Initialize();
- virtual int get_version(char* version, int version_len_bytes) const;
-
- private:
- // EchoControlMobile implementation.
- virtual int Enable(bool enable);
- virtual int set_routing_mode(RoutingMode mode);
- virtual RoutingMode routing_mode() const;
- virtual int enable_comfort_noise(bool enable);
- virtual bool is_comfort_noise_enabled() const;
-
- // ProcessingComponent implementation.
- virtual void* CreateHandle() const;
- virtual int InitializeHandle(void* handle) const;
- virtual int ConfigureHandle(void* handle) const;
- virtual int DestroyHandle(void* handle) const;
- virtual int num_handles_required() const;
- virtual int GetHandleError(void* handle) const;
-
- const AudioProcessingImpl* apm_;
- RoutingMode routing_mode_;
- bool comfort_noise_enabled_;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_ECHO_CONTROL_MOBILE_IMPL_H_
diff --git a/src/modules/audio_processing/main/source/gain_control_impl.cc b/src/modules/audio_processing/main/source/gain_control_impl.cc
deleted file mode 100644
index dc3e565..0000000
--- a/src/modules/audio_processing/main/source/gain_control_impl.cc
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "gain_control_impl.h"
-
-#include <cassert>
-
-#include "critical_section_wrapper.h"
-#include "gain_control.h"
-
-#include "audio_processing_impl.h"
-#include "audio_buffer.h"
-
-namespace webrtc {
-
-typedef void Handle;
-
-/*template <class T>
-class GainControlHandle : public ComponentHandle<T> {
- public:
- GainControlHandle();
- virtual ~GainControlHandle();
-
- virtual int Create();
- virtual T* ptr() const;
-
- private:
- T* handle;
-};*/
-
-namespace {
-WebRtc_Word16 MapSetting(GainControl::Mode mode) {
- switch (mode) {
- case GainControl::kAdaptiveAnalog:
- return kAgcModeAdaptiveAnalog;
- break;
- case GainControl::kAdaptiveDigital:
- return kAgcModeAdaptiveDigital;
- break;
- case GainControl::kFixedDigital:
- return kAgcModeFixedDigital;
- break;
- default:
- return -1;
- }
-}
-} // namespace
-
-GainControlImpl::GainControlImpl(const AudioProcessingImpl* apm)
- : ProcessingComponent(apm),
- apm_(apm),
- mode_(kAdaptiveAnalog),
- minimum_capture_level_(0),
- maximum_capture_level_(255),
- limiter_enabled_(true),
- target_level_dbfs_(3),
- compression_gain_db_(9),
- analog_capture_level_(0),
- was_analog_level_set_(false),
- stream_is_saturated_(false) {}
-
-GainControlImpl::~GainControlImpl() {}
-
-int GainControlImpl::ProcessRenderAudio(AudioBuffer* audio) {
- if (!is_component_enabled()) {
- return apm_->kNoError;
- }
-
- assert(audio->samples_per_split_channel() <= 160);
-
- WebRtc_Word16* mixed_data = audio->low_pass_split_data(0);
- if (audio->num_channels() > 1) {
- audio->CopyAndMixLowPass(1);
- mixed_data = audio->mixed_low_pass_data(0);
- }
-
- for (int i = 0; i < num_handles(); i++) {
- Handle* my_handle = static_cast<Handle*>(handle(i));
- int err = WebRtcAgc_AddFarend(
- my_handle,
- mixed_data,
- static_cast<WebRtc_Word16>(audio->samples_per_split_channel()));
-
- if (err != apm_->kNoError) {
- return GetHandleError(my_handle);
- }
- }
-
- return apm_->kNoError;
-}
-
-int GainControlImpl::AnalyzeCaptureAudio(AudioBuffer* audio) {
- if (!is_component_enabled()) {
- return apm_->kNoError;
- }
-
- assert(audio->samples_per_split_channel() <= 160);
- assert(audio->num_channels() == num_handles());
-
- int err = apm_->kNoError;
-
- if (mode_ == kAdaptiveAnalog) {
- for (int i = 0; i < num_handles(); i++) {
- Handle* my_handle = static_cast<Handle*>(handle(i));
- err = WebRtcAgc_AddMic(
- my_handle,
- audio->low_pass_split_data(i),
- audio->high_pass_split_data(i),
- static_cast<WebRtc_Word16>(audio->samples_per_split_channel()));
-
- if (err != apm_->kNoError) {
- return GetHandleError(my_handle);
- }
- }
- } else if (mode_ == kAdaptiveDigital) {
-
- for (int i = 0; i < num_handles(); i++) {
- Handle* my_handle = static_cast<Handle*>(handle(i));
- WebRtc_Word32 capture_level_out = 0;
-
- err = WebRtcAgc_VirtualMic(
- my_handle,
- audio->low_pass_split_data(i),
- audio->high_pass_split_data(i),
- static_cast<WebRtc_Word16>(audio->samples_per_split_channel()),
- //capture_levels_[i],
- analog_capture_level_,
- &capture_level_out);
-
- capture_levels_[i] = capture_level_out;
-
- if (err != apm_->kNoError) {
- return GetHandleError(my_handle);
- }
-
- }
- }
-
- return apm_->kNoError;
-}
-
-int GainControlImpl::ProcessCaptureAudio(AudioBuffer* audio) {
- if (!is_component_enabled()) {
- return apm_->kNoError;
- }
-
- if (mode_ == kAdaptiveAnalog && !was_analog_level_set_) {
- return apm_->kStreamParameterNotSetError;
- }
-
- assert(audio->samples_per_split_channel() <= 160);
- assert(audio->num_channels() == num_handles());
-
- stream_is_saturated_ = false;
- for (int i = 0; i < num_handles(); i++) {
- Handle* my_handle = static_cast<Handle*>(handle(i));
- WebRtc_Word32 capture_level_out = 0;
- WebRtc_UWord8 saturation_warning = 0;
-
- int err = WebRtcAgc_Process(
- my_handle,
- audio->low_pass_split_data(i),
- audio->high_pass_split_data(i),
- static_cast<WebRtc_Word16>(audio->samples_per_split_channel()),
- audio->low_pass_split_data(i),
- audio->high_pass_split_data(i),
- capture_levels_[i],
- &capture_level_out,
- apm_->echo_cancellation()->stream_has_echo(),
- &saturation_warning);
-
- if (err != apm_->kNoError) {
- return GetHandleError(my_handle);
- }
-
- capture_levels_[i] = capture_level_out;
- if (saturation_warning == 1) {
- stream_is_saturated_ = true;
- }
- }
-
- if (mode_ == kAdaptiveAnalog) {
- // Take the analog level to be the average across the handles.
- analog_capture_level_ = 0;
- for (int i = 0; i < num_handles(); i++) {
- analog_capture_level_ += capture_levels_[i];
- }
-
- analog_capture_level_ /= num_handles();
- }
-
- was_analog_level_set_ = false;
- return apm_->kNoError;
-}
-
-// TODO(ajm): ensure this is called under kAdaptiveAnalog.
-int GainControlImpl::set_stream_analog_level(int level) {
- was_analog_level_set_ = true;
- if (level < minimum_capture_level_ || level > maximum_capture_level_) {
- return apm_->kBadParameterError;
- }
-
- if (mode_ == kAdaptiveAnalog) {
- if (level != analog_capture_level_) {
- // The analog level has been changed; update our internal levels.
- capture_levels_.assign(num_handles(), level);
- }
- }
- analog_capture_level_ = level;
-
- return apm_->kNoError;
-}
-
-int GainControlImpl::stream_analog_level() {
- // TODO(ajm): enable this assertion?
- //assert(mode_ == kAdaptiveAnalog);
-
- return analog_capture_level_;
-}
-
-int GainControlImpl::Enable(bool enable) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- return EnableComponent(enable);
-}
-
-bool GainControlImpl::is_enabled() const {
- return is_component_enabled();
-}
-
-int GainControlImpl::set_mode(Mode mode) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- if (MapSetting(mode) == -1) {
- return apm_->kBadParameterError;
- }
-
- mode_ = mode;
- return Initialize();
-}
-
-GainControl::Mode GainControlImpl::mode() const {
- return mode_;
-}
-
-int GainControlImpl::set_analog_level_limits(int minimum,
- int maximum) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- if (minimum < 0) {
- return apm_->kBadParameterError;
- }
-
- if (maximum > 65535) {
- return apm_->kBadParameterError;
- }
-
- if (maximum < minimum) {
- return apm_->kBadParameterError;
- }
-
- minimum_capture_level_ = minimum;
- maximum_capture_level_ = maximum;
-
- return Initialize();
-}
-
-int GainControlImpl::analog_level_minimum() const {
- return minimum_capture_level_;
-}
-
-int GainControlImpl::analog_level_maximum() const {
- return maximum_capture_level_;
-}
-
-bool GainControlImpl::stream_is_saturated() const {
- return stream_is_saturated_;
-}
-
-int GainControlImpl::set_target_level_dbfs(int level) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- if (level > 31 || level < 0) {
- return apm_->kBadParameterError;
- }
-
- target_level_dbfs_ = level;
- return Configure();
-}
-
-int GainControlImpl::target_level_dbfs() const {
- return target_level_dbfs_;
-}
-
-int GainControlImpl::set_compression_gain_db(int gain) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- if (gain < 0 || gain > 90) {
- return apm_->kBadParameterError;
- }
-
- compression_gain_db_ = gain;
- return Configure();
-}
-
-int GainControlImpl::compression_gain_db() const {
- return compression_gain_db_;
-}
-
-int GainControlImpl::enable_limiter(bool enable) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- limiter_enabled_ = enable;
- return Configure();
-}
-
-bool GainControlImpl::is_limiter_enabled() const {
- return limiter_enabled_;
-}
-
-int GainControlImpl::Initialize() {
- int err = ProcessingComponent::Initialize();
- if (err != apm_->kNoError || !is_component_enabled()) {
- return err;
- }
-
- analog_capture_level_ =
- (maximum_capture_level_ - minimum_capture_level_) >> 1;
- capture_levels_.assign(num_handles(), analog_capture_level_);
- was_analog_level_set_ = false;
-
- return apm_->kNoError;
-}
-
-int GainControlImpl::get_version(char* version, int version_len_bytes) const {
- if (WebRtcAgc_Version(version, version_len_bytes) != 0) {
- return apm_->kBadParameterError;
- }
-
- return apm_->kNoError;
-}
-
-void* GainControlImpl::CreateHandle() const {
- Handle* handle = NULL;
- if (WebRtcAgc_Create(&handle) != apm_->kNoError) {
- handle = NULL;
- } else {
- assert(handle != NULL);
- }
-
- return handle;
-}
-
-int GainControlImpl::DestroyHandle(void* handle) const {
- return WebRtcAgc_Free(static_cast<Handle*>(handle));
-}
-
-int GainControlImpl::InitializeHandle(void* handle) const {
- return WebRtcAgc_Init(static_cast<Handle*>(handle),
- minimum_capture_level_,
- maximum_capture_level_,
- MapSetting(mode_),
- apm_->sample_rate_hz());
-}
-
-int GainControlImpl::ConfigureHandle(void* handle) const {
- WebRtcAgc_config_t config;
- // TODO(ajm): Flip the sign here (since AGC expects a positive value) if we
- // change the interface.
- //assert(target_level_dbfs_ <= 0);
- //config.targetLevelDbfs = static_cast<WebRtc_Word16>(-target_level_dbfs_);
- config.targetLevelDbfs = static_cast<WebRtc_Word16>(target_level_dbfs_);
- config.compressionGaindB =
- static_cast<WebRtc_Word16>(compression_gain_db_);
- config.limiterEnable = limiter_enabled_;
-
- return WebRtcAgc_set_config(static_cast<Handle*>(handle), config);
-}
-
-int GainControlImpl::num_handles_required() const {
- return apm_->num_output_channels();
-}
-
-int GainControlImpl::GetHandleError(void* handle) const {
- // The AGC has no get_error() function.
- // (Despite listing errors in its interface...)
- assert(handle != NULL);
- return apm_->kUnspecifiedError;
-}
-} // namespace webrtc
diff --git a/src/modules/audio_processing/main/source/gain_control_impl.h b/src/modules/audio_processing/main/source/gain_control_impl.h
deleted file mode 100644
index a11d606..0000000
--- a/src/modules/audio_processing/main/source/gain_control_impl.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_GAIN_CONTROL_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_GAIN_CONTROL_IMPL_H_
-
-#include <vector>
-
-#include "audio_processing.h"
-#include "processing_component.h"
-
-namespace webrtc {
-class AudioProcessingImpl;
-class AudioBuffer;
-
-class GainControlImpl : public GainControl,
- public ProcessingComponent {
- public:
- explicit GainControlImpl(const AudioProcessingImpl* apm);
- virtual ~GainControlImpl();
-
- int ProcessRenderAudio(AudioBuffer* audio);
- int AnalyzeCaptureAudio(AudioBuffer* audio);
- int ProcessCaptureAudio(AudioBuffer* audio);
-
- // ProcessingComponent implementation.
- virtual int Initialize();
- virtual int get_version(char* version, int version_len_bytes) const;
-
- // GainControl implementation.
- virtual bool is_enabled() const;
-
- private:
- // GainControl implementation.
- virtual int Enable(bool enable);
- virtual int set_stream_analog_level(int level);
- virtual int stream_analog_level();
- virtual int set_mode(Mode mode);
- virtual Mode mode() const;
- virtual int set_target_level_dbfs(int level);
- virtual int target_level_dbfs() const;
- virtual int set_compression_gain_db(int gain);
- virtual int compression_gain_db() const;
- virtual int enable_limiter(bool enable);
- virtual bool is_limiter_enabled() const;
- virtual int set_analog_level_limits(int minimum, int maximum);
- virtual int analog_level_minimum() const;
- virtual int analog_level_maximum() const;
- virtual bool stream_is_saturated() const;
-
- // ProcessingComponent implementation.
- virtual void* CreateHandle() const;
- virtual int InitializeHandle(void* handle) const;
- virtual int ConfigureHandle(void* handle) const;
- virtual int DestroyHandle(void* handle) const;
- virtual int num_handles_required() const;
- virtual int GetHandleError(void* handle) const;
-
- const AudioProcessingImpl* apm_;
- Mode mode_;
- int minimum_capture_level_;
- int maximum_capture_level_;
- bool limiter_enabled_;
- int target_level_dbfs_;
- int compression_gain_db_;
- std::vector<int> capture_levels_;
- int analog_capture_level_;
- bool was_analog_level_set_;
- bool stream_is_saturated_;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_GAIN_CONTROL_IMPL_H_
diff --git a/src/modules/audio_processing/main/source/high_pass_filter_impl.cc b/src/modules/audio_processing/main/source/high_pass_filter_impl.cc
deleted file mode 100644
index fa6d5d5..0000000
--- a/src/modules/audio_processing/main/source/high_pass_filter_impl.cc
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "high_pass_filter_impl.h"
-
-#include <cassert>
-
-#include "critical_section_wrapper.h"
-#include "typedefs.h"
-#include "signal_processing_library.h"
-
-#include "audio_processing_impl.h"
-#include "audio_buffer.h"
-
-namespace webrtc {
-namespace {
-const WebRtc_Word16 kFilterCoefficients8kHz[5] =
- {3798, -7596, 3798, 7807, -3733};
-
-const WebRtc_Word16 kFilterCoefficients[5] =
- {4012, -8024, 4012, 8002, -3913};
-
-struct FilterState {
- WebRtc_Word16 y[4];
- WebRtc_Word16 x[2];
- const WebRtc_Word16* ba;
-};
-
-int InitializeFilter(FilterState* hpf, int sample_rate_hz) {
- assert(hpf != NULL);
-
- if (sample_rate_hz == AudioProcessingImpl::kSampleRate8kHz) {
- hpf->ba = kFilterCoefficients8kHz;
- } else {
- hpf->ba = kFilterCoefficients;
- }
-
- WebRtcSpl_MemSetW16(hpf->x, 0, 2);
- WebRtcSpl_MemSetW16(hpf->y, 0, 4);
-
- return AudioProcessing::kNoError;
-}
-
-int Filter(FilterState* hpf, WebRtc_Word16* data, int length) {
- assert(hpf != NULL);
-
- WebRtc_Word32 tmp_int32 = 0;
- WebRtc_Word16* y = hpf->y;
- WebRtc_Word16* x = hpf->x;
- const WebRtc_Word16* ba = hpf->ba;
-
- for (int i = 0; i < length; i++) {
- // y[i] = b[0] * x[i] + b[1] * x[i-1] + b[2] * x[i-2]
- // + -a[1] * y[i-1] + -a[2] * y[i-2];
-
- tmp_int32 =
- WEBRTC_SPL_MUL_16_16(y[1], ba[3]); // -a[1] * y[i-1] (low part)
- tmp_int32 +=
- WEBRTC_SPL_MUL_16_16(y[3], ba[4]); // -a[2] * y[i-2] (low part)
- tmp_int32 = (tmp_int32 >> 15);
- tmp_int32 +=
- WEBRTC_SPL_MUL_16_16(y[0], ba[3]); // -a[1] * y[i-1] (high part)
- tmp_int32 +=
- WEBRTC_SPL_MUL_16_16(y[2], ba[4]); // -a[2] * y[i-2] (high part)
- tmp_int32 = (tmp_int32 << 1);
-
- tmp_int32 += WEBRTC_SPL_MUL_16_16(data[i], ba[0]); // b[0]*x[0]
- tmp_int32 += WEBRTC_SPL_MUL_16_16(x[0], ba[1]); // b[1]*x[i-1]
- tmp_int32 += WEBRTC_SPL_MUL_16_16(x[1], ba[2]); // b[2]*x[i-2]
-
- // Update state (input part)
- x[1] = x[0];
- x[0] = data[i];
-
- // Update state (filtered part)
- y[2] = y[0];
- y[3] = y[1];
- y[0] = static_cast<WebRtc_Word16>(tmp_int32 >> 13);
- y[1] = static_cast<WebRtc_Word16>((tmp_int32 -
- WEBRTC_SPL_LSHIFT_W32(static_cast<WebRtc_Word32>(y[0]), 13)) << 2);
-
- // Rounding in Q12, i.e. add 2^11
- tmp_int32 += 2048;
-
- // Saturate (to 2^27) so that the HP filtered signal does not overflow
- tmp_int32 = WEBRTC_SPL_SAT(static_cast<WebRtc_Word32>(134217727),
- tmp_int32,
- static_cast<WebRtc_Word32>(-134217728));
-
- // Convert back to Q0 and use rounding
- data[i] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp_int32, 12);
-
- }
-
- return AudioProcessing::kNoError;
-}
-} // namespace
-
-typedef FilterState Handle;
-
-HighPassFilterImpl::HighPassFilterImpl(const AudioProcessingImpl* apm)
- : ProcessingComponent(apm),
- apm_(apm) {}
-
-HighPassFilterImpl::~HighPassFilterImpl() {}
-
-int HighPassFilterImpl::ProcessCaptureAudio(AudioBuffer* audio) {
- int err = apm_->kNoError;
-
- if (!is_component_enabled()) {
- return apm_->kNoError;
- }
-
- assert(audio->samples_per_split_channel() <= 160);
-
- for (int i = 0; i < num_handles(); i++) {
- Handle* my_handle = static_cast<Handle*>(handle(i));
- err = Filter(my_handle,
- audio->low_pass_split_data(i),
- audio->samples_per_split_channel());
-
- if (err != apm_->kNoError) {
- return GetHandleError(my_handle);
- }
- }
-
- return apm_->kNoError;
-}
-
-int HighPassFilterImpl::Enable(bool enable) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- return EnableComponent(enable);
-}
-
-bool HighPassFilterImpl::is_enabled() const {
- return is_component_enabled();
-}
-
-int HighPassFilterImpl::get_version(char* version,
- int version_len_bytes) const {
- // An empty string is used to indicate no version information.
- memset(version, 0, version_len_bytes);
- return apm_->kNoError;
-}
-
-void* HighPassFilterImpl::CreateHandle() const {
- return new FilterState;
-}
-
-int HighPassFilterImpl::DestroyHandle(void* handle) const {
- delete static_cast<Handle*>(handle);
- return apm_->kNoError;
-}
-
-int HighPassFilterImpl::InitializeHandle(void* handle) const {
- return InitializeFilter(static_cast<Handle*>(handle),
- apm_->sample_rate_hz());
-}
-
-int HighPassFilterImpl::ConfigureHandle(void* /*handle*/) const {
- return apm_->kNoError; // Not configurable.
-}
-
-int HighPassFilterImpl::num_handles_required() const {
- return apm_->num_output_channels();
-}
-
-int HighPassFilterImpl::GetHandleError(void* handle) const {
- // The component has no detailed errors.
- assert(handle != NULL);
- return apm_->kUnspecifiedError;
-}
-} // namespace webrtc
diff --git a/src/modules/audio_processing/main/source/high_pass_filter_impl.h b/src/modules/audio_processing/main/source/high_pass_filter_impl.h
deleted file mode 100644
index 4c23754..0000000
--- a/src/modules/audio_processing/main/source/high_pass_filter_impl.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_HIGH_PASS_FILTER_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_HIGH_PASS_FILTER_IMPL_H_
-
-#include "audio_processing.h"
-#include "processing_component.h"
-
-namespace webrtc {
-class AudioProcessingImpl;
-class AudioBuffer;
-
-class HighPassFilterImpl : public HighPassFilter,
- public ProcessingComponent {
- public:
- explicit HighPassFilterImpl(const AudioProcessingImpl* apm);
- virtual ~HighPassFilterImpl();
-
- int ProcessCaptureAudio(AudioBuffer* audio);
-
- // HighPassFilter implementation.
- virtual bool is_enabled() const;
-
- // ProcessingComponent implementation.
- virtual int get_version(char* version, int version_len_bytes) const;
-
- private:
- // HighPassFilter implementation.
- virtual int Enable(bool enable);
-
- // ProcessingComponent implementation.
- virtual void* CreateHandle() const;
- virtual int InitializeHandle(void* handle) const;
- virtual int ConfigureHandle(void* handle) const;
- virtual int DestroyHandle(void* handle) const;
- virtual int num_handles_required() const;
- virtual int GetHandleError(void* handle) const;
-
- const AudioProcessingImpl* apm_;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_HIGH_PASS_FILTER_IMPL_H_
diff --git a/src/modules/audio_processing/main/source/level_estimator_impl.cc b/src/modules/audio_processing/main/source/level_estimator_impl.cc
deleted file mode 100644
index 799a962..0000000
--- a/src/modules/audio_processing/main/source/level_estimator_impl.cc
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "level_estimator_impl.h"
-
-#include <cassert>
-#include <cstring>
-
-#include "critical_section_wrapper.h"
-
-#include "audio_processing_impl.h"
-#include "audio_buffer.h"
-
-// TODO(ajm): implement the underlying level estimator component.
-
-namespace webrtc {
-
-typedef void Handle;
-
-namespace {
-/*int EstimateLevel(AudioBuffer* audio, Handle* my_handle) {
- assert(audio->samples_per_split_channel() <= 160);
-
- WebRtc_Word16* mixed_data = audio->low_pass_split_data(0);
- if (audio->num_channels() > 1) {
- audio->CopyAndMixLowPass(1);
- mixed_data = audio->mixed_low_pass_data(0);
- }
-
- int err = UpdateLvlEst(my_handle,
- mixed_data,
- audio->samples_per_split_channel());
- if (err != AudioProcessing::kNoError) {
- return GetHandleError(my_handle);
- }
-
- return AudioProcessing::kNoError;
-}
-
-int GetMetricsLocal(Handle* my_handle, LevelEstimator::Metrics* metrics) {
- level_t levels;
- memset(&levels, 0, sizeof(levels));
-
- int err = ExportLevels(my_handle, &levels, 2);
- if (err != AudioProcessing::kNoError) {
- return err;
- }
- metrics->signal.instant = levels.instant;
- metrics->signal.average = levels.average;
- metrics->signal.maximum = levels.max;
- metrics->signal.minimum = levels.min;
-
- err = ExportLevels(my_handle, &levels, 1);
- if (err != AudioProcessing::kNoError) {
- return err;
- }
- metrics->speech.instant = levels.instant;
- metrics->speech.average = levels.average;
- metrics->speech.maximum = levels.max;
- metrics->speech.minimum = levels.min;
-
- err = ExportLevels(my_handle, &levels, 0);
- if (err != AudioProcessing::kNoError) {
- return err;
- }
- metrics->noise.instant = levels.instant;
- metrics->noise.average = levels.average;
- metrics->noise.maximum = levels.max;
- metrics->noise.minimum = levels.min;
-
- return AudioProcessing::kNoError;
-}*/
-} // namespace
-
-LevelEstimatorImpl::LevelEstimatorImpl(const AudioProcessingImpl* apm)
- : ProcessingComponent(apm),
- apm_(apm) {}
-
-LevelEstimatorImpl::~LevelEstimatorImpl() {}
-
-int LevelEstimatorImpl::AnalyzeReverseStream(AudioBuffer* /*audio*/) {
- return apm_->kUnsupportedComponentError;
- /*if (!is_component_enabled()) {
- return apm_->kNoError;
- }
-
- return EstimateLevel(audio, static_cast<Handle*>(handle(1)));*/
-}
-
-int LevelEstimatorImpl::ProcessCaptureAudio(AudioBuffer* /*audio*/) {
- return apm_->kUnsupportedComponentError;
- /*if (!is_component_enabled()) {
- return apm_->kNoError;
- }
-
- return EstimateLevel(audio, static_cast<Handle*>(handle(0)));*/
-}
-
-int LevelEstimatorImpl::Enable(bool /*enable*/) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- return apm_->kUnsupportedComponentError;
- //return EnableComponent(enable);
-}
-
-bool LevelEstimatorImpl::is_enabled() const {
- return is_component_enabled();
-}
-
-int LevelEstimatorImpl::GetMetrics(LevelEstimator::Metrics* /*metrics*/,
- LevelEstimator::Metrics* /*reverse_metrics*/) {
- return apm_->kUnsupportedComponentError;
- /*if (!is_component_enabled()) {
- return apm_->kNotEnabledError;
- }
-
- int err = GetMetricsLocal(static_cast<Handle*>(handle(0)), metrics);
- if (err != apm_->kNoError) {
- return err;
- }
-
- err = GetMetricsLocal(static_cast<Handle*>(handle(1)), reverse_metrics);
- if (err != apm_->kNoError) {
- return err;
- }
-
- return apm_->kNoError;*/
-}
-
-int LevelEstimatorImpl::get_version(char* version,
- int version_len_bytes) const {
- // An empty string is used to indicate no version information.
- memset(version, 0, version_len_bytes);
- return apm_->kNoError;
-}
-
-void* LevelEstimatorImpl::CreateHandle() const {
- Handle* handle = NULL;
- /*if (CreateLvlEst(&handle) != apm_->kNoError) {
- handle = NULL;
- } else {
- assert(handle != NULL);
- }*/
-
- return handle;
-}
-
-int LevelEstimatorImpl::DestroyHandle(void* /*handle*/) const {
- return apm_->kUnsupportedComponentError;
- //return FreeLvlEst(static_cast<Handle*>(handle));
-}
-
-int LevelEstimatorImpl::InitializeHandle(void* /*handle*/) const {
- return apm_->kUnsupportedComponentError;
- /*const double kIntervalSeconds = 1.5;
- return InitLvlEst(static_cast<Handle*>(handle),
- apm_->sample_rate_hz(),
- kIntervalSeconds);*/
-}
-
-int LevelEstimatorImpl::ConfigureHandle(void* /*handle*/) const {
- return apm_->kUnsupportedComponentError;
- //return apm_->kNoError;
-}
-
-int LevelEstimatorImpl::num_handles_required() const {
- return apm_->kUnsupportedComponentError;
- //return 2;
-}
-
-int LevelEstimatorImpl::GetHandleError(void* handle) const {
- // The component has no detailed errors.
- assert(handle != NULL);
- return apm_->kUnspecifiedError;
-}
-} // namespace webrtc
diff --git a/src/modules/audio_processing/main/source/level_estimator_impl.h b/src/modules/audio_processing/main/source/level_estimator_impl.h
deleted file mode 100644
index 1515722..0000000
--- a/src/modules/audio_processing/main/source/level_estimator_impl.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_LEVEL_ESTIMATOR_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_LEVEL_ESTIMATOR_IMPL_H_
-
-#include "audio_processing.h"
-#include "processing_component.h"
-
-namespace webrtc {
-class AudioProcessingImpl;
-class AudioBuffer;
-
-class LevelEstimatorImpl : public LevelEstimator,
- public ProcessingComponent {
- public:
- explicit LevelEstimatorImpl(const AudioProcessingImpl* apm);
- virtual ~LevelEstimatorImpl();
-
- int AnalyzeReverseStream(AudioBuffer* audio);
- int ProcessCaptureAudio(AudioBuffer* audio);
-
- // LevelEstimator implementation.
- virtual bool is_enabled() const;
-
- // ProcessingComponent implementation.
- virtual int get_version(char* version, int version_len_bytes) const;
-
- private:
- // LevelEstimator implementation.
- virtual int Enable(bool enable);
- virtual int GetMetrics(Metrics* metrics, Metrics* reverse_metrics);
-
- // ProcessingComponent implementation.
- virtual void* CreateHandle() const;
- virtual int InitializeHandle(void* handle) const;
- virtual int ConfigureHandle(void* handle) const;
- virtual int DestroyHandle(void* handle) const;
- virtual int num_handles_required() const;
- virtual int GetHandleError(void* handle) const;
-
- const AudioProcessingImpl* apm_;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_LEVEL_ESTIMATOR_IMPL_H_
diff --git a/src/modules/audio_processing/main/source/noise_suppression_impl.cc b/src/modules/audio_processing/main/source/noise_suppression_impl.cc
deleted file mode 100644
index f899f35..0000000
--- a/src/modules/audio_processing/main/source/noise_suppression_impl.cc
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "noise_suppression_impl.h"
-
-#include <cassert>
-
-#include "critical_section_wrapper.h"
-#if defined(WEBRTC_NS_FLOAT)
-#include "noise_suppression.h"
-#elif defined(WEBRTC_NS_FIXED)
-#include "noise_suppression_x.h"
-#endif
-
-#include "audio_processing_impl.h"
-#include "audio_buffer.h"
-
-namespace webrtc {
-
-#if defined(WEBRTC_NS_FLOAT)
-typedef NsHandle Handle;
-#elif defined(WEBRTC_NS_FIXED)
-typedef NsxHandle Handle;
-#endif
-
-namespace {
-int MapSetting(NoiseSuppression::Level level) {
- switch (level) {
- case NoiseSuppression::kLow:
- return 0;
- case NoiseSuppression::kModerate:
- return 1;
- case NoiseSuppression::kHigh:
- return 2;
- case NoiseSuppression::kVeryHigh:
- return 3;
- default:
- return -1;
- }
-}
-} // namespace
-
-NoiseSuppressionImpl::NoiseSuppressionImpl(const AudioProcessingImpl* apm)
- : ProcessingComponent(apm),
- apm_(apm),
- level_(kModerate) {}
-
-NoiseSuppressionImpl::~NoiseSuppressionImpl() {}
-
-int NoiseSuppressionImpl::ProcessCaptureAudio(AudioBuffer* audio) {
- int err = apm_->kNoError;
-
- if (!is_component_enabled()) {
- return apm_->kNoError;
- }
- assert(audio->samples_per_split_channel() <= 160);
- assert(audio->num_channels() == num_handles());
-
- for (int i = 0; i < num_handles(); i++) {
- Handle* my_handle = static_cast<Handle*>(handle(i));
-#if defined(WEBRTC_NS_FLOAT)
- err = WebRtcNs_Process(static_cast<Handle*>(handle(i)),
- audio->low_pass_split_data(i),
- audio->high_pass_split_data(i),
- audio->low_pass_split_data(i),
- audio->high_pass_split_data(i));
-#elif defined(WEBRTC_NS_FIXED)
- err = WebRtcNsx_Process(static_cast<Handle*>(handle(i)),
- audio->low_pass_split_data(i),
- audio->high_pass_split_data(i),
- audio->low_pass_split_data(i),
- audio->high_pass_split_data(i));
-#endif
-
- if (err != apm_->kNoError) {
- return GetHandleError(my_handle);
- }
- }
-
- return apm_->kNoError;
-}
-
-int NoiseSuppressionImpl::Enable(bool enable) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- return EnableComponent(enable);
-}
-
-bool NoiseSuppressionImpl::is_enabled() const {
- return is_component_enabled();
-}
-
-int NoiseSuppressionImpl::set_level(Level level) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- if (MapSetting(level) == -1) {
- return apm_->kBadParameterError;
- }
-
- level_ = level;
- return Configure();
-}
-
-NoiseSuppression::Level NoiseSuppressionImpl::level() const {
- return level_;
-}
-
-int NoiseSuppressionImpl::get_version(char* version,
- int version_len_bytes) const {
-#if defined(WEBRTC_NS_FLOAT)
- if (WebRtcNs_get_version(version, version_len_bytes) != 0)
-#elif defined(WEBRTC_NS_FIXED)
- if (WebRtcNsx_get_version(version, version_len_bytes) != 0)
-#endif
- {
- return apm_->kBadParameterError;
- }
-
- return apm_->kNoError;
-}
-
-void* NoiseSuppressionImpl::CreateHandle() const {
- Handle* handle = NULL;
-#if defined(WEBRTC_NS_FLOAT)
- if (WebRtcNs_Create(&handle) != apm_->kNoError)
-#elif defined(WEBRTC_NS_FIXED)
- if (WebRtcNsx_Create(&handle) != apm_->kNoError)
-#endif
- {
- handle = NULL;
- } else {
- assert(handle != NULL);
- }
-
- return handle;
-}
-
-int NoiseSuppressionImpl::DestroyHandle(void* handle) const {
-#if defined(WEBRTC_NS_FLOAT)
- return WebRtcNs_Free(static_cast<Handle*>(handle));
-#elif defined(WEBRTC_NS_FIXED)
- return WebRtcNsx_Free(static_cast<Handle*>(handle));
-#endif
-}
-
-int NoiseSuppressionImpl::InitializeHandle(void* handle) const {
-#if defined(WEBRTC_NS_FLOAT)
- return WebRtcNs_Init(static_cast<Handle*>(handle), apm_->sample_rate_hz());
-#elif defined(WEBRTC_NS_FIXED)
- return WebRtcNsx_Init(static_cast<Handle*>(handle), apm_->sample_rate_hz());
-#endif
-}
-
-int NoiseSuppressionImpl::ConfigureHandle(void* handle) const {
-#if defined(WEBRTC_NS_FLOAT)
- return WebRtcNs_set_policy(static_cast<Handle*>(handle),
- MapSetting(level_));
-#elif defined(WEBRTC_NS_FIXED)
- return WebRtcNsx_set_policy(static_cast<Handle*>(handle),
- MapSetting(level_));
-#endif
-}
-
-int NoiseSuppressionImpl::num_handles_required() const {
- return apm_->num_output_channels();
-}
-
-int NoiseSuppressionImpl::GetHandleError(void* handle) const {
- // The NS has no get_error() function.
- assert(handle != NULL);
- return apm_->kUnspecifiedError;
-}
-} // namespace webrtc
-
diff --git a/src/modules/audio_processing/main/source/noise_suppression_impl.h b/src/modules/audio_processing/main/source/noise_suppression_impl.h
deleted file mode 100644
index c9ff9b3..0000000
--- a/src/modules/audio_processing/main/source/noise_suppression_impl.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_NOISE_SUPPRESSION_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_NOISE_SUPPRESSION_IMPL_H_
-
-#include "audio_processing.h"
-#include "processing_component.h"
-
-namespace webrtc {
-class AudioProcessingImpl;
-class AudioBuffer;
-
-class NoiseSuppressionImpl : public NoiseSuppression,
- public ProcessingComponent {
- public:
- explicit NoiseSuppressionImpl(const AudioProcessingImpl* apm);
- virtual ~NoiseSuppressionImpl();
-
- int ProcessCaptureAudio(AudioBuffer* audio);
-
- // NoiseSuppression implementation.
- virtual bool is_enabled() const;
-
- // ProcessingComponent implementation.
- virtual int get_version(char* version, int version_len_bytes) const;
-
- private:
- // NoiseSuppression implementation.
- virtual int Enable(bool enable);
- virtual int set_level(Level level);
- virtual Level level() const;
-
- // ProcessingComponent implementation.
- virtual void* CreateHandle() const;
- virtual int InitializeHandle(void* handle) const;
- virtual int ConfigureHandle(void* handle) const;
- virtual int DestroyHandle(void* handle) const;
- virtual int num_handles_required() const;
- virtual int GetHandleError(void* handle) const;
-
- const AudioProcessingImpl* apm_;
- Level level_;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_NOISE_SUPPRESSION_IMPL_H_
diff --git a/src/modules/audio_processing/main/source/processing_component.cc b/src/modules/audio_processing/main/source/processing_component.cc
deleted file mode 100644
index 9ac1257..0000000
--- a/src/modules/audio_processing/main/source/processing_component.cc
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "processing_component.h"
-
-#include <cassert>
-
-#include "audio_processing_impl.h"
-
-namespace webrtc {
-
-ProcessingComponent::ProcessingComponent(const AudioProcessingImpl* apm)
- : apm_(apm),
- initialized_(false),
- enabled_(false),
- num_handles_(0) {}
-
-ProcessingComponent::~ProcessingComponent() {
- assert(initialized_ == false);
-}
-
-int ProcessingComponent::Destroy() {
- while (!handles_.empty()) {
- DestroyHandle(handles_.back());
- handles_.pop_back();
- }
- initialized_ = false;
-
- return apm_->kNoError;
-}
-
-int ProcessingComponent::EnableComponent(bool enable) {
- if (enable && !enabled_) {
- enabled_ = enable; // Must be set before Initialize() is called.
-
- int err = Initialize();
- if (err != apm_->kNoError) {
- enabled_ = false;
- return err;
- }
- } else {
- enabled_ = enable;
- }
-
- return apm_->kNoError;
-}
-
-bool ProcessingComponent::is_component_enabled() const {
- return enabled_;
-}
-
-void* ProcessingComponent::handle(int index) const {
- assert(index < num_handles_);
- return handles_[index];
-}
-
-int ProcessingComponent::num_handles() const {
- return num_handles_;
-}
-
-int ProcessingComponent::Initialize() {
- if (!enabled_) {
- return apm_->kNoError;
- }
-
- num_handles_ = num_handles_required();
- if (num_handles_ > static_cast<int>(handles_.size())) {
- handles_.resize(num_handles_, NULL);
- }
-
- assert(static_cast<int>(handles_.size()) >= num_handles_);
- for (int i = 0; i < num_handles_; i++) {
- if (handles_[i] == NULL) {
- handles_[i] = CreateHandle();
- if (handles_[i] == NULL) {
- return apm_->kCreationFailedError;
- }
- }
-
- int err = InitializeHandle(handles_[i]);
- if (err != apm_->kNoError) {
- return GetHandleError(handles_[i]);
- }
- }
-
- initialized_ = true;
- return Configure();
-}
-
-int ProcessingComponent::Configure() {
- if (!initialized_) {
- return apm_->kNoError;
- }
-
- assert(static_cast<int>(handles_.size()) >= num_handles_);
- for (int i = 0; i < num_handles_; i++) {
- int err = ConfigureHandle(handles_[i]);
- if (err != apm_->kNoError) {
- return GetHandleError(handles_[i]);
- }
- }
-
- return apm_->kNoError;
-}
-} // namespace webrtc
diff --git a/src/modules/audio_processing/main/source/processing_component.h b/src/modules/audio_processing/main/source/processing_component.h
deleted file mode 100644
index 3d8a02b..0000000
--- a/src/modules/audio_processing/main/source/processing_component.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_PROCESSING_COMPONENT_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_PROCESSING_COMPONENT_H_
-
-#include <vector>
-
-#include "audio_processing.h"
-
-namespace webrtc {
-class AudioProcessingImpl;
-
-/*template <class T>
-class ComponentHandle {
- public:
- ComponentHandle();
- virtual ~ComponentHandle();
-
- virtual int Create() = 0;
- virtual T* ptr() const = 0;
-};*/
-
-class ProcessingComponent {
- public:
- explicit ProcessingComponent(const AudioProcessingImpl* apm);
- virtual ~ProcessingComponent();
-
- virtual int Initialize();
- virtual int Destroy();
- virtual int get_version(char* version, int version_len_bytes) const = 0;
-
- protected:
- virtual int Configure();
- int EnableComponent(bool enable);
- bool is_component_enabled() const;
- void* handle(int index) const;
- int num_handles() const;
-
- private:
- virtual void* CreateHandle() const = 0;
- virtual int InitializeHandle(void* handle) const = 0;
- virtual int ConfigureHandle(void* handle) const = 0;
- virtual int DestroyHandle(void* handle) const = 0;
- virtual int num_handles_required() const = 0;
- virtual int GetHandleError(void* handle) const = 0;
-
- const AudioProcessingImpl* apm_;
- std::vector<void*> handles_;
- bool initialized_;
- bool enabled_;
- int num_handles_;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_PROCESSING_COMPONENT_H__
diff --git a/src/modules/audio_processing/main/source/splitting_filter.cc b/src/modules/audio_processing/main/source/splitting_filter.cc
deleted file mode 100644
index 1526141..0000000
--- a/src/modules/audio_processing/main/source/splitting_filter.cc
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "splitting_filter.h"
-#include "signal_processing_library.h"
-
-namespace webrtc {
-
-void SplittingFilterAnalysis(const WebRtc_Word16* in_data,
- WebRtc_Word16* low_band,
- WebRtc_Word16* high_band,
- WebRtc_Word32* filter_state1,
- WebRtc_Word32* filter_state2)
-{
- WebRtcSpl_AnalysisQMF(in_data, low_band, high_band, filter_state1, filter_state2);
-}
-
-void SplittingFilterSynthesis(const WebRtc_Word16* low_band,
- const WebRtc_Word16* high_band,
- WebRtc_Word16* out_data,
- WebRtc_Word32* filt_state1,
- WebRtc_Word32* filt_state2)
-{
- WebRtcSpl_SynthesisQMF(low_band, high_band, out_data, filt_state1, filt_state2);
-}
-} // namespace webrtc
diff --git a/src/modules/audio_processing/main/source/splitting_filter.h b/src/modules/audio_processing/main/source/splitting_filter.h
deleted file mode 100644
index 661bfb2..0000000
--- a/src/modules/audio_processing/main/source/splitting_filter.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_SPLITTING_FILTER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_SPLITTING_FILTER_H_
-
-#include "typedefs.h"
-#include "signal_processing_library.h"
-
-namespace webrtc {
-/*
- * SplittingFilterbank_analysisQMF(...)
- *
- * Splits a super-wb signal into two subbands: 0-8 kHz and 8-16 kHz.
- *
- * Input:
- * - in_data : super-wb audio signal
- *
- * Input & Output:
- * - filt_state1: Filter state for first all-pass filter
- * - filt_state2: Filter state for second all-pass filter
- *
- * Output:
- * - low_band : The signal from the 0-4 kHz band
- * - high_band : The signal from the 4-8 kHz band
- */
-void SplittingFilterAnalysis(const WebRtc_Word16* in_data,
- WebRtc_Word16* low_band,
- WebRtc_Word16* high_band,
- WebRtc_Word32* filt_state1,
- WebRtc_Word32* filt_state2);
-
-/*
- * SplittingFilterbank_synthesisQMF(...)
- *
- * Combines the two subbands (0-8 and 8-16 kHz) into a super-wb signal.
- *
- * Input:
- * - low_band : The signal with the 0-8 kHz band
- * - high_band : The signal with the 8-16 kHz band
- *
- * Input & Output:
- * - filt_state1: Filter state for first all-pass filter
- * - filt_state2: Filter state for second all-pass filter
- *
- * Output:
- * - out_data : super-wb speech signal
- */
-void SplittingFilterSynthesis(const WebRtc_Word16* low_band,
- const WebRtc_Word16* high_band,
- WebRtc_Word16* out_data,
- WebRtc_Word32* filt_state1,
- WebRtc_Word32* filt_state2);
-} // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_SPLITTING_FILTER_H_
diff --git a/src/modules/audio_processing/main/source/voice_detection_impl.cc b/src/modules/audio_processing/main/source/voice_detection_impl.cc
deleted file mode 100644
index 3eb446e..0000000
--- a/src/modules/audio_processing/main/source/voice_detection_impl.cc
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "voice_detection_impl.h"
-
-#include <cassert>
-
-#include "critical_section_wrapper.h"
-#include "webrtc_vad.h"
-
-#include "audio_processing_impl.h"
-#include "audio_buffer.h"
-
-namespace webrtc {
-
-typedef VadInst Handle;
-
-namespace {
-WebRtc_Word16 MapSetting(VoiceDetection::Likelihood likelihood) {
- switch (likelihood) {
- case VoiceDetection::kVeryLowLikelihood:
- return 3;
- break;
- case VoiceDetection::kLowLikelihood:
- return 2;
- break;
- case VoiceDetection::kModerateLikelihood:
- return 1;
- break;
- case VoiceDetection::kHighLikelihood:
- return 0;
- break;
- default:
- return -1;
- }
-}
-} // namespace
-
-
-VoiceDetectionImpl::VoiceDetectionImpl(const AudioProcessingImpl* apm)
- : ProcessingComponent(apm),
- apm_(apm),
- stream_has_voice_(false),
- using_external_vad_(false),
- likelihood_(kLowLikelihood),
- frame_size_ms_(10),
- frame_size_samples_(0) {}
-
-VoiceDetectionImpl::~VoiceDetectionImpl() {}
-
-int VoiceDetectionImpl::ProcessCaptureAudio(AudioBuffer* audio) {
- if (!is_component_enabled()) {
- return apm_->kNoError;
- }
-
- if (using_external_vad_) {
- using_external_vad_ = false;
- return apm_->kNoError;
- }
- assert(audio->samples_per_split_channel() <= 160);
-
- WebRtc_Word16* mixed_data = audio->low_pass_split_data(0);
- if (audio->num_channels() > 1) {
- audio->CopyAndMixLowPass(1);
- mixed_data = audio->mixed_low_pass_data(0);
- }
-
- // TODO(ajm): concatenate data in frame buffer here.
-
- int vad_ret_val;
- vad_ret_val = WebRtcVad_Process(static_cast<Handle*>(handle(0)),
- apm_->split_sample_rate_hz(),
- mixed_data,
- frame_size_samples_);
-
- if (vad_ret_val == 0) {
- stream_has_voice_ = false;
- } else if (vad_ret_val == 1) {
- stream_has_voice_ = true;
- } else {
- return apm_->kUnspecifiedError;
- }
-
- return apm_->kNoError;
-}
-
-int VoiceDetectionImpl::Enable(bool enable) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- return EnableComponent(enable);
-}
-
-bool VoiceDetectionImpl::is_enabled() const {
- return is_component_enabled();
-}
-
-int VoiceDetectionImpl::set_stream_has_voice(bool has_voice) {
- using_external_vad_ = true;
- stream_has_voice_ = has_voice;
- return apm_->kNoError;
-}
-
-bool VoiceDetectionImpl::stream_has_voice() const {
- // TODO(ajm): enable this assertion?
- //assert(using_external_vad_ || is_component_enabled());
- return stream_has_voice_;
-}
-
-int VoiceDetectionImpl::set_likelihood(VoiceDetection::Likelihood likelihood) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- if (MapSetting(likelihood) == -1) {
- return apm_->kBadParameterError;
- }
-
- likelihood_ = likelihood;
- return Configure();
-}
-
-VoiceDetection::Likelihood VoiceDetectionImpl::likelihood() const {
- return likelihood_;
-}
-
-int VoiceDetectionImpl::set_frame_size_ms(int size) {
- CriticalSectionScoped crit_scoped(*apm_->crit());
- assert(size == 10); // TODO(ajm): remove when supported.
- if (size != 10 &&
- size != 20 &&
- size != 30) {
- return apm_->kBadParameterError;
- }
-
- frame_size_ms_ = size;
-
- return Initialize();
-}
-
-int VoiceDetectionImpl::frame_size_ms() const {
- return frame_size_ms_;
-}
-
-int VoiceDetectionImpl::Initialize() {
- int err = ProcessingComponent::Initialize();
- if (err != apm_->kNoError || !is_component_enabled()) {
- return err;
- }
-
- using_external_vad_ = false;
- frame_size_samples_ = frame_size_ms_ * (apm_->split_sample_rate_hz() / 1000);
- // TODO(ajm): intialize frame buffer here.
-
- return apm_->kNoError;
-}
-
-int VoiceDetectionImpl::get_version(char* version,
- int version_len_bytes) const {
- if (WebRtcVad_get_version(version, version_len_bytes) != 0) {
- return apm_->kBadParameterError;
- }
-
- return apm_->kNoError;
-}
-
-void* VoiceDetectionImpl::CreateHandle() const {
- Handle* handle = NULL;
- if (WebRtcVad_Create(&handle) != apm_->kNoError) {
- handle = NULL;
- } else {
- assert(handle != NULL);
- }
-
- return handle;
-}
-
-int VoiceDetectionImpl::DestroyHandle(void* handle) const {
- return WebRtcVad_Free(static_cast<Handle*>(handle));
-}
-
-int VoiceDetectionImpl::InitializeHandle(void* handle) const {
- return WebRtcVad_Init(static_cast<Handle*>(handle));
-}
-
-int VoiceDetectionImpl::ConfigureHandle(void* handle) const {
- return WebRtcVad_set_mode(static_cast<Handle*>(handle),
- MapSetting(likelihood_));
-}
-
-int VoiceDetectionImpl::num_handles_required() const {
- return 1;
-}
-
-int VoiceDetectionImpl::GetHandleError(void* handle) const {
- // The VAD has no get_error() function.
- assert(handle != NULL);
- return apm_->kUnspecifiedError;
-}
-} // namespace webrtc
diff --git a/src/modules/audio_processing/main/source/voice_detection_impl.h b/src/modules/audio_processing/main/source/voice_detection_impl.h
deleted file mode 100644
index ef212d1..0000000
--- a/src/modules/audio_processing/main/source/voice_detection_impl.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_VOICE_DETECTION_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_VOICE_DETECTION_IMPL_H_
-
-#include "audio_processing.h"
-#include "processing_component.h"
-
-namespace webrtc {
-class AudioProcessingImpl;
-class AudioBuffer;
-
-class VoiceDetectionImpl : public VoiceDetection,
- public ProcessingComponent {
- public:
- explicit VoiceDetectionImpl(const AudioProcessingImpl* apm);
- virtual ~VoiceDetectionImpl();
-
- int ProcessCaptureAudio(AudioBuffer* audio);
-
- // VoiceDetection implementation.
- virtual bool is_enabled() const;
-
- // ProcessingComponent implementation.
- virtual int Initialize();
- virtual int get_version(char* version, int version_len_bytes) const;
-
- private:
- // VoiceDetection implementation.
- virtual int Enable(bool enable);
- virtual int set_stream_has_voice(bool has_voice);
- virtual bool stream_has_voice() const;
- virtual int set_likelihood(Likelihood likelihood);
- virtual Likelihood likelihood() const;
- virtual int set_frame_size_ms(int size);
- virtual int frame_size_ms() const;
-
- // ProcessingComponent implementation.
- virtual void* CreateHandle() const;
- virtual int InitializeHandle(void* handle) const;
- virtual int ConfigureHandle(void* handle) const;
- virtual int DestroyHandle(void* handle) const;
- virtual int num_handles_required() const;
- virtual int GetHandleError(void* handle) const;
-
- const AudioProcessingImpl* apm_;
- bool stream_has_voice_;
- bool using_external_vad_;
- Likelihood likelihood_;
- int frame_size_ms_;
- int frame_size_samples_;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_VOICE_DETECTION_IMPL_H_
diff --git a/src/modules/audio_processing/main/test/android/apmtest/AndroidManifest.xml b/src/modules/audio_processing/main/test/android/apmtest/AndroidManifest.xml
deleted file mode 100644
index c6063b3..0000000
--- a/src/modules/audio_processing/main/test/android/apmtest/AndroidManifest.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- BEGIN_INCLUDE(manifest) -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.native_activity"
- android:versionCode="1"
- android:versionName="1.0">
-
- <!-- This is the platform API where NativeActivity was introduced. -->
- <uses-sdk android:minSdkVersion="8" />
-
- <!-- This .apk has no Java code itself, so set hasCode to false. -->
- <application android:label="@string/app_name" android:hasCode="false" android:debuggable="true">
-
- <!-- Our activity is the built-in NativeActivity framework class.
- This will take care of integrating with our NDK code. -->
- <activity android:name="android.app.NativeActivity"
- android:label="@string/app_name"
- android:configChanges="orientation|keyboardHidden">
- <!-- Tell NativeActivity the name of or .so -->
- <meta-data android:name="android.app.lib_name"
- android:value="apmtest-activity" />
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
-
-</manifest>
-<!-- END_INCLUDE(manifest) -->
diff --git a/src/modules/audio_processing/main/test/android/apmtest/default.properties b/src/modules/audio_processing/main/test/android/apmtest/default.properties
deleted file mode 100644
index 9a2c9f6..0000000
--- a/src/modules/audio_processing/main/test/android/apmtest/default.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "build.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-9
diff --git a/src/modules/audio_processing/main/test/android/apmtest/jni/Android.mk b/src/modules/audio_processing/main/test/android/apmtest/jni/Android.mk
deleted file mode 100644
index eaf3c9d..0000000
--- a/src/modules/audio_processing/main/test/android/apmtest/jni/Android.mk
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright (C) 2010 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := apmtest-activity
-LOCAL_SRC_FILES := main.c
-LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM
-LOCAL_STATIC_LIBRARIES := android_native_app_glue
-
-include $(BUILD_SHARED_LIBRARY)
-
-$(call import-module,android/native_app_glue)
diff --git a/src/modules/audio_processing/main/test/android/apmtest/jni/Application.mk b/src/modules/audio_processing/main/test/android/apmtest/jni/Application.mk
deleted file mode 100644
index 22d188e..0000000
--- a/src/modules/audio_processing/main/test/android/apmtest/jni/Application.mk
+++ /dev/null
@@ -1 +0,0 @@
-APP_PLATFORM := android-9
diff --git a/src/modules/audio_processing/main/test/android/apmtest/jni/main.c b/src/modules/audio_processing/main/test/android/apmtest/jni/main.c
deleted file mode 100644
index 2e19635..0000000
--- a/src/modules/audio_processing/main/test/android/apmtest/jni/main.c
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-//BEGIN_INCLUDE(all)
-#include <jni.h>
-#include <errno.h>
-
-#include <EGL/egl.h>
-#include <GLES/gl.h>
-
-#include <android/sensor.h>
-#include <android/log.h>
-#include <android_native_app_glue.h>
-
-#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-activity", __VA_ARGS__))
-#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "native-activity", __VA_ARGS__))
-
-/**
- * Our saved state data.
- */
-struct saved_state {
- float angle;
- int32_t x;
- int32_t y;
-};
-
-/**
- * Shared state for our app.
- */
-struct engine {
- struct android_app* app;
-
- ASensorManager* sensorManager;
- const ASensor* accelerometerSensor;
- ASensorEventQueue* sensorEventQueue;
-
- int animating;
- EGLDisplay display;
- EGLSurface surface;
- EGLContext context;
- int32_t width;
- int32_t height;
- struct saved_state state;
-};
-
-/**
- * Initialize an EGL context for the current display.
- */
-static int engine_init_display(struct engine* engine) {
- // initialize OpenGL ES and EGL
-
- /*
- * Here specify the attributes of the desired configuration.
- * Below, we select an EGLConfig with at least 8 bits per color
- * component compatible with on-screen windows
- */
- const EGLint attribs[] = {
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_BLUE_SIZE, 8,
- EGL_GREEN_SIZE, 8,
- EGL_RED_SIZE, 8,
- EGL_NONE
- };
- EGLint w, h, dummy, format;
- EGLint numConfigs;
- EGLConfig config;
- EGLSurface surface;
- EGLContext context;
-
- EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-
- eglInitialize(display, 0, 0);
-
- /* Here, the application chooses the configuration it desires. In this
- * sample, we have a very simplified selection process, where we pick
- * the first EGLConfig that matches our criteria */
- eglChooseConfig(display, attribs, &config, 1, &numConfigs);
-
- /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
- * guaranteed to be accepted by ANativeWindow_setBuffersGeometry().
- * As soon as we picked a EGLConfig, we can safely reconfigure the
- * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
- eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
-
- ANativeWindow_setBuffersGeometry(engine->app->window, 0, 0, format);
-
- surface = eglCreateWindowSurface(display, config, engine->app->window, NULL);
- context = eglCreateContext(display, config, NULL, NULL);
-
- if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) {
- LOGW("Unable to eglMakeCurrent");
- return -1;
- }
-
- eglQuerySurface(display, surface, EGL_WIDTH, &w);
- eglQuerySurface(display, surface, EGL_HEIGHT, &h);
-
- engine->display = display;
- engine->context = context;
- engine->surface = surface;
- engine->width = w;
- engine->height = h;
- engine->state.angle = 0;
-
- // Initialize GL state.
- glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
- glEnable(GL_CULL_FACE);
- glShadeModel(GL_SMOOTH);
- glDisable(GL_DEPTH_TEST);
-
- return 0;
-}
-
-/**
- * Just the current frame in the display.
- */
-static void engine_draw_frame(struct engine* engine) {
- if (engine->display == NULL) {
- // No display.
- return;
- }
-
- // Just fill the screen with a color.
- glClearColor(((float)engine->state.x)/engine->width, engine->state.angle,
- ((float)engine->state.y)/engine->height, 1);
- glClear(GL_COLOR_BUFFER_BIT);
-
- eglSwapBuffers(engine->display, engine->surface);
-}
-
-/**
- * Tear down the EGL context currently associated with the display.
- */
-static void engine_term_display(struct engine* engine) {
- if (engine->display != EGL_NO_DISPLAY) {
- eglMakeCurrent(engine->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
- if (engine->context != EGL_NO_CONTEXT) {
- eglDestroyContext(engine->display, engine->context);
- }
- if (engine->surface != EGL_NO_SURFACE) {
- eglDestroySurface(engine->display, engine->surface);
- }
- eglTerminate(engine->display);
- }
- engine->animating = 0;
- engine->display = EGL_NO_DISPLAY;
- engine->context = EGL_NO_CONTEXT;
- engine->surface = EGL_NO_SURFACE;
-}
-
-/**
- * Process the next input event.
- */
-static int32_t engine_handle_input(struct android_app* app, AInputEvent* event) {
- struct engine* engine = (struct engine*)app->userData;
- if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {
- engine->animating = 1;
- engine->state.x = AMotionEvent_getX(event, 0);
- engine->state.y = AMotionEvent_getY(event, 0);
- return 1;
- }
- return 0;
-}
-
-/**
- * Process the next main command.
- */
-static void engine_handle_cmd(struct android_app* app, int32_t cmd) {
- struct engine* engine = (struct engine*)app->userData;
- switch (cmd) {
- case APP_CMD_SAVE_STATE:
- // The system has asked us to save our current state. Do so.
- engine->app->savedState = malloc(sizeof(struct saved_state));
- *((struct saved_state*)engine->app->savedState) = engine->state;
- engine->app->savedStateSize = sizeof(struct saved_state);
- break;
- case APP_CMD_INIT_WINDOW:
- // The window is being shown, get it ready.
- if (engine->app->window != NULL) {
- engine_init_display(engine);
- engine_draw_frame(engine);
- }
- break;
- case APP_CMD_TERM_WINDOW:
- // The window is being hidden or closed, clean it up.
- engine_term_display(engine);
- break;
- case APP_CMD_GAINED_FOCUS:
- // When our app gains focus, we start monitoring the accelerometer.
- if (engine->accelerometerSensor != NULL) {
- ASensorEventQueue_enableSensor(engine->sensorEventQueue,
- engine->accelerometerSensor);
- // We'd like to get 60 events per second (in us).
- ASensorEventQueue_setEventRate(engine->sensorEventQueue,
- engine->accelerometerSensor, (1000L/60)*1000);
- }
- break;
- case APP_CMD_LOST_FOCUS:
- // When our app loses focus, we stop monitoring the accelerometer.
- // This is to avoid consuming battery while not being used.
- if (engine->accelerometerSensor != NULL) {
- ASensorEventQueue_disableSensor(engine->sensorEventQueue,
- engine->accelerometerSensor);
- }
- // Also stop animating.
- engine->animating = 0;
- engine_draw_frame(engine);
- break;
- }
-}
-
-/**
- * This is the main entry point of a native application that is using
- * android_native_app_glue. It runs in its own thread, with its own
- * event loop for receiving input events and doing other things.
- */
-void android_main(struct android_app* state) {
- struct engine engine;
-
- // Make sure glue isn't stripped.
- app_dummy();
-
- memset(&engine, 0, sizeof(engine));
- state->userData = &engine;
- state->onAppCmd = engine_handle_cmd;
- state->onInputEvent = engine_handle_input;
- engine.app = state;
-
- // Prepare to monitor accelerometer
- engine.sensorManager = ASensorManager_getInstance();
- engine.accelerometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager,
- ASENSOR_TYPE_ACCELEROMETER);
- engine.sensorEventQueue = ASensorManager_createEventQueue(engine.sensorManager,
- state->looper, LOOPER_ID_USER, NULL, NULL);
-
- if (state->savedState != NULL) {
- // We are starting with a previous saved state; restore from it.
- engine.state = *(struct saved_state*)state->savedState;
- }
-
- // loop waiting for stuff to do.
-
- while (1) {
- // Read all pending events.
- int ident;
- int events;
- struct android_poll_source* source;
-
- // If not animating, we will block forever waiting for events.
- // If animating, we loop until all events are read, then continue
- // to draw the next frame of animation.
- while ((ident=ALooper_pollAll(engine.animating ? 0 : -1, NULL, &events,
- (void**)&source)) >= 0) {
-
- // Process this event.
- if (source != NULL) {
- source->process(state, source);
- }
-
- // If a sensor has data, process it now.
- if (ident == LOOPER_ID_USER) {
- if (engine.accelerometerSensor != NULL) {
- ASensorEvent event;
- while (ASensorEventQueue_getEvents(engine.sensorEventQueue,
- &event, 1) > 0) {
- LOGI("accelerometer: x=%f y=%f z=%f",
- event.acceleration.x, event.acceleration.y,
- event.acceleration.z);
- }
- }
- }
-
- // Check if we are exiting.
- if (state->destroyRequested != 0) {
- engine_term_display(&engine);
- return;
- }
- }
-
- if (engine.animating) {
- // Done with events; draw next animation frame.
- engine.state.angle += .01f;
- if (engine.state.angle > 1) {
- engine.state.angle = 0;
- }
-
- // Drawing is throttled to the screen update rate, so there
- // is no need to do timing here.
- engine_draw_frame(&engine);
- }
- }
-}
-//END_INCLUDE(all)
diff --git a/src/modules/audio_processing/main/test/android/apmtest/res/values/strings.xml b/src/modules/audio_processing/main/test/android/apmtest/res/values/strings.xml
deleted file mode 100644
index d0bd0f3..0000000
--- a/src/modules/audio_processing/main/test/android/apmtest/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <string name="app_name">apmtest</string>
-</resources>
diff --git a/src/modules/audio_processing/main/test/process_test/Android.mk b/src/modules/audio_processing/main/test/process_test/Android.mk
deleted file mode 100644
index 23080aa..0000000
--- a/src/modules/audio_processing/main/test/process_test/Android.mk
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-LOCAL_PATH:= $(call my-dir)
-
-# apm test app
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-LOCAL_CPP_EXTENSION := .cc
-LOCAL_SRC_FILES:= \
- process_test.cc
-
-# Flags passed to both C and C++ files.
-LOCAL_CFLAGS := \
- '-DWEBRTC_TARGET_PC' \
- '-DWEBRTC_LINUX' \
- '-DWEBRTC_THREAD_RR' \
- '-DWEBRTC_ANDROID' \
- '-DANDROID'
-
-LOCAL_CPPFLAGS :=
-LOCAL_LDFLAGS :=
-LOCAL_C_INCLUDES := \
- external/gtest/include \
- $(LOCAL_PATH)/../../../../../system_wrappers/interface \
- $(LOCAL_PATH)/../../interface \
- $(LOCAL_PATH)/../../../../interface \
- $(LOCAL_PATH)/../../../../..
-
-LOCAL_STATIC_LIBRARIES := \
- libgtest
-
-LOCAL_SHARED_LIBRARIES := \
- libutils \
- libstlport \
- libwebrtc_audio_preprocessing
-
-LOCAL_MODULE:= webrtc_apm_process_test
-
-include external/stlport/libstlport.mk
-include $(BUILD_EXECUTABLE)
diff --git a/src/modules/audio_processing/main/test/process_test/apmtest.m b/src/modules/audio_processing/main/test/process_test/apmtest.m
deleted file mode 100644
index 6152bb5..0000000
--- a/src/modules/audio_processing/main/test/process_test/apmtest.m
+++ /dev/null
@@ -1,360 +0,0 @@
-function apmtest(task, testname, casenumber, legacy)
-%APMTEST is a tool to process APM file sets and easily display the output.
-% APMTEST(TASK, TESTNAME, CASENUMBER) performs one of several TASKs:
-% 'test' Processes the files to produce test output.
-% 'list' Prints a list of cases in the test set, preceded by their
-% CASENUMBERs.
-% 'show' Uses spclab to show the test case specified by the
-% CASENUMBER parameter.
-%
-% using a set of test files determined by TESTNAME:
-% 'all' All tests.
-% 'apm' The standard APM test set (default).
-% 'apmm' The mobile APM test set.
-% 'aec' The AEC test set.
-% 'aecm' The AECM test set.
-% 'agc' The AGC test set.
-% 'ns' The NS test set.
-% 'vad' The VAD test set.
-%
-% CASENUMBER can be used to select a single test case. Omit CASENUMBER,
-% or set to zero, to use all test cases.
-%
-
-if nargin < 4
- % Set to true to run old VQE recordings.
- legacy = false;
-end
-
-if nargin < 3
- casenumber = 0;
-end
-
-if nargin < 2
- task = 'test';
-end
-
-if nargin < 1
- testname = 'all';
-end
-
-if ~strcmp(task, 'test') && ~strcmp(task, 'list') && ~strcmp(task, 'show')
- error(['TASK ' task ' is not recognized']);
-end
-
-if casenumber == 0 && strcmp(task, 'show')
- error(['CASENUMBER must be specified for TASK ' task]);
-end
-
-filepath = 'data/';
-inpath = [filepath 'input/'];
-outpath = [filepath 'output/'];
-refpath = [filepath 'reference/'];
-
-% Temporary
-if legacy
- refpath = [filepath 'output/'];
- outpath = [filepath 'reference/'];
-end
-
-if strcmp(testname, 'all')
- tests = {'apm','apmm','aec','aecm','agc','ns','vad'};
-else
- tests = {testname};
-end
-
-if legacy
- progname = '/usr/local/google/p4/dev/depot/test';
-else
- progname = './process_test';
-end
-
-global farFile;
-global nearFile;
-global eventFile;
-global delayFile;
-global driftFile;
-
-if legacy
- farFile = 'vqeFar.pcm';
- nearFile = 'vqeNear.pcm';
- eventFile = 'vqeEvent.dat';
- delayFile = 'vqeBuf.dat';
- driftFile = 'vqeDrift.dat';
-else
- farFile = 'apm_far.pcm';
- nearFile = 'apm_near.pcm';
- eventFile = 'apm_event.dat';
- delayFile = 'apm_delay.dat';
- driftFile = 'apm_drift.dat';
-end
-
-simulateMode = false;
-nErr = 0;
-nCases = 0;
-for i=1:length(tests)
- simulateMode = false;
-
- if strcmp(tests{i}, 'apm')
- testdir = ['apm/'];
- outfile = ['out'];
- if legacy
- opt = ['-ec 1 -agc 2 -nc 2 -vad 3'];
- else
- opt = ['--no_progress -hpf' ...
- ' -aec --drift_compensation -agc --fixed_digital' ...
- ' -ns --ns_moderate -vad'];
- end
-
- elseif strcmp(tests{i}, 'apm-swb')
- simulateMode = true;
- testdir = ['apm-swb/'];
- outfile = ['out'];
- if legacy
- opt = ['-fs 32000 -ec 1 -agc 2 -nc 2'];
- else
- opt = ['--no_progress -fs 32000 -hpf' ...
- ' -aec --drift_compensation -agc --adaptive_digital' ...
- ' -ns --ns_moderate -vad'];
- end
- elseif strcmp(tests{i}, 'apmm')
- testdir = ['apmm/'];
- outfile = ['out'];
- opt = ['-aec --drift_compensation -agc --fixed_digital -hpf -ns ' ...
- '--ns_moderate'];
-
- else
- error(['TESTNAME ' tests{i} ' is not recognized']);
- end
-
- inpath = [inpath testdir];
- outpath = [outpath testdir];
- refpath = [refpath testdir];
-
- if ~exist(inpath,'dir')
- error(['Input directory ' inpath ' does not exist']);
- end
-
- if ~exist(refpath,'dir')
- warning(['Reference directory ' refpath ' does not exist']);
- end
-
- [status, errMsg] = mkdir(outpath);
- if (status == 0)
- error(errMsg);
- end
-
- [nErr, nCases] = recurseDir(inpath, outpath, refpath, outfile, ...
- progname, opt, simulateMode, nErr, nCases, task, casenumber, legacy);
-
- if strcmp(task, 'test') || strcmp(task, 'show')
- system(['rm ' farFile]);
- system(['rm ' nearFile]);
- if simulateMode == false
- system(['rm ' eventFile]);
- system(['rm ' delayFile]);
- system(['rm ' driftFile]);
- end
- end
-end
-
-if ~strcmp(task, 'list')
- if nErr == 0
- fprintf(1, '\nAll files are bit-exact to reference\n', nErr);
- else
- fprintf(1, '\n%d files are NOT bit-exact to reference\n', nErr);
- end
-end
-
-
-function [nErrOut, nCases] = recurseDir(inpath, outpath, refpath, ...
- outfile, progname, opt, simulateMode, nErr, nCases, task, casenumber, ...
- legacy)
-
-global farFile;
-global nearFile;
-global eventFile;
-global delayFile;
-global driftFile;
-
-dirs = dir(inpath);
-nDirs = 0;
-nErrOut = nErr;
-for i=3:length(dirs) % skip . and ..
- nDirs = nDirs + dirs(i).isdir;
-end
-
-
-if nDirs == 0
- nCases = nCases + 1;
-
- if casenumber == nCases || casenumber == 0
-
- if strcmp(task, 'list')
- fprintf([num2str(nCases) '. ' outfile '\n'])
- else
- vadoutfile = ['vad_' outfile '.dat'];
- outfile = [outfile '.pcm'];
-
- % Check for VAD test
- vadTest = 0;
- if ~isempty(findstr(opt, '-vad'))
- vadTest = 1;
- if legacy
- opt = [opt ' ' outpath vadoutfile];
- else
- opt = [opt ' --vad_out_file ' outpath vadoutfile];
- end
- end
-
- if exist([inpath 'vqeFar.pcm'])
- system(['ln -s -f ' inpath 'vqeFar.pcm ' farFile]);
- elseif exist([inpath 'apm_far.pcm'])
- system(['ln -s -f ' inpath 'apm_far.pcm ' farFile]);
- end
-
- if exist([inpath 'vqeNear.pcm'])
- system(['ln -s -f ' inpath 'vqeNear.pcm ' nearFile]);
- elseif exist([inpath 'apm_near.pcm'])
- system(['ln -s -f ' inpath 'apm_near.pcm ' nearFile]);
- end
-
- if exist([inpath 'vqeEvent.dat'])
- system(['ln -s -f ' inpath 'vqeEvent.dat ' eventFile]);
- elseif exist([inpath 'apm_event.day'])
- system(['ln -s -f ' inpath 'apm_event.dat ' eventFile]);
- end
-
- if exist([inpath 'vqeBuf.dat'])
- system(['ln -s -f ' inpath 'vqeBuf.dat ' delayFile]);
- elseif exist([inpath 'apm_delay.day'])
- system(['ln -s -f ' inpath 'apm_delay.dat ' delayFile]);
- end
-
- if exist([inpath 'vqeSkew.dat'])
- system(['ln -s -f ' inpath 'vqeSkew.dat ' driftFile]);
- elseif exist([inpath 'vqeDrift.dat'])
- system(['ln -s -f ' inpath 'vqeDrift.dat ' driftFile]);
- elseif exist([inpath 'apm_drift.dat'])
- system(['ln -s -f ' inpath 'apm_drift.dat ' driftFile]);
- end
-
- if simulateMode == false
- command = [progname ' -o ' outpath outfile ' ' opt];
- else
- if legacy
- inputCmd = [' -in ' nearFile];
- else
- inputCmd = [' -i ' nearFile];
- end
-
- if exist([farFile])
- if legacy
- inputCmd = [' -if ' farFile inputCmd];
- else
- inputCmd = [' -ir ' farFile inputCmd];
- end
- end
- command = [progname inputCmd ' -o ' outpath outfile ' ' opt];
- end
- % This prevents MATLAB from using its own C libraries.
- shellcmd = ['bash -c "unset LD_LIBRARY_PATH;'];
- fprintf([command '\n']);
- [status, result] = system([shellcmd command '"']);
- fprintf(result);
-
- fprintf(['Reference file: ' refpath outfile '\n']);
-
- if vadTest == 1
- equal_to_ref = are_files_equal([outpath vadoutfile], ...
- [refpath vadoutfile], ...
- 'int8');
- if ~equal_to_ref
- nErr = nErr + 1;
- end
- end
-
- [equal_to_ref, diffvector] = are_files_equal([outpath outfile], ...
- [refpath outfile], ...
- 'int16');
- if ~equal_to_ref
- nErr = nErr + 1;
- end
-
- if strcmp(task, 'show')
- % Assume the last init gives the sample rate of interest.
- str_idx = strfind(result, 'Sample rate:');
- fs = str2num(result(str_idx(end) + 13:str_idx(end) + 17));
- fprintf('Using %d Hz\n', fs);
-
- if exist([farFile])
- spclab(fs, farFile, nearFile, [refpath outfile], ...
- [outpath outfile], diffvector);
- %spclab(fs, diffvector);
- else
- spclab(fs, nearFile, [refpath outfile], [outpath outfile], ...
- diffvector);
- %spclab(fs, diffvector);
- end
-
- if vadTest == 1
- spclab([refpath vadoutfile], [outpath vadoutfile]);
- end
- end
- end
- end
-else
-
- for i=3:length(dirs)
- if dirs(i).isdir
- [nErr, nCases] = recurseDir([inpath dirs(i).name '/'], outpath, ...
- refpath,[outfile '_' dirs(i).name], progname, opt, ...
- simulateMode, nErr, nCases, task, casenumber, legacy);
- end
- end
-end
-nErrOut = nErr;
-
-function [are_equal, diffvector] = ...
- are_files_equal(newfile, reffile, precision, diffvector)
-
-are_equal = false;
-diffvector = 0;
-if ~exist(newfile,'file')
- warning(['Output file ' newfile ' does not exist']);
- return
-end
-
-if ~exist(reffile,'file')
- warning(['Reference file ' reffile ' does not exist']);
- return
-end
-
-fid = fopen(newfile,'rb');
-new = fread(fid,inf,precision);
-fclose(fid);
-
-fid = fopen(reffile,'rb');
-ref = fread(fid,inf,precision);
-fclose(fid);
-
-if length(new) ~= length(ref)
- warning('Reference is not the same length as output');
- minlength = min(length(new), length(ref));
- new = new(1:minlength);
- ref = ref(1:minlength);
-end
-diffvector = new - ref;
-
-if isequal(new, ref)
- fprintf([newfile ' is bit-exact to reference\n']);
- are_equal = true;
-else
- if isempty(new)
- warning([newfile ' is empty']);
- return
- end
- snr = snrseg(new,ref,80);
- fprintf('\n');
- are_equal = false;
-end
diff --git a/src/modules/audio_processing/main/test/process_test/process_test.cc b/src/modules/audio_processing/main/test/process_test/process_test.cc
deleted file mode 100644
index c62345f..0000000
--- a/src/modules/audio_processing/main/test/process_test/process_test.cc
+++ /dev/null
@@ -1,628 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <stdio.h>
-#include <string.h>
-#ifdef WEBRTC_ANDROID
-#include <sys/stat.h>
-#endif
-
-#include "tick_util.h"
-#include "gtest/gtest.h"
-#include "module_common_types.h"
-
-#include "audio_processing.h"
-
-#include "cpu_features_wrapper.h"
-
-using webrtc::AudioFrame;
-using webrtc::TickInterval;
-using webrtc::TickTime;
-
-using webrtc::AudioProcessing;
-using webrtc::GainControl;
-using webrtc::NoiseSuppression;
-
-void usage() {
- printf(
- "Usage: process_test [options] [-ir REVERSE_FILE] [-i PRIMARY_FILE]\n");
- printf(
- " [-o OUT_FILE]\n");
- printf(
- "process_test is a test application for AudioProcessing.\n\n"
- "When -ir or -i is specified the files will be processed directly in a\n"
- "simulation mode. Otherwise the full set of test files is expected to be\n"
- "present in the working directory.\n");
- printf("\n");
- printf("Options\n");
- printf("General configuration:\n");
- printf(" -fs SAMPLE_RATE_HZ\n");
- printf(" -ch CHANNELS_IN CHANNELS_OUT\n");
- printf(" -rch REVERSE_CHANNELS\n");
- printf("\n");
- printf("Component configuration:\n");
- printf(
- "All components are disabled by default. Each block below begins with a\n"
- "flag to enable the component with default settings. The subsequent flags\n"
- "in the block are used to provide configuration settings.\n");
- printf("\n -aec Echo cancellation\n");
- printf(" --drift_compensation\n");
- printf(" --no_drift_compensation\n");
- printf("\n -aecm Echo control mobile\n");
- printf("\n -agc Gain control\n");
- printf(" --analog\n");
- printf(" --adaptive_digital\n");
- printf(" --fixed_digital\n");
- printf(" --target_level LEVEL\n");
- printf(" --compression_gain GAIN\n");
- printf(" --limiter\n");
- printf(" --no_limiter\n");
- printf("\n -hpf High pass filter\n");
- printf("\n -ns Noise suppression\n");
- printf(" --ns_low\n");
- printf(" --ns_moderate\n");
- printf(" --ns_high\n");
- printf(" --ns_very_high\n");
- printf("\n -vad Voice activity detection\n");
- printf(" --vad_out_file FILE");
- printf("\n");
- printf("Modifiers:\n");
- printf(" --perf Measure performance.\n");
- printf(" --quiet Suppress text output.\n");
- printf(" --no_progress Suppress progress.\n");
- printf(" --version Print version information and exit.\n");
-}
-
-// void function for gtest.
-void void_main(int argc, char* argv[]) {
- if (argc > 1 && strcmp(argv[1], "--help") == 0) {
- usage();
- return;
- }
-
- if (argc < 2) {
- printf("Did you mean to run without arguments?\n");
- printf("Try `process_test --help' for more information.\n\n");
- }
-
- AudioProcessing* apm = AudioProcessing::Create(0);
- ASSERT_TRUE(apm != NULL);
-
- WebRtc_Word8 version[1024];
- WebRtc_UWord32 version_bytes_remaining = sizeof(version);
- WebRtc_UWord32 version_position = 0;
-
- const char* far_filename = NULL;
- const char* near_filename = NULL;
- const char* out_filename = NULL;
- const char* vad_out_filename = NULL;
-
- int32_t sample_rate_hz = 16000;
- int32_t device_sample_rate_hz = 16000;
-
- int num_capture_input_channels = 1;
- int num_capture_output_channels = 1;
- int num_render_channels = 1;
-
- int samples_per_channel = sample_rate_hz / 100;
-
- bool simulating = false;
- bool perf_testing = false;
- bool verbose = true;
- bool progress = true;
- //bool interleaved = true;
-
- for (int i = 1; i < argc; i++) {
- if (strcmp(argv[i], "-ir") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify filename after -ir";
- far_filename = argv[i];
- simulating = true;
-
- } else if (strcmp(argv[i], "-i") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify filename after -i";
- near_filename = argv[i];
- simulating = true;
-
- } else if (strcmp(argv[i], "-o") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify filename after -o";
- out_filename = argv[i];
-
- } else if (strcmp(argv[i], "-fs") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify sample rate after -fs";
- ASSERT_EQ(1, sscanf(argv[i], "%d", &sample_rate_hz));
- samples_per_channel = sample_rate_hz / 100;
-
- ASSERT_EQ(apm->kNoError,
- apm->set_sample_rate_hz(sample_rate_hz));
-
- } else if (strcmp(argv[i], "-ch") == 0) {
- i++;
- ASSERT_LT(i + 1, argc) << "Specify number of channels after -ch";
- ASSERT_EQ(1, sscanf(argv[i], "%d", &num_capture_input_channels));
- i++;
- ASSERT_EQ(1, sscanf(argv[i], "%d", &num_capture_output_channels));
-
- ASSERT_EQ(apm->kNoError,
- apm->set_num_channels(num_capture_input_channels,
- num_capture_output_channels));
-
- } else if (strcmp(argv[i], "-rch") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify number of channels after -rch";
- ASSERT_EQ(1, sscanf(argv[i], "%d", &num_render_channels));
-
- ASSERT_EQ(apm->kNoError,
- apm->set_num_reverse_channels(num_render_channels));
-
- } else if (strcmp(argv[i], "-aec") == 0) {
- ASSERT_EQ(apm->kNoError, apm->echo_cancellation()->Enable(true));
-
- } else if (strcmp(argv[i], "-noasm") == 0) {
- WebRtc_GetCPUInfo = WebRtc_GetCPUInfoNoASM;
-
- } else if (strcmp(argv[i], "--drift_compensation") == 0) {
- ASSERT_EQ(apm->kNoError, apm->echo_cancellation()->Enable(true));
- // TODO(ajm): this is enabled in the VQE test app by default. Investigate
- // why it can give better performance despite passing zeros.
- ASSERT_EQ(apm->kNoError,
- apm->echo_cancellation()->enable_drift_compensation(true));
- } else if (strcmp(argv[i], "--no_drift_compensation") == 0) {
- ASSERT_EQ(apm->kNoError, apm->echo_cancellation()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->echo_cancellation()->enable_drift_compensation(false));
-
- } else if (strcmp(argv[i], "-aecm") == 0) {
- ASSERT_EQ(apm->kNoError, apm->echo_control_mobile()->Enable(true));
-
- } else if (strcmp(argv[i], "-agc") == 0) {
- ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
-
- } else if (strcmp(argv[i], "--analog") == 0) {
- ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->gain_control()->set_mode(GainControl::kAdaptiveAnalog));
-
- } else if (strcmp(argv[i], "--adaptive_digital") == 0) {
- ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->gain_control()->set_mode(GainControl::kAdaptiveDigital));
-
- } else if (strcmp(argv[i], "--fixed_digital") == 0) {
- ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->gain_control()->set_mode(GainControl::kFixedDigital));
-
- } else if (strcmp(argv[i], "--target_level") == 0) {
- i++;
- int level;
- ASSERT_EQ(1, sscanf(argv[i], "%d", &level));
-
- ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->gain_control()->set_target_level_dbfs(level));
-
- } else if (strcmp(argv[i], "--compression_gain") == 0) {
- i++;
- int gain;
- ASSERT_EQ(1, sscanf(argv[i], "%d", &gain));
-
- ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->gain_control()->set_compression_gain_db(gain));
-
- } else if (strcmp(argv[i], "--limiter") == 0) {
- ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->gain_control()->enable_limiter(true));
-
- } else if (strcmp(argv[i], "--no_limiter") == 0) {
- ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->gain_control()->enable_limiter(false));
-
- } else if (strcmp(argv[i], "-hpf") == 0) {
- ASSERT_EQ(apm->kNoError, apm->high_pass_filter()->Enable(true));
-
- } else if (strcmp(argv[i], "-ns") == 0) {
- ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(true));
-
- } else if (strcmp(argv[i], "--ns_low") == 0) {
- ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->noise_suppression()->set_level(NoiseSuppression::kLow));
-
- } else if (strcmp(argv[i], "--ns_moderate") == 0) {
- ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->noise_suppression()->set_level(NoiseSuppression::kModerate));
-
- } else if (strcmp(argv[i], "--ns_high") == 0) {
- ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->noise_suppression()->set_level(NoiseSuppression::kHigh));
-
- } else if (strcmp(argv[i], "--ns_very_high") == 0) {
- ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->noise_suppression()->set_level(NoiseSuppression::kVeryHigh));
-
- } else if (strcmp(argv[i], "-vad") == 0) {
- ASSERT_EQ(apm->kNoError, apm->voice_detection()->Enable(true));
-
- } else if (strcmp(argv[i], "--vad_out_file") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify filename after --vad_out_file";
- vad_out_filename = argv[i];
-
- } else if (strcmp(argv[i], "--perf") == 0) {
- perf_testing = true;
-
- } else if (strcmp(argv[i], "--quiet") == 0) {
- verbose = false;
- progress = false;
-
- } else if (strcmp(argv[i], "--no_progress") == 0) {
- progress = false;
-
- } else if (strcmp(argv[i], "--version") == 0) {
- ASSERT_EQ(apm->kNoError, apm->Version(version,
- version_bytes_remaining,
- version_position));
- printf("%s\n", version);
- return;
-
- } else {
- FAIL() << "Unrecognized argument " << argv[i];
- }
- }
-
- if (verbose) {
- printf("Sample rate: %d Hz\n", sample_rate_hz);
- printf("Primary channels: %d (in), %d (out)\n",
- num_capture_input_channels,
- num_capture_output_channels);
- printf("Reverse channels: %d \n", num_render_channels);
- }
-
- const char far_file_default[] = "apm_far.pcm";
- const char near_file_default[] = "apm_near.pcm";
- const char out_file_default[] = "out.pcm";
- const char event_filename[] = "apm_event.dat";
- const char delay_filename[] = "apm_delay.dat";
- const char drift_filename[] = "apm_drift.dat";
- const char vad_file_default[] = "vad_out.dat";
-
- if (!simulating) {
- far_filename = far_file_default;
- near_filename = near_file_default;
- }
-
- if (out_filename == NULL) {
- out_filename = out_file_default;
- }
-
- if (vad_out_filename == NULL) {
- vad_out_filename = vad_file_default;
- }
-
- FILE* far_file = NULL;
- FILE* near_file = NULL;
- FILE* out_file = NULL;
- FILE* event_file = NULL;
- FILE* delay_file = NULL;
- FILE* drift_file = NULL;
- FILE* vad_out_file = NULL;
-
- if (far_filename != NULL) {
- far_file = fopen(far_filename, "rb");
- ASSERT_TRUE(NULL != far_file) << "Unable to open far-end audio file "
- << far_filename;
- }
-
- near_file = fopen(near_filename, "rb");
- ASSERT_TRUE(NULL != near_file) << "Unable to open near-end audio file "
- << near_filename;
- struct stat st;
- stat(near_filename, &st);
- int near_size_samples = st.st_size / sizeof(int16_t);
-
- out_file = fopen(out_filename, "wb");
- ASSERT_TRUE(NULL != out_file) << "Unable to open output audio file "
- << out_filename;
-
- if (!simulating) {
- event_file = fopen(event_filename, "rb");
- ASSERT_TRUE(NULL != event_file) << "Unable to open event file "
- << event_filename;
-
- delay_file = fopen(delay_filename, "rb");
- ASSERT_TRUE(NULL != delay_file) << "Unable to open buffer file "
- << delay_filename;
-
- drift_file = fopen(drift_filename, "rb");
- ASSERT_TRUE(NULL != drift_file) << "Unable to open drift file "
- << drift_filename;
- }
-
- if (apm->voice_detection()->is_enabled()) {
- vad_out_file = fopen(vad_out_filename, "wb");
- ASSERT_TRUE(NULL != vad_out_file) << "Unable to open VAD output file "
- << vad_out_file;
- }
-
- enum Events {
- kInitializeEvent,
- kRenderEvent,
- kCaptureEvent,
- kResetEventDeprecated
- };
- int16_t event = 0;
- size_t read_count = 0;
- int reverse_count = 0;
- int primary_count = 0;
- int near_read_samples = 0;
- TickInterval acc_ticks;
-
- AudioFrame far_frame;
- far_frame._frequencyInHz = sample_rate_hz;
-
- AudioFrame near_frame;
- near_frame._frequencyInHz = sample_rate_hz;
-
- int delay_ms = 0;
- int drift_samples = 0;
- int capture_level = 127;
- int8_t stream_has_voice = 0;
-
- TickTime t0 = TickTime::Now();
- TickTime t1 = t0;
- WebRtc_Word64 max_time_us = 0;
- WebRtc_Word64 max_time_reverse_us = 0;
- WebRtc_Word64 min_time_us = 1e6;
- WebRtc_Word64 min_time_reverse_us = 1e6;
-
- while (simulating || feof(event_file) == 0) {
- std::ostringstream trace_stream;
- trace_stream << "Processed frames: " << reverse_count << " (reverse), "
- << primary_count << " (primary)";
- SCOPED_TRACE(trace_stream.str());
-
-
- if (simulating) {
- if (far_file == NULL) {
- event = kCaptureEvent;
- } else {
- if (event == kRenderEvent) {
- event = kCaptureEvent;
- } else {
- event = kRenderEvent;
- }
- }
- } else {
- read_count = fread(&event, sizeof(event), 1, event_file);
- if (read_count != 1) {
- break;
- }
- //if (fread(&event, sizeof(event), 1, event_file) != 1) {
- // break; // This is expected.
- //}
- }
-
- if (event == kInitializeEvent || event == kResetEventDeprecated) {
- ASSERT_EQ(1u,
- fread(&sample_rate_hz, sizeof(sample_rate_hz), 1, event_file));
- samples_per_channel = sample_rate_hz / 100;
-
- ASSERT_EQ(1u,
- fread(&device_sample_rate_hz,
- sizeof(device_sample_rate_hz),
- 1,
- event_file));
-
- ASSERT_EQ(apm->kNoError,
- apm->set_sample_rate_hz(sample_rate_hz));
-
- ASSERT_EQ(apm->kNoError,
- apm->echo_cancellation()->set_device_sample_rate_hz(
- device_sample_rate_hz));
-
- far_frame._frequencyInHz = sample_rate_hz;
- near_frame._frequencyInHz = sample_rate_hz;
-
- if (verbose) {
- printf("Init at frame: %d (primary), %d (reverse)\n",
- primary_count, reverse_count);
- printf(" Sample rate: %d Hz\n", sample_rate_hz);
- }
-
- } else if (event == kRenderEvent) {
- reverse_count++;
- far_frame._audioChannel = num_render_channels;
- far_frame._payloadDataLengthInSamples =
- num_render_channels * samples_per_channel;
-
- read_count = fread(far_frame._payloadData,
- sizeof(WebRtc_Word16),
- far_frame._payloadDataLengthInSamples,
- far_file);
-
- if (simulating) {
- if (read_count != far_frame._payloadDataLengthInSamples) {
- break; // This is expected.
- }
- } else {
- ASSERT_EQ(read_count,
- far_frame._payloadDataLengthInSamples);
- }
-
- if (perf_testing) {
- t0 = TickTime::Now();
- }
-
- ASSERT_EQ(apm->kNoError,
- apm->AnalyzeReverseStream(&far_frame));
-
- if (perf_testing) {
- t1 = TickTime::Now();
- TickInterval tick_diff = t1 - t0;
- acc_ticks += tick_diff;
- if (tick_diff.Microseconds() > max_time_reverse_us) {
- max_time_reverse_us = tick_diff.Microseconds();
- }
- if (tick_diff.Microseconds() < min_time_reverse_us) {
- min_time_reverse_us = tick_diff.Microseconds();
- }
- }
-
- } else if (event == kCaptureEvent) {
- primary_count++;
- near_frame._audioChannel = num_capture_input_channels;
- near_frame._payloadDataLengthInSamples =
- num_capture_input_channels * samples_per_channel;
-
- read_count = fread(near_frame._payloadData,
- sizeof(WebRtc_Word16),
- near_frame._payloadDataLengthInSamples,
- near_file);
-
- near_read_samples += read_count;
- if (progress && primary_count % 100 == 0) {
- printf("%.0f%% complete\r",
- (near_read_samples * 100.0) / near_size_samples);
- fflush(stdout);
- }
- if (simulating) {
- if (read_count != near_frame._payloadDataLengthInSamples) {
- break; // This is expected.
- }
-
- delay_ms = 0;
- drift_samples = 0;
- } else {
- ASSERT_EQ(read_count,
- near_frame._payloadDataLengthInSamples);
-
- // TODO(ajm): sizeof(delay_ms) for current files?
- ASSERT_EQ(1u,
- fread(&delay_ms, 2, 1, delay_file));
- ASSERT_EQ(1u,
- fread(&drift_samples, sizeof(drift_samples), 1, drift_file));
- }
-
- if (perf_testing) {
- t0 = TickTime::Now();
- }
-
- // TODO(ajm): fake an analog gain while simulating.
-
- int capture_level_in = capture_level;
- ASSERT_EQ(apm->kNoError,
- apm->gain_control()->set_stream_analog_level(capture_level));
- ASSERT_EQ(apm->kNoError,
- apm->set_stream_delay_ms(delay_ms));
- ASSERT_EQ(apm->kNoError,
- apm->echo_cancellation()->set_stream_drift_samples(drift_samples));
-
- int err = apm->ProcessStream(&near_frame);
- if (err == apm->kBadStreamParameterWarning) {
- printf("Bad parameter warning. %s\n", trace_stream.str().c_str());
- }
- ASSERT_TRUE(err == apm->kNoError ||
- err == apm->kBadStreamParameterWarning);
-
- capture_level = apm->gain_control()->stream_analog_level();
-
- stream_has_voice =
- static_cast<int8_t>(apm->voice_detection()->stream_has_voice());
- if (vad_out_file != NULL) {
- ASSERT_EQ(1u, fwrite(&stream_has_voice,
- sizeof(stream_has_voice),
- 1,
- vad_out_file));
- }
-
- if (apm->gain_control()->mode() != GainControl::kAdaptiveAnalog) {
- ASSERT_EQ(capture_level_in, capture_level);
- }
-
- if (perf_testing) {
- t1 = TickTime::Now();
- TickInterval tick_diff = t1 - t0;
- acc_ticks += tick_diff;
- if (tick_diff.Microseconds() > max_time_us) {
- max_time_us = tick_diff.Microseconds();
- }
- if (tick_diff.Microseconds() < min_time_us) {
- min_time_us = tick_diff.Microseconds();
- }
- }
-
- ASSERT_EQ(near_frame._payloadDataLengthInSamples,
- fwrite(near_frame._payloadData,
- sizeof(WebRtc_Word16),
- near_frame._payloadDataLengthInSamples,
- out_file));
- }
- else {
- FAIL() << "Event " << event << " is unrecognized";
- }
- }
-
- if (verbose) {
- printf("\nProcessed frames: %d (primary), %d (reverse)\n",
- primary_count, reverse_count);
- }
-
- int8_t temp_int8;
- if (far_file != NULL) {
- read_count = fread(&temp_int8, sizeof(temp_int8), 1, far_file);
- EXPECT_NE(0, feof(far_file)) << "Far-end file not fully processed";
- }
- read_count = fread(&temp_int8, sizeof(temp_int8), 1, near_file);
- EXPECT_NE(0, feof(near_file)) << "Near-end file not fully processed";
-
- if (!simulating) {
- read_count = fread(&temp_int8, sizeof(temp_int8), 1, event_file);
- EXPECT_NE(0, feof(event_file)) << "Event file not fully processed";
- read_count = fread(&temp_int8, sizeof(temp_int8), 1, delay_file);
- EXPECT_NE(0, feof(delay_file)) << "Delay file not fully processed";
- read_count = fread(&temp_int8, sizeof(temp_int8), 1, drift_file);
- EXPECT_NE(0, feof(drift_file)) << "Drift file not fully processed";
- }
-
- if (perf_testing) {
- if (primary_count > 0) {
- WebRtc_Word64 exec_time = acc_ticks.Milliseconds();
- printf("\nTotal time: %.3f s, file time: %.2f s\n",
- exec_time * 0.001, primary_count * 0.01);
- printf("Time per frame: %.3f ms (average), %.3f ms (max),"
- " %.3f ms (min)\n",
- (exec_time * 1.0) / primary_count,
- (max_time_us + max_time_reverse_us) / 1000.0,
- (min_time_us + min_time_reverse_us) / 1000.0);
- } else {
- printf("Warning: no capture frames\n");
- }
- }
-
- AudioProcessing::Destroy(apm);
- apm = NULL;
-}
-
-int main(int argc, char* argv[])
-{
- void_main(argc, argv);
-
- return 0;
-}
diff --git a/src/modules/audio_processing/main/test/unit_test/Android.mk b/src/modules/audio_processing/main/test/unit_test/Android.mk
deleted file mode 100644
index b2029cf..0000000
--- a/src/modules/audio_processing/main/test/unit_test/Android.mk
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-LOCAL_PATH:= $(call my-dir)
-
-# apm test app
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-LOCAL_CPP_EXTENSION := .cc
-LOCAL_SRC_FILES:= \
- unit_test.cc
-
-# Flags passed to both C and C++ files.
-LOCAL_CFLAGS := \
- '-DWEBRTC_TARGET_PC' \
- '-DWEBRTC_LINUX' \
- '-DWEBRTC_THREAD_RR' \
- '-DWEBRTC_ANDROID' \
- '-DANDROID'
-
-LOCAL_CPPFLAGS :=
-LOCAL_LDFLAGS :=
-LOCAL_C_INCLUDES := \
- external/gtest/include \
- $(LOCAL_PATH)/../../../../../system_wrappers/interface \
- $(LOCAL_PATH)/../../../../../common_audio/signal_processing_library/main/interface \
- $(LOCAL_PATH)/../../interface \
- $(LOCAL_PATH)/../../../../interface \
- $(LOCAL_PATH)/../../../../..
-
-LOCAL_STATIC_LIBRARIES := \
- libgtest
-
-LOCAL_SHARED_LIBRARIES := \
- libutils \
- libstlport \
- libwebrtc_audio_preprocessing
-
-LOCAL_MODULE:= webrtc_apm_unit_test
-
-include external/stlport/libstlport.mk
-include $(BUILD_EXECUTABLE)
diff --git a/src/modules/audio_processing/main/test/unit_test/audio_processing_unittest.pb.cc b/src/modules/audio_processing/main/test/unit_test/audio_processing_unittest.pb.cc
deleted file mode 100644
index c82ffdb..0000000
--- a/src/modules/audio_processing/main/test/unit_test/audio_processing_unittest.pb.cc
+++ /dev/null
@@ -1,1111 +0,0 @@
-// Generated by the protocol buffer compiler. DO NOT EDIT!
-
-#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION
-#include "audio_processing_unittest.pb.h"
-
-#include <algorithm>
-
-#include <google/protobuf/stubs/once.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/wire_format_lite_inl.h>
-// @@protoc_insertion_point(includes)
-
-namespace audio_processing_unittest {
-
-void protobuf_ShutdownFile_audio_5fprocessing_5funittest_2eproto() {
- delete Test::default_instance_;
- delete Test_Statistic::default_instance_;
- delete Test_EchoMetrics::default_instance_;
- delete OutputData::default_instance_;
-}
-
-void protobuf_AddDesc_audio_5fprocessing_5funittest_2eproto() {
- static bool already_here = false;
- if (already_here) return;
- already_here = true;
- GOOGLE_PROTOBUF_VERIFY_VERSION;
-
- Test::default_instance_ = new Test();
- Test_Statistic::default_instance_ = new Test_Statistic();
- Test_EchoMetrics::default_instance_ = new Test_EchoMetrics();
- OutputData::default_instance_ = new OutputData();
- Test::default_instance_->InitAsDefaultInstance();
- Test_Statistic::default_instance_->InitAsDefaultInstance();
- Test_EchoMetrics::default_instance_->InitAsDefaultInstance();
- OutputData::default_instance_->InitAsDefaultInstance();
- ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_audio_5fprocessing_5funittest_2eproto);
-}
-
-// Force AddDescriptors() to be called at static initialization time.
-struct StaticDescriptorInitializer_audio_5fprocessing_5funittest_2eproto {
- StaticDescriptorInitializer_audio_5fprocessing_5funittest_2eproto() {
- protobuf_AddDesc_audio_5fprocessing_5funittest_2eproto();
- }
-} static_descriptor_initializer_audio_5fprocessing_5funittest_2eproto_;
-
-
-// ===================================================================
-
-#ifndef _MSC_VER
-const int Test_Statistic::kInstantFieldNumber;
-const int Test_Statistic::kAverageFieldNumber;
-const int Test_Statistic::kMaximumFieldNumber;
-const int Test_Statistic::kMinimumFieldNumber;
-#endif // !_MSC_VER
-
-Test_Statistic::Test_Statistic()
- : ::google::protobuf::MessageLite() {
- SharedCtor();
-}
-
-void Test_Statistic::InitAsDefaultInstance() {
-}
-
-Test_Statistic::Test_Statistic(const Test_Statistic& from)
- : ::google::protobuf::MessageLite() {
- SharedCtor();
- MergeFrom(from);
-}
-
-void Test_Statistic::SharedCtor() {
- _cached_size_ = 0;
- instant_ = 0;
- average_ = 0;
- maximum_ = 0;
- minimum_ = 0;
- ::memset(_has_bits_, 0, sizeof(_has_bits_));
-}
-
-Test_Statistic::~Test_Statistic() {
- SharedDtor();
-}
-
-void Test_Statistic::SharedDtor() {
- if (this != default_instance_) {
- }
-}
-
-void Test_Statistic::SetCachedSize(int size) const {
- GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
- _cached_size_ = size;
- GOOGLE_SAFE_CONCURRENT_WRITES_END();
-}
-const Test_Statistic& Test_Statistic::default_instance() {
- if (default_instance_ == NULL) protobuf_AddDesc_audio_5fprocessing_5funittest_2eproto(); return *default_instance_;
-}
-
-Test_Statistic* Test_Statistic::default_instance_ = NULL;
-
-Test_Statistic* Test_Statistic::New() const {
- return new Test_Statistic;
-}
-
-void Test_Statistic::Clear() {
- if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
- instant_ = 0;
- average_ = 0;
- maximum_ = 0;
- minimum_ = 0;
- }
- ::memset(_has_bits_, 0, sizeof(_has_bits_));
-}
-
-bool Test_Statistic::MergePartialFromCodedStream(
- ::google::protobuf::io::CodedInputStream* input) {
-#define DO_(EXPRESSION) if (!(EXPRESSION)) return false
- ::google::protobuf::uint32 tag;
- while ((tag = input->ReadTag()) != 0) {
- switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
- // optional int32 instant = 1;
- case 1: {
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
- DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
- ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
- input, &instant_)));
- set_has_instant();
- } else {
- goto handle_uninterpreted;
- }
- if (input->ExpectTag(16)) goto parse_average;
- break;
- }
-
- // optional int32 average = 2;
- case 2: {
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
- parse_average:
- DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
- ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
- input, &average_)));
- set_has_average();
- } else {
- goto handle_uninterpreted;
- }
- if (input->ExpectTag(24)) goto parse_maximum;
- break;
- }
-
- // optional int32 maximum = 3;
- case 3: {
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
- parse_maximum:
- DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
- ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
- input, &maximum_)));
- set_has_maximum();
- } else {
- goto handle_uninterpreted;
- }
- if (input->ExpectTag(32)) goto parse_minimum;
- break;
- }
-
- // optional int32 minimum = 4;
- case 4: {
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
- parse_minimum:
- DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
- ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
- input, &minimum_)));
- set_has_minimum();
- } else {
- goto handle_uninterpreted;
- }
- if (input->ExpectAtEnd()) return true;
- break;
- }
-
- default: {
- handle_uninterpreted:
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
- return true;
- }
- DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag, NULL));
- break;
- }
- }
- }
- return true;
-#undef DO_
-}
-
-void Test_Statistic::SerializeWithCachedSizes(
- ::google::protobuf::io::CodedOutputStream* output) const {
- // optional int32 instant = 1;
- if (has_instant()) {
- ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->instant(), output);
- }
-
- // optional int32 average = 2;
- if (has_average()) {
- ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->average(), output);
- }
-
- // optional int32 maximum = 3;
- if (has_maximum()) {
- ::google::protobuf::internal::WireFormatLite::WriteInt32(3, this->maximum(), output);
- }
-
- // optional int32 minimum = 4;
- if (has_minimum()) {
- ::google::protobuf::internal::WireFormatLite::WriteInt32(4, this->minimum(), output);
- }
-
-}
-
-int Test_Statistic::ByteSize() const {
- int total_size = 0;
-
- if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
- // optional int32 instant = 1;
- if (has_instant()) {
- total_size += 1 +
- ::google::protobuf::internal::WireFormatLite::Int32Size(
- this->instant());
- }
-
- // optional int32 average = 2;
- if (has_average()) {
- total_size += 1 +
- ::google::protobuf::internal::WireFormatLite::Int32Size(
- this->average());
- }
-
- // optional int32 maximum = 3;
- if (has_maximum()) {
- total_size += 1 +
- ::google::protobuf::internal::WireFormatLite::Int32Size(
- this->maximum());
- }
-
- // optional int32 minimum = 4;
- if (has_minimum()) {
- total_size += 1 +
- ::google::protobuf::internal::WireFormatLite::Int32Size(
- this->minimum());
- }
-
- }
- GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
- _cached_size_ = total_size;
- GOOGLE_SAFE_CONCURRENT_WRITES_END();
- return total_size;
-}
-
-void Test_Statistic::CheckTypeAndMergeFrom(
- const ::google::protobuf::MessageLite& from) {
- MergeFrom(*::google::protobuf::down_cast<const Test_Statistic*>(&from));
-}
-
-void Test_Statistic::MergeFrom(const Test_Statistic& from) {
- GOOGLE_CHECK_NE(&from, this);
- if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
- if (from.has_instant()) {
- set_instant(from.instant());
- }
- if (from.has_average()) {
- set_average(from.average());
- }
- if (from.has_maximum()) {
- set_maximum(from.maximum());
- }
- if (from.has_minimum()) {
- set_minimum(from.minimum());
- }
- }
-}
-
-void Test_Statistic::CopyFrom(const Test_Statistic& from) {
- if (&from == this) return;
- Clear();
- MergeFrom(from);
-}
-
-bool Test_Statistic::IsInitialized() const {
-
- return true;
-}
-
-void Test_Statistic::Swap(Test_Statistic* other) {
- if (other != this) {
- std::swap(instant_, other->instant_);
- std::swap(average_, other->average_);
- std::swap(maximum_, other->maximum_);
- std::swap(minimum_, other->minimum_);
- std::swap(_has_bits_[0], other->_has_bits_[0]);
- std::swap(_cached_size_, other->_cached_size_);
- }
-}
-
-::std::string Test_Statistic::GetTypeName() const {
- return "audio_processing_unittest.Test.Statistic";
-}
-
-
-// -------------------------------------------------------------------
-
-#ifndef _MSC_VER
-const int Test_EchoMetrics::kResidualEchoReturnLossFieldNumber;
-const int Test_EchoMetrics::kEchoReturnLossFieldNumber;
-const int Test_EchoMetrics::kEchoReturnLossEnhancementFieldNumber;
-const int Test_EchoMetrics::kANlpFieldNumber;
-#endif // !_MSC_VER
-
-Test_EchoMetrics::Test_EchoMetrics()
- : ::google::protobuf::MessageLite() {
- SharedCtor();
-}
-
-void Test_EchoMetrics::InitAsDefaultInstance() {
- residualechoreturnloss_ = const_cast< ::audio_processing_unittest::Test_Statistic*>(&::audio_processing_unittest::Test_Statistic::default_instance());
- echoreturnloss_ = const_cast< ::audio_processing_unittest::Test_Statistic*>(&::audio_processing_unittest::Test_Statistic::default_instance());
- echoreturnlossenhancement_ = const_cast< ::audio_processing_unittest::Test_Statistic*>(&::audio_processing_unittest::Test_Statistic::default_instance());
- anlp_ = const_cast< ::audio_processing_unittest::Test_Statistic*>(&::audio_processing_unittest::Test_Statistic::default_instance());
-}
-
-Test_EchoMetrics::Test_EchoMetrics(const Test_EchoMetrics& from)
- : ::google::protobuf::MessageLite() {
- SharedCtor();
- MergeFrom(from);
-}
-
-void Test_EchoMetrics::SharedCtor() {
- _cached_size_ = 0;
- residualechoreturnloss_ = NULL;
- echoreturnloss_ = NULL;
- echoreturnlossenhancement_ = NULL;
- anlp_ = NULL;
- ::memset(_has_bits_, 0, sizeof(_has_bits_));
-}
-
-Test_EchoMetrics::~Test_EchoMetrics() {
- SharedDtor();
-}
-
-void Test_EchoMetrics::SharedDtor() {
- if (this != default_instance_) {
- delete residualechoreturnloss_;
- delete echoreturnloss_;
- delete echoreturnlossenhancement_;
- delete anlp_;
- }
-}
-
-void Test_EchoMetrics::SetCachedSize(int size) const {
- GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
- _cached_size_ = size;
- GOOGLE_SAFE_CONCURRENT_WRITES_END();
-}
-const Test_EchoMetrics& Test_EchoMetrics::default_instance() {
- if (default_instance_ == NULL) protobuf_AddDesc_audio_5fprocessing_5funittest_2eproto(); return *default_instance_;
-}
-
-Test_EchoMetrics* Test_EchoMetrics::default_instance_ = NULL;
-
-Test_EchoMetrics* Test_EchoMetrics::New() const {
- return new Test_EchoMetrics;
-}
-
-void Test_EchoMetrics::Clear() {
- if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
- if (has_residualechoreturnloss()) {
- if (residualechoreturnloss_ != NULL) residualechoreturnloss_->::audio_processing_unittest::Test_Statistic::Clear();
- }
- if (has_echoreturnloss()) {
- if (echoreturnloss_ != NULL) echoreturnloss_->::audio_processing_unittest::Test_Statistic::Clear();
- }
- if (has_echoreturnlossenhancement()) {
- if (echoreturnlossenhancement_ != NULL) echoreturnlossenhancement_->::audio_processing_unittest::Test_Statistic::Clear();
- }
- if (has_anlp()) {
- if (anlp_ != NULL) anlp_->::audio_processing_unittest::Test_Statistic::Clear();
- }
- }
- ::memset(_has_bits_, 0, sizeof(_has_bits_));
-}
-
-bool Test_EchoMetrics::MergePartialFromCodedStream(
- ::google::protobuf::io::CodedInputStream* input) {
-#define DO_(EXPRESSION) if (!(EXPRESSION)) return false
- ::google::protobuf::uint32 tag;
- while ((tag = input->ReadTag()) != 0) {
- switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
- // optional .audio_processing_unittest.Test.Statistic residualEchoReturnLoss = 1;
- case 1: {
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
- DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
- input, mutable_residualechoreturnloss()));
- } else {
- goto handle_uninterpreted;
- }
- if (input->ExpectTag(18)) goto parse_echoReturnLoss;
- break;
- }
-
- // optional .audio_processing_unittest.Test.Statistic echoReturnLoss = 2;
- case 2: {
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
- parse_echoReturnLoss:
- DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
- input, mutable_echoreturnloss()));
- } else {
- goto handle_uninterpreted;
- }
- if (input->ExpectTag(26)) goto parse_echoReturnLossEnhancement;
- break;
- }
-
- // optional .audio_processing_unittest.Test.Statistic echoReturnLossEnhancement = 3;
- case 3: {
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
- parse_echoReturnLossEnhancement:
- DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
- input, mutable_echoreturnlossenhancement()));
- } else {
- goto handle_uninterpreted;
- }
- if (input->ExpectTag(34)) goto parse_aNlp;
- break;
- }
-
- // optional .audio_processing_unittest.Test.Statistic aNlp = 4;
- case 4: {
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
- parse_aNlp:
- DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
- input, mutable_anlp()));
- } else {
- goto handle_uninterpreted;
- }
- if (input->ExpectAtEnd()) return true;
- break;
- }
-
- default: {
- handle_uninterpreted:
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
- return true;
- }
- DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag, NULL));
- break;
- }
- }
- }
- return true;
-#undef DO_
-}
-
-void Test_EchoMetrics::SerializeWithCachedSizes(
- ::google::protobuf::io::CodedOutputStream* output) const {
- // optional .audio_processing_unittest.Test.Statistic residualEchoReturnLoss = 1;
- if (has_residualechoreturnloss()) {
- ::google::protobuf::internal::WireFormatLite::WriteMessage(
- 1, this->residualechoreturnloss(), output);
- }
-
- // optional .audio_processing_unittest.Test.Statistic echoReturnLoss = 2;
- if (has_echoreturnloss()) {
- ::google::protobuf::internal::WireFormatLite::WriteMessage(
- 2, this->echoreturnloss(), output);
- }
-
- // optional .audio_processing_unittest.Test.Statistic echoReturnLossEnhancement = 3;
- if (has_echoreturnlossenhancement()) {
- ::google::protobuf::internal::WireFormatLite::WriteMessage(
- 3, this->echoreturnlossenhancement(), output);
- }
-
- // optional .audio_processing_unittest.Test.Statistic aNlp = 4;
- if (has_anlp()) {
- ::google::protobuf::internal::WireFormatLite::WriteMessage(
- 4, this->anlp(), output);
- }
-
-}
-
-int Test_EchoMetrics::ByteSize() const {
- int total_size = 0;
-
- if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
- // optional .audio_processing_unittest.Test.Statistic residualEchoReturnLoss = 1;
- if (has_residualechoreturnloss()) {
- total_size += 1 +
- ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
- this->residualechoreturnloss());
- }
-
- // optional .audio_processing_unittest.Test.Statistic echoReturnLoss = 2;
- if (has_echoreturnloss()) {
- total_size += 1 +
- ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
- this->echoreturnloss());
- }
-
- // optional .audio_processing_unittest.Test.Statistic echoReturnLossEnhancement = 3;
- if (has_echoreturnlossenhancement()) {
- total_size += 1 +
- ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
- this->echoreturnlossenhancement());
- }
-
- // optional .audio_processing_unittest.Test.Statistic aNlp = 4;
- if (has_anlp()) {
- total_size += 1 +
- ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
- this->anlp());
- }
-
- }
- GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
- _cached_size_ = total_size;
- GOOGLE_SAFE_CONCURRENT_WRITES_END();
- return total_size;
-}
-
-void Test_EchoMetrics::CheckTypeAndMergeFrom(
- const ::google::protobuf::MessageLite& from) {
- MergeFrom(*::google::protobuf::down_cast<const Test_EchoMetrics*>(&from));
-}
-
-void Test_EchoMetrics::MergeFrom(const Test_EchoMetrics& from) {
- GOOGLE_CHECK_NE(&from, this);
- if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
- if (from.has_residualechoreturnloss()) {
- mutable_residualechoreturnloss()->::audio_processing_unittest::Test_Statistic::MergeFrom(from.residualechoreturnloss());
- }
- if (from.has_echoreturnloss()) {
- mutable_echoreturnloss()->::audio_processing_unittest::Test_Statistic::MergeFrom(from.echoreturnloss());
- }
- if (from.has_echoreturnlossenhancement()) {
- mutable_echoreturnlossenhancement()->::audio_processing_unittest::Test_Statistic::MergeFrom(from.echoreturnlossenhancement());
- }
- if (from.has_anlp()) {
- mutable_anlp()->::audio_processing_unittest::Test_Statistic::MergeFrom(from.anlp());
- }
- }
-}
-
-void Test_EchoMetrics::CopyFrom(const Test_EchoMetrics& from) {
- if (&from == this) return;
- Clear();
- MergeFrom(from);
-}
-
-bool Test_EchoMetrics::IsInitialized() const {
-
- return true;
-}
-
-void Test_EchoMetrics::Swap(Test_EchoMetrics* other) {
- if (other != this) {
- std::swap(residualechoreturnloss_, other->residualechoreturnloss_);
- std::swap(echoreturnloss_, other->echoreturnloss_);
- std::swap(echoreturnlossenhancement_, other->echoreturnlossenhancement_);
- std::swap(anlp_, other->anlp_);
- std::swap(_has_bits_[0], other->_has_bits_[0]);
- std::swap(_cached_size_, other->_cached_size_);
- }
-}
-
-::std::string Test_EchoMetrics::GetTypeName() const {
- return "audio_processing_unittest.Test.EchoMetrics";
-}
-
-
-// -------------------------------------------------------------------
-
-#ifndef _MSC_VER
-const int Test::kNumReverseChannelsFieldNumber;
-const int Test::kNumChannelsFieldNumber;
-const int Test::kSampleRateFieldNumber;
-const int Test::kHasEchoCountFieldNumber;
-const int Test::kHasVoiceCountFieldNumber;
-const int Test::kIsSaturatedCountFieldNumber;
-const int Test::kEchoMetricsFieldNumber;
-#endif // !_MSC_VER
-
-Test::Test()
- : ::google::protobuf::MessageLite() {
- SharedCtor();
-}
-
-void Test::InitAsDefaultInstance() {
- echometrics_ = const_cast< ::audio_processing_unittest::Test_EchoMetrics*>(&::audio_processing_unittest::Test_EchoMetrics::default_instance());
-}
-
-Test::Test(const Test& from)
- : ::google::protobuf::MessageLite() {
- SharedCtor();
- MergeFrom(from);
-}
-
-void Test::SharedCtor() {
- _cached_size_ = 0;
- numreversechannels_ = 0;
- numchannels_ = 0;
- samplerate_ = 0;
- hasechocount_ = 0;
- hasvoicecount_ = 0;
- issaturatedcount_ = 0;
- echometrics_ = NULL;
- ::memset(_has_bits_, 0, sizeof(_has_bits_));
-}
-
-Test::~Test() {
- SharedDtor();
-}
-
-void Test::SharedDtor() {
- if (this != default_instance_) {
- delete echometrics_;
- }
-}
-
-void Test::SetCachedSize(int size) const {
- GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
- _cached_size_ = size;
- GOOGLE_SAFE_CONCURRENT_WRITES_END();
-}
-const Test& Test::default_instance() {
- if (default_instance_ == NULL) protobuf_AddDesc_audio_5fprocessing_5funittest_2eproto(); return *default_instance_;
-}
-
-Test* Test::default_instance_ = NULL;
-
-Test* Test::New() const {
- return new Test;
-}
-
-void Test::Clear() {
- if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
- numreversechannels_ = 0;
- numchannels_ = 0;
- samplerate_ = 0;
- hasechocount_ = 0;
- hasvoicecount_ = 0;
- issaturatedcount_ = 0;
- if (has_echometrics()) {
- if (echometrics_ != NULL) echometrics_->::audio_processing_unittest::Test_EchoMetrics::Clear();
- }
- }
- ::memset(_has_bits_, 0, sizeof(_has_bits_));
-}
-
-bool Test::MergePartialFromCodedStream(
- ::google::protobuf::io::CodedInputStream* input) {
-#define DO_(EXPRESSION) if (!(EXPRESSION)) return false
- ::google::protobuf::uint32 tag;
- while ((tag = input->ReadTag()) != 0) {
- switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
- // optional int32 numReverseChannels = 1;
- case 1: {
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
- DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
- ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
- input, &numreversechannels_)));
- set_has_numreversechannels();
- } else {
- goto handle_uninterpreted;
- }
- if (input->ExpectTag(16)) goto parse_numChannels;
- break;
- }
-
- // optional int32 numChannels = 2;
- case 2: {
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
- parse_numChannels:
- DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
- ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
- input, &numchannels_)));
- set_has_numchannels();
- } else {
- goto handle_uninterpreted;
- }
- if (input->ExpectTag(24)) goto parse_sampleRate;
- break;
- }
-
- // optional int32 sampleRate = 3;
- case 3: {
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
- parse_sampleRate:
- DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
- ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
- input, &samplerate_)));
- set_has_samplerate();
- } else {
- goto handle_uninterpreted;
- }
- if (input->ExpectTag(32)) goto parse_hasEchoCount;
- break;
- }
-
- // optional int32 hasEchoCount = 4;
- case 4: {
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
- parse_hasEchoCount:
- DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
- ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
- input, &hasechocount_)));
- set_has_hasechocount();
- } else {
- goto handle_uninterpreted;
- }
- if (input->ExpectTag(40)) goto parse_hasVoiceCount;
- break;
- }
-
- // optional int32 hasVoiceCount = 5;
- case 5: {
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
- parse_hasVoiceCount:
- DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
- ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
- input, &hasvoicecount_)));
- set_has_hasvoicecount();
- } else {
- goto handle_uninterpreted;
- }
- if (input->ExpectTag(48)) goto parse_isSaturatedCount;
- break;
- }
-
- // optional int32 isSaturatedCount = 6;
- case 6: {
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
- parse_isSaturatedCount:
- DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
- ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
- input, &issaturatedcount_)));
- set_has_issaturatedcount();
- } else {
- goto handle_uninterpreted;
- }
- if (input->ExpectTag(58)) goto parse_echoMetrics;
- break;
- }
-
- // optional .audio_processing_unittest.Test.EchoMetrics echoMetrics = 7;
- case 7: {
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
- parse_echoMetrics:
- DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
- input, mutable_echometrics()));
- } else {
- goto handle_uninterpreted;
- }
- if (input->ExpectAtEnd()) return true;
- break;
- }
-
- default: {
- handle_uninterpreted:
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
- return true;
- }
- DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag, NULL));
- break;
- }
- }
- }
- return true;
-#undef DO_
-}
-
-void Test::SerializeWithCachedSizes(
- ::google::protobuf::io::CodedOutputStream* output) const {
- // optional int32 numReverseChannels = 1;
- if (has_numreversechannels()) {
- ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->numreversechannels(), output);
- }
-
- // optional int32 numChannels = 2;
- if (has_numchannels()) {
- ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->numchannels(), output);
- }
-
- // optional int32 sampleRate = 3;
- if (has_samplerate()) {
- ::google::protobuf::internal::WireFormatLite::WriteInt32(3, this->samplerate(), output);
- }
-
- // optional int32 hasEchoCount = 4;
- if (has_hasechocount()) {
- ::google::protobuf::internal::WireFormatLite::WriteInt32(4, this->hasechocount(), output);
- }
-
- // optional int32 hasVoiceCount = 5;
- if (has_hasvoicecount()) {
- ::google::protobuf::internal::WireFormatLite::WriteInt32(5, this->hasvoicecount(), output);
- }
-
- // optional int32 isSaturatedCount = 6;
- if (has_issaturatedcount()) {
- ::google::protobuf::internal::WireFormatLite::WriteInt32(6, this->issaturatedcount(), output);
- }
-
- // optional .audio_processing_unittest.Test.EchoMetrics echoMetrics = 7;
- if (has_echometrics()) {
- ::google::protobuf::internal::WireFormatLite::WriteMessage(
- 7, this->echometrics(), output);
- }
-
-}
-
-int Test::ByteSize() const {
- int total_size = 0;
-
- if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
- // optional int32 numReverseChannels = 1;
- if (has_numreversechannels()) {
- total_size += 1 +
- ::google::protobuf::internal::WireFormatLite::Int32Size(
- this->numreversechannels());
- }
-
- // optional int32 numChannels = 2;
- if (has_numchannels()) {
- total_size += 1 +
- ::google::protobuf::internal::WireFormatLite::Int32Size(
- this->numchannels());
- }
-
- // optional int32 sampleRate = 3;
- if (has_samplerate()) {
- total_size += 1 +
- ::google::protobuf::internal::WireFormatLite::Int32Size(
- this->samplerate());
- }
-
- // optional int32 hasEchoCount = 4;
- if (has_hasechocount()) {
- total_size += 1 +
- ::google::protobuf::internal::WireFormatLite::Int32Size(
- this->hasechocount());
- }
-
- // optional int32 hasVoiceCount = 5;
- if (has_hasvoicecount()) {
- total_size += 1 +
- ::google::protobuf::internal::WireFormatLite::Int32Size(
- this->hasvoicecount());
- }
-
- // optional int32 isSaturatedCount = 6;
- if (has_issaturatedcount()) {
- total_size += 1 +
- ::google::protobuf::internal::WireFormatLite::Int32Size(
- this->issaturatedcount());
- }
-
- // optional .audio_processing_unittest.Test.EchoMetrics echoMetrics = 7;
- if (has_echometrics()) {
- total_size += 1 +
- ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
- this->echometrics());
- }
-
- }
- GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
- _cached_size_ = total_size;
- GOOGLE_SAFE_CONCURRENT_WRITES_END();
- return total_size;
-}
-
-void Test::CheckTypeAndMergeFrom(
- const ::google::protobuf::MessageLite& from) {
- MergeFrom(*::google::protobuf::down_cast<const Test*>(&from));
-}
-
-void Test::MergeFrom(const Test& from) {
- GOOGLE_CHECK_NE(&from, this);
- if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
- if (from.has_numreversechannels()) {
- set_numreversechannels(from.numreversechannels());
- }
- if (from.has_numchannels()) {
- set_numchannels(from.numchannels());
- }
- if (from.has_samplerate()) {
- set_samplerate(from.samplerate());
- }
- if (from.has_hasechocount()) {
- set_hasechocount(from.hasechocount());
- }
- if (from.has_hasvoicecount()) {
- set_hasvoicecount(from.hasvoicecount());
- }
- if (from.has_issaturatedcount()) {
- set_issaturatedcount(from.issaturatedcount());
- }
- if (from.has_echometrics()) {
- mutable_echometrics()->::audio_processing_unittest::Test_EchoMetrics::MergeFrom(from.echometrics());
- }
- }
-}
-
-void Test::CopyFrom(const Test& from) {
- if (&from == this) return;
- Clear();
- MergeFrom(from);
-}
-
-bool Test::IsInitialized() const {
-
- return true;
-}
-
-void Test::Swap(Test* other) {
- if (other != this) {
- std::swap(numreversechannels_, other->numreversechannels_);
- std::swap(numchannels_, other->numchannels_);
- std::swap(samplerate_, other->samplerate_);
- std::swap(hasechocount_, other->hasechocount_);
- std::swap(hasvoicecount_, other->hasvoicecount_);
- std::swap(issaturatedcount_, other->issaturatedcount_);
- std::swap(echometrics_, other->echometrics_);
- std::swap(_has_bits_[0], other->_has_bits_[0]);
- std::swap(_cached_size_, other->_cached_size_);
- }
-}
-
-::std::string Test::GetTypeName() const {
- return "audio_processing_unittest.Test";
-}
-
-
-// ===================================================================
-
-#ifndef _MSC_VER
-const int OutputData::kTestFieldNumber;
-#endif // !_MSC_VER
-
-OutputData::OutputData()
- : ::google::protobuf::MessageLite() {
- SharedCtor();
-}
-
-void OutputData::InitAsDefaultInstance() {
-}
-
-OutputData::OutputData(const OutputData& from)
- : ::google::protobuf::MessageLite() {
- SharedCtor();
- MergeFrom(from);
-}
-
-void OutputData::SharedCtor() {
- _cached_size_ = 0;
- ::memset(_has_bits_, 0, sizeof(_has_bits_));
-}
-
-OutputData::~OutputData() {
- SharedDtor();
-}
-
-void OutputData::SharedDtor() {
- if (this != default_instance_) {
- }
-}
-
-void OutputData::SetCachedSize(int size) const {
- GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
- _cached_size_ = size;
- GOOGLE_SAFE_CONCURRENT_WRITES_END();
-}
-const OutputData& OutputData::default_instance() {
- if (default_instance_ == NULL) protobuf_AddDesc_audio_5fprocessing_5funittest_2eproto(); return *default_instance_;
-}
-
-OutputData* OutputData::default_instance_ = NULL;
-
-OutputData* OutputData::New() const {
- return new OutputData;
-}
-
-void OutputData::Clear() {
- test_.Clear();
- ::memset(_has_bits_, 0, sizeof(_has_bits_));
-}
-
-bool OutputData::MergePartialFromCodedStream(
- ::google::protobuf::io::CodedInputStream* input) {
-#define DO_(EXPRESSION) if (!(EXPRESSION)) return false
- ::google::protobuf::uint32 tag;
- while ((tag = input->ReadTag()) != 0) {
- switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
- // repeated .audio_processing_unittest.Test test = 1;
- case 1: {
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
- parse_test:
- DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
- input, add_test()));
- } else {
- goto handle_uninterpreted;
- }
- if (input->ExpectTag(10)) goto parse_test;
- if (input->ExpectAtEnd()) return true;
- break;
- }
-
- default: {
- handle_uninterpreted:
- if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
- ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
- return true;
- }
- DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag, NULL));
- break;
- }
- }
- }
- return true;
-#undef DO_
-}
-
-void OutputData::SerializeWithCachedSizes(
- ::google::protobuf::io::CodedOutputStream* output) const {
- // repeated .audio_processing_unittest.Test test = 1;
- for (int i = 0; i < this->test_size(); i++) {
- ::google::protobuf::internal::WireFormatLite::WriteMessage(
- 1, this->test(i), output);
- }
-
-}
-
-int OutputData::ByteSize() const {
- int total_size = 0;
-
- // repeated .audio_processing_unittest.Test test = 1;
- total_size += 1 * this->test_size();
- for (int i = 0; i < this->test_size(); i++) {
- total_size +=
- ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
- this->test(i));
- }
-
- GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
- _cached_size_ = total_size;
- GOOGLE_SAFE_CONCURRENT_WRITES_END();
- return total_size;
-}
-
-void OutputData::CheckTypeAndMergeFrom(
- const ::google::protobuf::MessageLite& from) {
- MergeFrom(*::google::protobuf::down_cast<const OutputData*>(&from));
-}
-
-void OutputData::MergeFrom(const OutputData& from) {
- GOOGLE_CHECK_NE(&from, this);
- test_.MergeFrom(from.test_);
-}
-
-void OutputData::CopyFrom(const OutputData& from) {
- if (&from == this) return;
- Clear();
- MergeFrom(from);
-}
-
-bool OutputData::IsInitialized() const {
-
- return true;
-}
-
-void OutputData::Swap(OutputData* other) {
- if (other != this) {
- test_.Swap(&other->test_);
- std::swap(_has_bits_[0], other->_has_bits_[0]);
- std::swap(_cached_size_, other->_cached_size_);
- }
-}
-
-::std::string OutputData::GetTypeName() const {
- return "audio_processing_unittest.OutputData";
-}
-
-
-// @@protoc_insertion_point(namespace_scope)
-
-} // namespace audio_processing_unittest
-
-// @@protoc_insertion_point(global_scope)
diff --git a/src/modules/audio_processing/main/test/unit_test/audio_processing_unittest.pb.h b/src/modules/audio_processing/main/test/unit_test/audio_processing_unittest.pb.h
deleted file mode 100644
index 34c21b2..0000000
--- a/src/modules/audio_processing/main/test/unit_test/audio_processing_unittest.pb.h
+++ /dev/null
@@ -1,862 +0,0 @@
-// Generated by the protocol buffer compiler. DO NOT EDIT!
-// source: audio_processing_unittest.proto
-
-#ifndef PROTOBUF_audio_5fprocessing_5funittest_2eproto__INCLUDED
-#define PROTOBUF_audio_5fprocessing_5funittest_2eproto__INCLUDED
-
-#include <string>
-
-#include <google/protobuf/stubs/common.h>
-
-#if GOOGLE_PROTOBUF_VERSION < 2004000
-#error This file was generated by a newer version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please update
-#error your headers.
-#endif
-#if 2004000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
-#error This file was generated by an older version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please
-#error regenerate this file with a newer version of protoc.
-#endif
-
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/extension_set.h>
-// @@protoc_insertion_point(includes)
-
-namespace audio_processing_unittest {
-
-// Internal implementation detail -- do not call these.
-void protobuf_AddDesc_audio_5fprocessing_5funittest_2eproto();
-void protobuf_AssignDesc_audio_5fprocessing_5funittest_2eproto();
-void protobuf_ShutdownFile_audio_5fprocessing_5funittest_2eproto();
-
-class Test;
-class Test_Statistic;
-class Test_EchoMetrics;
-class OutputData;
-
-// ===================================================================
-
-class Test_Statistic : public ::google::protobuf::MessageLite {
- public:
- Test_Statistic();
- virtual ~Test_Statistic();
-
- Test_Statistic(const Test_Statistic& from);
-
- inline Test_Statistic& operator=(const Test_Statistic& from) {
- CopyFrom(from);
- return *this;
- }
-
- static const Test_Statistic& default_instance();
-
- void Swap(Test_Statistic* other);
-
- // implements Message ----------------------------------------------
-
- Test_Statistic* New() const;
- void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from);
- void CopyFrom(const Test_Statistic& from);
- void MergeFrom(const Test_Statistic& from);
- void Clear();
- bool IsInitialized() const;
-
- int ByteSize() const;
- bool MergePartialFromCodedStream(
- ::google::protobuf::io::CodedInputStream* input);
- void SerializeWithCachedSizes(
- ::google::protobuf::io::CodedOutputStream* output) const;
- int GetCachedSize() const { return _cached_size_; }
- private:
- void SharedCtor();
- void SharedDtor();
- void SetCachedSize(int size) const;
- public:
-
- ::std::string GetTypeName() const;
-
- // nested types ----------------------------------------------------
-
- // accessors -------------------------------------------------------
-
- // optional int32 instant = 1;
- inline bool has_instant() const;
- inline void clear_instant();
- static const int kInstantFieldNumber = 1;
- inline ::google::protobuf::int32 instant() const;
- inline void set_instant(::google::protobuf::int32 value);
-
- // optional int32 average = 2;
- inline bool has_average() const;
- inline void clear_average();
- static const int kAverageFieldNumber = 2;
- inline ::google::protobuf::int32 average() const;
- inline void set_average(::google::protobuf::int32 value);
-
- // optional int32 maximum = 3;
- inline bool has_maximum() const;
- inline void clear_maximum();
- static const int kMaximumFieldNumber = 3;
- inline ::google::protobuf::int32 maximum() const;
- inline void set_maximum(::google::protobuf::int32 value);
-
- // optional int32 minimum = 4;
- inline bool has_minimum() const;
- inline void clear_minimum();
- static const int kMinimumFieldNumber = 4;
- inline ::google::protobuf::int32 minimum() const;
- inline void set_minimum(::google::protobuf::int32 value);
-
- // @@protoc_insertion_point(class_scope:audio_processing_unittest.Test.Statistic)
- private:
- inline void set_has_instant();
- inline void clear_has_instant();
- inline void set_has_average();
- inline void clear_has_average();
- inline void set_has_maximum();
- inline void clear_has_maximum();
- inline void set_has_minimum();
- inline void clear_has_minimum();
-
- ::google::protobuf::int32 instant_;
- ::google::protobuf::int32 average_;
- ::google::protobuf::int32 maximum_;
- ::google::protobuf::int32 minimum_;
-
- mutable int _cached_size_;
- ::google::protobuf::uint32 _has_bits_[(4 + 31) / 32];
-
- friend void protobuf_AddDesc_audio_5fprocessing_5funittest_2eproto();
- friend void protobuf_AssignDesc_audio_5fprocessing_5funittest_2eproto();
- friend void protobuf_ShutdownFile_audio_5fprocessing_5funittest_2eproto();
-
- void InitAsDefaultInstance();
- static Test_Statistic* default_instance_;
-};
-// -------------------------------------------------------------------
-
-class Test_EchoMetrics : public ::google::protobuf::MessageLite {
- public:
- Test_EchoMetrics();
- virtual ~Test_EchoMetrics();
-
- Test_EchoMetrics(const Test_EchoMetrics& from);
-
- inline Test_EchoMetrics& operator=(const Test_EchoMetrics& from) {
- CopyFrom(from);
- return *this;
- }
-
- static const Test_EchoMetrics& default_instance();
-
- void Swap(Test_EchoMetrics* other);
-
- // implements Message ----------------------------------------------
-
- Test_EchoMetrics* New() const;
- void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from);
- void CopyFrom(const Test_EchoMetrics& from);
- void MergeFrom(const Test_EchoMetrics& from);
- void Clear();
- bool IsInitialized() const;
-
- int ByteSize() const;
- bool MergePartialFromCodedStream(
- ::google::protobuf::io::CodedInputStream* input);
- void SerializeWithCachedSizes(
- ::google::protobuf::io::CodedOutputStream* output) const;
- int GetCachedSize() const { return _cached_size_; }
- private:
- void SharedCtor();
- void SharedDtor();
- void SetCachedSize(int size) const;
- public:
-
- ::std::string GetTypeName() const;
-
- // nested types ----------------------------------------------------
-
- // accessors -------------------------------------------------------
-
- // optional .audio_processing_unittest.Test.Statistic residualEchoReturnLoss = 1;
- inline bool has_residualechoreturnloss() const;
- inline void clear_residualechoreturnloss();
- static const int kResidualEchoReturnLossFieldNumber = 1;
- inline const ::audio_processing_unittest::Test_Statistic& residualechoreturnloss() const;
- inline ::audio_processing_unittest::Test_Statistic* mutable_residualechoreturnloss();
- inline ::audio_processing_unittest::Test_Statistic* release_residualechoreturnloss();
-
- // optional .audio_processing_unittest.Test.Statistic echoReturnLoss = 2;
- inline bool has_echoreturnloss() const;
- inline void clear_echoreturnloss();
- static const int kEchoReturnLossFieldNumber = 2;
- inline const ::audio_processing_unittest::Test_Statistic& echoreturnloss() const;
- inline ::audio_processing_unittest::Test_Statistic* mutable_echoreturnloss();
- inline ::audio_processing_unittest::Test_Statistic* release_echoreturnloss();
-
- // optional .audio_processing_unittest.Test.Statistic echoReturnLossEnhancement = 3;
- inline bool has_echoreturnlossenhancement() const;
- inline void clear_echoreturnlossenhancement();
- static const int kEchoReturnLossEnhancementFieldNumber = 3;
- inline const ::audio_processing_unittest::Test_Statistic& echoreturnlossenhancement() const;
- inline ::audio_processing_unittest::Test_Statistic* mutable_echoreturnlossenhancement();
- inline ::audio_processing_unittest::Test_Statistic* release_echoreturnlossenhancement();
-
- // optional .audio_processing_unittest.Test.Statistic aNlp = 4;
- inline bool has_anlp() const;
- inline void clear_anlp();
- static const int kANlpFieldNumber = 4;
- inline const ::audio_processing_unittest::Test_Statistic& anlp() const;
- inline ::audio_processing_unittest::Test_Statistic* mutable_anlp();
- inline ::audio_processing_unittest::Test_Statistic* release_anlp();
-
- // @@protoc_insertion_point(class_scope:audio_processing_unittest.Test.EchoMetrics)
- private:
- inline void set_has_residualechoreturnloss();
- inline void clear_has_residualechoreturnloss();
- inline void set_has_echoreturnloss();
- inline void clear_has_echoreturnloss();
- inline void set_has_echoreturnlossenhancement();
- inline void clear_has_echoreturnlossenhancement();
- inline void set_has_anlp();
- inline void clear_has_anlp();
-
- ::audio_processing_unittest::Test_Statistic* residualechoreturnloss_;
- ::audio_processing_unittest::Test_Statistic* echoreturnloss_;
- ::audio_processing_unittest::Test_Statistic* echoreturnlossenhancement_;
- ::audio_processing_unittest::Test_Statistic* anlp_;
-
- mutable int _cached_size_;
- ::google::protobuf::uint32 _has_bits_[(4 + 31) / 32];
-
- friend void protobuf_AddDesc_audio_5fprocessing_5funittest_2eproto();
- friend void protobuf_AssignDesc_audio_5fprocessing_5funittest_2eproto();
- friend void protobuf_ShutdownFile_audio_5fprocessing_5funittest_2eproto();
-
- void InitAsDefaultInstance();
- static Test_EchoMetrics* default_instance_;
-};
-// -------------------------------------------------------------------
-
-class Test : public ::google::protobuf::MessageLite {
- public:
- Test();
- virtual ~Test();
-
- Test(const Test& from);
-
- inline Test& operator=(const Test& from) {
- CopyFrom(from);
- return *this;
- }
-
- static const Test& default_instance();
-
- void Swap(Test* other);
-
- // implements Message ----------------------------------------------
-
- Test* New() const;
- void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from);
- void CopyFrom(const Test& from);
- void MergeFrom(const Test& from);
- void Clear();
- bool IsInitialized() const;
-
- int ByteSize() const;
- bool MergePartialFromCodedStream(
- ::google::protobuf::io::CodedInputStream* input);
- void SerializeWithCachedSizes(
- ::google::protobuf::io::CodedOutputStream* output) const;
- int GetCachedSize() const { return _cached_size_; }
- private:
- void SharedCtor();
- void SharedDtor();
- void SetCachedSize(int size) const;
- public:
-
- ::std::string GetTypeName() const;
-
- // nested types ----------------------------------------------------
-
- typedef Test_Statistic Statistic;
- typedef Test_EchoMetrics EchoMetrics;
-
- // accessors -------------------------------------------------------
-
- // optional int32 numReverseChannels = 1;
- inline bool has_numreversechannels() const;
- inline void clear_numreversechannels();
- static const int kNumReverseChannelsFieldNumber = 1;
- inline ::google::protobuf::int32 numreversechannels() const;
- inline void set_numreversechannels(::google::protobuf::int32 value);
-
- // optional int32 numChannels = 2;
- inline bool has_numchannels() const;
- inline void clear_numchannels();
- static const int kNumChannelsFieldNumber = 2;
- inline ::google::protobuf::int32 numchannels() const;
- inline void set_numchannels(::google::protobuf::int32 value);
-
- // optional int32 sampleRate = 3;
- inline bool has_samplerate() const;
- inline void clear_samplerate();
- static const int kSampleRateFieldNumber = 3;
- inline ::google::protobuf::int32 samplerate() const;
- inline void set_samplerate(::google::protobuf::int32 value);
-
- // optional int32 hasEchoCount = 4;
- inline bool has_hasechocount() const;
- inline void clear_hasechocount();
- static const int kHasEchoCountFieldNumber = 4;
- inline ::google::protobuf::int32 hasechocount() const;
- inline void set_hasechocount(::google::protobuf::int32 value);
-
- // optional int32 hasVoiceCount = 5;
- inline bool has_hasvoicecount() const;
- inline void clear_hasvoicecount();
- static const int kHasVoiceCountFieldNumber = 5;
- inline ::google::protobuf::int32 hasvoicecount() const;
- inline void set_hasvoicecount(::google::protobuf::int32 value);
-
- // optional int32 isSaturatedCount = 6;
- inline bool has_issaturatedcount() const;
- inline void clear_issaturatedcount();
- static const int kIsSaturatedCountFieldNumber = 6;
- inline ::google::protobuf::int32 issaturatedcount() const;
- inline void set_issaturatedcount(::google::protobuf::int32 value);
-
- // optional .audio_processing_unittest.Test.EchoMetrics echoMetrics = 7;
- inline bool has_echometrics() const;
- inline void clear_echometrics();
- static const int kEchoMetricsFieldNumber = 7;
- inline const ::audio_processing_unittest::Test_EchoMetrics& echometrics() const;
- inline ::audio_processing_unittest::Test_EchoMetrics* mutable_echometrics();
- inline ::audio_processing_unittest::Test_EchoMetrics* release_echometrics();
-
- // @@protoc_insertion_point(class_scope:audio_processing_unittest.Test)
- private:
- inline void set_has_numreversechannels();
- inline void clear_has_numreversechannels();
- inline void set_has_numchannels();
- inline void clear_has_numchannels();
- inline void set_has_samplerate();
- inline void clear_has_samplerate();
- inline void set_has_hasechocount();
- inline void clear_has_hasechocount();
- inline void set_has_hasvoicecount();
- inline void clear_has_hasvoicecount();
- inline void set_has_issaturatedcount();
- inline void clear_has_issaturatedcount();
- inline void set_has_echometrics();
- inline void clear_has_echometrics();
-
- ::google::protobuf::int32 numreversechannels_;
- ::google::protobuf::int32 numchannels_;
- ::google::protobuf::int32 samplerate_;
- ::google::protobuf::int32 hasechocount_;
- ::google::protobuf::int32 hasvoicecount_;
- ::google::protobuf::int32 issaturatedcount_;
- ::audio_processing_unittest::Test_EchoMetrics* echometrics_;
-
- mutable int _cached_size_;
- ::google::protobuf::uint32 _has_bits_[(7 + 31) / 32];
-
- friend void protobuf_AddDesc_audio_5fprocessing_5funittest_2eproto();
- friend void protobuf_AssignDesc_audio_5fprocessing_5funittest_2eproto();
- friend void protobuf_ShutdownFile_audio_5fprocessing_5funittest_2eproto();
-
- void InitAsDefaultInstance();
- static Test* default_instance_;
-};
-// -------------------------------------------------------------------
-
-class OutputData : public ::google::protobuf::MessageLite {
- public:
- OutputData();
- virtual ~OutputData();
-
- OutputData(const OutputData& from);
-
- inline OutputData& operator=(const OutputData& from) {
- CopyFrom(from);
- return *this;
- }
-
- static const OutputData& default_instance();
-
- void Swap(OutputData* other);
-
- // implements Message ----------------------------------------------
-
- OutputData* New() const;
- void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from);
- void CopyFrom(const OutputData& from);
- void MergeFrom(const OutputData& from);
- void Clear();
- bool IsInitialized() const;
-
- int ByteSize() const;
- bool MergePartialFromCodedStream(
- ::google::protobuf::io::CodedInputStream* input);
- void SerializeWithCachedSizes(
- ::google::protobuf::io::CodedOutputStream* output) const;
- int GetCachedSize() const { return _cached_size_; }
- private:
- void SharedCtor();
- void SharedDtor();
- void SetCachedSize(int size) const;
- public:
-
- ::std::string GetTypeName() const;
-
- // nested types ----------------------------------------------------
-
- // accessors -------------------------------------------------------
-
- // repeated .audio_processing_unittest.Test test = 1;
- inline int test_size() const;
- inline void clear_test();
- static const int kTestFieldNumber = 1;
- inline const ::audio_processing_unittest::Test& test(int index) const;
- inline ::audio_processing_unittest::Test* mutable_test(int index);
- inline ::audio_processing_unittest::Test* add_test();
- inline const ::google::protobuf::RepeatedPtrField< ::audio_processing_unittest::Test >&
- test() const;
- inline ::google::protobuf::RepeatedPtrField< ::audio_processing_unittest::Test >*
- mutable_test();
-
- // @@protoc_insertion_point(class_scope:audio_processing_unittest.OutputData)
- private:
-
- ::google::protobuf::RepeatedPtrField< ::audio_processing_unittest::Test > test_;
-
- mutable int _cached_size_;
- ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32];
-
- friend void protobuf_AddDesc_audio_5fprocessing_5funittest_2eproto();
- friend void protobuf_AssignDesc_audio_5fprocessing_5funittest_2eproto();
- friend void protobuf_ShutdownFile_audio_5fprocessing_5funittest_2eproto();
-
- void InitAsDefaultInstance();
- static OutputData* default_instance_;
-};
-// ===================================================================
-
-
-// ===================================================================
-
-// Test_Statistic
-
-// optional int32 instant = 1;
-inline bool Test_Statistic::has_instant() const {
- return (_has_bits_[0] & 0x00000001u) != 0;
-}
-inline void Test_Statistic::set_has_instant() {
- _has_bits_[0] |= 0x00000001u;
-}
-inline void Test_Statistic::clear_has_instant() {
- _has_bits_[0] &= ~0x00000001u;
-}
-inline void Test_Statistic::clear_instant() {
- instant_ = 0;
- clear_has_instant();
-}
-inline ::google::protobuf::int32 Test_Statistic::instant() const {
- return instant_;
-}
-inline void Test_Statistic::set_instant(::google::protobuf::int32 value) {
- set_has_instant();
- instant_ = value;
-}
-
-// optional int32 average = 2;
-inline bool Test_Statistic::has_average() const {
- return (_has_bits_[0] & 0x00000002u) != 0;
-}
-inline void Test_Statistic::set_has_average() {
- _has_bits_[0] |= 0x00000002u;
-}
-inline void Test_Statistic::clear_has_average() {
- _has_bits_[0] &= ~0x00000002u;
-}
-inline void Test_Statistic::clear_average() {
- average_ = 0;
- clear_has_average();
-}
-inline ::google::protobuf::int32 Test_Statistic::average() const {
- return average_;
-}
-inline void Test_Statistic::set_average(::google::protobuf::int32 value) {
- set_has_average();
- average_ = value;
-}
-
-// optional int32 maximum = 3;
-inline bool Test_Statistic::has_maximum() const {
- return (_has_bits_[0] & 0x00000004u) != 0;
-}
-inline void Test_Statistic::set_has_maximum() {
- _has_bits_[0] |= 0x00000004u;
-}
-inline void Test_Statistic::clear_has_maximum() {
- _has_bits_[0] &= ~0x00000004u;
-}
-inline void Test_Statistic::clear_maximum() {
- maximum_ = 0;
- clear_has_maximum();
-}
-inline ::google::protobuf::int32 Test_Statistic::maximum() const {
- return maximum_;
-}
-inline void Test_Statistic::set_maximum(::google::protobuf::int32 value) {
- set_has_maximum();
- maximum_ = value;
-}
-
-// optional int32 minimum = 4;
-inline bool Test_Statistic::has_minimum() const {
- return (_has_bits_[0] & 0x00000008u) != 0;
-}
-inline void Test_Statistic::set_has_minimum() {
- _has_bits_[0] |= 0x00000008u;
-}
-inline void Test_Statistic::clear_has_minimum() {
- _has_bits_[0] &= ~0x00000008u;
-}
-inline void Test_Statistic::clear_minimum() {
- minimum_ = 0;
- clear_has_minimum();
-}
-inline ::google::protobuf::int32 Test_Statistic::minimum() const {
- return minimum_;
-}
-inline void Test_Statistic::set_minimum(::google::protobuf::int32 value) {
- set_has_minimum();
- minimum_ = value;
-}
-
-// -------------------------------------------------------------------
-
-// Test_EchoMetrics
-
-// optional .audio_processing_unittest.Test.Statistic residualEchoReturnLoss = 1;
-inline bool Test_EchoMetrics::has_residualechoreturnloss() const {
- return (_has_bits_[0] & 0x00000001u) != 0;
-}
-inline void Test_EchoMetrics::set_has_residualechoreturnloss() {
- _has_bits_[0] |= 0x00000001u;
-}
-inline void Test_EchoMetrics::clear_has_residualechoreturnloss() {
- _has_bits_[0] &= ~0x00000001u;
-}
-inline void Test_EchoMetrics::clear_residualechoreturnloss() {
- if (residualechoreturnloss_ != NULL) residualechoreturnloss_->::audio_processing_unittest::Test_Statistic::Clear();
- clear_has_residualechoreturnloss();
-}
-inline const ::audio_processing_unittest::Test_Statistic& Test_EchoMetrics::residualechoreturnloss() const {
- return residualechoreturnloss_ != NULL ? *residualechoreturnloss_ : *default_instance_->residualechoreturnloss_;
-}
-inline ::audio_processing_unittest::Test_Statistic* Test_EchoMetrics::mutable_residualechoreturnloss() {
- set_has_residualechoreturnloss();
- if (residualechoreturnloss_ == NULL) residualechoreturnloss_ = new ::audio_processing_unittest::Test_Statistic;
- return residualechoreturnloss_;
-}
-inline ::audio_processing_unittest::Test_Statistic* Test_EchoMetrics::release_residualechoreturnloss() {
- clear_has_residualechoreturnloss();
- ::audio_processing_unittest::Test_Statistic* temp = residualechoreturnloss_;
- residualechoreturnloss_ = NULL;
- return temp;
-}
-
-// optional .audio_processing_unittest.Test.Statistic echoReturnLoss = 2;
-inline bool Test_EchoMetrics::has_echoreturnloss() const {
- return (_has_bits_[0] & 0x00000002u) != 0;
-}
-inline void Test_EchoMetrics::set_has_echoreturnloss() {
- _has_bits_[0] |= 0x00000002u;
-}
-inline void Test_EchoMetrics::clear_has_echoreturnloss() {
- _has_bits_[0] &= ~0x00000002u;
-}
-inline void Test_EchoMetrics::clear_echoreturnloss() {
- if (echoreturnloss_ != NULL) echoreturnloss_->::audio_processing_unittest::Test_Statistic::Clear();
- clear_has_echoreturnloss();
-}
-inline const ::audio_processing_unittest::Test_Statistic& Test_EchoMetrics::echoreturnloss() const {
- return echoreturnloss_ != NULL ? *echoreturnloss_ : *default_instance_->echoreturnloss_;
-}
-inline ::audio_processing_unittest::Test_Statistic* Test_EchoMetrics::mutable_echoreturnloss() {
- set_has_echoreturnloss();
- if (echoreturnloss_ == NULL) echoreturnloss_ = new ::audio_processing_unittest::Test_Statistic;
- return echoreturnloss_;
-}
-inline ::audio_processing_unittest::Test_Statistic* Test_EchoMetrics::release_echoreturnloss() {
- clear_has_echoreturnloss();
- ::audio_processing_unittest::Test_Statistic* temp = echoreturnloss_;
- echoreturnloss_ = NULL;
- return temp;
-}
-
-// optional .audio_processing_unittest.Test.Statistic echoReturnLossEnhancement = 3;
-inline bool Test_EchoMetrics::has_echoreturnlossenhancement() const {
- return (_has_bits_[0] & 0x00000004u) != 0;
-}
-inline void Test_EchoMetrics::set_has_echoreturnlossenhancement() {
- _has_bits_[0] |= 0x00000004u;
-}
-inline void Test_EchoMetrics::clear_has_echoreturnlossenhancement() {
- _has_bits_[0] &= ~0x00000004u;
-}
-inline void Test_EchoMetrics::clear_echoreturnlossenhancement() {
- if (echoreturnlossenhancement_ != NULL) echoreturnlossenhancement_->::audio_processing_unittest::Test_Statistic::Clear();
- clear_has_echoreturnlossenhancement();
-}
-inline const ::audio_processing_unittest::Test_Statistic& Test_EchoMetrics::echoreturnlossenhancement() const {
- return echoreturnlossenhancement_ != NULL ? *echoreturnlossenhancement_ : *default_instance_->echoreturnlossenhancement_;
-}
-inline ::audio_processing_unittest::Test_Statistic* Test_EchoMetrics::mutable_echoreturnlossenhancement() {
- set_has_echoreturnlossenhancement();
- if (echoreturnlossenhancement_ == NULL) echoreturnlossenhancement_ = new ::audio_processing_unittest::Test_Statistic;
- return echoreturnlossenhancement_;
-}
-inline ::audio_processing_unittest::Test_Statistic* Test_EchoMetrics::release_echoreturnlossenhancement() {
- clear_has_echoreturnlossenhancement();
- ::audio_processing_unittest::Test_Statistic* temp = echoreturnlossenhancement_;
- echoreturnlossenhancement_ = NULL;
- return temp;
-}
-
-// optional .audio_processing_unittest.Test.Statistic aNlp = 4;
-inline bool Test_EchoMetrics::has_anlp() const {
- return (_has_bits_[0] & 0x00000008u) != 0;
-}
-inline void Test_EchoMetrics::set_has_anlp() {
- _has_bits_[0] |= 0x00000008u;
-}
-inline void Test_EchoMetrics::clear_has_anlp() {
- _has_bits_[0] &= ~0x00000008u;
-}
-inline void Test_EchoMetrics::clear_anlp() {
- if (anlp_ != NULL) anlp_->::audio_processing_unittest::Test_Statistic::Clear();
- clear_has_anlp();
-}
-inline const ::audio_processing_unittest::Test_Statistic& Test_EchoMetrics::anlp() const {
- return anlp_ != NULL ? *anlp_ : *default_instance_->anlp_;
-}
-inline ::audio_processing_unittest::Test_Statistic* Test_EchoMetrics::mutable_anlp() {
- set_has_anlp();
- if (anlp_ == NULL) anlp_ = new ::audio_processing_unittest::Test_Statistic;
- return anlp_;
-}
-inline ::audio_processing_unittest::Test_Statistic* Test_EchoMetrics::release_anlp() {
- clear_has_anlp();
- ::audio_processing_unittest::Test_Statistic* temp = anlp_;
- anlp_ = NULL;
- return temp;
-}
-
-// -------------------------------------------------------------------
-
-// Test
-
-// optional int32 numReverseChannels = 1;
-inline bool Test::has_numreversechannels() const {
- return (_has_bits_[0] & 0x00000001u) != 0;
-}
-inline void Test::set_has_numreversechannels() {
- _has_bits_[0] |= 0x00000001u;
-}
-inline void Test::clear_has_numreversechannels() {
- _has_bits_[0] &= ~0x00000001u;
-}
-inline void Test::clear_numreversechannels() {
- numreversechannels_ = 0;
- clear_has_numreversechannels();
-}
-inline ::google::protobuf::int32 Test::numreversechannels() const {
- return numreversechannels_;
-}
-inline void Test::set_numreversechannels(::google::protobuf::int32 value) {
- set_has_numreversechannels();
- numreversechannels_ = value;
-}
-
-// optional int32 numChannels = 2;
-inline bool Test::has_numchannels() const {
- return (_has_bits_[0] & 0x00000002u) != 0;
-}
-inline void Test::set_has_numchannels() {
- _has_bits_[0] |= 0x00000002u;
-}
-inline void Test::clear_has_numchannels() {
- _has_bits_[0] &= ~0x00000002u;
-}
-inline void Test::clear_numchannels() {
- numchannels_ = 0;
- clear_has_numchannels();
-}
-inline ::google::protobuf::int32 Test::numchannels() const {
- return numchannels_;
-}
-inline void Test::set_numchannels(::google::protobuf::int32 value) {
- set_has_numchannels();
- numchannels_ = value;
-}
-
-// optional int32 sampleRate = 3;
-inline bool Test::has_samplerate() const {
- return (_has_bits_[0] & 0x00000004u) != 0;
-}
-inline void Test::set_has_samplerate() {
- _has_bits_[0] |= 0x00000004u;
-}
-inline void Test::clear_has_samplerate() {
- _has_bits_[0] &= ~0x00000004u;
-}
-inline void Test::clear_samplerate() {
- samplerate_ = 0;
- clear_has_samplerate();
-}
-inline ::google::protobuf::int32 Test::samplerate() const {
- return samplerate_;
-}
-inline void Test::set_samplerate(::google::protobuf::int32 value) {
- set_has_samplerate();
- samplerate_ = value;
-}
-
-// optional int32 hasEchoCount = 4;
-inline bool Test::has_hasechocount() const {
- return (_has_bits_[0] & 0x00000008u) != 0;
-}
-inline void Test::set_has_hasechocount() {
- _has_bits_[0] |= 0x00000008u;
-}
-inline void Test::clear_has_hasechocount() {
- _has_bits_[0] &= ~0x00000008u;
-}
-inline void Test::clear_hasechocount() {
- hasechocount_ = 0;
- clear_has_hasechocount();
-}
-inline ::google::protobuf::int32 Test::hasechocount() const {
- return hasechocount_;
-}
-inline void Test::set_hasechocount(::google::protobuf::int32 value) {
- set_has_hasechocount();
- hasechocount_ = value;
-}
-
-// optional int32 hasVoiceCount = 5;
-inline bool Test::has_hasvoicecount() const {
- return (_has_bits_[0] & 0x00000010u) != 0;
-}
-inline void Test::set_has_hasvoicecount() {
- _has_bits_[0] |= 0x00000010u;
-}
-inline void Test::clear_has_hasvoicecount() {
- _has_bits_[0] &= ~0x00000010u;
-}
-inline void Test::clear_hasvoicecount() {
- hasvoicecount_ = 0;
- clear_has_hasvoicecount();
-}
-inline ::google::protobuf::int32 Test::hasvoicecount() const {
- return hasvoicecount_;
-}
-inline void Test::set_hasvoicecount(::google::protobuf::int32 value) {
- set_has_hasvoicecount();
- hasvoicecount_ = value;
-}
-
-// optional int32 isSaturatedCount = 6;
-inline bool Test::has_issaturatedcount() const {
- return (_has_bits_[0] & 0x00000020u) != 0;
-}
-inline void Test::set_has_issaturatedcount() {
- _has_bits_[0] |= 0x00000020u;
-}
-inline void Test::clear_has_issaturatedcount() {
- _has_bits_[0] &= ~0x00000020u;
-}
-inline void Test::clear_issaturatedcount() {
- issaturatedcount_ = 0;
- clear_has_issaturatedcount();
-}
-inline ::google::protobuf::int32 Test::issaturatedcount() const {
- return issaturatedcount_;
-}
-inline void Test::set_issaturatedcount(::google::protobuf::int32 value) {
- set_has_issaturatedcount();
- issaturatedcount_ = value;
-}
-
-// optional .audio_processing_unittest.Test.EchoMetrics echoMetrics = 7;
-inline bool Test::has_echometrics() const {
- return (_has_bits_[0] & 0x00000040u) != 0;
-}
-inline void Test::set_has_echometrics() {
- _has_bits_[0] |= 0x00000040u;
-}
-inline void Test::clear_has_echometrics() {
- _has_bits_[0] &= ~0x00000040u;
-}
-inline void Test::clear_echometrics() {
- if (echometrics_ != NULL) echometrics_->::audio_processing_unittest::Test_EchoMetrics::Clear();
- clear_has_echometrics();
-}
-inline const ::audio_processing_unittest::Test_EchoMetrics& Test::echometrics() const {
- return echometrics_ != NULL ? *echometrics_ : *default_instance_->echometrics_;
-}
-inline ::audio_processing_unittest::Test_EchoMetrics* Test::mutable_echometrics() {
- set_has_echometrics();
- if (echometrics_ == NULL) echometrics_ = new ::audio_processing_unittest::Test_EchoMetrics;
- return echometrics_;
-}
-inline ::audio_processing_unittest::Test_EchoMetrics* Test::release_echometrics() {
- clear_has_echometrics();
- ::audio_processing_unittest::Test_EchoMetrics* temp = echometrics_;
- echometrics_ = NULL;
- return temp;
-}
-
-// -------------------------------------------------------------------
-
-// OutputData
-
-// repeated .audio_processing_unittest.Test test = 1;
-inline int OutputData::test_size() const {
- return test_.size();
-}
-inline void OutputData::clear_test() {
- test_.Clear();
-}
-inline const ::audio_processing_unittest::Test& OutputData::test(int index) const {
- return test_.Get(index);
-}
-inline ::audio_processing_unittest::Test* OutputData::mutable_test(int index) {
- return test_.Mutable(index);
-}
-inline ::audio_processing_unittest::Test* OutputData::add_test() {
- return test_.Add();
-}
-inline const ::google::protobuf::RepeatedPtrField< ::audio_processing_unittest::Test >&
-OutputData::test() const {
- return test_;
-}
-inline ::google::protobuf::RepeatedPtrField< ::audio_processing_unittest::Test >*
-OutputData::mutable_test() {
- return &test_;
-}
-
-
-// @@protoc_insertion_point(namespace_scope)
-
-} // namespace audio_processing_unittest
-
-// @@protoc_insertion_point(global_scope)
-
-#endif // PROTOBUF_audio_5fprocessing_5funittest_2eproto__INCLUDED
diff --git a/src/modules/audio_processing/main/test/unit_test/audio_processing_unittest.proto b/src/modules/audio_processing/main/test/unit_test/audio_processing_unittest.proto
deleted file mode 100644
index 8520e64..0000000
--- a/src/modules/audio_processing/main/test/unit_test/audio_processing_unittest.proto
+++ /dev/null
@@ -1,33 +0,0 @@
-package audio_processing_unittest;
-option optimize_for = LITE_RUNTIME;
-
-message Test {
- optional int32 numReverseChannels = 1;
- optional int32 numChannels = 2;
- optional int32 sampleRate = 3;
-
- optional int32 hasEchoCount = 4;
- optional int32 hasVoiceCount = 5;
- optional int32 isSaturatedCount = 6;
-
- message Statistic {
- optional int32 instant = 1;
- optional int32 average = 2;
- optional int32 maximum = 3;
- optional int32 minimum = 4;
- }
-
- message EchoMetrics {
- optional Statistic residualEchoReturnLoss = 1;
- optional Statistic echoReturnLoss = 2;
- optional Statistic echoReturnLossEnhancement = 3;
- optional Statistic aNlp = 4;
- }
-
- optional EchoMetrics echoMetrics = 7;
-}
-
-message OutputData {
- repeated Test test = 1;
-}
-
diff --git a/src/modules/audio_processing/main/test/unit_test/unit_test.cc b/src/modules/audio_processing/main/test/unit_test/unit_test.cc
deleted file mode 100644
index 3a6fce5..0000000
--- a/src/modules/audio_processing/main/test/unit_test/unit_test.cc
+++ /dev/null
@@ -1,881 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <cstdio>
-
-#include <gtest/gtest.h>
-
-#include "audio_processing.h"
-#include "audio_processing_unittest.pb.h"
-#include "event_wrapper.h"
-#include "module_common_types.h"
-#include "thread_wrapper.h"
-#include "trace.h"
-#include "signal_processing_library.h"
-
-using webrtc::AudioProcessing;
-using webrtc::AudioFrame;
-using webrtc::GainControl;
-using webrtc::NoiseSuppression;
-using webrtc::EchoCancellation;
-using webrtc::EventWrapper;
-using webrtc::Trace;
-using webrtc::LevelEstimator;
-using webrtc::EchoCancellation;
-using webrtc::EchoControlMobile;
-using webrtc::VoiceDetection;
-
-namespace {
-// When true, this will compare the output data with the results stored to
-// file. This is the typical case. When the file should be updated, it can
-// be set to false with the command-line switch --write_output_data.
-bool global_read_output_data = true;
-
-class ApmEnvironment : public ::testing::Environment {
- public:
- virtual void SetUp() {
- Trace::CreateTrace();
- ASSERT_EQ(0, Trace::SetTraceFile("apm_trace.txt"));
- }
-
- virtual void TearDown() {
- Trace::ReturnTrace();
- }
-};
-
-class ApmTest : public ::testing::Test {
- protected:
- ApmTest();
- virtual void SetUp();
- virtual void TearDown();
-
- webrtc::AudioProcessing* apm_;
- webrtc::AudioFrame* frame_;
- webrtc::AudioFrame* revframe_;
- FILE* far_file_;
- FILE* near_file_;
- bool update_output_data_;
-};
-
-ApmTest::ApmTest()
- : apm_(NULL),
- far_file_(NULL),
- near_file_(NULL),
- frame_(NULL),
- revframe_(NULL) {}
-
-void ApmTest::SetUp() {
- apm_ = AudioProcessing::Create(0);
- ASSERT_TRUE(apm_ != NULL);
-
- frame_ = new AudioFrame();
- revframe_ = new AudioFrame();
-
- ASSERT_EQ(apm_->kNoError, apm_->set_sample_rate_hz(32000));
- ASSERT_EQ(apm_->kNoError, apm_->set_num_channels(2, 2));
- ASSERT_EQ(apm_->kNoError, apm_->set_num_reverse_channels(2));
-
- frame_->_payloadDataLengthInSamples = 320;
- frame_->_audioChannel = 2;
- frame_->_frequencyInHz = 32000;
- revframe_->_payloadDataLengthInSamples = 320;
- revframe_->_audioChannel = 2;
- revframe_->_frequencyInHz = 32000;
-
- far_file_ = fopen("aec_far.pcm", "rb");
- ASSERT_TRUE(far_file_ != NULL) << "Could not open input file aec_far.pcm\n";
- near_file_ = fopen("aec_near.pcm", "rb");
- ASSERT_TRUE(near_file_ != NULL) << "Could not open input file aec_near.pcm\n";
-}
-
-void ApmTest::TearDown() {
- if (frame_) {
- delete frame_;
- }
- frame_ = NULL;
-
- if (revframe_) {
- delete revframe_;
- }
- revframe_ = NULL;
-
- if (far_file_) {
- ASSERT_EQ(0, fclose(far_file_));
- }
- far_file_ = NULL;
-
- if (near_file_) {
- ASSERT_EQ(0, fclose(near_file_));
- }
- near_file_ = NULL;
-
- if (apm_ != NULL) {
- AudioProcessing::Destroy(apm_);
- }
- apm_ = NULL;
-}
-
-void MixStereoToMono(WebRtc_Word16* stereo,
- WebRtc_Word16* mono,
- int numSamples) {
- for (int i = 0; i < numSamples; i++) {
- int int32 = (static_cast<int>(stereo[i * 2]) +
- static_cast<int>(stereo[i * 2 + 1])) >> 1;
- mono[i] = static_cast<WebRtc_Word16>(int32);
- }
-}
-
-void WriteMessageLiteToFile(const char* filename,
- const ::google::protobuf::MessageLite& message) {
- assert(filename != NULL);
-
- FILE* file = fopen(filename, "wb");
- ASSERT_TRUE(file != NULL) << "Could not open " << filename;
- int size = message.ByteSize();
- ASSERT_GT(size, 0);
- unsigned char* array = new unsigned char[size];
- ASSERT_TRUE(message.SerializeToArray(array, size));
-
- ASSERT_EQ(1, fwrite(&size, sizeof(int), 1, file));
- ASSERT_EQ(size, fwrite(array, sizeof(unsigned char), size, file));
-
- delete [] array;
- fclose(file);
-}
-
-void ReadMessageLiteFromFile(const char* filename,
- ::google::protobuf::MessageLite* message) {
- assert(filename != NULL);
- assert(message != NULL);
-
- FILE* file = fopen(filename, "rb");
- ASSERT_TRUE(file != NULL) << "Could not open " << filename;
- int size = 0;
- ASSERT_EQ(1, fread(&size, sizeof(int), 1, file));
- ASSERT_GT(size, 0);
- unsigned char* array = new unsigned char[size];
- ASSERT_EQ(size, fread(array, sizeof(unsigned char), size, file));
-
- ASSERT_TRUE(message->ParseFromArray(array, size));
-
- delete [] array;
- fclose(file);
-}
-
-struct ThreadData {
- ThreadData(int thread_num_, AudioProcessing* ap_)
- : thread_num(thread_num_),
- error(false),
- ap(ap_) {}
- int thread_num;
- bool error;
- AudioProcessing* ap;
-};
-
-// Don't use GTest here; non-thread-safe on Windows (as of 1.5.0).
-bool DeadlockProc(void* thread_object) {
- ThreadData* thread_data = static_cast<ThreadData*>(thread_object);
- AudioProcessing* ap = thread_data->ap;
- int err = ap->kNoError;
-
- AudioFrame primary_frame;
- AudioFrame reverse_frame;
- primary_frame._payloadDataLengthInSamples = 320;
- primary_frame._audioChannel = 2;
- primary_frame._frequencyInHz = 32000;
- reverse_frame._payloadDataLengthInSamples = 320;
- reverse_frame._audioChannel = 2;
- reverse_frame._frequencyInHz = 32000;
-
- ap->echo_cancellation()->Enable(true);
- ap->gain_control()->Enable(true);
- ap->high_pass_filter()->Enable(true);
- ap->level_estimator()->Enable(true);
- ap->noise_suppression()->Enable(true);
- ap->voice_detection()->Enable(true);
-
- if (thread_data->thread_num % 2 == 0) {
- err = ap->AnalyzeReverseStream(&reverse_frame);
- if (err != ap->kNoError) {
- printf("Error in AnalyzeReverseStream(): %d\n", err);
- thread_data->error = true;
- return false;
- }
- }
-
- if (thread_data->thread_num % 2 == 1) {
- ap->set_stream_delay_ms(0);
- ap->echo_cancellation()->set_stream_drift_samples(0);
- ap->gain_control()->set_stream_analog_level(0);
- err = ap->ProcessStream(&primary_frame);
- if (err == ap->kStreamParameterNotSetError) {
- printf("Expected kStreamParameterNotSetError in ProcessStream(): %d\n",
- err);
- } else if (err != ap->kNoError) {
- printf("Error in ProcessStream(): %d\n", err);
- thread_data->error = true;
- return false;
- }
- ap->gain_control()->stream_analog_level();
- }
-
- EventWrapper* event = EventWrapper::Create();
- event->Wait(1);
- delete event;
- event = NULL;
-
- return true;
-}
-
-/*TEST_F(ApmTest, Deadlock) {
- const int num_threads = 16;
- std::vector<ThreadWrapper*> threads(num_threads);
- std::vector<ThreadData*> thread_data(num_threads);
-
- ASSERT_EQ(apm_->kNoError, apm_->set_sample_rate_hz(32000));
- ASSERT_EQ(apm_->kNoError, apm_->set_num_channels(2, 2));
- ASSERT_EQ(apm_->kNoError, apm_->set_num_reverse_channels(2));
-
- for (int i = 0; i < num_threads; i++) {
- thread_data[i] = new ThreadData(i, apm_);
- threads[i] = ThreadWrapper::CreateThread(DeadlockProc,
- thread_data[i],
- kNormalPriority,
- 0);
- ASSERT_TRUE(threads[i] != NULL);
- unsigned int thread_id = 0;
- threads[i]->Start(thread_id);
- }
-
- EventWrapper* event = EventWrapper::Create();
- ASSERT_EQ(kEventTimeout, event->Wait(5000));
- delete event;
- event = NULL;
-
- for (int i = 0; i < num_threads; i++) {
- // This will return false if the thread has deadlocked.
- ASSERT_TRUE(threads[i]->Stop());
- ASSERT_FALSE(thread_data[i]->error);
- delete threads[i];
- threads[i] = NULL;
- delete thread_data[i];
- thread_data[i] = NULL;
- }
-}*/
-
-TEST_F(ApmTest, StreamParameters) {
- // No errors when the components are disabled.
- EXPECT_EQ(apm_->kNoError,
- apm_->ProcessStream(frame_));
-
- // Missing agc level
- EXPECT_EQ(apm_->kNoError, apm_->Initialize());
- EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
- EXPECT_EQ(apm_->kStreamParameterNotSetError,
- apm_->ProcessStream(frame_));
- EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100));
- EXPECT_EQ(apm_->kNoError,
- apm_->echo_cancellation()->set_stream_drift_samples(0));
- EXPECT_EQ(apm_->kStreamParameterNotSetError,
- apm_->ProcessStream(frame_));
- EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(false));
-
- // Missing delay
- EXPECT_EQ(apm_->kNoError, apm_->Initialize());
- EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
- EXPECT_EQ(apm_->kStreamParameterNotSetError,
- apm_->ProcessStream(frame_));
- EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
- EXPECT_EQ(apm_->kNoError,
- apm_->echo_cancellation()->set_stream_drift_samples(0));
- EXPECT_EQ(apm_->kNoError,
- apm_->gain_control()->set_stream_analog_level(127));
- EXPECT_EQ(apm_->kStreamParameterNotSetError,
- apm_->ProcessStream(frame_));
- EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(false));
-
- // Missing drift
- EXPECT_EQ(apm_->kNoError, apm_->Initialize());
- EXPECT_EQ(apm_->kNoError,
- apm_->echo_cancellation()->enable_drift_compensation(true));
- EXPECT_EQ(apm_->kStreamParameterNotSetError,
- apm_->ProcessStream(frame_));
- EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
- EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100));
- EXPECT_EQ(apm_->kNoError,
- apm_->gain_control()->set_stream_analog_level(127));
- EXPECT_EQ(apm_->kStreamParameterNotSetError,
- apm_->ProcessStream(frame_));
-
- // No stream parameters
- EXPECT_EQ(apm_->kNoError, apm_->Initialize());
- EXPECT_EQ(apm_->kNoError,
- apm_->AnalyzeReverseStream(revframe_));
- EXPECT_EQ(apm_->kStreamParameterNotSetError,
- apm_->ProcessStream(frame_));
-
- // All there
- EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
- EXPECT_EQ(apm_->kNoError, apm_->Initialize());
- EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100));
- EXPECT_EQ(apm_->kNoError,
- apm_->echo_cancellation()->set_stream_drift_samples(0));
- EXPECT_EQ(apm_->kNoError,
- apm_->gain_control()->set_stream_analog_level(127));
- EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-}
-
-TEST_F(ApmTest, Channels) {
- // Testing number of invalid channels
- EXPECT_EQ(apm_->kBadParameterError, apm_->set_num_channels(0, 1));
- EXPECT_EQ(apm_->kBadParameterError, apm_->set_num_channels(1, 0));
- EXPECT_EQ(apm_->kBadParameterError, apm_->set_num_channels(3, 1));
- EXPECT_EQ(apm_->kBadParameterError, apm_->set_num_channels(1, 3));
- EXPECT_EQ(apm_->kBadParameterError, apm_->set_num_reverse_channels(0));
- EXPECT_EQ(apm_->kBadParameterError, apm_->set_num_reverse_channels(3));
- // Testing number of valid channels
- for (int i = 1; i < 3; i++) {
- for (int j = 1; j < 3; j++) {
- if (j > i) {
- EXPECT_EQ(apm_->kBadParameterError, apm_->set_num_channels(i, j));
- } else {
- EXPECT_EQ(apm_->kNoError, apm_->set_num_channels(i, j));
- EXPECT_EQ(j, apm_->num_output_channels());
- }
- }
- EXPECT_EQ(i, apm_->num_input_channels());
- EXPECT_EQ(apm_->kNoError, apm_->set_num_reverse_channels(i));
- EXPECT_EQ(i, apm_->num_reverse_channels());
- }
-}
-
-TEST_F(ApmTest, SampleRates) {
- // Testing invalid sample rates
- EXPECT_EQ(apm_->kBadParameterError, apm_->set_sample_rate_hz(10000));
- // Testing valid sample rates
- int fs[] = {8000, 16000, 32000};
- for (size_t i = 0; i < sizeof(fs) / sizeof(*fs); i++) {
- EXPECT_EQ(apm_->kNoError, apm_->set_sample_rate_hz(fs[i]));
- EXPECT_EQ(fs[i], apm_->sample_rate_hz());
- }
-}
-
-TEST_F(ApmTest, Process) {
- GOOGLE_PROTOBUF_VERIFY_VERSION;
- audio_processing_unittest::OutputData output_data;
-
- if (global_read_output_data) {
- ReadMessageLiteFromFile("output_data.pb", &output_data);
-
- } else {
- // We don't have a file; add the required tests to the protobuf.
- int rev_ch[] = {1, 2};
- int ch[] = {1, 2};
- int fs[] = {8000, 16000, 32000};
- for (size_t i = 0; i < sizeof(rev_ch) / sizeof(*rev_ch); i++) {
- for (size_t j = 0; j < sizeof(ch) / sizeof(*ch); j++) {
- for (size_t k = 0; k < sizeof(fs) / sizeof(*fs); k++) {
- audio_processing_unittest::Test* test = output_data.add_test();
- test->set_numreversechannels(rev_ch[i]);
- test->set_numchannels(ch[j]);
- test->set_samplerate(fs[k]);
- }
- }
- }
- }
-
- EXPECT_EQ(apm_->kNoError,
- apm_->echo_cancellation()->enable_drift_compensation(true));
- EXPECT_EQ(apm_->kNoError,
- apm_->echo_cancellation()->enable_metrics(true));
- EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
-
- EXPECT_EQ(apm_->kNoError,
- apm_->gain_control()->set_mode(GainControl::kAdaptiveAnalog));
- EXPECT_EQ(apm_->kNoError,
- apm_->gain_control()->set_analog_level_limits(0, 255));
- EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
-
- EXPECT_EQ(apm_->kNoError,
- apm_->high_pass_filter()->Enable(true));
-
- //EXPECT_EQ(apm_->kNoError,
- // apm_->level_estimator()->Enable(true));
-
- EXPECT_EQ(apm_->kNoError,
- apm_->noise_suppression()->Enable(true));
-
- EXPECT_EQ(apm_->kNoError,
- apm_->voice_detection()->Enable(true));
-
- for (int i = 0; i < output_data.test_size(); i++) {
- printf("Running test %d of %d...\n", i + 1, output_data.test_size());
-
- audio_processing_unittest::Test* test = output_data.mutable_test(i);
- const int num_samples = test->samplerate() / 100;
- revframe_->_payloadDataLengthInSamples = num_samples;
- revframe_->_audioChannel = test->numreversechannels();
- revframe_->_frequencyInHz = test->samplerate();
- frame_->_payloadDataLengthInSamples = num_samples;
- frame_->_audioChannel = test->numchannels();
- frame_->_frequencyInHz = test->samplerate();
-
- EXPECT_EQ(apm_->kNoError, apm_->Initialize());
- ASSERT_EQ(apm_->kNoError, apm_->set_sample_rate_hz(test->samplerate()));
- ASSERT_EQ(apm_->kNoError, apm_->set_num_channels(frame_->_audioChannel,
- frame_->_audioChannel));
- ASSERT_EQ(apm_->kNoError,
- apm_->set_num_reverse_channels(revframe_->_audioChannel));
-
-
- int has_echo_count = 0;
- int has_voice_count = 0;
- int is_saturated_count = 0;
-
- while (1) {
- WebRtc_Word16 temp_data[640];
- int analog_level = 127;
-
- // Read far-end frame
- size_t read_count = fread(temp_data,
- sizeof(WebRtc_Word16),
- num_samples * 2,
- far_file_);
- if (read_count != static_cast<size_t>(num_samples * 2)) {
- // Check that the file really ended.
- ASSERT_NE(0, feof(far_file_));
- break; // This is expected.
- }
-
- if (revframe_->_audioChannel == 1) {
- MixStereoToMono(temp_data, revframe_->_payloadData,
- revframe_->_payloadDataLengthInSamples);
- } else {
- memcpy(revframe_->_payloadData,
- &temp_data[0],
- sizeof(WebRtc_Word16) * read_count);
- }
-
- EXPECT_EQ(apm_->kNoError,
- apm_->AnalyzeReverseStream(revframe_));
-
- EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(0));
- EXPECT_EQ(apm_->kNoError,
- apm_->echo_cancellation()->set_stream_drift_samples(0));
- EXPECT_EQ(apm_->kNoError,
- apm_->gain_control()->set_stream_analog_level(analog_level));
-
- // Read near-end frame
- read_count = fread(temp_data,
- sizeof(WebRtc_Word16),
- num_samples * 2,
- near_file_);
- if (read_count != static_cast<size_t>(num_samples * 2)) {
- // Check that the file really ended.
- ASSERT_NE(0, feof(near_file_));
- break; // This is expected.
- }
-
- if (frame_->_audioChannel == 1) {
- MixStereoToMono(temp_data, frame_->_payloadData, num_samples);
- } else {
- memcpy(frame_->_payloadData,
- &temp_data[0],
- sizeof(WebRtc_Word16) * read_count);
- }
-
- EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-
- if (apm_->echo_cancellation()->stream_has_echo()) {
- has_echo_count++;
- }
-
- analog_level = apm_->gain_control()->stream_analog_level();
- if (apm_->gain_control()->stream_is_saturated()) {
- is_saturated_count++;
- }
- if (apm_->voice_detection()->stream_has_voice()) {
- has_voice_count++;
- }
- }
-
- //<-- Statistics -->
- //LevelEstimator::Metrics far_metrics;
- //LevelEstimator::Metrics near_metrics;
- //EchoCancellation::Metrics echo_metrics;
- //LevelEstimator::Metrics far_metrics_ref_;
- //LevelEstimator::Metrics near_metrics_ref_;
- //EchoCancellation::Metrics echo_metrics_ref_;
- //EXPECT_EQ(apm_->kNoError,
- // apm_->echo_cancellation()->GetMetrics(&echo_metrics));
- //EXPECT_EQ(apm_->kNoError,
- // apm_->level_estimator()->GetMetrics(&near_metrics,
-
- // TODO(ajm): check echo metrics and output audio.
- if (global_read_output_data) {
- EXPECT_EQ(has_echo_count,
- test->hasechocount());
- EXPECT_EQ(has_voice_count,
- test->hasvoicecount());
- EXPECT_EQ(is_saturated_count,
- test->issaturatedcount());
- } else {
- test->set_hasechocount(has_echo_count);
- test->set_hasvoicecount(has_voice_count);
- test->set_issaturatedcount(is_saturated_count);
- }
-
- rewind(far_file_);
- rewind(near_file_);
- }
-
- if (!global_read_output_data) {
- WriteMessageLiteToFile("output_data.pb", output_data);
- }
-
- google::protobuf::ShutdownProtobufLibrary();
-}
-
-TEST_F(ApmTest, EchoCancellation) {
- EXPECT_EQ(apm_->kNoError,
- apm_->echo_cancellation()->enable_drift_compensation(true));
- EXPECT_TRUE(apm_->echo_cancellation()->is_drift_compensation_enabled());
- EXPECT_EQ(apm_->kNoError,
- apm_->echo_cancellation()->enable_drift_compensation(false));
- EXPECT_FALSE(apm_->echo_cancellation()->is_drift_compensation_enabled());
-
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->echo_cancellation()->set_device_sample_rate_hz(4000));
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->echo_cancellation()->set_device_sample_rate_hz(100000));
-
- int rate[] = {16000, 44100, 48000};
- for (size_t i = 0; i < sizeof(rate)/sizeof(*rate); i++) {
- EXPECT_EQ(apm_->kNoError,
- apm_->echo_cancellation()->set_device_sample_rate_hz(rate[i]));
- EXPECT_EQ(rate[i],
- apm_->echo_cancellation()->device_sample_rate_hz());
- }
-
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->echo_cancellation()->set_suppression_level(
- static_cast<EchoCancellation::SuppressionLevel>(-1)));
-
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->echo_cancellation()->set_suppression_level(
- static_cast<EchoCancellation::SuppressionLevel>(4)));
-
- EchoCancellation::SuppressionLevel level[] = {
- EchoCancellation::kLowSuppression,
- EchoCancellation::kModerateSuppression,
- EchoCancellation::kHighSuppression,
- };
- for (size_t i = 0; i < sizeof(level)/sizeof(*level); i++) {
- EXPECT_EQ(apm_->kNoError,
- apm_->echo_cancellation()->set_suppression_level(level[i]));
- EXPECT_EQ(level[i],
- apm_->echo_cancellation()->suppression_level());
- }
-
- EchoCancellation::Metrics metrics;
- EXPECT_EQ(apm_->kNotEnabledError,
- apm_->echo_cancellation()->GetMetrics(&metrics));
-
- EXPECT_EQ(apm_->kNoError,
- apm_->echo_cancellation()->enable_metrics(true));
- EXPECT_TRUE(apm_->echo_cancellation()->are_metrics_enabled());
- EXPECT_EQ(apm_->kNoError,
- apm_->echo_cancellation()->enable_metrics(false));
- EXPECT_FALSE(apm_->echo_cancellation()->are_metrics_enabled());
-
- EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
- EXPECT_TRUE(apm_->echo_cancellation()->is_enabled());
- EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(false));
- EXPECT_FALSE(apm_->echo_cancellation()->is_enabled());
-}
-
-TEST_F(ApmTest, EchoControlMobile) {
- // AECM won't use super-wideband.
- EXPECT_EQ(apm_->kNoError, apm_->set_sample_rate_hz(32000));
- EXPECT_EQ(apm_->kBadSampleRateError, apm_->echo_control_mobile()->Enable(true));
- EXPECT_EQ(apm_->kNoError, apm_->set_sample_rate_hz(16000));
- // Turn AECM on (and AEC off)
- EXPECT_EQ(apm_->kNoError, apm_->echo_control_mobile()->Enable(true));
- EXPECT_TRUE(apm_->echo_control_mobile()->is_enabled());
-
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->echo_control_mobile()->set_routing_mode(
- static_cast<EchoControlMobile::RoutingMode>(-1)));
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->echo_control_mobile()->set_routing_mode(
- static_cast<EchoControlMobile::RoutingMode>(5)));
-
- // Toggle routing modes
- EchoControlMobile::RoutingMode mode[] = {
- EchoControlMobile::kQuietEarpieceOrHeadset,
- EchoControlMobile::kEarpiece,
- EchoControlMobile::kLoudEarpiece,
- EchoControlMobile::kSpeakerphone,
- EchoControlMobile::kLoudSpeakerphone,
- };
- for (size_t i = 0; i < sizeof(mode)/sizeof(*mode); i++) {
- EXPECT_EQ(apm_->kNoError,
- apm_->echo_control_mobile()->set_routing_mode(mode[i]));
- EXPECT_EQ(mode[i],
- apm_->echo_control_mobile()->routing_mode());
- }
- // Turn comfort noise off/on
- EXPECT_EQ(apm_->kNoError,
- apm_->echo_control_mobile()->enable_comfort_noise(false));
- EXPECT_FALSE(apm_->echo_control_mobile()->is_comfort_noise_enabled());
- EXPECT_EQ(apm_->kNoError,
- apm_->echo_control_mobile()->enable_comfort_noise(true));
- EXPECT_TRUE(apm_->echo_control_mobile()->is_comfort_noise_enabled());
- // Turn AECM off
- EXPECT_EQ(apm_->kNoError, apm_->echo_control_mobile()->Enable(false));
- EXPECT_FALSE(apm_->echo_control_mobile()->is_enabled());
-}
-
-TEST_F(ApmTest, GainControl) {
- // Testing gain modes
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->gain_control()->set_mode(static_cast<GainControl::Mode>(-1)));
-
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->gain_control()->set_mode(static_cast<GainControl::Mode>(3)));
-
- EXPECT_EQ(apm_->kNoError,
- apm_->gain_control()->set_mode(
- apm_->gain_control()->mode()));
-
- GainControl::Mode mode[] = {
- GainControl::kAdaptiveAnalog,
- GainControl::kAdaptiveDigital,
- GainControl::kFixedDigital
- };
- for (size_t i = 0; i < sizeof(mode)/sizeof(*mode); i++) {
- EXPECT_EQ(apm_->kNoError,
- apm_->gain_control()->set_mode(mode[i]));
- EXPECT_EQ(mode[i], apm_->gain_control()->mode());
- }
- // Testing invalid target levels
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->gain_control()->set_target_level_dbfs(-3));
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->gain_control()->set_target_level_dbfs(-40));
- // Testing valid target levels
- EXPECT_EQ(apm_->kNoError,
- apm_->gain_control()->set_target_level_dbfs(
- apm_->gain_control()->target_level_dbfs()));
-
- int level_dbfs[] = {0, 6, 31};
- for (size_t i = 0; i < sizeof(level_dbfs)/sizeof(*level_dbfs); i++) {
- EXPECT_EQ(apm_->kNoError,
- apm_->gain_control()->set_target_level_dbfs(level_dbfs[i]));
- EXPECT_EQ(level_dbfs[i], apm_->gain_control()->target_level_dbfs());
- }
-
- // Testing invalid compression gains
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->gain_control()->set_compression_gain_db(-1));
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->gain_control()->set_compression_gain_db(100));
-
- // Testing valid compression gains
- EXPECT_EQ(apm_->kNoError,
- apm_->gain_control()->set_compression_gain_db(
- apm_->gain_control()->compression_gain_db()));
-
- int gain_db[] = {0, 10, 90};
- for (size_t i = 0; i < sizeof(gain_db)/sizeof(*gain_db); i++) {
- EXPECT_EQ(apm_->kNoError,
- apm_->gain_control()->set_compression_gain_db(gain_db[i]));
- EXPECT_EQ(gain_db[i], apm_->gain_control()->compression_gain_db());
- }
-
- // Testing limiter off/on
- EXPECT_EQ(apm_->kNoError, apm_->gain_control()->enable_limiter(false));
- EXPECT_FALSE(apm_->gain_control()->is_limiter_enabled());
- EXPECT_EQ(apm_->kNoError, apm_->gain_control()->enable_limiter(true));
- EXPECT_TRUE(apm_->gain_control()->is_limiter_enabled());
-
- // Testing invalid level limits
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->gain_control()->set_analog_level_limits(-1, 512));
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->gain_control()->set_analog_level_limits(100000, 512));
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->gain_control()->set_analog_level_limits(512, -1));
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->gain_control()->set_analog_level_limits(512, 100000));
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->gain_control()->set_analog_level_limits(512, 255));
-
- // Testing valid level limits
- EXPECT_EQ(apm_->kNoError,
- apm_->gain_control()->set_analog_level_limits(
- apm_->gain_control()->analog_level_minimum(),
- apm_->gain_control()->analog_level_maximum()));
-
- int min_level[] = {0, 255, 1024};
- for (size_t i = 0; i < sizeof(min_level)/sizeof(*min_level); i++) {
- EXPECT_EQ(apm_->kNoError,
- apm_->gain_control()->set_analog_level_limits(min_level[i], 1024));
- EXPECT_EQ(min_level[i], apm_->gain_control()->analog_level_minimum());
- }
-
- int max_level[] = {0, 1024, 65535};
- for (size_t i = 0; i < sizeof(min_level)/sizeof(*min_level); i++) {
- EXPECT_EQ(apm_->kNoError,
- apm_->gain_control()->set_analog_level_limits(0, max_level[i]));
- EXPECT_EQ(max_level[i], apm_->gain_control()->analog_level_maximum());
- }
-
- // TODO(ajm): stream_is_saturated() and stream_analog_level()
-
- // Turn AGC off
- EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(false));
- EXPECT_FALSE(apm_->gain_control()->is_enabled());
-}
-
-TEST_F(ApmTest, NoiseSuppression) {
- // Tesing invalid suppression levels
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->noise_suppression()->set_level(
- static_cast<NoiseSuppression::Level>(-1)));
-
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->noise_suppression()->set_level(
- static_cast<NoiseSuppression::Level>(5)));
-
- // Tesing valid suppression levels
- NoiseSuppression::Level level[] = {
- NoiseSuppression::kLow,
- NoiseSuppression::kModerate,
- NoiseSuppression::kHigh,
- NoiseSuppression::kVeryHigh
- };
- for (size_t i = 0; i < sizeof(level)/sizeof(*level); i++) {
- EXPECT_EQ(apm_->kNoError,
- apm_->noise_suppression()->set_level(level[i]));
- EXPECT_EQ(level[i], apm_->noise_suppression()->level());
- }
-
- // Turing NS on/off
- EXPECT_EQ(apm_->kNoError, apm_->noise_suppression()->Enable(true));
- EXPECT_TRUE(apm_->noise_suppression()->is_enabled());
- EXPECT_EQ(apm_->kNoError, apm_->noise_suppression()->Enable(false));
- EXPECT_FALSE(apm_->noise_suppression()->is_enabled());
-}
-
-TEST_F(ApmTest, HighPassFilter) {
- // Turing HP filter on/off
- EXPECT_EQ(apm_->kNoError, apm_->high_pass_filter()->Enable(true));
- EXPECT_TRUE(apm_->high_pass_filter()->is_enabled());
- EXPECT_EQ(apm_->kNoError, apm_->high_pass_filter()->Enable(false));
- EXPECT_FALSE(apm_->high_pass_filter()->is_enabled());
-}
-
-TEST_F(ApmTest, LevelEstimator) {
- // Turing Level estimator on/off
- EXPECT_EQ(apm_->kUnsupportedComponentError,
- apm_->level_estimator()->Enable(true));
- EXPECT_FALSE(apm_->level_estimator()->is_enabled());
- EXPECT_EQ(apm_->kUnsupportedComponentError,
- apm_->level_estimator()->Enable(false));
- EXPECT_FALSE(apm_->level_estimator()->is_enabled());
-}
-
-TEST_F(ApmTest, VoiceDetection) {
- // Test external VAD
- EXPECT_EQ(apm_->kNoError,
- apm_->voice_detection()->set_stream_has_voice(true));
- EXPECT_TRUE(apm_->voice_detection()->stream_has_voice());
- EXPECT_EQ(apm_->kNoError,
- apm_->voice_detection()->set_stream_has_voice(false));
- EXPECT_FALSE(apm_->voice_detection()->stream_has_voice());
-
- // Tesing invalid likelihoods
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->voice_detection()->set_likelihood(
- static_cast<VoiceDetection::Likelihood>(-1)));
-
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->voice_detection()->set_likelihood(
- static_cast<VoiceDetection::Likelihood>(5)));
-
- // Tesing valid likelihoods
- VoiceDetection::Likelihood likelihood[] = {
- VoiceDetection::kVeryLowLikelihood,
- VoiceDetection::kLowLikelihood,
- VoiceDetection::kModerateLikelihood,
- VoiceDetection::kHighLikelihood
- };
- for (size_t i = 0; i < sizeof(likelihood)/sizeof(*likelihood); i++) {
- EXPECT_EQ(apm_->kNoError,
- apm_->voice_detection()->set_likelihood(likelihood[i]));
- EXPECT_EQ(likelihood[i], apm_->voice_detection()->likelihood());
- }
-
- /* TODO(bjornv): Enable once VAD supports other frame lengths than 10 ms
- // Tesing invalid frame sizes
- EXPECT_EQ(apm_->kBadParameterError,
- apm_->voice_detection()->set_frame_size_ms(12));
-
- // Tesing valid frame sizes
- for (int i = 10; i <= 30; i += 10) {
- EXPECT_EQ(apm_->kNoError,
- apm_->voice_detection()->set_frame_size_ms(i));
- EXPECT_EQ(i, apm_->voice_detection()->frame_size_ms());
- }
- */
-
- // Turing VAD on/off
- EXPECT_EQ(apm_->kNoError, apm_->voice_detection()->Enable(true));
- EXPECT_TRUE(apm_->voice_detection()->is_enabled());
- EXPECT_EQ(apm_->kNoError, apm_->voice_detection()->Enable(false));
- EXPECT_FALSE(apm_->voice_detection()->is_enabled());
-
- // TODO(bjornv): Add tests for streamed voice; stream_has_voice()
-}
-
-// Below are some ideas for tests from VPM.
-
-/*TEST_F(VideoProcessingModuleTest, GetVersionTest)
-{
-}
-
-TEST_F(VideoProcessingModuleTest, HandleNullBuffer)
-{
-}
-
-TEST_F(VideoProcessingModuleTest, HandleBadSize)
-{
-}
-
-TEST_F(VideoProcessingModuleTest, IdenticalResultsAfterReset)
-{
-}
-*/
-} // namespace
-
-int main(int argc, char** argv) {
- ::testing::InitGoogleTest(&argc, argv);
- ApmEnvironment* env = new ApmEnvironment; // GTest takes ownership.
- ::testing::AddGlobalTestEnvironment(env);
-
- for (int i = 1; i < argc; i++) {
- if (strcmp(argv[i], "--write_output_data") == 0) {
- global_read_output_data = false;
- }
- }
-
- return RUN_ALL_TESTS();
-}
diff --git a/src/modules/audio_processing/ns/main/interface/noise_suppression.h b/src/modules/audio_processing/ns/main/interface/noise_suppression.h
deleted file mode 100644
index b8983b0..0000000
--- a/src/modules/audio_processing/ns/main/interface/noise_suppression.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_INTERFACE_NOISE_SUPPRESSION_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_INTERFACE_NOISE_SUPPRESSION_H_
-
-#include "typedefs.h"
-
-typedef struct NsHandleT NsHandle;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * This function returns the version number of the code.
- *
- * Input:
- * - version : Pointer to a character array where the version
- * info is stored.
- * - length : Length of version.
- *
- * Return value : 0 - Ok
- * -1 - Error (probably length is not sufficient)
- */
-int WebRtcNs_get_version(char *version, short length);
-
-
-/*
- * This function creates an instance to the noise reduction structure
- *
- * Input:
- * - NS_inst : Pointer to noise reduction instance that should be
- * created
- *
- * Output:
- * - NS_inst : Pointer to created noise reduction instance
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-int WebRtcNs_Create(NsHandle **NS_inst);
-
-
-/*
- * This function frees the dynamic memory of a specified Noise Reduction
- * instance.
- *
- * Input:
- * - NS_inst : Pointer to NS instance that should be freed
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-int WebRtcNs_Free(NsHandle *NS_inst);
-
-
-/*
- * This function initializes a NS instance
- *
- * Input:
- * - NS_inst : Instance that should be initialized
- * - fs : sampling frequency
- *
- * Output:
- * - NS_inst : Initialized instance
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-int WebRtcNs_Init(NsHandle *NS_inst, WebRtc_UWord32 fs);
-
-/*
- * This changes the aggressiveness of the noise suppression method.
- *
- * Input:
- * - NS_inst : Instance that should be initialized
- * - mode : 0: Mild, 1: Medium , 2: Aggressive
- *
- * Output:
- * - NS_inst : Initialized instance
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-int WebRtcNs_set_policy(NsHandle *NS_inst, int mode);
-
-
-/*
- * This functions does Noise Suppression for the inserted speech frame. The
- * input and output signals should always be 10ms (80 or 160 samples).
- *
- * Input
- * - NS_inst : VAD Instance. Needs to be initiated before call.
- * - spframe : Pointer to speech frame buffer for L band
- * - spframe_H : Pointer to speech frame buffer for H band
- * - fs : sampling frequency
- *
- * Output:
- * - NS_inst : Updated NS instance
- * - outframe : Pointer to output frame for L band
- * - outframe_H : Pointer to output frame for H band
- *
- * Return value : 0 - OK
- * -1 - Error
- */
-int WebRtcNs_Process(NsHandle *NS_inst,
- short *spframe,
- short *spframe_H,
- short *outframe,
- short *outframe_H);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_INTERFACE_NOISE_SUPPRESSION_H_
diff --git a/src/modules/audio_processing/ns/main/interface/noise_suppression_x.h b/src/modules/audio_processing/ns/main/interface/noise_suppression_x.h
deleted file mode 100644
index 35fea2f..0000000
--- a/src/modules/audio_processing/ns/main/interface/noise_suppression_x.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_INTERFACE_NOISE_SUPPRESSION_X_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_INTERFACE_NOISE_SUPPRESSION_X_H_
-
-#include "signal_processing_library.h"
-
-typedef struct NsxHandleT NsxHandle;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * This function returns the version number of the code.
- *
- * Input:
- * - version : Pointer to a character array where the version
- * info is stored.
- * - length : Length of version.
- *
- * Return value : 0 - Ok
- * -1 - Error (probably length is not sufficient)
- */
-int WebRtcNsx_get_version(char *version, short length);
-
-
-/*
- * This function creates an instance to the noise reduction structure
- *
- * Input:
- * - nsxInst : Pointer to noise reduction instance that should be
- * created
- *
- * Output:
- * - nsxInst : Pointer to created noise reduction instance
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-int WebRtcNsx_Create(NsxHandle **nsxInst);
-
-
-/*
- * This function frees the dynamic memory of a specified Noise Suppression
- * instance.
- *
- * Input:
- * - nsxInst : Pointer to NS instance that should be freed
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-int WebRtcNsx_Free(NsxHandle *nsxInst);
-
-
-/*
- * This function initializes a NS instance
- *
- * Input:
- * - nsxInst : Instance that should be initialized
- * - fs : sampling frequency
- *
- * Output:
- * - nsxInst : Initialized instance
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-int WebRtcNsx_Init(NsxHandle *nsxInst, WebRtc_UWord32 fs);
-
-/*
- * This changes the aggressiveness of the noise suppression method.
- *
- * Input:
- * - nsxInst : Instance that should be initialized
- * - mode : 0: Mild, 1: Medium , 2: Aggressive
- *
- * Output:
- * - nsxInst : Initialized instance
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-int WebRtcNsx_set_policy(NsxHandle *nsxInst, int mode);
-
-/*
- * This functions does noise suppression for the inserted speech frame. The
- * input and output signals should always be 10ms (80 or 160 samples).
- *
- * Input
- * - nsxInst : NSx instance. Needs to be initiated before call.
- * - speechFrame : Pointer to speech frame buffer for L band
- * - speechFrameHB : Pointer to speech frame buffer for H band
- * - fs : sampling frequency
- *
- * Output:
- * - nsxInst : Updated NSx instance
- * - outFrame : Pointer to output frame for L band
- * - outFrameHB : Pointer to output frame for H band
- *
- * Return value : 0 - OK
- * -1 - Error
- */
-int WebRtcNsx_Process(NsxHandle *nsxInst,
- short *speechFrame,
- short *speechFrameHB,
- short *outFrame,
- short *outFrameHB);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_INTERFACE_NOISE_SUPPRESSION_X_H_
diff --git a/src/modules/audio_processing/ns/main/source/Android.mk b/src/modules/audio_processing/ns/main/source/Android.mk
deleted file mode 100644
index f7444d5..0000000
--- a/src/modules/audio_processing/ns/main/source/Android.mk
+++ /dev/null
@@ -1,50 +0,0 @@
-# This file is generated by gyp; do not edit. This means you!
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_MODULE := libwebrtc_ns
-LOCAL_MODULE_TAGS := optional
-LOCAL_GENERATED_SOURCES :=
-LOCAL_SRC_FILES := \
- noise_suppression_x.c \
- nsx_core.c
-
-# floating point
-# noise_suppression.c ns_core.c
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS :=
-MY_CFLAGS_C :=
-MY_DEFS := '-DNO_TCMALLOC' \
- '-DNO_HEAPCHECKER' \
- '-DWEBRTC_TARGET_PC' \
- '-DWEBRTC_LINUX' \
- '-DWEBRTC_THREAD_RR' \
- '-DWEBRTC_ANDROID' \
- '-DANDROID'
-
-LOCAL_CFLAGS := $(MY_CFLAGS_C) $(MY_CFLAGS) $(MY_DEFS)
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../../.. \
- $(LOCAL_PATH)/../interface \
- $(LOCAL_PATH)/../../../utility \
- $(LOCAL_PATH)/../../../../../common_audio/signal_processing_library/main/interface
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS :=
-
-LOCAL_LDFLAGS :=
-
-LOCAL_STATIC_LIBRARIES :=
-
-LOCAL_SHARED_LIBRARIES := libcutils \
- libdl \
- libstlport
-LOCAL_ADDITIONAL_DEPENDENCIES :=
-
-include external/stlport/libstlport.mk
-include $(BUILD_STATIC_LIBRARY)
diff --git a/src/modules/audio_processing/ns/main/source/defines.h b/src/modules/audio_processing/ns/main/source/defines.h
deleted file mode 100644
index d253967..0000000
--- a/src/modules/audio_processing/ns/main/source/defines.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_DEFINES_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_DEFINES_H_
-
-//#define PROCESS_FLOW_0 // Use the traditional method.
-//#define PROCESS_FLOW_1 // Use traditional with DD estimate of prior SNR.
-#define PROCESS_FLOW_2 // Use the new method of speech/noise classification.
-
-#define BLOCKL_MAX 160 // max processing block length: 160
-#define ANAL_BLOCKL_MAX 256 // max analysis block length: 256
-#define HALF_ANAL_BLOCKL 129 // half max analysis block length + 1
-
-#define QUANTILE (float)0.25
-
-#define SIMULT 3
-#define END_STARTUP_LONG 200
-#define END_STARTUP_SHORT 50
-#define FACTOR (float)40.0
-#define WIDTH (float)0.01
-
-#define SMOOTH (float)0.75 // filter smoothing
-// Length of fft work arrays.
-#define IP_LENGTH (ANAL_BLOCKL_MAX >> 1) // must be at least ceil(2 + sqrt(ANAL_BLOCKL_MAX/2))
-#define W_LENGTH (ANAL_BLOCKL_MAX >> 1)
-
-//PARAMETERS FOR NEW METHOD
-#define DD_PR_SNR (float)0.98 // DD update of prior SNR
-#define LRT_TAVG (float)0.50 // tavg parameter for LRT (previously 0.90)
-#define SPECT_FL_TAVG (float)0.30 // tavg parameter for spectral flatness measure
-#define SPECT_DIFF_TAVG (float)0.30 // tavg parameter for spectral difference measure
-#define PRIOR_UPDATE (float)0.10 // update parameter of prior model
-#define NOISE_UPDATE (float)0.90 // update parameter for noise
-#define SPEECH_UPDATE (float)0.99 // update parameter when likely speech
-#define WIDTH_PR_MAP (float)4.0 // width parameter in sigmoid map for prior model
-#define LRT_FEATURE_THR (float)0.5 // default threshold for LRT feature
-#define SF_FEATURE_THR (float)0.5 // default threshold for Spectral Flatness feature
-#define SD_FEATURE_THR (float)0.5 // default threshold for Spectral Difference feature
-#define PROB_RANGE (float)0.20 // probability threshold for noise state in
- // speech/noise likelihood
-#define HIST_PAR_EST 1000 // histogram size for estimation of parameters
-#define GAMMA_PAUSE (float)0.05 // update for conservative noise estimate
-//
-#define B_LIM (float)0.5 // threshold in final energy gain factor calculation
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_DEFINES_H_
diff --git a/src/modules/audio_processing/ns/main/source/noise_suppression.c b/src/modules/audio_processing/ns/main/source/noise_suppression.c
deleted file mode 100644
index aed10b1..0000000
--- a/src/modules/audio_processing/ns/main/source/noise_suppression.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "noise_suppression.h"
-#include "ns_core.h"
-#include "defines.h"
-
-int WebRtcNs_get_version(char *versionStr, short length)
-{
- const char version[] = "NS 2.2.0";
- const short versionLen = (short)strlen(version) + 1; // +1 for null-termination
-
- if (versionStr == NULL) {
- return -1;
- }
-
- if (versionLen > length) {
- return -1;
- }
-
- strncpy(versionStr, version, versionLen);
-
- return 0;
-}
-
-int WebRtcNs_Create(NsHandle **NS_inst)
-{
- *NS_inst = (NsHandle*) malloc(sizeof(NSinst_t));
- if (*NS_inst!=NULL) {
- (*(NSinst_t**)NS_inst)->initFlag=0;
- return 0;
- } else {
- return -1;
- }
-
-}
-
-int WebRtcNs_Free(NsHandle *NS_inst)
-{
- free(NS_inst);
- return 0;
-}
-
-
-int WebRtcNs_Init(NsHandle *NS_inst, WebRtc_UWord32 fs)
-{
- return WebRtcNs_InitCore((NSinst_t*) NS_inst, fs);
-}
-
-int WebRtcNs_set_policy(NsHandle *NS_inst, int mode)
-{
- return WebRtcNs_set_policy_core((NSinst_t*) NS_inst, mode);
-}
-
-
-int WebRtcNs_Process(NsHandle *NS_inst, short *spframe, short *spframe_H, short *outframe, short *outframe_H)
-{
- return WebRtcNs_ProcessCore((NSinst_t*) NS_inst, spframe, spframe_H, outframe, outframe_H);
-}
diff --git a/src/modules/audio_processing/ns/main/source/noise_suppression_x.c b/src/modules/audio_processing/ns/main/source/noise_suppression_x.c
deleted file mode 100644
index f1ad730..0000000
--- a/src/modules/audio_processing/ns/main/source/noise_suppression_x.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "noise_suppression_x.h"
-#include "nsx_core.h"
-#include "nsx_defines.h"
-
-int WebRtcNsx_get_version(char *versionStr, short length)
-{
- const char version[] = "NS\t3.1.0";
- const short versionLen = (short)strlen(version) + 1; // +1 for null-termination
-
- if (versionStr == NULL)
- {
- return -1;
- }
-
- if (versionLen > length)
- {
- return -1;
- }
-
- strncpy(versionStr, version, versionLen);
-
- return 0;
-}
-
-int WebRtcNsx_Create(NsxHandle **nsxInst)
-{
- *nsxInst = (NsxHandle*)malloc(sizeof(NsxInst_t));
- if (*nsxInst != NULL)
- {
- (*(NsxInst_t**)nsxInst)->initFlag = 0;
- return 0;
- } else
- {
- return -1;
- }
-
-}
-
-int WebRtcNsx_Free(NsxHandle *nsxInst)
-{
- free(nsxInst);
- return 0;
-}
-
-int WebRtcNsx_Init(NsxHandle *nsxInst, WebRtc_UWord32 fs)
-{
- return WebRtcNsx_InitCore((NsxInst_t*)nsxInst, fs);
-}
-
-int WebRtcNsx_set_policy(NsxHandle *nsxInst, int mode)
-{
- return WebRtcNsx_set_policy_core((NsxInst_t*)nsxInst, mode);
-}
-
-int WebRtcNsx_Process(NsxHandle *nsxInst, short *speechFrame, short *speechFrameHB,
- short *outFrame, short *outFrameHB)
-{
- return WebRtcNsx_ProcessCore((NsxInst_t*)nsxInst, speechFrame, speechFrameHB, outFrame,
- outFrameHB);
-}
-
diff --git a/src/modules/audio_processing/ns/main/source/ns.gyp b/src/modules/audio_processing/ns/main/source/ns.gyp
deleted file mode 100644
index c8488b2..0000000
--- a/src/modules/audio_processing/ns/main/source/ns.gyp
+++ /dev/null
@@ -1,67 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-{
- 'includes': [
- '../../../../../common_settings.gypi',
- ],
- 'targets': [
- {
- 'target_name': 'ns',
- 'type': '<(library)',
- 'dependencies': [
- '../../../../../common_audio/signal_processing_library/main/source/spl.gyp:spl',
- '../../../utility/util.gyp:apm_util'
- ],
- 'include_dirs': [
- '../interface',
- ],
- 'direct_dependent_settings': {
- 'include_dirs': [
- '../interface',
- ],
- },
- 'sources': [
- '../interface/noise_suppression.h',
- 'noise_suppression.c',
- 'windows_private.h',
- 'defines.h',
- 'ns_core.c',
- 'ns_core.h',
- ],
- },
- {
- 'target_name': 'ns_fix',
- 'type': '<(library)',
- 'dependencies': [
- '../../../../../common_audio/signal_processing_library/main/source/spl.gyp:spl',
- ],
- 'include_dirs': [
- '../interface',
- ],
- 'direct_dependent_settings': {
- 'include_dirs': [
- '../interface',
- ],
- },
- 'sources': [
- '../interface/noise_suppression_x.h',
- 'noise_suppression_x.c',
- 'nsx_defines.h',
- 'nsx_core.c',
- 'nsx_core.h',
- ],
- },
- ],
-}
-
-# Local Variables:
-# tab-width:2
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/src/modules/audio_processing/ns/main/source/ns_core.c b/src/modules/audio_processing/ns/main/source/ns_core.c
deleted file mode 100644
index 10a1b83..0000000
--- a/src/modules/audio_processing/ns/main/source/ns_core.c
+++ /dev/null
@@ -1,1500 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <string.h>
-#include <math.h>
-//#include <stdio.h>
-#include <stdlib.h>
-#include "noise_suppression.h"
-#include "ns_core.h"
-#include "windows_private.h"
-#include "fft4g.h"
-#include "signal_processing_library.h"
-
-// Set Feature Extraction Parameters
-void WebRtcNs_set_feature_extraction_parameters(NSinst_t *inst)
-{
- //bin size of histogram
- inst->featureExtractionParams.binSizeLrt = (float)0.1;
- inst->featureExtractionParams.binSizeSpecFlat = (float)0.05;
- inst->featureExtractionParams.binSizeSpecDiff = (float)0.1;
-
- //range of histogram over which lrt threshold is computed
- inst->featureExtractionParams.rangeAvgHistLrt = (float)1.0;
-
- //scale parameters: multiply dominant peaks of the histograms by scale factor to obtain
- // thresholds for prior model
- inst->featureExtractionParams.factor1ModelPars = (float)1.20; //for lrt and spectral diff
- inst->featureExtractionParams.factor2ModelPars = (float)0.9; //for spectral_flatness:
- // used when noise is flatter than speech
-
- //peak limit for spectral flatness (varies between 0 and 1)
- inst->featureExtractionParams.thresPosSpecFlat = (float)0.6;
-
- //limit on spacing of two highest peaks in histogram: spacing determined by bin size
- inst->featureExtractionParams.limitPeakSpacingSpecFlat = 2
- * inst->featureExtractionParams.binSizeSpecFlat;
- inst->featureExtractionParams.limitPeakSpacingSpecDiff = 2
- * inst->featureExtractionParams.binSizeSpecDiff;
-
- //limit on relevance of second peak:
- inst->featureExtractionParams.limitPeakWeightsSpecFlat = (float)0.5;
- inst->featureExtractionParams.limitPeakWeightsSpecDiff = (float)0.5;
-
- // fluctuation limit of lrt feature
- inst->featureExtractionParams.thresFluctLrt = (float)0.05;
-
- //limit on the max and min values for the feature thresholds
- inst->featureExtractionParams.maxLrt = (float)1.0;
- inst->featureExtractionParams.minLrt = (float)0.20;
-
- inst->featureExtractionParams.maxSpecFlat = (float)0.95;
- inst->featureExtractionParams.minSpecFlat = (float)0.10;
-
- inst->featureExtractionParams.maxSpecDiff = (float)1.0;
- inst->featureExtractionParams.minSpecDiff = (float)0.16;
-
- //criteria of weight of histogram peak to accept/reject feature
- inst->featureExtractionParams.thresWeightSpecFlat = (int)(0.3
- * (inst->modelUpdatePars[1])); //for spectral flatness
- inst->featureExtractionParams.thresWeightSpecDiff = (int)(0.3
- * (inst->modelUpdatePars[1])); //for spectral difference
-}
-
-// Initialize state
-int WebRtcNs_InitCore(NSinst_t *inst, WebRtc_UWord32 fs)
-{
- int i;
- //We only support 10ms frames
-
- //check for valid pointer
- if (inst == NULL)
- {
- return -1;
- }
-
- // Initialization of struct
- if (fs == 8000 || fs == 16000 || fs == 32000)
- {
- inst->fs = fs;
- }
- else
- {
- return -1;
- }
- inst->windShift = 0;
- if (fs == 8000)
- {
- // We only support 10ms frames
- inst->blockLen = 80;
- inst->blockLen10ms = 80;
- inst->anaLen = 128;
- inst->window = kBlocks80w128;
- inst->outLen = 0;
- }
- else if (fs == 16000)
- {
- // We only support 10ms frames
- inst->blockLen = 160;
- inst->blockLen10ms = 160;
- inst->anaLen = 256;
- inst->window = kBlocks160w256;
- inst->outLen = 0;
- }
- else if (fs==32000)
- {
- // We only support 10ms frames
- inst->blockLen = 160;
- inst->blockLen10ms = 160;
- inst->anaLen = 256;
- inst->window = kBlocks160w256;
- inst->outLen = 0;
- }
- inst->magnLen = inst->anaLen / 2 + 1; // Number of frequency bins
-
- // Initialize fft work arrays.
- inst->ip[0] = 0; // Setting this triggers initialization.
- memset(inst->dataBuf, 0, sizeof(float) * ANAL_BLOCKL_MAX);
- rdft(inst->anaLen, 1, inst->dataBuf, inst->ip, inst->wfft);
-
- memset(inst->dataBuf, 0, sizeof(float) * ANAL_BLOCKL_MAX);
- memset(inst->syntBuf, 0, sizeof(float) * ANAL_BLOCKL_MAX);
-
- //for HB processing
- memset(inst->dataBufHB, 0, sizeof(float) * ANAL_BLOCKL_MAX);
-
- //for quantile noise estimation
- memset(inst->quantile, 0, sizeof(float) * HALF_ANAL_BLOCKL);
- for (i = 0; i < SIMULT * HALF_ANAL_BLOCKL; i++)
- {
- inst->lquantile[i] = (float)8.0;
- inst->density[i] = (float)0.3;
- }
-
- for (i = 0; i < SIMULT; i++)
- {
- inst->counter[i] = (int)floor((float)(END_STARTUP_LONG * (i + 1)) / (float)SIMULT);
- }
-
- inst->updates = 0;
-
- // Wiener filter initialization
- for (i = 0; i < HALF_ANAL_BLOCKL; i++)
- {
- inst->smooth[i] = (float)1.0;
- }
-
- // Set the aggressiveness: default
- inst->aggrMode = 0;
-
- //initialize variables for new method
- inst->priorSpeechProb = (float)0.5; //prior prob for speech/noise
- for (i = 0; i < HALF_ANAL_BLOCKL; i++)
- {
- inst->magnPrev[i] = (float)0.0; //previous mag spectrum
- inst->noisePrev[i] = (float)0.0; //previous noise-spectrum
- inst->logLrtTimeAvg[i] = LRT_FEATURE_THR; //smooth LR ratio (same as threshold)
- inst->magnAvgPause[i] = (float)0.0; //conservative noise spectrum estimate
- inst->speechProbHB[i] = (float)0.0; //for estimation of HB in second pass
- inst->initMagnEst[i] = (float)0.0; //initial average mag spectrum
- }
-
- //feature quantities
- inst->featureData[0] = SF_FEATURE_THR; //spectral flatness (start on threshold)
- inst->featureData[1] = (float)0.0; //spectral entropy: not used in this version
- inst->featureData[2] = (float)0.0; //spectral variance: not used in this version
- inst->featureData[3] = LRT_FEATURE_THR; //average lrt factor (start on threshold)
- inst->featureData[4] = SF_FEATURE_THR; //spectral template diff (start on threshold)
- inst->featureData[5] = (float)0.0; //normalization for spectral-diff
- inst->featureData[6] = (float)0.0; //window time-average of input magnitude spectrum
-
- //histogram quantities: used to estimate/update thresholds for features
- for (i = 0; i < HIST_PAR_EST; i++)
- {
- inst->histLrt[i] = 0;
- inst->histSpecFlat[i] = 0;
- inst->histSpecDiff[i] = 0;
- }
-
- inst->blockInd = -1; //frame counter
- inst->priorModelPars[0] = LRT_FEATURE_THR; //default threshold for lrt feature
- inst->priorModelPars[1] = (float)0.5; //threshold for spectral flatness:
- // determined on-line
- inst->priorModelPars[2] = (float)1.0; //sgn_map par for spectral measure:
- // 1 for flatness measure
- inst->priorModelPars[3] = (float)0.5; //threshold for template-difference feature:
- // determined on-line
- inst->priorModelPars[4] = (float)1.0; //default weighting parameter for lrt feature
- inst->priorModelPars[5] = (float)0.0; //default weighting parameter for
- // spectral flatness feature
- inst->priorModelPars[6] = (float)0.0; //default weighting parameter for
- // spectral difference feature
-
- inst->modelUpdatePars[0] = 2; //update flag for parameters:
- // 0 no update, 1=update once, 2=update every window
- inst->modelUpdatePars[1] = 500; //window for update
- inst->modelUpdatePars[2] = 0; //counter for update of conservative noise spectrum
- //counter if the feature thresholds are updated during the sequence
- inst->modelUpdatePars[3] = inst->modelUpdatePars[1];
-
- inst->signalEnergy = 0.0;
- inst->sumMagn = 0.0;
- inst->whiteNoiseLevel = 0.0;
- inst->pinkNoiseNumerator = 0.0;
- inst->pinkNoiseExp = 0.0;
-
- WebRtcNs_set_feature_extraction_parameters(inst); // Set feature configuration
-
- //default mode
- WebRtcNs_set_policy_core(inst, 0);
-
-
- memset(inst->outBuf, 0, sizeof(float) * 3 * BLOCKL_MAX);
-
- inst->initFlag = 1;
- return 0;
-}
-
-int WebRtcNs_set_policy_core(NSinst_t *inst, int mode)
-{
- // allow for modes:0,1,2,3
- if (mode < 0 || mode > 3)
- {
- return (-1);
- }
-
- inst->aggrMode = mode;
- if (mode == 0)
- {
- inst->overdrive = (float)1.0;
- inst->denoiseBound = (float)0.5;
- inst->gainmap = 0;
- }
- else if (mode == 1)
- {
- //inst->overdrive = (float)1.25;
- inst->overdrive = (float)1.0;
- inst->denoiseBound = (float)0.25;
- inst->gainmap = 1;
- }
- else if (mode == 2)
- {
- //inst->overdrive = (float)1.25;
- inst->overdrive = (float)1.1;
- inst->denoiseBound = (float)0.125;
- inst->gainmap = 1;
- }
- else if (mode == 3)
- {
- //inst->overdrive = (float)1.30;
- inst->overdrive = (float)1.25;
- inst->denoiseBound = (float)0.09;
- inst->gainmap = 1;
- }
- return 0;
-}
-
-// Estimate noise
-void WebRtcNs_NoiseEstimation(NSinst_t *inst, float *magn, float *noise)
-{
- int i, s, offset;
- float lmagn[HALF_ANAL_BLOCKL], delta;
-
- if (inst->updates < END_STARTUP_LONG)
- {
- inst->updates++;
- }
-
- for (i = 0; i < inst->magnLen; i++)
- {
- lmagn[i] = (float)log(magn[i]);
- }
-
- // loop over simultaneous estimates
- for (s = 0; s < SIMULT; s++)
- {
- offset = s * inst->magnLen;
-
- // newquantest(...)
- for (i = 0; i < inst->magnLen; i++)
- {
- // compute delta
- if (inst->density[offset + i] > 1.0)
- {
- delta = FACTOR * (float)1.0 / inst->density[offset + i];
- }
- else
- {
- delta = FACTOR;
- }
-
- // update log quantile estimate
- if (lmagn[i] > inst->lquantile[offset + i])
- {
- inst->lquantile[offset + i] += QUANTILE * delta
- / (float)(inst->counter[s] + 1);
- }
- else
- {
- inst->lquantile[offset + i] -= ((float)1.0 - QUANTILE) * delta
- / (float)(inst->counter[s] + 1);
- }
-
- // update density estimate
- if (fabs(lmagn[i] - inst->lquantile[offset + i]) < WIDTH)
- {
- inst->density[offset + i] = ((float)inst->counter[s] * inst->density[offset
- + i] + (float)1.0 / ((float)2.0 * WIDTH)) / (float)(inst->counter[s]
- + 1);
- }
- } // end loop over magnitude spectrum
-
- if (inst->counter[s] >= END_STARTUP_LONG)
- {
- inst->counter[s] = 0;
- if (inst->updates >= END_STARTUP_LONG)
- {
- for (i = 0; i < inst->magnLen; i++)
- {
- inst->quantile[i] = (float)exp(inst->lquantile[offset + i]);
- }
- }
- }
-
- inst->counter[s]++;
- } // end loop over simultaneous estimates
-
- // Sequentially update the noise during startup
- if (inst->updates < END_STARTUP_LONG)
- {
- // Use the last "s" to get noise during startup that differ from zero.
- for (i = 0; i < inst->magnLen; i++)
- {
- inst->quantile[i] = (float)exp(inst->lquantile[offset + i]);
- }
- }
-
- for (i = 0; i < inst->magnLen; i++)
- {
- noise[i] = inst->quantile[i];
- }
-}
-
-// Extract thresholds for feature parameters
-// histograms are computed over some window_size (given by inst->modelUpdatePars[1])
-// thresholds and weights are extracted every window
-// flag 0 means update histogram only, flag 1 means compute the thresholds/weights
-// threshold and weights are returned in: inst->priorModelPars
-void WebRtcNs_FeatureParameterExtraction(NSinst_t *inst, int flag)
-{
- int i, useFeatureSpecFlat, useFeatureSpecDiff, numHistLrt;
- int maxPeak1, maxPeak2;
- int weightPeak1SpecFlat, weightPeak2SpecFlat, weightPeak1SpecDiff, weightPeak2SpecDiff;
-
- float binMid, featureSum;
- float posPeak1SpecFlat, posPeak2SpecFlat, posPeak1SpecDiff, posPeak2SpecDiff;
- float fluctLrt, avgHistLrt, avgSquareHistLrt, avgHistLrtCompl;
-
- //3 features: lrt, flatness, difference
- //lrt_feature = inst->featureData[3];
- //flat_feature = inst->featureData[0];
- //diff_feature = inst->featureData[4];
-
- //update histograms
- if (flag == 0)
- {
- // LRT
- if ((inst->featureData[3] < HIST_PAR_EST * inst->featureExtractionParams.binSizeLrt)
- && (inst->featureData[3] >= 0.0))
- {
- i = (int)(inst->featureData[3] / inst->featureExtractionParams.binSizeLrt);
- inst->histLrt[i]++;
- }
- // Spectral flatness
- if ((inst->featureData[0] < HIST_PAR_EST
- * inst->featureExtractionParams.binSizeSpecFlat)
- && (inst->featureData[0] >= 0.0))
- {
- i = (int)(inst->featureData[0] / inst->featureExtractionParams.binSizeSpecFlat);
- inst->histSpecFlat[i]++;
- }
- // Spectral difference
- if ((inst->featureData[4] < HIST_PAR_EST
- * inst->featureExtractionParams.binSizeSpecDiff)
- && (inst->featureData[4] >= 0.0))
- {
- i = (int)(inst->featureData[4] / inst->featureExtractionParams.binSizeSpecDiff);
- inst->histSpecDiff[i]++;
- }
- }
-
- // extract parameters for speech/noise probability
- if (flag == 1)
- {
- //lrt feature: compute the average over inst->featureExtractionParams.rangeAvgHistLrt
- avgHistLrt = 0.0;
- avgHistLrtCompl = 0.0;
- avgSquareHistLrt = 0.0;
- numHistLrt = 0;
- for (i = 0; i < HIST_PAR_EST; i++)
- {
- binMid = ((float)i + (float)0.5) * inst->featureExtractionParams.binSizeLrt;
- if (binMid <= inst->featureExtractionParams.rangeAvgHistLrt)
- {
- avgHistLrt += inst->histLrt[i] * binMid;
- numHistLrt += inst->histLrt[i];
- }
- avgSquareHistLrt += inst->histLrt[i] * binMid * binMid;
- avgHistLrtCompl += inst->histLrt[i] * binMid;
- }
- if (numHistLrt > 0)
- {
- avgHistLrt = avgHistLrt / ((float)numHistLrt);
- }
- avgHistLrtCompl = avgHistLrtCompl / ((float)inst->modelUpdatePars[1]);
- avgSquareHistLrt = avgSquareHistLrt / ((float)inst->modelUpdatePars[1]);
- fluctLrt = avgSquareHistLrt - avgHistLrt * avgHistLrtCompl;
- // get threshold for lrt feature:
- if (fluctLrt < inst->featureExtractionParams.thresFluctLrt)
- {
- //very low fluct, so likely noise
- inst->priorModelPars[0] = inst->featureExtractionParams.maxLrt;
- }
- else
- {
- inst->priorModelPars[0] = inst->featureExtractionParams.factor1ModelPars
- * avgHistLrt;
- // check if value is within min/max range
- if (inst->priorModelPars[0] < inst->featureExtractionParams.minLrt)
- {
- inst->priorModelPars[0] = inst->featureExtractionParams.minLrt;
- }
- if (inst->priorModelPars[0] > inst->featureExtractionParams.maxLrt)
- {
- inst->priorModelPars[0] = inst->featureExtractionParams.maxLrt;
- }
- }
- // done with lrt feature
-
- //
- // for spectral flatness and spectral difference: compute the main peaks of histogram
- maxPeak1 = 0;
- maxPeak2 = 0;
- posPeak1SpecFlat = 0.0;
- posPeak2SpecFlat = 0.0;
- weightPeak1SpecFlat = 0;
- weightPeak2SpecFlat = 0;
-
- // peaks for flatness
- for (i = 0; i < HIST_PAR_EST; i++)
- {
- binMid = ((float)i + (float)0.5) * inst->featureExtractionParams.binSizeSpecFlat;
- if (inst->histSpecFlat[i] > maxPeak1)
- {
- // Found new "first" peak
- maxPeak2 = maxPeak1;
- weightPeak2SpecFlat = weightPeak1SpecFlat;
- posPeak2SpecFlat = posPeak1SpecFlat;
-
- maxPeak1 = inst->histSpecFlat[i];
- weightPeak1SpecFlat = inst->histSpecFlat[i];
- posPeak1SpecFlat = binMid;
- }
- else if (inst->histSpecFlat[i] > maxPeak2)
- {
- // Found new "second" peak
- maxPeak2 = inst->histSpecFlat[i];
- weightPeak2SpecFlat = inst->histSpecFlat[i];
- posPeak2SpecFlat = binMid;
- }
- }
-
- //compute two peaks for spectral difference
- maxPeak1 = 0;
- maxPeak2 = 0;
- posPeak1SpecDiff = 0.0;
- posPeak2SpecDiff = 0.0;
- weightPeak1SpecDiff = 0;
- weightPeak2SpecDiff = 0;
- // peaks for spectral difference
- for (i = 0; i < HIST_PAR_EST; i++)
- {
- binMid = ((float)i + (float)0.5) * inst->featureExtractionParams.binSizeSpecDiff;
- if (inst->histSpecDiff[i] > maxPeak1)
- {
- // Found new "first" peak
- maxPeak2 = maxPeak1;
- weightPeak2SpecDiff = weightPeak1SpecDiff;
- posPeak2SpecDiff = posPeak1SpecDiff;
-
- maxPeak1 = inst->histSpecDiff[i];
- weightPeak1SpecDiff = inst->histSpecDiff[i];
- posPeak1SpecDiff = binMid;
- }
- else if (inst->histSpecDiff[i] > maxPeak2)
- {
- // Found new "second" peak
- maxPeak2 = inst->histSpecDiff[i];
- weightPeak2SpecDiff = inst->histSpecDiff[i];
- posPeak2SpecDiff = binMid;
- }
- }
-
- // for spectrum flatness feature
- useFeatureSpecFlat = 1;
- // merge the two peaks if they are close
- if ((fabs(posPeak2SpecFlat - posPeak1SpecFlat)
- < inst->featureExtractionParams.limitPeakSpacingSpecFlat)
- && (weightPeak2SpecFlat
- > inst->featureExtractionParams.limitPeakWeightsSpecFlat
- * weightPeak1SpecFlat))
- {
- weightPeak1SpecFlat += weightPeak2SpecFlat;
- posPeak1SpecFlat = (float)0.5 * (posPeak1SpecFlat + posPeak2SpecFlat);
- }
- //reject if weight of peaks is not large enough, or peak value too small
- if (weightPeak1SpecFlat < inst->featureExtractionParams.thresWeightSpecFlat
- || posPeak1SpecFlat < inst->featureExtractionParams.thresPosSpecFlat)
- {
- useFeatureSpecFlat = 0;
- }
- // if selected, get the threshold
- if (useFeatureSpecFlat == 1)
- {
- // compute the threshold
- inst->priorModelPars[1] = inst->featureExtractionParams.factor2ModelPars
- * posPeak1SpecFlat;
- //check if value is within min/max range
- if (inst->priorModelPars[1] < inst->featureExtractionParams.minSpecFlat)
- {
- inst->priorModelPars[1] = inst->featureExtractionParams.minSpecFlat;
- }
- if (inst->priorModelPars[1] > inst->featureExtractionParams.maxSpecFlat)
- {
- inst->priorModelPars[1] = inst->featureExtractionParams.maxSpecFlat;
- }
- }
- // done with flatness feature
-
- // for template feature
- useFeatureSpecDiff = 1;
- // merge the two peaks if they are close
- if ((fabs(posPeak2SpecDiff - posPeak1SpecDiff)
- < inst->featureExtractionParams.limitPeakSpacingSpecDiff)
- && (weightPeak2SpecDiff
- > inst->featureExtractionParams.limitPeakWeightsSpecDiff
- * weightPeak1SpecDiff))
- {
- weightPeak1SpecDiff += weightPeak2SpecDiff;
- posPeak1SpecDiff = (float)0.5 * (posPeak1SpecDiff + posPeak2SpecDiff);
- }
- // get the threshold value
- inst->priorModelPars[3] = inst->featureExtractionParams.factor1ModelPars
- * posPeak1SpecDiff;
- //reject if weight of peaks is not large enough
- if (weightPeak1SpecDiff < inst->featureExtractionParams.thresWeightSpecDiff)
- {
- useFeatureSpecDiff = 0;
- }
- //check if value is within min/max range
- if (inst->priorModelPars[3] < inst->featureExtractionParams.minSpecDiff)
- {
- inst->priorModelPars[3] = inst->featureExtractionParams.minSpecDiff;
- }
- if (inst->priorModelPars[3] > inst->featureExtractionParams.maxSpecDiff)
- {
- inst->priorModelPars[3] = inst->featureExtractionParams.maxSpecDiff;
- }
- // done with spectral difference feature
-
- // don't use template feature if fluctuation of lrt feature is very low:
- // most likely just noise state
- if (fluctLrt < inst->featureExtractionParams.thresFluctLrt)
- {
- useFeatureSpecDiff = 0;
- }
-
- // select the weights between the features
- // inst->priorModelPars[4] is weight for lrt: always selected
- // inst->priorModelPars[5] is weight for spectral flatness
- // inst->priorModelPars[6] is weight for spectral difference
- featureSum = (float)(1 + useFeatureSpecFlat + useFeatureSpecDiff);
- inst->priorModelPars[4] = (float)1.0 / featureSum;
- inst->priorModelPars[5] = ((float)useFeatureSpecFlat) / featureSum;
- inst->priorModelPars[6] = ((float)useFeatureSpecDiff) / featureSum;
-
- // set hists to zero for next update
- if (inst->modelUpdatePars[0] >= 1)
- {
- for (i = 0; i < HIST_PAR_EST; i++)
- {
- inst->histLrt[i] = 0;
- inst->histSpecFlat[i] = 0;
- inst->histSpecDiff[i] = 0;
- }
- }
- } // end of flag == 1
-}
-
-// Compute spectral flatness on input spectrum
-// magnIn is the magnitude spectrum
-// spectral flatness is returned in inst->featureData[0]
-void WebRtcNs_ComputeSpectralFlatness(NSinst_t *inst, float *magnIn)
-{
- int i;
- int shiftLP = 1; //option to remove first bin(s) from spectral measures
- float avgSpectralFlatnessNum, avgSpectralFlatnessDen, spectralTmp;
-
- // comute spectral measures
- // for flatness
- avgSpectralFlatnessNum = 0.0;
- avgSpectralFlatnessDen = inst->sumMagn;
- for (i = 0; i < shiftLP; i++)
- {
- avgSpectralFlatnessDen -= magnIn[i];
- }
- // compute log of ratio of the geometric to arithmetic mean: check for log(0) case
- for (i = shiftLP; i < inst->magnLen; i++)
- {
- if (magnIn[i] > 0.0)
- {
- avgSpectralFlatnessNum += (float)log(magnIn[i]);
- }
- else
- {
- inst->featureData[0] -= SPECT_FL_TAVG * inst->featureData[0];
- return;
- }
- }
- //normalize
- avgSpectralFlatnessDen = avgSpectralFlatnessDen / inst->magnLen;
- avgSpectralFlatnessNum = avgSpectralFlatnessNum / inst->magnLen;
-
- //ratio and inverse log: check for case of log(0)
- spectralTmp = (float)exp(avgSpectralFlatnessNum) / avgSpectralFlatnessDen;
-
- //time-avg update of spectral flatness feature
- inst->featureData[0] += SPECT_FL_TAVG * (spectralTmp - inst->featureData[0]);
- // done with flatness feature
-}
-
-// Compute the difference measure between input spectrum and a template/learned noise spectrum
-// magnIn is the input spectrum
-// the reference/template spectrum is inst->magnAvgPause[i]
-// returns (normalized) spectral difference in inst->featureData[4]
-void WebRtcNs_ComputeSpectralDifference(NSinst_t *inst, float *magnIn)
-{
- // avgDiffNormMagn = var(magnIn) - cov(magnIn, magnAvgPause)^2 / var(magnAvgPause)
- int i;
- float avgPause, avgMagn, covMagnPause, varPause, varMagn, avgDiffNormMagn;
-
- avgPause = 0.0;
- avgMagn = inst->sumMagn;
- // compute average quantities
- for (i = 0; i < inst->magnLen; i++)
- {
- //conservative smooth noise spectrum from pause frames
- avgPause += inst->magnAvgPause[i];
- }
- avgPause = avgPause / ((float)inst->magnLen);
- avgMagn = avgMagn / ((float)inst->magnLen);
-
- covMagnPause = 0.0;
- varPause = 0.0;
- varMagn = 0.0;
- // compute variance and covariance quantities
- for (i = 0; i < inst->magnLen; i++)
- {
- covMagnPause += (magnIn[i] - avgMagn) * (inst->magnAvgPause[i] - avgPause);
- varPause += (inst->magnAvgPause[i] - avgPause) * (inst->magnAvgPause[i] - avgPause);
- varMagn += (magnIn[i] - avgMagn) * (magnIn[i] - avgMagn);
- }
- covMagnPause = covMagnPause / ((float)inst->magnLen);
- varPause = varPause / ((float)inst->magnLen);
- varMagn = varMagn / ((float)inst->magnLen);
- // update of average magnitude spectrum
- inst->featureData[6] += inst->signalEnergy;
-
- avgDiffNormMagn = varMagn - (covMagnPause * covMagnPause) / (varPause + (float)0.0001);
- // normalize and compute time-avg update of difference feature
- avgDiffNormMagn = (float)(avgDiffNormMagn / (inst->featureData[5] + (float)0.0001));
- inst->featureData[4] += SPECT_DIFF_TAVG * (avgDiffNormMagn - inst->featureData[4]);
-}
-
-// Compute speech/noise probability
-// speech/noise probability is returned in: probSpeechFinal
-//magn is the input magnitude spectrum
-//noise is the noise spectrum
-//snrLocPrior is the prior snr for each freq.
-//snr loc_post is the post snr for each freq.
-void WebRtcNs_SpeechNoiseProb(NSinst_t *inst, float *probSpeechFinal, float *snrLocPrior,
- float *snrLocPost)
-{
- int i, sgnMap;
- float invLrt, gainPrior, indPrior;
- float logLrtTimeAvgKsum, besselTmp;
- float indicator0, indicator1, indicator2;
- float tmpFloat1, tmpFloat2;
- float weightIndPrior0, weightIndPrior1, weightIndPrior2;
- float threshPrior0, threshPrior1, threshPrior2;
- float widthPrior, widthPrior0, widthPrior1, widthPrior2;
-
- widthPrior0 = WIDTH_PR_MAP;
- widthPrior1 = (float)2.0 * WIDTH_PR_MAP; //width for pause region:
- // lower range, so increase width in tanh map
- widthPrior2 = (float)2.0 * WIDTH_PR_MAP; //for spectral-difference measure
-
- //threshold parameters for features
- threshPrior0 = inst->priorModelPars[0];
- threshPrior1 = inst->priorModelPars[1];
- threshPrior2 = inst->priorModelPars[3];
-
- //sign for flatness feature
- sgnMap = (int)(inst->priorModelPars[2]);
-
- //weight parameters for features
- weightIndPrior0 = inst->priorModelPars[4];
- weightIndPrior1 = inst->priorModelPars[5];
- weightIndPrior2 = inst->priorModelPars[6];
-
- // compute feature based on average LR factor
- // this is the average over all frequencies of the smooth log lrt
- logLrtTimeAvgKsum = 0.0;
- for (i = 0; i < inst->magnLen; i++)
- {
- tmpFloat1 = (float)1.0 + (float)2.0 * snrLocPrior[i];
- tmpFloat2 = (float)2.0 * snrLocPrior[i] / (tmpFloat1 + (float)0.0001);
- besselTmp = (snrLocPost[i] + (float)1.0) * tmpFloat2;
- inst->logLrtTimeAvg[i] += LRT_TAVG * (besselTmp - (float)log(tmpFloat1)
- - inst->logLrtTimeAvg[i]);
- logLrtTimeAvgKsum += inst->logLrtTimeAvg[i];
- }
- logLrtTimeAvgKsum = (float)logLrtTimeAvgKsum / (inst->magnLen);
- inst->featureData[3] = logLrtTimeAvgKsum;
- // done with computation of LR factor
-
- //
- //compute the indicator functions
- //
-
- // average lrt feature
- widthPrior = widthPrior0;
- //use larger width in tanh map for pause regions
- if (logLrtTimeAvgKsum < threshPrior0)
- {
- widthPrior = widthPrior1;
- }
- // compute indicator function: sigmoid map
- indicator0 = (float)0.5 * ((float)tanh(widthPrior * (logLrtTimeAvgKsum - threshPrior0))
- + (float)1.0);
-
- //spectral flatness feature
- tmpFloat1 = inst->featureData[0];
- widthPrior = widthPrior0;
- //use larger width in tanh map for pause regions
- if (sgnMap == 1 && (tmpFloat1 > threshPrior1))
- {
- widthPrior = widthPrior1;
- }
- if (sgnMap == -1 && (tmpFloat1 < threshPrior1))
- {
- widthPrior = widthPrior1;
- }
- // compute indicator function: sigmoid map
- indicator1 = (float)0.5 * ((float)tanh(
- (float)sgnMap * widthPrior * (threshPrior1
- - tmpFloat1)) + (float)1.0);
-
- //for template spectrum-difference
- tmpFloat1 = inst->featureData[4];
- widthPrior = widthPrior0;
- //use larger width in tanh map for pause regions
- if (tmpFloat1 < threshPrior2)
- {
- widthPrior = widthPrior2;
- }
- // compute indicator function: sigmoid map
- indicator2 = (float)0.5 * ((float)tanh(widthPrior * (tmpFloat1 - threshPrior2))
- + (float)1.0);
-
- //combine the indicator function with the feature weights
- indPrior = weightIndPrior0 * indicator0 + weightIndPrior1 * indicator1 + weightIndPrior2
- * indicator2;
- // done with computing indicator function
-
- //compute the prior probability
- inst->priorSpeechProb += PRIOR_UPDATE * (indPrior - inst->priorSpeechProb);
- // make sure probabilities are within range: keep floor to 0.01
- if (inst->priorSpeechProb > 1.0)
- {
- inst->priorSpeechProb = (float)1.0;
- }
- if (inst->priorSpeechProb < 0.01)
- {
- inst->priorSpeechProb = (float)0.01;
- }
-
- //final speech probability: combine prior model with LR factor:
- gainPrior = ((float)1.0 - inst->priorSpeechProb) / (inst->priorSpeechProb + (float)0.0001);
- for (i = 0; i < inst->magnLen; i++)
- {
- invLrt = (float)exp(-inst->logLrtTimeAvg[i]);
- invLrt = (float)gainPrior * invLrt;
- probSpeechFinal[i] = (float)1.0 / ((float)1.0 + invLrt);
- }
-}
-
-int WebRtcNs_ProcessCore(NSinst_t *inst,
- short *speechFrame,
- short *speechFrameHB,
- short *outFrame,
- short *outFrameHB)
-{
- // main routine for noise reduction
-
- int flagHB = 0;
- int i;
- const int kStartBand = 5; // Skip first frequency bins during estimation.
- int updateParsFlag;
-
- float energy1, energy2, gain, factor, factor1, factor2;
- float signalEnergy, sumMagn;
- float snrPrior, currentEstimateStsa;
- float tmpFloat1, tmpFloat2, tmpFloat3, probSpeech, probNonSpeech;
- float gammaNoiseTmp, gammaNoiseOld;
- float noiseUpdateTmp, fTmp, dTmp;
- float fin[BLOCKL_MAX], fout[BLOCKL_MAX];
- float winData[ANAL_BLOCKL_MAX];
- float magn[HALF_ANAL_BLOCKL], noise[HALF_ANAL_BLOCKL];
- float theFilter[HALF_ANAL_BLOCKL], theFilterTmp[HALF_ANAL_BLOCKL];
- float snrLocPost[HALF_ANAL_BLOCKL], snrLocPrior[HALF_ANAL_BLOCKL];
- float probSpeechFinal[HALF_ANAL_BLOCKL], previousEstimateStsa[HALF_ANAL_BLOCKL];
- float real[ANAL_BLOCKL_MAX], imag[HALF_ANAL_BLOCKL];
- // Variables during startup
- float sum_log_i = 0.0;
- float sum_log_i_square = 0.0;
- float sum_log_magn = 0.0;
- float sum_log_i_log_magn = 0.0;
- float parametric_noise = 0.0;
- float parametric_exp = 0.0;
- float parametric_num = 0.0;
-
- // SWB variables
- int deltaBweHB = 1;
- int deltaGainHB = 1;
- float decayBweHB = 1.0;
- float gainMapParHB = 1.0;
- float gainTimeDomainHB = 1.0;
- float avgProbSpeechHB, avgProbSpeechHBTmp, avgFilterGainHB, gainModHB;
-
- // Check that initiation has been done
- if (inst->initFlag != 1)
- {
- return (-1);
- }
- // Check for valid pointers based on sampling rate
- if (inst->fs == 32000)
- {
- if (speechFrameHB == NULL)
- {
- return -1;
- }
- flagHB = 1;
- // range for averaging low band quantities for H band gain
- deltaBweHB = (int)inst->magnLen / 4;
- deltaGainHB = deltaBweHB;
- }
- //
- updateParsFlag = inst->modelUpdatePars[0];
- //
-
- //for LB do all processing
- // convert to float
- for (i = 0; i < inst->blockLen10ms; i++)
- {
- fin[i] = (float)speechFrame[i];
- }
- // update analysis buffer for L band
- memcpy(inst->dataBuf, inst->dataBuf + inst->blockLen10ms,
- sizeof(float) * (inst->anaLen - inst->blockLen10ms));
- memcpy(inst->dataBuf + inst->anaLen - inst->blockLen10ms, fin,
- sizeof(float) * inst->blockLen10ms);
-
- if (flagHB == 1)
- {
- // convert to float
- for (i = 0; i < inst->blockLen10ms; i++)
- {
- fin[i] = (float)speechFrameHB[i];
- }
- // update analysis buffer for H band
- memcpy(inst->dataBufHB, inst->dataBufHB + inst->blockLen10ms,
- sizeof(float) * (inst->anaLen - inst->blockLen10ms));
- memcpy(inst->dataBufHB + inst->anaLen - inst->blockLen10ms, fin,
- sizeof(float) * inst->blockLen10ms);
- }
-
- // check if processing needed
- if (inst->outLen == 0)
- {
- // windowing
- energy1 = 0.0;
- for (i = 0; i < inst->anaLen; i++)
- {
- winData[i] = inst->window[i] * inst->dataBuf[i];
- energy1 += winData[i] * winData[i];
- }
- if (energy1 == 0.0)
- {
- // synthesize the special case of zero input
- // we want to avoid updating statistics in this case:
- // Updating feature statistics when we have zeros only will cause thresholds to
- // move towards zero signal situations. This in turn has the effect that once the
- // signal is "turned on" (non-zero values) everything will be treated as speech
- // and there is no noise suppression effect. Depending on the duration of the
- // inactive signal it takes a considerable amount of time for the system to learn
- // what is noise and what is speech.
-
- // read out fully processed segment
- for (i = inst->windShift; i < inst->blockLen + inst->windShift; i++)
- {
- fout[i - inst->windShift] = inst->syntBuf[i];
- }
- // update synthesis buffer
- memcpy(inst->syntBuf, inst->syntBuf + inst->blockLen,
- sizeof(float) * (inst->anaLen - inst->blockLen));
- memset(inst->syntBuf + inst->anaLen - inst->blockLen, 0,
- sizeof(float) * inst->blockLen);
-
- // out buffer
- inst->outLen = inst->blockLen - inst->blockLen10ms;
- if (inst->blockLen > inst->blockLen10ms)
- {
- for (i = 0; i < inst->outLen; i++)
- {
- inst->outBuf[i] = fout[i + inst->blockLen10ms];
- }
- }
- // convert to short
- for (i = 0; i < inst->blockLen10ms; i++)
- {
- dTmp = fout[i];
- if (dTmp < WEBRTC_SPL_WORD16_MIN)
- {
- dTmp = WEBRTC_SPL_WORD16_MIN;
- }
- else if (dTmp > WEBRTC_SPL_WORD16_MAX)
- {
- dTmp = WEBRTC_SPL_WORD16_MAX;
- }
- outFrame[i] = (short)dTmp;
- }
-
- // for time-domain gain of HB
- if (flagHB == 1)
- {
- for (i = 0; i < inst->blockLen10ms; i++)
- {
- dTmp = inst->dataBufHB[i];
- if (dTmp < WEBRTC_SPL_WORD16_MIN)
- {
- dTmp = WEBRTC_SPL_WORD16_MIN;
- }
- else if (dTmp > WEBRTC_SPL_WORD16_MAX)
- {
- dTmp = WEBRTC_SPL_WORD16_MAX;
- }
- outFrameHB[i] = (short)dTmp;
- }
- } // end of H band gain computation
- //
- return 0;
- }
-
- //
- inst->blockInd++; // Update the block index only when we process a block.
- // FFT
- rdft(inst->anaLen, 1, winData, inst->ip, inst->wfft);
-
- imag[0] = 0;
- real[0] = winData[0];
- magn[0] = (float)(fabs(real[0]) + 1.0f);
- imag[inst->magnLen - 1] = 0;
- real[inst->magnLen - 1] = winData[1];
- magn[inst->magnLen - 1] = (float)(fabs(real[inst->magnLen - 1]) + 1.0f);
- signalEnergy = (float)(real[0] * real[0]) + (float)(real[inst->magnLen - 1]
- * real[inst->magnLen - 1]);
- sumMagn = magn[0] + magn[inst->magnLen - 1];
- if (inst->blockInd < END_STARTUP_SHORT)
- {
- inst->initMagnEst[0] += magn[0];
- inst->initMagnEst[inst->magnLen - 1] += magn[inst->magnLen - 1];
- tmpFloat2 = log((float)(inst->magnLen - 1));
- sum_log_i = tmpFloat2;
- sum_log_i_square = tmpFloat2 * tmpFloat2;
- tmpFloat1 = log(magn[inst->magnLen - 1]);
- sum_log_magn = tmpFloat1;
- sum_log_i_log_magn = tmpFloat2 * tmpFloat1;
- }
- for (i = 1; i < inst->magnLen - 1; i++)
- {
- real[i] = winData[2 * i];
- imag[i] = winData[2 * i + 1];
- // magnitude spectrum
- fTmp = real[i] * real[i];
- fTmp += imag[i] * imag[i];
- signalEnergy += fTmp;
- magn[i] = ((float)sqrt(fTmp)) + 1.0f;
- sumMagn += magn[i];
- if (inst->blockInd < END_STARTUP_SHORT)
- {
- inst->initMagnEst[i] += magn[i];
- if (i >= kStartBand)
- {
- tmpFloat2 = log((float)i);
- sum_log_i += tmpFloat2;
- sum_log_i_square += tmpFloat2 * tmpFloat2;
- tmpFloat1 = log(magn[i]);
- sum_log_magn += tmpFloat1;
- sum_log_i_log_magn += tmpFloat2 * tmpFloat1;
- }
- }
- }
- signalEnergy = signalEnergy / ((float)inst->magnLen);
- inst->signalEnergy = signalEnergy;
- inst->sumMagn = sumMagn;
-
- //compute spectral flatness on input spectrum
- WebRtcNs_ComputeSpectralFlatness(inst, magn);
- // quantile noise estimate
- WebRtcNs_NoiseEstimation(inst, magn, noise);
- //compute simplified noise model during startup
- if (inst->blockInd < END_STARTUP_SHORT)
- {
- // Estimate White noise
- inst->whiteNoiseLevel += sumMagn / ((float)inst->magnLen) * inst->overdrive;
- // Estimate Pink noise parameters
- tmpFloat1 = sum_log_i_square * ((float)(inst->magnLen - kStartBand));
- tmpFloat1 -= (sum_log_i * sum_log_i);
- tmpFloat2 = (sum_log_i_square * sum_log_magn - sum_log_i * sum_log_i_log_magn);
- tmpFloat3 = tmpFloat2 / tmpFloat1;
- // Constrain the estimated spectrum to be positive
- if (tmpFloat3 < 0.0f)
- {
- tmpFloat3 = 0.0f;
- }
- inst->pinkNoiseNumerator += tmpFloat3;
- tmpFloat2 = (sum_log_i * sum_log_magn);
- tmpFloat2 -= ((float)(inst->magnLen - kStartBand)) * sum_log_i_log_magn;
- tmpFloat3 = tmpFloat2 / tmpFloat1;
- // Constrain the pink noise power to be in the interval [0, 1];
- if (tmpFloat3 < 0.0f)
- {
- tmpFloat3 = 0.0f;
- }
- if (tmpFloat3 > 1.0f)
- {
- tmpFloat3 = 1.0f;
- }
- inst->pinkNoiseExp += tmpFloat3;
-
- // Calculate frequency independent parts of parametric noise estimate.
- if (inst->pinkNoiseExp == 0.0f)
- {
- // Use white noise estimate
- parametric_noise = inst->whiteNoiseLevel;
- }
- else
- {
- // Use pink noise estimate
- parametric_num = exp(inst->pinkNoiseNumerator / (float)(inst->blockInd + 1));
- parametric_num *= (float)(inst->blockInd + 1);
- parametric_exp = inst->pinkNoiseExp / (float)(inst->blockInd + 1);
- parametric_noise = parametric_num / pow((float)kStartBand, parametric_exp);
- }
- for (i = 0; i < inst->magnLen; i++)
- {
- // Estimate the background noise using the white and pink noise parameters
- if ((inst->pinkNoiseExp > 0.0f) && (i >= kStartBand))
- {
- // Use pink noise estimate
- parametric_noise = parametric_num / pow((float)i, parametric_exp);
- }
- theFilterTmp[i] = (inst->initMagnEst[i] - inst->overdrive * parametric_noise);
- theFilterTmp[i] /= (inst->initMagnEst[i] + (float)0.0001);
- // Weight quantile noise with modeled noise
- noise[i] *= (inst->blockInd);
- tmpFloat2 = parametric_noise * (END_STARTUP_SHORT - inst->blockInd);
- noise[i] += (tmpFloat2 / (float)(inst->blockInd + 1));
- noise[i] /= END_STARTUP_SHORT;
- }
- }
- //compute average signal during END_STARTUP_LONG time:
- // used to normalize spectral difference measure
- if (inst->blockInd < END_STARTUP_LONG)
- {
- inst->featureData[5] *= inst->blockInd;
- inst->featureData[5] += signalEnergy;
- inst->featureData[5] /= (inst->blockInd + 1);
- }
-
-#ifdef PROCESS_FLOW_0
- if (inst->blockInd > END_STARTUP_LONG)
- {
- //option: average the quantile noise: for check with AEC2
- for (i = 0; i < inst->magnLen; i++)
- {
- noise[i] = (float)0.6 * inst->noisePrev[i] + (float)0.4 * noise[i];
- }
- for (i = 0; i < inst->magnLen; i++)
- {
- // Wiener with over sub-substraction:
- theFilter[i] = (magn[i] - inst->overdrive * noise[i]) / (magn[i] + (float)0.0001);
- }
- }
-#else
- //start processing at frames == converged+1
- //
- // STEP 1: compute prior and post snr based on quantile noise est
- //
-
- // compute DD estimate of prior SNR: needed for new method
- for (i = 0; i < inst->magnLen; i++)
- {
- // post snr
- snrLocPost[i] = (float)0.0;
- if (magn[i] > noise[i])
- {
- snrLocPost[i] = magn[i] / (noise[i] + (float)0.0001) - (float)1.0;
- }
- // previous post snr
- // previous estimate: based on previous frame with gain filter
- previousEstimateStsa[i] = inst->magnPrev[i] / (inst->noisePrev[i] + (float)0.0001)
- * (inst->smooth[i]);
- // DD estimate is sum of two terms: current estimate and previous estimate
- // directed decision update of snrPrior
- snrLocPrior[i] = DD_PR_SNR * previousEstimateStsa[i] + ((float)1.0 - DD_PR_SNR)
- * snrLocPost[i];
- // post and prior snr needed for step 2
- } // end of loop over freqs
-#ifdef PROCESS_FLOW_1
- for (i = 0; i < inst->magnLen; i++)
- {
- // gain filter
- tmpFloat1 = inst->overdrive + snrLocPrior[i];
- tmpFloat2 = (float)snrLocPrior[i] / tmpFloat1;
- theFilter[i] = (float)tmpFloat2;
- } // end of loop over freqs
-#endif
- // done with step 1: dd computation of prior and post snr
-
- //
- //STEP 2: compute speech/noise likelihood
- //
-#ifdef PROCESS_FLOW_2
- // compute difference of input spectrum with learned/estimated noise spectrum
- WebRtcNs_ComputeSpectralDifference(inst, magn);
- // compute histograms for parameter decisions (thresholds and weights for features)
- // parameters are extracted once every window time (=inst->modelUpdatePars[1])
- if (updateParsFlag >= 1)
- {
- // counter update
- inst->modelUpdatePars[3]--;
- // update histogram
- if (inst->modelUpdatePars[3] > 0)
- {
- WebRtcNs_FeatureParameterExtraction(inst, 0);
- }
- // compute model parameters
- if (inst->modelUpdatePars[3] == 0)
- {
- WebRtcNs_FeatureParameterExtraction(inst, 1);
- inst->modelUpdatePars[3] = inst->modelUpdatePars[1];
- // if wish to update only once, set flag to zero
- if (updateParsFlag == 1)
- {
- inst->modelUpdatePars[0] = 0;
- }
- else
- {
- // update every window:
- // get normalization for spectral difference for next window estimate
- inst->featureData[6] = inst->featureData[6]
- / ((float)inst->modelUpdatePars[1]);
- inst->featureData[5] = (float)0.5 * (inst->featureData[6]
- + inst->featureData[5]);
- inst->featureData[6] = (float)0.0;
- }
- }
- }
- // compute speech/noise probability
- WebRtcNs_SpeechNoiseProb(inst, probSpeechFinal, snrLocPrior, snrLocPost);
- // time-avg parameter for noise update
- gammaNoiseTmp = NOISE_UPDATE;
- for (i = 0; i < inst->magnLen; i++)
- {
- probSpeech = probSpeechFinal[i];
- probNonSpeech = (float)1.0 - probSpeech;
- // temporary noise update:
- // use it for speech frames if update value is less than previous
- noiseUpdateTmp = gammaNoiseTmp * inst->noisePrev[i] + ((float)1.0 - gammaNoiseTmp)
- * (probNonSpeech * magn[i] + probSpeech * inst->noisePrev[i]);
- //
- // time-constant based on speech/noise state
- gammaNoiseOld = gammaNoiseTmp;
- gammaNoiseTmp = NOISE_UPDATE;
- // increase gamma (i.e., less noise update) for frame likely to be speech
- if (probSpeech > PROB_RANGE)
- {
- gammaNoiseTmp = SPEECH_UPDATE;
- }
- // conservative noise update
- if (probSpeech < PROB_RANGE)
- {
- inst->magnAvgPause[i] += GAMMA_PAUSE * (magn[i] - inst->magnAvgPause[i]);
- }
- // noise update
- if (gammaNoiseTmp == gammaNoiseOld)
- {
- noise[i] = noiseUpdateTmp;
- }
- else
- {
- noise[i] = gammaNoiseTmp * inst->noisePrev[i] + ((float)1.0 - gammaNoiseTmp)
- * (probNonSpeech * magn[i] + probSpeech * inst->noisePrev[i]);
- // allow for noise update downwards:
- // if noise update decreases the noise, it is safe, so allow it to happen
- if (noiseUpdateTmp < noise[i])
- {
- noise[i] = noiseUpdateTmp;
- }
- }
- } // end of freq loop
- // done with step 2: noise update
-
- //
- // STEP 3: compute dd update of prior snr and post snr based on new noise estimate
- //
- for (i = 0; i < inst->magnLen; i++)
- {
- // post and prior snr
- currentEstimateStsa = (float)0.0;
- if (magn[i] > noise[i])
- {
- currentEstimateStsa = magn[i] / (noise[i] + (float)0.0001) - (float)1.0;
- }
- // DD estimate is sume of two terms: current estimate and previous estimate
- // directed decision update of snrPrior
- snrPrior = DD_PR_SNR * previousEstimateStsa[i] + ((float)1.0 - DD_PR_SNR)
- * currentEstimateStsa;
- // gain filter
- tmpFloat1 = inst->overdrive + snrPrior;
- tmpFloat2 = (float)snrPrior / tmpFloat1;
- theFilter[i] = (float)tmpFloat2;
- } // end of loop over freqs
- // done with step3
-#endif
-#endif
-
- for (i = 0; i < inst->magnLen; i++)
- {
- // flooring bottom
- if (theFilter[i] < inst->denoiseBound)
- {
- theFilter[i] = inst->denoiseBound;
- }
- // flooring top
- if (theFilter[i] > (float)1.0)
- {
- theFilter[i] = 1.0;
- }
- if (inst->blockInd < END_STARTUP_SHORT)
- {
- // flooring bottom
- if (theFilterTmp[i] < inst->denoiseBound)
- {
- theFilterTmp[i] = inst->denoiseBound;
- }
- // flooring top
- if (theFilterTmp[i] > (float)1.0)
- {
- theFilterTmp[i] = 1.0;
- }
- // Weight the two suppression filters
- theFilter[i] *= (inst->blockInd);
- theFilterTmp[i] *= (END_STARTUP_SHORT - inst->blockInd);
- theFilter[i] += theFilterTmp[i];
- theFilter[i] /= (END_STARTUP_SHORT);
- }
- // smoothing
-#ifdef PROCESS_FLOW_0
- inst->smooth[i] *= SMOOTH; // value set to 0.7 in define.h file
- inst->smooth[i] += ((float)1.0 - SMOOTH) * theFilter[i];
-#else
- inst->smooth[i] = theFilter[i];
-#endif
- real[i] *= inst->smooth[i];
- imag[i] *= inst->smooth[i];
- }
- // keep track of noise and magn spectrum for next frame
- for (i = 0; i < inst->magnLen; i++)
- {
- inst->noisePrev[i] = noise[i];
- inst->magnPrev[i] = magn[i];
- }
- // back to time domain
- winData[0] = real[0];
- winData[1] = real[inst->magnLen - 1];
- for (i = 1; i < inst->magnLen - 1; i++)
- {
- winData[2 * i] = real[i];
- winData[2 * i + 1] = imag[i];
- }
- rdft(inst->anaLen, -1, winData, inst->ip, inst->wfft);
-
- for (i = 0; i < inst->anaLen; i++)
- {
- real[i] = 2.0f * winData[i] / inst->anaLen; // fft scaling
- }
-
- //scale factor: only do it after END_STARTUP_LONG time
- factor = (float)1.0;
- if (inst->gainmap == 1 && inst->blockInd > END_STARTUP_LONG)
- {
- factor1 = (float)1.0;
- factor2 = (float)1.0;
-
- energy2 = 0.0;
- for (i = 0; i < inst->anaLen;i++)
- {
- energy2 += (float)real[i] * (float)real[i];
- }
- gain = (float)sqrt(energy2 / (energy1 + (float)1.0));
-
-#ifdef PROCESS_FLOW_2
- // scaling for new version
- if (gain > B_LIM)
- {
- factor1 = (float)1.0 + (float)1.3 * (gain - B_LIM);
- if (gain * factor1 > (float)1.0)
- {
- factor1 = (float)1.0 / gain;
- }
- }
- if (gain < B_LIM)
- {
- //don't reduce scale too much for pause regions:
- // attenuation here should be controlled by flooring
- if (gain <= inst->denoiseBound)
- {
- gain = inst->denoiseBound;
- }
- factor2 = (float)1.0 - (float)0.3 * (B_LIM - gain);
- }
- //combine both scales with speech/noise prob:
- // note prior (priorSpeechProb) is not frequency dependent
- factor = inst->priorSpeechProb * factor1 + ((float)1.0 - inst->priorSpeechProb)
- * factor2;
-#else
- if (gain > B_LIM)
- {
- factor = (float)1.0 + (float)1.3 * (gain - B_LIM);
- }
- else
- {
- factor = (float)1.0 + (float)2.0 * (gain - B_LIM);
- }
- if (gain * factor > (float)1.0)
- {
- factor = (float)1.0 / gain;
- }
-#endif
- } // out of inst->gainmap==1
-
- // synthesis
- for (i = 0; i < inst->anaLen; i++)
- {
- inst->syntBuf[i] += factor * inst->window[i] * (float)real[i];
- }
- // read out fully processed segment
- for (i = inst->windShift; i < inst->blockLen + inst->windShift; i++)
- {
- fout[i - inst->windShift] = inst->syntBuf[i];
- }
- // update synthesis buffer
- memcpy(inst->syntBuf, inst->syntBuf + inst->blockLen,
- sizeof(float) * (inst->anaLen - inst->blockLen));
- memset(inst->syntBuf + inst->anaLen - inst->blockLen, 0,
- sizeof(float) * inst->blockLen);
-
- // out buffer
- inst->outLen = inst->blockLen - inst->blockLen10ms;
- if (inst->blockLen > inst->blockLen10ms)
- {
- for (i = 0; i < inst->outLen; i++)
- {
- inst->outBuf[i] = fout[i + inst->blockLen10ms];
- }
- }
- } // end of if out.len==0
- else
- {
- for (i = 0; i < inst->blockLen10ms; i++)
- {
- fout[i] = inst->outBuf[i];
- }
- memcpy(inst->outBuf, inst->outBuf + inst->blockLen10ms,
- sizeof(float) * (inst->outLen - inst->blockLen10ms));
- memset(inst->outBuf + inst->outLen - inst->blockLen10ms, 0,
- sizeof(float) * inst->blockLen10ms);
- inst->outLen -= inst->blockLen10ms;
- }
-
- // convert to short
- for (i = 0; i < inst->blockLen10ms; i++)
- {
- dTmp = fout[i];
- if (dTmp < WEBRTC_SPL_WORD16_MIN)
- {
- dTmp = WEBRTC_SPL_WORD16_MIN;
- }
- else if (dTmp > WEBRTC_SPL_WORD16_MAX)
- {
- dTmp = WEBRTC_SPL_WORD16_MAX;
- }
- outFrame[i] = (short)dTmp;
- }
-
- // for time-domain gain of HB
- if (flagHB == 1)
- {
- for (i = 0; i < inst->magnLen; i++)
- {
- inst->speechProbHB[i] = probSpeechFinal[i];
- }
- if (inst->blockInd > END_STARTUP_LONG)
- {
- // average speech prob from low band
- // avg over second half (i.e., 4->8kHz) of freq. spectrum
- avgProbSpeechHB = 0.0;
- for (i = inst->magnLen - deltaBweHB - 1; i < inst->magnLen - 1; i++)
- {
- avgProbSpeechHB += inst->speechProbHB[i];
- }
- avgProbSpeechHB = avgProbSpeechHB / ((float)deltaBweHB);
- // average filter gain from low band
- // average over second half (i.e., 4->8kHz) of freq. spectrum
- avgFilterGainHB = 0.0;
- for (i = inst->magnLen - deltaGainHB - 1; i < inst->magnLen - 1; i++)
- {
- avgFilterGainHB += inst->smooth[i];
- }
- avgFilterGainHB = avgFilterGainHB / ((float)(deltaGainHB));
- avgProbSpeechHBTmp = (float)2.0 * avgProbSpeechHB - (float)1.0;
- // gain based on speech prob:
- gainModHB = (float)0.5 * ((float)1.0 + (float)tanh(gainMapParHB * avgProbSpeechHBTmp));
- //combine gain with low band gain
- gainTimeDomainHB = (float)0.5 * gainModHB + (float)0.5 * avgFilterGainHB;
- if (avgProbSpeechHB >= (float)0.5)
- {
- gainTimeDomainHB = (float)0.25 * gainModHB + (float)0.75 * avgFilterGainHB;
- }
- gainTimeDomainHB = gainTimeDomainHB * decayBweHB;
- } // end of converged
- //make sure gain is within flooring range
- // flooring bottom
- if (gainTimeDomainHB < inst->denoiseBound)
- {
- gainTimeDomainHB = inst->denoiseBound;
- }
- // flooring top
- if (gainTimeDomainHB > (float)1.0)
- {
- gainTimeDomainHB = 1.0;
- }
- //apply gain
- for (i = 0; i < inst->blockLen10ms; i++)
- {
- dTmp = gainTimeDomainHB * inst->dataBufHB[i];
- if (dTmp < WEBRTC_SPL_WORD16_MIN)
- {
- dTmp = WEBRTC_SPL_WORD16_MIN;
- }
- else if (dTmp > WEBRTC_SPL_WORD16_MAX)
- {
- dTmp = WEBRTC_SPL_WORD16_MAX;
- }
- outFrameHB[i] = (short)dTmp;
- }
- } // end of H band gain computation
- //
-
- return 0;
-}
diff --git a/src/modules/audio_processing/ns/main/source/ns_core.h b/src/modules/audio_processing/ns/main/source/ns_core.h
deleted file mode 100644
index f72e22b..0000000
--- a/src/modules/audio_processing/ns/main/source/ns_core.h
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NS_CORE_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NS_CORE_H_
-
-#include "defines.h"
-
-typedef struct NSParaExtract_t_ {
-
- //bin size of histogram
- float binSizeLrt;
- float binSizeSpecFlat;
- float binSizeSpecDiff;
- //range of histogram over which lrt threshold is computed
- float rangeAvgHistLrt;
- //scale parameters: multiply dominant peaks of the histograms by scale factor to obtain
- //thresholds for prior model
- float factor1ModelPars; //for lrt and spectral difference
- float factor2ModelPars; //for spectral_flatness: used when noise is flatter than speech
- //peak limit for spectral flatness (varies between 0 and 1)
- float thresPosSpecFlat;
- //limit on spacing of two highest peaks in histogram: spacing determined by bin size
- float limitPeakSpacingSpecFlat;
- float limitPeakSpacingSpecDiff;
- //limit on relevance of second peak:
- float limitPeakWeightsSpecFlat;
- float limitPeakWeightsSpecDiff;
- //limit on fluctuation of lrt feature
- float thresFluctLrt;
- //limit on the max and min values for the feature thresholds
- float maxLrt;
- float minLrt;
- float maxSpecFlat;
- float minSpecFlat;
- float maxSpecDiff;
- float minSpecDiff;
- //criteria of weight of histogram peak to accept/reject feature
- int thresWeightSpecFlat;
- int thresWeightSpecDiff;
-
-} NSParaExtract_t;
-
-typedef struct NSinst_t_ {
-
- WebRtc_UWord32 fs;
- int blockLen;
- int blockLen10ms;
- int windShift;
- int outLen;
- int anaLen;
- int magnLen;
- int aggrMode;
- const float* window;
- float dataBuf[ANAL_BLOCKL_MAX];
- float syntBuf[ANAL_BLOCKL_MAX];
- float outBuf[3 * BLOCKL_MAX];
-
- int initFlag;
- // parameters for quantile noise estimation
- float density[SIMULT * HALF_ANAL_BLOCKL];
- float lquantile[SIMULT * HALF_ANAL_BLOCKL];
- float quantile[HALF_ANAL_BLOCKL];
- int counter[SIMULT];
- int updates;
- // parameters for Wiener filter
- float smooth[HALF_ANAL_BLOCKL];
- float overdrive;
- float denoiseBound;
- int gainmap;
- // fft work arrays.
- int ip[IP_LENGTH];
- float wfft[W_LENGTH];
-
- // parameters for new method: some not needed, will reduce/cleanup later
- WebRtc_Word32 blockInd; //frame index counter
- int modelUpdatePars[4]; //parameters for updating or estimating
- // thresholds/weights for prior model
- float priorModelPars[7]; //parameters for prior model
- float noisePrev[HALF_ANAL_BLOCKL]; //noise spectrum from previous frame
- float magnPrev[HALF_ANAL_BLOCKL]; //magnitude spectrum of previous frame
- float logLrtTimeAvg[HALF_ANAL_BLOCKL]; //log lrt factor with time-smoothing
- float priorSpeechProb; //prior speech/noise probability
- float featureData[7]; //data for features
- float magnAvgPause[HALF_ANAL_BLOCKL]; //conservative noise spectrum estimate
- float signalEnergy; //energy of magn
- float sumMagn; //sum of magn
- float whiteNoiseLevel; //initial noise estimate
- float initMagnEst[HALF_ANAL_BLOCKL]; //initial magnitude spectrum estimate
- float pinkNoiseNumerator; //pink noise parameter: numerator
- float pinkNoiseExp; //pink noise parameter: power of freq
- NSParaExtract_t featureExtractionParams; //parameters for feature extraction
- //histograms for parameter estimation
- int histLrt[HIST_PAR_EST];
- int histSpecFlat[HIST_PAR_EST];
- int histSpecDiff[HIST_PAR_EST];
- //quantities for high band estimate
- float speechProbHB[HALF_ANAL_BLOCKL]; //final speech/noise prob: prior + LRT
- float dataBufHB[ANAL_BLOCKL_MAX]; //buffering data for HB
-
-} NSinst_t;
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/****************************************************************************
- * WebRtcNs_InitCore(...)
- *
- * This function initializes a noise suppression instance
- *
- * Input:
- * - inst : Instance that should be initialized
- * - fs : Sampling frequency
- *
- * Output:
- * - inst : Initialized instance
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-int WebRtcNs_InitCore(NSinst_t *inst, WebRtc_UWord32 fs);
-
-/****************************************************************************
- * WebRtcNs_set_policy_core(...)
- *
- * This changes the aggressiveness of the noise suppression method.
- *
- * Input:
- * - inst : Instance that should be initialized
- * - mode : 0: Mild (6 dB), 1: Medium (10 dB), 2: Aggressive (15 dB)
- *
- * Output:
- * - NS_inst : Initialized instance
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-int WebRtcNs_set_policy_core(NSinst_t *inst, int mode);
-
-/****************************************************************************
- * WebRtcNs_ProcessCore
- *
- * Do noise suppression.
- *
- * Input:
- * - inst : Instance that should be initialized
- * - inFrameLow : Input speech frame for lower band
- * - inFrameHigh : Input speech frame for higher band
- *
- * Output:
- * - inst : Updated instance
- * - outFrameLow : Output speech frame for lower band
- * - outFrameHigh : Output speech frame for higher band
- *
- * Return value : 0 - OK
- * -1 - Error
- */
-
-
-int WebRtcNs_ProcessCore(NSinst_t *inst,
- short *inFrameLow,
- short *inFrameHigh,
- short *outFrameLow,
- short *outFrameHigh);
-
-
-#ifdef __cplusplus
-}
-#endif
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NS_CORE_H_
diff --git a/src/modules/audio_processing/ns/main/source/nsx_core.c b/src/modules/audio_processing/ns/main/source/nsx_core.c
deleted file mode 100644
index 01d3e54..0000000
--- a/src/modules/audio_processing/ns/main/source/nsx_core.c
+++ /dev/null
@@ -1,2493 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "noise_suppression_x.h"
-
-#include <assert.h>
-#include <math.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "nsx_core.h"
-
-// Skip first frequency bins during estimation. (0 <= value < 64)
-static const int kStartBand = 5;
-
-// Rounding
-static const WebRtc_Word16 kRoundTable[16] = {0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024,
- 2048, 4096, 8192, 16384};
-
-// Constants to compensate for shifting signal log(2^shifts).
-static const WebRtc_Word16 kLogTable[9] = {0, 177, 355, 532, 710, 887, 1065, 1242, 1420};
-
-static const WebRtc_Word16 kCounterDiv[201] = {32767, 16384, 10923, 8192, 6554, 5461, 4681,
- 4096, 3641, 3277, 2979, 2731, 2521, 2341, 2185, 2048, 1928, 1820, 1725, 1638, 1560,
- 1489, 1425, 1365, 1311, 1260, 1214, 1170, 1130, 1092, 1057, 1024, 993, 964, 936, 910,
- 886, 862, 840, 819, 799, 780, 762, 745, 728, 712, 697, 683, 669, 655, 643, 630, 618,
- 607, 596, 585, 575, 565, 555, 546, 537, 529, 520, 512, 504, 496, 489, 482, 475, 468,
- 462, 455, 449, 443, 437, 431, 426, 420, 415, 410, 405, 400, 395, 390, 386, 381, 377,
- 372, 368, 364, 360, 356, 352, 349, 345, 341, 338, 334, 331, 328, 324, 321, 318, 315,
- 312, 309, 306, 303, 301, 298, 295, 293, 290, 287, 285, 282, 280, 278, 275, 273, 271,
- 269, 266, 264, 262, 260, 258, 256, 254, 252, 250, 248, 246, 245, 243, 241, 239, 237,
- 236, 234, 232, 231, 229, 228, 226, 224, 223, 221, 220, 218, 217, 216, 214, 213, 211,
- 210, 209, 207, 206, 205, 204, 202, 201, 200, 199, 197, 196, 195, 194, 193, 192, 191,
- 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173,
- 172, 172, 171, 170, 169, 168, 167, 166, 165, 165, 164, 163};
-
-static const WebRtc_Word16 kLogTableFrac[256] = {
- 0, 1, 3, 4, 6, 7, 9, 10, 11, 13, 14, 16, 17, 18, 20, 21,
- 22, 24, 25, 26, 28, 29, 30, 32, 33, 34, 36, 37, 38, 40, 41, 42,
- 44, 45, 46, 47, 49, 50, 51, 52, 54, 55, 56, 57, 59, 60, 61, 62,
- 63, 65, 66, 67, 68, 69, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81,
- 82, 84, 85, 86, 87, 88, 89, 90, 92, 93, 94, 95, 96, 97, 98, 99,
- 100, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 116, 117,
- 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
- 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
- 150, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
- 165, 166, 167, 168, 169, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 178,
- 179, 180, 181, 182, 183, 184, 185, 185, 186, 187, 188, 189, 190, 191, 192, 192,
- 193, 194, 195, 196, 197, 198, 198, 199, 200, 201, 202, 203, 203, 204, 205, 206,
- 207, 208, 208, 209, 210, 211, 212, 212, 213, 214, 215, 216, 216, 217, 218, 219,
- 220, 220, 221, 222, 223, 224, 224, 225, 226, 227, 228, 228, 229, 230, 231, 231,
- 232, 233, 234, 234, 235, 236, 237, 238, 238, 239, 240, 241, 241, 242, 243, 244,
- 244, 245, 246, 247, 247, 248, 249, 249, 250, 251, 252, 252, 253, 254, 255, 255
-};
-
-static const WebRtc_Word16 kPowTableFrac[1024] = {
- 0, 1, 1, 2, 3, 3, 4, 5,
- 6, 6, 7, 8, 8, 9, 10, 10,
- 11, 12, 13, 13, 14, 15, 15, 16,
- 17, 17, 18, 19, 20, 20, 21, 22,
- 22, 23, 24, 25, 25, 26, 27, 27,
- 28, 29, 30, 30, 31, 32, 32, 33,
- 34, 35, 35, 36, 37, 37, 38, 39,
- 40, 40, 41, 42, 42, 43, 44, 45,
- 45, 46, 47, 48, 48, 49, 50, 50,
- 51, 52, 53, 53, 54, 55, 56, 56,
- 57, 58, 58, 59, 60, 61, 61, 62,
- 63, 64, 64, 65, 66, 67, 67, 68,
- 69, 69, 70, 71, 72, 72, 73, 74,
- 75, 75, 76, 77, 78, 78, 79, 80,
- 81, 81, 82, 83, 84, 84, 85, 86,
- 87, 87, 88, 89, 90, 90, 91, 92,
- 93, 93, 94, 95, 96, 96, 97, 98,
- 99, 100, 100, 101, 102, 103, 103, 104,
- 105, 106, 106, 107, 108, 109, 109, 110,
- 111, 112, 113, 113, 114, 115, 116, 116,
- 117, 118, 119, 119, 120, 121, 122, 123,
- 123, 124, 125, 126, 126, 127, 128, 129,
- 130, 130, 131, 132, 133, 133, 134, 135,
- 136, 137, 137, 138, 139, 140, 141, 141,
- 142, 143, 144, 144, 145, 146, 147, 148,
- 148, 149, 150, 151, 152, 152, 153, 154,
- 155, 156, 156, 157, 158, 159, 160, 160,
- 161, 162, 163, 164, 164, 165, 166, 167,
- 168, 168, 169, 170, 171, 172, 173, 173,
- 174, 175, 176, 177, 177, 178, 179, 180,
- 181, 181, 182, 183, 184, 185, 186, 186,
- 187, 188, 189, 190, 190, 191, 192, 193,
- 194, 195, 195, 196, 197, 198, 199, 200,
- 200, 201, 202, 203, 204, 205, 205, 206,
- 207, 208, 209, 210, 210, 211, 212, 213,
- 214, 215, 215, 216, 217, 218, 219, 220,
- 220, 221, 222, 223, 224, 225, 225, 226,
- 227, 228, 229, 230, 231, 231, 232, 233,
- 234, 235, 236, 237, 237, 238, 239, 240,
- 241, 242, 243, 243, 244, 245, 246, 247,
- 248, 249, 249, 250, 251, 252, 253, 254,
- 255, 255, 256, 257, 258, 259, 260, 261,
- 262, 262, 263, 264, 265, 266, 267, 268,
- 268, 269, 270, 271, 272, 273, 274, 275,
- 276, 276, 277, 278, 279, 280, 281, 282,
- 283, 283, 284, 285, 286, 287, 288, 289,
- 290, 291, 291, 292, 293, 294, 295, 296,
- 297, 298, 299, 299, 300, 301, 302, 303,
- 304, 305, 306, 307, 308, 308, 309, 310,
- 311, 312, 313, 314, 315, 316, 317, 318,
- 318, 319, 320, 321, 322, 323, 324, 325,
- 326, 327, 328, 328, 329, 330, 331, 332,
- 333, 334, 335, 336, 337, 338, 339, 339,
- 340, 341, 342, 343, 344, 345, 346, 347,
- 348, 349, 350, 351, 352, 352, 353, 354,
- 355, 356, 357, 358, 359, 360, 361, 362,
- 363, 364, 365, 366, 367, 367, 368, 369,
- 370, 371, 372, 373, 374, 375, 376, 377,
- 378, 379, 380, 381, 382, 383, 384, 385,
- 385, 386, 387, 388, 389, 390, 391, 392,
- 393, 394, 395, 396, 397, 398, 399, 400,
- 401, 402, 403, 404, 405, 406, 407, 408,
- 409, 410, 410, 411, 412, 413, 414, 415,
- 416, 417, 418, 419, 420, 421, 422, 423,
- 424, 425, 426, 427, 428, 429, 430, 431,
- 432, 433, 434, 435, 436, 437, 438, 439,
- 440, 441, 442, 443, 444, 445, 446, 447,
- 448, 449, 450, 451, 452, 453, 454, 455,
- 456, 457, 458, 459, 460, 461, 462, 463,
- 464, 465, 466, 467, 468, 469, 470, 471,
- 472, 473, 474, 475, 476, 477, 478, 479,
- 480, 481, 482, 483, 484, 485, 486, 487,
- 488, 489, 490, 491, 492, 493, 494, 495,
- 496, 498, 499, 500, 501, 502, 503, 504,
- 505, 506, 507, 508, 509, 510, 511, 512,
- 513, 514, 515, 516, 517, 518, 519, 520,
- 521, 522, 523, 525, 526, 527, 528, 529,
- 530, 531, 532, 533, 534, 535, 536, 537,
- 538, 539, 540, 541, 542, 544, 545, 546,
- 547, 548, 549, 550, 551, 552, 553, 554,
- 555, 556, 557, 558, 560, 561, 562, 563,
- 564, 565, 566, 567, 568, 569, 570, 571,
- 572, 574, 575, 576, 577, 578, 579, 580,
- 581, 582, 583, 584, 585, 587, 588, 589,
- 590, 591, 592, 593, 594, 595, 596, 597,
- 599, 600, 601, 602, 603, 604, 605, 606,
- 607, 608, 610, 611, 612, 613, 614, 615,
- 616, 617, 618, 620, 621, 622, 623, 624,
- 625, 626, 627, 628, 630, 631, 632, 633,
- 634, 635, 636, 637, 639, 640, 641, 642,
- 643, 644, 645, 646, 648, 649, 650, 651,
- 652, 653, 654, 656, 657, 658, 659, 660,
- 661, 662, 664, 665, 666, 667, 668, 669,
- 670, 672, 673, 674, 675, 676, 677, 678,
- 680, 681, 682, 683, 684, 685, 687, 688,
- 689, 690, 691, 692, 693, 695, 696, 697,
- 698, 699, 700, 702, 703, 704, 705, 706,
- 708, 709, 710, 711, 712, 713, 715, 716,
- 717, 718, 719, 720, 722, 723, 724, 725,
- 726, 728, 729, 730, 731, 732, 733, 735,
- 736, 737, 738, 739, 741, 742, 743, 744,
- 745, 747, 748, 749, 750, 751, 753, 754,
- 755, 756, 757, 759, 760, 761, 762, 763,
- 765, 766, 767, 768, 770, 771, 772, 773,
- 774, 776, 777, 778, 779, 780, 782, 783,
- 784, 785, 787, 788, 789, 790, 792, 793,
- 794, 795, 796, 798, 799, 800, 801, 803,
- 804, 805, 806, 808, 809, 810, 811, 813,
- 814, 815, 816, 818, 819, 820, 821, 823,
- 824, 825, 826, 828, 829, 830, 831, 833,
- 834, 835, 836, 838, 839, 840, 841, 843,
- 844, 845, 846, 848, 849, 850, 851, 853,
- 854, 855, 857, 858, 859, 860, 862, 863,
- 864, 866, 867, 868, 869, 871, 872, 873,
- 874, 876, 877, 878, 880, 881, 882, 883,
- 885, 886, 887, 889, 890, 891, 893, 894,
- 895, 896, 898, 899, 900, 902, 903, 904,
- 906, 907, 908, 909, 911, 912, 913, 915,
- 916, 917, 919, 920, 921, 923, 924, 925,
- 927, 928, 929, 931, 932, 933, 935, 936,
- 937, 938, 940, 941, 942, 944, 945, 946,
- 948, 949, 950, 952, 953, 955, 956, 957,
- 959, 960, 961, 963, 964, 965, 967, 968,
- 969, 971, 972, 973, 975, 976, 977, 979,
- 980, 981, 983, 984, 986, 987, 988, 990,
- 991, 992, 994, 995, 996, 998, 999, 1001,
- 1002, 1003, 1005, 1006, 1007, 1009, 1010, 1012,
- 1013, 1014, 1016, 1017, 1018, 1020, 1021, 1023
-};
-
-static const WebRtc_Word16 kIndicatorTable[17] = {0, 2017, 3809, 5227, 6258, 6963, 7424, 7718,
- 7901, 8014, 8084, 8126, 8152, 8168, 8177, 8183, 8187};
-
-// hybrib Hanning & flat window
-static const WebRtc_Word16 kBlocks80w128x[128] = {
- 0, 536, 1072, 1606, 2139, 2669, 3196, 3720, 4240, 4756, 5266,
- 5771, 6270, 6762, 7246, 7723, 8192, 8652, 9102, 9543, 9974, 10394,
- 10803, 11200, 11585, 11958, 12318, 12665, 12998, 13318, 13623, 13913, 14189,
- 14449, 14694, 14924, 15137, 15334, 15515, 15679, 15826, 15956, 16069, 16165,
- 16244, 16305, 16349, 16375, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
- 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
- 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
- 16384, 16384, 16384, 16384, 16375, 16349, 16305, 16244, 16165, 16069, 15956,
- 15826, 15679, 15515, 15334, 15137, 14924, 14694, 14449, 14189, 13913, 13623,
- 13318, 12998, 12665, 12318, 11958, 11585, 11200, 10803, 10394, 9974, 9543,
- 9102, 8652, 8192, 7723, 7246, 6762, 6270, 5771, 5266, 4756, 4240,
- 3720, 3196, 2669, 2139, 1606, 1072, 536
-};
-
-// hybrib Hanning & flat window
-static const WebRtc_Word16 kBlocks160w256x[256] = {
- 0, 268, 536, 804, 1072, 1339, 1606, 1872,
- 2139, 2404, 2669, 2933, 3196, 3459, 3720, 3981,
- 4240, 4499, 4756, 5012, 5266, 5520, 5771, 6021,
- 6270, 6517, 6762, 7005, 7246, 7486, 7723, 7959,
- 8192, 8423, 8652, 8878, 9102, 9324, 9543, 9760,
- 9974, 10185, 10394, 10600, 10803, 11003, 11200, 11394,
-11585, 11773, 11958, 12140, 12318, 12493, 12665, 12833,
-12998, 13160, 13318, 13472, 13623, 13770, 13913, 14053,
-14189, 14321, 14449, 14574, 14694, 14811, 14924, 15032,
-15137, 15237, 15334, 15426, 15515, 15599, 15679, 15754,
-15826, 15893, 15956, 16015, 16069, 16119, 16165, 16207,
-16244, 16277, 16305, 16329, 16349, 16364, 16375, 16382,
-16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
-16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
-16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
-16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
-16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
-16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
-16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
-16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
-16384, 16382, 16375, 16364, 16349, 16329, 16305, 16277,
-16244, 16207, 16165, 16119, 16069, 16015, 15956, 15893,
-15826, 15754, 15679, 15599, 15515, 15426, 15334, 15237,
-15137, 15032, 14924, 14811, 14694, 14574, 14449, 14321,
-14189, 14053, 13913, 13770, 13623, 13472, 13318, 13160,
-12998, 12833, 12665, 12493, 12318, 12140, 11958, 11773,
-11585, 11394, 11200, 11003, 10803, 10600, 10394, 10185,
- 9974, 9760, 9543, 9324, 9102, 8878, 8652, 8423,
- 8192, 7959, 7723, 7486, 7246, 7005, 6762, 6517,
- 6270, 6021, 5771, 5520, 5266, 5012, 4756, 4499,
- 4240, 3981, 3720, 3459, 3196, 2933, 2669, 2404,
- 2139, 1872, 1606, 1339, 1072, 804, 536, 268
-};
-
-// Gain factor table: Input value in Q8 and output value in Q13
-static const WebRtc_Word16 kFactor1Table[257] = {
- 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8233, 8274, 8315, 8355, 8396, 8436, 8475, 8515, 8554, 8592, 8631, 8669,
- 8707, 8745, 8783, 8820, 8857, 8894, 8931, 8967, 9003, 9039, 9075, 9111, 9146, 9181,
- 9216, 9251, 9286, 9320, 9354, 9388, 9422, 9456, 9489, 9523, 9556, 9589, 9622, 9655,
- 9687, 9719, 9752, 9784, 9816, 9848, 9879, 9911, 9942, 9973, 10004, 10035, 10066,
- 10097, 10128, 10158, 10188, 10218, 10249, 10279, 10308, 10338, 10368, 10397, 10426,
- 10456, 10485, 10514, 10543, 10572, 10600, 10629, 10657, 10686, 10714, 10742, 10770,
- 10798, 10826, 10854, 10882, 10847, 10810, 10774, 10737, 10701, 10666, 10631, 10596,
- 10562, 10527, 10494, 10460, 10427, 10394, 10362, 10329, 10297, 10266, 10235, 10203,
- 10173, 10142, 10112, 10082, 10052, 10023, 9994, 9965, 9936, 9908, 9879, 9851, 9824,
- 9796, 9769, 9742, 9715, 9689, 9662, 9636, 9610, 9584, 9559, 9534, 9508, 9484, 9459,
- 9434, 9410, 9386, 9362, 9338, 9314, 9291, 9268, 9245, 9222, 9199, 9176, 9154, 9132,
- 9110, 9088, 9066, 9044, 9023, 9002, 8980, 8959, 8939, 8918, 8897, 8877, 8857, 8836,
- 8816, 8796, 8777, 8757, 8738, 8718, 8699, 8680, 8661, 8642, 8623, 8605, 8586, 8568,
- 8550, 8532, 8514, 8496, 8478, 8460, 8443, 8425, 8408, 8391, 8373, 8356, 8339, 8323,
- 8306, 8289, 8273, 8256, 8240, 8224, 8208, 8192
-};
-
-// Gain factor table: Input value in Q8 and output value in Q13
-static const WebRtc_Word16 kFactor2Aggressiveness1[257] = {
- 7577, 7577, 7577, 7577, 7577, 7577,
- 7577, 7577, 7577, 7577, 7577, 7577, 7577, 7577, 7577, 7577, 7577, 7596, 7614, 7632,
- 7650, 7667, 7683, 7699, 7715, 7731, 7746, 7761, 7775, 7790, 7804, 7818, 7832, 7845,
- 7858, 7871, 7884, 7897, 7910, 7922, 7934, 7946, 7958, 7970, 7982, 7993, 8004, 8016,
- 8027, 8038, 8049, 8060, 8070, 8081, 8091, 8102, 8112, 8122, 8132, 8143, 8152, 8162,
- 8172, 8182, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192
-};
-
-// Gain factor table: Input value in Q8 and output value in Q13
-static const WebRtc_Word16 kFactor2Aggressiveness2[257] = {
- 7270, 7270, 7270, 7270, 7270, 7306,
- 7339, 7369, 7397, 7424, 7448, 7472, 7495, 7517, 7537, 7558, 7577, 7596, 7614, 7632,
- 7650, 7667, 7683, 7699, 7715, 7731, 7746, 7761, 7775, 7790, 7804, 7818, 7832, 7845,
- 7858, 7871, 7884, 7897, 7910, 7922, 7934, 7946, 7958, 7970, 7982, 7993, 8004, 8016,
- 8027, 8038, 8049, 8060, 8070, 8081, 8091, 8102, 8112, 8122, 8132, 8143, 8152, 8162,
- 8172, 8182, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192
-};
-
-// Gain factor table: Input value in Q8 and output value in Q13
-static const WebRtc_Word16 kFactor2Aggressiveness3[257] = {
- 7184, 7184, 7184, 7229, 7270, 7306,
- 7339, 7369, 7397, 7424, 7448, 7472, 7495, 7517, 7537, 7558, 7577, 7596, 7614, 7632,
- 7650, 7667, 7683, 7699, 7715, 7731, 7746, 7761, 7775, 7790, 7804, 7818, 7832, 7845,
- 7858, 7871, 7884, 7897, 7910, 7922, 7934, 7946, 7958, 7970, 7982, 7993, 8004, 8016,
- 8027, 8038, 8049, 8060, 8070, 8081, 8091, 8102, 8112, 8122, 8132, 8143, 8152, 8162,
- 8172, 8182, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
- 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192
-};
-
-// sum of log2(i) from table index to inst->anaLen2 in Q5
-// Note that the first table value is invalid, since log2(0) = -infinity
-static const WebRtc_Word16 kSumLogIndex[66] = {
- 0, 22917, 22917, 22885, 22834, 22770, 22696, 22613,
- 22524, 22428, 22326, 22220, 22109, 21994, 21876, 21754,
- 21629, 21501, 21370, 21237, 21101, 20963, 20822, 20679,
- 20535, 20388, 20239, 20089, 19937, 19783, 19628, 19470,
- 19312, 19152, 18991, 18828, 18664, 18498, 18331, 18164,
- 17994, 17824, 17653, 17480, 17306, 17132, 16956, 16779,
- 16602, 16423, 16243, 16063, 15881, 15699, 15515, 15331,
- 15146, 14960, 14774, 14586, 14398, 14209, 14019, 13829,
- 13637, 13445
-};
-
-// sum of log2(i)^2 from table index to inst->anaLen2 in Q2
-// Note that the first table value is invalid, since log2(0) = -infinity
-static const WebRtc_Word16 kSumSquareLogIndex[66] = {
- 0, 16959, 16959, 16955, 16945, 16929, 16908, 16881,
- 16850, 16814, 16773, 16729, 16681, 16630, 16575, 16517,
- 16456, 16392, 16325, 16256, 16184, 16109, 16032, 15952,
- 15870, 15786, 15700, 15612, 15521, 15429, 15334, 15238,
- 15140, 15040, 14938, 14834, 14729, 14622, 14514, 14404,
- 14292, 14179, 14064, 13947, 13830, 13710, 13590, 13468,
- 13344, 13220, 13094, 12966, 12837, 12707, 12576, 12444,
- 12310, 12175, 12039, 11902, 11763, 11624, 11483, 11341,
- 11198, 11054
-};
-
-// log2(table index) in Q12
-// Note that the first table value is invalid, since log2(0) = -infinity
-static const WebRtc_Word16 kLogIndex[129] = {
- 0, 0, 4096, 6492, 8192, 9511, 10588, 11499,
- 12288, 12984, 13607, 14170, 14684, 15157, 15595, 16003,
- 16384, 16742, 17080, 17400, 17703, 17991, 18266, 18529,
- 18780, 19021, 19253, 19476, 19691, 19898, 20099, 20292,
- 20480, 20662, 20838, 21010, 21176, 21338, 21496, 21649,
- 21799, 21945, 22087, 22226, 22362, 22495, 22625, 22752,
- 22876, 22998, 23117, 23234, 23349, 23462, 23572, 23680,
- 23787, 23892, 23994, 24095, 24195, 24292, 24388, 24483,
- 24576, 24668, 24758, 24847, 24934, 25021, 25106, 25189,
- 25272, 25354, 25434, 25513, 25592, 25669, 25745, 25820,
- 25895, 25968, 26041, 26112, 26183, 26253, 26322, 26390,
- 26458, 26525, 26591, 26656, 26721, 26784, 26848, 26910,
- 26972, 27033, 27094, 27154, 27213, 27272, 27330, 27388,
- 27445, 27502, 27558, 27613, 27668, 27722, 27776, 27830,
- 27883, 27935, 27988, 28039, 28090, 28141, 28191, 28241,
- 28291, 28340, 28388, 28437, 28484, 28532, 28579, 28626,
- 28672
-};
-
-// determinant of estimation matrix in Q0 corresponding to the log2 tables above
-// Note that the first table value is invalid, since log2(0) = -infinity
-static const WebRtc_Word16 kDeterminantEstMatrix[66] = {
- 0, 29814, 25574, 22640, 20351, 18469, 16873, 15491,
- 14277, 13199, 12233, 11362, 10571, 9851, 9192, 8587,
- 8030, 7515, 7038, 6596, 6186, 5804, 5448, 5115,
- 4805, 4514, 4242, 3988, 3749, 3524, 3314, 3116,
- 2930, 2755, 2590, 2435, 2289, 2152, 2022, 1900,
- 1785, 1677, 1575, 1478, 1388, 1302, 1221, 1145,
- 1073, 1005, 942, 881, 825, 771, 721, 674,
- 629, 587, 547, 510, 475, 442, 411, 382,
- 355, 330
-};
-
-void WebRtcNsx_UpdateNoiseEstimate(NsxInst_t *inst, int offset)
-{
- WebRtc_Word32 tmp32no1 = 0;
- WebRtc_Word32 tmp32no2 = 0;
-
- WebRtc_Word16 tmp16no1 = 0;
- WebRtc_Word16 tmp16no2 = 0;
- WebRtc_Word16 exp2Const = 11819; // Q13
-
- int i = 0;
-
- tmp16no2 = WebRtcSpl_MaxValueW16(inst->noiseEstLogQuantile + offset, inst->magnLen);
- inst->qNoise = 14
- - (int)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(exp2Const, tmp16no2, 21);
- for (i = 0; i < inst->magnLen; i++)
- {
- // inst->quantile[i]=exp(inst->lquantile[offset+i]);
- // in Q21
- tmp32no2 = WEBRTC_SPL_MUL_16_16(exp2Const, inst->noiseEstLogQuantile[offset + i]);
- tmp32no1 = (0x00200000 | (tmp32no2 & 0x001FFFFF));
- tmp16no1 = -(WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32no2, 21);
- tmp16no1 += 21;// shift 21 to get result in Q0
- tmp16no1 -= (WebRtc_Word16)inst->qNoise; //shift to get result in Q(qNoise)
- if (tmp16no1 > 0)
- {
- inst->noiseEstQuantile[i] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32no1 +
- kRoundTable[tmp16no1], tmp16no1);
- }
- else
- {
- inst->noiseEstQuantile[i] = (WebRtc_Word16)WEBRTC_SPL_LSHIFT_W32(tmp32no1,
- -tmp16no1);
- }
- }
-}
-
-void WebRtcNsx_CalcParametricNoiseEstimate(NsxInst_t *inst,
- WebRtc_Word16 pink_noise_exp_avg,
- WebRtc_Word32 pink_noise_num_avg,
- int freq_index,
- WebRtc_UWord32 *noise_estimate,
- WebRtc_UWord32 *noise_estimate_avg)
-{
- WebRtc_Word32 tmp32no1 = 0;
- WebRtc_Word32 tmp32no2 = 0;
-
- WebRtc_Word16 int_part = 0;
- WebRtc_Word16 frac_part = 0;
-
- // Use pink noise estimate
- // noise_estimate = 2^(pinkNoiseNumerator + pinkNoiseExp * log2(j))
- assert(freq_index > 0);
- tmp32no2 = WEBRTC_SPL_MUL_16_16(pink_noise_exp_avg, kLogIndex[freq_index]); // Q26
- tmp32no2 = WEBRTC_SPL_RSHIFT_W32(tmp32no2, 15); // Q11
- tmp32no1 = pink_noise_num_avg - tmp32no2; // Q11
-
- // Calculate output: 2^tmp32no1
- // Output in Q(minNorm-stages)
- tmp32no1 += WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)(inst->minNorm - inst->stages), 11);
- if (tmp32no1 > 0)
- {
- int_part = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32no1, 11);
- frac_part = (WebRtc_Word16)(tmp32no1 & 0x000007ff); // Q11
- // Piecewise linear approximation of 'b' in
- // 2^(int_part+frac_part) = 2^int_part * (1 + b)
- // 'b' is given in Q11 and below stored in frac_part.
- if (WEBRTC_SPL_RSHIFT_W32(frac_part, 10))
- {
- // Upper fractional part
- tmp32no2 = WEBRTC_SPL_MUL_32_16(2048 - frac_part, 1244); // Q21
- tmp32no2 = 2048 - WEBRTC_SPL_RSHIFT_W32(tmp32no2, 10);
- }
- else
- {
- // Lower fractional part
- tmp32no2 = WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL_32_16(frac_part, 804), 10);
- }
- // Shift fractional part to Q(minNorm-stages)
- tmp32no2 = WEBRTC_SPL_SHIFT_W32(tmp32no2, int_part - 11);
- *noise_estimate_avg = WEBRTC_SPL_LSHIFT_U32(1, int_part) + (WebRtc_UWord32)tmp32no2;
- // Scale up to initMagnEst, which is not block averaged
- *noise_estimate = (*noise_estimate_avg) * (WebRtc_UWord32)(inst->blockIndex + 1);
- }
-}
-
-// Initialize state
-WebRtc_Word32 WebRtcNsx_InitCore(NsxInst_t *inst, WebRtc_UWord32 fs)
-{
- int i;
-
- //check for valid pointer
- if (inst == NULL)
- {
- return -1;
- }
- //
-
- // Initialization of struct
- if (fs == 8000 || fs == 16000 || fs == 32000)
- {
- inst->fs = fs;
- } else
- {
- return -1;
- }
-
- if (fs == 8000)
- {
- inst->blockLen10ms = 80;
- inst->anaLen = 128;
- inst->stages = 7;
- inst->window = kBlocks80w128x;
- inst->thresholdLogLrt = 131072; //default threshold for LRT feature
- inst->maxLrt = 0x0040000;
- inst->minLrt = 52429;
- } else if (fs == 16000)
- {
- inst->blockLen10ms = 160;
- inst->anaLen = 256;
- inst->stages = 8;
- inst->window = kBlocks160w256x;
- inst->thresholdLogLrt = 212644; //default threshold for LRT feature
- inst->maxLrt = 0x0080000;
- inst->minLrt = 104858;
- } else if (fs == 32000)
- {
- inst->blockLen10ms = 160;
- inst->anaLen = 256;
- inst->stages = 8;
- inst->window = kBlocks160w256x;
- inst->thresholdLogLrt = 212644; //default threshold for LRT feature
- inst->maxLrt = 0x0080000;
- inst->minLrt = 104858;
- }
- inst->anaLen2 = WEBRTC_SPL_RSHIFT_W16(inst->anaLen, 1);
- inst->magnLen = inst->anaLen2 + 1;
-
- WebRtcSpl_ZerosArrayW16(inst->analysisBuffer, ANAL_BLOCKL_MAX);
- WebRtcSpl_ZerosArrayW16(inst->synthesisBuffer, ANAL_BLOCKL_MAX);
-
- // for HB processing
- WebRtcSpl_ZerosArrayW16(inst->dataBufHBFX, ANAL_BLOCKL_MAX);
- // for quantile noise estimation
- WebRtcSpl_ZerosArrayW16(inst->noiseEstQuantile, HALF_ANAL_BLOCKL);
- for (i = 0; i < SIMULT * HALF_ANAL_BLOCKL; i++)
- {
- inst->noiseEstLogQuantile[i] = 2048; // Q8
- inst->noiseEstDensity[i] = 153; // Q9
- }
- for (i = 0; i < SIMULT; i++)
- {
- inst->noiseEstCounter[i] = (WebRtc_Word16)(END_STARTUP_LONG * (i + 1)) / SIMULT;
- }
-
- // Initialize suppression filter with ones
- WebRtcSpl_MemSetW16((WebRtc_Word16*)inst->noiseSupFilter, 16384, HALF_ANAL_BLOCKL);
-
- // Set the aggressiveness: default
- inst->aggrMode = 0;
-
- //initialize variables for new method
- inst->priorNonSpeechProb = 8192; // Q14(0.5) prior probability for speech/noise
- for (i = 0; i < HALF_ANAL_BLOCKL; i++)
- {
- inst->prevMagnU16[i] = 0;
- inst->prevNoiseU32[i] = 0; //previous noise-spectrum
- inst->logLrtTimeAvgW32[i] = 0; //smooth LR ratio
- inst->avgMagnPause[i] = 0; //conservative noise spectrum estimate
- inst->initMagnEst[i] = 0; //initial average magnitude spectrum
- }
-
- //feature quantities
- inst->thresholdSpecDiff = 50; //threshold for difference feature: determined on-line
- inst->thresholdSpecFlat = 20480; //threshold for flatness: determined on-line
- inst->featureLogLrt = inst->thresholdLogLrt; //average LRT factor (= threshold)
- inst->featureSpecFlat = inst->thresholdSpecFlat; //spectral flatness (= threshold)
- inst->featureSpecDiff = inst->thresholdSpecDiff; //spectral difference (= threshold)
- inst->weightLogLrt = 6; //default weighting par for LRT feature
- inst->weightSpecFlat = 0; //default weighting par for spectral flatness feature
- inst->weightSpecDiff = 0; //default weighting par for spectral difference feature
-
- inst->curAvgMagnEnergy = 0; //window time-average of input magnitude spectrum
- inst->timeAvgMagnEnergy = 0; //normalization for spectral difference
- inst->timeAvgMagnEnergyTmp = 0; //normalization for spectral difference
-
- //histogram quantities: used to estimate/update thresholds for features
- WebRtcSpl_ZerosArrayW16(inst->histLrt, HIST_PAR_EST);
- WebRtcSpl_ZerosArrayW16(inst->histSpecDiff, HIST_PAR_EST);
- WebRtcSpl_ZerosArrayW16(inst->histSpecFlat, HIST_PAR_EST);
-
- inst->blockIndex = -1; //frame counter
-
- //inst->modelUpdate = 500; //window for update
- inst->modelUpdate = (1 << STAT_UPDATES); //window for update
- inst->cntThresUpdate = 0; //counter feature thresholds updates
-
- inst->sumMagn = 0;
- inst->magnEnergy = 0;
- inst->prevQMagn = 0;
- inst->qNoise = 0;
- inst->prevQNoise = 0;
-
- inst->energyIn = 0;
- inst->scaleEnergyIn = 0;
-
- inst->whiteNoiseLevel = 0;
- inst->pinkNoiseNumerator = 0;
- inst->pinkNoiseExp = 0;
- inst->minNorm = 15; // Start with full scale
- inst->zeroInputSignal = 0;
-
- //default mode
- WebRtcNsx_set_policy_core(inst, 0);
-
-#ifdef NS_FILEDEBUG
- inst->infile=fopen("indebug.pcm","wb");
- inst->outfile=fopen("outdebug.pcm","wb");
- inst->file1=fopen("file1.pcm","wb");
- inst->file2=fopen("file2.pcm","wb");
- inst->file3=fopen("file3.pcm","wb");
- inst->file4=fopen("file4.pcm","wb");
- inst->file5=fopen("file5.pcm","wb");
-#endif
-
- inst->initFlag = 1;
-
- return 0;
-}
-
-int WebRtcNsx_set_policy_core(NsxInst_t *inst, int mode)
-{
- // allow for modes:0,1,2,3
- if (mode < 0 || mode > 3)
- {
- return -1;
- }
-
- inst->aggrMode = mode;
- if (mode == 0)
- {
- inst->overdrive = 256; // Q8(1.0)
- inst->denoiseBound = 8192; // Q14(0.5)
- inst->gainMap = 0; // No gain compensation
- } else if (mode == 1)
- {
- inst->overdrive = 256; // Q8(1.0)
- inst->denoiseBound = 4096; // Q14(0.25)
- inst->factor2Table = kFactor2Aggressiveness1;
- inst->gainMap = 1;
- } else if (mode == 2)
- {
- inst->overdrive = 282; // ~= Q8(1.1)
- inst->denoiseBound = 2048; // Q14(0.125)
- inst->factor2Table = kFactor2Aggressiveness2;
- inst->gainMap = 1;
- } else if (mode == 3)
- {
- inst->overdrive = 320; // Q8(1.25)
- inst->denoiseBound = 1475; // ~= Q14(0.09)
- inst->factor2Table = kFactor2Aggressiveness3;
- inst->gainMap = 1;
- }
- return 0;
-}
-
-void WebRtcNsx_NoiseEstimation(NsxInst_t *inst, WebRtc_UWord16 *magn, WebRtc_UWord32 *noise,
- WebRtc_Word16 *qNoise)
-{
- WebRtc_Word32 numerator;
-
- WebRtc_Word16 lmagn[HALF_ANAL_BLOCKL], counter, countDiv, countProd, delta, zeros, frac;
- WebRtc_Word16 log2, tabind, logval, tmp16, tmp16no1, tmp16no2;
- WebRtc_Word16 log2Const = 22713; // Q15
- WebRtc_Word16 widthFactor = 21845;
-
- int i, s, offset;
-
- numerator = FACTOR_Q16;
-
- tabind = inst->stages - inst->normData;
- if (tabind < 0)
- {
- logval = -kLogTable[-tabind];
- } else
- {
- logval = kLogTable[tabind];
- }
-
- // lmagn(i)=log(magn(i))=log(2)*log2(magn(i))
- // magn is in Q(-stages), and the real lmagn values are:
- // real_lmagn(i)=log(magn(i)*2^stages)=log(magn(i))+log(2^stages)
- // lmagn in Q8
- for (i = 0; i < inst->magnLen; i++)
- {
- if (magn[i])
- {
- zeros = WebRtcSpl_NormU32((WebRtc_UWord32)magn[i]);
- frac = (WebRtc_Word16)((((WebRtc_UWord32)magn[i] << zeros) & 0x7FFFFFFF) >> 23);
- // log2(magn(i))
- log2 = (WebRtc_Word16)(((31 - zeros) << 8) + kLogTableFrac[frac]);
- // log2(magn(i))*log(2)
- lmagn[i] = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(log2, log2Const, 15);
- // + log(2^stages)
- lmagn[i] += logval;
- } else
- {
- lmagn[i] = logval;//0;
- }
- }
-
- // loop over simultaneous estimates
- for (s = 0; s < SIMULT; s++)
- {
- offset = s * inst->magnLen;
-
- // Get counter values from state
- counter = inst->noiseEstCounter[s];
- countDiv = kCounterDiv[counter];
- countProd = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16(counter, countDiv);
-
- // quant_est(...)
- for (i = 0; i < inst->magnLen; i++)
- {
- // compute delta
- if (inst->noiseEstDensity[offset + i] > 512)
- {
- delta = WebRtcSpl_DivW32W16ResW16(numerator,
- inst->noiseEstDensity[offset + i]);
- } else
- {
- delta = FACTOR_Q7;
- }
-
- // update log quantile estimate
- tmp16 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(delta, countDiv, 14);
- if (lmagn[i] > inst->noiseEstLogQuantile[offset + i])
- {
- // +=QUANTILE*delta/(inst->counter[s]+1) QUANTILE=0.25, =1 in Q2
- // CounterDiv=1/inst->counter[s] in Q15
- tmp16 += 2;
- tmp16no1 = WEBRTC_SPL_RSHIFT_W16(tmp16, 2);
- inst->noiseEstLogQuantile[offset + i] += tmp16no1;
- } else
- {
- tmp16 += 1;
- tmp16no1 = WEBRTC_SPL_RSHIFT_W16(tmp16, 1);
- // *(1-QUANTILE), in Q2 QUANTILE=0.25, 1-0.25=0.75=3 in Q2
- tmp16no2 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(tmp16no1, 3, 1);
- inst->noiseEstLogQuantile[offset + i] -= tmp16no2;
- }
-
- // update density estimate
- if (WEBRTC_SPL_ABS_W16(lmagn[i] - inst->noiseEstLogQuantile[offset + i])
- < WIDTH_Q8)
- {
- tmp16no1 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(
- inst->noiseEstDensity[offset + i], countProd, 15);
- tmp16no2 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(widthFactor,
- countDiv, 15);
- inst->noiseEstDensity[offset + i] = tmp16no1 + tmp16no2;
- }
- } // end loop over magnitude spectrum
-
- if (counter >= END_STARTUP_LONG)
- {
- inst->noiseEstCounter[s] = 0;
- if (inst->blockIndex >= END_STARTUP_LONG)
- {
- WebRtcNsx_UpdateNoiseEstimate(inst, offset);
- }
- }
- inst->noiseEstCounter[s]++;
-
- } // end loop over simultaneous estimates
-
- // Sequentially update the noise during startup
- if (inst->blockIndex < END_STARTUP_LONG)
- {
- WebRtcNsx_UpdateNoiseEstimate(inst, offset);
- }
-
- for (i = 0; i < inst->magnLen; i++)
- {
- noise[i] = (WebRtc_UWord32)(inst->noiseEstQuantile[i]); // Q(qNoise)
- }
- (*qNoise) = (WebRtc_Word16)inst->qNoise;
-}
-
-// Extract thresholds for feature parameters
-// histograms are computed over some window_size (given by window_pars)
-// thresholds and weights are extracted every window
-// flag 0 means update histogram only, flag 1 means compute the thresholds/weights
-// threshold and weights are returned in: inst->priorModelPars
-void WebRtcNsx_FeatureParameterExtraction(NsxInst_t *inst, int flag)
-{
- WebRtc_UWord32 tmpU32;
- WebRtc_UWord32 histIndex;
- WebRtc_UWord32 posPeak1SpecFlatFX, posPeak2SpecFlatFX;
- WebRtc_UWord32 posPeak1SpecDiffFX, posPeak2SpecDiffFX;
-
- WebRtc_Word32 tmp32;
- WebRtc_Word32 fluctLrtFX, thresFluctLrtFX;
- WebRtc_Word32 avgHistLrtFX, avgSquareHistLrtFX, avgHistLrtComplFX;
-
- WebRtc_Word16 j;
- WebRtc_Word16 numHistLrt;
-
- int i;
- int useFeatureSpecFlat, useFeatureSpecDiff, featureSum;
- int maxPeak1, maxPeak2;
- int weightPeak1SpecFlat, weightPeak2SpecFlat;
- int weightPeak1SpecDiff, weightPeak2SpecDiff;
-
- //update histograms
- if (!flag)
- {
- // LRT
- // Type casting to UWord32 is safe since negative values will not be wrapped to larger
- // values than HIST_PAR_EST
- histIndex = (WebRtc_UWord32)(inst->featureLogLrt);
- if (histIndex < HIST_PAR_EST)
- {
- inst->histLrt[histIndex]++;
- }
- // Spectral flatness
- // (inst->featureSpecFlat*20)>>10 = (inst->featureSpecFlat*5)>>8
- histIndex = WEBRTC_SPL_RSHIFT_U32(inst->featureSpecFlat * 5, 8);
- if (histIndex < HIST_PAR_EST)
- {
- inst->histSpecFlat[histIndex]++;
- }
- // Spectral difference
- histIndex = HIST_PAR_EST;
- if (inst->timeAvgMagnEnergy)
- {
- // Guard against division by zero
- // If timeAvgMagnEnergy == 0 we have no normalizing statistics and therefore can't
- // update the histogram
- histIndex = WEBRTC_SPL_UDIV((inst->featureSpecDiff * 5) >> inst->stages,
- inst->timeAvgMagnEnergy);
- }
- if (histIndex < HIST_PAR_EST)
- {
- inst->histSpecDiff[histIndex]++;
- }
- }
-
- // extract parameters for speech/noise probability
- if (flag)
- {
- useFeatureSpecDiff = 1;
- //for LRT feature:
- // compute the average over inst->featureExtractionParams.rangeAvgHistLrt
- avgHistLrtFX = 0;
- avgSquareHistLrtFX = 0;
- numHistLrt = 0;
- for (i = 0; i < BIN_SIZE_LRT; i++)
- {
- j = (2 * i + 1);
- tmp32 = WEBRTC_SPL_MUL_16_16(inst->histLrt[i], j);
- avgHistLrtFX += tmp32;
- numHistLrt += inst->histLrt[i];
- avgSquareHistLrtFX += WEBRTC_SPL_MUL_32_16(tmp32, j);
- }
- avgHistLrtComplFX = avgHistLrtFX;
- for (; i < HIST_PAR_EST; i++)
- {
- j = (2 * i + 1);
- tmp32 = WEBRTC_SPL_MUL_16_16(inst->histLrt[i], j);
- avgHistLrtComplFX += tmp32;
- avgSquareHistLrtFX += WEBRTC_SPL_MUL_32_16(tmp32, j);
- }
- fluctLrtFX = WEBRTC_SPL_MUL(avgSquareHistLrtFX, numHistLrt);
- fluctLrtFX -= WEBRTC_SPL_MUL(avgHistLrtFX, avgHistLrtComplFX);
- thresFluctLrtFX = THRES_FLUCT_LRT * numHistLrt;
- // get threshold for LRT feature:
- tmpU32 = (FACTOR_1_LRT_DIFF * (WebRtc_UWord32)avgHistLrtFX);
- if ((fluctLrtFX < thresFluctLrtFX) || (numHistLrt == 0) || (tmpU32
- > (WebRtc_UWord32)(100 * numHistLrt)))
- {
- inst->thresholdLogLrt = inst->maxLrt; //very low fluctuation, so likely noise
- } else
- {
- tmp32 = (WebRtc_Word32)((tmpU32 << (9 + inst->stages)) / numHistLrt / 25);
- // check if value is within min/max range
- inst->thresholdLogLrt = WEBRTC_SPL_SAT(inst->maxLrt, tmp32, inst->minLrt);
- }
- if (fluctLrtFX < thresFluctLrtFX)
- {
- // Do not use difference feature if fluctuation of LRT feature is very low:
- // most likely just noise state
- useFeatureSpecDiff = 0;
- }
-
- // for spectral flatness and spectral difference: compute the main peaks of histogram
- maxPeak1 = 0;
- maxPeak2 = 0;
- posPeak1SpecFlatFX = 0;
- posPeak2SpecFlatFX = 0;
- weightPeak1SpecFlat = 0;
- weightPeak2SpecFlat = 0;
-
- // peaks for flatness
- for (i = 0; i < HIST_PAR_EST; i++)
- {
- if (inst->histSpecFlat[i] > maxPeak1)
- {
- // Found new "first" peak
- maxPeak2 = maxPeak1;
- weightPeak2SpecFlat = weightPeak1SpecFlat;
- posPeak2SpecFlatFX = posPeak1SpecFlatFX;
-
- maxPeak1 = inst->histSpecFlat[i];
- weightPeak1SpecFlat = inst->histSpecFlat[i];
- posPeak1SpecFlatFX = (WebRtc_UWord32)(2 * i + 1);
- } else if (inst->histSpecFlat[i] > maxPeak2)
- {
- // Found new "second" peak
- maxPeak2 = inst->histSpecFlat[i];
- weightPeak2SpecFlat = inst->histSpecFlat[i];
- posPeak2SpecFlatFX = (WebRtc_UWord32)(2 * i + 1);
- }
- }
-
- // for spectral flatness feature
- useFeatureSpecFlat = 1;
- // merge the two peaks if they are close
- if ((posPeak1SpecFlatFX - posPeak2SpecFlatFX < LIM_PEAK_SPACE_FLAT_DIFF)
- && (weightPeak2SpecFlat * LIM_PEAK_WEIGHT_FLAT_DIFF > weightPeak1SpecFlat))
- {
- weightPeak1SpecFlat += weightPeak2SpecFlat;
- posPeak1SpecFlatFX = (posPeak1SpecFlatFX + posPeak2SpecFlatFX) >> 1;
- }
- //reject if weight of peaks is not large enough, or peak value too small
- if (weightPeak1SpecFlat < THRES_WEIGHT_FLAT_DIFF || posPeak1SpecFlatFX
- < THRES_PEAK_FLAT)
- {
- useFeatureSpecFlat = 0;
- } else // if selected, get the threshold
- {
- // compute the threshold and check if value is within min/max range
- inst->thresholdSpecFlat = WEBRTC_SPL_SAT(MAX_FLAT_Q10, FACTOR_2_FLAT_Q10
- * posPeak1SpecFlatFX, MIN_FLAT_Q10); //Q10
- }
- // done with flatness feature
-
- if (useFeatureSpecDiff)
- {
- //compute two peaks for spectral difference
- maxPeak1 = 0;
- maxPeak2 = 0;
- posPeak1SpecDiffFX = 0;
- posPeak2SpecDiffFX = 0;
- weightPeak1SpecDiff = 0;
- weightPeak2SpecDiff = 0;
- // peaks for spectral difference
- for (i = 0; i < HIST_PAR_EST; i++)
- {
- if (inst->histSpecDiff[i] > maxPeak1)
- {
- // Found new "first" peak
- maxPeak2 = maxPeak1;
- weightPeak2SpecDiff = weightPeak1SpecDiff;
- posPeak2SpecDiffFX = posPeak1SpecDiffFX;
-
- maxPeak1 = inst->histSpecDiff[i];
- weightPeak1SpecDiff = inst->histSpecDiff[i];
- posPeak1SpecDiffFX = (WebRtc_UWord32)(2 * i + 1);
- } else if (inst->histSpecDiff[i] > maxPeak2)
- {
- // Found new "second" peak
- maxPeak2 = inst->histSpecDiff[i];
- weightPeak2SpecDiff = inst->histSpecDiff[i];
- posPeak2SpecDiffFX = (WebRtc_UWord32)(2 * i + 1);
- }
- }
-
- // merge the two peaks if they are close
- if ((posPeak1SpecDiffFX - posPeak2SpecDiffFX < LIM_PEAK_SPACE_FLAT_DIFF)
- && (weightPeak2SpecDiff * LIM_PEAK_WEIGHT_FLAT_DIFF > weightPeak1SpecDiff))
- {
- weightPeak1SpecDiff += weightPeak2SpecDiff;
- posPeak1SpecDiffFX = (posPeak1SpecDiffFX + posPeak2SpecDiffFX) >> 1;
- }
- // get the threshold value and check if value is within min/max range
- inst->thresholdSpecDiff = WEBRTC_SPL_SAT(MAX_DIFF, FACTOR_1_LRT_DIFF
- * posPeak1SpecDiffFX, MIN_DIFF); //5x bigger
- //reject if weight of peaks is not large enough
- if (weightPeak1SpecDiff < THRES_WEIGHT_FLAT_DIFF)
- {
- useFeatureSpecDiff = 0;
- }
- // done with spectral difference feature
- }
-
- // select the weights between the features
- // inst->priorModelPars[4] is weight for LRT: always selected
- featureSum = 6 / (1 + useFeatureSpecFlat + useFeatureSpecDiff);
- inst->weightLogLrt = featureSum;
- inst->weightSpecFlat = useFeatureSpecFlat * featureSum;
- inst->weightSpecDiff = useFeatureSpecDiff * featureSum;
-
- // set histograms to zero for next update
- WebRtcSpl_ZerosArrayW16(inst->histLrt, HIST_PAR_EST);
- WebRtcSpl_ZerosArrayW16(inst->histSpecDiff, HIST_PAR_EST);
- WebRtcSpl_ZerosArrayW16(inst->histSpecFlat, HIST_PAR_EST);
- } // end of flag == 1
-}
-
-
-// Compute spectral flatness on input spectrum
-// magn is the magnitude spectrum
-// spectral flatness is returned in inst->featureSpecFlat
-void WebRtcNsx_ComputeSpectralFlatness(NsxInst_t *inst, WebRtc_UWord16 *magn)
-{
- WebRtc_UWord32 tmpU32;
- WebRtc_UWord32 avgSpectralFlatnessNum, avgSpectralFlatnessDen;
-
- WebRtc_Word32 tmp32;
- WebRtc_Word32 currentSpectralFlatness, logCurSpectralFlatness;
-
- WebRtc_Word16 zeros, frac, intPart;
-
- int i;
-
- // for flatness
- avgSpectralFlatnessNum = 0;
- avgSpectralFlatnessDen = inst->sumMagn - (WebRtc_UWord32)magn[0]; // Q(normData-stages)
-
- // compute log of ratio of the geometric to arithmetic mean: check for log(0) case
- // flatness = exp( sum(log(magn[i]))/N - log(sum(magn[i])/N) )
- // = exp( sum(log(magn[i]))/N ) * N / sum(magn[i])
- // = 2^( sum(log2(magn[i]))/N - (log2(sum(magn[i])) - log2(N)) ) [This is used]
- for (i = 1; i < inst->magnLen; i++)
- {
- // First bin is excluded from spectrum measures. Number of bins is now a power of 2
- if (magn[i])
- {
- zeros = WebRtcSpl_NormU32((WebRtc_UWord32)magn[i]);
- frac = (WebRtc_Word16)(((WebRtc_UWord32)((WebRtc_UWord32)(magn[i]) << zeros)
- & 0x7FFFFFFF) >> 23);
- // log2(magn(i))
- tmpU32 = (WebRtc_UWord32)(((31 - zeros) << 8) + kLogTableFrac[frac]); // Q8
- avgSpectralFlatnessNum += tmpU32; // Q8
- } else
- {
- //if at least one frequency component is zero, treat separately
- tmpU32 = WEBRTC_SPL_UMUL_32_16(inst->featureSpecFlat, SPECT_FLAT_TAVG_Q14); // Q24
- inst->featureSpecFlat -= WEBRTC_SPL_RSHIFT_U32(tmpU32, 14); // Q10
- return;
- }
- }
- //ratio and inverse log: check for case of log(0)
- zeros = WebRtcSpl_NormU32(avgSpectralFlatnessDen);
- frac = (WebRtc_Word16)(((avgSpectralFlatnessDen << zeros) & 0x7FFFFFFF) >> 23);
- // log2(avgSpectralFlatnessDen)
- tmp32 = (WebRtc_Word32)(((31 - zeros) << 8) + kLogTableFrac[frac]); // Q8
- logCurSpectralFlatness = (WebRtc_Word32)avgSpectralFlatnessNum;
- logCurSpectralFlatness += ((WebRtc_Word32)(inst->stages - 1) << (inst->stages + 7)); // Q(8+stages-1)
- logCurSpectralFlatness -= (tmp32 << (inst->stages - 1));
- logCurSpectralFlatness = WEBRTC_SPL_LSHIFT_W32(logCurSpectralFlatness, 10 - inst->stages); // Q17
- tmp32 = (WebRtc_Word32)(0x00020000 | (WEBRTC_SPL_ABS_W32(logCurSpectralFlatness)
- & 0x0001FFFF)); //Q17
- intPart = -(WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(logCurSpectralFlatness, 17);
- intPart += 7; // Shift 7 to get the output in Q10 (from Q17 = -17+10)
- if (intPart > 0)
- {
- currentSpectralFlatness = WEBRTC_SPL_RSHIFT_W32(tmp32, intPart);
- } else
- {
- currentSpectralFlatness = WEBRTC_SPL_LSHIFT_W32(tmp32, -intPart);
- }
-
- //time average update of spectral flatness feature
- tmp32 = currentSpectralFlatness - (WebRtc_Word32)inst->featureSpecFlat; // Q10
- tmp32 = WEBRTC_SPL_MUL_32_16(SPECT_FLAT_TAVG_Q14, tmp32); // Q24
- inst->featureSpecFlat = (WebRtc_UWord32)((WebRtc_Word32)inst->featureSpecFlat
- + WEBRTC_SPL_RSHIFT_W32(tmp32, 14)); // Q10
- // done with flatness feature
-}
-
-
-// Compute the difference measure between input spectrum and a template/learned noise spectrum
-// magn_tmp is the input spectrum
-// the reference/template spectrum is inst->magn_avg_pause[i]
-// returns (normalized) spectral difference in inst->featureSpecDiff
-void WebRtcNsx_ComputeSpectralDifference(NsxInst_t *inst, WebRtc_UWord16 *magnIn)
-{
- // This is to be calculated:
- // avgDiffNormMagn = var(magnIn) - cov(magnIn, magnAvgPause)^2 / var(magnAvgPause)
-
- WebRtc_UWord32 tmpU32no1, tmpU32no2;
- WebRtc_UWord32 varMagnUFX, varPauseUFX, avgDiffNormMagnUFX;
-
- WebRtc_Word32 tmp32no1, tmp32no2;
- WebRtc_Word32 avgPauseFX, avgMagnFX, covMagnPauseFX;
- WebRtc_Word32 maxPause, minPause;
-
- WebRtc_Word16 tmp16no1;
-
- int i, norm32, nShifts;
-
- avgPauseFX = 0;
- maxPause = 0;
- minPause = inst->avgMagnPause[0]; // Q(prevQMagn)
- // compute average quantities
- for (i = 0; i < inst->magnLen; i++)
- {
- // Compute mean of magn_pause
- avgPauseFX += inst->avgMagnPause[i]; // in Q(prevQMagn)
- maxPause = WEBRTC_SPL_MAX(maxPause, inst->avgMagnPause[i]);
- minPause = WEBRTC_SPL_MIN(minPause, inst->avgMagnPause[i]);
- }
- // normalize by replacing div of "inst->magnLen" with "inst->stages-1" shifts
- avgPauseFX = WEBRTC_SPL_RSHIFT_W32(avgPauseFX, inst->stages - 1);
- avgMagnFX = (WebRtc_Word32)WEBRTC_SPL_RSHIFT_U32(inst->sumMagn, inst->stages - 1);
- // Largest possible deviation in magnPause for (co)var calculations
- tmp32no1 = WEBRTC_SPL_MAX(maxPause - avgPauseFX, avgPauseFX - minPause);
- // Get number of shifts to make sure we don't get wrap around in varPause
- nShifts = WEBRTC_SPL_MAX(0, 10 + inst->stages - WebRtcSpl_NormW32(tmp32no1));
-
- varMagnUFX = 0;
- varPauseUFX = 0;
- covMagnPauseFX = 0;
- for (i = 0; i < inst->magnLen; i++)
- {
- // Compute var and cov of magn and magn_pause
- tmp16no1 = (WebRtc_Word16)((WebRtc_Word32)magnIn[i] - avgMagnFX);
- tmp32no2 = inst->avgMagnPause[i] - avgPauseFX;
- varMagnUFX += (WebRtc_UWord32)WEBRTC_SPL_MUL_16_16(tmp16no1, tmp16no1); // Q(2*qMagn)
- tmp32no1 = WEBRTC_SPL_MUL_32_16(tmp32no2, tmp16no1); // Q(prevQMagn+qMagn)
- covMagnPauseFX += tmp32no1; // Q(prevQMagn+qMagn)
- tmp32no1 = WEBRTC_SPL_RSHIFT_W32(tmp32no2, nShifts); // Q(prevQMagn-minPause)
- varPauseUFX += (WebRtc_UWord32)WEBRTC_SPL_MUL(tmp32no1, tmp32no1); // Q(2*(prevQMagn-minPause))
- }
- //update of average magnitude spectrum: Q(-2*stages) and averaging replaced by shifts
- inst->curAvgMagnEnergy += WEBRTC_SPL_RSHIFT_U32(inst->magnEnergy, 2 * inst->normData
- + inst->stages - 1);
-
- avgDiffNormMagnUFX = varMagnUFX; // Q(2*qMagn)
- if ((varPauseUFX) && (covMagnPauseFX))
- {
- tmpU32no1 = (WebRtc_UWord32)WEBRTC_SPL_ABS_W32(covMagnPauseFX); // Q(prevQMagn+qMagn)
- norm32 = WebRtcSpl_NormU32(tmpU32no1) - 16;
- if (norm32 > 0)
- {
- tmpU32no1 = WEBRTC_SPL_LSHIFT_U32(tmpU32no1, norm32); // Q(prevQMagn+qMagn+norm32)
- } else
- {
- tmpU32no1 = WEBRTC_SPL_RSHIFT_U32(tmpU32no1, -norm32); // Q(prevQMagn+qMagn+norm32)
- }
- tmpU32no2 = WEBRTC_SPL_UMUL(tmpU32no1, tmpU32no1); // Q(2*(prevQMagn+qMagn-norm32))
-
- nShifts += norm32;
- nShifts <<= 1;
- if (nShifts < 0)
- {
- varPauseUFX >>= (-nShifts); // Q(2*(qMagn+norm32+minPause))
- nShifts = 0;
- }
- tmpU32no1 = WEBRTC_SPL_UDIV(tmpU32no2, varPauseUFX); // Q(2*(qMagn+norm32-16+minPause))
- tmpU32no1 = WEBRTC_SPL_RSHIFT_U32(tmpU32no1, nShifts);
-
- avgDiffNormMagnUFX -= WEBRTC_SPL_MIN(avgDiffNormMagnUFX, tmpU32no1); // Q(2*qMagn)
- }
- //normalize and compute time average update of difference feature
- tmpU32no1 = WEBRTC_SPL_RSHIFT_U32(avgDiffNormMagnUFX, 2 * inst->normData);
- if (inst->featureSpecDiff > tmpU32no1)
- {
- tmpU32no2 = WEBRTC_SPL_UMUL_32_16(inst->featureSpecDiff - tmpU32no1,
- SPECT_DIFF_TAVG_Q8); // Q(8-2*stages)
- inst->featureSpecDiff -= WEBRTC_SPL_RSHIFT_U32(tmpU32no2, 8); // Q(-2*stages)
- } else
- {
- tmpU32no2 = WEBRTC_SPL_UMUL_32_16(tmpU32no1 - inst->featureSpecDiff,
- SPECT_DIFF_TAVG_Q8); // Q(8-2*stages)
- inst->featureSpecDiff += WEBRTC_SPL_RSHIFT_U32(tmpU32no2, 8); // Q(-2*stages)
- }
-}
-
-// Compute speech/noise probability
-// speech/noise probability is returned in: probSpeechFinal
-//snrLocPrior is the prior SNR for each frequency (in Q11)
-//snrLocPost is the post SNR for each frequency (in Q11)
-void WebRtcNsx_SpeechNoiseProb(NsxInst_t *inst, WebRtc_UWord16 *nonSpeechProbFinal,
- WebRtc_UWord32 *priorLocSnr, WebRtc_UWord32 *postLocSnr)
-{
- WebRtc_UWord32 zeros, num, den, tmpU32no1, tmpU32no2, tmpU32no3;
-
- WebRtc_Word32 invLrtFX, indPriorFX, tmp32, tmp32no1, tmp32no2, besselTmpFX32;
- WebRtc_Word32 frac32, logTmp;
- WebRtc_Word32 logLrtTimeAvgKsumFX;
-
- WebRtc_Word16 indPriorFX16;
- WebRtc_Word16 tmp16, tmp16no1, tmp16no2, tmpIndFX, tableIndex, frac, intPart;
-
- int i, normTmp, normTmp2, nShifts;
-
- // compute feature based on average LR factor
- // this is the average over all frequencies of the smooth log LRT
- logLrtTimeAvgKsumFX = 0;
- for (i = 0; i < inst->magnLen; i++)
- {
- besselTmpFX32 = (WebRtc_Word32)postLocSnr[i]; // Q11
- normTmp = WebRtcSpl_NormU32(postLocSnr[i]);
- num = WEBRTC_SPL_LSHIFT_U32(postLocSnr[i], normTmp); // Q(11+normTmp)
- if (normTmp > 10)
- {
- den = WEBRTC_SPL_LSHIFT_U32(priorLocSnr[i], normTmp - 11); // Q(normTmp)
- } else
- {
- den = WEBRTC_SPL_RSHIFT_U32(priorLocSnr[i], 11 - normTmp); // Q(normTmp)
- }
- besselTmpFX32 -= WEBRTC_SPL_UDIV(num, den); // Q11
-
- // inst->logLrtTimeAvg[i] += LRT_TAVG * (besselTmp - log(snrLocPrior) - inst->logLrtTimeAvg[i]);
- // Here, LRT_TAVG = 0.5
- zeros = WebRtcSpl_NormU32(priorLocSnr[i]);
- frac32 = (WebRtc_Word32)(((priorLocSnr[i] << zeros) & 0x7FFFFFFF) >> 19);
- tmp32 = WEBRTC_SPL_MUL(frac32, frac32);
- tmp32 = WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL(tmp32, -43), 19);
- tmp32 += WEBRTC_SPL_MUL_16_16_RSFT((WebRtc_Word16)frac32, 5412, 12);
- frac32 = tmp32 + 37;
- // tmp32 = log2(priorLocSnr[i])
- tmp32 = (WebRtc_Word32)(((31 - zeros) << 12) + frac32) - (11 << 12); // Q12
- logTmp = WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL_32_16(tmp32, 178), 8); // log2(priorLocSnr[i])*log(2)
- tmp32no1 = WEBRTC_SPL_RSHIFT_W32(logTmp + inst->logLrtTimeAvgW32[i], 1); // Q12
- inst->logLrtTimeAvgW32[i] += (besselTmpFX32 - tmp32no1); // Q12
-
- logLrtTimeAvgKsumFX += inst->logLrtTimeAvgW32[i]; // Q12
- }
- inst->featureLogLrt = WEBRTC_SPL_RSHIFT_W32(logLrtTimeAvgKsumFX * 5, inst->stages + 10); // 5 = BIN_SIZE_LRT / 2
- // done with computation of LR factor
-
- //
- //compute the indicator functions
- //
-
- // average LRT feature
- // FLOAT code
- // indicator0 = 0.5 * (tanh(widthPrior * (logLrtTimeAvgKsum - threshPrior0)) + 1.0);
- tmpIndFX = 16384; // Q14(1.0)
- tmp32no1 = logLrtTimeAvgKsumFX - inst->thresholdLogLrt; // Q12
- nShifts = 7 - inst->stages; // WIDTH_PR_MAP_SHIFT - inst->stages + 5;
- //use larger width in tanh map for pause regions
- if (tmp32no1 < 0)
- {
- tmpIndFX = 0;
- tmp32no1 = -tmp32no1;
- //widthPrior = widthPrior * 2.0;
- nShifts++;
- }
- tmp32no1 = WEBRTC_SPL_SHIFT_W32(tmp32no1, nShifts); // Q14
- // compute indicator function: sigmoid map
- tableIndex = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32no1, 14);
- if ((tableIndex < 16) && (tableIndex >= 0))
- {
- tmp16no2 = kIndicatorTable[tableIndex];
- tmp16no1 = kIndicatorTable[tableIndex + 1] - kIndicatorTable[tableIndex];
- frac = (WebRtc_Word16)(tmp32no1 & 0x00003fff); // Q14
- tmp16no2 += (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(tmp16no1, frac, 14);
- if (tmpIndFX == 0)
- {
- tmpIndFX = 8192 - tmp16no2; // Q14
- } else
- {
- tmpIndFX = 8192 + tmp16no2; // Q14
- }
- }
- indPriorFX = WEBRTC_SPL_MUL_16_16(inst->weightLogLrt, tmpIndFX); // 6*Q14
-
- //spectral flatness feature
- if (inst->weightSpecFlat)
- {
- tmpU32no1 = WEBRTC_SPL_UMUL(inst->featureSpecFlat, 400); // Q10
- tmpIndFX = 16384; // Q14(1.0)
- //use larger width in tanh map for pause regions
- tmpU32no2 = inst->thresholdSpecFlat - tmpU32no1; //Q10
- nShifts = 4;
- if (inst->thresholdSpecFlat < tmpU32no1)
- {
- tmpIndFX = 0;
- tmpU32no2 = tmpU32no1 - inst->thresholdSpecFlat;
- //widthPrior = widthPrior * 2.0;
- nShifts++;
- }
- tmp32no1 = (WebRtc_Word32)WebRtcSpl_DivU32U16(WEBRTC_SPL_LSHIFT_U32(tmpU32no2,
- nShifts), 25); //Q14
- tmpU32no1 = WebRtcSpl_DivU32U16(WEBRTC_SPL_LSHIFT_U32(tmpU32no2, nShifts), 25); //Q14
- // compute indicator function: sigmoid map
- // FLOAT code
- // indicator1 = 0.5 * (tanh(sgnMap * widthPrior * (threshPrior1 - tmpFloat1)) + 1.0);
- tableIndex = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_U32(tmpU32no1, 14);
- if (tableIndex < 16)
- {
- tmp16no2 = kIndicatorTable[tableIndex];
- tmp16no1 = kIndicatorTable[tableIndex + 1] - kIndicatorTable[tableIndex];
- frac = (WebRtc_Word16)(tmpU32no1 & 0x00003fff); // Q14
- tmp16no2 += (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(tmp16no1, frac, 14);
- if (tmpIndFX)
- {
- tmpIndFX = 8192 + tmp16no2; // Q14
- } else
- {
- tmpIndFX = 8192 - tmp16no2; // Q14
- }
- }
- indPriorFX += WEBRTC_SPL_MUL_16_16(inst->weightSpecFlat, tmpIndFX); // 6*Q14
- }
-
- //for template spectral-difference
- if (inst->weightSpecDiff)
- {
- tmpU32no1 = 0;
- if (inst->featureSpecDiff)
- {
- normTmp = WEBRTC_SPL_MIN(20 - inst->stages,
- WebRtcSpl_NormU32(inst->featureSpecDiff));
- tmpU32no1 = WEBRTC_SPL_LSHIFT_U32(inst->featureSpecDiff, normTmp); // Q(normTmp-2*stages)
- tmpU32no2 = WEBRTC_SPL_RSHIFT_U32(inst->timeAvgMagnEnergy, 20 - inst->stages
- - normTmp);
- if (tmpU32no2)
- {
- tmpU32no1 = WEBRTC_SPL_UDIV(tmpU32no1, tmpU32no2); // Q14?? Q(20 - inst->stages)
- } else
- {
- tmpU32no1 = (WebRtc_UWord32)(0x7fffffff);
- }
- }
- tmpU32no3 = WEBRTC_SPL_UDIV(WEBRTC_SPL_LSHIFT_U32(inst->thresholdSpecDiff, 17), 25);
- tmpU32no2 = tmpU32no1 - tmpU32no3;
- nShifts = 1;
- tmpIndFX = 16384; // Q14(1.0)
- //use larger width in tanh map for pause regions
- if (tmpU32no2 & 0x80000000)
- {
- tmpIndFX = 0;
- tmpU32no2 = tmpU32no3 - tmpU32no1;
- //widthPrior = widthPrior * 2.0;
- nShifts--;
- }
- tmpU32no1 = WEBRTC_SPL_RSHIFT_U32(tmpU32no2, nShifts);
- // compute indicator function: sigmoid map
- /* FLOAT code
- indicator2 = 0.5 * (tanh(widthPrior * (tmpFloat1 - threshPrior2)) + 1.0);
- */
- tableIndex = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_U32(tmpU32no1, 14);
- if (tableIndex < 16)
- {
- tmp16no2 = kIndicatorTable[tableIndex];
- tmp16no1 = kIndicatorTable[tableIndex + 1] - kIndicatorTable[tableIndex];
- frac = (WebRtc_Word16)(tmpU32no1 & 0x00003fff); // Q14
- tmp16no2 += (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(tmp16no1, frac,
- 14);
- if (tmpIndFX)
- {
- tmpIndFX = 8192 + tmp16no2;
- } else
- {
- tmpIndFX = 8192 - tmp16no2;
- }
- }
- indPriorFX += WEBRTC_SPL_MUL_16_16(inst->weightSpecDiff, tmpIndFX); // 6*Q14
- }
-
- //combine the indicator function with the feature weights
- // FLOAT code
- // indPrior = 1 - (weightIndPrior0 * indicator0 + weightIndPrior1 * indicator1 + weightIndPrior2 * indicator2);
- indPriorFX16 = WebRtcSpl_DivW32W16ResW16(98307 - indPriorFX, 6); // Q14
- // done with computing indicator function
-
- //compute the prior probability
- // FLOAT code
- // inst->priorNonSpeechProb += PRIOR_UPDATE * (indPriorNonSpeech - inst->priorNonSpeechProb);
- tmp16 = indPriorFX16 - inst->priorNonSpeechProb; // Q14
- inst->priorNonSpeechProb += (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(PRIOR_UPDATE_Q14,
- tmp16, 14); // Q14
-
- //final speech probability: combine prior model with LR factor:
- for (i = 0; i < inst->magnLen; i++)
- {
- // FLOAT code
- // invLrt = exp(inst->logLrtTimeAvg[i]);
- // invLrt = inst->priorSpeechProb * invLrt;
- // nonSpeechProbFinal[i] = (1.0 - inst->priorSpeechProb) / (1.0 - inst->priorSpeechProb + invLrt);
- // invLrt = (1.0 - inst->priorNonSpeechProb) * invLrt;
- // nonSpeechProbFinal[i] = inst->priorNonSpeechProb / (inst->priorNonSpeechProb + invLrt);
- nonSpeechProbFinal[i] = 0; // Q8
- if ((inst->logLrtTimeAvgW32[i] < 65300) && (inst->priorNonSpeechProb > 0))
- {
- tmp32no1 = WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL(inst->logLrtTimeAvgW32[i], 23637),
- 14); // Q12
- intPart = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(tmp32no1, 12);
- if (intPart < -8)
- {
- intPart = -8;
- }
- frac = (WebRtc_Word16)(tmp32no1 & 0x00000fff); // Q12
- // Quadratic approximation of 2^frac
- tmp32no2 = WEBRTC_SPL_RSHIFT_W32(frac * frac * 44, 19); // Q12
- tmp32no2 += WEBRTC_SPL_MUL_16_16_RSFT(frac, 84, 7); // Q12
- invLrtFX = WEBRTC_SPL_LSHIFT_W32(1, 8 + intPart)
- + WEBRTC_SPL_SHIFT_W32(tmp32no2, intPart - 4); // Q8
-
- normTmp = WebRtcSpl_NormW32(invLrtFX);
- normTmp2 = WebRtcSpl_NormW16((16384 - inst->priorNonSpeechProb));
- if (normTmp + normTmp2 < 15)
- {
- invLrtFX = WEBRTC_SPL_RSHIFT_W32(invLrtFX, 15 - normTmp2 - normTmp); // Q(normTmp+normTmp2-7)
- tmp32no1 = WEBRTC_SPL_MUL_32_16(invLrtFX, (16384 - inst->priorNonSpeechProb)); // Q(normTmp+normTmp2+7)
- invLrtFX = WEBRTC_SPL_SHIFT_W32(tmp32no1, 7 - normTmp - normTmp2); // Q14
- } else
- {
- tmp32no1 = WEBRTC_SPL_MUL_32_16(invLrtFX, (16384 - inst->priorNonSpeechProb)); // Q22
- invLrtFX = WEBRTC_SPL_RSHIFT_W32(tmp32no1, 8); // Q14
- }
-
- tmp32no1 = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)inst->priorNonSpeechProb, 8); // Q22
- nonSpeechProbFinal[i] = (WebRtc_UWord16)WEBRTC_SPL_DIV(tmp32no1,
- (WebRtc_Word32)inst->priorNonSpeechProb
- + invLrtFX); // Q8
- if (7 - normTmp - normTmp2 > 0)
- {
- nonSpeechProbFinal[i] = 0; // Q8
- }
- }
- }
-}
-
-// Transform input (speechFrame) to frequency domain magnitude (magnU16)
-void WebRtcNsx_DataAnalysis(NsxInst_t *inst, short *speechFrame, WebRtc_UWord16 *magnU16)
-{
-
- WebRtc_UWord32 tmpU32no1, tmpU32no2;
-
- WebRtc_Word32 tmp_1_w32 = 0;
- WebRtc_Word32 tmp_2_w32 = 0;
- WebRtc_Word32 sum_log_magn = 0;
- WebRtc_Word32 sum_log_i_log_magn = 0;
-
- WebRtc_UWord16 sum_log_magn_u16 = 0;
- WebRtc_UWord16 tmp_u16 = 0;
-
- WebRtc_Word16 sum_log_i = 0;
- WebRtc_Word16 sum_log_i_square = 0;
- WebRtc_Word16 frac = 0;
- WebRtc_Word16 log2 = 0;
- WebRtc_Word16 matrix_determinant = 0;
- WebRtc_Word16 winData[ANAL_BLOCKL_MAX], maxWinData;
- WebRtc_Word16 realImag[ANAL_BLOCKL_MAX << 1];
-
- int i, j;
- int outCFFT;
- int zeros;
- int net_norm = 0;
- int right_shifts_in_magnU16 = 0;
- int right_shifts_in_initMagnEst = 0;
-
- // For lower band do all processing
- // update analysis buffer for L band
- WEBRTC_SPL_MEMCPY_W16(inst->analysisBuffer, inst->analysisBuffer + inst->blockLen10ms,
- inst->anaLen - inst->blockLen10ms);
- WEBRTC_SPL_MEMCPY_W16(inst->analysisBuffer + inst->anaLen - inst->blockLen10ms,
- speechFrame, inst->blockLen10ms);
-
- // Window data before FFT
- for (i = 0; i < inst->anaLen; i++)
- {
- winData[i] = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(inst->window[i],
- inst->analysisBuffer[i],
- 14); // Q0
- }
- // Get input energy
- inst->energyIn = WebRtcSpl_Energy(winData, (int)inst->anaLen, &(inst->scaleEnergyIn));
-
- // Reset zero input flag
- inst->zeroInputSignal = 0;
- // Acquire norm for winData
- maxWinData = WebRtcSpl_MaxAbsValueW16(winData, inst->anaLen);
- inst->normData = WebRtcSpl_NormW16(maxWinData);
- if (maxWinData == 0)
- {
- // Treat zero input separately.
- inst->zeroInputSignal = 1;
- return;
- }
-
- // Determine the net normalization in the frequency domain
- net_norm = inst->stages - inst->normData;
- // Track lowest normalization factor and use it to prevent wrap around in shifting
- right_shifts_in_magnU16 = inst->normData - inst->minNorm;
- right_shifts_in_initMagnEst = WEBRTC_SPL_MAX(-right_shifts_in_magnU16, 0);
- inst->minNorm -= right_shifts_in_initMagnEst;
- right_shifts_in_magnU16 = WEBRTC_SPL_MAX(right_shifts_in_magnU16, 0);
-
- // create realImag as winData interleaved with zeros (= imag. part), normalize it
- for (i = 0; i < inst->anaLen; i++)
- {
- j = WEBRTC_SPL_LSHIFT_W16(i, 1);
- realImag[j] = WEBRTC_SPL_LSHIFT_W16(winData[i], inst->normData); // Q(normData)
- realImag[j + 1] = 0; // Insert zeros in imaginary part
- }
-
- // bit-reverse position of elements in array and FFT the array
- WebRtcSpl_ComplexBitReverse(realImag, inst->stages); // Q(normData-stages)
- outCFFT = WebRtcSpl_ComplexFFT(realImag, inst->stages, 1);
-
- inst->imag[0] = 0; // Q(normData-stages)
- inst->imag[inst->anaLen2] = 0;
- inst->real[0] = realImag[0]; // Q(normData-stages)
- inst->real[inst->anaLen2] = realImag[inst->anaLen];
- // Q(2*(normData-stages))
- inst->magnEnergy = (WebRtc_UWord32)WEBRTC_SPL_MUL_16_16(inst->real[0], inst->real[0]);
- inst->magnEnergy += (WebRtc_UWord32)WEBRTC_SPL_MUL_16_16(inst->real[inst->anaLen2],
- inst->real[inst->anaLen2]);
- magnU16[0] = (WebRtc_UWord16)WEBRTC_SPL_ABS_W16(inst->real[0]); // Q(normData-stages)
- magnU16[inst->anaLen2] = (WebRtc_UWord16)WEBRTC_SPL_ABS_W16(inst->real[inst->anaLen2]);
- inst->sumMagn = (WebRtc_UWord32)magnU16[0]; // Q(normData-stages)
- inst->sumMagn += (WebRtc_UWord32)magnU16[inst->anaLen2];
-
- // Gather information during startup for noise parameter estimation
- if (inst->blockIndex < END_STARTUP_SHORT)
- {
- // Switch initMagnEst to Q(minNorm-stages)
- inst->initMagnEst[0] = WEBRTC_SPL_RSHIFT_U32(inst->initMagnEst[0],
- right_shifts_in_initMagnEst);
- inst->initMagnEst[inst->anaLen2] =
- WEBRTC_SPL_RSHIFT_U32(inst->initMagnEst[inst->anaLen2],
- right_shifts_in_initMagnEst); // Q(minNorm-stages)
-
- // Shift magnU16 to same domain as initMagnEst
- tmpU32no1 = WEBRTC_SPL_RSHIFT_W32((WebRtc_UWord32)magnU16[0],
- right_shifts_in_magnU16); // Q(minNorm-stages)
- tmpU32no2 = WEBRTC_SPL_RSHIFT_W32((WebRtc_UWord32)magnU16[inst->anaLen2],
- right_shifts_in_magnU16); // Q(minNorm-stages)
-
- // Update initMagnEst
- inst->initMagnEst[0] += tmpU32no1; // Q(minNorm-stages)
- inst->initMagnEst[inst->anaLen2] += tmpU32no2; // Q(minNorm-stages)
-
- log2 = 0;
- if (magnU16[inst->anaLen2])
- {
- // Calculate log2(magnU16[inst->anaLen2])
- zeros = WebRtcSpl_NormU32((WebRtc_UWord32)magnU16[inst->anaLen2]);
- frac = (WebRtc_Word16)((((WebRtc_UWord32)magnU16[inst->anaLen2] << zeros) &
- 0x7FFFFFFF) >> 23); // Q8
- // log2(magnU16(i)) in Q8
- log2 = (WebRtc_Word16)(((31 - zeros) << 8) + kLogTableFrac[frac]);
- }
-
- sum_log_magn = (WebRtc_Word32)log2; // Q8
- // sum_log_i_log_magn in Q17
- sum_log_i_log_magn = (WEBRTC_SPL_MUL_16_16(kLogIndex[inst->anaLen2], log2) >> 3);
- }
-
- for (i = 1; i < inst->anaLen2; i++)
- {
- j = WEBRTC_SPL_LSHIFT_W16(i, 1);
- inst->real[i] = realImag[j];
- inst->imag[i] = -realImag[j + 1];
- // magnitude spectrum
- // energy in Q(2*(normData-stages))
- tmpU32no1 = (WebRtc_UWord32)WEBRTC_SPL_MUL_16_16(realImag[j], realImag[j]);
- tmpU32no1 += (WebRtc_UWord32)WEBRTC_SPL_MUL_16_16(realImag[j + 1], realImag[j + 1]);
- inst->magnEnergy += tmpU32no1; // Q(2*(normData-stages))
-
- magnU16[i] = (WebRtc_UWord16)WebRtcSpl_Sqrt(tmpU32no1); // Q(normData-stages)
- inst->sumMagn += (WebRtc_UWord32)magnU16[i]; // Q(normData-stages)
- if (inst->blockIndex < END_STARTUP_SHORT)
- {
- // Switch initMagnEst to Q(minNorm-stages)
- inst->initMagnEst[i] = WEBRTC_SPL_RSHIFT_U32(inst->initMagnEst[i],
- right_shifts_in_initMagnEst);
-
- // Shift magnU16 to same domain as initMagnEst, i.e., Q(minNorm-stages)
- tmpU32no1 = WEBRTC_SPL_RSHIFT_W32((WebRtc_UWord32)magnU16[i],
- right_shifts_in_magnU16);
- // Update initMagnEst
- inst->initMagnEst[i] += tmpU32no1; // Q(minNorm-stages)
-
- if (i >= kStartBand)
- {
- // For pink noise estimation. Collect data neglecting lower frequency band
- log2 = 0;
- if (magnU16[i])
- {
- zeros = WebRtcSpl_NormU32((WebRtc_UWord32)magnU16[i]);
- frac = (WebRtc_Word16)((((WebRtc_UWord32)magnU16[i] << zeros) &
- 0x7FFFFFFF) >> 23);
- // log2(magnU16(i)) in Q8
- log2 = (WebRtc_Word16)(((31 - zeros) << 8) + kLogTableFrac[frac]);
- }
- sum_log_magn += (WebRtc_Word32)log2; // Q8
- // sum_log_i_log_magn in Q17
- sum_log_i_log_magn += (WEBRTC_SPL_MUL_16_16(kLogIndex[i], log2) >> 3);
- }
- }
- }
-
- //compute simplified noise model during startup
- if (inst->blockIndex < END_STARTUP_SHORT)
- {
- // Estimate White noise
- // Switch whiteNoiseLevel to Q(minNorm-stages)
- inst->whiteNoiseLevel = WEBRTC_SPL_RSHIFT_U32(inst->whiteNoiseLevel,
- right_shifts_in_initMagnEst);
-
- // Update the average magnitude spectrum, used as noise estimate.
- tmpU32no1 = WEBRTC_SPL_UMUL_32_16(inst->sumMagn, inst->overdrive);
- tmpU32no1 = WEBRTC_SPL_RSHIFT_U32(tmpU32no1, inst->stages + 8);
-
- // Replacing division above with 'stages' shifts
- // Shift to same Q-domain as whiteNoiseLevel
- tmpU32no1 = WEBRTC_SPL_RSHIFT_U32(tmpU32no1, right_shifts_in_magnU16);
- // This operation is safe from wrap around as long as END_STARTUP_SHORT < 128
- assert(END_STARTUP_SHORT < 128);
- inst->whiteNoiseLevel += tmpU32no1; // Q(minNorm-stages)
-
- // Estimate Pink noise parameters
- // Denominator used in both parameter estimates.
- // The value is only dependent on the size of the frequency band (kStartBand)
- // and to reduce computational complexity stored in a table (kDeterminantEstMatrix[])
- matrix_determinant = kDeterminantEstMatrix[kStartBand]; // Q0
- sum_log_i = kSumLogIndex[kStartBand]; // Q5
- sum_log_i_square = kSumSquareLogIndex[kStartBand]; // Q2
- if (inst->fs == 8000)
- {
- // Adjust values to shorter blocks in narrow band.
- tmp_1_w32 = (WebRtc_Word32)matrix_determinant;
- tmp_1_w32 += WEBRTC_SPL_MUL_16_16_RSFT(kSumLogIndex[65], sum_log_i, 9);
- tmp_1_w32 -= WEBRTC_SPL_MUL_16_16_RSFT(kSumLogIndex[65], kSumLogIndex[65], 10);
- tmp_1_w32 -= WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)sum_log_i_square, 4);
- tmp_1_w32 -= WEBRTC_SPL_MUL_16_16_RSFT((WebRtc_Word16)(inst->magnLen
- - kStartBand), kSumSquareLogIndex[65], 2);
- matrix_determinant = (WebRtc_Word16)tmp_1_w32;
- sum_log_i -= kSumLogIndex[65]; // Q5
- sum_log_i_square -= kSumSquareLogIndex[65]; // Q2
- }
-
- // Necessary number of shifts to fit sum_log_magn in a word16
- zeros = 16 - WebRtcSpl_NormW32(sum_log_magn);
- if (zeros < 0)
- {
- zeros = 0;
- }
- tmp_1_w32 = WEBRTC_SPL_LSHIFT_W32(sum_log_magn, 1); // Q9
- sum_log_magn_u16 = (WebRtc_UWord16)WEBRTC_SPL_RSHIFT_W32(tmp_1_w32, zeros);//Q(9-zeros)
-
- // Calculate and update pinkNoiseNumerator. Result in Q11.
- tmp_2_w32 = WEBRTC_SPL_MUL_16_U16(sum_log_i_square, sum_log_magn_u16); // Q(11-zeros)
- tmpU32no1 = WEBRTC_SPL_RSHIFT_U32((WebRtc_UWord32)sum_log_i_log_magn, 12); // Q5
-
- // Shift the largest value of sum_log_i and tmp32no3 before multiplication
- tmp_u16 = WEBRTC_SPL_LSHIFT_U16((WebRtc_UWord16)sum_log_i, 1); // Q6
- if ((WebRtc_UWord32)sum_log_i > tmpU32no1)
- {
- tmp_u16 = WEBRTC_SPL_RSHIFT_U16(tmp_u16, zeros);
- }
- else
- {
- tmpU32no1 = WEBRTC_SPL_RSHIFT_U32(tmpU32no1, zeros);
- }
- tmp_2_w32 -= (WebRtc_Word32)WEBRTC_SPL_UMUL_32_16(tmpU32no1, tmp_u16); // Q(11-zeros)
- matrix_determinant = WEBRTC_SPL_RSHIFT_W16(matrix_determinant, zeros); // Q(-zeros)
- tmp_2_w32 = WebRtcSpl_DivW32W16(tmp_2_w32, matrix_determinant); // Q11
- tmp_2_w32 += WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)net_norm, 11); // Q11
- if (tmp_2_w32 < 0)
- {
- tmp_2_w32 = 0;
- }
- inst->pinkNoiseNumerator += tmp_2_w32; // Q11
-
- // Calculate and update pinkNoiseExp. Result in Q14.
- tmp_2_w32 = WEBRTC_SPL_MUL_16_U16(sum_log_i, sum_log_magn_u16); // Q(14-zeros)
- tmp_1_w32 = WEBRTC_SPL_RSHIFT_W32(sum_log_i_log_magn, 3 + zeros);
- tmp_1_w32 = WEBRTC_SPL_MUL((WebRtc_Word32)(inst->magnLen - kStartBand),
- tmp_1_w32);
- tmp_2_w32 -= tmp_1_w32; // Q(14-zeros)
- if (tmp_2_w32 > 0)
- {
- // If the exponential parameter is negative force it to zero, which means a
- // flat spectrum.
- tmp_1_w32 = WebRtcSpl_DivW32W16(tmp_2_w32, matrix_determinant); // Q14
- inst->pinkNoiseExp += WEBRTC_SPL_SAT(16384, tmp_1_w32, 0); // Q14
- }
- }
-}
-
-void WebRtcNsx_DataSynthesis(NsxInst_t *inst, short *outFrame)
-{
- WebRtc_Word32 tmp32no1;
- WebRtc_Word32 energyOut;
-
- WebRtc_Word16 realImag[ANAL_BLOCKL_MAX << 1];
- WebRtc_Word16 tmp16no1, tmp16no2;
- WebRtc_Word16 energyRatio;
- WebRtc_Word16 gainFactor, gainFactor1, gainFactor2;
-
- int i, j;
- int outCIFFT;
- int scaleEnergyOut = 0;
-
- if (inst->zeroInputSignal)
- {
- // synthesize the special case of zero input
- // read out fully processed segment
- for (i = 0; i < inst->blockLen10ms; i++)
- {
- outFrame[i] = inst->synthesisBuffer[i]; // Q0
- }
- // update synthesis buffer
- WEBRTC_SPL_MEMCPY_W16(inst->synthesisBuffer,
- inst->synthesisBuffer + inst->blockLen10ms,
- inst->anaLen - inst->blockLen10ms);
- WebRtcSpl_ZerosArrayW16(inst->synthesisBuffer + inst->anaLen - inst->blockLen10ms,
- inst->blockLen10ms);
- return;
- }
- // Filter the data in the frequency domain
- for (i = 0; i < inst->magnLen; i++)
- {
- inst->real[i] = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(inst->real[i],
- (WebRtc_Word16)(inst->noiseSupFilter[i]), 14); // Q(normData-stages)
- inst->imag[i] = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(inst->imag[i],
- (WebRtc_Word16)(inst->noiseSupFilter[i]), 14); // Q(normData-stages)
- }
- // back to time domain
- // Create spectrum
- realImag[0] = inst->real[0];
- realImag[1] = -inst->imag[0];
- for (i = 1; i < inst->anaLen2; i++)
- {
- j = WEBRTC_SPL_LSHIFT_W16(i, 1);
- tmp16no1 = (inst->anaLen << 1) - j;
- realImag[j] = inst->real[i];
- realImag[j + 1] = -inst->imag[i];
- realImag[tmp16no1] = inst->real[i];
- realImag[tmp16no1 + 1] = inst->imag[i];
- }
- realImag[inst->anaLen] = inst->real[inst->anaLen2];
- realImag[inst->anaLen + 1] = -inst->imag[inst->anaLen2];
-
- // bit-reverse position of elements in array and IFFT it
- WebRtcSpl_ComplexBitReverse(realImag, inst->stages);
- outCIFFT = WebRtcSpl_ComplexIFFT(realImag, inst->stages, 1);
-
- for (i = 0; i < inst->anaLen; i++)
- {
- j = WEBRTC_SPL_LSHIFT_W16(i, 1);
- tmp32no1 = WEBRTC_SPL_SHIFT_W32((WebRtc_Word32)realImag[j], outCIFFT - inst->normData);
- inst->real[i] = (WebRtc_Word16)WEBRTC_SPL_SAT(WEBRTC_SPL_WORD16_MAX, tmp32no1,
- WEBRTC_SPL_WORD16_MIN);
- }
-
- //scale factor: only do it after END_STARTUP_LONG time
- gainFactor = 8192; // 8192 = Q13(1.0)
- if (inst->gainMap == 1 &&
- inst->blockIndex > END_STARTUP_LONG &&
- inst->energyIn > 0)
- {
- energyOut = WebRtcSpl_Energy(inst->real, (int)inst->anaLen, &scaleEnergyOut); // Q(-scaleEnergyOut)
- if (scaleEnergyOut == 0 && !(energyOut & 0x7f800000))
- {
- energyOut = WEBRTC_SPL_SHIFT_W32(energyOut, 8 + scaleEnergyOut
- - inst->scaleEnergyIn);
- } else
- {
- inst->energyIn = WEBRTC_SPL_RSHIFT_W32(inst->energyIn, 8 + scaleEnergyOut
- - inst->scaleEnergyIn); // Q(-8-scaleEnergyOut)
- }
-
- assert(inst->energyIn > 0);
- energyRatio = (WebRtc_Word16)WEBRTC_SPL_DIV(energyOut
- + WEBRTC_SPL_RSHIFT_W32(inst->energyIn, 1), inst->energyIn); // Q8
-
- // // original FLOAT code
- // if (gain > blim) {
- // factor1=1.0+1.3*(gain-blim);
- // if (gain*factor1 > 1.0) { // FLOAT
- // factor1 = 1.0/gain; // FLOAT
- // }
- // }
- // else {
- // factor1=1.0; // FLOAT
- // }
- //
- // if (gain > blim) {
- // factor2=1.0; //FLOAT
- // }
- // else {
- // //don't reduce scale too much for pause regions: attenuation here should be controlled by flooring
- // factor2=1.0-0.3*(blim-gain); // FLOAT
- // if (gain <= inst->denoiseBound) {
- // factor2=1.0-0.3*(blim-inst->denoiseBound); // FLOAT
- // }
- // }
-
- // all done in lookup tables now
- gainFactor1 = kFactor1Table[energyRatio]; // Q8
- gainFactor2 = inst->factor2Table[energyRatio]; // Q8
-
- //combine both scales with speech/noise prob: note prior (priorSpeechProb) is not frequency dependent
-
- // factor = inst->priorSpeechProb*factor1 + (1.0-inst->priorSpeechProb)*factor2; // original code
- tmp16no1 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(16384 - inst->priorNonSpeechProb,
- gainFactor1, 14); // Q13 16384 = Q14(1.0)
- tmp16no2 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(inst->priorNonSpeechProb,
- gainFactor2, 14); // Q13;
- gainFactor = tmp16no1 + tmp16no2; // Q13
- } // out of flag_gain_map==1
-
- // synthesis
- for (i = 0; i < inst->anaLen; i++)
- {
- tmp16no1 = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(inst->window[i],
- inst->real[i], 14); // Q0, window in Q14
- tmp32no1 = WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(tmp16no1, gainFactor, 13); // Q0
- // Down shift with rounding
- tmp16no2 = (WebRtc_Word16)WEBRTC_SPL_SAT(WEBRTC_SPL_WORD16_MAX, tmp32no1,
- WEBRTC_SPL_WORD16_MIN); // Q0
- inst->synthesisBuffer[i] = WEBRTC_SPL_ADD_SAT_W16(inst->synthesisBuffer[i], tmp16no2); // Q0
- }
-
- // read out fully processed segment
- for (i = 0; i < inst->blockLen10ms; i++)
- {
- outFrame[i] = inst->synthesisBuffer[i]; // Q0
- }
- // update synthesis buffer
- WEBRTC_SPL_MEMCPY_W16(inst->synthesisBuffer, inst->synthesisBuffer + inst->blockLen10ms,
- inst->anaLen - inst->blockLen10ms);
- WebRtcSpl_ZerosArrayW16(inst->synthesisBuffer + inst->anaLen - inst->blockLen10ms,
- inst->blockLen10ms);
-}
-
-int WebRtcNsx_ProcessCore(NsxInst_t *inst, short *speechFrame, short *speechFrameHB,
- short *outFrame, short *outFrameHB)
-{
- // main routine for noise suppression
-
- WebRtc_UWord32 tmpU32no1, tmpU32no2, tmpU32no3;
- WebRtc_UWord32 satMax, maxNoiseU32;
- WebRtc_UWord32 tmpMagnU32, tmpNoiseU32;
- WebRtc_UWord32 nearMagnEst;
- WebRtc_UWord32 noiseUpdateU32;
- WebRtc_UWord32 noiseU32[HALF_ANAL_BLOCKL];
- WebRtc_UWord32 postLocSnr[HALF_ANAL_BLOCKL];
- WebRtc_UWord32 priorLocSnr[HALF_ANAL_BLOCKL];
- WebRtc_UWord32 prevNearSnr[HALF_ANAL_BLOCKL];
- WebRtc_UWord32 curNearSnr;
- WebRtc_UWord32 priorSnr;
- WebRtc_UWord32 noise_estimate = 0;
- WebRtc_UWord32 noise_estimate_avg = 0;
- WebRtc_UWord32 numerator = 0;
-
- WebRtc_Word32 tmp32no1, tmp32no2;
- WebRtc_Word32 pink_noise_num_avg = 0;
-
- WebRtc_UWord16 tmpU16no1;
- WebRtc_UWord16 magnU16[HALF_ANAL_BLOCKL];
- WebRtc_UWord16 prevNoiseU16[HALF_ANAL_BLOCKL];
- WebRtc_UWord16 nonSpeechProbFinal[HALF_ANAL_BLOCKL];
- WebRtc_UWord16 gammaNoise, prevGammaNoise;
- WebRtc_UWord16 noiseSupFilterTmp[HALF_ANAL_BLOCKL];
-
- WebRtc_Word16 qMagn, qNoise;
- WebRtc_Word16 avgProbSpeechHB, gainModHB, avgFilterGainHB, gainTimeDomainHB;
- WebRtc_Word16 tmp16no1;
- WebRtc_Word16 int_part = 0;
- WebRtc_Word16 frac_part = 0;
- WebRtc_Word16 pink_noise_exp_avg = 0;
-
- int i;
- int nShifts, postShifts;
- int norm32no1, norm32no2;
- int flag, sign;
- int q_domain_to_use = 0;
-
-#ifdef NS_FILEDEBUG
- fwrite(spframe, sizeof(short), inst->blockLen10ms, inst->infile);
-#endif
-
- // Check that initialization has been done
- if (inst->initFlag != 1)
- {
- return -1;
- }
- // Check for valid pointers based on sampling rate
- if ((inst->fs == 32000) && (speechFrameHB == NULL))
- {
- return -1;
- }
-
- // Store speechFrame and transform to frequency domain
- WebRtcNsx_DataAnalysis(inst, speechFrame, magnU16);
-
- if (inst->zeroInputSignal)
- {
- WebRtcNsx_DataSynthesis(inst, outFrame);
-
- if (inst->fs == 32000)
- {
- // update analysis buffer for H band
- // append new data to buffer FX
- WEBRTC_SPL_MEMCPY_W16(inst->dataBufHBFX, inst->dataBufHBFX + inst->blockLen10ms,
- inst->anaLen - inst->blockLen10ms);
- WEBRTC_SPL_MEMCPY_W16(inst->dataBufHBFX + inst->anaLen - inst->blockLen10ms,
- speechFrameHB, inst->blockLen10ms);
- for (i = 0; i < inst->blockLen10ms; i++)
- {
- outFrameHB[i] = inst->dataBufHBFX[i]; // Q0
- }
- } // end of H band gain computation
- return 0;
- }
-
- // Update block index when we have something to process
- inst->blockIndex++;
- //
-
- // Norm of magn
- qMagn = inst->normData - inst->stages;
-
- // Compute spectral flatness on input spectrum
- WebRtcNsx_ComputeSpectralFlatness(inst, magnU16);
-
- // quantile noise estimate
- WebRtcNsx_NoiseEstimation(inst, magnU16, noiseU32, &qNoise);
-
- //noise estimate from previous frame
- for (i = 0; i < inst->magnLen; i++)
- {
- prevNoiseU16[i] = (WebRtc_UWord16)WEBRTC_SPL_RSHIFT_U32(inst->prevNoiseU32[i], 11); // Q(prevQNoise)
- }
-
- if (inst->blockIndex < END_STARTUP_SHORT)
- {
- // Noise Q-domain to be used later; see description at end of section.
- q_domain_to_use = WEBRTC_SPL_MIN((int)qNoise, inst->minNorm - inst->stages);
-
- // Calculate frequency independent parts in parametric noise estimate and calculate
- // the estimate for the lower frequency band (same values for all frequency bins)
- if (inst->pinkNoiseExp)
- {
- pink_noise_exp_avg = (WebRtc_Word16)WebRtcSpl_DivW32W16(inst->pinkNoiseExp,
- (WebRtc_Word16)(inst->blockIndex + 1)); // Q14
- pink_noise_num_avg = WebRtcSpl_DivW32W16(inst->pinkNoiseNumerator,
- (WebRtc_Word16)(inst->blockIndex + 1)); // Q11
- WebRtcNsx_CalcParametricNoiseEstimate(inst,
- pink_noise_exp_avg,
- pink_noise_num_avg,
- kStartBand,
- &noise_estimate,
- &noise_estimate_avg);
- }
- else
- {
- // Use white noise estimate if we have poor pink noise parameter estimates
- noise_estimate = inst->whiteNoiseLevel; // Q(minNorm-stages)
- noise_estimate_avg = noise_estimate / (inst->blockIndex + 1); // Q(minNorm-stages)
- }
- for (i = 0; i < inst->magnLen; i++)
- {
- // Estimate the background noise using the pink noise parameters if permitted
- if ((inst->pinkNoiseExp) && (i >= kStartBand))
- {
- // Reset noise_estimate
- noise_estimate = 0;
- noise_estimate_avg = 0;
- // Calculate the parametric noise estimate for current frequency bin
- WebRtcNsx_CalcParametricNoiseEstimate(inst,
- pink_noise_exp_avg,
- pink_noise_num_avg,
- i,
- &noise_estimate,
- &noise_estimate_avg);
- }
- // Calculate parametric Wiener filter
- noiseSupFilterTmp[i] = inst->denoiseBound;
- if (inst->initMagnEst[i])
- {
- // numerator = (initMagnEst - noise_estimate * overdrive)
- // Result in Q(8+minNorm-stages)
- tmpU32no1 = WEBRTC_SPL_UMUL_32_16(noise_estimate, inst->overdrive);
- numerator = WEBRTC_SPL_LSHIFT_U32(inst->initMagnEst[i], 8);
- if (numerator > tmpU32no1)
- {
- // Suppression filter coefficient larger than zero, so calculate.
- numerator -= tmpU32no1;
-
- // Determine number of left shifts in numerator for best accuracy after
- // division
- nShifts = WebRtcSpl_NormU32(numerator);
- nShifts = WEBRTC_SPL_SAT(6, nShifts, 0);
-
- // Shift numerator to Q(nShifts+8+minNorm-stages)
- numerator = WEBRTC_SPL_LSHIFT_U32(numerator, nShifts);
-
- // Shift denominator to Q(nShifts-6+minNorm-stages)
- tmpU32no1 = WEBRTC_SPL_RSHIFT_U32(inst->initMagnEst[i], 6 - nShifts);
- tmpU32no2 = WEBRTC_SPL_UDIV(numerator, tmpU32no1); // Q14
- noiseSupFilterTmp[i] = (WebRtc_UWord16)WEBRTC_SPL_SAT(16384, tmpU32no2,
- (WebRtc_UWord32)(inst->denoiseBound)); // Q14
- }
- }
- // Weight quantile noise 'noiseU32' with modeled noise 'noise_estimate_avg'
- // 'noiseU32 is in Q(qNoise) and 'noise_estimate' in Q(minNorm-stages)
- // To guarantee that we do not get wrap around when shifting to the same domain
- // we use the lowest one. Furthermore, we need to save 6 bits for the weighting.
- // 'noise_estimate_avg' can handle this operation by construction, but 'noiseU32'
- // may not.
-
- // Shift 'noiseU32' to 'q_domain_to_use'
- tmpU32no1 = WEBRTC_SPL_RSHIFT_U32(noiseU32[i], (int)qNoise - q_domain_to_use);
- // Shift 'noise_estimate_avg' to 'q_domain_to_use'
- tmpU32no2 = WEBRTC_SPL_RSHIFT_U32(noise_estimate_avg, inst->minNorm - inst->stages
- - q_domain_to_use);
- // Make a simple check to see if we have enough room for weighting 'tmpU32no1'
- // without wrap around
- nShifts = 0;
- if (tmpU32no1 & 0xfc000000) {
- tmpU32no1 = WEBRTC_SPL_RSHIFT_U32(tmpU32no1, 6);
- tmpU32no2 = WEBRTC_SPL_RSHIFT_U32(tmpU32no2, 6);
- nShifts = 6;
- }
- // Add them together and divide by startup length
- noiseU32[i] = WebRtcSpl_DivU32U16(tmpU32no1 + tmpU32no2, END_STARTUP_SHORT);
- // Shift back if necessary
- noiseU32[i] = WEBRTC_SPL_LSHIFT_U32(noiseU32[i], nShifts);
- }
- // Update new Q-domain for 'noiseU32'
- qNoise = q_domain_to_use;
- }
- // compute average signal during END_STARTUP_LONG time:
- // used to normalize spectral difference measure
- if (inst->blockIndex < END_STARTUP_LONG)
- {
- // substituting division with shift ending up in Q(-2*stages)
- inst->timeAvgMagnEnergyTmp
- += WEBRTC_SPL_RSHIFT_U32(inst->magnEnergy,
- 2 * inst->normData + inst->stages - 1);
- inst->timeAvgMagnEnergy = WebRtcSpl_DivU32U16(inst->timeAvgMagnEnergyTmp,
- inst->blockIndex + 1);
- }
-
- //start processing at frames == converged+1
- // STEP 1: compute prior and post SNR based on quantile noise estimates
-
- // compute direct decision (DD) estimate of prior SNR: needed for new method
- satMax = (WebRtc_UWord32)1048575;// Largest possible value without getting overflow despite shifting 12 steps
- postShifts = 6 + qMagn - qNoise;
- nShifts = 5 - inst->prevQMagn + inst->prevQNoise;
- for (i = 0; i < inst->magnLen; i++)
- {
- // FLOAT:
- // post SNR
- // postLocSnr[i] = 0.0;
- // if (magn[i] > noise[i])
- // {
- // postLocSnr[i] = magn[i] / (noise[i] + 0.0001);
- // }
- // // previous post SNR
- // // previous estimate: based on previous frame with gain filter (smooth is previous filter)
- //
- // prevNearSnr[i] = inst->prevMagnU16[i] / (inst->noisePrev[i] + 0.0001) * (inst->smooth[i]);
- //
- // // DD estimate is sum of two terms: current estimate and previous estimate
- // // directed decision update of priorSnr (or we actually store [2*priorSnr+1])
- //
- // priorLocSnr[i] = DD_PR_SNR * prevNearSnr[i] + (1.0 - DD_PR_SNR) * (postLocSnr[i] - 1.0);
-
- // calculate post SNR: output in Q11
- postLocSnr[i] = 2048; // 1.0 in Q11
- tmpU32no1 = WEBRTC_SPL_LSHIFT_U32((WebRtc_UWord32)magnU16[i], 6); // Q(6+qMagn)
- if (postShifts < 0)
- {
- tmpU32no2 = WEBRTC_SPL_RSHIFT_U32(noiseU32[i], -postShifts); // Q(6+qMagn)
- } else
- {
- tmpU32no2 = WEBRTC_SPL_LSHIFT_U32(noiseU32[i], postShifts); // Q(6+qMagn)
- }
- if (tmpU32no1 > tmpU32no2)
- {
- // Current magnitude larger than noise
- tmpU32no1 = WEBRTC_SPL_LSHIFT_U32(tmpU32no1, 11); // Q(17+qMagn)
- if (tmpU32no2)
- {
- tmpU32no1 = WEBRTC_SPL_UDIV(tmpU32no1, tmpU32no2); // Q11
- postLocSnr[i] = WEBRTC_SPL_MIN(satMax, tmpU32no1); // Q11
- } else
- {
- postLocSnr[i] = satMax;
- }
- }
-
- // calculate prevNearSnr[i] and save for later instead of recalculating it later
- nearMagnEst = WEBRTC_SPL_UMUL_16_16(inst->prevMagnU16[i], inst->noiseSupFilter[i]); // Q(prevQMagn+14)
- tmpU32no1 = WEBRTC_SPL_LSHIFT_U32(nearMagnEst, 3); // Q(prevQMagn+17)
- tmpU32no2 = WEBRTC_SPL_RSHIFT_U32(inst->prevNoiseU32[i], nShifts); // Q(prevQMagn+6)
-
- if (tmpU32no2)
- {
- tmpU32no1 = WEBRTC_SPL_DIV(tmpU32no1, tmpU32no2); // Q11
- tmpU32no1 = WEBRTC_SPL_MIN(satMax, tmpU32no1); // Q11
- } else
- {
- tmpU32no1 = satMax; // Q11
- }
- prevNearSnr[i] = tmpU32no1; // Q11
-
- //directed decision update of priorSnr
- tmpU32no1 = WEBRTC_SPL_UMUL_32_16(prevNearSnr[i], DD_PR_SNR_Q11); // Q22
- tmpU32no2 = WEBRTC_SPL_UMUL_32_16(postLocSnr[i] - 2048, ONE_MINUS_DD_PR_SNR_Q11); // Q22
- priorSnr = tmpU32no1 + tmpU32no2 + 512; // Q22 (added 512 for rounding)
- // priorLocSnr = 1 + 2*priorSnr
- priorLocSnr[i] = 2048 + WEBRTC_SPL_RSHIFT_U32(priorSnr, 10); // Q11
- } // end of loop over frequencies
- // done with step 1: DD computation of prior and post SNR
-
- // STEP 2: compute speech/noise likelihood
-
- //compute difference of input spectrum with learned/estimated noise spectrum
- WebRtcNsx_ComputeSpectralDifference(inst, magnU16);
- //compute histograms for determination of parameters (thresholds and weights for features)
- //parameters are extracted once every window time (=inst->modelUpdate)
- //counter update
- inst->cntThresUpdate++;
- flag = (int)(inst->cntThresUpdate == inst->modelUpdate);
- //update histogram
- WebRtcNsx_FeatureParameterExtraction(inst, flag);
- //compute model parameters
- if (flag)
- {
- inst->cntThresUpdate = 0; // Reset counter
- //update every window:
- // get normalization for spectral difference for next window estimate
-
- // Shift to Q(-2*stages)
- inst->curAvgMagnEnergy = WEBRTC_SPL_RSHIFT_U32(inst->curAvgMagnEnergy, STAT_UPDATES);
-
- tmpU32no1 = (inst->curAvgMagnEnergy + inst->timeAvgMagnEnergy + 1) >> 1; //Q(-2*stages)
- // Update featureSpecDiff
- if ((tmpU32no1 != inst->timeAvgMagnEnergy) && (inst->featureSpecDiff))
- {
- norm32no1 = 0;
- tmpU32no3 = tmpU32no1;
- while (0xFFFF0000 & tmpU32no3)
- {
- tmpU32no3 >>= 1;
- norm32no1++;
- }
- tmpU32no2 = inst->featureSpecDiff;
- while (0xFFFF0000 & tmpU32no2)
- {
- tmpU32no2 >>= 1;
- norm32no1++;
- }
- tmpU32no3 = WEBRTC_SPL_UMUL(tmpU32no3, tmpU32no2);
- tmpU32no3 = WEBRTC_SPL_UDIV(tmpU32no3, inst->timeAvgMagnEnergy);
- if (WebRtcSpl_NormU32(tmpU32no3) < norm32no1)
- {
- inst->featureSpecDiff = 0x007FFFFF;
- } else
- {
- inst->featureSpecDiff = WEBRTC_SPL_MIN(0x007FFFFF,
- WEBRTC_SPL_LSHIFT_U32(tmpU32no3, norm32no1));
- }
- }
-
- inst->timeAvgMagnEnergy = tmpU32no1; // Q(-2*stages)
- inst->curAvgMagnEnergy = 0;
- }
-
- //compute speech/noise probability
- WebRtcNsx_SpeechNoiseProb(inst, nonSpeechProbFinal, priorLocSnr, postLocSnr);
-
- //time-avg parameter for noise update
- gammaNoise = NOISE_UPDATE_Q8; // Q8
-
- maxNoiseU32 = 0;
- postShifts = inst->prevQNoise - qMagn;
- nShifts = inst->prevQMagn - qMagn;
- for (i = 0; i < inst->magnLen; i++)
- {
- // temporary noise update: use it for speech frames if update value is less than previous
- // the formula has been rewritten into:
- // noiseUpdate = noisePrev[i] + (1 - gammaNoise) * nonSpeechProb * (magn[i] - noisePrev[i])
-
- if (postShifts < 0)
- {
- tmpU32no2 = WEBRTC_SPL_RSHIFT_U32(magnU16[i], -postShifts); // Q(prevQNoise)
- } else
- {
- tmpU32no2 = WEBRTC_SPL_LSHIFT_U32(magnU16[i], postShifts); // Q(prevQNoise)
- }
- if (prevNoiseU16[i] > tmpU32no2)
- {
- sign = -1;
- tmpU32no1 = prevNoiseU16[i] - tmpU32no2;
- } else
- {
- sign = 1;
- tmpU32no1 = tmpU32no2 - prevNoiseU16[i];
- }
- noiseUpdateU32 = inst->prevNoiseU32[i]; // Q(prevQNoise+11)
- tmpU32no3 = 0;
- if ((tmpU32no1) && (nonSpeechProbFinal[i]))
- {
- // This value will be used later, if gammaNoise changes
- tmpU32no3 = WEBRTC_SPL_UMUL_32_16(tmpU32no1, nonSpeechProbFinal[i]); // Q(prevQNoise+8)
- if (0x7c000000 & tmpU32no3)
- {
- // Shifting required before multiplication
- tmpU32no2
- = WEBRTC_SPL_UMUL_32_16(WEBRTC_SPL_RSHIFT_U32(tmpU32no3, 5), gammaNoise); // Q(prevQNoise+11)
- } else
- {
- // We can do shifting after multiplication
- tmpU32no2
- = WEBRTC_SPL_RSHIFT_U32(WEBRTC_SPL_UMUL_32_16(tmpU32no3, gammaNoise), 5); // Q(prevQNoise+11)
- }
- if (sign > 0)
- {
- noiseUpdateU32 += tmpU32no2; // Q(prevQNoise+11)
- } else
- {
- // This operation is safe. We can never get wrap around, since worst
- // case scenario means magnU16 = 0
- noiseUpdateU32 -= tmpU32no2; // Q(prevQNoise+11)
- }
- }
-
- //increase gamma (i.e., less noise update) for frame likely to be speech
- prevGammaNoise = gammaNoise;
- gammaNoise = NOISE_UPDATE_Q8;
- //time-constant based on speech/noise state
- //increase gamma (i.e., less noise update) for frames likely to be speech
- if (nonSpeechProbFinal[i] < ONE_MINUS_PROB_RANGE_Q8)
- {
- gammaNoise = GAMMA_NOISE_TRANS_AND_SPEECH_Q8;
- }
-
- if (prevGammaNoise != gammaNoise)
- {
- // new noise update
- // this line is the same as above, only that the result is stored in a different variable and the gammaNoise
- // has changed
- //
- // noiseUpdate = noisePrev[i] + (1 - gammaNoise) * nonSpeechProb * (magn[i] - noisePrev[i])
-
- if (0x7c000000 & tmpU32no3)
- {
- // Shifting required before multiplication
- tmpU32no2
- = WEBRTC_SPL_UMUL_32_16(WEBRTC_SPL_RSHIFT_U32(tmpU32no3, 5), gammaNoise); // Q(prevQNoise+11)
- } else
- {
- // We can do shifting after multiplication
- tmpU32no2
- = WEBRTC_SPL_RSHIFT_U32(WEBRTC_SPL_UMUL_32_16(tmpU32no3, gammaNoise), 5); // Q(prevQNoise+11)
- }
- if (sign > 0)
- {
- tmpU32no1 = inst->prevNoiseU32[i] + tmpU32no2; // Q(prevQNoise+11)
- } else
- {
- tmpU32no1 = inst->prevNoiseU32[i] - tmpU32no2; // Q(prevQNoise+11)
- }
- if (noiseUpdateU32 > tmpU32no1)
- {
- noiseUpdateU32 = tmpU32no1; // Q(prevQNoise+11)
- }
- }
- noiseU32[i] = noiseUpdateU32; // Q(prevQNoise+11)
- if (noiseUpdateU32 > maxNoiseU32)
- {
- maxNoiseU32 = noiseUpdateU32;
- }
-
- // conservative noise update
- // // original FLOAT code
- // if (prob_speech < PROB_RANGE) {
- // inst->avgMagnPause[i] = inst->avgMagnPause[i] + (1.0 - gamma_pause)*(magn[i] - inst->avgMagnPause[i]);
- // }
-
- tmp32no2 = WEBRTC_SPL_SHIFT_W32(inst->avgMagnPause[i], -nShifts);
- if (nonSpeechProbFinal[i] > ONE_MINUS_PROB_RANGE_Q8)
- {
- if (nShifts < 0)
- {
- tmp32no1 = (WebRtc_Word32)magnU16[i] - tmp32no2; // Q(qMagn)
- tmp32no1 = WEBRTC_SPL_MUL_32_16(tmp32no1, ONE_MINUS_GAMMA_PAUSE_Q8); // Q(8+prevQMagn+nShifts)
- tmp32no1 = WEBRTC_SPL_RSHIFT_W32(tmp32no1 + 128, 8); // Q(qMagn)
- } else
- {
- tmp32no1 = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32)magnU16[i], nShifts)
- - inst->avgMagnPause[i]; // Q(qMagn+nShifts)
- tmp32no1 = WEBRTC_SPL_MUL_32_16(tmp32no1, ONE_MINUS_GAMMA_PAUSE_Q8); // Q(8+prevQMagn+nShifts)
- tmp32no1 = WEBRTC_SPL_RSHIFT_W32(tmp32no1 + (128 << nShifts), 8 + nShifts); // Q(qMagn)
- }
- tmp32no2 += tmp32no1; // Q(qMagn)
- }
- inst->avgMagnPause[i] = tmp32no2;
- } // end of frequency loop
-
- norm32no1 = WebRtcSpl_NormU32(maxNoiseU32);
- qNoise = inst->prevQNoise + norm32no1 - 5;
- // done with step 2: noise update
-
- // STEP 3: compute dd update of prior snr and post snr based on new noise estimate
- nShifts = inst->prevQNoise + 11 - qMagn;
- for (i = 0; i < inst->magnLen; i++)
- {
- // FLOAT code
- // // post and prior SNR
- // curNearSnr = 0.0;
- // if (magn[i] > noise[i])
- // {
- // curNearSnr = magn[i] / (noise[i] + 0.0001) - 1.0;
- // }
- // // DD estimate is sum of two terms: current estimate and previous estimate
- // // directed decision update of snrPrior
- // snrPrior = DD_PR_SNR * prevNearSnr[i] + (1.0 - DD_PR_SNR) * curNearSnr;
- // // gain filter
- // tmpFloat1 = inst->overdrive + snrPrior;
- // tmpFloat2 = snrPrior / tmpFloat1;
- // theFilter[i] = tmpFloat2;
-
- // calculate curNearSnr again, this is necessary because a new noise estimate has been made since then. for the original
- curNearSnr = 0; // Q11
- if (nShifts < 0)
- {
- // This case is equivalent with magn < noise which implies curNearSnr = 0;
- tmpMagnU32 = (WebRtc_UWord32)magnU16[i]; // Q(qMagn)
- tmpNoiseU32 = WEBRTC_SPL_LSHIFT_U32(noiseU32[i], -nShifts); // Q(qMagn)
- } else if (nShifts > 17)
- {
- tmpMagnU32 = WEBRTC_SPL_LSHIFT_U32(magnU16[i], 17); // Q(qMagn+17)
- tmpNoiseU32 = WEBRTC_SPL_RSHIFT_U32(noiseU32[i], nShifts - 17); // Q(qMagn+17)
- } else
- {
- tmpMagnU32 = WEBRTC_SPL_LSHIFT_U32((WebRtc_UWord32)magnU16[i], nShifts); // Q(qNoise_prev+11)
- tmpNoiseU32 = noiseU32[i]; // Q(qNoise_prev+11)
- }
- if (tmpMagnU32 > tmpNoiseU32)
- {
- tmpU32no1 = tmpMagnU32 - tmpNoiseU32; // Q(qCur)
- norm32no2 = WEBRTC_SPL_MIN(11, WebRtcSpl_NormU32(tmpU32no1));
- tmpU32no1 = WEBRTC_SPL_LSHIFT_U32(tmpU32no1, norm32no2); // Q(qCur+norm32no2)
- tmpU32no2 = WEBRTC_SPL_RSHIFT_U32(tmpNoiseU32, 11 - norm32no2); // Q(qCur+norm32no2-11)
- if (tmpU32no2)
- {
- tmpU32no1 = WEBRTC_SPL_UDIV(tmpU32no1, tmpU32no2); // Q11
- }
- curNearSnr = WEBRTC_SPL_MIN(satMax, tmpU32no1); // Q11
- }
-
- //directed decision update of priorSnr
- // FLOAT
- // priorSnr = DD_PR_SNR * prevNearSnr + (1.0-DD_PR_SNR) * curNearSnr;
-
- tmpU32no1 = WEBRTC_SPL_UMUL_32_16(prevNearSnr[i], DD_PR_SNR_Q11); // Q22
- tmpU32no2 = WEBRTC_SPL_UMUL_32_16(curNearSnr, ONE_MINUS_DD_PR_SNR_Q11); // Q22
- priorSnr = tmpU32no1 + tmpU32no2; // Q22
-
- //gain filter
- tmpU32no1 = (WebRtc_UWord32)(inst->overdrive)
- + WEBRTC_SPL_RSHIFT_U32(priorSnr + 8192, 14); // Q8
- tmpU16no1 = (WebRtc_UWord16)WEBRTC_SPL_UDIV(priorSnr + (tmpU32no1 >> 1), tmpU32no1); // Q14
- inst->noiseSupFilter[i] = WEBRTC_SPL_SAT(16384, tmpU16no1, inst->denoiseBound); // 16384 = Q14(1.0) // Q14
-
- // Weight in the parametric Wiener filter during startup
- if (inst->blockIndex < END_STARTUP_SHORT)
- {
- // Weight the two suppression filters
- tmpU32no1 = WEBRTC_SPL_UMUL_16_16(inst->noiseSupFilter[i],
- (WebRtc_UWord16)inst->blockIndex);
- tmpU32no2 = WEBRTC_SPL_UMUL_16_16(noiseSupFilterTmp[i],
- (WebRtc_UWord16)(END_STARTUP_SHORT
- - inst->blockIndex));
- tmpU32no1 += tmpU32no2;
- inst->noiseSupFilter[i] = (WebRtc_UWord16)WebRtcSpl_DivU32U16(tmpU32no1,
- END_STARTUP_SHORT);
- }
- } // end of loop over frequencies
- //done with step3
-
- // save noise and magnitude spectrum for next frame
- inst->prevQNoise = qNoise;
- inst->prevQMagn = qMagn;
- if (norm32no1 > 5)
- {
- for (i = 0; i < inst->magnLen; i++)
- {
- inst->prevNoiseU32[i] = WEBRTC_SPL_LSHIFT_U32(noiseU32[i], norm32no1 - 5); // Q(qNoise+11)
- inst->prevMagnU16[i] = magnU16[i]; // Q(qMagn)
- }
- } else
- {
- for (i = 0; i < inst->magnLen; i++)
- {
- inst->prevNoiseU32[i] = WEBRTC_SPL_RSHIFT_U32(noiseU32[i], 5 - norm32no1); // Q(qNoise+11)
- inst->prevMagnU16[i] = magnU16[i]; // Q(qMagn)
- }
- }
-
- WebRtcNsx_DataSynthesis(inst, outFrame);
-#ifdef NS_FILEDEBUG
- fwrite(outframe, sizeof(short), inst->blockLen10ms, inst->outfile);
-#endif
-
- //for H band:
- // only update data buffer, then apply time-domain gain is applied derived from L band
- if (inst->fs == 32000)
- {
- // update analysis buffer for H band
- // append new data to buffer FX
- WEBRTC_SPL_MEMCPY_W16(inst->dataBufHBFX, inst->dataBufHBFX + inst->blockLen10ms, inst->anaLen - inst->blockLen10ms);
- WEBRTC_SPL_MEMCPY_W16(inst->dataBufHBFX + inst->anaLen - inst->blockLen10ms, speechFrameHB, inst->blockLen10ms);
- // range for averaging low band quantities for H band gain
-
- gainTimeDomainHB = 16384; // 16384 = Q14(1.0)
- //average speech prob from low band
- //average filter gain from low band
- //avg over second half (i.e., 4->8kHz) of freq. spectrum
- tmpU32no1 = 0; // Q12
- tmpU16no1 = 0; // Q8
- for (i = inst->anaLen2 - (inst->anaLen2 >> 2); i < inst->anaLen2; i++)
- {
- tmpU16no1 += nonSpeechProbFinal[i]; // Q8
- tmpU32no1 += (WebRtc_UWord32)(inst->noiseSupFilter[i]); // Q14
- }
- avgProbSpeechHB = (WebRtc_Word16)(4096
- - WEBRTC_SPL_RSHIFT_U16(tmpU16no1, inst->stages - 7)); // Q12
- avgFilterGainHB = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_U32(tmpU32no1, inst->stages - 3); // Q14
-
- // // original FLOAT code
- // // gain based on speech probability:
- // avg_prob_speech_tt=(float)2.0*avg_prob_speech-(float)1.0;
- // gain_mod=(float)0.5*((float)1.0+(float)tanh(avg_prob_speech_tt)); // between 0 and 1
-
- // gain based on speech probability:
- // original expression: "0.5 * (1 + tanh(2x-1))"
- // avgProbSpeechHB has been anyway saturated to a value between 0 and 1 so the other cases don't have to be dealt with
- // avgProbSpeechHB and gainModHB are in Q12, 3607 = Q12(0.880615234375) which is a zero point of
- // |0.5 * (1 + tanh(2x-1)) - x| - |0.5 * (1 + tanh(2x-1)) - 0.880615234375| meaning that from that point the error of approximating
- // the expression with f(x) = x would be greater than the error of approximating the expression with f(x) = 0.880615234375
- // error: "|0.5 * (1 + tanh(2x-1)) - x| from x=0 to 0.880615234375" -> http://www.wolframalpha.com/input/?i=|0.5+*+(1+%2B+tanh(2x-1))+-+x|+from+x%3D0+to+0.880615234375
- // and: "|0.5 * (1 + tanh(2x-1)) - 0.880615234375| from x=0.880615234375 to 1" -> http://www.wolframalpha.com/input/?i=+|0.5+*+(1+%2B+tanh(2x-1))+-+0.880615234375|+from+x%3D0.880615234375+to+1
- gainModHB = WEBRTC_SPL_MIN(avgProbSpeechHB, 3607);
-
- // // original FLOAT code
- // //combine gain with low band gain
- // if (avg_prob_speech < (float)0.5) {
- // gain_time_domain_HB=(float)0.5*gain_mod+(float)0.5*avg_filter_gain;
- // }
- // else {
- // gain_time_domain_HB=(float)0.25*gain_mod+(float)0.75*avg_filter_gain;
- // }
-
-
- //combine gain with low band gain
- if (avgProbSpeechHB < 2048)
- { // 2048 = Q12(0.5)
- // the next two lines in float are "gain_time_domain = 0.5 * gain_mod + 0.5 * avg_filter_gain"; Q2(0.5) = 2 equals one left shift
- gainTimeDomainHB = (gainModHB << 1) + (avgFilterGainHB >> 1); // Q14
- } else
- {
- // "gain_time_domain = 0.25 * gain_mod + 0.75 * agv_filter_gain;"
- gainTimeDomainHB = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(3, avgFilterGainHB, 2); // 3 = Q2(0.75); Q14
- gainTimeDomainHB += gainModHB; // Q14
- }
- //make sure gain is within flooring range
- gainTimeDomainHB
- = WEBRTC_SPL_SAT(16384, gainTimeDomainHB, (WebRtc_Word16)(inst->denoiseBound)); // 16384 = Q14(1.0)
-
-
- //apply gain
- for (i = 0; i < inst->blockLen10ms; i++)
- {
- outFrameHB[i]
- = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(gainTimeDomainHB, inst->dataBufHBFX[i], 14); // Q0
- }
- } // end of H band gain computation
-
- return 0;
-}
diff --git a/src/modules/audio_processing/ns/main/source/nsx_core.h b/src/modules/audio_processing/ns/main/source/nsx_core.h
deleted file mode 100644
index 2e74303..0000000
--- a/src/modules/audio_processing/ns/main/source/nsx_core.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_CORE_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_CORE_H_
-
-#include "typedefs.h"
-#include "signal_processing_library.h"
-
-#include "nsx_defines.h"
-
-#ifdef NS_FILEDEBUG
-#include <stdio.h>
-#endif
-
-typedef struct NsxInst_t_
-{
- WebRtc_UWord32 fs;
-
- const WebRtc_Word16* window;
- WebRtc_Word16 analysisBuffer[ANAL_BLOCKL_MAX];
- WebRtc_Word16 synthesisBuffer[ANAL_BLOCKL_MAX];
- WebRtc_UWord16 noiseSupFilter[HALF_ANAL_BLOCKL];
- WebRtc_UWord16 overdrive; /* Q8 */
- WebRtc_UWord16 denoiseBound; /* Q14 */
- const WebRtc_Word16* factor2Table;
- WebRtc_Word16 noiseEstLogQuantile[SIMULT * HALF_ANAL_BLOCKL];
- WebRtc_Word16 noiseEstDensity[SIMULT * HALF_ANAL_BLOCKL];
- WebRtc_Word16 noiseEstCounter[SIMULT];
- WebRtc_Word16 noiseEstQuantile[HALF_ANAL_BLOCKL];
-
- WebRtc_Word16 anaLen;
- int anaLen2;
- int magnLen;
- int aggrMode;
- int stages;
- int initFlag;
- int gainMap;
-
- WebRtc_Word32 maxLrt;
- WebRtc_Word32 minLrt;
- WebRtc_Word32 logLrtTimeAvgW32[HALF_ANAL_BLOCKL]; //log lrt factor with time-smoothing in Q8
- WebRtc_Word32 featureLogLrt;
- WebRtc_Word32 thresholdLogLrt;
- WebRtc_Word16 weightLogLrt;
-
- WebRtc_UWord32 featureSpecDiff;
- WebRtc_UWord32 thresholdSpecDiff;
- WebRtc_Word16 weightSpecDiff;
-
- WebRtc_UWord32 featureSpecFlat;
- WebRtc_UWord32 thresholdSpecFlat;
- WebRtc_Word16 weightSpecFlat;
-
- WebRtc_Word32 avgMagnPause[HALF_ANAL_BLOCKL]; //conservative estimate of noise spectrum
- WebRtc_UWord32 magnEnergy;
- WebRtc_UWord32 sumMagn;
- WebRtc_UWord32 curAvgMagnEnergy;
- WebRtc_UWord32 timeAvgMagnEnergy;
- WebRtc_UWord32 timeAvgMagnEnergyTmp;
-
- WebRtc_UWord32 whiteNoiseLevel; //initial noise estimate
- WebRtc_UWord32 initMagnEst[HALF_ANAL_BLOCKL];//initial magnitude spectrum estimate
- WebRtc_Word32 pinkNoiseNumerator; //pink noise parameter: numerator
- WebRtc_Word32 pinkNoiseExp; //pink noise parameter: power of freq
- int minNorm; //smallest normalization factor
- int zeroInputSignal; //zero input signal flag
-
- WebRtc_UWord32 prevNoiseU32[HALF_ANAL_BLOCKL]; //noise spectrum from previous frame
- WebRtc_UWord16 prevMagnU16[HALF_ANAL_BLOCKL]; //magnitude spectrum from previous frame
- WebRtc_Word16 priorNonSpeechProb; //prior speech/noise probability // Q14
-
- int blockIndex; //frame index counter
- int modelUpdate; //parameter for updating or estimating thresholds/weights for prior model
- int cntThresUpdate;
-
- //histograms for parameter estimation
- WebRtc_Word16 histLrt[HIST_PAR_EST];
- WebRtc_Word16 histSpecFlat[HIST_PAR_EST];
- WebRtc_Word16 histSpecDiff[HIST_PAR_EST];
-
- //quantities for high band estimate
- WebRtc_Word16 dataBufHBFX[ANAL_BLOCKL_MAX]; /* Q0 */
-
- int qNoise;
- int prevQNoise;
- int prevQMagn;
- int blockLen10ms;
-
- WebRtc_Word16 real[ANAL_BLOCKL_MAX];
- WebRtc_Word16 imag[ANAL_BLOCKL_MAX];
- WebRtc_Word32 energyIn;
- int scaleEnergyIn;
- int normData;
-
-} NsxInst_t;
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/****************************************************************************
- * WebRtcNsx_InitCore(...)
- *
- * This function initializes a noise suppression instance
- *
- * Input:
- * - inst : Instance that should be initialized
- * - fs : Sampling frequency
- *
- * Output:
- * - inst : Initialized instance
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-WebRtc_Word32 WebRtcNsx_InitCore(NsxInst_t *inst, WebRtc_UWord32 fs);
-
-/****************************************************************************
- * WebRtcNsx_set_policy_core(...)
- *
- * This changes the aggressiveness of the noise suppression method.
- *
- * Input:
- * - inst : Instance that should be initialized
- * - mode : 0: Mild (6 dB), 1: Medium (10 dB), 2: Aggressive (15 dB)
- *
- * Output:
- * - NS_inst : Initialized instance
- *
- * Return value : 0 - Ok
- * -1 - Error
- */
-int WebRtcNsx_set_policy_core(NsxInst_t *inst, int mode);
-
-/****************************************************************************
- * WebRtcNsx_ProcessCore
- *
- * Do noise suppression.
- *
- * Input:
- * - inst : Instance that should be initialized
- * - inFrameLow : Input speech frame for lower band
- * - inFrameHigh : Input speech frame for higher band
- *
- * Output:
- * - inst : Updated instance
- * - outFrameLow : Output speech frame for lower band
- * - outFrameHigh : Output speech frame for higher band
- *
- * Return value : 0 - OK
- * -1 - Error
- */
-int WebRtcNsx_ProcessCore(NsxInst_t *inst, short *inFrameLow, short *inFrameHigh,
- short *outFrameLow, short *outFrameHigh);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_CORE_H_
diff --git a/src/modules/audio_processing/ns/main/source/nsx_defines.h b/src/modules/audio_processing/ns/main/source/nsx_defines.h
deleted file mode 100644
index 58796b9..0000000
--- a/src/modules/audio_processing/ns/main/source/nsx_defines.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_DEFINES_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_DEFINES_H_
-
-#define ANAL_BLOCKL_MAX 256 // max analysis block length
-#define HALF_ANAL_BLOCKL 129 // half max analysis block length + 1
-#define SIMULT 3
-#define END_STARTUP_LONG 200
-#define END_STARTUP_SHORT 50
-#define FACTOR_Q16 (WebRtc_Word32)2621440 // 40 in Q16
-#define FACTOR_Q7 (WebRtc_Word16)5120 // 40 in Q7
-#define WIDTH_Q8 3 // 0.01 in Q8 (or 25 )
-//PARAMETERS FOR NEW METHOD
-#define DD_PR_SNR_Q11 2007 // ~= Q11(0.98) DD update of prior SNR
-#define ONE_MINUS_DD_PR_SNR_Q11 41 // DD update of prior SNR
-#define SPECT_FLAT_TAVG_Q14 4915 // (0.30) tavg parameter for spectral flatness measure
-#define SPECT_DIFF_TAVG_Q8 77 // (0.30) tavg parameter for spectral flatness measure
-#define PRIOR_UPDATE_Q14 1638 // Q14(0.1) update parameter of prior model
-#define NOISE_UPDATE_Q8 26 // 26 ~= Q8(0.1) update parameter for noise
-// probability threshold for noise state in speech/noise likelihood
-#define ONE_MINUS_PROB_RANGE_Q8 205 // 205 ~= Q8(0.8)
-#define HIST_PAR_EST 1000 // histogram size for estimation of parameters
-//FEATURE EXTRACTION CONFIG
-//bin size of histogram
-#define BIN_SIZE_LRT 10
-//scale parameters: multiply dominant peaks of the histograms by scale factor to obtain
-// thresholds for prior model
-#define FACTOR_1_LRT_DIFF 6 //for LRT and spectral difference (5 times bigger)
-//for spectral_flatness: used when noise is flatter than speech (10 times bigger)
-#define FACTOR_2_FLAT_Q10 922
-//peak limit for spectral flatness (varies between 0 and 1)
-#define THRES_PEAK_FLAT 24 // * 2 * BIN_SIZE_FLAT_FX
-//limit on spacing of two highest peaks in histogram: spacing determined by bin size
-#define LIM_PEAK_SPACE_FLAT_DIFF 4 // * 2 * BIN_SIZE_DIFF_FX
-//limit on relevance of second peak:
-#define LIM_PEAK_WEIGHT_FLAT_DIFF 2
-#define THRES_FLUCT_LRT 10240 //=20 * inst->modelUpdate; fluctuation limit of LRT feat.
-//limit on the max and min values for the feature thresholds
-#define MAX_FLAT_Q10 38912 // * 2 * BIN_SIZE_FLAT_FX
-#define MIN_FLAT_Q10 4096 // * 2 * BIN_SIZE_FLAT_FX
-#define MAX_DIFF 100 // * 2 * BIN_SIZE_DIFF_FX
-#define MIN_DIFF 16 // * 2 * BIN_SIZE_DIFF_FX
-//criteria of weight of histogram peak to accept/reject feature
-#define THRES_WEIGHT_FLAT_DIFF 154//(int)(0.3*(inst->modelUpdate)) for flatness and difference
-//
-#define STAT_UPDATES 9 // Update every 512 = 1 << 9 block
-#define ONE_MINUS_GAMMA_PAUSE_Q8 13 // ~= Q8(0.05) update for conservative noise estimate
-#define GAMMA_NOISE_TRANS_AND_SPEECH_Q8 3 // ~= Q8(0.01) update for transition and noise region
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_DEFINES_H_
diff --git a/src/modules/audio_processing/ns/main/source/windows_private.h b/src/modules/audio_processing/ns/main/source/windows_private.h
deleted file mode 100644
index 8f9006e..0000000
--- a/src/modules/audio_processing/ns/main/source/windows_private.h
+++ /dev/null
@@ -1,573 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_WINDOWS_PRIVATE_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_WINDOWS_PRIVATE_H_
-
-// Hanning window for 4ms 16kHz
-static const float kHanning64w128[128] = {
-0.00000000000000f, 0.02454122852291f, 0.04906767432742f,
-0.07356456359967f, 0.09801714032956f, 0.12241067519922f,
-0.14673047445536f, 0.17096188876030f, 0.19509032201613f,
-0.21910124015687f, 0.24298017990326f, 0.26671275747490f,
-0.29028467725446f, 0.31368174039889f, 0.33688985339222f,
-0.35989503653499f, 0.38268343236509f, 0.40524131400499f,
-0.42755509343028f, 0.44961132965461f, 0.47139673682600f,
-0.49289819222978f, 0.51410274419322f, 0.53499761988710f,
-0.55557023301960f, 0.57580819141785f, 0.59569930449243f,
-0.61523159058063f, 0.63439328416365f, 0.65317284295378f,
-0.67155895484702f, 0.68954054473707f, 0.70710678118655f,
-0.72424708295147f, 0.74095112535496f, 0.75720884650648f,
-0.77301045336274f, 0.78834642762661f, 0.80320753148064f,
-0.81758481315158f, 0.83146961230255f, 0.84485356524971f,
-0.85772861000027f, 0.87008699110871f, 0.88192126434835f,
-0.89322430119552f, 0.90398929312344f, 0.91420975570353f,
-0.92387953251129f, 0.93299279883474f, 0.94154406518302f,
-0.94952818059304f, 0.95694033573221f, 0.96377606579544f,
-0.97003125319454f, 0.97570213003853f, 0.98078528040323f,
-0.98527764238894f, 0.98917650996478f, 0.99247953459871f,
-0.99518472667220f, 0.99729045667869f, 0.99879545620517f,
-0.99969881869620f, 1.00000000000000f,
-0.99969881869620f, 0.99879545620517f, 0.99729045667869f,
-0.99518472667220f, 0.99247953459871f, 0.98917650996478f,
-0.98527764238894f, 0.98078528040323f, 0.97570213003853f,
-0.97003125319454f, 0.96377606579544f, 0.95694033573221f,
-0.94952818059304f, 0.94154406518302f, 0.93299279883474f,
-0.92387953251129f, 0.91420975570353f, 0.90398929312344f,
-0.89322430119552f, 0.88192126434835f, 0.87008699110871f,
-0.85772861000027f, 0.84485356524971f, 0.83146961230255f,
-0.81758481315158f, 0.80320753148064f, 0.78834642762661f,
-0.77301045336274f, 0.75720884650648f, 0.74095112535496f,
-0.72424708295147f, 0.70710678118655f, 0.68954054473707f,
-0.67155895484702f, 0.65317284295378f, 0.63439328416365f,
-0.61523159058063f, 0.59569930449243f, 0.57580819141785f,
-0.55557023301960f, 0.53499761988710f, 0.51410274419322f,
-0.49289819222978f, 0.47139673682600f, 0.44961132965461f,
-0.42755509343028f, 0.40524131400499f, 0.38268343236509f,
-0.35989503653499f, 0.33688985339222f, 0.31368174039889f,
-0.29028467725446f, 0.26671275747490f, 0.24298017990326f,
-0.21910124015687f, 0.19509032201613f, 0.17096188876030f,
-0.14673047445536f, 0.12241067519922f, 0.09801714032956f,
-0.07356456359967f, 0.04906767432742f, 0.02454122852291f
-};
-
-
-
-// hybrib Hanning & flat window
-static const float kBlocks80w128[128] = {
-(float)0.00000000, (float)0.03271908, (float)0.06540313, (float)0.09801714, (float)0.13052619,
-(float)0.16289547, (float)0.19509032, (float)0.22707626, (float)0.25881905, (float)0.29028468,
-(float)0.32143947, (float)0.35225005, (float)0.38268343, (float)0.41270703, (float)0.44228869,
-(float)0.47139674, (float)0.50000000, (float)0.52806785, (float)0.55557023, (float)0.58247770,
-(float)0.60876143, (float)0.63439328, (float)0.65934582, (float)0.68359230, (float)0.70710678,
-(float)0.72986407, (float)0.75183981, (float)0.77301045, (float)0.79335334, (float)0.81284668,
-(float)0.83146961, (float)0.84920218, (float)0.86602540, (float)0.88192126, (float)0.89687274,
-(float)0.91086382, (float)0.92387953, (float)0.93590593, (float)0.94693013, (float)0.95694034,
-(float)0.96592583, (float)0.97387698, (float)0.98078528, (float)0.98664333, (float)0.99144486,
-(float)0.99518473, (float)0.99785892, (float)0.99946459, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)0.99946459, (float)0.99785892, (float)0.99518473, (float)0.99144486,
-(float)0.98664333, (float)0.98078528, (float)0.97387698, (float)0.96592583, (float)0.95694034,
-(float)0.94693013, (float)0.93590593, (float)0.92387953, (float)0.91086382, (float)0.89687274,
-(float)0.88192126, (float)0.86602540, (float)0.84920218, (float)0.83146961, (float)0.81284668,
-(float)0.79335334, (float)0.77301045, (float)0.75183981, (float)0.72986407, (float)0.70710678,
-(float)0.68359230, (float)0.65934582, (float)0.63439328, (float)0.60876143, (float)0.58247770,
-(float)0.55557023, (float)0.52806785, (float)0.50000000, (float)0.47139674, (float)0.44228869,
-(float)0.41270703, (float)0.38268343, (float)0.35225005, (float)0.32143947, (float)0.29028468,
-(float)0.25881905, (float)0.22707626, (float)0.19509032, (float)0.16289547, (float)0.13052619,
-(float)0.09801714, (float)0.06540313, (float)0.03271908
-};
-
-// hybrib Hanning & flat window
-static const float kBlocks160w256[256] = {
-(float)0.00000000, (float)0.01636173, (float)0.03271908, (float)0.04906767, (float)0.06540313,
-(float)0.08172107, (float)0.09801714, (float)0.11428696, (float)0.13052619, (float)0.14673047,
-(float)0.16289547, (float)0.17901686, (float)0.19509032, (float)0.21111155, (float)0.22707626,
-(float)0.24298018, (float)0.25881905, (float)0.27458862, (float)0.29028468, (float)0.30590302,
-(float)0.32143947, (float)0.33688985, (float)0.35225005, (float)0.36751594, (float)0.38268343,
-(float)0.39774847, (float)0.41270703, (float)0.42755509, (float)0.44228869, (float)0.45690388,
-(float)0.47139674, (float)0.48576339, (float)0.50000000, (float)0.51410274, (float)0.52806785,
-(float)0.54189158, (float)0.55557023, (float)0.56910015, (float)0.58247770, (float)0.59569930,
-(float)0.60876143, (float)0.62166057, (float)0.63439328, (float)0.64695615, (float)0.65934582,
-(float)0.67155895, (float)0.68359230, (float)0.69544264, (float)0.70710678, (float)0.71858162,
-(float)0.72986407, (float)0.74095113, (float)0.75183981, (float)0.76252720, (float)0.77301045,
-(float)0.78328675, (float)0.79335334, (float)0.80320753, (float)0.81284668, (float)0.82226822,
-(float)0.83146961, (float)0.84044840, (float)0.84920218, (float)0.85772861, (float)0.86602540,
-(float)0.87409034, (float)0.88192126, (float)0.88951608, (float)0.89687274, (float)0.90398929,
-(float)0.91086382, (float)0.91749450, (float)0.92387953, (float)0.93001722, (float)0.93590593,
-(float)0.94154407, (float)0.94693013, (float)0.95206268, (float)0.95694034, (float)0.96156180,
-(float)0.96592583, (float)0.97003125, (float)0.97387698, (float)0.97746197, (float)0.98078528,
-(float)0.98384601, (float)0.98664333, (float)0.98917651, (float)0.99144486, (float)0.99344778,
-(float)0.99518473, (float)0.99665524, (float)0.99785892, (float)0.99879546, (float)0.99946459,
-(float)0.99986614, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)0.99986614, (float)0.99946459, (float)0.99879546, (float)0.99785892,
-(float)0.99665524, (float)0.99518473, (float)0.99344778, (float)0.99144486, (float)0.98917651,
-(float)0.98664333, (float)0.98384601, (float)0.98078528, (float)0.97746197, (float)0.97387698,
-(float)0.97003125, (float)0.96592583, (float)0.96156180, (float)0.95694034, (float)0.95206268,
-(float)0.94693013, (float)0.94154407, (float)0.93590593, (float)0.93001722, (float)0.92387953,
-(float)0.91749450, (float)0.91086382, (float)0.90398929, (float)0.89687274, (float)0.88951608,
-(float)0.88192126, (float)0.87409034, (float)0.86602540, (float)0.85772861, (float)0.84920218,
-(float)0.84044840, (float)0.83146961, (float)0.82226822, (float)0.81284668, (float)0.80320753,
-(float)0.79335334, (float)0.78328675, (float)0.77301045, (float)0.76252720, (float)0.75183981,
-(float)0.74095113, (float)0.72986407, (float)0.71858162, (float)0.70710678, (float)0.69544264,
-(float)0.68359230, (float)0.67155895, (float)0.65934582, (float)0.64695615, (float)0.63439328,
-(float)0.62166057, (float)0.60876143, (float)0.59569930, (float)0.58247770, (float)0.56910015,
-(float)0.55557023, (float)0.54189158, (float)0.52806785, (float)0.51410274, (float)0.50000000,
-(float)0.48576339, (float)0.47139674, (float)0.45690388, (float)0.44228869, (float)0.42755509,
-(float)0.41270703, (float)0.39774847, (float)0.38268343, (float)0.36751594, (float)0.35225005,
-(float)0.33688985, (float)0.32143947, (float)0.30590302, (float)0.29028468, (float)0.27458862,
-(float)0.25881905, (float)0.24298018, (float)0.22707626, (float)0.21111155, (float)0.19509032,
-(float)0.17901686, (float)0.16289547, (float)0.14673047, (float)0.13052619, (float)0.11428696,
-(float)0.09801714, (float)0.08172107, (float)0.06540313, (float)0.04906767, (float)0.03271908,
-(float)0.01636173
-};
-
-// hybrib Hanning & flat window: for 20ms
-static const float kBlocks320w512[512] = {
-(float)0.00000000, (float)0.00818114, (float)0.01636173, (float)0.02454123, (float)0.03271908,
-(float)0.04089475, (float)0.04906767, (float)0.05723732, (float)0.06540313, (float)0.07356456,
-(float)0.08172107, (float)0.08987211, (float)0.09801714, (float)0.10615561, (float)0.11428696,
-(float)0.12241068, (float)0.13052619, (float)0.13863297, (float)0.14673047, (float)0.15481816,
-(float)0.16289547, (float)0.17096189, (float)0.17901686, (float)0.18705985, (float)0.19509032,
-(float)0.20310773, (float)0.21111155, (float)0.21910124, (float)0.22707626, (float)0.23503609,
-(float)0.24298018, (float)0.25090801, (float)0.25881905, (float)0.26671276, (float)0.27458862,
-(float)0.28244610, (float)0.29028468, (float)0.29810383, (float)0.30590302, (float)0.31368174,
-(float)0.32143947, (float)0.32917568, (float)0.33688985, (float)0.34458148, (float)0.35225005,
-(float)0.35989504, (float)0.36751594, (float)0.37511224, (float)0.38268343, (float)0.39022901,
-(float)0.39774847, (float)0.40524131, (float)0.41270703, (float)0.42014512, (float)0.42755509,
-(float)0.43493645, (float)0.44228869, (float)0.44961133, (float)0.45690388, (float)0.46416584,
-(float)0.47139674, (float)0.47859608, (float)0.48576339, (float)0.49289819, (float)0.50000000,
-(float)0.50706834, (float)0.51410274, (float)0.52110274, (float)0.52806785, (float)0.53499762,
-(float)0.54189158, (float)0.54874927, (float)0.55557023, (float)0.56235401, (float)0.56910015,
-(float)0.57580819, (float)0.58247770, (float)0.58910822, (float)0.59569930, (float)0.60225052,
-(float)0.60876143, (float)0.61523159, (float)0.62166057, (float)0.62804795, (float)0.63439328,
-(float)0.64069616, (float)0.64695615, (float)0.65317284, (float)0.65934582, (float)0.66547466,
-(float)0.67155895, (float)0.67759830, (float)0.68359230, (float)0.68954054, (float)0.69544264,
-(float)0.70129818, (float)0.70710678, (float)0.71286806, (float)0.71858162, (float)0.72424708,
-(float)0.72986407, (float)0.73543221, (float)0.74095113, (float)0.74642045, (float)0.75183981,
-(float)0.75720885, (float)0.76252720, (float)0.76779452, (float)0.77301045, (float)0.77817464,
-(float)0.78328675, (float)0.78834643, (float)0.79335334, (float)0.79830715, (float)0.80320753,
-(float)0.80805415, (float)0.81284668, (float)0.81758481, (float)0.82226822, (float)0.82689659,
-(float)0.83146961, (float)0.83598698, (float)0.84044840, (float)0.84485357, (float)0.84920218,
-(float)0.85349396, (float)0.85772861, (float)0.86190585, (float)0.86602540, (float)0.87008699,
-(float)0.87409034, (float)0.87803519, (float)0.88192126, (float)0.88574831, (float)0.88951608,
-(float)0.89322430, (float)0.89687274, (float)0.90046115, (float)0.90398929, (float)0.90745693,
-(float)0.91086382, (float)0.91420976, (float)0.91749450, (float)0.92071783, (float)0.92387953,
-(float)0.92697940, (float)0.93001722, (float)0.93299280, (float)0.93590593, (float)0.93875641,
-(float)0.94154407, (float)0.94426870, (float)0.94693013, (float)0.94952818, (float)0.95206268,
-(float)0.95453345, (float)0.95694034, (float)0.95928317, (float)0.96156180, (float)0.96377607,
-(float)0.96592583, (float)0.96801094, (float)0.97003125, (float)0.97198664, (float)0.97387698,
-(float)0.97570213, (float)0.97746197, (float)0.97915640, (float)0.98078528, (float)0.98234852,
-(float)0.98384601, (float)0.98527764, (float)0.98664333, (float)0.98794298, (float)0.98917651,
-(float)0.99034383, (float)0.99144486, (float)0.99247953, (float)0.99344778, (float)0.99434953,
-(float)0.99518473, (float)0.99595331, (float)0.99665524, (float)0.99729046, (float)0.99785892,
-(float)0.99836060, (float)0.99879546, (float)0.99916346, (float)0.99946459, (float)0.99969882,
-(float)0.99986614, (float)0.99996653, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-(float)1.00000000, (float)0.99996653, (float)0.99986614, (float)0.99969882, (float)0.99946459,
-(float)0.99916346, (float)0.99879546, (float)0.99836060, (float)0.99785892, (float)0.99729046,
-(float)0.99665524, (float)0.99595331, (float)0.99518473, (float)0.99434953, (float)0.99344778,
-(float)0.99247953, (float)0.99144486, (float)0.99034383, (float)0.98917651, (float)0.98794298,
-(float)0.98664333, (float)0.98527764, (float)0.98384601, (float)0.98234852, (float)0.98078528,
-(float)0.97915640, (float)0.97746197, (float)0.97570213, (float)0.97387698, (float)0.97198664,
-(float)0.97003125, (float)0.96801094, (float)0.96592583, (float)0.96377607, (float)0.96156180,
-(float)0.95928317, (float)0.95694034, (float)0.95453345, (float)0.95206268, (float)0.94952818,
-(float)0.94693013, (float)0.94426870, (float)0.94154407, (float)0.93875641, (float)0.93590593,
-(float)0.93299280, (float)0.93001722, (float)0.92697940, (float)0.92387953, (float)0.92071783,
-(float)0.91749450, (float)0.91420976, (float)0.91086382, (float)0.90745693, (float)0.90398929,
-(float)0.90046115, (float)0.89687274, (float)0.89322430, (float)0.88951608, (float)0.88574831,
-(float)0.88192126, (float)0.87803519, (float)0.87409034, (float)0.87008699, (float)0.86602540,
-(float)0.86190585, (float)0.85772861, (float)0.85349396, (float)0.84920218, (float)0.84485357,
-(float)0.84044840, (float)0.83598698, (float)0.83146961, (float)0.82689659, (float)0.82226822,
-(float)0.81758481, (float)0.81284668, (float)0.80805415, (float)0.80320753, (float)0.79830715,
-(float)0.79335334, (float)0.78834643, (float)0.78328675, (float)0.77817464, (float)0.77301045,
-(float)0.76779452, (float)0.76252720, (float)0.75720885, (float)0.75183981, (float)0.74642045,
-(float)0.74095113, (float)0.73543221, (float)0.72986407, (float)0.72424708, (float)0.71858162,
-(float)0.71286806, (float)0.70710678, (float)0.70129818, (float)0.69544264, (float)0.68954054,
-(float)0.68359230, (float)0.67759830, (float)0.67155895, (float)0.66547466, (float)0.65934582,
-(float)0.65317284, (float)0.64695615, (float)0.64069616, (float)0.63439328, (float)0.62804795,
-(float)0.62166057, (float)0.61523159, (float)0.60876143, (float)0.60225052, (float)0.59569930,
-(float)0.58910822, (float)0.58247770, (float)0.57580819, (float)0.56910015, (float)0.56235401,
-(float)0.55557023, (float)0.54874927, (float)0.54189158, (float)0.53499762, (float)0.52806785,
-(float)0.52110274, (float)0.51410274, (float)0.50706834, (float)0.50000000, (float)0.49289819,
-(float)0.48576339, (float)0.47859608, (float)0.47139674, (float)0.46416584, (float)0.45690388,
-(float)0.44961133, (float)0.44228869, (float)0.43493645, (float)0.42755509, (float)0.42014512,
-(float)0.41270703, (float)0.40524131, (float)0.39774847, (float)0.39022901, (float)0.38268343,
-(float)0.37511224, (float)0.36751594, (float)0.35989504, (float)0.35225005, (float)0.34458148,
-(float)0.33688985, (float)0.32917568, (float)0.32143947, (float)0.31368174, (float)0.30590302,
-(float)0.29810383, (float)0.29028468, (float)0.28244610, (float)0.27458862, (float)0.26671276,
-(float)0.25881905, (float)0.25090801, (float)0.24298018, (float)0.23503609, (float)0.22707626,
-(float)0.21910124, (float)0.21111155, (float)0.20310773, (float)0.19509032, (float)0.18705985,
-(float)0.17901686, (float)0.17096189, (float)0.16289547, (float)0.15481816, (float)0.14673047,
-(float)0.13863297, (float)0.13052619, (float)0.12241068, (float)0.11428696, (float)0.10615561,
-(float)0.09801714, (float)0.08987211, (float)0.08172107, (float)0.07356456, (float)0.06540313,
-(float)0.05723732, (float)0.04906767, (float)0.04089475, (float)0.03271908, (float)0.02454123,
-(float)0.01636173, (float)0.00818114
-};
-
-
-// Hanning window: for 15ms at 16kHz with symmetric zeros
-static const float kBlocks240w512[512] = {
-(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-(float)0.00000000, (float)0.00000000, (float)0.00654494, (float)0.01308960, (float)0.01963369,
-(float)0.02617695, (float)0.03271908, (float)0.03925982, (float)0.04579887, (float)0.05233596,
-(float)0.05887080, (float)0.06540313, (float)0.07193266, (float)0.07845910, (float)0.08498218,
-(float)0.09150162, (float)0.09801714, (float)0.10452846, (float)0.11103531, (float)0.11753740,
-(float)0.12403446, (float)0.13052620, (float)0.13701233, (float)0.14349262, (float)0.14996676,
-(float)0.15643448, (float)0.16289547, (float)0.16934951, (float)0.17579629, (float)0.18223552,
-(float)0.18866697, (float)0.19509032, (float)0.20150533, (float)0.20791170, (float)0.21430916,
-(float)0.22069745, (float)0.22707628, (float)0.23344538, (float)0.23980446, (float)0.24615330,
-(float)0.25249159, (float)0.25881904, (float)0.26513544, (float)0.27144045, (float)0.27773386,
-(float)0.28401536, (float)0.29028466, (float)0.29654160, (float)0.30278578, (float)0.30901700,
-(float)0.31523499, (float)0.32143945, (float)0.32763019, (float)0.33380687, (float)0.33996925,
-(float)0.34611708, (float)0.35225007, (float)0.35836795, (float)0.36447051, (float)0.37055743,
-(float)0.37662852, (float)0.38268346, (float)0.38872197, (float)0.39474389, (float)0.40074885,
-(float)0.40673664, (float)0.41270703, (float)0.41865975, (float)0.42459452, (float)0.43051112,
-(float)0.43640924, (float)0.44228873, (float)0.44814920, (float)0.45399052, (float)0.45981237,
-(float)0.46561453, (float)0.47139674, (float)0.47715878, (float)0.48290035, (float)0.48862126,
-(float)0.49432120, (float)0.50000000, (float)0.50565743, (float)0.51129311, (float)0.51690692,
-(float)0.52249855, (float)0.52806789, (float)0.53361452, (float)0.53913832, (float)0.54463905,
-(float)0.55011642, (float)0.55557024, (float)0.56100029, (float)0.56640625, (float)0.57178795,
-(float)0.57714522, (float)0.58247769, (float)0.58778524, (float)0.59306765, (float)0.59832460,
-(float)0.60355598, (float)0.60876143, (float)0.61394083, (float)0.61909395, (float)0.62422055,
-(float)0.62932038, (float)0.63439333, (float)0.63943899, (float)0.64445734, (float)0.64944810,
-(float)0.65441096, (float)0.65934587, (float)0.66425246, (float)0.66913062, (float)0.67398012,
-(float)0.67880076, (float)0.68359232, (float)0.68835455, (float)0.69308740, (float)0.69779050,
-(float)0.70246369, (float)0.70710677, (float)0.71171963, (float)0.71630198, (float)0.72085363,
-(float)0.72537440, (float)0.72986406, (float)0.73432255, (float)0.73874950, (float)0.74314487,
-(float)0.74750835, (float)0.75183982, (float)0.75613910, (float)0.76040596, (float)0.76464027,
-(float)0.76884186, (float)0.77301043, (float)0.77714598, (float)0.78124821, (float)0.78531694,
-(float)0.78935206, (float)0.79335338, (float)0.79732066, (float)0.80125386, (float)0.80515265,
-(float)0.80901700, (float)0.81284672, (float)0.81664157, (float)0.82040149, (float)0.82412618,
-(float)0.82781565, (float)0.83146966, (float)0.83508795, (float)0.83867061, (float)0.84221727,
-(float)0.84572780, (float)0.84920216, (float)0.85264021, (float)0.85604161, (float)0.85940641,
-(float)0.86273444, (float)0.86602545, (float)0.86927933, (float)0.87249607, (float)0.87567532,
-(float)0.87881714, (float)0.88192129, (float)0.88498765, (float)0.88801610, (float)0.89100653,
-(float)0.89395881, (float)0.89687276, (float)0.89974827, (float)0.90258533, (float)0.90538365,
-(float)0.90814316, (float)0.91086388, (float)0.91354549, (float)0.91618794, (float)0.91879123,
-(float)0.92135513, (float)0.92387950, (float)0.92636442, (float)0.92880958, (float)0.93121493,
-(float)0.93358046, (float)0.93590593, (float)0.93819135, (float)0.94043654, (float)0.94264150,
-(float)0.94480604, (float)0.94693011, (float)0.94901365, (float)0.95105654, (float)0.95305866,
-(float)0.95501995, (float)0.95694035, (float)0.95881975, (float)0.96065807, (float)0.96245527,
-(float)0.96421117, (float)0.96592581, (float)0.96759909, (float)0.96923089, (float)0.97082120,
-(float)0.97236991, (float)0.97387701, (float)0.97534233, (float)0.97676587, (float)0.97814763,
-(float)0.97948742, (float)0.98078531, (float)0.98204112, (float)0.98325491, (float)0.98442656,
-(float)0.98555607, (float)0.98664331, (float)0.98768836, (float)0.98869103, (float)0.98965138,
-(float)0.99056935, (float)0.99144489, (float)0.99227792, (float)0.99306846, (float)0.99381649,
-(float)0.99452192, (float)0.99518472, (float)0.99580491, (float)0.99638247, (float)0.99691731,
-(float)0.99740952, (float)0.99785894, (float)0.99826562, (float)0.99862951, (float)0.99895066,
-(float)0.99922901, (float)0.99946457, (float)0.99965733, (float)0.99980724, (float)0.99991435,
-(float)0.99997860, (float)1.00000000, (float)0.99997860, (float)0.99991435, (float)0.99980724,
-(float)0.99965733, (float)0.99946457, (float)0.99922901, (float)0.99895066, (float)0.99862951,
-(float)0.99826562, (float)0.99785894, (float)0.99740946, (float)0.99691731, (float)0.99638247,
-(float)0.99580491, (float)0.99518472, (float)0.99452192, (float)0.99381644, (float)0.99306846,
-(float)0.99227792, (float)0.99144489, (float)0.99056935, (float)0.98965138, (float)0.98869103,
-(float)0.98768836, (float)0.98664331, (float)0.98555607, (float)0.98442656, (float)0.98325491,
-(float)0.98204112, (float)0.98078525, (float)0.97948742, (float)0.97814757, (float)0.97676587,
-(float)0.97534227, (float)0.97387695, (float)0.97236991, (float)0.97082120, (float)0.96923089,
-(float)0.96759909, (float)0.96592581, (float)0.96421117, (float)0.96245521, (float)0.96065807,
-(float)0.95881969, (float)0.95694029, (float)0.95501995, (float)0.95305860, (float)0.95105648,
-(float)0.94901365, (float)0.94693011, (float)0.94480604, (float)0.94264150, (float)0.94043654,
-(float)0.93819129, (float)0.93590593, (float)0.93358046, (float)0.93121493, (float)0.92880952,
-(float)0.92636436, (float)0.92387950, (float)0.92135507, (float)0.91879123, (float)0.91618794,
-(float)0.91354543, (float)0.91086382, (float)0.90814310, (float)0.90538365, (float)0.90258527,
-(float)0.89974827, (float)0.89687276, (float)0.89395875, (float)0.89100647, (float)0.88801610,
-(float)0.88498759, (float)0.88192123, (float)0.87881714, (float)0.87567532, (float)0.87249595,
-(float)0.86927933, (float)0.86602539, (float)0.86273432, (float)0.85940641, (float)0.85604161,
-(float)0.85264009, (float)0.84920216, (float)0.84572780, (float)0.84221715, (float)0.83867055,
-(float)0.83508795, (float)0.83146954, (float)0.82781565, (float)0.82412612, (float)0.82040137,
-(float)0.81664157, (float)0.81284660, (float)0.80901700, (float)0.80515265, (float)0.80125374,
-(float)0.79732066, (float)0.79335332, (float)0.78935200, (float)0.78531694, (float)0.78124815,
-(float)0.77714586, (float)0.77301049, (float)0.76884180, (float)0.76464021, (float)0.76040596,
-(float)0.75613904, (float)0.75183970, (float)0.74750835, (float)0.74314481, (float)0.73874938,
-(float)0.73432249, (float)0.72986400, (float)0.72537428, (float)0.72085363, (float)0.71630186,
-(float)0.71171951, (float)0.70710677, (float)0.70246363, (float)0.69779032, (float)0.69308734,
-(float)0.68835449, (float)0.68359220, (float)0.67880070, (float)0.67398006, (float)0.66913044,
-(float)0.66425240, (float)0.65934575, (float)0.65441096, (float)0.64944804, (float)0.64445722,
-(float)0.63943905, (float)0.63439327, (float)0.62932026, (float)0.62422055, (float)0.61909389,
-(float)0.61394072, (float)0.60876143, (float)0.60355592, (float)0.59832448, (float)0.59306765,
-(float)0.58778518, (float)0.58247757, (float)0.57714522, (float)0.57178789, (float)0.56640613,
-(float)0.56100023, (float)0.55557019, (float)0.55011630, (float)0.54463905, (float)0.53913826,
-(float)0.53361434, (float)0.52806783, (float)0.52249849, (float)0.51690674, (float)0.51129305,
-(float)0.50565726, (float)0.50000006, (float)0.49432117, (float)0.48862115, (float)0.48290038,
-(float)0.47715873, (float)0.47139663, (float)0.46561456, (float)0.45981231, (float)0.45399037,
-(float)0.44814920, (float)0.44228864, (float)0.43640912, (float)0.43051112, (float)0.42459446,
-(float)0.41865960, (float)0.41270703, (float)0.40673658, (float)0.40074870, (float)0.39474386,
-(float)0.38872188, (float)0.38268328, (float)0.37662849, (float)0.37055734, (float)0.36447033,
-(float)0.35836792, (float)0.35224995, (float)0.34611690, (float)0.33996922, (float)0.33380675,
-(float)0.32763001, (float)0.32143945, (float)0.31523487, (float)0.30901679, (float)0.30278572,
-(float)0.29654145, (float)0.29028472, (float)0.28401530, (float)0.27773371, (float)0.27144048,
-(float)0.26513538, (float)0.25881892, (float)0.25249159, (float)0.24615324, (float)0.23980433,
-(float)0.23344538, (float)0.22707619, (float)0.22069728, (float)0.21430916, (float)0.20791161,
-(float)0.20150517, (float)0.19509031, (float)0.18866688, (float)0.18223536, (float)0.17579627,
-(float)0.16934940, (float)0.16289529, (float)0.15643445, (float)0.14996666, (float)0.14349243,
-(float)0.13701232, (float)0.13052608, (float)0.12403426, (float)0.11753736, (float)0.11103519,
-(float)0.10452849, (float)0.09801710, (float)0.09150149, (float)0.08498220, (float)0.07845904,
-(float)0.07193252, (float)0.06540315, (float)0.05887074, (float)0.05233581, (float)0.04579888,
-(float)0.03925974, (float)0.03271893, (float)0.02617695, (float)0.01963361, (float)0.01308943,
-(float)0.00654493, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-(float)0.00000000, (float)0.00000000
-};
-
-
-// Hanning window: for 30ms with 1024 fft with symmetric zeros at 16kHz
-static const float kBlocks480w1024[1024] = {
-(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00327249, (float)0.00654494,
-(float)0.00981732, (float)0.01308960, (float)0.01636173, (float)0.01963369, (float)0.02290544,
-(float)0.02617695, (float)0.02944817, (float)0.03271908, (float)0.03598964, (float)0.03925982,
-(float)0.04252957, (float)0.04579887, (float)0.04906768, (float)0.05233596, (float)0.05560368,
-(float)0.05887080, (float)0.06213730, (float)0.06540313, (float)0.06866825, (float)0.07193266,
-(float)0.07519628, (float)0.07845910, (float)0.08172107, (float)0.08498218, (float)0.08824237,
-(float)0.09150162, (float)0.09475989, (float)0.09801714, (float)0.10127335, (float)0.10452846,
-(float)0.10778246, (float)0.11103531, (float)0.11428697, (float)0.11753740, (float)0.12078657,
-(float)0.12403446, (float)0.12728101, (float)0.13052620, (float)0.13376999, (float)0.13701233,
-(float)0.14025325, (float)0.14349262, (float)0.14673047, (float)0.14996676, (float)0.15320145,
-(float)0.15643448, (float)0.15966582, (float)0.16289547, (float)0.16612339, (float)0.16934951,
-(float)0.17257382, (float)0.17579629, (float)0.17901687, (float)0.18223552, (float)0.18545224,
-(float)0.18866697, (float)0.19187967, (float)0.19509032, (float)0.19829889, (float)0.20150533,
-(float)0.20470962, (float)0.20791170, (float)0.21111156, (float)0.21430916, (float)0.21750447,
-(float)0.22069745, (float)0.22388805, (float)0.22707628, (float)0.23026206, (float)0.23344538,
-(float)0.23662618, (float)0.23980446, (float)0.24298020, (float)0.24615330, (float)0.24932377,
-(float)0.25249159, (float)0.25565669, (float)0.25881904, (float)0.26197866, (float)0.26513544,
-(float)0.26828939, (float)0.27144045, (float)0.27458861, (float)0.27773386, (float)0.28087610,
-(float)0.28401536, (float)0.28715158, (float)0.29028466, (float)0.29341471, (float)0.29654160,
-(float)0.29966527, (float)0.30278578, (float)0.30590302, (float)0.30901700, (float)0.31212768,
-(float)0.31523499, (float)0.31833893, (float)0.32143945, (float)0.32453656, (float)0.32763019,
-(float)0.33072028, (float)0.33380687, (float)0.33688986, (float)0.33996925, (float)0.34304500,
-(float)0.34611708, (float)0.34918544, (float)0.35225007, (float)0.35531089, (float)0.35836795,
-(float)0.36142117, (float)0.36447051, (float)0.36751595, (float)0.37055743, (float)0.37359497,
-(float)0.37662852, (float)0.37965801, (float)0.38268346, (float)0.38570479, (float)0.38872197,
-(float)0.39173502, (float)0.39474389, (float)0.39774847, (float)0.40074885, (float)0.40374491,
-(float)0.40673664, (float)0.40972406, (float)0.41270703, (float)0.41568562, (float)0.41865975,
-(float)0.42162940, (float)0.42459452, (float)0.42755508, (float)0.43051112, (float)0.43346250,
-(float)0.43640924, (float)0.43935132, (float)0.44228873, (float)0.44522133, (float)0.44814920,
-(float)0.45107228, (float)0.45399052, (float)0.45690390, (float)0.45981237, (float)0.46271592,
-(float)0.46561453, (float)0.46850815, (float)0.47139674, (float)0.47428030, (float)0.47715878,
-(float)0.48003215, (float)0.48290035, (float)0.48576337, (float)0.48862126, (float)0.49147385,
-(float)0.49432120, (float)0.49716330, (float)0.50000000, (float)0.50283140, (float)0.50565743,
-(float)0.50847799, (float)0.51129311, (float)0.51410276, (float)0.51690692, (float)0.51970553,
-(float)0.52249855, (float)0.52528602, (float)0.52806789, (float)0.53084403, (float)0.53361452,
-(float)0.53637928, (float)0.53913832, (float)0.54189163, (float)0.54463905, (float)0.54738063,
-(float)0.55011642, (float)0.55284631, (float)0.55557024, (float)0.55828828, (float)0.56100029,
-(float)0.56370628, (float)0.56640625, (float)0.56910014, (float)0.57178795, (float)0.57446963,
-(float)0.57714522, (float)0.57981455, (float)0.58247769, (float)0.58513463, (float)0.58778524,
-(float)0.59042960, (float)0.59306765, (float)0.59569931, (float)0.59832460, (float)0.60094351,
-(float)0.60355598, (float)0.60616195, (float)0.60876143, (float)0.61135441, (float)0.61394083,
-(float)0.61652070, (float)0.61909395, (float)0.62166059, (float)0.62422055, (float)0.62677383,
-(float)0.62932038, (float)0.63186020, (float)0.63439333, (float)0.63691956, (float)0.63943899,
-(float)0.64195162, (float)0.64445734, (float)0.64695615, (float)0.64944810, (float)0.65193301,
-(float)0.65441096, (float)0.65688187, (float)0.65934587, (float)0.66180271, (float)0.66425246,
-(float)0.66669512, (float)0.66913062, (float)0.67155898, (float)0.67398012, (float)0.67639405,
-(float)0.67880076, (float)0.68120021, (float)0.68359232, (float)0.68597710, (float)0.68835455,
-(float)0.69072467, (float)0.69308740, (float)0.69544262, (float)0.69779050, (float)0.70013082,
-(float)0.70246369, (float)0.70478904, (float)0.70710677, (float)0.70941699, (float)0.71171963,
-(float)0.71401459, (float)0.71630198, (float)0.71858168, (float)0.72085363, (float)0.72311789,
-(float)0.72537440, (float)0.72762316, (float)0.72986406, (float)0.73209721, (float)0.73432255,
-(float)0.73653996, (float)0.73874950, (float)0.74095118, (float)0.74314487, (float)0.74533057,
-(float)0.74750835, (float)0.74967808, (float)0.75183982, (float)0.75399351, (float)0.75613910,
-(float)0.75827658, (float)0.76040596, (float)0.76252723, (float)0.76464027, (float)0.76674515,
-(float)0.76884186, (float)0.77093029, (float)0.77301043, (float)0.77508241, (float)0.77714598,
-(float)0.77920127, (float)0.78124821, (float)0.78328675, (float)0.78531694, (float)0.78733873,
-(float)0.78935206, (float)0.79135692, (float)0.79335338, (float)0.79534125, (float)0.79732066,
-(float)0.79929149, (float)0.80125386, (float)0.80320752, (float)0.80515265, (float)0.80708915,
-(float)0.80901700, (float)0.81093621, (float)0.81284672, (float)0.81474853, (float)0.81664157,
-(float)0.81852591, (float)0.82040149, (float)0.82226825, (float)0.82412618, (float)0.82597536,
-(float)0.82781565, (float)0.82964706, (float)0.83146966, (float)0.83328325, (float)0.83508795,
-(float)0.83688378, (float)0.83867061, (float)0.84044838, (float)0.84221727, (float)0.84397703,
-(float)0.84572780, (float)0.84746957, (float)0.84920216, (float)0.85092574, (float)0.85264021,
-(float)0.85434544, (float)0.85604161, (float)0.85772866, (float)0.85940641, (float)0.86107504,
-(float)0.86273444, (float)0.86438453, (float)0.86602545, (float)0.86765707, (float)0.86927933,
-(float)0.87089235, (float)0.87249607, (float)0.87409031, (float)0.87567532, (float)0.87725097,
-(float)0.87881714, (float)0.88037390, (float)0.88192129, (float)0.88345921, (float)0.88498765,
-(float)0.88650668, (float)0.88801610, (float)0.88951612, (float)0.89100653, (float)0.89248741,
-(float)0.89395881, (float)0.89542055, (float)0.89687276, (float)0.89831537, (float)0.89974827,
-(float)0.90117162, (float)0.90258533, (float)0.90398932, (float)0.90538365, (float)0.90676826,
-(float)0.90814316, (float)0.90950841, (float)0.91086388, (float)0.91220951, (float)0.91354549,
-(float)0.91487163, (float)0.91618794, (float)0.91749454, (float)0.91879123, (float)0.92007810,
-(float)0.92135513, (float)0.92262226, (float)0.92387950, (float)0.92512691, (float)0.92636442,
-(float)0.92759192, (float)0.92880958, (float)0.93001723, (float)0.93121493, (float)0.93240267,
-(float)0.93358046, (float)0.93474817, (float)0.93590593, (float)0.93705362, (float)0.93819135,
-(float)0.93931901, (float)0.94043654, (float)0.94154406, (float)0.94264150, (float)0.94372880,
-(float)0.94480604, (float)0.94587320, (float)0.94693011, (float)0.94797695, (float)0.94901365,
-(float)0.95004016, (float)0.95105654, (float)0.95206273, (float)0.95305866, (float)0.95404440,
-(float)0.95501995, (float)0.95598525, (float)0.95694035, (float)0.95788521, (float)0.95881975,
-(float)0.95974404, (float)0.96065807, (float)0.96156180, (float)0.96245527, (float)0.96333838,
-(float)0.96421117, (float)0.96507370, (float)0.96592581, (float)0.96676767, (float)0.96759909,
-(float)0.96842021, (float)0.96923089, (float)0.97003126, (float)0.97082120, (float)0.97160077,
-(float)0.97236991, (float)0.97312868, (float)0.97387701, (float)0.97461486, (float)0.97534233,
-(float)0.97605932, (float)0.97676587, (float)0.97746199, (float)0.97814763, (float)0.97882277,
-(float)0.97948742, (float)0.98014158, (float)0.98078531, (float)0.98141843, (float)0.98204112,
-(float)0.98265332, (float)0.98325491, (float)0.98384601, (float)0.98442656, (float)0.98499662,
-(float)0.98555607, (float)0.98610497, (float)0.98664331, (float)0.98717111, (float)0.98768836,
-(float)0.98819500, (float)0.98869103, (float)0.98917651, (float)0.98965138, (float)0.99011570,
-(float)0.99056935, (float)0.99101239, (float)0.99144489, (float)0.99186671, (float)0.99227792,
-(float)0.99267852, (float)0.99306846, (float)0.99344778, (float)0.99381649, (float)0.99417448,
-(float)0.99452192, (float)0.99485862, (float)0.99518472, (float)0.99550015, (float)0.99580491,
-(float)0.99609905, (float)0.99638247, (float)0.99665523, (float)0.99691731, (float)0.99716878,
-(float)0.99740952, (float)0.99763954, (float)0.99785894, (float)0.99806762, (float)0.99826562,
-(float)0.99845290, (float)0.99862951, (float)0.99879545, (float)0.99895066, (float)0.99909520,
-(float)0.99922901, (float)0.99935216, (float)0.99946457, (float)0.99956632, (float)0.99965733,
-(float)0.99973762, (float)0.99980724, (float)0.99986613, (float)0.99991435, (float)0.99995178,
-(float)0.99997860, (float)0.99999464, (float)1.00000000, (float)0.99999464, (float)0.99997860,
-(float)0.99995178, (float)0.99991435, (float)0.99986613, (float)0.99980724, (float)0.99973762,
-(float)0.99965733, (float)0.99956632, (float)0.99946457, (float)0.99935216, (float)0.99922901,
-(float)0.99909520, (float)0.99895066, (float)0.99879545, (float)0.99862951, (float)0.99845290,
-(float)0.99826562, (float)0.99806762, (float)0.99785894, (float)0.99763954, (float)0.99740946,
-(float)0.99716872, (float)0.99691731, (float)0.99665523, (float)0.99638247, (float)0.99609905,
-(float)0.99580491, (float)0.99550015, (float)0.99518472, (float)0.99485862, (float)0.99452192,
-(float)0.99417448, (float)0.99381644, (float)0.99344778, (float)0.99306846, (float)0.99267852,
-(float)0.99227792, (float)0.99186671, (float)0.99144489, (float)0.99101239, (float)0.99056935,
-(float)0.99011564, (float)0.98965138, (float)0.98917651, (float)0.98869103, (float)0.98819494,
-(float)0.98768836, (float)0.98717111, (float)0.98664331, (float)0.98610497, (float)0.98555607,
-(float)0.98499656, (float)0.98442656, (float)0.98384601, (float)0.98325491, (float)0.98265326,
-(float)0.98204112, (float)0.98141843, (float)0.98078525, (float)0.98014158, (float)0.97948742,
-(float)0.97882277, (float)0.97814757, (float)0.97746193, (float)0.97676587, (float)0.97605932,
-(float)0.97534227, (float)0.97461486, (float)0.97387695, (float)0.97312862, (float)0.97236991,
-(float)0.97160077, (float)0.97082120, (float)0.97003126, (float)0.96923089, (float)0.96842015,
-(float)0.96759909, (float)0.96676761, (float)0.96592581, (float)0.96507365, (float)0.96421117,
-(float)0.96333838, (float)0.96245521, (float)0.96156180, (float)0.96065807, (float)0.95974404,
-(float)0.95881969, (float)0.95788515, (float)0.95694029, (float)0.95598525, (float)0.95501995,
-(float)0.95404440, (float)0.95305860, (float)0.95206267, (float)0.95105648, (float)0.95004016,
-(float)0.94901365, (float)0.94797695, (float)0.94693011, (float)0.94587314, (float)0.94480604,
-(float)0.94372880, (float)0.94264150, (float)0.94154406, (float)0.94043654, (float)0.93931895,
-(float)0.93819129, (float)0.93705362, (float)0.93590593, (float)0.93474817, (float)0.93358046,
-(float)0.93240267, (float)0.93121493, (float)0.93001723, (float)0.92880952, (float)0.92759192,
-(float)0.92636436, (float)0.92512691, (float)0.92387950, (float)0.92262226, (float)0.92135507,
-(float)0.92007804, (float)0.91879123, (float)0.91749448, (float)0.91618794, (float)0.91487157,
-(float)0.91354543, (float)0.91220951, (float)0.91086382, (float)0.90950835, (float)0.90814310,
-(float)0.90676820, (float)0.90538365, (float)0.90398932, (float)0.90258527, (float)0.90117157,
-(float)0.89974827, (float)0.89831525, (float)0.89687276, (float)0.89542055, (float)0.89395875,
-(float)0.89248741, (float)0.89100647, (float)0.88951600, (float)0.88801610, (float)0.88650662,
-(float)0.88498759, (float)0.88345915, (float)0.88192123, (float)0.88037384, (float)0.87881714,
-(float)0.87725091, (float)0.87567532, (float)0.87409031, (float)0.87249595, (float)0.87089223,
-(float)0.86927933, (float)0.86765701, (float)0.86602539, (float)0.86438447, (float)0.86273432,
-(float)0.86107504, (float)0.85940641, (float)0.85772860, (float)0.85604161, (float)0.85434544,
-(float)0.85264009, (float)0.85092574, (float)0.84920216, (float)0.84746951, (float)0.84572780,
-(float)0.84397697, (float)0.84221715, (float)0.84044844, (float)0.83867055, (float)0.83688372,
-(float)0.83508795, (float)0.83328319, (float)0.83146954, (float)0.82964706, (float)0.82781565,
-(float)0.82597530, (float)0.82412612, (float)0.82226813, (float)0.82040137, (float)0.81852591,
-(float)0.81664157, (float)0.81474847, (float)0.81284660, (float)0.81093609, (float)0.80901700,
-(float)0.80708915, (float)0.80515265, (float)0.80320752, (float)0.80125374, (float)0.79929143,
-(float)0.79732066, (float)0.79534125, (float)0.79335332, (float)0.79135686, (float)0.78935200,
-(float)0.78733861, (float)0.78531694, (float)0.78328675, (float)0.78124815, (float)0.77920121,
-(float)0.77714586, (float)0.77508223, (float)0.77301049, (float)0.77093029, (float)0.76884180,
-(float)0.76674509, (float)0.76464021, (float)0.76252711, (float)0.76040596, (float)0.75827658,
-(float)0.75613904, (float)0.75399339, (float)0.75183970, (float)0.74967796, (float)0.74750835,
-(float)0.74533057, (float)0.74314481, (float)0.74095106, (float)0.73874938, (float)0.73653996,
-(float)0.73432249, (float)0.73209721, (float)0.72986400, (float)0.72762305, (float)0.72537428,
-(float)0.72311789, (float)0.72085363, (float)0.71858162, (float)0.71630186, (float)0.71401453,
-(float)0.71171951, (float)0.70941705, (float)0.70710677, (float)0.70478898, (float)0.70246363,
-(float)0.70013070, (float)0.69779032, (float)0.69544268, (float)0.69308734, (float)0.69072461,
-(float)0.68835449, (float)0.68597704, (float)0.68359220, (float)0.68120021, (float)0.67880070,
-(float)0.67639399, (float)0.67398006, (float)0.67155886, (float)0.66913044, (float)0.66669512,
-(float)0.66425240, (float)0.66180259, (float)0.65934575, (float)0.65688181, (float)0.65441096,
-(float)0.65193301, (float)0.64944804, (float)0.64695609, (float)0.64445722, (float)0.64195150,
-(float)0.63943905, (float)0.63691956, (float)0.63439327, (float)0.63186014, (float)0.62932026,
-(float)0.62677372, (float)0.62422055, (float)0.62166059, (float)0.61909389, (float)0.61652064,
-(float)0.61394072, (float)0.61135429, (float)0.60876143, (float)0.60616189, (float)0.60355592,
-(float)0.60094339, (float)0.59832448, (float)0.59569913, (float)0.59306765, (float)0.59042960,
-(float)0.58778518, (float)0.58513451, (float)0.58247757, (float)0.57981461, (float)0.57714522,
-(float)0.57446963, (float)0.57178789, (float)0.56910002, (float)0.56640613, (float)0.56370628,
-(float)0.56100023, (float)0.55828822, (float)0.55557019, (float)0.55284619, (float)0.55011630,
-(float)0.54738069, (float)0.54463905, (float)0.54189152, (float)0.53913826, (float)0.53637916,
-(float)0.53361434, (float)0.53084403, (float)0.52806783, (float)0.52528596, (float)0.52249849,
-(float)0.51970541, (float)0.51690674, (float)0.51410276, (float)0.51129305, (float)0.50847787,
-(float)0.50565726, (float)0.50283122, (float)0.50000006, (float)0.49716327, (float)0.49432117,
-(float)0.49147379, (float)0.48862115, (float)0.48576325, (float)0.48290038, (float)0.48003212,
-(float)0.47715873, (float)0.47428021, (float)0.47139663, (float)0.46850798, (float)0.46561456,
-(float)0.46271589, (float)0.45981231, (float)0.45690379, (float)0.45399037, (float)0.45107210,
-(float)0.44814920, (float)0.44522130, (float)0.44228864, (float)0.43935123, (float)0.43640912,
-(float)0.43346232, (float)0.43051112, (float)0.42755505, (float)0.42459446, (float)0.42162928,
-(float)0.41865960, (float)0.41568545, (float)0.41270703, (float)0.40972400, (float)0.40673658,
-(float)0.40374479, (float)0.40074870, (float)0.39774850, (float)0.39474386, (float)0.39173496,
-(float)0.38872188, (float)0.38570464, (float)0.38268328, (float)0.37965804, (float)0.37662849,
-(float)0.37359491, (float)0.37055734, (float)0.36751580, (float)0.36447033, (float)0.36142117,
-(float)0.35836792, (float)0.35531086, (float)0.35224995, (float)0.34918529, (float)0.34611690,
-(float)0.34304500, (float)0.33996922, (float)0.33688980, (float)0.33380675, (float)0.33072016,
-(float)0.32763001, (float)0.32453656, (float)0.32143945, (float)0.31833887, (float)0.31523487,
-(float)0.31212750, (float)0.30901679, (float)0.30590302, (float)0.30278572, (float)0.29966521,
-(float)0.29654145, (float)0.29341453, (float)0.29028472, (float)0.28715155, (float)0.28401530,
-(float)0.28087601, (float)0.27773371, (float)0.27458847, (float)0.27144048, (float)0.26828936,
-(float)0.26513538, (float)0.26197854, (float)0.25881892, (float)0.25565651, (float)0.25249159,
-(float)0.24932374, (float)0.24615324, (float)0.24298008, (float)0.23980433, (float)0.23662600,
-(float)0.23344538, (float)0.23026201, (float)0.22707619, (float)0.22388794, (float)0.22069728,
-(float)0.21750426, (float)0.21430916, (float)0.21111152, (float)0.20791161, (float)0.20470949,
-(float)0.20150517, (float)0.19829892, (float)0.19509031, (float)0.19187963, (float)0.18866688,
-(float)0.18545210, (float)0.18223536, (float)0.17901689, (float)0.17579627, (float)0.17257376,
-(float)0.16934940, (float)0.16612324, (float)0.16289529, (float)0.15966584, (float)0.15643445,
-(float)0.15320137, (float)0.14996666, (float)0.14673033, (float)0.14349243, (float)0.14025325,
-(float)0.13701232, (float)0.13376991, (float)0.13052608, (float)0.12728085, (float)0.12403426,
-(float)0.12078657, (float)0.11753736, (float)0.11428688, (float)0.11103519, (float)0.10778230,
-(float)0.10452849, (float)0.10127334, (float)0.09801710, (float)0.09475980, (float)0.09150149,
-(float)0.08824220, (float)0.08498220, (float)0.08172106, (float)0.07845904, (float)0.07519618,
-(float)0.07193252, (float)0.06866808, (float)0.06540315, (float)0.06213728, (float)0.05887074,
-(float)0.05560357, (float)0.05233581, (float)0.04906749, (float)0.04579888, (float)0.04252954,
-(float)0.03925974, (float)0.03598953, (float)0.03271893, (float)0.02944798, (float)0.02617695,
-(float)0.02290541, (float)0.01963361, (float)0.01636161, (float)0.01308943, (float)0.00981712,
-(float)0.00654493, (float)0.00327244, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000};
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_WINDOWS_PRIVATE_H_
diff --git a/src/modules/audio_processing/utility/Android.mk b/src/modules/audio_processing/utility/Android.mk
deleted file mode 100644
index 7e758ce..0000000
--- a/src/modules/audio_processing/utility/Android.mk
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_ARM_MODE := arm
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_MODULE := libwebrtc_apm_utility
-LOCAL_MODULE_TAGS := optional
-LOCAL_GENERATED_SOURCES :=
-LOCAL_SRC_FILES := fft4g.c \
- ring_buffer.c
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS :=
-MY_CFLAGS_C :=
-MY_DEFS := '-DNO_TCMALLOC' \
- '-DNO_HEAPCHECKER' \
- '-DWEBRTC_TARGET_PC' \
- '-DWEBRTC_LINUX' \
- '-DWEBRTC_THREAD_RR' \
- '-DWEBRTC_ANDROID' \
- '-DANDROID'
-LOCAL_CFLAGS := $(MY_CFLAGS_C) $(MY_CFLAGS) $(MY_DEFS)
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES := \
- $(LOCAL_PATH)
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS :=
-LOCAL_LDFLAGS :=
-
-LOCAL_STATIC_LIBRARIES :=
-
-LOCAL_SHARED_LIBRARIES := libcutils \
- libdl \
- libstlport
-LOCAL_ADDITIONAL_DEPENDENCIES :=
-
-include external/stlport/libstlport.mk
-include $(BUILD_STATIC_LIBRARY)
diff --git a/src/modules/audio_processing/utility/fft4g.c b/src/modules/audio_processing/utility/fft4g.c
deleted file mode 100644
index 9a84368..0000000
--- a/src/modules/audio_processing/utility/fft4g.c
+++ /dev/null
@@ -1,1356 +0,0 @@
-/*
- * http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html
- * Copyright Takuya OOURA, 1996-2001
- *
- * You may use, copy, modify and distribute this code for any purpose (include
- * commercial use) and without fee. Please refer to this package when you modify
- * this code.
- *
- * Changes:
- * Trivial type modifications by the WebRTC authors.
- */
-
-/*
-Fast Fourier/Cosine/Sine Transform
- dimension :one
- data length :power of 2
- decimation :frequency
- radix :4, 2
- data :inplace
- table :use
-functions
- cdft: Complex Discrete Fourier Transform
- rdft: Real Discrete Fourier Transform
- ddct: Discrete Cosine Transform
- ddst: Discrete Sine Transform
- dfct: Cosine Transform of RDFT (Real Symmetric DFT)
- dfst: Sine Transform of RDFT (Real Anti-symmetric DFT)
-function prototypes
- void cdft(int, int, float *, int *, float *);
- void rdft(int, int, float *, int *, float *);
- void ddct(int, int, float *, int *, float *);
- void ddst(int, int, float *, int *, float *);
- void dfct(int, float *, float *, int *, float *);
- void dfst(int, float *, float *, int *, float *);
-
-
--------- Complex DFT (Discrete Fourier Transform) --------
- [definition]
- <case1>
- X[k] = sum_j=0^n-1 x[j]*exp(2*pi*i*j*k/n), 0<=k<n
- <case2>
- X[k] = sum_j=0^n-1 x[j]*exp(-2*pi*i*j*k/n), 0<=k<n
- (notes: sum_j=0^n-1 is a summation from j=0 to n-1)
- [usage]
- <case1>
- ip[0] = 0; // first time only
- cdft(2*n, 1, a, ip, w);
- <case2>
- ip[0] = 0; // first time only
- cdft(2*n, -1, a, ip, w);
- [parameters]
- 2*n :data length (int)
- n >= 1, n = power of 2
- a[0...2*n-1] :input/output data (float *)
- input data
- a[2*j] = Re(x[j]),
- a[2*j+1] = Im(x[j]), 0<=j<n
- output data
- a[2*k] = Re(X[k]),
- a[2*k+1] = Im(X[k]), 0<=k<n
- ip[0...*] :work area for bit reversal (int *)
- length of ip >= 2+sqrt(n)
- strictly,
- length of ip >=
- 2+(1<<(int)(log(n+0.5)/log(2))/2).
- ip[0],ip[1] are pointers of the cos/sin table.
- w[0...n/2-1] :cos/sin table (float *)
- w[],ip[] are initialized if ip[0] == 0.
- [remark]
- Inverse of
- cdft(2*n, -1, a, ip, w);
- is
- cdft(2*n, 1, a, ip, w);
- for (j = 0; j <= 2 * n - 1; j++) {
- a[j] *= 1.0 / n;
- }
- .
-
-
--------- Real DFT / Inverse of Real DFT --------
- [definition]
- <case1> RDFT
- R[k] = sum_j=0^n-1 a[j]*cos(2*pi*j*k/n), 0<=k<=n/2
- I[k] = sum_j=0^n-1 a[j]*sin(2*pi*j*k/n), 0<k<n/2
- <case2> IRDFT (excluding scale)
- a[k] = (R[0] + R[n/2]*cos(pi*k))/2 +
- sum_j=1^n/2-1 R[j]*cos(2*pi*j*k/n) +
- sum_j=1^n/2-1 I[j]*sin(2*pi*j*k/n), 0<=k<n
- [usage]
- <case1>
- ip[0] = 0; // first time only
- rdft(n, 1, a, ip, w);
- <case2>
- ip[0] = 0; // first time only
- rdft(n, -1, a, ip, w);
- [parameters]
- n :data length (int)
- n >= 2, n = power of 2
- a[0...n-1] :input/output data (float *)
- <case1>
- output data
- a[2*k] = R[k], 0<=k<n/2
- a[2*k+1] = I[k], 0<k<n/2
- a[1] = R[n/2]
- <case2>
- input data
- a[2*j] = R[j], 0<=j<n/2
- a[2*j+1] = I[j], 0<j<n/2
- a[1] = R[n/2]
- ip[0...*] :work area for bit reversal (int *)
- length of ip >= 2+sqrt(n/2)
- strictly,
- length of ip >=
- 2+(1<<(int)(log(n/2+0.5)/log(2))/2).
- ip[0],ip[1] are pointers of the cos/sin table.
- w[0...n/2-1] :cos/sin table (float *)
- w[],ip[] are initialized if ip[0] == 0.
- [remark]
- Inverse of
- rdft(n, 1, a, ip, w);
- is
- rdft(n, -1, a, ip, w);
- for (j = 0; j <= n - 1; j++) {
- a[j] *= 2.0 / n;
- }
- .
-
-
--------- DCT (Discrete Cosine Transform) / Inverse of DCT --------
- [definition]
- <case1> IDCT (excluding scale)
- C[k] = sum_j=0^n-1 a[j]*cos(pi*j*(k+1/2)/n), 0<=k<n
- <case2> DCT
- C[k] = sum_j=0^n-1 a[j]*cos(pi*(j+1/2)*k/n), 0<=k<n
- [usage]
- <case1>
- ip[0] = 0; // first time only
- ddct(n, 1, a, ip, w);
- <case2>
- ip[0] = 0; // first time only
- ddct(n, -1, a, ip, w);
- [parameters]
- n :data length (int)
- n >= 2, n = power of 2
- a[0...n-1] :input/output data (float *)
- output data
- a[k] = C[k], 0<=k<n
- ip[0...*] :work area for bit reversal (int *)
- length of ip >= 2+sqrt(n/2)
- strictly,
- length of ip >=
- 2+(1<<(int)(log(n/2+0.5)/log(2))/2).
- ip[0],ip[1] are pointers of the cos/sin table.
- w[0...n*5/4-1] :cos/sin table (float *)
- w[],ip[] are initialized if ip[0] == 0.
- [remark]
- Inverse of
- ddct(n, -1, a, ip, w);
- is
- a[0] *= 0.5;
- ddct(n, 1, a, ip, w);
- for (j = 0; j <= n - 1; j++) {
- a[j] *= 2.0 / n;
- }
- .
-
-
--------- DST (Discrete Sine Transform) / Inverse of DST --------
- [definition]
- <case1> IDST (excluding scale)
- S[k] = sum_j=1^n A[j]*sin(pi*j*(k+1/2)/n), 0<=k<n
- <case2> DST
- S[k] = sum_j=0^n-1 a[j]*sin(pi*(j+1/2)*k/n), 0<k<=n
- [usage]
- <case1>
- ip[0] = 0; // first time only
- ddst(n, 1, a, ip, w);
- <case2>
- ip[0] = 0; // first time only
- ddst(n, -1, a, ip, w);
- [parameters]
- n :data length (int)
- n >= 2, n = power of 2
- a[0...n-1] :input/output data (float *)
- <case1>
- input data
- a[j] = A[j], 0<j<n
- a[0] = A[n]
- output data
- a[k] = S[k], 0<=k<n
- <case2>
- output data
- a[k] = S[k], 0<k<n
- a[0] = S[n]
- ip[0...*] :work area for bit reversal (int *)
- length of ip >= 2+sqrt(n/2)
- strictly,
- length of ip >=
- 2+(1<<(int)(log(n/2+0.5)/log(2))/2).
- ip[0],ip[1] are pointers of the cos/sin table.
- w[0...n*5/4-1] :cos/sin table (float *)
- w[],ip[] are initialized if ip[0] == 0.
- [remark]
- Inverse of
- ddst(n, -1, a, ip, w);
- is
- a[0] *= 0.5;
- ddst(n, 1, a, ip, w);
- for (j = 0; j <= n - 1; j++) {
- a[j] *= 2.0 / n;
- }
- .
-
-
--------- Cosine Transform of RDFT (Real Symmetric DFT) --------
- [definition]
- C[k] = sum_j=0^n a[j]*cos(pi*j*k/n), 0<=k<=n
- [usage]
- ip[0] = 0; // first time only
- dfct(n, a, t, ip, w);
- [parameters]
- n :data length - 1 (int)
- n >= 2, n = power of 2
- a[0...n] :input/output data (float *)
- output data
- a[k] = C[k], 0<=k<=n
- t[0...n/2] :work area (float *)
- ip[0...*] :work area for bit reversal (int *)
- length of ip >= 2+sqrt(n/4)
- strictly,
- length of ip >=
- 2+(1<<(int)(log(n/4+0.5)/log(2))/2).
- ip[0],ip[1] are pointers of the cos/sin table.
- w[0...n*5/8-1] :cos/sin table (float *)
- w[],ip[] are initialized if ip[0] == 0.
- [remark]
- Inverse of
- a[0] *= 0.5;
- a[n] *= 0.5;
- dfct(n, a, t, ip, w);
- is
- a[0] *= 0.5;
- a[n] *= 0.5;
- dfct(n, a, t, ip, w);
- for (j = 0; j <= n; j++) {
- a[j] *= 2.0 / n;
- }
- .
-
-
--------- Sine Transform of RDFT (Real Anti-symmetric DFT) --------
- [definition]
- S[k] = sum_j=1^n-1 a[j]*sin(pi*j*k/n), 0<k<n
- [usage]
- ip[0] = 0; // first time only
- dfst(n, a, t, ip, w);
- [parameters]
- n :data length + 1 (int)
- n >= 2, n = power of 2
- a[0...n-1] :input/output data (float *)
- output data
- a[k] = S[k], 0<k<n
- (a[0] is used for work area)
- t[0...n/2-1] :work area (float *)
- ip[0...*] :work area for bit reversal (int *)
- length of ip >= 2+sqrt(n/4)
- strictly,
- length of ip >=
- 2+(1<<(int)(log(n/4+0.5)/log(2))/2).
- ip[0],ip[1] are pointers of the cos/sin table.
- w[0...n*5/8-1] :cos/sin table (float *)
- w[],ip[] are initialized if ip[0] == 0.
- [remark]
- Inverse of
- dfst(n, a, t, ip, w);
- is
- dfst(n, a, t, ip, w);
- for (j = 1; j <= n - 1; j++) {
- a[j] *= 2.0 / n;
- }
- .
-
-
-Appendix :
- The cos/sin table is recalculated when the larger table required.
- w[] and ip[] are compatible with all routines.
-*/
-
-void cdft(int n, int isgn, float *a, int *ip, float *w)
-{
- void makewt(int nw, int *ip, float *w);
- void bitrv2(int n, int *ip, float *a);
- void bitrv2conj(int n, int *ip, float *a);
- void cftfsub(int n, float *a, float *w);
- void cftbsub(int n, float *a, float *w);
-
- if (n > (ip[0] << 2)) {
- makewt(n >> 2, ip, w);
- }
- if (n > 4) {
- if (isgn >= 0) {
- bitrv2(n, ip + 2, a);
- cftfsub(n, a, w);
- } else {
- bitrv2conj(n, ip + 2, a);
- cftbsub(n, a, w);
- }
- } else if (n == 4) {
- cftfsub(n, a, w);
- }
-}
-
-
-void rdft(int n, int isgn, float *a, int *ip, float *w)
-{
- void makewt(int nw, int *ip, float *w);
- void makect(int nc, int *ip, float *c);
- void bitrv2(int n, int *ip, float *a);
- void cftfsub(int n, float *a, float *w);
- void cftbsub(int n, float *a, float *w);
- void rftfsub(int n, float *a, int nc, float *c);
- void rftbsub(int n, float *a, int nc, float *c);
- int nw, nc;
- float xi;
-
- nw = ip[0];
- if (n > (nw << 2)) {
- nw = n >> 2;
- makewt(nw, ip, w);
- }
- nc = ip[1];
- if (n > (nc << 2)) {
- nc = n >> 2;
- makect(nc, ip, w + nw);
- }
- if (isgn >= 0) {
- if (n > 4) {
- bitrv2(n, ip + 2, a);
- cftfsub(n, a, w);
- rftfsub(n, a, nc, w + nw);
- } else if (n == 4) {
- cftfsub(n, a, w);
- }
- xi = a[0] - a[1];
- a[0] += a[1];
- a[1] = xi;
- } else {
- a[1] = 0.5f * (a[0] - a[1]);
- a[0] -= a[1];
- if (n > 4) {
- rftbsub(n, a, nc, w + nw);
- bitrv2(n, ip + 2, a);
- cftbsub(n, a, w);
- } else if (n == 4) {
- cftfsub(n, a, w);
- }
- }
-}
-
-
-void ddct(int n, int isgn, float *a, int *ip, float *w)
-{
- void makewt(int nw, int *ip, float *w);
- void makect(int nc, int *ip, float *c);
- void bitrv2(int n, int *ip, float *a);
- void cftfsub(int n, float *a, float *w);
- void cftbsub(int n, float *a, float *w);
- void rftfsub(int n, float *a, int nc, float *c);
- void rftbsub(int n, float *a, int nc, float *c);
- void dctsub(int n, float *a, int nc, float *c);
- int j, nw, nc;
- float xr;
-
- nw = ip[0];
- if (n > (nw << 2)) {
- nw = n >> 2;
- makewt(nw, ip, w);
- }
- nc = ip[1];
- if (n > nc) {
- nc = n;
- makect(nc, ip, w + nw);
- }
- if (isgn < 0) {
- xr = a[n - 1];
- for (j = n - 2; j >= 2; j -= 2) {
- a[j + 1] = a[j] - a[j - 1];
- a[j] += a[j - 1];
- }
- a[1] = a[0] - xr;
- a[0] += xr;
- if (n > 4) {
- rftbsub(n, a, nc, w + nw);
- bitrv2(n, ip + 2, a);
- cftbsub(n, a, w);
- } else if (n == 4) {
- cftfsub(n, a, w);
- }
- }
- dctsub(n, a, nc, w + nw);
- if (isgn >= 0) {
- if (n > 4) {
- bitrv2(n, ip + 2, a);
- cftfsub(n, a, w);
- rftfsub(n, a, nc, w + nw);
- } else if (n == 4) {
- cftfsub(n, a, w);
- }
- xr = a[0] - a[1];
- a[0] += a[1];
- for (j = 2; j < n; j += 2) {
- a[j - 1] = a[j] - a[j + 1];
- a[j] += a[j + 1];
- }
- a[n - 1] = xr;
- }
-}
-
-
-void ddst(int n, int isgn, float *a, int *ip, float *w)
-{
- void makewt(int nw, int *ip, float *w);
- void makect(int nc, int *ip, float *c);
- void bitrv2(int n, int *ip, float *a);
- void cftfsub(int n, float *a, float *w);
- void cftbsub(int n, float *a, float *w);
- void rftfsub(int n, float *a, int nc, float *c);
- void rftbsub(int n, float *a, int nc, float *c);
- void dstsub(int n, float *a, int nc, float *c);
- int j, nw, nc;
- float xr;
-
- nw = ip[0];
- if (n > (nw << 2)) {
- nw = n >> 2;
- makewt(nw, ip, w);
- }
- nc = ip[1];
- if (n > nc) {
- nc = n;
- makect(nc, ip, w + nw);
- }
- if (isgn < 0) {
- xr = a[n - 1];
- for (j = n - 2; j >= 2; j -= 2) {
- a[j + 1] = -a[j] - a[j - 1];
- a[j] -= a[j - 1];
- }
- a[1] = a[0] + xr;
- a[0] -= xr;
- if (n > 4) {
- rftbsub(n, a, nc, w + nw);
- bitrv2(n, ip + 2, a);
- cftbsub(n, a, w);
- } else if (n == 4) {
- cftfsub(n, a, w);
- }
- }
- dstsub(n, a, nc, w + nw);
- if (isgn >= 0) {
- if (n > 4) {
- bitrv2(n, ip + 2, a);
- cftfsub(n, a, w);
- rftfsub(n, a, nc, w + nw);
- } else if (n == 4) {
- cftfsub(n, a, w);
- }
- xr = a[0] - a[1];
- a[0] += a[1];
- for (j = 2; j < n; j += 2) {
- a[j - 1] = -a[j] - a[j + 1];
- a[j] -= a[j + 1];
- }
- a[n - 1] = -xr;
- }
-}
-
-
-void dfct(int n, float *a, float *t, int *ip, float *w)
-{
- void makewt(int nw, int *ip, float *w);
- void makect(int nc, int *ip, float *c);
- void bitrv2(int n, int *ip, float *a);
- void cftfsub(int n, float *a, float *w);
- void rftfsub(int n, float *a, int nc, float *c);
- void dctsub(int n, float *a, int nc, float *c);
- int j, k, l, m, mh, nw, nc;
- float xr, xi, yr, yi;
-
- nw = ip[0];
- if (n > (nw << 3)) {
- nw = n >> 3;
- makewt(nw, ip, w);
- }
- nc = ip[1];
- if (n > (nc << 1)) {
- nc = n >> 1;
- makect(nc, ip, w + nw);
- }
- m = n >> 1;
- yi = a[m];
- xi = a[0] + a[n];
- a[0] -= a[n];
- t[0] = xi - yi;
- t[m] = xi + yi;
- if (n > 2) {
- mh = m >> 1;
- for (j = 1; j < mh; j++) {
- k = m - j;
- xr = a[j] - a[n - j];
- xi = a[j] + a[n - j];
- yr = a[k] - a[n - k];
- yi = a[k] + a[n - k];
- a[j] = xr;
- a[k] = yr;
- t[j] = xi - yi;
- t[k] = xi + yi;
- }
- t[mh] = a[mh] + a[n - mh];
- a[mh] -= a[n - mh];
- dctsub(m, a, nc, w + nw);
- if (m > 4) {
- bitrv2(m, ip + 2, a);
- cftfsub(m, a, w);
- rftfsub(m, a, nc, w + nw);
- } else if (m == 4) {
- cftfsub(m, a, w);
- }
- a[n - 1] = a[0] - a[1];
- a[1] = a[0] + a[1];
- for (j = m - 2; j >= 2; j -= 2) {
- a[2 * j + 1] = a[j] + a[j + 1];
- a[2 * j - 1] = a[j] - a[j + 1];
- }
- l = 2;
- m = mh;
- while (m >= 2) {
- dctsub(m, t, nc, w + nw);
- if (m > 4) {
- bitrv2(m, ip + 2, t);
- cftfsub(m, t, w);
- rftfsub(m, t, nc, w + nw);
- } else if (m == 4) {
- cftfsub(m, t, w);
- }
- a[n - l] = t[0] - t[1];
- a[l] = t[0] + t[1];
- k = 0;
- for (j = 2; j < m; j += 2) {
- k += l << 2;
- a[k - l] = t[j] - t[j + 1];
- a[k + l] = t[j] + t[j + 1];
- }
- l <<= 1;
- mh = m >> 1;
- for (j = 0; j < mh; j++) {
- k = m - j;
- t[j] = t[m + k] - t[m + j];
- t[k] = t[m + k] + t[m + j];
- }
- t[mh] = t[m + mh];
- m = mh;
- }
- a[l] = t[0];
- a[n] = t[2] - t[1];
- a[0] = t[2] + t[1];
- } else {
- a[1] = a[0];
- a[2] = t[0];
- a[0] = t[1];
- }
-}
-
-
-void dfst(int n, float *a, float *t, int *ip, float *w)
-{
- void makewt(int nw, int *ip, float *w);
- void makect(int nc, int *ip, float *c);
- void bitrv2(int n, int *ip, float *a);
- void cftfsub(int n, float *a, float *w);
- void rftfsub(int n, float *a, int nc, float *c);
- void dstsub(int n, float *a, int nc, float *c);
- int j, k, l, m, mh, nw, nc;
- float xr, xi, yr, yi;
-
- nw = ip[0];
- if (n > (nw << 3)) {
- nw = n >> 3;
- makewt(nw, ip, w);
- }
- nc = ip[1];
- if (n > (nc << 1)) {
- nc = n >> 1;
- makect(nc, ip, w + nw);
- }
- if (n > 2) {
- m = n >> 1;
- mh = m >> 1;
- for (j = 1; j < mh; j++) {
- k = m - j;
- xr = a[j] + a[n - j];
- xi = a[j] - a[n - j];
- yr = a[k] + a[n - k];
- yi = a[k] - a[n - k];
- a[j] = xr;
- a[k] = yr;
- t[j] = xi + yi;
- t[k] = xi - yi;
- }
- t[0] = a[mh] - a[n - mh];
- a[mh] += a[n - mh];
- a[0] = a[m];
- dstsub(m, a, nc, w + nw);
- if (m > 4) {
- bitrv2(m, ip + 2, a);
- cftfsub(m, a, w);
- rftfsub(m, a, nc, w + nw);
- } else if (m == 4) {
- cftfsub(m, a, w);
- }
- a[n - 1] = a[1] - a[0];
- a[1] = a[0] + a[1];
- for (j = m - 2; j >= 2; j -= 2) {
- a[2 * j + 1] = a[j] - a[j + 1];
- a[2 * j - 1] = -a[j] - a[j + 1];
- }
- l = 2;
- m = mh;
- while (m >= 2) {
- dstsub(m, t, nc, w + nw);
- if (m > 4) {
- bitrv2(m, ip + 2, t);
- cftfsub(m, t, w);
- rftfsub(m, t, nc, w + nw);
- } else if (m == 4) {
- cftfsub(m, t, w);
- }
- a[n - l] = t[1] - t[0];
- a[l] = t[0] + t[1];
- k = 0;
- for (j = 2; j < m; j += 2) {
- k += l << 2;
- a[k - l] = -t[j] - t[j + 1];
- a[k + l] = t[j] - t[j + 1];
- }
- l <<= 1;
- mh = m >> 1;
- for (j = 1; j < mh; j++) {
- k = m - j;
- t[j] = t[m + k] + t[m + j];
- t[k] = t[m + k] - t[m + j];
- }
- t[0] = t[m + mh];
- m = mh;
- }
- a[l] = t[0];
- }
- a[0] = 0;
-}
-
-
-/* -------- initializing routines -------- */
-
-
-#include <math.h>
-
-void makewt(int nw, int *ip, float *w)
-{
- void bitrv2(int n, int *ip, float *a);
- int j, nwh;
- float delta, x, y;
-
- ip[0] = nw;
- ip[1] = 1;
- if (nw > 2) {
- nwh = nw >> 1;
- delta = (float)atan(1.0f) / nwh;
- w[0] = 1;
- w[1] = 0;
- w[nwh] = (float)cos(delta * nwh);
- w[nwh + 1] = w[nwh];
- if (nwh > 2) {
- for (j = 2; j < nwh; j += 2) {
- x = (float)cos(delta * j);
- y = (float)sin(delta * j);
- w[j] = x;
- w[j + 1] = y;
- w[nw - j] = y;
- w[nw - j + 1] = x;
- }
- bitrv2(nw, ip + 2, w);
- }
- }
-}
-
-
-void makect(int nc, int *ip, float *c)
-{
- int j, nch;
- float delta;
-
- ip[1] = nc;
- if (nc > 1) {
- nch = nc >> 1;
- delta = (float)atan(1.0f) / nch;
- c[0] = (float)cos(delta * nch);
- c[nch] = 0.5f * c[0];
- for (j = 1; j < nch; j++) {
- c[j] = 0.5f * (float)cos(delta * j);
- c[nc - j] = 0.5f * (float)sin(delta * j);
- }
- }
-}
-
-
-/* -------- child routines -------- */
-
-
-void bitrv2(int n, int *ip, float *a)
-{
- int j, j1, k, k1, l, m, m2;
- float xr, xi, yr, yi;
-
- ip[0] = 0;
- l = n;
- m = 1;
- while ((m << 3) < l) {
- l >>= 1;
- for (j = 0; j < m; j++) {
- ip[m + j] = ip[j] + l;
- }
- m <<= 1;
- }
- m2 = 2 * m;
- if ((m << 3) == l) {
- for (k = 0; k < m; k++) {
- for (j = 0; j < k; j++) {
- j1 = 2 * j + ip[k];
- k1 = 2 * k + ip[j];
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- j1 += m2;
- k1 += 2 * m2;
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- j1 += m2;
- k1 -= m2;
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- j1 += m2;
- k1 += 2 * m2;
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- }
- j1 = 2 * k + m2 + ip[k];
- k1 = j1 + m2;
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- }
- } else {
- for (k = 1; k < m; k++) {
- for (j = 0; j < k; j++) {
- j1 = 2 * j + ip[k];
- k1 = 2 * k + ip[j];
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- j1 += m2;
- k1 += m2;
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- }
- }
- }
-}
-
-
-void bitrv2conj(int n, int *ip, float *a)
-{
- int j, j1, k, k1, l, m, m2;
- float xr, xi, yr, yi;
-
- ip[0] = 0;
- l = n;
- m = 1;
- while ((m << 3) < l) {
- l >>= 1;
- for (j = 0; j < m; j++) {
- ip[m + j] = ip[j] + l;
- }
- m <<= 1;
- }
- m2 = 2 * m;
- if ((m << 3) == l) {
- for (k = 0; k < m; k++) {
- for (j = 0; j < k; j++) {
- j1 = 2 * j + ip[k];
- k1 = 2 * k + ip[j];
- xr = a[j1];
- xi = -a[j1 + 1];
- yr = a[k1];
- yi = -a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- j1 += m2;
- k1 += 2 * m2;
- xr = a[j1];
- xi = -a[j1 + 1];
- yr = a[k1];
- yi = -a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- j1 += m2;
- k1 -= m2;
- xr = a[j1];
- xi = -a[j1 + 1];
- yr = a[k1];
- yi = -a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- j1 += m2;
- k1 += 2 * m2;
- xr = a[j1];
- xi = -a[j1 + 1];
- yr = a[k1];
- yi = -a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- }
- k1 = 2 * k + ip[k];
- a[k1 + 1] = -a[k1 + 1];
- j1 = k1 + m2;
- k1 = j1 + m2;
- xr = a[j1];
- xi = -a[j1 + 1];
- yr = a[k1];
- yi = -a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- k1 += m2;
- a[k1 + 1] = -a[k1 + 1];
- }
- } else {
- a[1] = -a[1];
- a[m2 + 1] = -a[m2 + 1];
- for (k = 1; k < m; k++) {
- for (j = 0; j < k; j++) {
- j1 = 2 * j + ip[k];
- k1 = 2 * k + ip[j];
- xr = a[j1];
- xi = -a[j1 + 1];
- yr = a[k1];
- yi = -a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- j1 += m2;
- k1 += m2;
- xr = a[j1];
- xi = -a[j1 + 1];
- yr = a[k1];
- yi = -a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- }
- k1 = 2 * k + ip[k];
- a[k1 + 1] = -a[k1 + 1];
- a[k1 + m2 + 1] = -a[k1 + m2 + 1];
- }
- }
-}
-
-
-void cftfsub(int n, float *a, float *w)
-{
- void cft1st(int n, float *a, float *w);
- void cftmdl(int n, int l, float *a, float *w);
- int j, j1, j2, j3, l;
- float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
- l = 2;
- if (n > 8) {
- cft1st(n, a, w);
- l = 8;
- while ((l << 2) < n) {
- cftmdl(n, l, a, w);
- l <<= 2;
- }
- }
- if ((l << 2) == n) {
- for (j = 0; j < l; j += 2) {
- j1 = j + l;
- j2 = j1 + l;
- j3 = j2 + l;
- x0r = a[j] + a[j1];
- x0i = a[j + 1] + a[j1 + 1];
- x1r = a[j] - a[j1];
- x1i = a[j + 1] - a[j1 + 1];
- x2r = a[j2] + a[j3];
- x2i = a[j2 + 1] + a[j3 + 1];
- x3r = a[j2] - a[j3];
- x3i = a[j2 + 1] - a[j3 + 1];
- a[j] = x0r + x2r;
- a[j + 1] = x0i + x2i;
- a[j2] = x0r - x2r;
- a[j2 + 1] = x0i - x2i;
- a[j1] = x1r - x3i;
- a[j1 + 1] = x1i + x3r;
- a[j3] = x1r + x3i;
- a[j3 + 1] = x1i - x3r;
- }
- } else {
- for (j = 0; j < l; j += 2) {
- j1 = j + l;
- x0r = a[j] - a[j1];
- x0i = a[j + 1] - a[j1 + 1];
- a[j] += a[j1];
- a[j + 1] += a[j1 + 1];
- a[j1] = x0r;
- a[j1 + 1] = x0i;
- }
- }
-}
-
-
-void cftbsub(int n, float *a, float *w)
-{
- void cft1st(int n, float *a, float *w);
- void cftmdl(int n, int l, float *a, float *w);
- int j, j1, j2, j3, l;
- float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
- l = 2;
- if (n > 8) {
- cft1st(n, a, w);
- l = 8;
- while ((l << 2) < n) {
- cftmdl(n, l, a, w);
- l <<= 2;
- }
- }
- if ((l << 2) == n) {
- for (j = 0; j < l; j += 2) {
- j1 = j + l;
- j2 = j1 + l;
- j3 = j2 + l;
- x0r = a[j] + a[j1];
- x0i = -a[j + 1] - a[j1 + 1];
- x1r = a[j] - a[j1];
- x1i = -a[j + 1] + a[j1 + 1];
- x2r = a[j2] + a[j3];
- x2i = a[j2 + 1] + a[j3 + 1];
- x3r = a[j2] - a[j3];
- x3i = a[j2 + 1] - a[j3 + 1];
- a[j] = x0r + x2r;
- a[j + 1] = x0i - x2i;
- a[j2] = x0r - x2r;
- a[j2 + 1] = x0i + x2i;
- a[j1] = x1r - x3i;
- a[j1 + 1] = x1i - x3r;
- a[j3] = x1r + x3i;
- a[j3 + 1] = x1i + x3r;
- }
- } else {
- for (j = 0; j < l; j += 2) {
- j1 = j + l;
- x0r = a[j] - a[j1];
- x0i = -a[j + 1] + a[j1 + 1];
- a[j] += a[j1];
- a[j + 1] = -a[j + 1] - a[j1 + 1];
- a[j1] = x0r;
- a[j1 + 1] = x0i;
- }
- }
-}
-
-
-void cft1st(int n, float *a, float *w)
-{
- int j, k1, k2;
- float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
- float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
- x0r = a[0] + a[2];
- x0i = a[1] + a[3];
- x1r = a[0] - a[2];
- x1i = a[1] - a[3];
- x2r = a[4] + a[6];
- x2i = a[5] + a[7];
- x3r = a[4] - a[6];
- x3i = a[5] - a[7];
- a[0] = x0r + x2r;
- a[1] = x0i + x2i;
- a[4] = x0r - x2r;
- a[5] = x0i - x2i;
- a[2] = x1r - x3i;
- a[3] = x1i + x3r;
- a[6] = x1r + x3i;
- a[7] = x1i - x3r;
- wk1r = w[2];
- x0r = a[8] + a[10];
- x0i = a[9] + a[11];
- x1r = a[8] - a[10];
- x1i = a[9] - a[11];
- x2r = a[12] + a[14];
- x2i = a[13] + a[15];
- x3r = a[12] - a[14];
- x3i = a[13] - a[15];
- a[8] = x0r + x2r;
- a[9] = x0i + x2i;
- a[12] = x2i - x0i;
- a[13] = x0r - x2r;
- x0r = x1r - x3i;
- x0i = x1i + x3r;
- a[10] = wk1r * (x0r - x0i);
- a[11] = wk1r * (x0r + x0i);
- x0r = x3i + x1r;
- x0i = x3r - x1i;
- a[14] = wk1r * (x0i - x0r);
- a[15] = wk1r * (x0i + x0r);
- k1 = 0;
- for (j = 16; j < n; j += 16) {
- k1 += 2;
- k2 = 2 * k1;
- wk2r = w[k1];
- wk2i = w[k1 + 1];
- wk1r = w[k2];
- wk1i = w[k2 + 1];
- wk3r = wk1r - 2 * wk2i * wk1i;
- wk3i = 2 * wk2i * wk1r - wk1i;
- x0r = a[j] + a[j + 2];
- x0i = a[j + 1] + a[j + 3];
- x1r = a[j] - a[j + 2];
- x1i = a[j + 1] - a[j + 3];
- x2r = a[j + 4] + a[j + 6];
- x2i = a[j + 5] + a[j + 7];
- x3r = a[j + 4] - a[j + 6];
- x3i = a[j + 5] - a[j + 7];
- a[j] = x0r + x2r;
- a[j + 1] = x0i + x2i;
- x0r -= x2r;
- x0i -= x2i;
- a[j + 4] = wk2r * x0r - wk2i * x0i;
- a[j + 5] = wk2r * x0i + wk2i * x0r;
- x0r = x1r - x3i;
- x0i = x1i + x3r;
- a[j + 2] = wk1r * x0r - wk1i * x0i;
- a[j + 3] = wk1r * x0i + wk1i * x0r;
- x0r = x1r + x3i;
- x0i = x1i - x3r;
- a[j + 6] = wk3r * x0r - wk3i * x0i;
- a[j + 7] = wk3r * x0i + wk3i * x0r;
- wk1r = w[k2 + 2];
- wk1i = w[k2 + 3];
- wk3r = wk1r - 2 * wk2r * wk1i;
- wk3i = 2 * wk2r * wk1r - wk1i;
- x0r = a[j + 8] + a[j + 10];
- x0i = a[j + 9] + a[j + 11];
- x1r = a[j + 8] - a[j + 10];
- x1i = a[j + 9] - a[j + 11];
- x2r = a[j + 12] + a[j + 14];
- x2i = a[j + 13] + a[j + 15];
- x3r = a[j + 12] - a[j + 14];
- x3i = a[j + 13] - a[j + 15];
- a[j + 8] = x0r + x2r;
- a[j + 9] = x0i + x2i;
- x0r -= x2r;
- x0i -= x2i;
- a[j + 12] = -wk2i * x0r - wk2r * x0i;
- a[j + 13] = -wk2i * x0i + wk2r * x0r;
- x0r = x1r - x3i;
- x0i = x1i + x3r;
- a[j + 10] = wk1r * x0r - wk1i * x0i;
- a[j + 11] = wk1r * x0i + wk1i * x0r;
- x0r = x1r + x3i;
- x0i = x1i - x3r;
- a[j + 14] = wk3r * x0r - wk3i * x0i;
- a[j + 15] = wk3r * x0i + wk3i * x0r;
- }
-}
-
-
-void cftmdl(int n, int l, float *a, float *w)
-{
- int j, j1, j2, j3, k, k1, k2, m, m2;
- float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
- float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
- m = l << 2;
- for (j = 0; j < l; j += 2) {
- j1 = j + l;
- j2 = j1 + l;
- j3 = j2 + l;
- x0r = a[j] + a[j1];
- x0i = a[j + 1] + a[j1 + 1];
- x1r = a[j] - a[j1];
- x1i = a[j + 1] - a[j1 + 1];
- x2r = a[j2] + a[j3];
- x2i = a[j2 + 1] + a[j3 + 1];
- x3r = a[j2] - a[j3];
- x3i = a[j2 + 1] - a[j3 + 1];
- a[j] = x0r + x2r;
- a[j + 1] = x0i + x2i;
- a[j2] = x0r - x2r;
- a[j2 + 1] = x0i - x2i;
- a[j1] = x1r - x3i;
- a[j1 + 1] = x1i + x3r;
- a[j3] = x1r + x3i;
- a[j3 + 1] = x1i - x3r;
- }
- wk1r = w[2];
- for (j = m; j < l + m; j += 2) {
- j1 = j + l;
- j2 = j1 + l;
- j3 = j2 + l;
- x0r = a[j] + a[j1];
- x0i = a[j + 1] + a[j1 + 1];
- x1r = a[j] - a[j1];
- x1i = a[j + 1] - a[j1 + 1];
- x2r = a[j2] + a[j3];
- x2i = a[j2 + 1] + a[j3 + 1];
- x3r = a[j2] - a[j3];
- x3i = a[j2 + 1] - a[j3 + 1];
- a[j] = x0r + x2r;
- a[j + 1] = x0i + x2i;
- a[j2] = x2i - x0i;
- a[j2 + 1] = x0r - x2r;
- x0r = x1r - x3i;
- x0i = x1i + x3r;
- a[j1] = wk1r * (x0r - x0i);
- a[j1 + 1] = wk1r * (x0r + x0i);
- x0r = x3i + x1r;
- x0i = x3r - x1i;
- a[j3] = wk1r * (x0i - x0r);
- a[j3 + 1] = wk1r * (x0i + x0r);
- }
- k1 = 0;
- m2 = 2 * m;
- for (k = m2; k < n; k += m2) {
- k1 += 2;
- k2 = 2 * k1;
- wk2r = w[k1];
- wk2i = w[k1 + 1];
- wk1r = w[k2];
- wk1i = w[k2 + 1];
- wk3r = wk1r - 2 * wk2i * wk1i;
- wk3i = 2 * wk2i * wk1r - wk1i;
- for (j = k; j < l + k; j += 2) {
- j1 = j + l;
- j2 = j1 + l;
- j3 = j2 + l;
- x0r = a[j] + a[j1];
- x0i = a[j + 1] + a[j1 + 1];
- x1r = a[j] - a[j1];
- x1i = a[j + 1] - a[j1 + 1];
- x2r = a[j2] + a[j3];
- x2i = a[j2 + 1] + a[j3 + 1];
- x3r = a[j2] - a[j3];
- x3i = a[j2 + 1] - a[j3 + 1];
- a[j] = x0r + x2r;
- a[j + 1] = x0i + x2i;
- x0r -= x2r;
- x0i -= x2i;
- a[j2] = wk2r * x0r - wk2i * x0i;
- a[j2 + 1] = wk2r * x0i + wk2i * x0r;
- x0r = x1r - x3i;
- x0i = x1i + x3r;
- a[j1] = wk1r * x0r - wk1i * x0i;
- a[j1 + 1] = wk1r * x0i + wk1i * x0r;
- x0r = x1r + x3i;
- x0i = x1i - x3r;
- a[j3] = wk3r * x0r - wk3i * x0i;
- a[j3 + 1] = wk3r * x0i + wk3i * x0r;
- }
- wk1r = w[k2 + 2];
- wk1i = w[k2 + 3];
- wk3r = wk1r - 2 * wk2r * wk1i;
- wk3i = 2 * wk2r * wk1r - wk1i;
- for (j = k + m; j < l + (k + m); j += 2) {
- j1 = j + l;
- j2 = j1 + l;
- j3 = j2 + l;
- x0r = a[j] + a[j1];
- x0i = a[j + 1] + a[j1 + 1];
- x1r = a[j] - a[j1];
- x1i = a[j + 1] - a[j1 + 1];
- x2r = a[j2] + a[j3];
- x2i = a[j2 + 1] + a[j3 + 1];
- x3r = a[j2] - a[j3];
- x3i = a[j2 + 1] - a[j3 + 1];
- a[j] = x0r + x2r;
- a[j + 1] = x0i + x2i;
- x0r -= x2r;
- x0i -= x2i;
- a[j2] = -wk2i * x0r - wk2r * x0i;
- a[j2 + 1] = -wk2i * x0i + wk2r * x0r;
- x0r = x1r - x3i;
- x0i = x1i + x3r;
- a[j1] = wk1r * x0r - wk1i * x0i;
- a[j1 + 1] = wk1r * x0i + wk1i * x0r;
- x0r = x1r + x3i;
- x0i = x1i - x3r;
- a[j3] = wk3r * x0r - wk3i * x0i;
- a[j3 + 1] = wk3r * x0i + wk3i * x0r;
- }
- }
-}
-
-
-void rftfsub(int n, float *a, int nc, float *c)
-{
- int j, k, kk, ks, m;
- float wkr, wki, xr, xi, yr, yi;
-
- m = n >> 1;
- ks = 2 * nc / m;
- kk = 0;
- for (j = 2; j < m; j += 2) {
- k = n - j;
- kk += ks;
- wkr = 0.5f - c[nc - kk];
- wki = c[kk];
- xr = a[j] - a[k];
- xi = a[j + 1] + a[k + 1];
- yr = wkr * xr - wki * xi;
- yi = wkr * xi + wki * xr;
- a[j] -= yr;
- a[j + 1] -= yi;
- a[k] += yr;
- a[k + 1] -= yi;
- }
-}
-
-
-void rftbsub(int n, float *a, int nc, float *c)
-{
- int j, k, kk, ks, m;
- float wkr, wki, xr, xi, yr, yi;
-
- a[1] = -a[1];
- m = n >> 1;
- ks = 2 * nc / m;
- kk = 0;
- for (j = 2; j < m; j += 2) {
- k = n - j;
- kk += ks;
- wkr = 0.5f - c[nc - kk];
- wki = c[kk];
- xr = a[j] - a[k];
- xi = a[j + 1] + a[k + 1];
- yr = wkr * xr + wki * xi;
- yi = wkr * xi - wki * xr;
- a[j] -= yr;
- a[j + 1] = yi - a[j + 1];
- a[k] += yr;
- a[k + 1] = yi - a[k + 1];
- }
- a[m + 1] = -a[m + 1];
-}
-
-
-void dctsub(int n, float *a, int nc, float *c)
-{
- int j, k, kk, ks, m;
- float wkr, wki, xr;
-
- m = n >> 1;
- ks = nc / n;
- kk = 0;
- for (j = 1; j < m; j++) {
- k = n - j;
- kk += ks;
- wkr = c[kk] - c[nc - kk];
- wki = c[kk] + c[nc - kk];
- xr = wki * a[j] - wkr * a[k];
- a[j] = wkr * a[j] + wki * a[k];
- a[k] = xr;
- }
- a[m] *= c[0];
-}
-
-
-void dstsub(int n, float *a, int nc, float *c)
-{
- int j, k, kk, ks, m;
- float wkr, wki, xr;
-
- m = n >> 1;
- ks = nc / n;
- kk = 0;
- for (j = 1; j < m; j++) {
- k = n - j;
- kk += ks;
- wkr = c[kk] - c[nc - kk];
- wki = c[kk] + c[nc - kk];
- xr = wki * a[k] - wkr * a[j];
- a[k] = wkr * a[k] + wki * a[j];
- a[j] = xr;
- }
- a[m] *= c[0];
-}
-
diff --git a/src/modules/audio_processing/utility/fft4g.h b/src/modules/audio_processing/utility/fft4g.h
deleted file mode 100644
index 373ff14..0000000
--- a/src/modules/audio_processing/utility/fft4g.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_FFT4G_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_FFT4G_H_
-
-void rdft(int, int, float *, int *, float *);
-void cdft(int, int, float *, int *, float *);
-
-#endif
-
diff --git a/src/modules/audio_processing/utility/ring_buffer.c b/src/modules/audio_processing/utility/ring_buffer.c
deleted file mode 100644
index ea2e354..0000000
--- a/src/modules/audio_processing/utility/ring_buffer.c
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-/*
- * Provides a generic ring buffer that can be written to and read from with
- * arbitrarily sized blocks. The AEC uses this for several different tasks.
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include "ring_buffer.h"
-
-typedef struct {
- int readPos;
- int writePos;
- int size;
- char rwWrap;
- bufdata_t *data;
-} buf_t;
-
-enum {SAME_WRAP, DIFF_WRAP};
-
-int WebRtcApm_CreateBuffer(void **bufInst, int size)
-{
- buf_t *buf = NULL;
-
- if (size < 0) {
- return -1;
- }
-
- buf = malloc(sizeof(buf_t));
- *bufInst = buf;
- if (buf == NULL) {
- return -1;
- }
-
- buf->data = malloc(size*sizeof(bufdata_t));
- if (buf->data == NULL) {
- free(buf);
- buf = NULL;
- return -1;
- }
-
- buf->size = size;
- return 0;
-}
-
-int WebRtcApm_InitBuffer(void *bufInst)
-{
- buf_t *buf = (buf_t*)bufInst;
-
- buf->readPos = 0;
- buf->writePos = 0;
- buf->rwWrap = SAME_WRAP;
-
- // Initialize buffer to zeros
- memset(buf->data, 0, sizeof(bufdata_t)*buf->size);
-
- return 0;
-}
-
-int WebRtcApm_FreeBuffer(void *bufInst)
-{
- buf_t *buf = (buf_t*)bufInst;
-
- if (buf == NULL) {
- return -1;
- }
-
- free(buf->data);
- free(buf);
-
- return 0;
-}
-
-int WebRtcApm_ReadBuffer(void *bufInst, bufdata_t *data, int size)
-{
- buf_t *buf = (buf_t*)bufInst;
- int n = 0, margin = 0;
-
- if (size <= 0 || size > buf->size) {
- return -1;
- }
-
- n = size;
- if (buf->rwWrap == DIFF_WRAP) {
- margin = buf->size - buf->readPos;
- if (n > margin) {
- buf->rwWrap = SAME_WRAP;
- memcpy(data, buf->data + buf->readPos,
- sizeof(bufdata_t)*margin);
- buf->readPos = 0;
- n = size - margin;
- }
- else {
- memcpy(data, buf->data + buf->readPos,
- sizeof(bufdata_t)*n);
- buf->readPos += n;
- return n;
- }
- }
-
- if (buf->rwWrap == SAME_WRAP) {
- margin = buf->writePos - buf->readPos;
- if (margin > n)
- margin = n;
- memcpy(data + size - n, buf->data + buf->readPos,
- sizeof(bufdata_t)*margin);
- buf->readPos += margin;
- n -= margin;
- }
-
- return size - n;
-}
-
-int WebRtcApm_WriteBuffer(void *bufInst, const bufdata_t *data, int size)
-{
- buf_t *buf = (buf_t*)bufInst;
- int n = 0, margin = 0;
-
- if (size < 0 || size > buf->size) {
- return -1;
- }
-
- n = size;
- if (buf->rwWrap == SAME_WRAP) {
- margin = buf->size - buf->writePos;
- if (n > margin) {
- buf->rwWrap = DIFF_WRAP;
- memcpy(buf->data + buf->writePos, data,
- sizeof(bufdata_t)*margin);
- buf->writePos = 0;
- n = size - margin;
- }
- else {
- memcpy(buf->data + buf->writePos, data,
- sizeof(bufdata_t)*n);
- buf->writePos += n;
- return n;
- }
- }
-
- if (buf->rwWrap == DIFF_WRAP) {
- margin = buf->readPos - buf->writePos;
- if (margin > n)
- margin = n;
- memcpy(buf->data + buf->writePos, data + size - n,
- sizeof(bufdata_t)*margin);
- buf->writePos += margin;
- n -= margin;
- }
-
- return size - n;
-}
-
-int WebRtcApm_FlushBuffer(void *bufInst, int size)
-{
- buf_t *buf = (buf_t*)bufInst;
- int n = 0, margin = 0;
-
- if (size <= 0 || size > buf->size) {
- return -1;
- }
-
- n = size;
- if (buf->rwWrap == DIFF_WRAP) {
- margin = buf->size - buf->readPos;
- if (n > margin) {
- buf->rwWrap = SAME_WRAP;
- buf->readPos = 0;
- n = size - margin;
- }
- else {
- buf->readPos += n;
- return n;
- }
- }
-
- if (buf->rwWrap == SAME_WRAP) {
- margin = buf->writePos - buf->readPos;
- if (margin > n)
- margin = n;
- buf->readPos += margin;
- n -= margin;
- }
-
- return size - n;
-}
-
-int WebRtcApm_StuffBuffer(void *bufInst, int size)
-{
- buf_t *buf = (buf_t*)bufInst;
- int n = 0, margin = 0;
-
- if (size <= 0 || size > buf->size) {
- return -1;
- }
-
- n = size;
- if (buf->rwWrap == SAME_WRAP) {
- margin = buf->readPos;
- if (n > margin) {
- buf->rwWrap = DIFF_WRAP;
- buf->readPos = buf->size - 1;
- n -= margin + 1;
- }
- else {
- buf->readPos -= n;
- return n;
- }
- }
-
- if (buf->rwWrap == DIFF_WRAP) {
- margin = buf->readPos - buf->writePos;
- if (margin > n)
- margin = n;
- buf->readPos -= margin;
- n -= margin;
- }
-
- return size - n;
-}
-
-int WebRtcApm_get_buffer_size(const void *bufInst)
-{
- const buf_t *buf = (buf_t*)bufInst;
-
- if (buf->rwWrap == SAME_WRAP)
- return buf->writePos - buf->readPos;
- else
- return buf->size - buf->readPos + buf->writePos;
-}
diff --git a/src/modules/audio_processing/utility/ring_buffer.h b/src/modules/audio_processing/utility/ring_buffer.h
deleted file mode 100644
index 0fd261d..0000000
--- a/src/modules/audio_processing/utility/ring_buffer.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-/*
- * Specifies the interface for the AEC generic buffer.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_RING_BUFFER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_RING_BUFFER_H_
-
-// Determines buffer datatype
-typedef short bufdata_t;
-
-// Unless otherwise specified, functions return 0 on success and -1 on error
-int WebRtcApm_CreateBuffer(void **bufInst, int size);
-int WebRtcApm_InitBuffer(void *bufInst);
-int WebRtcApm_FreeBuffer(void *bufInst);
-
-// Returns number of samples read
-int WebRtcApm_ReadBuffer(void *bufInst, bufdata_t *data, int size);
-
-// Returns number of samples written
-int WebRtcApm_WriteBuffer(void *bufInst, const bufdata_t *data, int size);
-
-// Returns number of samples flushed
-int WebRtcApm_FlushBuffer(void *bufInst, int size);
-
-// Returns number of samples stuffed
-int WebRtcApm_StuffBuffer(void *bufInst, int size);
-
-// Returns number of samples in buffer
-int WebRtcApm_get_buffer_size(const void *bufInst);
-
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_RING_BUFFER_H_
diff --git a/src/modules/audio_processing/utility/util.gyp b/src/modules/audio_processing/utility/util.gyp
deleted file mode 100644
index 3348da8..0000000
--- a/src/modules/audio_processing/utility/util.gyp
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-{
- 'includes': [
- '../../../common_settings.gypi',
- ],
- 'targets': [
- {
- 'target_name': 'apm_util',
- 'type': '<(library)',
- 'direct_dependent_settings': {
- 'include_dirs': [
- '.',
- ],
- },
- 'sources': [
- 'ring_buffer.c',
- 'ring_buffer.h',
- 'fft4g.c',
- 'fft4g.h',
- ],
- },
- ],
-}
-
-# Local Variables:
-# tab-width:2
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/src/modules/interface/module.h b/src/modules/interface/module.h
deleted file mode 100644
index f270978..0000000
--- a/src/modules/interface/module.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef MODULE_H
-#define MODULE_H
-
-#include "typedefs.h"
-
-namespace webrtc
-{
-
-class Module
-{
-public:
- // Returns version of the module and its components.
- virtual int32_t Version(char* version,
- uint32_t& remainingBufferInBytes,
- uint32_t& position) const = 0;
-
- // Change the unique identifier of this object.
- virtual int32_t ChangeUniqueId(const int32_t id) = 0;
-
- // Returns the number of milliseconds until the module want a worker
- // thread to call Process.
- virtual int32_t TimeUntilNextProcess() = 0 ;
-
- // Process any pending tasks such as timeouts.
- virtual int32_t Process() = 0 ;
-
-protected:
- virtual ~Module() {}
-};
-
-} // namespace webrtc
-
-#endif // MODULE_H
diff --git a/src/modules/interface/module_common_types.h b/src/modules/interface/module_common_types.h
deleted file mode 100644
index 1865b0f..0000000
--- a/src/modules/interface/module_common_types.h
+++ /dev/null
@@ -1,1012 +0,0 @@
-#ifndef MODULE_COMMON_TYPES_H
-#define MODULE_COMMON_TYPES_H
-
-#include <cstring> // memcpy
-#include <assert.h>
-
-#include "typedefs.h"
-#include "common_types.h"
-
-#ifdef _WIN32
- #pragma warning(disable:4351) // remove warning "new behavior: elements of array
- // 'array' will be default initialized"
-#endif
-
-namespace webrtc
-{
-struct RTPHeader
-{
- bool markerBit;
- WebRtc_UWord8 payloadType;
- WebRtc_UWord16 sequenceNumber;
- WebRtc_UWord32 timestamp;
- WebRtc_UWord32 ssrc;
- WebRtc_UWord8 numCSRCs;
- WebRtc_UWord32 arrOfCSRCs[kRtpCsrcSize];
- WebRtc_UWord8 paddingLength;
- WebRtc_UWord16 headerLength;
-};
-
-struct RTPAudioHeader
-{
- WebRtc_UWord8 numEnergy; // number of valid entries in arrOfEnergy
- WebRtc_UWord8 arrOfEnergy[kRtpCsrcSize]; // one energy byte (0-9) per channel
- bool isCNG; // is this CNG
- WebRtc_UWord8 channel; // number of channels 2 = stereo
-};
-
-struct RTPVideoHeaderH263
-{
- bool independentlyDecodable; // H.263-1998 if no P bit it's not independently decodable
- bool bits; // H.263 mode B, Xor the lasy byte of previus packet with the
- // first byte of this packet
-};
-enum {kNoPictureId = -1};
-struct RTPVideoHeaderVP8
-{
- bool startBit; // Start of partition.
- bool stopBit; // Stop of partition.
- WebRtc_Word16 pictureId; // Picture ID index, 15 bits;
- // kNoPictureId if PictureID does not exist.
- bool nonReference; // Frame is discardable.
-};
-union RTPVideoTypeHeader
-{
- RTPVideoHeaderH263 H263;
- RTPVideoHeaderVP8 VP8;
-};
-
-enum RTPVideoCodecTypes
-{
- kRTPVideoGeneric = 0,
- kRTPVideoH263 = 1,
- kRTPVideoMPEG4 = 5,
- kRTPVideoVP8 = 8,
- kRTPVideoNoVideo = 10,
- kRTPVideoFEC = 11,
- kRTPVideoI420 = 12
-};
-struct RTPVideoHeader
-{
- WebRtc_UWord16 width; // size
- WebRtc_UWord16 height;
-
- bool isFirstPacket; // first packet in frame
- RTPVideoCodecTypes codec;
- RTPVideoTypeHeader codecHeader;
-};
-union RTPTypeHeader
-{
- RTPAudioHeader Audio;
- RTPVideoHeader Video;
-};
-
-struct WebRtcRTPHeader
-{
- RTPHeader header;
- FrameType frameType;
- RTPTypeHeader type;
-};
-
-class RTPFragmentationHeader
-{
-public:
- RTPFragmentationHeader() :
- fragmentationVectorSize(0),
- fragmentationOffset(NULL),
- fragmentationLength(NULL),
- fragmentationTimeDiff(NULL),
- fragmentationPlType(NULL)
- {};
-
- ~RTPFragmentationHeader()
- {
- delete [] fragmentationOffset;
- delete [] fragmentationLength;
- delete [] fragmentationTimeDiff;
- delete [] fragmentationPlType;
- }
-
- RTPFragmentationHeader& operator=(const RTPFragmentationHeader& header)
- {
- if(this == &header)
- {
- return *this;
- }
-
- if(header.fragmentationVectorSize != fragmentationVectorSize)
- {
- // new size of vectors
-
- // delete old
- delete [] fragmentationOffset;
- fragmentationOffset = NULL;
- delete [] fragmentationLength;
- fragmentationLength = NULL;
- delete [] fragmentationTimeDiff;
- fragmentationTimeDiff = NULL;
- delete [] fragmentationPlType;
- fragmentationPlType = NULL;
-
- if(header.fragmentationVectorSize > 0)
- {
- // allocate new
- if(header.fragmentationOffset)
- {
- fragmentationOffset = new WebRtc_UWord32[header.fragmentationVectorSize];
- }
- if(header.fragmentationLength)
- {
- fragmentationLength = new WebRtc_UWord32[header.fragmentationVectorSize];
- }
- if(header.fragmentationTimeDiff)
- {
- fragmentationTimeDiff = new WebRtc_UWord16[header.fragmentationVectorSize];
- }
- if(header.fragmentationPlType)
- {
- fragmentationPlType = new WebRtc_UWord8[header.fragmentationVectorSize];
- }
- }
- // set new size
- fragmentationVectorSize = header.fragmentationVectorSize;
- }
-
- if(header.fragmentationVectorSize > 0)
- {
- // copy values
- if(header.fragmentationOffset)
- {
- memcpy(fragmentationOffset, header.fragmentationOffset,
- header.fragmentationVectorSize * sizeof(WebRtc_UWord32));
- }
- if(header.fragmentationLength)
- {
- memcpy(fragmentationLength, header.fragmentationLength,
- header.fragmentationVectorSize * sizeof(WebRtc_UWord32));
- }
- if(header.fragmentationTimeDiff)
- {
- memcpy(fragmentationTimeDiff, header.fragmentationTimeDiff,
- header.fragmentationVectorSize * sizeof(WebRtc_UWord16));
- }
- if(header.fragmentationPlType)
- {
- memcpy(fragmentationPlType, header.fragmentationPlType,
- header.fragmentationVectorSize * sizeof(WebRtc_UWord8));
- }
- }
- return *this;
- }
- void VerifyAndAllocateFragmentationHeader( const WebRtc_UWord16 size)
- {
- if( fragmentationVectorSize < size)
- {
- WebRtc_UWord16 oldVectorSize = fragmentationVectorSize;
- {
- // offset
- WebRtc_UWord32* oldOffsets = fragmentationOffset;
- fragmentationOffset = new WebRtc_UWord32[size];
- memset(fragmentationOffset+oldVectorSize, 0,
- sizeof(WebRtc_UWord32)*(size-oldVectorSize));
- // copy old values
- memcpy(fragmentationOffset,oldOffsets, sizeof(WebRtc_UWord32) * oldVectorSize);
- delete[] oldOffsets;
- }
- // length
- {
- WebRtc_UWord32* oldLengths = fragmentationLength;
- fragmentationLength = new WebRtc_UWord32[size];
- memset(fragmentationLength+oldVectorSize, 0,
- sizeof(WebRtc_UWord32) * (size- oldVectorSize));
- memcpy(fragmentationLength, oldLengths,
- sizeof(WebRtc_UWord32) * oldVectorSize);
- delete[] oldLengths;
- }
- // time diff
- {
- WebRtc_UWord16* oldTimeDiffs = fragmentationTimeDiff;
- fragmentationTimeDiff = new WebRtc_UWord16[size];
- memset(fragmentationTimeDiff+oldVectorSize, 0,
- sizeof(WebRtc_UWord16) * (size- oldVectorSize));
- memcpy(fragmentationTimeDiff, oldTimeDiffs,
- sizeof(WebRtc_UWord16) * oldVectorSize);
- delete[] oldTimeDiffs;
- }
- // payload type
- {
- WebRtc_UWord8* oldTimePlTypes = fragmentationPlType;
- fragmentationPlType = new WebRtc_UWord8[size];
- memset(fragmentationPlType+oldVectorSize, 0,
- sizeof(WebRtc_UWord8) * (size- oldVectorSize));
- memcpy(fragmentationPlType, oldTimePlTypes,
- sizeof(WebRtc_UWord8) * oldVectorSize);
- delete[] oldTimePlTypes;
- }
- fragmentationVectorSize = size;
- }
- }
-
- WebRtc_UWord16 fragmentationVectorSize; // Number of fragmentations
- WebRtc_UWord32* fragmentationOffset; // Offset of pointer to data for each fragm.
- WebRtc_UWord32* fragmentationLength; // Data size for each fragmentation
- WebRtc_UWord16* fragmentationTimeDiff; // Timestamp difference relative "now" for
- // each fragmentation
- WebRtc_UWord8* fragmentationPlType; // Payload type of each fragmentation
-};
-
-struct RTCPVoIPMetric
-{
- // RFC 3611 4.7
- WebRtc_UWord8 lossRate;
- WebRtc_UWord8 discardRate;
- WebRtc_UWord8 burstDensity;
- WebRtc_UWord8 gapDensity;
- WebRtc_UWord16 burstDuration;
- WebRtc_UWord16 gapDuration;
- WebRtc_UWord16 roundTripDelay;
- WebRtc_UWord16 endSystemDelay;
- WebRtc_UWord8 signalLevel;
- WebRtc_UWord8 noiseLevel;
- WebRtc_UWord8 RERL;
- WebRtc_UWord8 Gmin;
- WebRtc_UWord8 Rfactor;
- WebRtc_UWord8 extRfactor;
- WebRtc_UWord8 MOSLQ;
- WebRtc_UWord8 MOSCQ;
- WebRtc_UWord8 RXconfig;
- WebRtc_UWord16 JBnominal;
- WebRtc_UWord16 JBmax;
- WebRtc_UWord16 JBabsMax;
-};
-
-// class describing a complete, or parts of an encoded frame.
-class EncodedVideoData
-{
-public:
- EncodedVideoData() :
- completeFrame(false),
- missingFrame(false),
- payloadData(NULL),
- payloadSize(0),
- bufferSize(0)
- {};
-
- EncodedVideoData(const EncodedVideoData& data)
- {
- payloadType = data.payloadType;
- timeStamp = data.timeStamp;
- renderTimeMs = data.renderTimeMs;
- encodedWidth = data.encodedWidth;
- encodedHeight = data.encodedHeight;
- completeFrame = data.completeFrame;
- missingFrame = data.missingFrame;
- payloadSize = data.payloadSize;
- fragmentationHeader = data.fragmentationHeader;
- frameType = data.frameType;
- codec = data.codec;
- if (data.payloadSize > 0)
- {
- payloadData = new WebRtc_UWord8[data.payloadSize];
- memcpy(payloadData, data.payloadData, data.payloadSize);
- }
- else
- {
- payloadData = NULL;
- }
- }
-
-
- ~EncodedVideoData()
- {
- delete [] payloadData;
- };
-
- EncodedVideoData& operator=(const EncodedVideoData& data)
- {
- if (this == &data)
- {
- return *this;
- }
- payloadType = data.payloadType;
- timeStamp = data.timeStamp;
- renderTimeMs = data.renderTimeMs;
- encodedWidth = data.encodedWidth;
- encodedHeight = data.encodedHeight;
- completeFrame = data.completeFrame;
- missingFrame = data.missingFrame;
- payloadSize = data.payloadSize;
- fragmentationHeader = data.fragmentationHeader;
- frameType = data.frameType;
- codec = data.codec;
- if (data.payloadSize > 0)
- {
- delete [] payloadData;
- payloadData = new WebRtc_UWord8[data.payloadSize];
- memcpy(payloadData, data.payloadData, data.payloadSize);
- bufferSize = data.payloadSize;
- }
- return *this;
- };
- void VerifyAndAllocate( const WebRtc_UWord32 size)
- {
- if (bufferSize < size)
- {
- WebRtc_UWord8* oldPayload = payloadData;
- payloadData = new WebRtc_UWord8[size];
- memcpy(payloadData, oldPayload, sizeof(WebRtc_UWord8) * payloadSize);
-
- bufferSize = size;
- delete[] oldPayload;
- }
- }
-
- WebRtc_UWord8 payloadType;
- WebRtc_UWord32 timeStamp;
- WebRtc_Word64 renderTimeMs;
- WebRtc_UWord32 encodedWidth;
- WebRtc_UWord32 encodedHeight;
- bool completeFrame;
- bool missingFrame;
- WebRtc_UWord8* payloadData;
- WebRtc_UWord32 payloadSize;
- WebRtc_UWord32 bufferSize;
- RTPFragmentationHeader fragmentationHeader;
- FrameType frameType;
- VideoCodecType codec;
-};
-
-// Video Content Metrics
-struct VideoContentMetrics
-{
- VideoContentMetrics(): motionMagnitudeNZ(0), sizeZeroMotion(0), spatialPredErr(0),
- spatialPredErrH(0), spatialPredErrV(0), motionPredErr(0),
- motionHorizontalness(0), motionClusterDistortion(0),
- nativeWidth(0), nativeHeight(0), contentChange(false) { }
- void Reset(){ motionMagnitudeNZ = 0; sizeZeroMotion = 0; spatialPredErr = 0;
- spatialPredErrH = 0; spatialPredErrV = 0; motionPredErr = 0;
- motionHorizontalness = 0; motionClusterDistortion = 0;
- nativeWidth = 0; nativeHeight = 0; contentChange = false; }
-
- float motionMagnitudeNZ;
- float sizeZeroMotion;
- float spatialPredErr;
- float spatialPredErrH;
- float spatialPredErrV;
- float motionPredErr;
- float motionHorizontalness;
- float motionClusterDistortion;
- WebRtc_UWord32 nativeWidth;
- WebRtc_UWord32 nativeHeight;
- WebRtc_UWord32 nativeFrameRate;
- bool contentChange;
-};
-
-/*************************************************
- *
- * VideoFrame class
- *
- * The VideoFrame class allows storing and
- * handling of video frames.
- *
- *
- *************************************************/
-class VideoFrame
-{
-public:
- VideoFrame();
- ~VideoFrame();
- /**
- * Verifies that current allocated buffer size is larger than or equal to the input size.
- * If the current buffer size is smaller, a new allocation is made and the old buffer data
- * is copied to the new buffer.
- * Buffer size is updated to minimumSize.
- */
- WebRtc_Word32 VerifyAndAllocate(const WebRtc_UWord32 minimumSize);
- /**
- * Update length of data buffer in frame. Function verifies that new length is less or
- * equal to allocated size.
- */
- WebRtc_Word32 SetLength(const WebRtc_UWord32 newLength);
- /*
- * Swap buffer and size data
- */
- WebRtc_Word32 Swap(WebRtc_UWord8*& newMemory,
- WebRtc_UWord32& newLength,
- WebRtc_UWord32& newSize);
- /*
- * Swap buffer and size data
- */
- WebRtc_Word32 SwapFrame(VideoFrame& videoFrame);
- /**
- * Copy buffer: If newLength is bigger than allocated size, a new buffer of size length
- * is allocated.
- */
- WebRtc_Word32 CopyFrame(const VideoFrame& videoFrame);
- /**
- * Copy buffer: If newLength is bigger than allocated size, a new buffer of size length
- * is allocated.
- */
- WebRtc_Word32 CopyFrame(WebRtc_UWord32 length, const WebRtc_UWord8* sourceBuffer);
- /**
- * Delete VideoFrame and resets members to zero
- */
- void Free();
- /**
- * Set frame timestamp (90kHz)
- */
- void SetTimeStamp(const WebRtc_UWord32 timeStamp) {_timeStamp = timeStamp;}
- /**
- * Get pointer to frame buffer
- */
- WebRtc_UWord8* Buffer() const {return _buffer;}
-
- WebRtc_UWord8*& Buffer() {return _buffer;}
-
- /**
- * Get allocated buffer size
- */
- WebRtc_UWord32 Size() const {return _bufferSize;}
- /**
- * Get frame length
- */
- WebRtc_UWord32 Length() const {return _bufferLength;}
- /**
- * Get frame timestamp (90kHz)
- */
- WebRtc_UWord32 TimeStamp() const {return _timeStamp;}
- /**
- * Get frame width
- */
- WebRtc_UWord32 Width() const {return _width;}
- /**
- * Get frame height
- */
- WebRtc_UWord32 Height() const {return _height;}
- /**
- * Set frame width
- */
- void SetWidth(const WebRtc_UWord32 width) {_width = width;}
- /**
- * Set frame height
- */
- void SetHeight(const WebRtc_UWord32 height) {_height = height;}
- /**
- * Set render time in miliseconds
- */
- void SetRenderTime(const WebRtc_Word64 renderTimeMs) {_renderTimeMs = renderTimeMs;}
- /**
- * Get render time in miliseconds
- */
- WebRtc_Word64 RenderTimeMs() const {return _renderTimeMs;}
-
-private:
- void Set(WebRtc_UWord8* buffer,
- WebRtc_UWord32 size,
- WebRtc_UWord32 length,
- WebRtc_UWord32 timeStamp);
-
- WebRtc_UWord8* _buffer; // Pointer to frame buffer
- WebRtc_UWord32 _bufferSize; // Allocated buffer size
- WebRtc_UWord32 _bufferLength; // Length (in bytes) of buffer
- WebRtc_UWord32 _timeStamp; // Timestamp of frame (90kHz)
- WebRtc_UWord32 _width;
- WebRtc_UWord32 _height;
- WebRtc_Word64 _renderTimeMs;
-}; // end of VideoFrame class declaration
-
-// inline implementation of VideoFrame class:
-inline
-VideoFrame::VideoFrame():
- _buffer(0),
- _bufferSize(0),
- _bufferLength(0),
- _timeStamp(0),
- _width(0),
- _height(0),
- _renderTimeMs(0)
-{
- //
-}
-inline
-VideoFrame::~VideoFrame()
-{
- if(_buffer)
- {
- delete [] _buffer;
- _buffer = NULL;
- }
-}
-
-
-inline
-WebRtc_Word32
-VideoFrame::VerifyAndAllocate(const WebRtc_UWord32 minimumSize)
-{
- if (minimumSize < 1)
- {
- return -1;
- }
- if(minimumSize > _bufferSize)
- {
- // create buffer of sufficient size
- WebRtc_UWord8* newBufferBuffer = new WebRtc_UWord8[minimumSize];
- if(_buffer)
- {
- // copy old data
- memcpy(newBufferBuffer, _buffer, _bufferSize);
- delete [] _buffer;
- }
- _buffer = newBufferBuffer;
- _bufferSize = minimumSize;
- }
- return 0;
-}
-
-inline
-WebRtc_Word32
-VideoFrame::SetLength(const WebRtc_UWord32 newLength)
-{
- if (newLength >_bufferSize )
- { // can't accomodate new value
- return -1;
- }
- _bufferLength = newLength;
- return 0;
-}
-
-inline
-WebRtc_Word32
-VideoFrame::SwapFrame(VideoFrame& videoFrame)
-{
- WebRtc_UWord32 tmpTimeStamp = _timeStamp;
- WebRtc_UWord32 tmpWidth = _width;
- WebRtc_UWord32 tmpHeight = _height;
- WebRtc_Word64 tmpRenderTime = _renderTimeMs;
-
- _timeStamp = videoFrame._timeStamp;
- _width = videoFrame._width;
- _height = videoFrame._height;
- _renderTimeMs = videoFrame._renderTimeMs;
-
- videoFrame._timeStamp = tmpTimeStamp;
- videoFrame._width = tmpWidth;
- videoFrame._height = tmpHeight;
- videoFrame._renderTimeMs = tmpRenderTime;
-
- return Swap(videoFrame._buffer, videoFrame._bufferLength, videoFrame._bufferSize);
-}
-
-inline
-WebRtc_Word32
-VideoFrame::Swap(WebRtc_UWord8*& newMemory, WebRtc_UWord32& newLength, WebRtc_UWord32& newSize)
-{
- WebRtc_UWord8* tmpBuffer = _buffer;
- WebRtc_UWord32 tmpLength = _bufferLength;
- WebRtc_UWord32 tmpSize = _bufferSize;
- _buffer = newMemory;
- _bufferLength = newLength;
- _bufferSize = newSize;
- newMemory = tmpBuffer;
- newLength = tmpLength;
- newSize = tmpSize;
- return 0;
-}
-
-inline
-WebRtc_Word32
-VideoFrame::CopyFrame(WebRtc_UWord32 length, const WebRtc_UWord8* sourceBuffer)
-{
- if (length > _bufferSize)
- {
- WebRtc_Word32 ret = VerifyAndAllocate(length);
- if (ret < 0)
- {
- return ret;
- }
- }
- memcpy(_buffer, sourceBuffer, length);
- _bufferLength = length;
- return 0;
-}
-
-inline
-WebRtc_Word32
-VideoFrame::CopyFrame(const VideoFrame& videoFrame)
-{
- if(CopyFrame(videoFrame.Length(), videoFrame.Buffer()) != 0)
- {
- return -1;
- }
- _timeStamp = videoFrame._timeStamp;
- _width = videoFrame._width;
- _height = videoFrame._height;
- _renderTimeMs = videoFrame._renderTimeMs;
- return 0;
-}
-
-inline
-void
-VideoFrame::Free()
-{
- _timeStamp = 0;
- _bufferLength = 0;
- _bufferSize = 0;
- _height = 0;
- _width = 0;
- _renderTimeMs = 0;
-
- if(_buffer)
- {
- delete [] _buffer;
- _buffer = NULL;
- }
-}
-
-
-/*************************************************
- *
- * AudioFrame class
- *
- * The AudioFrame class holds up to 60 ms wideband
- * audio. It allows for adding and subtracting frames
- * while keeping track of the resulting states.
- *
- * Note
- * - The +operator assume that you would never add
- * exact opposite frames when deciding the resulting
- * state. To do this use the -operator.
- *
- * - _audioChannel of 1 indicated mono, and 2
- * indicates stereo.
- *
- * - _payloadDataLengthInSamples is the number of
- * samples per channel. Therefore, the total
- * number of samples in _payloadData is
- * (_payloadDataLengthInSamples * _audioChannel).
- *
- * - Stereo data is stored in interleaved fashion
- * starting with the left channel.
- *
- *************************************************/
-class AudioFrame
-{
-public:
- enum{kMaxAudioFrameSizeSamples = 3840}; // stereo 32KHz 60ms 2*32*60
-
- enum VADActivity
- {
- kVadActive = 0,
- kVadPassive = 1,
- kVadUnknown = 2
- };
- enum SpeechType
- {
- kNormalSpeech = 0,
- kPLC = 1,
- kCNG = 2,
- kPLCCNG = 3,
- kUndefined = 4
- };
-
- AudioFrame();
- virtual ~AudioFrame();
-
- WebRtc_Word32 UpdateFrame(
- const WebRtc_Word32 id,
- const WebRtc_UWord32 timeStamp,
- const WebRtc_Word16* payloadData,
- const WebRtc_UWord16 payloadDataLengthInSamples,
- const WebRtc_UWord32 frequencyInHz,
- const SpeechType speechType,
- const VADActivity vadActivity,
- const WebRtc_UWord8 audioChannel = 1,
- const WebRtc_Word32 volume = -1,
- const WebRtc_Word32 energy = -1);
-
- AudioFrame& Append(const AudioFrame& rhs);
-
- void Mute() const;
-
- AudioFrame& operator=(const AudioFrame& rhs);
- AudioFrame& operator>>=(const WebRtc_Word32 rhs);
- AudioFrame& operator+=(const AudioFrame& rhs);
- AudioFrame& operator-=(const AudioFrame& rhs);
-
- WebRtc_Word32 _id;
- WebRtc_UWord32 _timeStamp;
-
- // Supporting Stereo, stereo samples are interleaved
- mutable WebRtc_Word16 _payloadData[kMaxAudioFrameSizeSamples];
- WebRtc_UWord16 _payloadDataLengthInSamples;
- WebRtc_UWord32 _frequencyInHz;
- WebRtc_UWord8 _audioChannel;
- SpeechType _speechType;
- VADActivity _vadActivity;
-
- WebRtc_UWord32 _energy;
- WebRtc_Word32 _volume;
-};
-
-inline
-AudioFrame::AudioFrame()
- :
- _id(-1),
- _timeStamp(0),
- _payloadData(),
- _payloadDataLengthInSamples(0),
- _frequencyInHz(0),
- _audioChannel(1),
- _speechType(kUndefined),
- _vadActivity(kVadUnknown),
- _energy(0xffffffff),
- _volume(0xffffffff)
-{
-}
-
-inline
-AudioFrame::~AudioFrame()
-{
-}
-
-inline
-WebRtc_Word32
-AudioFrame::UpdateFrame(
- const WebRtc_Word32 id,
- const WebRtc_UWord32 timeStamp,
- const WebRtc_Word16* payloadData,
- const WebRtc_UWord16 payloadDataLengthInSamples,
- const WebRtc_UWord32 frequencyInHz,
- const SpeechType speechType,
- const VADActivity vadActivity,
- const WebRtc_UWord8 audioChannel,
- const WebRtc_Word32 volume,
- const WebRtc_Word32 energy)
-{
- _id = id;
- _timeStamp = timeStamp;
- _frequencyInHz = frequencyInHz;
- _speechType = speechType;
- _vadActivity = vadActivity;
- _volume = volume;
- _audioChannel = audioChannel;
- _energy = energy;
-
- if((payloadDataLengthInSamples > kMaxAudioFrameSizeSamples) ||
- (audioChannel > 2) || (audioChannel < 1))
- {
- _payloadDataLengthInSamples = 0;
- return -1;
- }
- _payloadDataLengthInSamples = payloadDataLengthInSamples;
- if(payloadData != NULL)
- {
- memcpy(_payloadData, payloadData, sizeof(WebRtc_Word16) *
- payloadDataLengthInSamples * _audioChannel);
- }
- else
- {
- memset(_payloadData,0,sizeof(WebRtc_Word16) *
- payloadDataLengthInSamples * _audioChannel);
- }
- return 0;
-}
-
-inline
-void
-AudioFrame::Mute() const
-{
- memset(_payloadData, 0, _payloadDataLengthInSamples * sizeof(WebRtc_Word16));
-}
-
-inline
-AudioFrame&
-AudioFrame::operator=(const AudioFrame& rhs)
-{
- // Sanity Check
- if((rhs._payloadDataLengthInSamples > kMaxAudioFrameSizeSamples) ||
- (rhs._audioChannel > 2) ||
- (rhs._audioChannel < 1))
- {
- return *this;
- }
- if(this == &rhs)
- {
- return *this;
- }
- _id = rhs._id;
- _timeStamp = rhs._timeStamp;
- _frequencyInHz = rhs._frequencyInHz;
- _speechType = rhs._speechType;
- _vadActivity = rhs._vadActivity;
- _volume = rhs._volume;
- _audioChannel = rhs._audioChannel;
- _energy = rhs._energy;
-
- _payloadDataLengthInSamples = rhs._payloadDataLengthInSamples;
- memcpy(_payloadData, rhs._payloadData,
- sizeof(WebRtc_Word16) * rhs._payloadDataLengthInSamples * _audioChannel);
-
- return *this;
-}
-
-inline
-AudioFrame&
-AudioFrame::operator>>=(const WebRtc_Word32 rhs)
-{
- assert((_audioChannel > 0) && (_audioChannel < 3));
- if((_audioChannel > 2) ||
- (_audioChannel < 1))
- {
- return *this;
- }
- for(WebRtc_UWord16 i = 0; i < _payloadDataLengthInSamples * _audioChannel; i++)
- {
- _payloadData[i] = WebRtc_Word16(_payloadData[i] >> rhs);
- }
- return *this;
-}
-
-inline
-AudioFrame&
-AudioFrame::Append(const AudioFrame& rhs)
-{
- // Sanity check
- assert((_audioChannel > 0) && (_audioChannel < 3));
- if((_audioChannel > 2) ||
- (_audioChannel < 1))
- {
- return *this;
- }
- if(_audioChannel != rhs._audioChannel)
- {
- return *this;
- }
- if((_vadActivity == kVadActive) ||
- rhs._vadActivity == kVadActive)
- {
- _vadActivity = kVadActive;
- }
- else if((_vadActivity == kVadUnknown) ||
- rhs._vadActivity == kVadUnknown)
- {
- _vadActivity = kVadUnknown;
- }
- if(_speechType != rhs._speechType)
- {
- _speechType = kUndefined;
- }
-
- WebRtc_UWord16 offset = _payloadDataLengthInSamples * _audioChannel;
- for(WebRtc_UWord16 i = 0;
- i < rhs._payloadDataLengthInSamples * rhs._audioChannel;
- i++)
- {
- _payloadData[offset+i] = rhs._payloadData[i];
- }
- _payloadDataLengthInSamples += rhs._payloadDataLengthInSamples;
- return *this;
-}
-
-// merge vectors
-inline
-AudioFrame&
-AudioFrame::operator+=(const AudioFrame& rhs)
-{
- // Sanity check
- assert((_audioChannel > 0) && (_audioChannel < 3));
- if((_audioChannel > 2) ||
- (_audioChannel < 1))
- {
- return *this;
- }
- if(_audioChannel != rhs._audioChannel)
- {
- return *this;
- }
- bool noPrevData = false;
- if(_payloadDataLengthInSamples != rhs._payloadDataLengthInSamples)
- {
- if(_payloadDataLengthInSamples == 0)
- {
- // special case we have no data to start with
- _payloadDataLengthInSamples = rhs._payloadDataLengthInSamples;
- noPrevData = true;
- } else
- {
- return *this;
- }
- }
-
- if((_vadActivity == kVadActive) ||
- rhs._vadActivity == kVadActive)
- {
- _vadActivity = kVadActive;
- }
- else if((_vadActivity == kVadUnknown) ||
- rhs._vadActivity == kVadUnknown)
- {
- _vadActivity = kVadUnknown;
- }
-
- if(_speechType != rhs._speechType)
- {
- _speechType = kUndefined;
- }
-
- if(noPrevData)
- {
- memcpy(_payloadData, rhs._payloadData,
- sizeof(WebRtc_Word16) * rhs._payloadDataLengthInSamples * _audioChannel);
- } else
- {
- // IMPROVEMENT this can be done very fast in assembly
- for(WebRtc_UWord16 i = 0; i < _payloadDataLengthInSamples * _audioChannel; i++)
- {
- WebRtc_Word32 wrapGuard = (WebRtc_Word32)_payloadData[i] +
- (WebRtc_Word32)rhs._payloadData[i];
- if(wrapGuard < -32768)
- {
- _payloadData[i] = -32768;
- }else if(wrapGuard > 32767)
- {
- _payloadData[i] = 32767;
- }else
- {
- _payloadData[i] = (WebRtc_Word16)wrapGuard;
- }
- }
- }
- _energy = 0xffffffff;
- _volume = 0xffffffff;
- return *this;
-}
-
-inline
-AudioFrame&
-AudioFrame::operator-=(const AudioFrame& rhs)
-{
- // Sanity check
- assert((_audioChannel > 0) && (_audioChannel < 3));
- if((_audioChannel > 2)||
- (_audioChannel < 1))
- {
- return *this;
- }
- if((_payloadDataLengthInSamples != rhs._payloadDataLengthInSamples) ||
- (_audioChannel != rhs._audioChannel))
- {
- return *this;
- }
- if((_vadActivity != kVadPassive) ||
- rhs._vadActivity != kVadPassive)
- {
- _vadActivity = kVadUnknown;
- }
- _speechType = kUndefined;
-
- for(WebRtc_UWord16 i = 0; i < _payloadDataLengthInSamples * _audioChannel; i++)
- {
- WebRtc_Word32 wrapGuard = (WebRtc_Word32)_payloadData[i] -
- (WebRtc_Word32)rhs._payloadData[i];
- if(wrapGuard < -32768)
- {
- _payloadData[i] = -32768;
- }
- else if(wrapGuard > 32767)
- {
- _payloadData[i] = 32767;
- }
- else
- {
- _payloadData[i] = (WebRtc_Word16)wrapGuard;
- }
- }
- _energy = 0xffffffff;
- _volume = 0xffffffff;
- return *this;
-}
-
-} // namespace webrtc
-
-#endif // MODULE_COMMON_TYPES_H
diff --git a/src/system_wrappers/OWNERS b/src/system_wrappers/OWNERS
deleted file mode 100644
index 32dcbbc..0000000
--- a/src/system_wrappers/OWNERS
+++ /dev/null
@@ -1,7 +0,0 @@
-hellner@google.com
-pwestin@google.com
-perkj@google.com
-henrika@google.com
-grunell@google.com
-mflodman@google.com
-niklase@google.com
\ No newline at end of file
diff --git a/src/system_wrappers/interface/aligned_malloc.h b/src/system_wrappers/interface/aligned_malloc.h
deleted file mode 100644
index c229435..0000000
--- a/src/system_wrappers/interface/aligned_malloc.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_ALIGNED_MALLOC_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_ALIGNED_MALLOC_H_
-
-#include <stddef.h>
-
-namespace webrtc
-{
- void* AlignedMalloc(
- size_t size,
- size_t alignment);
- void AlignedFree(
- void* memBlock);
-}
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_ALIGNED_MALLOC_H_
diff --git a/src/system_wrappers/interface/atomic32_wrapper.h b/src/system_wrappers/interface/atomic32_wrapper.h
deleted file mode 100644
index 40862fb..0000000
--- a/src/system_wrappers/interface/atomic32_wrapper.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-// Atomic system independant 32-bit integer.
-// Note: uses full memory barriers.
-// Note: assumes 32-bit (or higher) system
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_ATOMIC32_WRAPPER_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_ATOMIC32_WRAPPER_H_
-
-#include "common_types.h"
-
-namespace webrtc {
-class Atomic32Impl;
-class Atomic32Wrapper
-{
-public:
- Atomic32Wrapper(WebRtc_Word32 initialValue = 0);
- ~Atomic32Wrapper();
-
- // Prefix operator!
- WebRtc_Word32 operator++();
- WebRtc_Word32 operator--();
-
- Atomic32Wrapper& operator=(const Atomic32Wrapper& rhs);
- Atomic32Wrapper& operator=(WebRtc_Word32 rhs);
-
- WebRtc_Word32 operator+=(WebRtc_Word32 rhs);
- WebRtc_Word32 operator-=(WebRtc_Word32 rhs);
-
- // Sets the value atomically to newValue if the value equals compare value.
- // The function returns true if the exchange happened.
- bool CompareExchange(WebRtc_Word32 newValue, WebRtc_Word32 compareValue);
- WebRtc_Word32 Value() const;
-private:
- // Disable the + and - operator since it's unclear what these operations
- // should do.
- Atomic32Wrapper operator+(const Atomic32Wrapper& rhs);
- Atomic32Wrapper operator-(const Atomic32Wrapper& rhs);
-
- WebRtc_Word32& operator++(int);
- WebRtc_Word32& operator--(int);
-
- // Cheshire cat to hide the implementation (faster than
- // using virtual functions)
- Atomic32Impl& _impl;
-};
-} // namespace webrtc
-#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_ATOMIC32_WRAPPER_H_
diff --git a/src/system_wrappers/interface/condition_variable_wrapper.h b/src/system_wrappers/interface/condition_variable_wrapper.h
deleted file mode 100644
index c040fbf..0000000
--- a/src/system_wrappers/interface/condition_variable_wrapper.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CONDITION_VARIABLE_WRAPPER_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CONDITION_VARIABLE_WRAPPER_H_
-
-namespace webrtc {
-class CriticalSectionWrapper;
-
-class ConditionVariableWrapper
-{
-public:
- // Factory method, constructor disabled.
- static ConditionVariableWrapper* CreateConditionVariable();
-
- virtual ~ConditionVariableWrapper() {}
-
- // Calling thread will atomically release critSect and wait until next
- // some other thread calls Wake() or WakeAll().
- virtual void SleepCS(CriticalSectionWrapper& critSect) = 0;
-
- // Same as above but with a timeout.
- virtual bool SleepCS(CriticalSectionWrapper& critSect,
- unsigned long maxTimeInMS) = 0;
-
- // Wakes one thread calling SleepCS().
- virtual void Wake() = 0;
-
- // Wakes all threads calling SleepCS().
- virtual void WakeAll() = 0;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CONDITION_VARIABLE_WRAPPER_H_
diff --git a/src/system_wrappers/interface/constructor_magic.h b/src/system_wrappers/interface/constructor_magic.h
deleted file mode 100644
index b2aabc5..0000000
--- a/src/system_wrappers/interface/constructor_magic.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-/*
- * WebRtc
- * Copy from third_party/libjingle/source/talk/base/constructormagic.h
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CONSTRUCTOR_MAGIC_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CONSTRUCTOR_MAGIC_H_
-
-#ifndef DISALLOW_ASSIGN
-#define DISALLOW_ASSIGN(TypeName) \
- void operator=(const TypeName&)
-#endif
-
-#ifndef DISALLOW_COPY_AND_ASSIGN
-// A macro to disallow the evil copy constructor and operator= functions
-// This should be used in the private: declarations for a class
-#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
- TypeName(const TypeName&); \
- DISALLOW_ASSIGN(TypeName)
-#endif
-
-#ifndef DISALLOW_EVIL_CONSTRUCTORS
-// Alternative, less-accurate legacy name.
-#define DISALLOW_EVIL_CONSTRUCTORS(TypeName) \
- DISALLOW_COPY_AND_ASSIGN(TypeName)
-#endif
-
-#ifndef DISALLOW_IMPLICIT_CONSTRUCTORS
-// A macro to disallow all the implicit constructors, namely the
-// default constructor, copy constructor and operator= functions.
-//
-// This should be used in the private: declarations for a class
-// that wants to prevent anyone from instantiating it. This is
-// especially useful for classes containing only static methods.
-#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
- TypeName(); \
- DISALLOW_EVIL_CONSTRUCTORS(TypeName)
-#endif
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CONSTRUCTOR_MAGIC_H_
diff --git a/src/system_wrappers/interface/cpu_features_wrapper.h b/src/system_wrappers/interface/cpu_features_wrapper.h
deleted file mode 100644
index 5d8a828..0000000
--- a/src/system_wrappers/interface/cpu_features_wrapper.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CPU_FEATURES_WRAPPER_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CPU_FEATURES_WRAPPER_H_
-
-#if defined(__cplusplus) || defined(c_plusplus)
-extern "C" {
-#endif
-
-// list of features.
-typedef enum {
- kSSE2,
- kSSE3
-} CPUFeature;
-
-typedef int (*WebRtc_CPUInfo)(CPUFeature feature);
-// returns true if the CPU supports the feature.
-extern WebRtc_CPUInfo WebRtc_GetCPUInfo;
-// No CPU feature is available => straight C path.
-extern WebRtc_CPUInfo WebRtc_GetCPUInfoNoASM;
-
-#if defined(__cplusplus) || defined(c_plusplus)
-} // extern "C"
-#endif
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CPU_FEATURES_WRAPPER_H_
diff --git a/src/system_wrappers/interface/cpu_wrapper.h b/src/system_wrappers/interface/cpu_wrapper.h
deleted file mode 100644
index b72c20c..0000000
--- a/src/system_wrappers/interface/cpu_wrapper.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CPU_WRAPPER_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CPU_WRAPPER_H_
-
-#include "typedefs.h"
-
-namespace webrtc {
-class CpuWrapper
-{
-public:
- static WebRtc_UWord32 DetectNumberOfCores();
-
- static CpuWrapper* CreateCpu();
- virtual ~CpuWrapper() {}
-
- // Returns the average CPU usage for all processors. The CPU usage can be
- // between and including 0 to 100 (%)
- virtual WebRtc_Word32 CpuUsage() = 0;
- virtual WebRtc_Word32 CpuUsage(WebRtc_Word8* processName,
- WebRtc_UWord32 length) = 0;
- virtual WebRtc_Word32 CpuUsage(WebRtc_UWord32 dwProcessID) = 0;
-
- // The CPU usage per core is returned in cpu_usage. The CPU can be between
- // and including 0 to 100 (%)
- // Note that the pointer passed as cpu_usage is redirected to a local member
- // of the CPU wrapper.
- // numCores is the number of cores in the cpu_usage array.
- virtual WebRtc_Word32 CpuUsageMultiCore(WebRtc_UWord32& numCores,
- WebRtc_UWord32*& cpu_usage) = 0;
-
- virtual void Reset() = 0;
- virtual void Stop() = 0;
-
-protected:
- CpuWrapper() {}
-
-private:
- static WebRtc_UWord32 _numberOfCores;
-
-};
-} // namespace webrtc
-#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CPU_WRAPPER_H_
diff --git a/src/system_wrappers/interface/critical_section_wrapper.h b/src/system_wrappers/interface/critical_section_wrapper.h
deleted file mode 100644
index ad31497..0000000
--- a/src/system_wrappers/interface/critical_section_wrapper.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CRITICAL_SECTION_WRAPPER_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CRITICAL_SECTION_WRAPPER_H_
-
-// If the critical section is heavily contended it may be beneficial to use
-// read/write locks instead.
-
-#include "common_types.h"
-
-namespace webrtc {
-class CriticalSectionWrapper
-{
-public:
- // Factory method, constructor disabled
- static CriticalSectionWrapper* CreateCriticalSection();
-
- virtual ~CriticalSectionWrapper() {}
-
- // Tries to grab lock, beginning of a critical section. Will wait for the
- // lock to become available if the grab failed.
- virtual void Enter() = 0;
-
- // Returns a grabbed lock, end of critical section.
- virtual void Leave() = 0;
-};
-
-// RAII extension of the critical section. Prevents Enter/Leave missmatches and
-// provides more compact critical section syntax.
-class CriticalSectionScoped
-{
-public:
- CriticalSectionScoped(CriticalSectionWrapper& critsec)
- :
- _ptrCritSec(&critsec)
- {
- _ptrCritSec->Enter();
- }
-
- ~CriticalSectionScoped()
- {
- if (_ptrCritSec)
- {
- Leave();
- }
- }
-
-private:
- void Leave()
- {
- _ptrCritSec->Leave();
- _ptrCritSec = 0;
- }
-
- CriticalSectionWrapper* _ptrCritSec;
-};
-} // namespace webrtc
-#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CRITICAL_SECTION_WRAPPER_H_
diff --git a/src/system_wrappers/interface/event_wrapper.h b/src/system_wrappers/interface/event_wrapper.h
deleted file mode 100644
index 0c9a908..0000000
--- a/src/system_wrappers/interface/event_wrapper.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_EVENT_WRAPPER_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_EVENT_WRAPPER_H_
-
-namespace webrtc {
-enum EventTypeWrapper
-{
- kEventSignaled = 1,
- kEventError = 2,
- kEventTimeout = 3
-};
-
-#define WEBRTC_EVENT_10_SEC 10000
-#define WEBRTC_EVENT_INFINITE 0xffffffff
-
-class EventWrapper
-{
-public:
- // Factory method. Constructor disabled.
- static EventWrapper* Create();
- virtual ~EventWrapper() {}
-
- // Releases threads who are calling Wait() and has started waiting. Please
- // note that a thread calling Wait() will not start waiting immediately.
- // assumptions to the contrary is a very common source of issues in
- // multithreaded programming.
- // Set is sticky in the sense that it will release at least one thread
- // either immediately or some time in the future.
- virtual bool Set() = 0;
-
- // Prevents future Wait() calls from finishing without a new Set() call.
- virtual bool Reset() = 0;
-
- // Puts the calling thread into a wait state. The thread may be released
- // by a Set() call depending on if other threads are waiting and if so on
- // timing. The thread that was released will call Reset() before leaving
- // preventing more threads from being released. If multiple threads
- // are waiting for the same Set(), only one (random) thread is guaranteed to
- // be released. It is possible that multiple (random) threads are released
- // Depending on timing.
- virtual EventTypeWrapper Wait(unsigned long maxTime) = 0;
-
- // Starts a timer that will call a non-sticky version of Set() either once
- // or periodically. If the timer is periodic it ensures that there is no
- // drift over time relative to the system clock.
- virtual bool StartTimer(bool periodic, unsigned long time) = 0;
-
- virtual bool StopTimer() = 0;
-
- // Only implemented on Windows
- // Returns 1 if a key has been pressed since last call to this function.
- // -1 indicates failure
- // 0 indicates no key has been pressed since last call
- // TODO(hellner) this function does not seem to belong here
- static int KeyPressed();
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_EVENT_WRAPPER_H_
diff --git a/src/system_wrappers/interface/file_wrapper.h b/src/system_wrappers/interface/file_wrapper.h
deleted file mode 100644
index 8f0cd8c..0000000
--- a/src/system_wrappers/interface/file_wrapper.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_FILE_WRAPPER_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_FILE_WRAPPER_H_
-
-#include "common_types.h"
-#include "typedefs.h"
-
-// Implementation of an InStream and OutStream that can read (exclusive) or
-// write from/to a file.
-
-namespace webrtc {
-class FileWrapper : public InStream, public OutStream
-{
-public:
- enum { kMaxFileNameSize = 1024};
- enum { kFileMaxTextMessageSize = 1024};
-
- // Factory method. Constructor disabled.
- static FileWrapper* Create();
-
- // Returns true if a file has been opened.
- virtual bool Open() const = 0;
-
- // Opens a file in read or write mode, decided by the readOnly parameter.
- virtual WebRtc_Word32 OpenFile(const WebRtc_Word8* fileNameUTF8,
- const bool readOnly,
- const bool loop = false,
- const bool text = false) = 0;
-
- virtual WebRtc_Word32 CloseFile() = 0;
-
- // Limits the file size.
- virtual WebRtc_Word32 SetMaxFileSize(WebRtc_Word32 bytes) = 0;
-
- // Flush any pending writes.
- virtual WebRtc_Word32 Flush() = 0;
-
- // Returns the opened file's name in fileNameUTF8. size is the allocated
- // size of fileNameUTF8. The name will be truncated if the size of
- // fileNameUTF8 is to small.
- virtual WebRtc_Word32 FileName(WebRtc_Word8* fileNameUTF8,
- WebRtc_UWord32 size) const = 0;
-
- // Write text to the opened file. The written text can contain plain text
- // and text with type specifiers in the same way as sprintf works.
- virtual WebRtc_Word32 WriteText(const WebRtc_Word8* text, ...) = 0;
-
- // Reads len number of bytes from buf to file.
- virtual int Read(void* buf, int len) = 0;
-
- // Writes len number of bytes to buf from file. Please note that the actual
- // writing to file may happen some time later. Call flush to force a write
- // to take affect
- virtual bool Write(const void *buf,int len) = 0;
-
- // Rewinds the file to the start. Only available when OpenFile() has been
- // called with loop argument set to true. Or readOnly argument has been set
- // to false.
- virtual int Rewind() = 0;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_FILE_WRAPPER_H_
diff --git a/src/system_wrappers/interface/list_wrapper.h b/src/system_wrappers/interface/list_wrapper.h
deleted file mode 100644
index bc10ad4..0000000
--- a/src/system_wrappers/interface/list_wrapper.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_LIST_WRAPPER_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_LIST_WRAPPER_H_
-
-#include "constructor_magic.h"
-
-namespace webrtc {
-class CriticalSectionWrapper;
-
-class ListItem
-{
-friend class ListWrapper;
-
-public:
- ListItem(const void* ptr);
- ListItem(const unsigned int item);
- virtual ~ListItem();
- void* GetItem() const;
- unsigned int GetUnsignedItem() const;
-
-protected:
- ListItem* next_;
- ListItem* prev_;
-
-private:
- const void* item_ptr_;
- const unsigned int item_;
- DISALLOW_COPY_AND_ASSIGN(ListItem);
-};
-
-class ListWrapper
-{
-public:
- ListWrapper();
- virtual ~ListWrapper();
-
- // Returns the number of elements stored in the list.
- unsigned int GetSize() const;
-
- // Puts a pointer to anything last in the list.
- int PushBack(const void* ptr);
- // Puts a pointer to anything first in the list.
- int PushFront(const void* ptr);
-
- // Puts a copy of the specified integer last in the list.
- int PushBack(const unsigned int item_id);
- // Puts a copy of the specified integer first in the list.
- int PushFront(const unsigned int item_id);
-
- // Pops the first ListItem from the list
- int PopFront();
-
- // Pops the last ListItem from the list
- int PopBack();
-
- // Returns true if the list is empty
- bool Empty() const;
-
- // Returns a pointer to the first ListItem in the list.
- ListItem* First() const;
-
- // Returns a pointer to the last ListItem in the list.
- ListItem* Last() const;
-
- // Returns a pointer to the ListItem stored after item in the list.
- ListItem* Next(ListItem* item) const;
-
- // Returns a pointer to the ListItem stored before item in the list.
- ListItem* Previous(ListItem* item) const;
-
- // Removes item from the list.
- int Erase(ListItem* item);
-
- // Insert list item after existing_previous_item. Please note that new_item
- // must be created using new ListItem(). The map will take ownership of
- // new_item following a successfull insert. If insert fails new_item will
- // not be released by the List
- int Insert(ListItem* existing_previous_item,
- ListItem* new_item);
-
- // Insert list item before existing_next_item. Please note that new_item
- // must be created using new ListItem(). The map will take ownership of
- // new_item following a successfull insert. If insert fails new_item will
- // not be released by the List
- int InsertBefore(ListItem* existing_next_item,
- ListItem* new_item);
-
-private:
- void PushBackImpl(ListItem* item);
- void PushFrontImpl(ListItem* item);
-
- CriticalSectionWrapper* critical_section_;
- ListItem* first_;
- ListItem* last_;
- unsigned int size_;
- DISALLOW_COPY_AND_ASSIGN(ListWrapper);
-};
-} //namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_LIST_WRAPPER_H_
diff --git a/src/system_wrappers/interface/map_wrapper.h b/src/system_wrappers/interface/map_wrapper.h
deleted file mode 100644
index 9297382..0000000
--- a/src/system_wrappers/interface/map_wrapper.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_MAP_WRAPPER_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_MAP_WRAPPER_H_
-
-#include <map>
-
-#include "constructor_magic.h"
-
-namespace webrtc {
-class MapItem
-{
-friend class MapWrapper;
-
-public:
- MapItem(int id, void* ptr);
- virtual ~MapItem();
- void* GetItem();
- int GetId();
- unsigned int GetUnsignedId();
- void SetItem(void* ptr);
-
-private:
- int item_id_;
- void* item_pointer_;
- DISALLOW_COPY_AND_ASSIGN(MapItem);
-};
-
-class MapWrapper
-{
-public:
- MapWrapper();
- ~MapWrapper();
-
- // Puts a pointer to anything in the map and associates it with id. Note, id
- // needs to be unique for all items in the map.
- int Insert(int id, void* ptr);
-
- // Removes item from map.
- int Erase(MapItem* item);
-
- // Finds item with associated with id and removes it from the map.
- int Erase(int id);
-
- // Returns the number of elements stored in the map.
- int Size() const;
-
- // Returns a pointer to the first MapItem in the map.
- MapItem* First() const;
-
- // Returns a pointer to the last MapItem in the map.
- MapItem* Last() const;
-
- // Returns a pointer to the MapItem stored after item in the map.
- MapItem* Next(MapItem* item) const;
-
- // Returns a pointer to the MapItem stored before item in the map.
- MapItem* Previous(MapItem* item) const;
-
- // Returns a pointer to the MapItem associated with id from the map.
- MapItem* Find(int id) const;
-
-private:
- std::map<int, MapItem*> map_;
- DISALLOW_COPY_AND_ASSIGN(MapWrapper);
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_MAP_WRAPPER_H_
diff --git a/src/system_wrappers/interface/rw_lock_wrapper.h b/src/system_wrappers/interface/rw_lock_wrapper.h
deleted file mode 100644
index f0842ac..0000000
--- a/src/system_wrappers/interface/rw_lock_wrapper.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_RW_LOCK_WRAPPER_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_RW_LOCK_WRAPPER_H_
-
-// Note, Windows pre-Vista version of RW locks are not supported nativly. For
-// these OSs regular critical sections have been used to approximate RW lock
-// functionality and will therefore have worse performance.
-
-namespace webrtc {
-class RWLockWrapper
-{
-public:
- static RWLockWrapper* CreateRWLock();
- virtual ~RWLockWrapper();
-
- virtual void AcquireLockExclusive() = 0;
- virtual void ReleaseLockExclusive() = 0;
-
- virtual void AcquireLockShared() = 0;
- virtual void ReleaseLockShared() = 0;
-
-protected:
- virtual int Init() = 0;
-};
-
-// RAII extensions of the RW lock. Prevents Acquire/Release missmatches and
-// provides more compact locking syntax.
-class ReadLockScoped
-{
-public:
- ReadLockScoped(RWLockWrapper& rwLock)
- :
- _rwLock(rwLock)
- {
- _rwLock.AcquireLockShared();
- }
-
- ~ReadLockScoped()
- {
- _rwLock.ReleaseLockShared();
- }
-
-private:
- RWLockWrapper& _rwLock;
-};
-
-class WriteLockScoped
-{
-public:
- WriteLockScoped(RWLockWrapper& rwLock)
- :
- _rwLock(rwLock)
- {
- _rwLock.AcquireLockExclusive();
- }
-
- ~WriteLockScoped()
- {
- _rwLock.ReleaseLockExclusive();
- }
-
-private:
- RWLockWrapper& _rwLock;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_RW_LOCK_WRAPPER_H_
diff --git a/src/system_wrappers/interface/sort.h b/src/system_wrappers/interface/sort.h
deleted file mode 100644
index fb25ecf..0000000
--- a/src/system_wrappers/interface/sort.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-// Generic unstable sorting routines.
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_SORT_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_SORT_H_
-
-#include "typedefs.h"
-#include "common_types.h"
-
-namespace webrtc
-{
- enum Type
- {
- TYPE_Word8,
- TYPE_UWord8,
- TYPE_Word16,
- TYPE_UWord16,
- TYPE_Word32,
- TYPE_UWord32,
- TYPE_Word64,
- TYPE_UWord64,
- TYPE_Float32,
- TYPE_Float64
- };
- // Sorts intrinsic data types.
- //
- // data [in/out] A pointer to an array of intrinsic type.
- // Upon return it will be sorted in ascending order.
- // numOfElements The number of elements in the array.
- // dataType Enum corresponding to the type of the array.
- //
- // returns 0 on success, -1 on failure.
- WebRtc_Word32 Sort(void* data, WebRtc_UWord32 numOfElements, Type dataType);
-
- // Sorts arbitrary data types. This requires an array of intrinsically typed
- // key values which will be used to sort the data array. There must be a
- // one-to-one correspondence between data elements and key elements, with
- // corresponding elements sharing the same position in their respective
- // arrays.
- //
- // data [in/out] A pointer to an array of arbitrary type.
- // Upon return it will be sorted in ascending order.
- // key [in] A pointer to an array of keys used to sort the
- // data array.
- // numOfElements The number of elements in the arrays.
- // sizeOfElement The size, in bytes, of the data array.
- // keyType Enum corresponding to the type of the key array.
- //
- // returns 0 on success, -1 on failure.
- //
- WebRtc_Word32 KeySort(void* data, void* key, WebRtc_UWord32 numOfElements,
- WebRtc_UWord32 sizeOfElement, Type keyType);
-}
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_SORT_H_
diff --git a/src/system_wrappers/interface/thread_wrapper.h b/src/system_wrappers/interface/thread_wrapper.h
deleted file mode 100644
index eccf3c2..0000000
--- a/src/system_wrappers/interface/thread_wrapper.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-// System independant wrapper for spawning threads
-// Note: the spawned thread will loop over the callback function until stopped.
-// Note: The callback function is expected to return every 2 seconds or more
-// often.
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_THREAD_WRAPPER_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_THREAD_WRAPPER_H_
-
-namespace webrtc {
-// Object that will be passed by the spawned thread when it enters the callback
-// function.
-#define ThreadObj void*
-
-// Callback function that the spawned thread will enter once spawned
-typedef bool(*ThreadRunFunction)(ThreadObj);
-
-enum ThreadPriority
-{
- kLowPriority = 1,
- kNormalPriority = 2,
- kHighPriority = 3,
- kHighestPriority = 4,
- kRealtimePriority = 5
-};
-
-class ThreadWrapper
-{
-public:
- enum {kThreadMaxNameLength = 64};
-
- virtual ~ThreadWrapper() {};
-
- // Factory method. Constructor disabled.
- //
- // func Pointer to a, by user, specified callback function.
- // obj Object associated with the thread. Passed in the callback
- // function.
- // prio Thread priority. May require root/admin rights.
- // threadName NULL terminated thread name, will be visable in the Windows
- // debugger.
- static ThreadWrapper* CreateThread(ThreadRunFunction func = 0,
- ThreadObj obj= 0,
- ThreadPriority prio = kNormalPriority,
- const char* threadName = 0);
-
- // Non blocking termination of the spawned thread. Note that it is not safe
- // to delete this class until the spawned thread has been reclaimed.
- virtual void SetNotAlive() = 0;
-
- // Spawns the thread. This will start the triggering of the callback
- // function.
- virtual bool Start(unsigned int& id) = 0;
-
- // Sets the threads CPU affinity. CPUs are listed 0 - (number of CPUs - 1).
- // The numbers in processorNumbers specify which CPUs are allowed to run the
- // thread. processorNumbers should not contain any duplicates and elements
- // should be lower than (number of CPUs - 1). amountOfProcessors should be
- // equal to the number of processors listed in processorNumbers
- virtual bool SetAffinity(const int* /*processorNumbers*/,
- const unsigned int /*amountOfProcessors*/)
- {return false;}
-
- // Stops the spawned thread and waits for it to be reclaimed with a timeout
- // of two seconds. Will return false if the thread was not reclaimed.
- // Multiple tries to Stop are allowed (e.g. to wait longer than 2 seconds).
- // It's ok to call Stop() even if the spawned thread has been reclaimed.
- virtual bool Stop() = 0;
-
- // Stops the spawned thread dead in its tracks. Will likely result in a
- // corrupt state. There should be an extremely good reason for even looking
- // at this function. Can cause many problems deadlock being one of them.
- virtual bool Shutdown() {return false;}
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_THREAD_WRAPPER_H_
diff --git a/src/system_wrappers/interface/tick_util.h b/src/system_wrappers/interface/tick_util.h
deleted file mode 100644
index 4c28067..0000000
--- a/src/system_wrappers/interface/tick_util.h
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-// System independant wrapper for polling elapsed time in ms and us.
-// The implementation works in the tick domain which can be mapped over to the
-// time domain.
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_TICK_UTIL_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_TICK_UTIL_H_
-
-#if _WIN32
-#include <windows.h>
-#include <mmsystem.h>
-#elif WEBRTC_LINUX
-#include <ctime>
-#else
-#include <sys/time.h>
-#include <time.h>
-#endif
-
-#include "typedefs.h"
-
-namespace webrtc {
-class TickInterval;
-
-class TickTime
-{
-public:
- // Current time in the tick domain.
- static TickTime Now();
-
- // Now in the time domain in ms.
- static WebRtc_Word64 MillisecondTimestamp();
-
- // Now in the time domain in us.
- static WebRtc_Word64 MicrosecondTimestamp();
-
- WebRtc_Word64 Ticks() const;
-
- static WebRtc_Word64 MillisecondsToTicks(const WebRtc_Word64 ms);
-
- static WebRtc_Word64 TicksToMilliseconds(const WebRtc_Word64 ticks);
-
- // Returns a TickTime that is ticks later than the passed TickTime
- friend TickTime operator+(const TickTime lhs, const WebRtc_Word64 ticks);
- TickTime& operator+=(const WebRtc_Word64& rhs);
-
-
- // Returns a TickInterval that is the difference in ticks beween rhs and lhs
- friend TickInterval operator-(const TickTime& lhs, const TickTime& rhs);
-private:
- WebRtc_Word64 _ticks;
-};
-
-class TickInterval
-{
-public:
- TickInterval();
-
- WebRtc_Word64 Milliseconds() const;
- WebRtc_Word64 Microseconds() const;
-
- // Returns the sum of two TickIntervals as a TickInterval
- friend TickInterval operator+(const TickInterval& lhs,
- const TickInterval& rhs);
- TickInterval& operator-=(const TickInterval& rhs);
-
- // Returns a TickInterval corresponding to rhs - lhs
- friend TickInterval operator-(const TickInterval& lhs,
- const TickInterval& rhs);
- TickInterval& operator+=(const TickInterval& rhs);
-
-private:
- TickInterval(WebRtc_Word64 interval);
-
- friend class TickTime;
- friend TickInterval operator-(const TickTime& lhs, const TickTime& rhs);
-
-private:
- WebRtc_Word64 _interval;
-};
-
-inline TickInterval operator+(const TickInterval& lhs, const TickInterval& rhs)
-{
- return TickInterval(lhs._interval + rhs._interval);
-}
-
-inline TickInterval operator-(const TickInterval& lhs, const TickInterval& rhs)
-{
- return TickInterval(lhs._interval - rhs._interval);
-}
-
-inline TickInterval operator-(const TickTime& lhs,const TickTime& rhs)
-{
- return TickInterval(lhs._ticks - rhs._ticks);
-}
-
-inline TickTime operator+(const TickTime lhs, const WebRtc_Word64 ticks)
-{
- TickTime time = lhs;
- time._ticks += ticks;
- return time;
-}
-
-inline TickTime TickTime::Now()
-{
- TickTime result;
-#if _WIN32
- #ifdef USE_QUERY_PERFORMANCE_COUNTER
- // QueryPerformanceCounter returns the value from the TSC which is
- // incremented at the CPU frequency. The algorithm used requires
- // the CPU frequency to be constant. Technology like speed stepping
- // which has variable CPU frequency will therefore yield unpredictable,
- // incorrect time estimations.
- LARGE_INTEGER qpcnt;
- QueryPerformanceCounter(&qpcnt);
- result._ticks = qpcnt.QuadPart;
- #else
- static volatile LONG lastTimeGetTime = 0;
- static volatile WebRtc_Word64 numWrapTimeGetTime = 0;
- volatile LONG* lastTimeGetTimePtr = &lastTimeGetTime;
- DWORD now = timeGetTime();
- // Atomically update the last gotten time
- DWORD old = InterlockedExchange(lastTimeGetTimePtr, now);
- if(now < old)
- {
- // If now is earlier than old, there may have been a race between
- // threads.
- // 0x0fffffff ~3.1 days, the code will not take that long to execute
- // so it must have been a wrap around.
- if(old > 0xf0000000 && now < 0x0fffffff)
- {
- numWrapTimeGetTime++;
- }
- }
- result._ticks = now + (numWrapTimeGetTime<<32);
- #endif
-#elif defined(WEBRTC_LINUX)
- struct timespec ts;
- #ifdef WEBRTC_CLOCK_TYPE_REALTIME
- clock_gettime(CLOCK_REALTIME, &ts);
- #else
- clock_gettime(CLOCK_MONOTONIC, &ts);
- #endif
- result._ticks = 1000000000LL * static_cast<WebRtc_Word64>(ts.tv_sec) + static_cast<WebRtc_Word64>(ts.tv_nsec);
-#else
- struct timeval tv;
- gettimeofday(&tv, NULL);
- result._ticks = 1000000LL * static_cast<WebRtc_Word64>(tv.tv_sec) + static_cast<WebRtc_Word64>(tv.tv_usec);
-#endif
- return result;
-}
-
-inline WebRtc_Word64 TickTime::MillisecondTimestamp()
-{
- TickTime now = TickTime::Now();
-#if _WIN32
- #ifdef USE_QUERY_PERFORMANCE_COUNTER
- LARGE_INTEGER qpfreq;
- QueryPerformanceFrequency(&qpfreq);
- return (now._ticks * 1000) / qpfreq.QuadPart;
- #else
- return now._ticks;
- #endif
-#elif WEBRTC_LINUX
- return now._ticks / 1000000LL;
-#else
- return now._ticks / 1000LL;
-#endif
-}
-
-inline WebRtc_Word64 TickTime::MicrosecondTimestamp()
-{
- TickTime now = TickTime::Now();
-
-#if _WIN32
- #ifdef USE_QUERY_PERFORMANCE_COUNTER
- LARGE_INTEGER qpfreq;
- QueryPerformanceFrequency(&qpfreq);
- return (now._ticks * 1000) / (qpfreq.QuadPart/1000);
- #else
- return now._ticks *1000LL;
- #endif
-#elif WEBRTC_LINUX
- return now._ticks / 1000LL;
-#else
- return now._ticks;
-#endif
-}
-
-inline WebRtc_Word64 TickTime::Ticks() const
-{
- return _ticks;
-}
-
-inline WebRtc_Word64 TickTime::MillisecondsToTicks(const WebRtc_Word64 ms)
-{
-#if _WIN32
- #ifdef USE_QUERY_PERFORMANCE_COUNTER
- LARGE_INTEGER qpfreq;
- QueryPerformanceFrequency(&qpfreq);
- return (qpfreq.QuadPart * ms) / 1000;
- #else
- return ms;
- #endif
-#elif WEBRTC_LINUX
- return ms * 1000000LL;
-#else
- return ms * 1000LL;
-#endif
-}
-
-inline WebRtc_Word64 TickTime::TicksToMilliseconds(const WebRtc_Word64 ticks)
-{
-#if _WIN32
- #ifdef USE_QUERY_PERFORMANCE_COUNTER
- LARGE_INTEGER qpfreq;
- QueryPerformanceFrequency(&qpfreq);
- return (ticks * 1000) / qpfreq.QuadPart;
- #else
- return ticks;
- #endif
-#elif WEBRTC_LINUX
- return ticks / 1000000LL;
-#else
- return ticks / 1000LL;
-#endif
-}
-
-inline TickTime& TickTime::operator+=(const WebRtc_Word64& ticks)
-{
- _ticks += ticks;
- return *this;
-}
-
-inline TickInterval::TickInterval() : _interval(0)
-{
-}
-
-inline TickInterval::TickInterval(const WebRtc_Word64 interval)
- : _interval(interval)
-{
-}
-
-inline WebRtc_Word64 TickInterval::Milliseconds() const
-{
-#if _WIN32
- #ifdef USE_QUERY_PERFORMANCE_COUNTER
- LARGE_INTEGER qpfreq;
- QueryPerformanceFrequency(&qpfreq);
- return (_interval * 1000) / qpfreq.QuadPart;
- #else
- // _interval is in ms
- return _interval;
- #endif
-#elif WEBRTC_LINUX
- // _interval is in ns
- return _interval / 1000000;
-#else
- // _interval is usecs
- return _interval / 1000;
-#endif
-}
-
-inline WebRtc_Word64 TickInterval::Microseconds() const
-{
-#if _WIN32
- #ifdef USE_QUERY_PERFORMANCE_COUNTER
- LARGE_INTEGER qpfreq;
- QueryPerformanceFrequency(&qpfreq);
- return (_interval * 1000000) / qpfreq.QuadPart;
- #else
- // _interval is in ms
- return _interval *1000LL;
- #endif
-#elif WEBRTC_LINUX
- // _interval is in ns
- return _interval / 1000;
-#else
- // _interval is usecs
- return _interval;
-#endif
-}
-
-inline TickInterval& TickInterval::operator+=(const TickInterval& rhs)
-{
- _interval += rhs._interval;
- return *this;
-}
-
-inline TickInterval& TickInterval::operator-=(const TickInterval& rhs)
-{
- _interval -= rhs._interval;
- return *this;
-}
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_TICK_UTIL_H_
diff --git a/src/system_wrappers/interface/trace.h b/src/system_wrappers/interface/trace.h
deleted file mode 100644
index 0f7df4d..0000000
--- a/src/system_wrappers/interface/trace.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-// System independant wrapper for logging runtime information to file.
-// Note: All log messages will be written to the same trace file.
-// Note: If to many messages are written to file there will be a build up of
-// messages. Apply filtering to avoid that.
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_TRACE_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_TRACE_H_
-
-#include "common_types.h"
-#include "typedefs.h"
-
-#ifdef WEBRTC_NO_TRACE
- #define WEBRTC_TRACE
-#else
- // Ideally we would use __VA_ARGS__ but it's not supported by all compilers
- // such as VS2003 (it's supported in VS2005). TODO (hellner) why
- // would this be better than current implementation (not convinced)?
- #define WEBRTC_TRACE Trace::Add
-#endif
-
-namespace webrtc {
-class Trace
-{
-public:
-
- // Increments the reference count to the trace.
- static void CreateTrace();
- // Decrements the reference count to the trace.
- static void ReturnTrace();
- // Note: any instance that writes to the trace file should increment and
- // decrement the reference count on construction and destruction
- // respectively
-
- // Specifies what type of messages should be written to the trace file. The
- // filter parameter is a bitmask where each message type is enumerated by
- // the TraceLevel enumerator. TODO (hellner) why is the
- // TraceLevel enumerator not defined in this file?
- static WebRtc_Word32 SetLevelFilter(const WebRtc_UWord32 filter);
-
- // Returns what type of messages are written to the trace file.
- static WebRtc_Word32 LevelFilter(WebRtc_UWord32& filter);
-
- // Sets the file name. If addFileCounter is false the same file will be
- // reused when it fills up. If it's true a new file with incremented name
- // will be used.
- static WebRtc_Word32 SetTraceFile(const WebRtc_Word8* fileName,
- const bool addFileCounter = false);
-
- // Returns the name of the file that the trace is currently writing to.
- static WebRtc_Word32 TraceFile(WebRtc_Word8 fileName[1024]);
-
- // Registers callback to receive trace messages. TODO (hellner)
- // why not use OutStream instead? Why is TraceCallback not defined in this
- // file
- static WebRtc_Word32 SetTraceCallback(TraceCallback* callback);
-
- // Adds a trace message for writing to file. The message is put in a queue
- // for writing to file whenever possible for performance reasons. I.e. there
- // is a crash it is possible that the last, vital logs are not logged yet.
- // level is the the type of message to log. If that type of messages is
- // filtered it will not be written to file. module is an identifier for what
- // part of the code the message is comming.
- // id is an identifier that should be unique for that set of classes that
- // are associated (e.g. all instances owned by an engine).
- // msg and the elipsis are the same as e.g. sprintf.
- // TODO (hellner) Why is TraceModule not defined in this file?
- static void Add(const TraceLevel level,
- const TraceModule module,
- const WebRtc_Word32 id,
- const char* msg, ...);
-
-};
-} // namespace webrtc
-#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_TRACE_H_
diff --git a/src/system_wrappers/source/Android.mk b/src/system_wrappers/source/Android.mk
deleted file mode 100644
index f8e406f..0000000
--- a/src/system_wrappers/source/Android.mk
+++ /dev/null
@@ -1,67 +0,0 @@
-# This file is generated by gyp; do not edit. This means you!
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_ARM_MODE := arm
-LOCAL_MODULE := libwebrtc_system_wrappers
-LOCAL_MODULE_TAGS := optional
-LOCAL_CPP_EXTENSION := .cc
-LOCAL_GENERATED_SOURCES :=
-LOCAL_SRC_FILES := \
- map.cc \
- rw_lock_generic.cc \
- sort.cc \
- aligned_malloc.cc \
- atomic32.cc \
- condition_variable.cc \
- cpu.cc \
- cpu_features.cc \
- critical_section.cc \
- event.cc \
- file_impl.cc \
- list_no_stl.cc \
- rw_lock.cc \
- thread.cc \
- trace_impl.cc \
- condition_variable_linux.cc \
- cpu_linux.cc \
- critical_section_linux.cc \
- event_linux.cc \
- thread_linux.cc \
- trace_linux.cc \
- rw_lock_linux.cc
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS :=
-MY_CFLAGS_C :=
-MY_DEFS := '-DNO_TCMALLOC' \
- '-DNO_HEAPCHECKER' \
- '-DWEBRTC_TARGET_PC' \
- '-DWEBRTC_LINUX' \
- '-DWEBRTC_CLOCK_TYPE_REALTIME' \
- '-DWEBRTC_THREAD_RR' \
- '-DWEBRTC_ANDROID' \
- '-DANDROID'
-LOCAL_CFLAGS := $(MY_CFLAGS_C) $(MY_CFLAGS) $(MY_DEFS)
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/../.. \
- $(LOCAL_PATH)/spreadsortlib \
- $(LOCAL_PATH)/../interface
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS :=
-
-LOCAL_LDFLAGS :=
-
-LOCAL_STATIC_LIBRARIES :=
-
-LOCAL_SHARED_LIBRARIES := libcutils \
- libdl \
- libstlport
-LOCAL_ADDITIONAL_DEPENDENCIES :=
-
-include external/stlport/libstlport.mk
-include $(BUILD_STATIC_LIBRARY)
diff --git a/src/system_wrappers/source/aligned_malloc.cc b/src/system_wrappers/source/aligned_malloc.cc
deleted file mode 100644
index 6225753..0000000
--- a/src/system_wrappers/source/aligned_malloc.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "aligned_malloc.h"
-
-#include <assert.h>
-#include <memory.h>
-
-#ifdef ANDROID
-#include <stdlib.h>
-#endif
-
-#if WEBRTC_MAC
- #include <malloc/malloc.h>
-#else
- #include <malloc.h>
-#endif
-
-#if _WIN32
- #include <windows.h>
-#else
- #include <stdint.h>
-#endif
-
-#include "typedefs.h"
-
-// Ok reference on memory alignment:
-// http://stackoverflow.com/questions/227897/solve-the-memory-alignment-in-c-interview-question-that-stumped-me
-
-namespace webrtc
-{
-// TODO (hellner) better to create just one memory block and
-// interpret the first sizeof(AlignedMemory) bytes as
-// an AlignedMemory struct.
-struct AlignedMemory
-{
- void* alignedBuffer;
- void* memoryPointer;
-};
-
-void* AlignedMalloc(size_t size, size_t alignment)
-{
- if(alignment == 0)
- {
- // Don't allow alignment 0 since it's undefined.
- return NULL;
- }
- // Make sure that the alignment is an integer power of two or fail.
- if(alignment & (alignment - 1))
- {
- return NULL;
- }
-
- AlignedMemory* returnValue = new AlignedMemory();
- if(returnValue == NULL)
- {
- return NULL;
- }
-
- // The memory is aligned towards the lowest address that so only
- // alignment - 1 bytes needs to be allocated.
- // A pointer to AlignedMemory must be stored so that it can be retreived for
- // deletion, ergo the sizeof(uintptr_t).
- returnValue->memoryPointer = malloc(size + sizeof(uintptr_t) +
- alignment - 1);
- if(returnValue->memoryPointer == NULL)
- {
- delete returnValue;
- return NULL;
- }
-
- // Alligning after the sizeof(header) bytes will leave room for the header
- // in the same memory block.
- uintptr_t alignStartPos = (uintptr_t)returnValue->memoryPointer;
- alignStartPos += sizeof(uintptr_t);
-
- // The buffer should be aligned with 'alignment' bytes. The - 1 guarantees
- // that we align towards the lowest address.
- uintptr_t alignedPos = (alignStartPos + alignment - 1) & ~(alignment - 1);
-
- // alignedPos is the address sought for.
- returnValue->alignedBuffer = (void*)alignedPos;
-
- // Store the address to the AlignedMemory struct in the header so that a
- // it's possible to reclaim all memory.
- uintptr_t headerPos = alignedPos;
- headerPos -= sizeof(uintptr_t);
- void* headerPtr = (void*) headerPos;
- uintptr_t headerValue = (uintptr_t)returnValue;
- memcpy(headerPtr,&headerValue,sizeof(uintptr_t));
-
- return returnValue->alignedBuffer;
-}
-
-void AlignedFree(void* memBlock)
-{
- if(memBlock == NULL)
- {
- return;
- }
- uintptr_t alignedPos = (uintptr_t)memBlock;
- uintptr_t headerPos = alignedPos - sizeof(uintptr_t);
-
- // Read out the address of the AlignedMemory struct from the header.
- uintptr_t* headerPtr = (uintptr_t*)headerPos;
- AlignedMemory* deleteMemory = (AlignedMemory*) *headerPtr;
-
- if(deleteMemory->memoryPointer != NULL)
- {
- free(deleteMemory->memoryPointer);
- }
- delete deleteMemory;
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/atomic32.cc b/src/system_wrappers/source/atomic32.cc
deleted file mode 100644
index 3d6849e..0000000
--- a/src/system_wrappers/source/atomic32.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "atomic32_wrapper.h"
-
-#if defined(_WIN32)
- #include "atomic32_windows.h"
-#elif defined(WEBRTC_LINUX)
- #include "atomic32_linux.h"
-#elif defined(WEBRTC_MAC)
- #include "atomic32_mac.h"
-#else
- #error unsupported os!
-#endif
-
-namespace webrtc {
-Atomic32Wrapper::Atomic32Wrapper(WebRtc_Word32 initialValue)
- : _impl(*new Atomic32Impl(initialValue))
-{
-}
-
-Atomic32Wrapper::~Atomic32Wrapper()
-{
- delete &_impl;
-}
-
-WebRtc_Word32 Atomic32Wrapper::operator++()
-{
- return ++_impl;
-}
-
-WebRtc_Word32 Atomic32Wrapper::operator--()
-{
- return --_impl;
-}
-
-// Read and write to properly aligned variables are atomic operations.
-// Ex reference (for Windows): http://msdn.microsoft.com/en-us/library/ms684122(v=VS.85).aspx
-// TODO (hellner) operator= and Atomic32Wrapper::Value() can be fully
-// implemented here.
-Atomic32Wrapper& Atomic32Wrapper::operator=(const Atomic32Wrapper& rhs)
-{
- if(this == &rhs)
- {
- return *this;
- }
- _impl = rhs._impl;
- return *this;
-}
-
-Atomic32Wrapper& Atomic32Wrapper::operator=(WebRtc_Word32 rhs)
-{
- _impl = rhs;
- return *this;
-}
-
-WebRtc_Word32 Atomic32Wrapper::operator+=(WebRtc_Word32 rhs)
-{
- return _impl += rhs;
-}
-
-WebRtc_Word32 Atomic32Wrapper::operator-=(WebRtc_Word32 rhs)
-{
- return _impl -= rhs;
-}
-
-bool Atomic32Wrapper::CompareExchange(WebRtc_Word32 newValue,
- WebRtc_Word32 compareValue)
-{
- return _impl.CompareExchange(newValue,compareValue);
-}
-
-WebRtc_Word32 Atomic32Wrapper::Value() const
-{
- return _impl.Value();
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/atomic32_linux.h b/src/system_wrappers/source/atomic32_linux.h
deleted file mode 100644
index f9f5650..0000000
--- a/src/system_wrappers/source/atomic32_linux.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-// Atomic system independant 32-bit signed integer.
-// Linux implementation.
-// Note: Requires gcc 4.1.2 or later.
-#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_ATOMIC32_LINUX_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_ATOMIC32_LINUX_H_
-
-#include <inttypes.h>
-#include <malloc.h>
-
-#include "common_types.h"
-
-namespace webrtc {
-class Atomic32Impl
-{
-public:
- inline Atomic32Impl(WebRtc_Word32 initialValue);
- inline ~Atomic32Impl();
-
- inline WebRtc_Word32 operator++();
- inline WebRtc_Word32 operator--();
-
- inline Atomic32Impl& operator=(const Atomic32Impl& rhs);
- inline Atomic32Impl& operator=(WebRtc_Word32 rhs);
- inline WebRtc_Word32 operator+=(WebRtc_Word32 rhs);
- inline WebRtc_Word32 operator-=(WebRtc_Word32 rhs);
-
- inline bool CompareExchange(WebRtc_Word32 newValue,
- WebRtc_Word32 compareValue);
-
- inline WebRtc_Word32 Value() const;
-private:
- void* _ptrMemory;
- // Volatile ensures full memory barriers.
- volatile WebRtc_Word32* _value;
-};
-
-// TODO (hellner) use aligned_malloc instead of doing it manually.
-inline Atomic32Impl::Atomic32Impl(WebRtc_Word32 initialValue)
- : _ptrMemory(NULL),
- _value(NULL)
-{ // Align the memory associated with _value on a 32-bit boundary. This is a
- // requirement for the used Linux APIs to be atomic.
- // Keep _ptrMemory to be able to reclaim memory.
- _ptrMemory = malloc(sizeof(WebRtc_Word32)*2);
- _value = (WebRtc_Word32*) (((uintptr_t)_ptrMemory+3)&(~0x3));
- *_value = initialValue;
-}
-
-inline Atomic32Impl::~Atomic32Impl()
-{
- if(_ptrMemory != NULL)
- {
- free(_ptrMemory);
- }
-}
-
-inline WebRtc_Word32 Atomic32Impl::operator++()
-{
- WebRtc_Word32 returnValue = __sync_fetch_and_add(_value,1);
- returnValue++;
- return returnValue;
-}
-
-inline WebRtc_Word32 Atomic32Impl::operator--()
-{
- WebRtc_Word32 returnValue = __sync_fetch_and_sub(_value,1);
- returnValue--;
- return returnValue;
-}
-
-inline Atomic32Impl& Atomic32Impl::operator=(const Atomic32Impl& rhs)
-{
- *_value = *rhs._value;
- return *this;
-}
-
-inline Atomic32Impl& Atomic32Impl::operator=(WebRtc_Word32 rhs)
-{
- *_value = rhs;
- return *this;
-}
-
-inline WebRtc_Word32 Atomic32Impl::operator+=(WebRtc_Word32 rhs)
-{
- WebRtc_Word32 returnValue = __sync_fetch_and_add(_value,rhs);
- returnValue += rhs;
- return returnValue;
-}
-
-inline WebRtc_Word32 Atomic32Impl::operator-=(WebRtc_Word32 rhs)
-{
- WebRtc_Word32 returnValue = __sync_fetch_and_sub(_value,rhs);
- returnValue -= rhs;
- return returnValue;
-}
-
-inline bool Atomic32Impl::CompareExchange(WebRtc_Word32 newValue,
- WebRtc_Word32 compareValue)
-{
- return __sync_bool_compare_and_swap(_value,compareValue,newValue);
-}
-
-inline WebRtc_Word32 Atomic32Impl::Value() const
-{
- return *_value;
-}
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_ATOMIC32_LINUX_H_
diff --git a/src/system_wrappers/source/atomic32_mac.h b/src/system_wrappers/source/atomic32_mac.h
deleted file mode 100644
index bf8febc..0000000
--- a/src/system_wrappers/source/atomic32_mac.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-// Atomic system independant 32-bit signed integer.
-// Mac implementation.
-#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_ATOMIC32_MAC_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_ATOMIC32_MAC_H_
-
-#include <stdlib.h>
-#include <libkern/OSAtomic.h>
-
-#include "common_types.h"
-
-namespace webrtc {
-class Atomic32Impl
-{
-public:
- inline Atomic32Impl(WebRtc_Word32 initialValue);
- inline ~Atomic32Impl();
-
- inline WebRtc_Word32 operator++();
- inline WebRtc_Word32 operator--();
-
- inline Atomic32Impl& operator=(const Atomic32Impl& rhs);
- inline Atomic32Impl& operator=(WebRtc_Word32 rhs);
- inline WebRtc_Word32 operator+=(WebRtc_Word32 rhs);
- inline WebRtc_Word32 operator-=(WebRtc_Word32 rhs);
-
- inline bool CompareExchange(WebRtc_Word32 newValue,
- WebRtc_Word32 compareValue);
-
- inline WebRtc_Word32 Value() const;
-private:
- void* _ptrMemory;
- // Volatile ensures full memory barriers.
- volatile WebRtc_Word32* _value;
-};
-
-// TODO (hellner) use aligned_malloc instead of doing it manually.
-inline Atomic32Impl::Atomic32Impl(WebRtc_Word32 initialValue)
- :
- _ptrMemory(NULL),
- _value(NULL)
-{ // Align the memory associated with _value on a 32-bit boundary. This is a
- // requirement for the used Mac APIs to be atomic.
- // Keep _ptrMemory to be able to reclaim memory.
- _ptrMemory = malloc(sizeof(WebRtc_Word32)*2);
- _value = (WebRtc_Word32*) (((uintptr_t)_ptrMemory+3)&(~0x3));
- *_value = initialValue;
-}
-
-inline Atomic32Impl::~Atomic32Impl()
-{
- if(_ptrMemory != NULL)
- {
- free(_ptrMemory);
- }
-}
-
-inline WebRtc_Word32 Atomic32Impl::operator++()
-{
- return OSAtomicIncrement32Barrier(
- reinterpret_cast<volatile int32_t*>(_value));
-}
-
-inline WebRtc_Word32 Atomic32Impl::operator--()
-{
- return OSAtomicDecrement32Barrier(
- reinterpret_cast<volatile int32_t*>(_value));
-}
-
-inline Atomic32Impl& Atomic32Impl::operator=(const Atomic32Impl& rhs)
-{
- *_value = *rhs._value;
- return *this;
-}
-
-inline Atomic32Impl& Atomic32Impl::operator=(WebRtc_Word32 rhs)
-{
- *_value = rhs;
- return *this;
-}
-
-inline WebRtc_Word32 Atomic32Impl::operator+=(WebRtc_Word32 rhs)
-{
- return OSAtomicAdd32Barrier(rhs,
- reinterpret_cast<volatile int32_t*>(_value));
-}
-
-inline WebRtc_Word32 Atomic32Impl::operator-=(WebRtc_Word32 rhs)
-{
- return OSAtomicAdd32Barrier(-rhs,
- reinterpret_cast<volatile int32_t*>(_value));
-}
-
-inline bool Atomic32Impl::CompareExchange(WebRtc_Word32 newValue,
- WebRtc_Word32 compareValue)
-{
- return OSAtomicCompareAndSwap32Barrier(
- compareValue,
- newValue,
- reinterpret_cast<volatile int32_t*>(_value));
-}
-
-inline WebRtc_Word32 Atomic32Impl::Value() const
-{
- return *_value;
-}
-} // namespace webrtc
-#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_ATOMIC32_MAC_H_
diff --git a/src/system_wrappers/source/condition_variable.cc b/src/system_wrappers/source/condition_variable.cc
deleted file mode 100644
index 7ca1b56..0000000
--- a/src/system_wrappers/source/condition_variable.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#if defined(_WIN32)
- #include <windows.h>
- #include "condition_variable_wrapper.h"
- #include "condition_variable_windows.h"
-#elif defined(WEBRTC_LINUX)
- #include <pthread.h>
- #include "condition_variable_wrapper.h"
- #include "condition_variable_linux.h"
-#elif defined(WEBRTC_MAC) || defined(WEBRTC_MAC_INTEL)
- #include <pthread.h>
- #include "condition_variable_wrapper.h"
- #include "condition_variable_linux.h"
- #endif
-
-namespace webrtc {
-ConditionVariableWrapper*
-ConditionVariableWrapper::CreateConditionVariable()
-{
-#if defined(_WIN32)
- return new ConditionVariableWindows;
-#elif defined(WEBRTC_LINUX) || defined(WEBRTC_MAC) || defined(WEBRTC_MAC_INTEL)
- return ConditionVariableLinux::Create();
-#else
- return NULL;
-#endif
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/condition_variable_linux.cc b/src/system_wrappers/source/condition_variable_linux.cc
deleted file mode 100644
index 778c2cf..0000000
--- a/src/system_wrappers/source/condition_variable_linux.cc
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "condition_variable_linux.h"
-
-#if defined(WEBRTC_LINUX)
-#include <ctime>
-#else
-#include <sys/time.h>
-#endif
-
-#include <errno.h>
-
-#include "critical_section_linux.h"
-
-namespace webrtc {
-ConditionVariableWrapper* ConditionVariableLinux::Create()
-{
- ConditionVariableLinux* ptr = new ConditionVariableLinux;
- if (!ptr)
- {
- return NULL;
- }
-
- const int error = ptr->Construct();
- if (error)
- {
- delete ptr;
- return NULL;
- }
-
- return ptr;
-}
-
-ConditionVariableLinux::ConditionVariableLinux()
-{
-}
-
-int ConditionVariableLinux::Construct()
-{
- int result = 0;
-#ifdef WEBRTC_CLOCK_TYPE_REALTIME
- result = pthread_cond_init(&_cond, NULL);
-#else
- pthread_condattr_t condAttr;
- result = pthread_condattr_init(&condAttr);
- if (result != 0)
- {
- return -1;
- }
- result = pthread_condattr_setclock(&condAttr, CLOCK_MONOTONIC);
- if (result != 0)
- {
- return -1;
- }
- result = pthread_cond_init(&_cond, &condAttr);
- if (result != 0)
- {
- return -1;
- }
- result = pthread_condattr_destroy(&condAttr);
- if (result != 0)
- {
- return -1;
- }
-#endif
- return 0;
-}
-
-ConditionVariableLinux::~ConditionVariableLinux()
-{
- pthread_cond_destroy(&_cond);
-}
-
-void ConditionVariableLinux::SleepCS(CriticalSectionWrapper& critSect)
-{
- CriticalSectionLinux* cs = reinterpret_cast<CriticalSectionLinux*>(
- &critSect);
- pthread_cond_wait(&_cond, &cs->_mutex);
-}
-
-
-bool
-ConditionVariableLinux::SleepCS(
- CriticalSectionWrapper& critSect,
- unsigned long maxTimeInMS)
-{
- const unsigned long INFINITE = 0xFFFFFFFF;
-
- const int MILLISECONDS_PER_SECOND = 1000;
-#ifndef WEBRTC_LINUX
- const int MICROSECONDS_PER_MILLISECOND = 1000;
-#endif
- const int NANOSECONDS_PER_SECOND = 1000000000;
- const int NANOSECONDS_PER_MILLISECOND = 1000000;
-
- CriticalSectionLinux* cs = reinterpret_cast<CriticalSectionLinux*>(
- &critSect);
-
- if (maxTimeInMS != INFINITE)
- {
- timespec ts;
-#ifndef WEBRTC_MAC
-#ifdef WEBRTC_CLOCK_TYPE_REALTIME
- clock_gettime(CLOCK_REALTIME, &ts);
-#else
- clock_gettime(CLOCK_MONOTONIC, &ts);
-#endif
-#else
- struct timeval tv;
- gettimeofday(&tv, 0);
- ts.tv_sec = tv.tv_sec;
- ts.tv_nsec = tv.tv_usec * MICROSECONDS_PER_MILLISECOND;
-#endif
-
- ts.tv_sec += maxTimeInMS / MILLISECONDS_PER_SECOND;
- ts.tv_nsec += (maxTimeInMS - ((maxTimeInMS / MILLISECONDS_PER_SECOND)*
- MILLISECONDS_PER_SECOND)) * NANOSECONDS_PER_MILLISECOND;
-
- if (ts.tv_nsec >= NANOSECONDS_PER_SECOND)
- {
- ts.tv_sec += ts.tv_nsec / NANOSECONDS_PER_SECOND;
- ts.tv_nsec %= NANOSECONDS_PER_SECOND;
- }
- const int res = pthread_cond_timedwait(&_cond, &cs->_mutex, &ts);
- return (res == ETIMEDOUT) ? false : true;
- }
- else
- {
- pthread_cond_wait(&_cond, &cs->_mutex);
- return true;
- }
-}
-
-void ConditionVariableLinux::Wake()
-{
- pthread_cond_signal(&_cond);
-}
-
-void ConditionVariableLinux::WakeAll()
-{
- pthread_cond_broadcast(&_cond);
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/condition_variable_linux.h b/src/system_wrappers/source/condition_variable_linux.h
deleted file mode 100644
index 0300c5b..0000000
--- a/src/system_wrappers/source/condition_variable_linux.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_CONDITION_VARIABLE_LINUX_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_CONDITION_VARIABLE_LINUX_H_
-
-#include "condition_variable_wrapper.h"
-
-#include <pthread.h>
-
-namespace webrtc {
-class ConditionVariableLinux : public ConditionVariableWrapper
-{
-public:
- static ConditionVariableWrapper* Create();
- ~ConditionVariableLinux();
-
- void SleepCS(CriticalSectionWrapper& critSect);
- bool SleepCS(CriticalSectionWrapper& critSect, unsigned long maxTimeInMS);
- void Wake();
- void WakeAll();
-
-private:
- ConditionVariableLinux();
- int Construct();
-
-private:
- pthread_cond_t _cond;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_CONDITION_VARIABLE_LINUX_H_
diff --git a/src/system_wrappers/source/cpu.cc b/src/system_wrappers/source/cpu.cc
deleted file mode 100644
index 2285872..0000000
--- a/src/system_wrappers/source/cpu.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "cpu_wrapper.h"
-
-#if defined(_WIN32)
- #include <Windows.h>
- #include "engine_configurations.h"
- #include "cpu_windows.h"
-#elif defined(WEBRTC_MAC)
- #include <sys/types.h>
- #include <sys/sysctl.h>
- #include "cpu_mac.h"
-#elif defined(WEBRTC_MAC_INTEL)
- #include "cpu_mac.h"
-#elif defined(ANDROID)
- // Not implemented yet, might be possible to use Linux implementation
-#else // defined(WEBRTC_LINUX)
- #include <sys/sysinfo.h>
- #include "cpu_linux.h"
-#endif
-
-#include "trace.h"
-
-namespace webrtc {
-WebRtc_UWord32 CpuWrapper::_numberOfCores = 0;
-
-WebRtc_UWord32 CpuWrapper::DetectNumberOfCores()
-{
- if (!_numberOfCores)
- {
-#if defined(_WIN32)
- SYSTEM_INFO si;
- GetSystemInfo(&si);
- _numberOfCores = static_cast<WebRtc_UWord32>(si.dwNumberOfProcessors);
- WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1,
- "Available number of cores:%d", _numberOfCores);
-
-#elif defined(WEBRTC_LINUX) && !defined(ANDROID)
- _numberOfCores = get_nprocs();
- WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1,
- "Available number of cores:%d", _numberOfCores);
-
-#elif (defined(WEBRTC_MAC) || defined(WEBRTC_MAC_INTEL))
- int name[] = {CTL_HW, HW_AVAILCPU};
- int ncpu;
- size_t size = sizeof(ncpu);
- if(0 == sysctl(name, 2, &ncpu, &size, NULL, 0))
- {
- _numberOfCores = static_cast<WebRtc_UWord32>(ncpu);
- WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1,
- "Available number of cores:%d", _numberOfCores);
- } else
- {
- WEBRTC_TRACE(kTraceError, kTraceUtility, -1,
- "Failed to get number of cores");
- _numberOfCores = 1;
- }
-#else
- WEBRTC_TRACE(kTraceWarning, kTraceUtility, -1,
- "No function to get number of cores");
- _numberOfCores = 1;
-#endif
- }
- return _numberOfCores;
-}
-
-CpuWrapper* CpuWrapper::CreateCpu()
-{
-#if defined(_WIN32)
- return new CpuWindows();
-#elif (defined(WEBRTC_MAC) || defined(WEBRTC_MAC_INTEL))
- return new CpuWrapperMac();
-#elif defined(ANDROID)
- return 0;
-#else
- return new CpuLinux();
-#endif
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/cpu_features.cc b/src/system_wrappers/source/cpu_features.cc
deleted file mode 100644
index 850dc9b..0000000
--- a/src/system_wrappers/source/cpu_features.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "cpu_features_wrapper.h"
-
-// No CPU feature is available => straight C path.
-int GetCPUInfoNoASM(CPUFeature feature) {
- (void)feature;
- return 0;
-}
-
-// Intrinsic for "cpuid".
-#if defined(__pic__) && defined(__i386__)
-static inline void cpuid(int cpu_info[4], int info_type) {
- __asm__ volatile (
- "mov %%ebx, %%edi\n"
- "cpuid\n"
- "xchg %%edi, %%ebx\n"
- : "=a"(cpu_info[0]), "=D"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3])
- : "a"(info_type));
-}
-#elif defined(__i386__) || defined(__x86_64__)
-static inline void cpuid(int cpu_info[4], int info_type) {
- __asm__ volatile (
- "cpuid\n"
- : "=a"(cpu_info[0]), "=b"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3])
- : "a"(info_type));
-}
-#endif
-
-#if defined(__i386__) || defined(__x86_64__)
-// Actual feature detection for x86.
-static int GetCPUInfo(CPUFeature feature) {
- int cpu_info[4];
- cpuid(cpu_info, 1);
- if (feature == kSSE2) {
- return 0 != (cpu_info[3] & 0x04000000);
- }
- if (feature == kSSE3) {
- return 0 != (cpu_info[2] & 0x00000001);
- }
- return 0;
-}
-#else
-// Default to straight C for other platforms.
-static int GetCPUInfo(CPUFeature feature) {
- (void)feature;
- return 0;
-}
-#endif
-
-WebRtc_CPUInfo WebRtc_GetCPUInfo = GetCPUInfo;
-WebRtc_CPUInfo WebRtc_GetCPUInfoNoASM = GetCPUInfoNoASM;
diff --git a/src/system_wrappers/source/cpu_linux.cc b/src/system_wrappers/source/cpu_linux.cc
deleted file mode 100644
index eff9704..0000000
--- a/src/system_wrappers/source/cpu_linux.cc
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "cpu_linux.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-namespace webrtc {
-CpuLinux::CpuLinux()
-{
- m_oldBusyTime = 0;
- m_oldIdleTime = 0;
- m_numCores = 0;
- m_numCores = GetNumCores();
- m_oldBusyTimeMulti = new long long[m_numCores];
- memset(m_oldBusyTimeMulti, 0, sizeof(long long) * m_numCores);
- m_oldIdleTimeMulti = new long long[m_numCores];
- memset(m_oldIdleTimeMulti, 0, sizeof(long long) * m_numCores);
- m_idleArray = new long long[m_numCores];
- memset(m_idleArray, 0, sizeof(long long) * m_numCores);
- m_busyArray = new long long[m_numCores];
- memset(m_busyArray, 0, sizeof(long long) * m_numCores);
- m_resultArray = new WebRtc_UWord32[m_numCores];
-
- GetData(m_oldBusyTime, m_oldIdleTime, m_busyArray, m_idleArray);
-}
-
-CpuLinux::~CpuLinux()
-{
- delete [] m_oldBusyTimeMulti;
- delete [] m_oldIdleTimeMulti;
- delete [] m_idleArray;
- delete [] m_busyArray;
- delete [] m_resultArray;
-}
-
-WebRtc_Word32 CpuLinux::CpuUsage()
-{
- WebRtc_UWord32 dummy = 0;
- WebRtc_UWord32* dummyArray = NULL;
- return CpuUsageMultiCore(dummy, dummyArray);
-}
-
-WebRtc_Word32 CpuLinux::CpuUsageMultiCore(WebRtc_UWord32& numCores,
- WebRtc_UWord32*& coreArray)
-{
- coreArray = m_resultArray;
- numCores = m_numCores;
- long long busy = 0;
- long long idle = 0;
- GetData(busy, idle, m_busyArray, m_idleArray);
-
- long long deltaBusy = busy - m_oldBusyTime;
- long long deltaIdle = idle - m_oldIdleTime;
- m_oldBusyTime = busy;
- m_oldIdleTime = idle;
-
- int retVal = -1;
- if (deltaBusy + deltaIdle == 0)
- {
- retVal = 0;
- }
- else
- {
- retVal = (int)(100 * (deltaBusy) / (deltaBusy + deltaIdle));
- }
-
- if (coreArray == NULL)
- {
- return retVal;
- }
-
- for (WebRtc_UWord32 i = 0; i < m_numCores; i++)
- {
- deltaBusy = m_busyArray[i] - m_oldBusyTimeMulti[i];
- deltaIdle = m_idleArray[i] - m_oldIdleTimeMulti[i];
- m_oldBusyTimeMulti[i] = m_busyArray[i];
- m_oldIdleTimeMulti[i] = m_idleArray[i];
- if(deltaBusy + deltaIdle == 0)
- {
- coreArray[i] = 0;
- }
- else
- {
- coreArray[i] = (int)(100 * (deltaBusy) / (deltaBusy+deltaIdle));
- }
- }
- return retVal;
-}
-
-
-int CpuLinux::GetData(long long& busy, long long& idle, long long*& busyArray,
- long long*& idleArray)
-{
- FILE* fp = fopen("/proc/stat", "r");
- if (!fp)
- {
- return -1;
- }
-
- char line[100];
- char* dummy = fgets(line, 100, fp);
- char firstWord[100];
- sscanf(line, "%s ", firstWord);
- if(strncmp(firstWord, "cpu", 3)!=0)
- {
- return -1;
- }
- char sUser[100];
- char sNice[100];
- char sSystem[100];
- char sIdle[100];
- sscanf(line, "%s %s %s %s %s ", firstWord, sUser, sNice, sSystem, sIdle);
- long long luser = atoll(sUser);
- long long lnice = atoll(sNice);
- long long lsystem = atoll(sSystem);
- long long lidle = atoll (sIdle);
-
- busy = luser + lnice + lsystem;
- idle = lidle;
- for (WebRtc_UWord32 i = 0; i < m_numCores; i++)
- {
- dummy = fgets(line, 100, fp);
- sscanf(line, "%s %s %s %s %s ", firstWord, sUser, sNice, sSystem,
- sIdle);
- luser = atoll(sUser);
- lnice = atoll(sNice);
- lsystem = atoll(sSystem);
- lidle = atoll (sIdle);
- busyArray[i] = luser + lnice + lsystem;
- idleArray[i] = lidle;
- }
- fclose(fp);
- return 0;
-}
-
-int CpuLinux::GetNumCores()
-{
- FILE* fp = fopen("/proc/stat", "r");
- if (!fp)
- {
- return -1;
- }
- // Skip first line
- char line[100];
- char* dummy = fgets(line, 100, fp);
- int numCores = -1;
- char firstWord[100];
- do
- {
- numCores++;
- if (fgets(line, 100, fp))
- {
- sscanf(line, "%s ", firstWord);
- } else {
- break;
- }
- } while (strncmp(firstWord, "cpu", 3) == 0);
- fclose(fp);
- return numCores;
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/cpu_linux.h b/src/system_wrappers/source/cpu_linux.h
deleted file mode 100644
index 9b22e83..0000000
--- a/src/system_wrappers/source/cpu_linux.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_CPU_LINUX_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_CPU_LINUX_H_
-
-#include "cpu_wrapper.h"
-
-namespace webrtc {
-class CpuLinux : public CpuWrapper
-{
-public:
- CpuLinux();
- virtual ~CpuLinux();
-
- virtual WebRtc_Word32 CpuUsage();
- virtual WebRtc_Word32 CpuUsage(WebRtc_Word8* /*pProcessName*/,
- WebRtc_UWord32 /*length*/) {return 0;}
- virtual WebRtc_Word32 CpuUsage(WebRtc_UWord32 /*dwProcessID*/) {return 0;}
-
- virtual WebRtc_Word32 CpuUsageMultiCore(WebRtc_UWord32& numCores,
- WebRtc_UWord32*& array);
-
- virtual void Reset() {return;}
- virtual void Stop() {return;}
-private:
- int GetData(long long& busy, long long& idle, long long*& busyArray,
- long long*& idleArray);
- int GetNumCores();
-
- long long m_oldBusyTime;
- long long m_oldIdleTime;
-
- long long* m_oldBusyTimeMulti;
- long long* m_oldIdleTimeMulti;
-
- long long* m_idleArray;
- long long* m_busyArray;
- WebRtc_UWord32* m_resultArray;
- WebRtc_UWord32 m_numCores;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_CPU_LINUX_H_
diff --git a/src/system_wrappers/source/cpu_mac.cc b/src/system_wrappers/source/cpu_mac.cc
deleted file mode 100644
index c2a11e1..0000000
--- a/src/system_wrappers/source/cpu_mac.cc
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "cpu_mac.h"
-
-#include <iostream>
-#include <mach/mach.h>
-#include <mach/mach_error.h>
-
-#include "tick_util.h"
-
-namespace webrtc {
-CpuWrapperMac::CpuWrapperMac() : _cpuUsage(NULL)
-{
- natural_t cpuCount;
- processor_info_array_t infoArray;
- mach_msg_type_number_t infoCount;
-
- kern_return_t error = host_processor_info(mach_host_self(),
- PROCESSOR_CPU_LOAD_INFO,
- &cpuCount,
- &infoArray,
- &infoCount);
- if (error)
- {
- return;
- }
-
- _cpuUsage = new WebRtc_UWord32[cpuCount];
- _lastTickCount = new WebRtc_Word64[cpuCount];
- _lastTime = TickTime::MillisecondTimestamp();
-
- processor_cpu_load_info_data_t* cpuLoadInfo =
- (processor_cpu_load_info_data_t*) infoArray;
- for (unsigned int cpu= 0; cpu < cpuCount; cpu++)
- {
- WebRtc_Word64 ticks = 0;
- for (int state = 0; state < 2; state++)
- {
- ticks += cpuLoadInfo[cpu].cpu_ticks[state];
- }
- _lastTickCount[cpu] = ticks;
- }
- vm_deallocate(mach_task_self(), (vm_address_t)infoArray, infoCount);
-}
-
-CpuWrapperMac::~CpuWrapperMac()
-{
- delete _cpuUsage;
- delete _lastTickCount;
-}
-
-WebRtc_Word32 CpuWrapperMac::CpuUsage()
-{
- WebRtc_UWord32 numCores;
- WebRtc_UWord32* array = NULL;
- return CpuUsageMultiCore(numCores, array);
-}
-
-WebRtc_Word32
-CpuWrapperMac::CpuUsageMultiCore(WebRtc_UWord32& numCores,
- WebRtc_UWord32*& array)
-{
- natural_t cpuCount;
- processor_info_array_t infoArray;
- mach_msg_type_number_t infoCount;
-
- // sanity check
- if(_cpuUsage == NULL)
- {
- return -1;
- }
- WebRtc_Word64 now = TickTime::MillisecondTimestamp();
- WebRtc_Word64 timeDiffMS = now - _lastTime;
- // TODO(hellner) why block here? Why not just return the old
- // value? Is this behavior consistent across all
- // platforms?
- // Make sure that at least 500 ms pass between calls.
- if(timeDiffMS < 500)
- {
- usleep((500-timeDiffMS)*1000);
- return CpuUsageMultiCore(numCores, array);
- }
- _lastTime = now;
-
- kern_return_t error = host_processor_info(mach_host_self(),
- PROCESSOR_CPU_LOAD_INFO,
- &cpuCount,
- &infoArray,
- &infoCount);
- if (error)
- {
- return -1;
- }
-
- processor_cpu_load_info_data_t* cpuLoadInfo =
- (processor_cpu_load_info_data_t*) infoArray;
-
- WebRtc_Word32 totalCpuUsage = 0;
- for (unsigned int cpu = 0; cpu < cpuCount; cpu++)
- {
- WebRtc_Word64 ticks = 0;
- for (int state = 0; state < 2; state++)
- {
- ticks += cpuLoadInfo[cpu].cpu_ticks[state];
- }
- if(timeDiffMS <= 0)
- {
- _cpuUsage[cpu] = 0;
- }else {
- _cpuUsage[cpu] = (WebRtc_UWord32)((1000 *
- (ticks - _lastTickCount[cpu])) /
- timeDiffMS);
- }
- _lastTickCount[cpu] = ticks;
- totalCpuUsage += _cpuUsage[cpu];
- }
-
- vm_deallocate(mach_task_self(), (vm_address_t)infoArray, infoCount);
-
- numCores = cpuCount;
- array = _cpuUsage;
- return totalCpuUsage/cpuCount;
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/cpu_mac.h b/src/system_wrappers/source/cpu_mac.h
deleted file mode 100644
index 04cd097..0000000
--- a/src/system_wrappers/source/cpu_mac.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_CPU_MAC_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_CPU_MAC_H_
-
-#include "cpu_wrapper.h"
-
-namespace webrtc {
-class CpuWrapperMac : public CpuWrapper
-{
-public:
- CpuWrapperMac();
- virtual ~CpuWrapperMac();
-
- virtual WebRtc_Word32 CpuUsage();
- virtual WebRtc_Word32 CpuUsage(WebRtc_Word8* /*pProcessName*/,
- WebRtc_UWord32 /*length*/) {return -1;}
- virtual WebRtc_Word32 CpuUsage(WebRtc_UWord32 /*dwProcessID*/) {return -1;}
-
- // Note: this class will block the call and sleep if called too fast
- // This function blocks the calling thread if the thread is calling it more
- // often than every 500 ms.
- virtual WebRtc_Word32 CpuUsageMultiCore(WebRtc_UWord32& numCores,
- WebRtc_UWord32*& array);
-
- virtual void Reset() {}
- virtual void Stop() {}
-
-private:
- WebRtc_UWord32* _cpuUsage;
- WebRtc_Word64* _lastTickCount;
- WebRtc_Word64 _lastTime;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_CPU_MAC_H_
diff --git a/src/system_wrappers/source/critical_section.cc b/src/system_wrappers/source/critical_section.cc
deleted file mode 100644
index 213c352..0000000
--- a/src/system_wrappers/source/critical_section.cc
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#if defined(_WIN32)
- #include <windows.h>
- #include "critical_section_windows.h"
-#else
- #include "critical_section_linux.h"
-#endif
-
-namespace webrtc {
-CriticalSectionWrapper* CriticalSectionWrapper::CreateCriticalSection()
-{
-#ifdef _WIN32
- return new CriticalSectionWindows();
-#else
- return new CriticalSectionLinux();
-#endif
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/critical_section_linux.cc b/src/system_wrappers/source/critical_section_linux.cc
deleted file mode 100644
index 35e81ae..0000000
--- a/src/system_wrappers/source/critical_section_linux.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "critical_section_linux.h"
-
-namespace webrtc {
-CriticalSectionLinux::CriticalSectionLinux()
-{
- pthread_mutexattr_t attr;
- pthread_mutexattr_init(&attr);
- pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
- pthread_mutex_init(&_mutex, &attr);
-}
-
-CriticalSectionLinux::~CriticalSectionLinux()
-{
- pthread_mutex_destroy(&_mutex);
-}
-
-void
-CriticalSectionLinux::Enter()
-{
- pthread_mutex_lock(&_mutex);
-}
-
-void
-CriticalSectionLinux::Leave()
-{
- pthread_mutex_unlock(&_mutex);
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/critical_section_linux.h b/src/system_wrappers/source/critical_section_linux.h
deleted file mode 100644
index 5ada1cb..0000000
--- a/src/system_wrappers/source/critical_section_linux.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_CRITICAL_SECTION_LINUX_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_CRITICAL_SECTION_LINUX_H_
-
-#include "critical_section_wrapper.h"
-
-#include <pthread.h>
-
-namespace webrtc {
-class CriticalSectionLinux : public CriticalSectionWrapper
-{
-public:
- CriticalSectionLinux();
-
- virtual ~CriticalSectionLinux();
-
- virtual void Enter();
- virtual void Leave();
-
-private:
- pthread_mutex_t _mutex;
- friend class ConditionVariableLinux;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_CRITICAL_SECTION_LINUX_H_
diff --git a/src/system_wrappers/source/event.cc b/src/system_wrappers/source/event.cc
deleted file mode 100644
index 384b961..0000000
--- a/src/system_wrappers/source/event.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "event_wrapper.h"
-
-#if defined(_WIN32)
- #include <windows.h>
- #include "event_windows.h"
-#else
- #include <pthread.h>
- #include "event_linux.h"
-#endif
-
-namespace webrtc {
-EventWrapper* EventWrapper::Create()
-{
-#if defined(_WIN32)
- return new EventWindows();
-#else
- return EventLinux::Create();
-#endif
-}
-
-int EventWrapper::KeyPressed()
-{
-#if defined(_WIN32)
- int keyDown = 0;
- for(int key = 0x20; key < 0x90; key++)
- {
- short res = GetAsyncKeyState(key);
- keyDown |= res%2; // Get the LSB
- }
- if(keyDown)
- {
- return 1;
- }
- else
- {
- return 0;
- }
-#else
- return -1;
-#endif
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/event_linux.cc b/src/system_wrappers/source/event_linux.cc
deleted file mode 100644
index dddd31c..0000000
--- a/src/system_wrappers/source/event_linux.cc
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "event_linux.h"
-
-#include <errno.h>
-#include <pthread.h>
-#include <signal.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/time.h>
-#include <unistd.h>
-
-namespace webrtc {
-const long int E6 = 1000000;
-const long int E9 = 1000 * E6;
-
-EventWrapper* EventLinux::Create()
-{
- EventLinux* ptr = new EventLinux;
- if (!ptr)
- {
- return NULL;
- }
-
- const int error = ptr->Construct();
- if (error)
- {
- delete ptr;
- return NULL;
- }
- return ptr;
-}
-
-
-EventLinux::EventLinux()
- : _timerThread(0),
- _timerEvent(0),
- _periodic(false),
- _time(0),
- _count(0),
- _state(kDown)
-{
-}
-
-int EventLinux::Construct()
-{
- // Set start time to zero
- memset(&_tCreate, 0, sizeof(_tCreate));
-
- int result = pthread_mutex_init(&mutex, 0);
- if (result != 0)
- {
- return -1;
- }
-#ifdef WEBRTC_CLOCK_TYPE_REALTIME
- result = pthread_cond_init(&cond, 0);
- if (result != 0)
- {
- return -1;
- }
-#else
- pthread_condattr_t condAttr;
- result = pthread_condattr_init(&condAttr);
- if (result != 0)
- {
- return -1;
- }
- result = pthread_condattr_setclock(&condAttr, CLOCK_MONOTONIC);
- if (result != 0)
- {
- return -1;
- }
- result = pthread_cond_init(&cond, &condAttr);
- if (result != 0)
- {
- return -1;
- }
- result = pthread_condattr_destroy(&condAttr);
- if (result != 0)
- {
- return -1;
- }
-#endif
- return 0;
-}
-
-EventLinux::~EventLinux()
-{
- StopTimer();
- pthread_cond_destroy(&cond);
- pthread_mutex_destroy(&mutex);
-}
-
-bool EventLinux::Reset()
-{
- if (0 != pthread_mutex_lock(&mutex))
- {
- return false;
- }
- _state = kDown;
- pthread_mutex_unlock(&mutex);
- return true;
-}
-
-bool EventLinux::Set()
-{
- if (0 != pthread_mutex_lock(&mutex))
- {
- return false;
- }
- _state = kUp;
- // Release all waiting threads
- pthread_cond_broadcast(&cond);
- pthread_mutex_unlock(&mutex);
- return true;
-}
-
-EventTypeWrapper EventLinux::Wait(unsigned long timeout)
-{
- int retVal = 0;
- if (0 != pthread_mutex_lock(&mutex))
- {
- return kEventError;
- }
-
- if (kDown == _state)
- {
- if (WEBRTC_EVENT_INFINITE != timeout)
- {
- timespec tEnd;
-#ifndef WEBRTC_MAC
-#ifdef WEBRTC_CLOCK_TYPE_REALTIME
- clock_gettime(CLOCK_REALTIME, &tEnd);
-#else
- clock_gettime(CLOCK_MONOTONIC, &tEnd);
-#endif
-#else
- timeval tVal;
- struct timezone tZone;
- tZone.tz_minuteswest = 0;
- tZone.tz_dsttime = 0;
- gettimeofday(&tVal,&tZone);
- TIMEVAL_TO_TIMESPEC(&tVal,&tEnd);
-#endif
- tEnd.tv_sec += timeout / 1000;
- tEnd.tv_nsec += (timeout - (timeout / 1000) * 1000) * E6;
-
- if (tEnd.tv_nsec >= E9)
- {
- tEnd.tv_sec++;
- tEnd.tv_nsec -= E9;
- }
- retVal = pthread_cond_timedwait(&cond, &mutex, &tEnd);
- } else {
- retVal = pthread_cond_wait(&cond, &mutex);
- }
- }
-
- _state = kDown;
- pthread_mutex_unlock(&mutex);
-
- switch(retVal)
- {
- case 0:
- return kEventSignaled;
- case ETIMEDOUT:
- return kEventTimeout;
- default:
- return kEventError;
- }
-}
-
-EventTypeWrapper EventLinux::Wait(timespec& tPulse)
-{
- int retVal = 0;
- if (0 != pthread_mutex_lock(&mutex))
- {
- return kEventError;
- }
-
- if (kUp != _state)
- {
- retVal = pthread_cond_timedwait(&cond, &mutex, &tPulse);
- }
- _state = kDown;
-
- pthread_mutex_unlock(&mutex);
-
- switch(retVal)
- {
- case 0:
- return kEventSignaled;
- case ETIMEDOUT:
- return kEventTimeout;
- default:
- return kEventError;
- }
-}
-
-bool EventLinux::StartTimer(bool periodic, unsigned long time)
-{
- if (_timerThread)
- {
- if(_periodic)
- {
- // Timer already started.
- return false;
- } else {
- // New one shot timer
- _time = time;
- _tCreate.tv_sec = 0;
- _timerEvent->Set();
- return true;
- }
- }
-
- // Start the timer thread
- _timerEvent = static_cast<EventLinux*>(EventWrapper::Create());
- const char* threadName = "WebRtc_event_timer_thread";
- _timerThread = ThreadWrapper::CreateThread(Run, this, kRealtimePriority,
- threadName);
- _periodic = periodic;
- _time = time;
- unsigned int id = 0;
- if (_timerThread->Start(id))
- {
- return true;
- }
- return false;
-}
-
-bool EventLinux::Run(ThreadObj obj)
-{
- return static_cast<EventLinux*>(obj)->Process();
-}
-
-bool EventLinux::Process()
-{
- if (_tCreate.tv_sec == 0)
- {
-#ifndef WEBRTC_MAC
-#ifdef WEBRTC_CLOCK_TYPE_REALTIME
- clock_gettime(CLOCK_REALTIME, &_tCreate);
-#else
- clock_gettime(CLOCK_MONOTONIC, &_tCreate);
-#endif
-#else
- timeval tVal;
- struct timezone tZone;
- tZone.tz_minuteswest = 0;
- tZone.tz_dsttime = 0;
- gettimeofday(&tVal,&tZone);
- TIMEVAL_TO_TIMESPEC(&tVal,&_tCreate);
-#endif
- _count=0;
- }
-
- timespec tEnd;
- unsigned long long time = _time * ++_count;
- tEnd.tv_sec = _tCreate.tv_sec + time/1000;
- tEnd.tv_nsec = _tCreate.tv_nsec + (time - (time/1000)*1000)*E6;
-
- if ( tEnd.tv_nsec >= E9 )
- {
- tEnd.tv_sec++;
- tEnd.tv_nsec -= E9;
- }
-
- switch(_timerEvent->Wait(tEnd))
- {
- case kEventSignaled:
- return true;
- case kEventError:
- return false;
- case kEventTimeout:
- break;
- }
- if(_periodic || _count==1)
- {
- Set();
- }
- return true;
-}
-
-bool EventLinux::StopTimer()
-{
- if(_timerThread)
- {
- _timerThread->SetNotAlive();
- }
- if (_timerEvent)
- {
- _timerEvent->Set();
- }
- if (_timerThread)
- {
- if(!_timerThread->Stop())
- {
- return false;
- }
-
- delete _timerThread;
- _timerThread = 0;
- }
- if (_timerEvent)
- {
- delete _timerEvent;
- _timerEvent = 0;
- }
-
- // Set time to zero to force new reference time for the timer.
- memset(&_tCreate, 0, sizeof(_tCreate));
- _count=0;
- return true;
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/event_linux.h b/src/system_wrappers/source/event_linux.h
deleted file mode 100644
index 17d193f..0000000
--- a/src/system_wrappers/source/event_linux.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_EVENT_LINUX_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_EVENT_LINUX_H_
-
-#include "event_wrapper.h"
-
-#include <pthread.h>
-#include <time.h>
-
-#include "thread_wrapper.h"
-
-namespace webrtc {
-enum State
-{
- kUp = 1,
- kDown = 2
-};
-
-class EventLinux : public EventWrapper
-{
-public:
- static EventWrapper* Create();
-
- virtual ~EventLinux();
-
- virtual EventTypeWrapper Wait(unsigned long maxTime);
- virtual bool Set();
- virtual bool Reset();
-
- virtual bool StartTimer(bool periodic, unsigned long time);
- virtual bool StopTimer();
-
-private:
- EventLinux();
- int Construct();
-
- static bool Run(ThreadObj obj);
- bool Process();
- EventTypeWrapper Wait(timespec& tPulse);
-
-
-private:
- pthread_cond_t cond;
- pthread_mutex_t mutex;
-
- ThreadWrapper* _timerThread;
- EventLinux* _timerEvent;
- timespec _tCreate;
-
- bool _periodic;
- unsigned long _time; // In ms
- unsigned long _count;
- State _state;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_EVENT_LINUX_H_
diff --git a/src/system_wrappers/source/file_impl.cc b/src/system_wrappers/source/file_impl.cc
deleted file mode 100644
index 6046c2c..0000000
--- a/src/system_wrappers/source/file_impl.cc
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "file_impl.h"
-
-#include <cassert>
-
-#ifdef _WIN32
- #include <Windows.h>
-#else
- #include <stdarg.h>
- #include <string.h>
-#endif
-
-namespace webrtc {
-FileWrapper* FileWrapper::Create()
-{
- return new FileWrapperImpl();
-}
-
-FileWrapperImpl::FileWrapperImpl()
- : _id(NULL),
- _open(false),
- _looping(false),
- _readOnly(false),
- _text(false),
- _maxSizeInBytes(-1),
- _sizeInBytes(0)
-{
- memset(_fileNameUTF8, 0, kMaxFileNameSize);
-}
-
-FileWrapperImpl::~FileWrapperImpl()
-{
- if (_id != NULL)
- {
- fclose(_id);
- }
-}
-
-WebRtc_Word32 FileWrapperImpl::CloseFile()
-{
- if (_id != NULL)
- {
- fclose(_id);
- _id = NULL;
- }
- memset(_fileNameUTF8, 0, kMaxFileNameSize);
- _open = false;
- return 0;
-}
-
-int FileWrapperImpl::Rewind()
-{
- if(_looping || !_readOnly)
- {
- if (_id != NULL)
- {
- _sizeInBytes = 0;
- return fseek(_id, 0, SEEK_SET);
- }
- }
- return -1;
-}
-
-WebRtc_Word32 FileWrapperImpl::SetMaxFileSize(WebRtc_Word32 bytes)
-{
- _maxSizeInBytes = bytes;
- return 0;
-}
-
-WebRtc_Word32 FileWrapperImpl::Flush()
-{
- if (_id != NULL)
- {
- return fflush(_id);
- }
- return -1;
-}
-
-WebRtc_Word32 FileWrapperImpl::FileName(WebRtc_Word8* fileNameUTF8,
- WebRtc_UWord32 size) const
-{
- WebRtc_Word32 len = static_cast<WebRtc_Word32>(strlen(_fileNameUTF8));
- if(len > kMaxFileNameSize)
- {
- assert(false);
- return -1;
- }
- if(len < 1)
- {
- return -1;
- }
- // Make sure to NULL terminate
- if(size < (WebRtc_UWord32)len)
- {
- len = size - 1;
- }
- memcpy(fileNameUTF8, _fileNameUTF8, len);
- fileNameUTF8[len] = 0;
- return 0;
-}
-
-bool
-FileWrapperImpl::Open() const
-{
- return _open;
-}
-
-WebRtc_Word32 FileWrapperImpl::OpenFile(const WebRtc_Word8 *fileNameUTF8,
- const bool readOnly, const bool loop,
- const bool text)
-{
- WebRtc_Word32 length = (WebRtc_Word32)strlen(fileNameUTF8);
- if (length > kMaxFileNameSize)
- {
- return -1;
- }
-
- _readOnly = readOnly;
-
- FILE *tmpId = NULL;
-#if defined _WIN32
- wchar_t wideFileName[kMaxFileNameSize];
- wideFileName[0] = 0;
-
- MultiByteToWideChar(CP_UTF8,
- 0 /*UTF8 flag*/,
- fileNameUTF8,
- -1 /*Null terminated string*/,
- wideFileName,
- kMaxFileNameSize);
- if(text)
- {
- if(readOnly)
- {
- tmpId = _wfopen(wideFileName, L"rt");
- } else {
- tmpId = _wfopen(wideFileName, L"wt");
- }
- } else {
- if(readOnly)
- {
- tmpId = _wfopen(wideFileName, L"rb");
- } else {
- tmpId = _wfopen(wideFileName, L"wb");
- }
- }
-#else
- if(text)
- {
- if(readOnly)
- {
- tmpId = fopen(fileNameUTF8, "rt");
- } else {
- tmpId = fopen(fileNameUTF8, "wt");
- }
- } else {
- if(readOnly)
- {
- tmpId = fopen(fileNameUTF8, "rb");
- } else {
- tmpId = fopen(fileNameUTF8, "wb");
- }
- }
-#endif
-
- if (tmpId != NULL)
- {
- // + 1 comes fro copying the NULL termination charachter too
- memcpy(_fileNameUTF8, fileNameUTF8, length + 1);
- if (_id != NULL)
- {
- fclose(_id);
- }
- _id = tmpId;
- _looping = loop;
- _open = true;
- return 0;
- }
- return -1;
-}
-
-int FileWrapperImpl::Read(void *buf, int len)
-{
- if(len < 0)
- {
- return 0;
- }
- if (_id != NULL)
- {
- WebRtc_Word32 res = static_cast<WebRtc_Word32>(fread(buf, 1, len, _id));
- if (res != len)
- {
- if(!_looping)
- {
- CloseFile();
- }
- }
- return res;
- }
- return -1;
-}
-
-WebRtc_Word32 FileWrapperImpl::WriteText(const WebRtc_Word8* text, ...)
-{
- assert(!_readOnly);
- assert(!_text);
-
- if (_id == NULL)
- {
- return -1;
- }
-
- char tempBuff[kFileMaxTextMessageSize];
- if (text)
- {
- va_list args;
- va_start(args, text);
-#ifdef _WIN32
- _vsnprintf(tempBuff, kFileMaxTextMessageSize-1, text, args);
-#else
- vsnprintf(tempBuff, kFileMaxTextMessageSize-1, text, args);
-#endif
- va_end(args);
- WebRtc_Word32 nBytes;
- nBytes = fprintf(_id, "%s", tempBuff);
- if (nBytes > 0)
- {
- return 0;
- }
- CloseFile();
- }
- return -1;
-}
-
-bool FileWrapperImpl::Write(const void* buf, int len)
-{
- assert(!_readOnly);
- if (_id != NULL)
- {
- // Check if it's time to stop writing.
- if ((_maxSizeInBytes != -1) &&
- _sizeInBytes + len > (WebRtc_UWord32)_maxSizeInBytes)
- {
- Flush();
- return false;
- }
-
- size_t nBytes = fwrite((WebRtc_UWord8*)buf, 1, len, _id);
- if (nBytes > 0)
- {
- _sizeInBytes += static_cast<WebRtc_Word32>(nBytes);
- return true;
- }
- CloseFile();
- }
- return false;
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/file_impl.h b/src/system_wrappers/source/file_impl.h
deleted file mode 100644
index cf6b734..0000000
--- a/src/system_wrappers/source/file_impl.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_FILE_IMPL_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_FILE_IMPL_H_
-
-#include "file_wrapper.h"
-
-#include <stdio.h>
-
-namespace webrtc {
-class FileWrapperImpl : public FileWrapper
-{
-public:
- FileWrapperImpl();
- virtual ~FileWrapperImpl();
-
- virtual WebRtc_Word32 FileName(WebRtc_Word8* fileNameUTF8,
- WebRtc_UWord32 size) const;
-
- virtual bool Open() const;
-
- virtual WebRtc_Word32 OpenFile(const WebRtc_Word8* fileNameUTF8,
- const bool readOnly,
- const bool loop = false,
- const bool text = false);
-
- virtual WebRtc_Word32 CloseFile();
- virtual WebRtc_Word32 SetMaxFileSize(WebRtc_Word32 bytes);
- virtual WebRtc_Word32 Flush();
-
- virtual int Read(void* buf, int len);
- virtual bool Write(const void *buf, int len);
- virtual int Rewind();
-
- virtual WebRtc_Word32 WriteText(const WebRtc_Word8* text, ...);
-
-private:
- FILE* _id;
- bool _open;
- bool _looping;
- bool _readOnly;
- bool _text;
- WebRtc_Word32 _maxSizeInBytes; // -1 indicates file size limitation is off
- WebRtc_UWord32 _sizeInBytes;
- WebRtc_Word8 _fileNameUTF8[kMaxFileNameSize];
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_FILE_IMPL_H_
diff --git a/src/system_wrappers/source/list_no_stl.cc b/src/system_wrappers/source/list_no_stl.cc
deleted file mode 100644
index d45f27b..0000000
--- a/src/system_wrappers/source/list_no_stl.cc
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "list_wrapper.h"
-
-#include "critical_section_wrapper.h"
-#include "trace.h"
-
-namespace webrtc {
-ListItem::ListItem(const void* item)
- : next_(0),
- prev_(0),
- item_ptr_(item),
- item_(0)
-{
-}
-
-ListItem::ListItem(const unsigned int item)
- : next_(0),
- prev_(0),
- item_ptr_(0),
- item_(item)
-{
-}
-
-ListItem::~ListItem()
-{
-}
-
-void* ListItem::GetItem() const
-{
- return const_cast<void*>(item_ptr_);
-}
-
-unsigned int ListItem::GetUnsignedItem() const
-{
- return item_;
-}
-
-ListWrapper::ListWrapper()
- : critical_section_(CriticalSectionWrapper::CreateCriticalSection()),
- first_(0),
- last_(0),
- size_(0)
-{
-}
-
-ListWrapper::~ListWrapper()
-{
- if (!Empty())
- {
- // TODO (hellner) I'm not sure this loggin is useful.
- WEBRTC_TRACE(kTraceMemory, kTraceUtility, -1,
- "Potential memory leak in ListWrapper");
- // Remove all remaining list items.
- while (Erase(First()) == 0)
- {}
- }
- delete critical_section_;
-}
-
-bool ListWrapper::Empty() const
-{
- return !first_ && !last_;
-}
-
-unsigned int ListWrapper::GetSize() const
-{
- return size_;
-}
-
-int ListWrapper::PushBack(const void* ptr)
-{
- ListItem* item = new ListItem(ptr);
- CriticalSectionScoped lock(*critical_section_);
- PushBackImpl(item);
- return 0;
-}
-
-int ListWrapper::PushBack(const unsigned int item_id)
-{
- ListItem* item = new ListItem(item_id);
- CriticalSectionScoped lock(*critical_section_);
- PushBackImpl(item);
- return 0;
-}
-
-int ListWrapper::PushFront(const unsigned int item_id)
-{
- ListItem* item = new ListItem(item_id);
- CriticalSectionScoped lock(*critical_section_);
- PushFrontImpl(item);
- return 0;
-}
-
-int ListWrapper::PushFront(const void* ptr)
-{
- ListItem* item = new ListItem(ptr);
- CriticalSectionScoped lock(*critical_section_);
- PushFrontImpl(item);
- return 0;
-}
-
-int ListWrapper::PopFront()
-{
- return Erase(first_);
-}
-
-int ListWrapper::PopBack()
-{
- return Erase(last_);
-}
-
-ListItem* ListWrapper::First() const
-{
- return first_;
-}
-
-ListItem* ListWrapper::Last() const
-{
- return last_;
-}
-
-ListItem* ListWrapper::Next(ListItem* item) const
-{
- if(!item)
- {
- return 0;
- }
- return item->next_;
-}
-
-ListItem* ListWrapper::Previous(ListItem* item) const
-{
- if (!item)
- {
- return 0;
- }
- return item->prev_;
-}
-
-int ListWrapper::Insert(ListItem* existing_previous_item, ListItem* new_item)
-{
- if (!new_item)
- {
- return -1;
- }
- // Allow existing_previous_item to be NULL if the list is empty.
- // TODO (hellner) why allow this? Keep it as is for now to avoid
- // breaking API contract.
- if (!existing_previous_item && !Empty())
- {
- return -1;
- }
- CriticalSectionScoped lock(*critical_section_);
- if (!existing_previous_item)
- {
- PushBackImpl(new_item);
- return 0;
- }
- ListItem* next_item = existing_previous_item->next_;
- new_item->next_ = existing_previous_item->next_;
- new_item->prev_ = existing_previous_item;
- existing_previous_item->next_ = new_item;
- if (next_item)
- {
- next_item->prev_ = new_item;
- }
- else
- {
- last_ = new_item;
- }
- size_++;
- return 0;
-}
-
-int ListWrapper::InsertBefore(ListItem* existing_next_item,
- ListItem* new_item)
-{
- if (!new_item)
- {
- return -1;
- }
- // Allow existing_next_item to be NULL if the list is empty.
- // Todo: why allow this? Keep it as is for now to avoid breaking API
- // contract.
- if (!existing_next_item && !Empty())
- {
- return -1;
- }
- CriticalSectionScoped lock(*critical_section_);
- if (!existing_next_item)
- {
- PushBackImpl(new_item);
- return 0;
- }
-
- ListItem* previous_item = existing_next_item->prev_;
- new_item->next_ = existing_next_item;
- new_item->prev_ = previous_item;
- existing_next_item->prev_ = new_item;
- if (previous_item)
- {
- previous_item->next_ = new_item;
- }
- else
- {
- first_ = new_item;
- }
- size_++;
- return 0;
-}
-
-int ListWrapper::Erase(ListItem* item)
-{
- if (!item)
- {
- return -1;
- }
- size_--;
- ListItem* previous_item = item->prev_;
- ListItem* next_item = item->next_;
- if (!previous_item)
- {
- if(next_item)
- {
- next_item->prev_ = 0;
- }
- first_ = next_item;
- }
- else
- {
- previous_item->next_ = next_item;
- }
- if (!next_item)
- {
- if(previous_item)
- {
- previous_item->next_ = 0;
- }
- last_ = previous_item;
- }
- else
- {
- next_item->prev_ = previous_item;
- }
- delete item;
- return 0;
-}
-
-void ListWrapper::PushBackImpl(ListItem* item)
-{
- if (Empty())
- {
- first_ = item;
- last_ = item;
- size_++;
- return;
- }
-
- item->prev_ = last_;
- last_->next_ = item;
- last_ = item;
- size_++;
-}
-
-void ListWrapper::PushFrontImpl(ListItem* item)
-{
- if (Empty())
- {
- first_ = item;
- last_ = item;
- size_++;
- return;
- }
-
- item->next_ = first_;
- first_->prev_ = item;
- first_ = item;
- size_++;
-}
-} //namespace webrtc
diff --git a/src/system_wrappers/source/list_no_stl.h b/src/system_wrappers/source/list_no_stl.h
deleted file mode 100644
index 26d844c..0000000
--- a/src/system_wrappers/source/list_no_stl.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_LIST_NO_STL_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_LIST_NO_STL_H_
-
-#include "constructor_magic.h"
-
-namespace webrtc {
-class CriticalSectionWrapper;
-
-class ListNoStlItem
-{
-public:
- ListNoStlItem(const void* ptr);
- ListNoStlItem(const unsigned int item);
- virtual ~ListNoStlItem();
- void* GetItem() const;
- unsigned int GetUnsignedItem() const;
-
-protected:
- ListNoStlItem* next_;
- ListNoStlItem* prev_;
-
-private:
- friend class ListNoStl;
-
- const void* item_ptr_;
- const unsigned int item_;
- DISALLOW_COPY_AND_ASSIGN(ListNoStlItem);
-};
-
-
-class ListNoStl
-{
-public:
- ListNoStl();
- virtual ~ListNoStl();
-
- // ListWrapper functions
- unsigned int GetSize() const;
- int PushBack(const void* ptr);
- int PushBack(const unsigned int item_id);
- int PushFront(const void* ptr);
- int PushFront(const unsigned int item_id);
- int PopFront();
- int PopBack();
- bool Empty() const;
- ListNoStlItem* First() const;
- ListNoStlItem* Last() const;
- ListNoStlItem* Next(ListNoStlItem* item) const;
- ListNoStlItem* Previous(ListNoStlItem* item) const;
- int Erase(ListNoStlItem* item);
- int Insert(ListNoStlItem* existing_previous_item,
- ListNoStlItem* new_item);
-
- int InsertBefore(ListNoStlItem* existing_next_item,
- ListNoStlItem* new_item);
-
-private:
- void PushBack(ListNoStlItem* item);
- void PushFront(ListNoStlItem* item);
-
- CriticalSectionWrapper* critical_section_;
- ListNoStlItem* first_;
- ListNoStlItem* last_;
- unsigned int size_;
- DISALLOW_COPY_AND_ASSIGN(ListNoStl);
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_LIST_NO_STL_H_
diff --git a/src/system_wrappers/source/list_stl.cc b/src/system_wrappers/source/list_stl.cc
deleted file mode 100644
index dcc63c3..0000000
--- a/src/system_wrappers/source/list_stl.cc
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "list_wrapper.h"
-
-#include "trace.h"
-
-namespace webrtc {
-ListItem::ListItem(const void* item)
- : this_iter_(),
- item_ptr_(item),
- item_(0)
-{
-}
-
-ListItem::ListItem(const unsigned int item)
- : this_iter_(),
- item_ptr_(0),
- item_(item)
-{
-}
-
-ListItem::~ListItem()
-{
-}
-
-void* ListItem::GetItem() const
-{
- return const_cast<void*>(item_ptr_);
-}
-
-unsigned int ListItem::GetUnsignedItem() const
-{
- return item_;
-}
-
-ListWrapper::ListWrapper() : list_()
-{
-}
-
-ListWrapper::~ListWrapper()
-{
- if (!Empty())
- {
- // TODO (hellner) I'm not sure this loggin is useful.
- WEBRTC_TRACE(kTraceMemory, kTraceUtility, -1,
- "Potential memory leak in ListWrapper");
- // Remove all remaining list items.
- while (Erase(First()) == 0)
- {}
- }
-}
-
-bool ListWrapper::Empty() const
-{
- return list_.empty();
-}
-
-unsigned int ListWrapper::GetSize() const
-{
- return list_.size();
-}
-
-int ListWrapper::PushBack(const void* ptr)
-{
- ListItem* item = new ListItem(ptr);
- list_.push_back(item);
- return 0;
-}
-
-int ListWrapper::PushBack(const unsigned int item_id)
-{
- ListItem* item = new ListItem(item_id);
- list_.push_back(item);
- return 0;
-}
-
-int ListWrapper::PushFront(const unsigned int item_id)
-{
- ListItem* item = new ListItem(item_id);
- list_.push_front(item);
- return 0;
-}
-
-int ListWrapper::PushFront(const void* ptr)
-{
- ListItem* item = new ListItem(ptr);
- list_.push_front(item);
- return 0;
-}
-
-int ListWrapper::PopFront()
-{
- if(list_.empty())
- {
- return -1;
- }
- list_.pop_front();
- return 0;
-}
-
-int ListWrapper::PopBack()
-{
- if(list_.empty())
- {
- return -1;
- }
- list_.pop_back();
- return 0;
-}
-
-ListItem* ListWrapper::First() const
-{
- if(list_.empty())
- {
- return NULL;
- }
- std::list<ListItem*>::iterator item_iter = list_.begin();
- ListItem* return_item = (*item_iter);
- return_item->this_iter_ = item_iter;
- return return_item;
-}
-
-ListItem* ListWrapper::Last() const
-{
- if(list_.empty())
- {
- return NULL;
- }
- // std::list::end() addresses the last item + 1. Decrement so that the
- // actual last is accessed.
- std::list<ListItem*>::iterator item_iter = list_.end();
- --item_iter;
- ListItem* return_item = (*item_iter);
- return_item->this_iter_ = item_iter;
- return return_item;
-}
-
-ListItem* ListWrapper::Next(ListItem* item) const
-{
- if(item == NULL)
- {
- return NULL;
- }
- std::list<ListItem*>::iterator item_iter = item->this_iter_;
- ++item_iter;
- if (item_iter == list_.end())
- {
- return NULL;
- }
- ListItem* return_item = (*item_iter);
- return_item->this_iter_ = item_iter;
- return return_item;
-}
-
-ListItem* ListWrapper::Previous(ListItem* item) const
-{
- if(item == NULL)
- {
- return NULL;
- }
- std::list<ListItem*>::iterator item_iter = item->this_iter_;
- if (item_iter == list_.begin())
- {
- return NULL;
- }
- --item_iter;
- ListItem* return_item = (*item_iter);
- return_item->this_iter_ = item_iter;
- return return_item;
-}
-
-int ListWrapper::Insert(ListItem* existing_previous_item,
- ListItem* new_item)
-{
- // Allow existingPreviousItem to be NULL if the list is empty.
- // TODO (hellner) why allow this? Keep it as is for now to avoid
- // breaking API contract.
- if (!existing_previous_item && !Empty())
- {
- return -1;
- }
-
- if (!new_item)
- {
- return -1;
- }
-
- std::list<ListItem*>::iterator insert_location = list_.begin();
- if (!Empty())
- {
- insert_location = existing_previous_item->this_iter_;
- if(insert_location != list_.end())
- {
- ++insert_location;
- }
- }
-
- list_.insert(insert_location,new_item);
- return 0;
-}
-
-int ListWrapper::InsertBefore(ListItem* existing_next_item,
- ListItem* new_item)
-{
- // Allow existing_next_item to be NULL if the list is empty.
- // Todo: why allow this? Keep it as is for now to avoid breaking API
- // contract.
- if (!existing_next_item && !Empty())
- {
- return -1;
- }
- if (!new_item)
- {
- return -1;
- }
-
- std::list<ListItem*>::iterator insert_location = list_.begin();
- if (!Empty())
- {
- insert_location = existing_next_item->this_iter_;
- }
-
- list_.insert(insert_location,new_item);
- return 0;
-}
-
-int ListWrapper::Erase(ListItem* item)
-{
- if(item == NULL)
- {
- return -1;
- }
- list_.erase(item->this_iter_);
- return 0;
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/list_stl.h b/src/system_wrappers/source/list_stl.h
deleted file mode 100644
index b83a664..0000000
--- a/src/system_wrappers/source/list_stl.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_LIST_STL_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_LIST_STL_H_
-
-#include <list>
-
-#include "constructor_magic.h"
-
-namespace webrtc {
-class ListItem
-{
-friend class ListWrapper;
-
-public:
- ListItem(const void* ptr);
- ListItem(const unsigned int item);
- virtual ~ListItem();
- void* GetItem() const;
- unsigned int GetUnsignedItem() const;
-
-private:
- mutable std::list<ListItem*>::iterator this_iter_;
- const void* item_ptr_;
- const unsigned int item_;
- DISALLOW_COPY_AND_ASSIGN(ListItem);
-};
-
-class ListWrapper
-{
-public:
- ListWrapper();
- ~ListWrapper();
-
- // ListWrapper functions
- unsigned int GetSize() const;
- int PushBack(const void* ptr);
- int PushBack(const unsigned int item_id);
- int PushFront(const void* ptr);
- int PushFront(const unsigned int item_id);
- int PopFront();
- int PopBack();
- bool Empty() const;
- ListItem* First() const;
- ListItem* Last() const;
- ListItem* Next(ListItem* item) const;
- ListItem* Previous(ListItem* item) const;
- int Erase(ListItem* item);
- int Insert(ListItem* existing_previous_item, ListItem* new_item);
- int InsertBefore(ListItem* existing_next_item, ListItem* new_item);
-
-private:
- mutable std::list<ListItem*> list_;
- DISALLOW_COPY_AND_ASSIGN(ListWrapper);
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_LIST_STL_H_
diff --git a/src/system_wrappers/source/list_unittest.cc b/src/system_wrappers/source/list_unittest.cc
deleted file mode 100644
index 3f3c88f..0000000
--- a/src/system_wrappers/source/list_unittest.cc
+++ /dev/null
@@ -1,475 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "gtest/gtest.h"
-
-#include "list_wrapper.h"
-
-using ::webrtc::ListWrapper;
-using ::webrtc::ListItem;
-
-// Note: kNumberOfElements needs to be even.
-const unsigned int kNumberOfElements = 10;
-
-// An opaque implementation of dynamic or statically allocated unsigned ints.
-// This class makes it possible to use the exact same code for testing of both
-// the dynamic and static implementation of ListWrapper.
-// Clarification: ListWrapper has two versions of PushBack(..). It takes an
-// unsigned integer or a void pointer. The integer implementation takes care
-// of memory management. The void pointer version expect the caller to manage
-// the memory associated with the void pointer.
-// This class works like the integer version but can be implemented on top of
-// either the integer version or void pointer version of ListWrapper.
-// Note: the non-virtual fuctions behave the same for both versions.
-class ListWrapperSimple {
-public:
- static ListWrapperSimple* Create(bool static_allocation);
- virtual ~ListWrapperSimple() {}
-
- // These three functions should be used for manipulating ListItems so that
- // they are the type corresponding to the underlying implementation.
- virtual unsigned int GetUnsignedItem(
- const ListItem* item) const = 0;
- virtual ListItem* CreateListItem(unsigned int item_id) = 0;
- virtual bool DestroyListItem(ListItem* item) = 0;
-
- unsigned int GetSize() const {
- return list_.GetSize();
- }
- virtual int PushBack(const unsigned int item_id) = 0;
- virtual int PushFront(const unsigned int item_id) = 0;
- virtual int PopFront() = 0;
- virtual int PopBack() = 0;
- bool Empty() const {
- return list_.Empty();
- }
- ListItem* First() const {
- return list_.First();
- }
- ListItem* Last() const {
- return list_.Last();
- }
- ListItem* Next(ListItem* item) const {
- return list_.Next(item);
- }
- ListItem* Previous(ListItem* item) const {
- return list_.Previous(item);
- }
- virtual int Erase(ListItem* item) = 0;
- int Insert(ListItem* existing_previous_item,
- ListItem* new_item) {
- return list_.Insert(existing_previous_item, new_item);
- }
-
- int InsertBefore(ListItem* existing_next_item,
- ListItem* new_item) {
- return list_.InsertBefore(existing_next_item, new_item);
- }
-protected:
- ListWrapperSimple() {}
-
- ListWrapper list_;
-};
-
-class ListWrapperStatic : public ListWrapperSimple {
-public:
- ListWrapperStatic() {}
- virtual ~ListWrapperStatic() {}
-
- virtual unsigned int GetUnsignedItem(const ListItem* item) const {
- return item->GetUnsignedItem();
- }
- virtual ListItem* CreateListItem(unsigned int item_id) {
- return new ListItem(item_id);
- }
- virtual bool DestroyListItem(ListItem* item) {
- if (item == NULL) {
- return false;
- }
- delete item;
- return true;
- }
- virtual int PushBack(const unsigned int item_id) {
- return list_.PushBack(item_id);
- }
- virtual int PushFront(const unsigned int item_id) {
- return list_.PushFront(item_id);
- }
- virtual int PopFront() {
- return list_.PopFront();
- }
- virtual int PopBack() {
- return list_.PopBack();
- }
- virtual int Erase(ListItem* item) {
- return list_.Erase(item);
- }
-};
-
-class ListWrapperDynamic : public ListWrapperSimple {
-public:
- ListWrapperDynamic() {}
- virtual ~ListWrapperDynamic() {}
-
- virtual unsigned int GetUnsignedItem(const ListItem* item) const {
- const unsigned int* return_value_pointer =
- reinterpret_cast<unsigned int*> (item->GetItem());
- if (return_value_pointer == NULL) {
- return -1;
- }
- return *return_value_pointer;
- }
- virtual ListItem* CreateListItem(unsigned int item_id) {
- unsigned int* item_id_pointer = new unsigned int;
- if (item_id_pointer == NULL) {
- return NULL;
- }
- *item_id_pointer = item_id;
- ListItem* return_value = new ListItem(
- reinterpret_cast<void*>(item_id_pointer));
- if (return_value == NULL) {
- delete item_id_pointer;
- return NULL;
- }
- return return_value;
- }
- virtual bool DestroyListItem(ListItem* item) {
- if (item == NULL) {
- return false;
- }
- bool return_value = false;
- unsigned int* item_id_ptr = reinterpret_cast<unsigned int*>(
- item->GetItem());
- if (item_id_ptr != NULL) {
- return_value = true;
- delete item_id_ptr;
- }
- delete item;
- return return_value;
- }
- virtual int PushBack(const unsigned int item_id) {
- unsigned int* item_id_ptr = new unsigned int;
- if (item_id_ptr == NULL) {
- return -1;
- }
- *item_id_ptr = item_id;
- const int return_value = list_.PushBack(
- reinterpret_cast<void*>(item_id_ptr));
- if (return_value != 0) {
- delete item_id_ptr;
- }
- return return_value;
- }
- virtual int PushFront(const unsigned int item_id) {
- unsigned int* item_id_ptr = new unsigned int;
- if (item_id_ptr == NULL) {
- return -1;
- }
- *item_id_ptr = item_id;
- const int return_value = list_.PushFront(
- reinterpret_cast<void*>(item_id_ptr));
- if (return_value != 0) {
- delete item_id_ptr;
- }
- return return_value;
- }
- virtual int PopFront() {
- return Erase(list_.First());
- }
- virtual int PopBack() {
- return Erase(list_.Last());
- }
- virtual int Erase(ListItem* item) {
- if (item == NULL) {
- return -1;
- }
- unsigned int* item_id_ptr = reinterpret_cast<unsigned int*> (
- item->GetItem());
- int return_value = -1;
- if (item_id_ptr != NULL) {
- delete item_id_ptr;
- return_value = 0;
- }
- if (list_.Erase(item) != 0) {
- return -1;
- }
- return return_value;
- }
-};
-
-ListWrapperSimple* ListWrapperSimple::Create(bool static_allocation) {
- if(static_allocation)
- {
- return new ListWrapperStatic();
- }
- return new ListWrapperDynamic();
-}
-
-void ClearList(ListWrapperSimple* list) {
- if (list == NULL)
- {
- return;
- }
- while (list->Erase(list->First()) == 0) {
- }
-}
-
-ListWrapperSimple* CreateAscendingList(bool static_allocation) {
- ListWrapperSimple* return_value = ListWrapperSimple::Create(
- static_allocation);
- if (return_value == NULL) {
- return NULL;
- }
- for (unsigned int i = 0; i < kNumberOfElements; ++i) {
- if (return_value->PushBack(i) == -1) {
- ClearList(return_value);
- delete return_value;
- return NULL;
- }
- }
- return return_value;
-}
-
-ListWrapperSimple* CreateDecendingList(bool static_allocation) {
- ListWrapperSimple* return_value = ListWrapperSimple::Create(
- static_allocation);
- if (return_value == NULL) {
- return NULL;
- }
- for (unsigned int i = 0; i < kNumberOfElements; ++i) {
- if (return_value->PushBack(kNumberOfElements - i - 1) == -1) {
- ClearList(return_value);
- delete return_value;
- return NULL;
- }
- }
- return return_value;
-}
-
-// [0,kNumberOfElements - 1,1,kNumberOfElements - 2,...] (this is why
-// kNumberOfElements need to be even)
-ListWrapperSimple* CreateInterleavedList(bool static_allocation) {
- ListWrapperSimple* return_value = ListWrapperSimple::Create(
- static_allocation);
- if (return_value == NULL) {
- return NULL;
- }
- unsigned int uneven_count = 0;
- unsigned int even_count = 0;
- for (unsigned int i = 0; i < kNumberOfElements; i++) {
- unsigned int push_value = 0;
- if ((i % 2) == 0) {
- push_value = even_count;
- even_count++;
- } else {
- push_value = kNumberOfElements - uneven_count - 1;
- uneven_count++;
- }
- if (return_value->PushBack(push_value) == -1) {
- ClearList(return_value);
- delete return_value;
- return NULL;
- }
- }
- return return_value;
-}
-
-void PrintList(const ListWrapperSimple* list) {
- ListItem* list_item = list->First();
- printf("[");
- while (list_item != NULL)
- {
- printf("%3u", list->GetUnsignedItem(list_item));
- list_item = list->Next(list_item);
- }
- printf("]\n");
-}
-
-bool CompareLists(const ListWrapperSimple* lhs, const ListWrapperSimple* rhs) {
- const unsigned int list_size = lhs->GetSize();
- if (lhs->GetSize() != rhs->GetSize()) {
- return false;
- }
- if (lhs->Empty()) {
- return rhs->Empty();
- }
- unsigned int i = 0;
- ListItem* lhs_item = lhs->First();
- ListItem* rhs_item = rhs->First();
- while (i < list_size) {
- if (lhs_item == NULL) {
- return false;
- }
- if (rhs_item == NULL) {
- return false;
- }
- if (lhs->GetUnsignedItem(lhs_item) != rhs->GetUnsignedItem(rhs_item)) {
- return false;
- }
- i++;
- lhs_item = lhs->Next(lhs_item);
- rhs_item = rhs->Next(rhs_item);
- }
- return true;
-}
-
-TEST(ListWrapperTest,ReverseNewIntList) {
- // Create a new temporary list with elements reversed those of
- // new_int_list_
- const ListWrapperSimple* decending_list = CreateDecendingList(rand()%2);
- ASSERT_FALSE(decending_list == NULL);
- ASSERT_FALSE(decending_list->Empty());
- ASSERT_EQ(kNumberOfElements,decending_list->GetSize());
-
- const ListWrapperSimple* ascending_list = CreateAscendingList(rand()%2);
- ASSERT_FALSE(ascending_list == NULL);
- ASSERT_FALSE(ascending_list->Empty());
- ASSERT_EQ(kNumberOfElements,ascending_list->GetSize());
-
- ListWrapperSimple* list_to_reverse = ListWrapperSimple::Create(rand()%2);
-
- // Reverse the list using PushBack and Previous.
- for (ListItem* item = ascending_list->Last(); item != NULL;
- item = ascending_list->Previous(item)) {
- list_to_reverse->PushBack(ascending_list->GetUnsignedItem(item));
- }
-
- ASSERT_TRUE(CompareLists(decending_list,list_to_reverse));
-
- ListWrapperSimple* list_to_un_reverse =
- ListWrapperSimple::Create(rand()%2);
- ASSERT_FALSE(list_to_un_reverse == NULL);
- // Reverse the reversed list using PushFront and Next.
- for (ListItem* item = list_to_reverse->First(); item != NULL;
- item = list_to_reverse->Next(item)) {
- list_to_un_reverse->PushFront(list_to_reverse->GetUnsignedItem(item));
- }
-
- ASSERT_TRUE(CompareLists(ascending_list,list_to_un_reverse));
-}
-
-TEST(ListWrapperTest,PopTest) {
- ListWrapperSimple* ascending_list = CreateAscendingList(rand()%2);
- ASSERT_FALSE(ascending_list == NULL);
- ASSERT_FALSE(ascending_list->Empty());
- EXPECT_EQ(0,ascending_list->PopFront());
- EXPECT_EQ(1,ascending_list->GetUnsignedItem(ascending_list->First()));
-
- EXPECT_EQ(0,ascending_list->PopBack());
- EXPECT_EQ(kNumberOfElements - 2,ascending_list->GetUnsignedItem(
- ascending_list->Last()));
- EXPECT_EQ(kNumberOfElements - 2, ascending_list->GetSize());
-}
-
-// Use Insert to interleave two lists.
-TEST(ListWrapperTest,InterLeaveTest) {
- ListWrapperSimple* interleave_list = CreateAscendingList(rand()%2);
- ASSERT_FALSE(interleave_list == NULL);
- ASSERT_FALSE(interleave_list->Empty());
-
- ListWrapperSimple* decending_list = CreateDecendingList(rand()%2);
- ASSERT_FALSE(decending_list == NULL);
-
- for (int i = 0; i < kNumberOfElements/2; ++i) {
- ASSERT_EQ(0,interleave_list->PopBack());
- ASSERT_EQ(0,decending_list->PopBack());
- }
- ASSERT_EQ(kNumberOfElements/2,interleave_list->GetSize());
- ASSERT_EQ(kNumberOfElements/2,decending_list->GetSize());
-
- int insert_position = kNumberOfElements/2;
- ASSERT_EQ(insert_position * 2, kNumberOfElements);
- while (!decending_list->Empty())
- {
- ListItem* item = decending_list->Last();
- ASSERT_FALSE(item == NULL);
-
- const unsigned int item_id = decending_list->GetUnsignedItem(item);
- ASSERT_EQ(0,decending_list->Erase(item));
-
- ListItem* insert_item = interleave_list->CreateListItem(item_id);
- ASSERT_FALSE(insert_item == NULL);
- item = interleave_list->First();
- ASSERT_FALSE(item == NULL);
- for (int j = 0; j < insert_position - 1; ++j) {
- item = interleave_list->Next(item);
- ASSERT_FALSE(item == NULL);
- }
- if (0 != interleave_list->Insert(item,insert_item)) {
- interleave_list->DestroyListItem(insert_item);
- FAIL();
- }
- --insert_position;
- }
-
- ListWrapperSimple* interleaved_list = CreateInterleavedList(rand()%2);
- ASSERT_FALSE(interleaved_list == NULL);
- ASSERT_FALSE(interleaved_list->Empty());
-
- ASSERT_TRUE(CompareLists(interleaved_list,interleave_list));
-}
-
-// Use InsertBefore to interleave two lists.
-TEST(ListWrapperTest,InterLeaveTestII) {
- ListWrapperSimple* interleave_list = CreateDecendingList(rand()%2);
- ASSERT_FALSE(interleave_list == NULL);
- ASSERT_FALSE(interleave_list->Empty());
-
- ListWrapperSimple* ascending_list = CreateAscendingList(rand()%2);
- ASSERT_FALSE(ascending_list == NULL);
-
- for (int i = 0; i < kNumberOfElements/2; ++i) {
- ASSERT_EQ(0,interleave_list->PopBack());
- ASSERT_EQ(0,ascending_list->PopBack());
- }
- ASSERT_EQ(kNumberOfElements/2,interleave_list->GetSize());
- ASSERT_EQ(kNumberOfElements/2,ascending_list->GetSize());
-
- int insert_position = kNumberOfElements/2;
- ASSERT_EQ(insert_position * 2, kNumberOfElements);
- while (!ascending_list->Empty())
- {
- ListItem* item = ascending_list->Last();
- ASSERT_FALSE(item == NULL);
-
- const unsigned int item_id = ascending_list->GetUnsignedItem(item);
- ASSERT_EQ(0,ascending_list->Erase(item));
-
- ListItem* insert_item = interleave_list->CreateListItem(item_id);
- ASSERT_FALSE(insert_item == NULL);
- item = interleave_list->First();
- ASSERT_FALSE(item == NULL);
- for (int j = 0; j < insert_position - 1; ++j) {
- item = interleave_list->Next(item);
- ASSERT_FALSE(item == NULL);
- }
- if (0 != interleave_list->InsertBefore(item,insert_item)) {
- interleave_list->DestroyListItem(insert_item);
- FAIL();
- }
- --insert_position;
- }
-
- ListWrapperSimple* interleaved_list = CreateInterleavedList(rand()%2);
- ASSERT_FALSE(interleaved_list == NULL);
- ASSERT_FALSE(interleaved_list->Empty());
-
- ASSERT_TRUE(CompareLists(interleaved_list,interleave_list));
-}
-
-int main(int argc, char **argv)
-{
- ::testing::InitGoogleTest(&argc, argv);
- // Added return_value so that it's convenient to put a breakpoint before
- // exiting please note that the return value from RUN_ALL_TESTS() must
- // be returned by the main function.
- const int return_value = RUN_ALL_TESTS();
- return return_value;
-}
diff --git a/src/system_wrappers/source/map.cc b/src/system_wrappers/source/map.cc
deleted file mode 100644
index 0bff155..0000000
--- a/src/system_wrappers/source/map.cc
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "map_wrapper.h"
-
-#include "trace.h"
-
-namespace webrtc {
-MapItem::MapItem(int id, void* item) : item_pointer_(item), item_id_(id)
-{
-}
-
-MapItem::~MapItem()
-{
-}
-
-void* MapItem::GetItem()
-{
- return item_pointer_;
-}
-
-int MapItem::GetId()
-{
- return item_id_;
-}
-
-unsigned int MapItem::GetUnsignedId()
-{
- return static_cast<unsigned int>(item_id_);
-}
-
-void MapItem::SetItem(void* ptr)
-{
- item_pointer_ = ptr;
-}
-
-MapWrapper::MapWrapper() : map_()
-{
-}
-
-MapWrapper::~MapWrapper()
-{
- if (!map_.empty())
- {
- WEBRTC_TRACE(kTraceMemory, kTraceUtility, -1,
- "Potential memory leak in MapWrapper");
- // Remove all map items. Please note that std::map::clear() can't be
- // used because each item has some dynamically allocated memory
- // associated with it (i.e. using std::map::clear would introduce a
- // memory leak).
- while (Erase(First()) == 0)
- {}
- }
-}
-
-int MapWrapper::Size() const
-{
- return (int)map_.size();
-}
-
-int MapWrapper::Insert(int id, void* ptr)
-{
- map_[id] = new MapItem(id,ptr);
- return 0;
-}
-
-MapItem* MapWrapper::First() const
-{
- std::map<int, MapItem*>::const_iterator it = map_.begin();
- if (it != map_.end())
- {
- return it->second;
- }
- return 0;
-}
-
-MapItem* MapWrapper::Last() const
-{
- std::map<int, MapItem*>::const_reverse_iterator it = map_.rbegin();
- if (it != map_.rend())
- {
- return it->second;
- }
- return 0;
-}
-
-MapItem* MapWrapper::Next(MapItem* item) const
-{
- if (item == 0)
- {
- return 0;
- }
- std::map<int, MapItem*>::const_iterator it = map_.find(item->item_id_);
- if (it != map_.end())
- {
- it++;
- if (it != map_.end())
- {
- return it->second;
- }
- }
- return 0;
-}
-
-MapItem* MapWrapper::Previous(MapItem* item) const
-{
- if (item == 0)
- {
- return 0;
- }
-
- std::map<int, MapItem*>::const_iterator it = map_.find(item->item_id_);
- if ((it != map_.end()) &&
- (it != map_.begin()))
- {
- --it;
- return it->second;
- }
- return 0;
-}
-
-MapItem* MapWrapper::Find(int id) const
-{
- std::map<int, MapItem*>::const_iterator it = map_.find(id);
- if (it != map_.end())
- {
- return it->second;
- }
- return 0;
-}
-
-int MapWrapper::Erase(MapItem* item)
-{
- if (item == 0)
- {
- return -1;
- }
- std::map<int, MapItem*>::iterator it = map_.find(item->item_id_);
- if (it != map_.end())
- {
- delete it->second;
- map_.erase(it);
- return 0;
- }
- return -1;
-}
-
-int MapWrapper::Erase(const int id)
-{
- std::map<int, MapItem*>::iterator it = map_.find(id);
- if (it != map_.end())
- {
- delete it->second;
- map_.erase(it);
- return 0;
- }
- return -1;
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/map_no_stl.cc b/src/system_wrappers/source/map_no_stl.cc
deleted file mode 100644
index cb0ac00..0000000
--- a/src/system_wrappers/source/map_no_stl.cc
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "map_no_stl.h"
-
-#include "critical_section_wrapper.h"
-#include "trace.h"
-
-namespace webrtc {
-MapNoStlItem::MapNoStlItem(int id, void* item)
- : next_(0),
- prev_(0),
- item_id_(id),
- item_ptr_(item)
-{
-}
-
-MapNoStlItem::~MapNoStlItem()
-{
-}
-
-void* MapNoStlItem::GetItem()
-{
- return item_ptr_;
-}
-
-int MapNoStlItem::GetId()
-{
- return item_id_;
-}
-
-unsigned int MapNoStlItem::GetUnsignedId()
-{
- return static_cast<unsigned int>(item_id_);
-}
-
-void MapNoStlItem::SetItem(void* ptr)
-{
- item_ptr_ = ptr;
-}
-
-MapNoStl::MapNoStl()
- : critical_section_(CriticalSectionWrapper::CreateCriticalSection()),
- first_(0),
- last_(0),
- size_(0)
-{
-}
-
-MapNoStl::~MapNoStl()
-{
- if (First())
- {
- WEBRTC_TRACE(kTraceMemory, kTraceUtility, -1,
- "Potential memory leak in MapNoStl");
- while (Erase(First()) == 0)
- {}
- }
- delete critical_section_;
-}
-
-int MapNoStl::Size() const
-{
- return size_;
-}
-
-int MapNoStl::Insert(int id, void* ptr)
-{
- MapNoStlItem* new_item = new MapNoStlItem(id, ptr);
-
- CriticalSectionScoped lock(*critical_section_);
- MapNoStlItem* item = first_;
- size_++;
- if (!item)
- {
- first_ = new_item;
- last_ = new_item;
- return 0;
- }
- while(item->next_)
- {
- // Three scenarios
- // 1. Item should be inserted first.
- // 2. Item should be inserted between two items
- // 3. Item should be inserted last
- if (item->GetId() > id)
- {
- new_item->next_ = item;
- item->prev_ = new_item;
- if (item == first_)
- {
- first_ = new_item;
- }
- else
- {
- new_item->prev_ = item->prev_;
- new_item->prev_->next_ = new_item;
- }
- return 0;
- }
- item = item->next_;
- }
- // 3
- item->next_ = new_item;
- new_item->prev_ = item;
- last_ = new_item;
- return 0;
-}
-
-MapNoStlItem* MapNoStl::First() const
-{
- return first_;
-}
-
-MapNoStlItem* MapNoStl::Last() const
-{
- return last_;
-}
-
-MapNoStlItem* MapNoStl::Next(MapNoStlItem* item) const
-{
- if (!item)
- {
- return 0;
- }
- return item->next_;
-}
-
-MapNoStlItem* MapNoStl::Previous(MapNoStlItem* item) const
-{
- if (!item)
- {
- return 0;
- }
- return item->prev_;
-}
-
-MapNoStlItem* MapNoStl::Find(int id) const
-{
- CriticalSectionScoped lock(*critical_section_);
- MapNoStlItem* item = Locate(id);
- return item;
-}
-
-int MapNoStl::Erase(MapNoStlItem* item)
-{
- if(!item)
- {
- return -1;
- }
- CriticalSectionScoped lock(*critical_section_);
- return Remove(item);
-}
-
-int MapNoStl::Erase(const int id)
-{
- CriticalSectionScoped lock(*critical_section_);
- MapNoStlItem* item = Locate(id);
- if(!item)
- {
- return -1;
- }
- return Remove(item);
-}
-
-MapNoStlItem* MapNoStl::Locate(int id) const
-{
- MapNoStlItem* item = first_;
- while(item)
- {
- if (item->GetId() == id)
- {
- return item;
- }
- item = item->next_;
- }
- return 0;
-}
-
-int MapNoStl::Remove(MapNoStlItem* item)
-{
- if (!item)
- {
- return -1;
- }
- size_--;
- MapNoStlItem* previous_item = item->prev_;
- MapNoStlItem* next_item = item->next_;
- if (!previous_item)
- {
- next_item->prev_ = 0;
- first_ = next_item;
- }
- else
- {
- previous_item->next_ = next_item;
- }
- if (!next_item)
- {
- previous_item->next_ = 0;
- last_ = previous_item;
- }
- else
- {
- next_item->prev_ = previous_item;
- }
- delete item;
- return 0;
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/map_no_stl.h b/src/system_wrappers/source/map_no_stl.h
deleted file mode 100644
index 51bc011..0000000
--- a/src/system_wrappers/source/map_no_stl.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_MAP_NO_STL_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_MAP_NO_STL_H_
-
-#include "constructor_magic.h"
-
-namespace webrtc {
-class CriticalSectionWrapper;
-
-class MapNoStlItem
-{
-friend class Map;
-
-public:
- MapNoStlItem(int id, void* ptr);
- virtual ~MapNoStlItem();
- void* GetItem();
- int GetId();
- unsigned int GetUnsignedId();
- void SetItem(void* ptr);
-
-protected:
- MapNoStlItem* next_;
- MapNoStlItem* prev_;
-
-private:
- int item_id_;
- void* item_ptr_;
- DISALLOW_COPY_AND_ASSIGN(MapNoStlItem);
-};
-
-class MapNoStl
-{
-public:
- MapNoStl();
- virtual ~MapNoStl();
-
- // MapWrapper functions.
- int Insert(int id, void* ptr);
- int Erase(MapNoStlItem* item);
- int Erase(int id);
- int Size() const;
- MapNoStlItem* First() const;
- MapNoStlItem* Last() const;
- MapNoStlItem* Next(MapNoStlItem* item) const;
- MapNoStlItem* Previous(MapNoStlItem* item) const;
- MapNoStlItem* Find(int id) const;
-
-private:
- MapNoStlItem* Locate(int id) const;
- int Remove(MapNoStlItem* item);
-
- CriticalSection* critical_section_;
- MapNoStlItem* first_;
- MapNoStlItem* last_;
- int size_;
- DISALLOW_COPY_AND_ASSIGN(MapNoStl);
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_MAP_NO_STL_H_
diff --git a/src/system_wrappers/source/map_unittest.cc b/src/system_wrappers/source/map_unittest.cc
deleted file mode 100644
index 8e8ea07..0000000
--- a/src/system_wrappers/source/map_unittest.cc
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "gtest/gtest.h"
-
-#include "map_wrapper.h"
-
-using ::webrtc::MapWrapper;
-using ::webrtc::MapItem;
-
-const unsigned int kNumberOfElements = 10;
-
-int* ItemPointer(MapItem* item) {
- if (item == NULL) {
- return NULL;
- }
- return reinterpret_cast<int*>(item->GetItem());
-}
-
-bool DeleteItemContent(MapItem* item) {
- if(item == NULL) {
- return false;
- }
- int* value_ptr = ItemPointer(item);
- delete value_ptr;
- return true;
-}
-
-int ItemValue(MapItem* item) {
- if (item == NULL) {
- return -1;
- }
- const int* value_ptr = ItemPointer(item);
- if (value_ptr == 0) {
- return -1;
- }
- return *value_ptr;
-}
-
-void PrintToConsole(const char* message, bool supress) {
- if (supress) {
- return;
- }
- printf(message);
-}
-
-bool CreateAscendingMap(MapWrapper* ascending_map) {
- int* insert_value = NULL;
- for (int i = 0; i < kNumberOfElements; ++i) {
- insert_value = new int;
- if (insert_value == NULL) {
- return false;
- }
- *insert_value = i;
- if (0 != ascending_map->Insert(
- i,
- reinterpret_cast<void*>(insert_value))) {
- return false;
- }
- }
- return true;
-}
-
-bool ClearMap(MapWrapper* clear_map) {
- bool success = true;
- while (clear_map->Size() != 0) {
- MapItem* remove_item = clear_map->First();
- if (remove_item == NULL) {
- return false;
- }
- if (!DeleteItemContent(remove_item)) {
- success = false;
- }
- if (clear_map->Erase(remove_item) != 0) {
- return false;
- }
- }
- return success;
-}
-
-void PrintMapItem(MapItem* item, bool supress) {
- const int id = item->GetId();
- const int value = ItemValue(item);
- char print_buffer[16];
- sprintf(print_buffer, "(%3i,%3i) ", id, value);
- PrintToConsole(print_buffer, supress);
-}
-
-// Succeeds only if all the items were printed.
-bool PrintMap(const MapWrapper& print_map, bool supress) {
- const int elements_to_print = print_map.Size();
- int elements_printed = 0;
- MapItem* item = print_map.First();
- PrintToConsole("[", supress);
- while (item != NULL) {
- PrintMapItem(item, supress);
- ++elements_printed;
- item = print_map.Next(item);
- }
- PrintToConsole("]\n", supress);
- return elements_printed == elements_to_print;
-}
-
-// Succeeds only if all the items were printed.
-bool ReversePrintMap(const MapWrapper& print_map, bool supress) {
- const int elements_to_print = print_map.Size();
- int elements_printed = 0;
- MapItem* item = print_map.Last();
- PrintToConsole("[", supress);
- while (item != NULL) {
- PrintMapItem(item, supress);
- ++elements_printed;
- item = print_map.Previous(item);
- }
- PrintToConsole("]\n", supress);
- return elements_printed == elements_to_print;
-}
-
-// Returns true if the map items contain the same item.
-bool CompareItems(MapItem* lhs_item, MapItem* rhs_item) {
- if ((lhs_item == NULL) || (rhs_item == NULL)) {
- return false;
- }
- if (lhs_item->GetId() != rhs_item->GetId()) {
- return false;
- }
- return lhs_item->GetItem() == rhs_item->GetItem();
-}
-
-// Returns true if the map contains the same items.
-bool CompareMaps(const MapWrapper& lhs, const MapWrapper& rhs) {
- const int map_size = lhs.Size();
- if (map_size != rhs.Size()) {
- return false;
- }
- int item_count = 0;
- MapItem* lhs_item = lhs.First();
- while (lhs_item != NULL) {
- MapItem* rhs_item = rhs.Find(lhs_item->GetId());
- if (rhs_item == NULL) {
- return false;
- }
- if (!CompareItems(lhs_item, rhs_item)) {
- return false;
- }
- ++item_count;
- lhs_item = lhs.Next(lhs_item);
- }
- return item_count == map_size;
-}
-
-class MapWrapperTest : public ::testing::Test {
-protected:
- virtual void SetUp() {
- ASSERT_TRUE(CreateAscendingMap(&ascending_map_));
- }
-
- virtual void TearDown() {
- EXPECT_TRUE(ClearMap(&ascending_map_));
- }
- MapWrapper ascending_map_;
-};
-
-TEST_F(MapWrapperTest,RemoveTest) {
- // Erase using int id
- { // Create local scope to avoid accidental re-use
- MapItem* item_first = ascending_map_.First();
- ASSERT_FALSE(item_first == NULL);
- const int first_value_id = item_first->GetId();
- const int first_value = ItemValue(item_first);
- EXPECT_TRUE(first_value == 0);
- EXPECT_EQ(first_value_id,first_value);
- EXPECT_FALSE(NULL == ascending_map_.Find(first_value_id));
- EXPECT_TRUE(DeleteItemContent(item_first));
- ascending_map_.Erase(first_value_id);
- EXPECT_TRUE(NULL == ascending_map_.Find(first_value_id));
- EXPECT_EQ(kNumberOfElements-1,ascending_map_.Size());
- }
-
- // Erase using MapItem* item
- MapItem* item_last = ascending_map_.Last();
- ASSERT_FALSE(item_last == NULL);
- const int last_value_id = item_last->GetId();
- const int last_value = ItemValue(item_last);
- EXPECT_TRUE(last_value == kNumberOfElements - 1);
- EXPECT_EQ(last_value_id, last_value);
- EXPECT_FALSE(NULL == ascending_map_.Find(last_value_id));
- EXPECT_TRUE(DeleteItemContent(item_last));
- ascending_map_.Erase(last_value_id);
- EXPECT_TRUE(NULL == ascending_map_.Find(last_value_id));
- EXPECT_EQ(kNumberOfElements-2,ascending_map_.Size());
-}
-
-TEST_F(MapWrapperTest, PrintTest) {
- const bool supress = true; // Don't spam the console
-
- EXPECT_TRUE(PrintMap(ascending_map_, supress));
- EXPECT_TRUE(ReversePrintMap(ascending_map_, supress));
-}
-
-TEST_F(MapWrapperTest, CopyTest) {
- MapWrapper compare_map;
- ASSERT_TRUE(CreateAscendingMap(&compare_map));
- const int map_size = compare_map.Size();
- ASSERT_EQ(ascending_map_.Size(), map_size);
- // CompareMaps compare the pointers not value of the pointers.
- // (the values are the same since both are ascending maps).
- EXPECT_FALSE(CompareMaps(compare_map,ascending_map_));
-
- int copy_count = 0;
- MapItem* ascend_item = ascending_map_.First();
- while (ascend_item != NULL) {
- MapItem* compare_item = compare_map.Find(ascend_item->GetId());
- ASSERT_FALSE(compare_item == NULL);
- DeleteItemContent(compare_item);
- compare_item->SetItem(ascend_item->GetItem());
- ascend_item = ascending_map_.Next(ascend_item);
- ++copy_count;
- }
- EXPECT_TRUE(CompareMaps(compare_map,ascending_map_));
- while (compare_map.Erase(compare_map.First()) == 0) {
- }
- EXPECT_EQ(map_size, copy_count);
-}
diff --git a/src/system_wrappers/source/rw_lock.cc b/src/system_wrappers/source/rw_lock.cc
deleted file mode 100644
index 47901d3..0000000
--- a/src/system_wrappers/source/rw_lock.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "rw_lock_wrapper.h"
-
-#include <assert.h>
-
-#if defined(_WIN32)
- #include "rw_lock_windows.h"
-#elif defined(ANDROID)
- #include <stdlib.h>
- #include "rw_lock_generic.h"
-#else
- #include "rw_lock_linux.h"
-#endif
-
-namespace webrtc {
-RWLockWrapper* RWLockWrapper::CreateRWLock()
-{
-#ifdef _WIN32
- RWLockWrapper* lock = new RWLockWindows();
-#elif defined(ANDROID)
- RWLockWrapper* lock = new RWLockWrapperGeneric();
-#else
- RWLockWrapper* lock = new RWLockLinux();
-#endif
- if(lock->Init() != 0)
- {
- delete lock;
- assert(false);
- return NULL;
- }
- return lock;
-}
-
-RWLockWrapper::~RWLockWrapper()
-{
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/rw_lock_generic.cc b/src/system_wrappers/source/rw_lock_generic.cc
deleted file mode 100644
index a468ef3..0000000
--- a/src/system_wrappers/source/rw_lock_generic.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "rw_lock_generic.h"
-
-#include "condition_variable_wrapper.h"
-#include "critical_section_wrapper.h"
-
-namespace webrtc {
-RWLockWrapperGeneric::RWLockWrapperGeneric()
- : _readersActive(0),
- _writerActive(false),
- _readersWaiting(0),
- _writersWaiting(0)
-{
- _critSectPtr = CriticalSectionWrapper::CreateCriticalSection();
- _readCondPtr = ConditionVariableWrapper::CreateConditionVariable();
- _writeCondPtr = ConditionVariableWrapper::CreateConditionVariable();
-}
-
-RWLockWrapperGeneric::~RWLockWrapperGeneric()
-{
- delete _writeCondPtr;
- delete _readCondPtr;
- delete _critSectPtr;
-}
-
-int RWLockWrapperGeneric::Init()
-{
- return 0;
-}
-
-void RWLockWrapperGeneric::AcquireLockExclusive()
-{
- _critSectPtr->Enter();
-
- if (_writerActive || _readersActive > 0)
- {
- ++_writersWaiting;
-
- while (_writerActive || _readersActive > 0)
- {
- _writeCondPtr->SleepCS(*_critSectPtr);
- }
-
- --_writersWaiting;
- }
- _writerActive = true;
- _critSectPtr->Leave();
-}
-
-void RWLockWrapperGeneric::ReleaseLockExclusive()
-{
- _critSectPtr->Enter();
-
- _writerActive = false;
-
- if (_writersWaiting > 0)
- {
- _writeCondPtr->Wake();
-
- }else if (_readersWaiting > 0)
- {
- _readCondPtr->WakeAll();
- }
- _critSectPtr->Leave();
-}
-
-void RWLockWrapperGeneric::AcquireLockShared()
-{
- _critSectPtr->Enter();
-
- if (_writerActive || _writersWaiting > 0)
- {
- ++_readersWaiting;
-
- while (_writerActive || _writersWaiting > 0)
- {
- _readCondPtr->SleepCS(*_critSectPtr);
- }
- --_readersWaiting;
- }
- ++_readersActive;
- _critSectPtr->Leave();
-}
-
-void RWLockWrapperGeneric::ReleaseLockShared()
-{
- _critSectPtr->Enter();
-
- --_readersActive;
-
- if (_readersActive == 0 && _writersWaiting > 0)
- {
- _writeCondPtr->Wake();
- }
- _critSectPtr->Leave();
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/rw_lock_generic.h b/src/system_wrappers/source/rw_lock_generic.h
deleted file mode 100644
index fff5e5d..0000000
--- a/src/system_wrappers/source/rw_lock_generic.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_RW_LOCK_GENERIC_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_RW_LOCK_GENERIC_H_
-
-#include "rw_lock_wrapper.h"
-
-namespace webrtc {
-class CriticalSectionWrapper;
-class ConditionVariableWrapper;
-
-class RWLockWrapperGeneric : public RWLockWrapper
-{
-public:
- RWLockWrapperGeneric();
- virtual ~RWLockWrapperGeneric();
-
- virtual void AcquireLockExclusive();
- virtual void ReleaseLockExclusive();
-
- virtual void AcquireLockShared();
- virtual void ReleaseLockShared();
-
-protected:
- virtual int Init();
-
-private:
- CriticalSectionWrapper* _critSectPtr;
- ConditionVariableWrapper* _readCondPtr;
- ConditionVariableWrapper* _writeCondPtr;
-
- int _readersActive;
- bool _writerActive;
- int _readersWaiting;
- int _writersWaiting;
-};
-} // namespace webrtc
-#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_RW_LOCK_GENERIC_H_
diff --git a/src/system_wrappers/source/rw_lock_linux.cc b/src/system_wrappers/source/rw_lock_linux.cc
deleted file mode 100644
index 084dce8..0000000
--- a/src/system_wrappers/source/rw_lock_linux.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "rw_lock_linux.h"
-
-namespace webrtc {
-RWLockLinux::RWLockLinux() : _lock()
-{
-}
-
-RWLockLinux::~RWLockLinux()
-{
- pthread_rwlock_destroy(&_lock);
-}
-
-int RWLockLinux::Init()
-{
- return pthread_rwlock_init(&_lock, 0);
-}
-
-void RWLockLinux::AcquireLockExclusive()
-{
- pthread_rwlock_wrlock(&_lock);
-}
-
-void RWLockLinux::ReleaseLockExclusive()
-{
- pthread_rwlock_unlock(&_lock);
-}
-
-void RWLockLinux::AcquireLockShared()
-{
- pthread_rwlock_rdlock(&_lock);
-}
-
-void RWLockLinux::ReleaseLockShared()
-{
- pthread_rwlock_unlock(&_lock);
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/rw_lock_linux.h b/src/system_wrappers/source/rw_lock_linux.h
deleted file mode 100644
index 391ee8f..0000000
--- a/src/system_wrappers/source/rw_lock_linux.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_RW_LOCK_LINUX_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_RW_LOCK_LINUX_H_
-
-#include "rw_lock_wrapper.h"
-
-#include <pthread.h>
-
-namespace webrtc {
-class RWLockLinux : public RWLockWrapper
-{
-public:
- RWLockLinux();
- virtual ~RWLockLinux();
-
- virtual void AcquireLockExclusive();
- virtual void ReleaseLockExclusive();
-
- virtual void AcquireLockShared();
- virtual void ReleaseLockShared();
-
-protected:
- virtual int Init();
-
-private:
- pthread_rwlock_t _lock;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_RW_LOCK_LINUX_H_
diff --git a/src/system_wrappers/source/sort.cc b/src/system_wrappers/source/sort.cc
deleted file mode 100644
index f44b644..0000000
--- a/src/system_wrappers/source/sort.cc
+++ /dev/null
@@ -1,551 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-// When the platform supports STL, the functions are implemented using a
-// templated spreadsort algorithm (http://sourceforge.net/projects/spreadsort/),
-// part of the Boost C++ library collection. Otherwise, the C standard library's
-// qsort() will be used.
-
-#include "sort.h"
-
-#include <cassert>
-#include <cstring> // memcpy
-#include <new> // nothrow new
-
-#ifdef NO_STL
-#include <cstdlib> // qsort
-#else
-#include <algorithm> // std::sort
-#include <vector>
-#include "spreadsort.hpp" // TODO (ajm) upgrade to spreadsortv2.
-#endif
-
-#ifdef NO_STL
-#define COMPARE_DEREFERENCED(XT, YT) \
- do \
- { \
- if ((XT) > (YT)) \
- { \
- return 1; \
- } \
- else if ((XT) < (YT)) \
- { \
- return -1; \
- } \
- \
- return 0; \
- } \
- while(0)
-
-#define COMPARE_FOR_QSORT(X, Y, TYPE) \
- do \
- { \
- TYPE xT = static_cast<TYPE>(*static_cast<const TYPE*>(X)); \
- TYPE yT = static_cast<TYPE>(*static_cast<const TYPE*>(Y)); \
- COMPARE_DEREFERENCED(xT, yT); \
- } \
- while(0)
-
-#define COMPARE_KEY_FOR_QSORT(SORT_KEY_X, SORT_KEY_Y, TYPE) \
- do \
- { \
- TYPE xT = static_cast<TYPE>(*static_cast<TYPE*> \
- (static_cast<const SortKey*>(SORT_KEY_X)->key)); \
- TYPE yT = static_cast<TYPE>(*static_cast<TYPE*> \
- (static_cast<const SortKey*>(SORT_KEY_Y)->key)); \
- COMPARE_DEREFERENCED(xT, yT); \
- } \
- while(0)
-
-#define KEY_QSORT(SORT_KEY, KEY, NUM_OF_ELEMENTS, KEY_TYPE, COMPARE_FUNC) \
- do \
- { \
- KEY_TYPE* keyT = (KEY_TYPE*)(key); \
- for (WebRtc_UWord32 i = 0; i < (NUM_OF_ELEMENTS); i++) \
- { \
- ptrSortKey[i].key = &keyT[i]; \
- ptrSortKey[i].index = i; \
- } \
- \
- qsort((SORT_KEY), (NUM_OF_ELEMENTS), sizeof(SortKey), (COMPARE_FUNC));\
- } \
- while(0)
-#endif
-
-namespace webrtc
-{
-#ifdef NO_STL
- struct SortKey
- {
- void* key;
- WebRtc_UWord32 index;
- };
-#else
- template<typename KeyType>
- struct SortKey
- {
- KeyType key;
- WebRtc_UWord32 index;
- };
-#endif
-
- namespace // Unnamed namespace provides internal linkage.
- {
-#ifdef NO_STL
- int CompareWord8(const void* x, const void* y)
- {
- COMPARE_FOR_QSORT(x, y, WebRtc_Word8);
- }
-
- int CompareUWord8(const void* x, const void* y)
- {
- COMPARE_FOR_QSORT(x, y, WebRtc_UWord8);
- }
-
- int CompareWord16(const void* x, const void* y)
- {
- COMPARE_FOR_QSORT(x, y, WebRtc_Word16);
- }
-
- int CompareUWord16(const void* x, const void* y)
- {
- COMPARE_FOR_QSORT(x, y, WebRtc_UWord16);
- }
-
- int CompareWord32(const void* x, const void* y)
- {
- COMPARE_FOR_QSORT(x, y, WebRtc_Word32);
- }
-
- int CompareUWord32(const void* x, const void* y)
- {
- COMPARE_FOR_QSORT(x, y, WebRtc_UWord32);
- }
-
- int CompareWord64(const void* x, const void* y)
- {
- COMPARE_FOR_QSORT(x, y, WebRtc_Word64);
- }
-
- int CompareUWord64(const void* x, const void* y)
- {
- COMPARE_FOR_QSORT(x, y, WebRtc_UWord64);
- }
-
- int CompareFloat32(const void* x, const void* y)
- {
- COMPARE_FOR_QSORT(x, y, float);
- }
-
- int CompareFloat64(const void* x, const void* y)
- {
- COMPARE_FOR_QSORT(x, y, double);
- }
-
- int CompareKeyWord8(const void* sortKeyX, const void* sortKeyY)
- {
- COMPARE_KEY_FOR_QSORT(sortKeyX, sortKeyY, WebRtc_Word8);
- }
-
- int CompareKeyUWord8(const void* sortKeyX, const void* sortKeyY)
- {
- COMPARE_KEY_FOR_QSORT(sortKeyX, sortKeyY, WebRtc_UWord8);
- }
-
- int CompareKeyWord16(const void* sortKeyX, const void* sortKeyY)
- {
- COMPARE_KEY_FOR_QSORT(sortKeyX, sortKeyY, WebRtc_Word16);
- }
-
- int CompareKeyUWord16(const void* sortKeyX, const void* sortKeyY)
- {
- COMPARE_KEY_FOR_QSORT(sortKeyX, sortKeyY, WebRtc_UWord16);
- }
-
- int CompareKeyWord32(const void* sortKeyX, const void* sortKeyY)
- {
- COMPARE_KEY_FOR_QSORT(sortKeyX, sortKeyY, WebRtc_Word32);
- }
-
- int CompareKeyUWord32(const void* sortKeyX, const void* sortKeyY)
- {
- COMPARE_KEY_FOR_QSORT(sortKeyX, sortKeyY, WebRtc_UWord32);
- }
-
- int CompareKeyWord64(const void* sortKeyX, const void* sortKeyY)
- {
- COMPARE_KEY_FOR_QSORT(sortKeyX, sortKeyY, WebRtc_Word64);
- }
-
- int CompareKeyUWord64(const void* sortKeyX, const void* sortKeyY)
- {
- COMPARE_KEY_FOR_QSORT(sortKeyX, sortKeyY, WebRtc_UWord64);
- }
-
- int CompareKeyFloat32(const void* sortKeyX, const void* sortKeyY)
- {
- COMPARE_KEY_FOR_QSORT(sortKeyX, sortKeyY, float);
- }
-
- int CompareKeyFloat64(const void* sortKeyX, const void* sortKeyY)
- {
- COMPARE_KEY_FOR_QSORT(sortKeyX, sortKeyY, double);
- }
-#else
- template <typename KeyType>
- struct KeyLessThan
- {
- bool operator()(const SortKey<KeyType>& sortKeyX,
- const SortKey<KeyType>& sortKeyY) const
- {
- return sortKeyX.key < sortKeyY.key;
- }
- };
-
- template <typename KeyType>
- struct KeyRightShift
- {
- KeyType operator()(const SortKey<KeyType>& sortKey,
- const unsigned offset) const
- {
- return sortKey.key >> offset;
- }
- };
-
- template <typename DataType>
- inline void IntegerSort(void* data, WebRtc_UWord32 numOfElements)
- {
- DataType* dataT = static_cast<DataType*>(data);
- boost::integer_sort(dataT, dataT + numOfElements);
- }
-
- template <typename DataType, typename IntegerType>
- inline void FloatSort(void* data, WebRtc_UWord32 numOfElements)
- {
- DataType* dataT = static_cast<DataType*>(data);
- IntegerType cVal = 0;
- boost::float_sort_cast(dataT, dataT + numOfElements, cVal);
- }
-
- template <typename DataType>
- inline void StdSort(void* data, WebRtc_UWord32 numOfElements)
- {
- DataType* dataT = static_cast<DataType*>(data);
- std::sort(dataT, dataT + numOfElements);
- }
-
- template<typename KeyType>
- inline WebRtc_Word32 SetupKeySort(void* key,
- SortKey<KeyType>*& ptrSortKey,
- WebRtc_UWord32 numOfElements)
- {
- ptrSortKey = new(std::nothrow) SortKey<KeyType>[numOfElements];
- if (ptrSortKey == NULL)
- {
- return -1;
- }
-
- KeyType* keyT = static_cast<KeyType*>(key);
- for (WebRtc_UWord32 i = 0; i < numOfElements; i++)
- {
- ptrSortKey[i].key = keyT[i];
- ptrSortKey[i].index = i;
- }
-
- return 0;
- }
-
- template<typename KeyType>
- inline WebRtc_Word32 TeardownKeySort(void* data,
- SortKey<KeyType>* ptrSortKey,
- WebRtc_UWord32 numOfElements, WebRtc_UWord32 sizeOfElement)
- {
- WebRtc_UWord8* ptrData = static_cast<WebRtc_UWord8*>(data);
- WebRtc_UWord8* ptrDataSorted = new(std::nothrow) WebRtc_UWord8
- [numOfElements * sizeOfElement];
- if (ptrDataSorted == NULL)
- {
- return -1;
- }
-
- for (WebRtc_UWord32 i = 0; i < numOfElements; i++)
- {
- memcpy(ptrDataSorted + i * sizeOfElement, ptrData +
- ptrSortKey[i].index * sizeOfElement, sizeOfElement);
- }
- memcpy(ptrData, ptrDataSorted, numOfElements * sizeOfElement);
- delete[] ptrSortKey;
- delete[] ptrDataSorted;
- return 0;
- }
-
- template<typename KeyType>
- inline WebRtc_Word32 IntegerKeySort(void* data, void* key,
- WebRtc_UWord32 numOfElements,
- WebRtc_UWord32 sizeOfElement)
- {
- SortKey<KeyType>* ptrSortKey;
- if (SetupKeySort<KeyType>(key, ptrSortKey, numOfElements) != 0)
- {
- return -1;
- }
-
- boost::integer_sort(ptrSortKey, ptrSortKey + numOfElements,
- KeyRightShift<KeyType>(), KeyLessThan<KeyType>());
-
- if (TeardownKeySort<KeyType>(data, ptrSortKey, numOfElements,
- sizeOfElement) != 0)
- {
- return -1;
- }
-
- return 0;
- }
-
- template<typename KeyType>
- inline WebRtc_Word32 StdKeySort(void* data, void* key,
- WebRtc_UWord32 numOfElements,
- WebRtc_UWord32 sizeOfElement)
- {
- SortKey<KeyType>* ptrSortKey;
- if (SetupKeySort<KeyType>(key, ptrSortKey, numOfElements) != 0)
- {
- return -1;
- }
-
- std::sort(ptrSortKey, ptrSortKey + numOfElements,
- KeyLessThan<KeyType>());
-
- if (TeardownKeySort<KeyType>(data, ptrSortKey, numOfElements,
- sizeOfElement) != 0)
- {
- return -1;
- }
-
- return 0;
- }
-#endif
- }
-
- WebRtc_Word32 Sort(void* data, WebRtc_UWord32 numOfElements, Type type)
- {
- if (data == NULL)
- {
- return -1;
- }
-
-#ifdef NO_STL
- switch (type)
- {
- case TYPE_Word8:
- qsort(data, numOfElements, sizeof(WebRtc_Word8), CompareWord8);
- break;
- case TYPE_UWord8:
- qsort(data, numOfElements, sizeof(WebRtc_UWord8), CompareUWord8);
- break;
- case TYPE_Word16:
- qsort(data, numOfElements, sizeof(WebRtc_Word16), CompareWord16);
- break;
- case TYPE_UWord16:
- qsort(data, numOfElements, sizeof(WebRtc_UWord16), CompareUWord16);
- break;
- case TYPE_Word32:
- qsort(data, numOfElements, sizeof(WebRtc_Word32), CompareWord32);
- break;
- case TYPE_UWord32:
- qsort(data, numOfElements, sizeof(WebRtc_UWord32), CompareUWord32);
- break;
- case TYPE_Word64:
- qsort(data, numOfElements, sizeof(WebRtc_Word64), CompareWord64);
- break;
- case TYPE_UWord64:
- qsort(data, numOfElements, sizeof(WebRtc_UWord64), CompareUWord64);
- break;
- case TYPE_Float32:
- qsort(data, numOfElements, sizeof(float), CompareFloat32);
- break;
- case TYPE_Float64:
- qsort(data, numOfElements, sizeof(double), CompareFloat64);
- break;
- default:
- return -1;
- }
-#else
- // Fall back to std::sort for 64-bit types and floats due to compiler
- // warnings and VS 2003 build crashes respectively with spreadsort.
- switch (type)
- {
- case TYPE_Word8:
- IntegerSort<WebRtc_Word8>(data, numOfElements);
- break;
- case TYPE_UWord8:
- IntegerSort<WebRtc_UWord8>(data, numOfElements);
- break;
- case TYPE_Word16:
- IntegerSort<WebRtc_Word16>(data, numOfElements);
- break;
- case TYPE_UWord16:
- IntegerSort<WebRtc_UWord16>(data, numOfElements);
- break;
- case TYPE_Word32:
- IntegerSort<WebRtc_Word32>(data, numOfElements);
- break;
- case TYPE_UWord32:
- IntegerSort<WebRtc_UWord32>(data, numOfElements);
- break;
- case TYPE_Word64:
- StdSort<WebRtc_Word64>(data, numOfElements);
- break;
- case TYPE_UWord64:
- StdSort<WebRtc_UWord64>(data, numOfElements);
- break;
- case TYPE_Float32:
- StdSort<float>(data, numOfElements);
- break;
- case TYPE_Float64:
- StdSort<double>(data, numOfElements);
- break;
- default:
- return -1;
- }
-#endif
- return 0;
- }
-
- WebRtc_Word32 KeySort(void* data, void* key, WebRtc_UWord32 numOfElements,
- WebRtc_UWord32 sizeOfElement, Type keyType)
- {
- if (data == NULL)
- {
- return -1;
- }
-
- if (key == NULL)
- {
- return -1;
- }
-
- if ((WebRtc_UWord64)numOfElements * sizeOfElement > 0xffffffff)
- {
- return -1;
- }
-
-#ifdef NO_STL
- SortKey* ptrSortKey = new(std::nothrow) SortKey[numOfElements];
- if (ptrSortKey == NULL)
- {
- return -1;
- }
-
- switch (keyType)
- {
- case TYPE_Word8:
- KEY_QSORT(ptrSortKey, key, numOfElements, WebRtc_Word8,
- CompareKeyWord8);
- break;
- case TYPE_UWord8:
- KEY_QSORT(ptrSortKey, key, numOfElements, WebRtc_UWord8,
- CompareKeyUWord8);
- break;
- case TYPE_Word16:
- KEY_QSORT(ptrSortKey, key, numOfElements, WebRtc_Word16,
- CompareKeyWord16);
- break;
- case TYPE_UWord16:
- KEY_QSORT(ptrSortKey, key, numOfElements, WebRtc_UWord16,
- CompareKeyUWord16);
- break;
- case TYPE_Word32:
- KEY_QSORT(ptrSortKey, key, numOfElements, WebRtc_Word32,
- CompareKeyWord32);
- break;
- case TYPE_UWord32:
- KEY_QSORT(ptrSortKey, key, numOfElements, WebRtc_UWord32,
- CompareKeyUWord32);
- break;
- case TYPE_Word64:
- KEY_QSORT(ptrSortKey, key, numOfElements, WebRtc_Word64,
- CompareKeyWord64);
- break;
- case TYPE_UWord64:
- KEY_QSORT(ptrSortKey, key, numOfElements, WebRtc_UWord64,
- CompareKeyUWord64);
- break;
- case TYPE_Float32:
- KEY_QSORT(ptrSortKey, key, numOfElements, float,
- CompareKeyFloat32);
- break;
- case TYPE_Float64:
- KEY_QSORT(ptrSortKey, key, numOfElements, double,
- CompareKeyFloat64);
- break;
- default:
- return -1;
- }
-
- // Shuffle into sorted position based on index map.
- WebRtc_UWord8* ptrData = static_cast<WebRtc_UWord8*>(data);
- WebRtc_UWord8* ptrDataSorted = new(std::nothrow) WebRtc_UWord8
- [numOfElements * sizeOfElement];
- if (ptrDataSorted == NULL)
- {
- return -1;
- }
-
- for (WebRtc_UWord32 i = 0; i < numOfElements; i++)
- {
- memcpy(ptrDataSorted + i * sizeOfElement, ptrData +
- ptrSortKey[i].index * sizeOfElement, sizeOfElement);
- }
- memcpy(ptrData, ptrDataSorted, numOfElements * sizeOfElement);
-
- delete[] ptrSortKey;
- delete[] ptrDataSorted;
-
- return 0;
-#else
- // Fall back to std::sort for 64-bit types and floats due to compiler
- // warnings and errors respectively with spreadsort.
- switch (keyType)
- {
- case TYPE_Word8:
- return IntegerKeySort<WebRtc_Word8>(data, key, numOfElements,
- sizeOfElement);
- case TYPE_UWord8:
- return IntegerKeySort<WebRtc_UWord8>(data, key, numOfElements,
- sizeOfElement);
- case TYPE_Word16:
- return IntegerKeySort<WebRtc_Word16>(data, key, numOfElements,
- sizeOfElement);
- case TYPE_UWord16:
- return IntegerKeySort<WebRtc_UWord16>(data, key, numOfElements,
- sizeOfElement);
- case TYPE_Word32:
- return IntegerKeySort<WebRtc_Word32>(data, key, numOfElements,
- sizeOfElement);
- case TYPE_UWord32:
- return IntegerKeySort<WebRtc_UWord32>(data, key, numOfElements,
- sizeOfElement);
- case TYPE_Word64:
- return StdKeySort<WebRtc_Word64>(data, key, numOfElements,
- sizeOfElement);
- case TYPE_UWord64:
- return StdKeySort<WebRtc_UWord64>(data, key, numOfElements,
- sizeOfElement);
- case TYPE_Float32:
- return StdKeySort<float>(data, key, numOfElements, sizeOfElement);
- case TYPE_Float64:
- return StdKeySort<double>(data, key, numOfElements, sizeOfElement);
- default:
- return -1;
- }
-#endif
- }
-} // namespace webrtc
diff --git a/src/system_wrappers/source/spreadsortlib/constants.hpp b/src/system_wrappers/source/spreadsortlib/constants.hpp
deleted file mode 100644
index fa81ece..0000000
--- a/src/system_wrappers/source/spreadsortlib/constants.hpp
+++ /dev/null
@@ -1,42 +0,0 @@
-/*Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.*/
-#ifndef BOOST_SPREADSORT_CONSTANTS
-#define BOOST_SPREADSORT_CONSTANTS
-namespace boost {
-namespace detail {
-//Tuning constants
-//Sets the minimum number of items per bin.
-static const unsigned LOG_MEAN_BIN_SIZE = 2;
-//This should be tuned to your processor cache; if you go too large you get cache misses on bins
-//The smaller this number, the less worst-case memory usage. If too small, too many recursions slow down spreadsort
-static const unsigned MAX_SPLITS = 10;
-//Used to force a comparison-based sorting for small bins, if it's faster. Minimum value 0
-static const unsigned LOG_MIN_SPLIT_COUNT = 5;
-//There is a minimum size below which it is not worth using spreadsort
-static const long MIN_SORT_SIZE = 1000;
-//This is the constant on the log base n of m calculation; make this larger the faster std::sort is relative to spreadsort
-static const unsigned LOG_CONST = 2;
-}
-}
-#endif
diff --git a/src/system_wrappers/source/spreadsortlib/spreadsort.hpp b/src/system_wrappers/source/spreadsortlib/spreadsort.hpp
deleted file mode 100644
index 2d1529a..0000000
--- a/src/system_wrappers/source/spreadsortlib/spreadsort.hpp
+++ /dev/null
@@ -1,1688 +0,0 @@
-//Templated spread_sort library
-
-// Copyright Steven J. Ross 2001 - 2009.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/ for updates, documentation, and revision history.
-
-/*
-Some improvements suggested by:
-Phil Endecott and Frank Gennari
-Cygwin fix provided by:
-Scott McMurray
-*/
-
-#ifndef BOOST_SPREAD_SORT_H
-#define BOOST_SPREAD_SORT_H
-#include <algorithm>
-#include <vector>
-#include "constants.hpp"
-#include <cstring>
-
-namespace boost {
- namespace detail {
- //This only works on unsigned data types
- template <typename T>
- inline unsigned
- rough_log_2_size(const T& input)
- {
- unsigned result = 0;
- //The && is necessary on some compilers to avoid infinite loops; it doesn't significantly impair performance
- while((input >> result) && (result < (8*sizeof(T)))) ++result;
- return result;
- }
-
- //Gets the maximum size which we'll call spread_sort on to control worst-case performance
- //Maintains both a minimum size to recurse and a check of distribution size versus count
- //This is called for a set of bins, instead of bin-by-bin, to avoid performance overhead
- inline size_t
- get_max_count(unsigned log_range, size_t count)
- {
- unsigned divisor = rough_log_2_size(count);
- //Making sure the divisor is positive
- if(divisor > LOG_MEAN_BIN_SIZE)
- divisor -= LOG_MEAN_BIN_SIZE;
- else
- divisor = 1;
- unsigned relative_width = (LOG_CONST * log_range)/((divisor > MAX_SPLITS) ? MAX_SPLITS : divisor);
- //Don't try to bitshift more than the size of an element
- if((8*sizeof(size_t)) <= relative_width)
- relative_width = (8*sizeof(size_t)) - 1;
- return (size_t)1 << ((relative_width < (LOG_MEAN_BIN_SIZE + LOG_MIN_SPLIT_COUNT)) ?
- (LOG_MEAN_BIN_SIZE + LOG_MIN_SPLIT_COUNT) : relative_width);
- }
-
- //Find the minimum and maximum using <
- template <class RandomAccessIter>
- inline void
- find_extremes(RandomAccessIter current, RandomAccessIter last, RandomAccessIter & max, RandomAccessIter & min)
- {
- min = max = current;
- //Start from the second item, as max and min are initialized to the first
- while(++current < last) {
- if(*max < *current)
- max = current;
- else if(*current < *min)
- min = current;
- }
- }
-
- //Uses a user-defined comparison operator to find minimum and maximum
- template <class RandomAccessIter, class compare>
- inline void
- find_extremes(RandomAccessIter current, RandomAccessIter last, RandomAccessIter & max, RandomAccessIter & min, compare comp)
- {
- min = max = current;
- while(++current < last) {
- if(comp(*max, *current))
- max = current;
- else if(comp(*current, *min))
- min = current;
- }
- }
-
- //Gets a non-negative right bit shift to operate as a logarithmic divisor
- inline int
- get_log_divisor(size_t count, unsigned log_range)
- {
- int log_divisor;
- //If we can finish in one iteration without exceeding either (2 to the MAX_SPLITS) or n bins, do so
- if((log_divisor = log_range - rough_log_2_size(count)) <= 0 && log_range < MAX_SPLITS)
- log_divisor = 0;
- else {
- //otherwise divide the data into an optimized number of pieces
- log_divisor += LOG_MEAN_BIN_SIZE;
- if(log_divisor < 0)
- log_divisor = 0;
- //Cannot exceed MAX_SPLITS or cache misses slow down bin lookups dramatically
- if((log_range - log_divisor) > MAX_SPLITS)
- log_divisor = log_range - MAX_SPLITS;
- }
- return log_divisor;
- }
-
- template <class RandomAccessIter>
- inline RandomAccessIter *
- size_bins(std::vector<size_t> &bin_sizes, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset, unsigned &cache_end, unsigned bin_count)
- {
- //Assure space for the size of each bin, followed by initializing sizes
- if(bin_count > bin_sizes.size())
- bin_sizes.resize(bin_count);
- for(size_t u = 0; u < bin_count; u++)
- bin_sizes[u] = 0;
- //Make sure there is space for the bins
- cache_end = cache_offset + bin_count;
- if(cache_end > bin_cache.size())
- bin_cache.resize(cache_end);
- return &(bin_cache[cache_offset]);
- }
-
- //Implementation for recursive integer sorting
- template <class RandomAccessIter, class div_type, class data_type>
- inline void
- spread_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
- , std::vector<size_t> &bin_sizes)
- {
- //This step is roughly 10% of runtime, but it helps avoid worst-case behavior and improve behavior with real data
- //If you know the maximum and minimum ahead of time, you can pass those values in and skip this step for the first iteration
- RandomAccessIter max, min;
- find_extremes(first, last, max, min);
- //max and min will be the same (the first item) iff all values are equivalent
- if(max == min)
- return;
- RandomAccessIter * target_bin;
- unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(*max >> 0) - (*min >> 0)));
- div_type div_min = *min >> log_divisor;
- div_type div_max = *max >> log_divisor;
- unsigned bin_count = div_max - div_min + 1;
- unsigned cache_end;
- RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
-
- //Calculating the size of each bin; this takes roughly 10% of runtime
- for (RandomAccessIter current = first; current != last;)
- bin_sizes[(*(current++) >> log_divisor) - div_min]++;
- //Assign the bin positions
- bins[0] = first;
- for(unsigned u = 0; u < bin_count - 1; u++)
- bins[u + 1] = bins[u] + bin_sizes[u];
-
- //Swap into place
- //This dominates runtime, mostly in the swap and bin lookups
- RandomAccessIter nextbinstart = first;
- for(unsigned u = 0; u < bin_count - 1; ++u) {
- RandomAccessIter * local_bin = bins + u;
- nextbinstart += bin_sizes[u];
- //Iterating over each element in this bin
- for(RandomAccessIter current = *local_bin; current < nextbinstart; ++current) {
- //Swapping elements in current into place until the correct element has been swapped in
- for(target_bin = (bins + ((*current >> log_divisor) - div_min)); target_bin != local_bin;
- target_bin = bins + ((*current >> log_divisor) - div_min)) {
- //3-way swap; this is about 1% faster than a 2-way swap with integers
- //The main advantage is less copies are involved per item put in the correct place
- data_type tmp;
- RandomAccessIter b = (*target_bin)++;
- RandomAccessIter * b_bin = bins + ((*b >> log_divisor) - div_min);
- if (b_bin != local_bin) {
- RandomAccessIter c = (*b_bin)++;
- tmp = *c;
- *c = *b;
- }
- else
- tmp = *b;
- *b = *current;
- *current = tmp;
- }
- }
- *local_bin = nextbinstart;
- }
- bins[bin_count - 1] = last;
-
- //If we've bucketsorted, the array is sorted and we should skip recursion
- if(!log_divisor)
- return;
-
- //Recursing; log_divisor is the remaining range
- size_t max_count = get_max_count(log_divisor, last - first);
- RandomAccessIter lastPos = first;
- for(unsigned u = cache_offset; u < cache_end; lastPos = bin_cache[u], ++u) {
- size_t count = bin_cache[u] - lastPos;
- //don't sort unless there are at least two items to compare
- if(count < 2)
- continue;
- //using std::sort if its worst-case is better
- if(count < max_count)
- std::sort(lastPos, bin_cache[u]);
- else
- spread_sort_rec<RandomAccessIter, div_type, data_type>(lastPos, bin_cache[u], bin_cache, cache_end, bin_sizes);
- }
- }
-
- //Generic bitshift-based 3-way swapping code
- template <class RandomAccessIter, class div_type, class data_type, class right_shift>
- inline void inner_swap_loop(RandomAccessIter * bins, const RandomAccessIter & nextbinstart, unsigned ii, right_shift &shift
- , const unsigned log_divisor, const div_type div_min)
- {
- RandomAccessIter * local_bin = bins + ii;
- for(RandomAccessIter current = *local_bin; current < nextbinstart; ++current) {
- for(RandomAccessIter * target_bin = (bins + (shift(*current, log_divisor) - div_min)); target_bin != local_bin;
- target_bin = bins + (shift(*current, log_divisor) - div_min)) {
- data_type tmp;
- RandomAccessIter b = (*target_bin)++;
- RandomAccessIter * b_bin = bins + (shift(*b, log_divisor) - div_min);
- //Three-way swap; if the item to be swapped doesn't belong in the current bin, swap it to where it belongs
- if (b_bin != local_bin) {
- RandomAccessIter c = (*b_bin)++;
- tmp = *c;
- *c = *b;
- }
- //Note: we could increment current once the swap is done in this case, but that seems to impair performance
- else
- tmp = *b;
- *b = *current;
- *current = tmp;
- }
- }
- *local_bin = nextbinstart;
- }
-
- //Standard swapping wrapper for ascending values
- template <class RandomAccessIter, class div_type, class data_type, class right_shift>
- inline void swap_loop(RandomAccessIter * bins, RandomAccessIter & nextbinstart, unsigned ii, right_shift &shift
- , const std::vector<size_t> &bin_sizes, const unsigned log_divisor, const div_type div_min)
- {
- nextbinstart += bin_sizes[ii];
- inner_swap_loop<RandomAccessIter, div_type, data_type, right_shift>(bins, nextbinstart, ii, shift, log_divisor, div_min);
- }
-
- //Functor implementation for recursive sorting
- template <class RandomAccessIter, class div_type, class data_type, class right_shift, class compare>
- inline void
- spread_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
- , std::vector<size_t> &bin_sizes, right_shift shift, compare comp)
- {
- RandomAccessIter max, min;
- find_extremes(first, last, max, min, comp);
- if(max == min)
- return;
- unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(shift(*max, 0)) - (shift(*min, 0))));
- div_type div_min = shift(*min, log_divisor);
- div_type div_max = shift(*max, log_divisor);
- unsigned bin_count = div_max - div_min + 1;
- unsigned cache_end;
- RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
-
- //Calculating the size of each bin
- for (RandomAccessIter current = first; current != last;)
- bin_sizes[shift(*(current++), log_divisor) - div_min]++;
- bins[0] = first;
- for(unsigned u = 0; u < bin_count - 1; u++)
- bins[u + 1] = bins[u] + bin_sizes[u];
-
- //Swap into place
- RandomAccessIter nextbinstart = first;
- for(unsigned u = 0; u < bin_count - 1; ++u)
- swap_loop<RandomAccessIter, div_type, data_type, right_shift>(bins, nextbinstart, u, shift, bin_sizes, log_divisor, div_min);
- bins[bin_count - 1] = last;
-
- //If we've bucketsorted, the array is sorted and we should skip recursion
- if(!log_divisor)
- return;
-
- //Recursing
- size_t max_count = get_max_count(log_divisor, last - first);
- RandomAccessIter lastPos = first;
- for(unsigned u = cache_offset; u < cache_end; lastPos = bin_cache[u], ++u) {
- size_t count = bin_cache[u] - lastPos;
- if(count < 2)
- continue;
- if(count < max_count)
- std::sort(lastPos, bin_cache[u], comp);
- else
- spread_sort_rec<RandomAccessIter, div_type, data_type, right_shift, compare>(lastPos, bin_cache[u], bin_cache, cache_end, bin_sizes, shift, comp);
- }
- }
-
- //Functor implementation for recursive sorting with only Shift overridden
- template <class RandomAccessIter, class div_type, class data_type, class right_shift>
- inline void
- spread_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
- , std::vector<size_t> &bin_sizes, right_shift shift)
- {
- RandomAccessIter max, min;
- find_extremes(first, last, max, min);
- if(max == min)
- return;
- unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(shift(*max, 0)) - (shift(*min, 0))));
- div_type div_min = shift(*min, log_divisor);
- div_type div_max = shift(*max, log_divisor);
- unsigned bin_count = div_max - div_min + 1;
- unsigned cache_end;
- RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
-
- //Calculating the size of each bin
- for (RandomAccessIter current = first; current != last;)
- bin_sizes[shift(*(current++), log_divisor) - div_min]++;
- bins[0] = first;
- for(unsigned u = 0; u < bin_count - 1; u++)
- bins[u + 1] = bins[u] + bin_sizes[u];
-
- //Swap into place
- RandomAccessIter nextbinstart = first;
- for(unsigned ii = 0; ii < bin_count - 1; ++ii)
- swap_loop<RandomAccessIter, div_type, data_type, right_shift>(bins, nextbinstart, ii, shift, bin_sizes, log_divisor, div_min);
- bins[bin_count - 1] = last;
-
- //If we've bucketsorted, the array is sorted and we should skip recursion
- if(!log_divisor)
- return;
-
- //Recursing
- size_t max_count = get_max_count(log_divisor, last - first);
- RandomAccessIter lastPos = first;
- for(unsigned u = cache_offset; u < cache_end; lastPos = bin_cache[u], ++u) {
- size_t count = bin_cache[u] - lastPos;
- if(count < 2)
- continue;
- if(count < max_count)
- std::sort(lastPos, bin_cache[u]);
- else
- spread_sort_rec<RandomAccessIter, div_type, data_type, right_shift>(lastPos, bin_cache[u], bin_cache, cache_end, bin_sizes, shift);
- }
- }
-
- //Holds the bin vector and makes the initial recursive call
- template <class RandomAccessIter, class div_type, class data_type>
- inline void
- spread_sort(RandomAccessIter first, RandomAccessIter last, div_type, data_type)
- {
- std::vector<size_t> bin_sizes;
- std::vector<RandomAccessIter> bin_cache;
- spread_sort_rec<RandomAccessIter, div_type, data_type>(first, last, bin_cache, 0, bin_sizes);
- }
-
- template <class RandomAccessIter, class div_type, class data_type, class right_shift, class compare>
- inline void
- spread_sort(RandomAccessIter first, RandomAccessIter last, div_type, data_type, right_shift shift, compare comp)
- {
- std::vector<size_t> bin_sizes;
- std::vector<RandomAccessIter> bin_cache;
- spread_sort_rec<RandomAccessIter, div_type, data_type, right_shift, compare>(first, last, bin_cache, 0, bin_sizes, shift, comp);
- }
-
- template <class RandomAccessIter, class div_type, class data_type, class right_shift>
- inline void
- spread_sort(RandomAccessIter first, RandomAccessIter last, div_type, data_type, right_shift shift)
- {
- std::vector<size_t> bin_sizes;
- std::vector<RandomAccessIter> bin_cache;
- spread_sort_rec<RandomAccessIter, div_type, data_type, right_shift>(first, last, bin_cache, 0, bin_sizes, shift);
- }
- }
-
- //Top-level sorting call for integers
- template <class RandomAccessIter>
- inline void integer_sort(RandomAccessIter first, RandomAccessIter last)
- {
- //Don't sort if it's too small to optimize
- if(last - first < detail::MIN_SORT_SIZE)
- std::sort(first, last);
- else
- detail::spread_sort(first, last, *first >> 0, *first);
- }
-
- //integer_sort with functors
- template <class RandomAccessIter, class right_shift, class compare>
- inline void integer_sort(RandomAccessIter first, RandomAccessIter last,
- right_shift shift, compare comp) {
- if(last - first < detail::MIN_SORT_SIZE)
- std::sort(first, last, comp);
- else
- detail::spread_sort(first, last, shift(*first, 0), *first, shift, comp);
- }
-
- //integer_sort with right_shift functor
- template <class RandomAccessIter, class right_shift>
- inline void integer_sort(RandomAccessIter first, RandomAccessIter last,
- right_shift shift) {
- if(last - first < detail::MIN_SORT_SIZE)
- std::sort(first, last);
- else
- detail::spread_sort(first, last, shift(*first, 0), *first, shift);
- }
-
- //------------------------------------------------------ float_sort source --------------------------------------
- //Casts a RandomAccessIter to the specified data type
- template<class cast_type, class RandomAccessIter>
- inline cast_type
- cast_float_iter(const RandomAccessIter & floatiter)
- {
- cast_type result;
- std::memcpy(&result, &(*floatiter), sizeof(cast_type));
- return result;
- }
-
- //Casts a data element to the specified datinner_float_a type
- template<class data_type, class cast_type>
- inline cast_type
- mem_cast(const data_type & data)
- {
- cast_type result;
- std::memcpy(&result, &data, sizeof(cast_type));
- return result;
- }
-
- namespace detail {
- template <class RandomAccessIter, class div_type, class right_shift>
- inline void
- find_extremes(RandomAccessIter current, RandomAccessIter last, div_type & max, div_type & min, right_shift shift)
- {
- min = max = shift(*current, 0);
- while(++current < last) {
- div_type value = shift(*current, 0);
- if(max < value)
- max = value;
- else if(value < min)
- min = value;
- }
- }
-
- //Specialized swap loops for floating-point casting
- template <class RandomAccessIter, class div_type, class data_type>
- inline void inner_float_swap_loop(RandomAccessIter * bins, const RandomAccessIter & nextbinstart, unsigned ii
- , const unsigned log_divisor, const div_type div_min)
- {
- RandomAccessIter * local_bin = bins + ii;
- for(RandomAccessIter current = *local_bin; current < nextbinstart; ++current) {
- for(RandomAccessIter * target_bin = (bins + ((cast_float_iter<div_type, RandomAccessIter>(current) >> log_divisor) - div_min)); target_bin != local_bin;
- target_bin = bins + ((cast_float_iter<div_type, RandomAccessIter>(current) >> log_divisor) - div_min)) {
- data_type tmp;
- RandomAccessIter b = (*target_bin)++;
- RandomAccessIter * b_bin = bins + ((cast_float_iter<div_type, RandomAccessIter>(b) >> log_divisor) - div_min);
- //Three-way swap; if the item to be swapped doesn't belong in the current bin, swap it to where it belongs
- if (b_bin != local_bin) {
- RandomAccessIter c = (*b_bin)++;
- tmp = *c;
- *c = *b;
- }
- else
- tmp = *b;
- *b = *current;
- *current = tmp;
- }
- }
- *local_bin = nextbinstart;
- }
-
- template <class RandomAccessIter, class div_type, class data_type>
- inline void float_swap_loop(RandomAccessIter * bins, RandomAccessIter & nextbinstart, unsigned ii
- , const std::vector<size_t> &bin_sizes, const unsigned log_divisor, const div_type div_min)
- {
- nextbinstart += bin_sizes[ii];
- inner_float_swap_loop<RandomAccessIter, div_type, data_type>(bins, nextbinstart, ii, log_divisor, div_min);
- }
-
- template <class RandomAccessIter, class cast_type>
- inline void
- find_extremes(RandomAccessIter current, RandomAccessIter last, cast_type & max, cast_type & min)
- {
- min = max = cast_float_iter<cast_type, RandomAccessIter>(current);
- while(++current < last) {
- cast_type value = cast_float_iter<cast_type, RandomAccessIter>(current);
- if(max < value)
- max = value;
- else if(value < min)
- min = value;
- }
- }
-
- //Special-case sorting of positive floats with casting instead of a right_shift
- template <class RandomAccessIter, class div_type, class data_type>
- inline void
- positive_float_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
- , std::vector<size_t> &bin_sizes)
- {
- div_type max, min;
- find_extremes(first, last, max, min);
- if(max == min)
- return;
- unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(max) - min));
- div_type div_min = min >> log_divisor;
- div_type div_max = max >> log_divisor;
- unsigned bin_count = div_max - div_min + 1;
- unsigned cache_end;
- RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
-
- //Calculating the size of each bin
- for (RandomAccessIter current = first; current != last;)
- bin_sizes[(cast_float_iter<div_type, RandomAccessIter>(current++) >> log_divisor) - div_min]++;
- bins[0] = first;
- for(unsigned u = 0; u < bin_count - 1; u++)
- bins[u + 1] = bins[u] + bin_sizes[u];
-
- //Swap into place
- RandomAccessIter nextbinstart = first;
- for(unsigned u = 0; u < bin_count - 1; ++u)
- float_swap_loop<RandomAccessIter, div_type, data_type>(bins, nextbinstart, u, bin_sizes, log_divisor, div_min);
- bins[bin_count - 1] = last;
-
- //Return if we've completed bucketsorting
- if(!log_divisor)
- return;
-
- //Recursing
- size_t max_count = get_max_count(log_divisor, last - first);
- RandomAccessIter lastPos = first;
- for(unsigned u = cache_offset; u < cache_end; lastPos = bin_cache[u], ++u) {
- size_t count = bin_cache[u] - lastPos;
- if(count < 2)
- continue;
- if(count < max_count)
- std::sort(lastPos, bin_cache[u]);
- else
- positive_float_sort_rec<RandomAccessIter, div_type, data_type>(lastPos, bin_cache[u], bin_cache, cache_end, bin_sizes);
- }
- }
-
- //Sorting negative_ float_s
- //Note that bins are iterated in reverse order because max_neg_float = min_neg_int
- template <class RandomAccessIter, class div_type, class data_type>
- inline void
- negative_float_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
- , std::vector<size_t> &bin_sizes)
- {
- div_type max, min;
- find_extremes(first, last, max, min);
- if(max == min)
- return;
- unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(max) - min));
- div_type div_min = min >> log_divisor;
- div_type div_max = max >> log_divisor;
- unsigned bin_count = div_max - div_min + 1;
- unsigned cache_end;
- RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
-
- //Calculating the size of each bin
- for (RandomAccessIter current = first; current != last;)
- bin_sizes[(cast_float_iter<div_type, RandomAccessIter>(current++) >> log_divisor) - div_min]++;
- bins[bin_count - 1] = first;
- for(int ii = bin_count - 2; ii >= 0; --ii)
- bins[ii] = bins[ii + 1] + bin_sizes[ii + 1];
-
- //Swap into place
- RandomAccessIter nextbinstart = first;
- //The last bin will always have the correct elements in it
- for(int ii = bin_count - 1; ii > 0; --ii)
- float_swap_loop<RandomAccessIter, div_type, data_type>(bins, nextbinstart, ii, bin_sizes, log_divisor, div_min);
- //Since we don't process the last bin, we need to update its end position
- bin_cache[cache_offset] = last;
-
- //Return if we've completed bucketsorting
- if(!log_divisor)
- return;
-
- //Recursing
- size_t max_count = get_max_count(log_divisor, last - first);
- RandomAccessIter lastPos = first;
- for(int ii = cache_end - 1; ii >= (int)cache_offset; lastPos = bin_cache[ii], --ii) {
- size_t count = bin_cache[ii] - lastPos;
- if(count < 2)
- continue;
- if(count < max_count)
- std::sort(lastPos, bin_cache[ii]);
- else
- negative_float_sort_rec<RandomAccessIter, div_type, data_type>(lastPos, bin_cache[ii], bin_cache, cache_end, bin_sizes);
- }
- }
-
- //Sorting negative_ float_s
- //Note that bins are iterated in reverse order because max_neg_float = min_neg_int
- template <class RandomAccessIter, class div_type, class data_type, class right_shift>
- inline void
- negative_float_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
- , std::vector<size_t> &bin_sizes, right_shift shift)
- {
- div_type max, min;
- find_extremes(first, last, max, min, shift);
- if(max == min)
- return;
- unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(max) - min));
- div_type div_min = min >> log_divisor;
- div_type div_max = max >> log_divisor;
- unsigned bin_count = div_max - div_min + 1;
- unsigned cache_end;
- RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
-
- //Calculating the size of each bin
- for (RandomAccessIter current = first; current != last;)
- bin_sizes[shift(*(current++), log_divisor) - div_min]++;
- bins[bin_count - 1] = first;
- for(int ii = bin_count - 2; ii >= 0; --ii)
- bins[ii] = bins[ii + 1] + bin_sizes[ii + 1];
-
- //Swap into place
- RandomAccessIter nextbinstart = first;
- //The last bin will always have the correct elements in it
- for(int ii = bin_count - 1; ii > 0; --ii)
- swap_loop<RandomAccessIter, div_type, data_type, right_shift>(bins, nextbinstart, ii, shift, bin_sizes, log_divisor, div_min);
- //Since we don't process the last bin, we need to update its end position
- bin_cache[cache_offset] = last;
-
- //Return if we've completed bucketsorting
- if(!log_divisor)
- return;
-
- //Recursing
- size_t max_count = get_max_count(log_divisor, last - first);
- RandomAccessIter lastPos = first;
- for(int ii = cache_end - 1; ii >= (int)cache_offset; lastPos = bin_cache[ii], --ii) {
- size_t count = bin_cache[ii] - lastPos;
- if(count < 2)
- continue;
- if(count < max_count)
- std::sort(lastPos, bin_cache[ii]);
- else
- negative_float_sort_rec<RandomAccessIter, div_type, data_type, right_shift>(lastPos, bin_cache[ii], bin_cache, cache_end, bin_sizes, shift);
- }
- }
-
- template <class RandomAccessIter, class div_type, class data_type, class right_shift, class compare>
- inline void
- negative_float_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
- , std::vector<size_t> &bin_sizes, right_shift shift, compare comp)
- {
- div_type max, min;
- find_extremes(first, last, max, min, shift);
- if(max == min)
- return;
- unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(max) - min));
- div_type div_min = min >> log_divisor;
- div_type div_max = max >> log_divisor;
- unsigned bin_count = div_max - div_min + 1;
- unsigned cache_end;
- RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
-
- //Calculating the size of each bin
- for (RandomAccessIter current = first; current != last;)
- bin_sizes[shift(*(current++), log_divisor) - div_min]++;
- bins[bin_count - 1] = first;
- for(int ii = bin_count - 2; ii >= 0; --ii)
- bins[ii] = bins[ii + 1] + bin_sizes[ii + 1];
-
- //Swap into place
- RandomAccessIter nextbinstart = first;
- //The last bin will always have the correct elements in it
- for(int ii = bin_count - 1; ii > 0; --ii)
- swap_loop<RandomAccessIter, div_type, data_type, right_shift>(bins, nextbinstart, ii, shift, bin_sizes, log_divisor, div_min);
- //Since we don't process the last bin, we need to update its end position
- bin_cache[cache_offset] = last;
-
- //Return if we've completed bucketsorting
- if(!log_divisor)
- return;
-
- //Recursing
- size_t max_count = get_max_count(log_divisor, last - first);
- RandomAccessIter lastPos = first;
- for(int ii = cache_end - 1; ii >= (int)cache_offset; lastPos = bin_cache[ii], --ii) {
- size_t count = bin_cache[ii] - lastPos;
- if(count < 2)
- continue;
- if(count < max_count)
- std::sort(lastPos, bin_cache[ii], comp);
- else
- negative_float_sort_rec<RandomAccessIter, div_type, data_type, right_shift, compare>(lastPos, bin_cache[ii], bin_cache, cache_end, bin_sizes, shift, comp);
- }
- }
-
- //Casting special-case for floating-point sorting
- template <class RandomAccessIter, class div_type, class data_type>
- inline void
- float_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
- , std::vector<size_t> &bin_sizes)
- {
- div_type max, min;
- find_extremes(first, last, max, min);
- if(max == min)
- return;
- unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(max) - min));
- div_type div_min = min >> log_divisor;
- div_type div_max = max >> log_divisor;
- unsigned bin_count = div_max - div_min + 1;
- unsigned cache_end;
- RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
-
- //Calculating the size of each bin
- for (RandomAccessIter current = first; current != last;)
- bin_sizes[(cast_float_iter<div_type, RandomAccessIter>(current++) >> log_divisor) - div_min]++;
- //The index of the first positive bin
- div_type first_positive = (div_min < 0) ? -div_min : 0;
- //Resetting if all bins are negative
- if(cache_offset + first_positive > cache_end)
- first_positive = cache_end - cache_offset;
- //Reversing the order of the negative bins
- //Note that because of the negative/positive ordering direction flip
- //We can not depend upon bin order and positions matching up
- //so bin_sizes must be reused to contain the end of the bin
- if(first_positive > 0) {
- bins[first_positive - 1] = first;
- for(int ii = first_positive - 2; ii >= 0; --ii) {
- bins[ii] = first + bin_sizes[ii + 1];
- bin_sizes[ii] += bin_sizes[ii + 1];
- }
- //Handling positives following negatives
- if((unsigned)first_positive < bin_count) {
- bins[first_positive] = first + bin_sizes[0];
- bin_sizes[first_positive] += bin_sizes[0];
- }
- }
- else
- bins[0] = first;
- for(unsigned u = first_positive; u < bin_count - 1; u++) {
- bins[u + 1] = first + bin_sizes[u];
- bin_sizes[u + 1] += bin_sizes[u];
- }
-
- //Swap into place
- RandomAccessIter nextbinstart = first;
- for(unsigned u = 0; u < bin_count; ++u) {
- nextbinstart = first + bin_sizes[u];
- inner_float_swap_loop<RandomAccessIter, div_type, data_type>(bins, nextbinstart, u, log_divisor, div_min);
- }
-
- if(!log_divisor)
- return;
-
- //Handling negative values first
- size_t max_count = get_max_count(log_divisor, last - first);
- RandomAccessIter lastPos = first;
- for(int ii = cache_offset + first_positive - 1; ii >= (int)cache_offset ; lastPos = bin_cache[ii--]) {
- size_t count = bin_cache[ii] - lastPos;
- if(count < 2)
- continue;
- if(count < max_count)
- std::sort(lastPos, bin_cache[ii]);
- //sort negative values using reversed-bin spread_sort
- else
- negative_float_sort_rec<RandomAccessIter, div_type, data_type>(lastPos, bin_cache[ii], bin_cache, cache_end, bin_sizes);
- }
-
- for(unsigned u = cache_offset + first_positive; u < cache_end; lastPos = bin_cache[u], ++u) {
- size_t count = bin_cache[u] - lastPos;
- if(count < 2)
- continue;
- if(count < max_count)
- std::sort(lastPos, bin_cache[u]);
- //sort positive values using normal spread_sort
- else
- positive_float_sort_rec<RandomAccessIter, div_type, data_type>(lastPos, bin_cache[u], bin_cache, cache_end, bin_sizes);
- }
- }
-
- //Functor implementation for recursive sorting
- template <class RandomAccessIter, class div_type, class data_type, class right_shift>
- inline void
- float_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
- , std::vector<size_t> &bin_sizes, right_shift shift)
- {
- div_type max, min;
- find_extremes(first, last, max, min, shift);
- if(max == min)
- return;
- unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(max) - min));
- div_type div_min = min >> log_divisor;
- div_type div_max = max >> log_divisor;
- unsigned bin_count = div_max - div_min + 1;
- unsigned cache_end;
- RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
-
- //Calculating the size of each bin
- for (RandomAccessIter current = first; current != last;)
- bin_sizes[shift(*(current++), log_divisor) - div_min]++;
- //The index of the first positive bin
- div_type first_positive = (div_min < 0) ? -div_min : 0;
- //Resetting if all bins are negative
- if(cache_offset + first_positive > cache_end)
- first_positive = cache_end - cache_offset;
- //Reversing the order of the negative bins
- //Note that because of the negative/positive ordering direction flip
- //We can not depend upon bin order and positions matching up
- //so bin_sizes must be reused to contain the end of the bin
- if(first_positive > 0) {
- bins[first_positive - 1] = first;
- for(int ii = first_positive - 2; ii >= 0; --ii) {
- bins[ii] = first + bin_sizes[ii + 1];
- bin_sizes[ii] += bin_sizes[ii + 1];
- }
- //Handling positives following negatives
- if((unsigned)first_positive < bin_count) {
- bins[first_positive] = first + bin_sizes[0];
- bin_sizes[first_positive] += bin_sizes[0];
- }
- }
- else
- bins[0] = first;
- for(unsigned u = first_positive; u < bin_count - 1; u++) {
- bins[u + 1] = first + bin_sizes[u];
- bin_sizes[u + 1] += bin_sizes[u];
- }
-
- //Swap into place
- RandomAccessIter nextbinstart = first;
- for(unsigned u = 0; u < bin_count; ++u) {
- nextbinstart = first + bin_sizes[u];
- inner_swap_loop<RandomAccessIter, div_type, data_type, right_shift>(bins, nextbinstart, u, shift, log_divisor, div_min);
- }
-
- //Return if we've completed bucketsorting
- if(!log_divisor)
- return;
-
- //Handling negative values first
- size_t max_count = get_max_count(log_divisor, last - first);
- RandomAccessIter lastPos = first;
- for(int ii = cache_offset + first_positive - 1; ii >= (int)cache_offset ; lastPos = bin_cache[ii--]) {
- size_t count = bin_cache[ii] - lastPos;
- if(count < 2)
- continue;
- if(count < max_count)
- std::sort(lastPos, bin_cache[ii]);
- //sort negative values using reversed-bin spread_sort
- else
- negative_float_sort_rec<RandomAccessIter, div_type, data_type, right_shift>(lastPos, bin_cache[ii], bin_cache, cache_end, bin_sizes, shift);
- }
-
- for(unsigned u = cache_offset + first_positive; u < cache_end; lastPos = bin_cache[u], ++u) {
- size_t count = bin_cache[u] - lastPos;
- if(count < 2)
- continue;
- if(count < max_count)
- std::sort(lastPos, bin_cache[u]);
- //sort positive values using normal spread_sort
- else
- spread_sort_rec<RandomAccessIter, div_type, data_type, right_shift>(lastPos, bin_cache[u], bin_cache, cache_end, bin_sizes, shift);
- }
- }
-
- template <class RandomAccessIter, class div_type, class data_type, class right_shift, class compare>
- inline void
- float_sort_rec(RandomAccessIter first, RandomAccessIter last, std::vector<RandomAccessIter> &bin_cache, unsigned cache_offset
- , std::vector<size_t> &bin_sizes, right_shift shift, compare comp)
- {
- div_type max, min;
- find_extremes(first, last, max, min, shift);
- if(max == min)
- return;
- unsigned log_divisor = get_log_divisor(last - first, rough_log_2_size((size_t)(max) - min));
- div_type div_min = min >> log_divisor;
- div_type div_max = max >> log_divisor;
- unsigned bin_count = div_max - div_min + 1;
- unsigned cache_end;
- RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, bin_count);
-
- //Calculating the size of each bin
- for (RandomAccessIter current = first; current != last;)
- bin_sizes[shift(*(current++), log_divisor) - div_min]++;
- //The index of the first positive bin
- div_type first_positive = (div_min < 0) ? -div_min : 0;
- //Resetting if all bins are negative
- if(cache_offset + first_positive > cache_end)
- first_positive = cache_end - cache_offset;
- //Reversing the order of the negative bins
- //Note that because of the negative/positive ordering direction flip
- //We can not depend upon bin order and positions matching up
- //so bin_sizes must be reused to contain the end of the bin
- if(first_positive > 0) {
- bins[first_positive - 1] = first;
- for(int ii = first_positive - 2; ii >= 0; --ii) {
- bins[ii] = first + bin_sizes[ii + 1];
- bin_sizes[ii] += bin_sizes[ii + 1];
- }
- //Handling positives following negatives
- if((unsigned)first_positive < bin_count) {
- bins[first_positive] = first + bin_sizes[0];
- bin_sizes[first_positive] += bin_sizes[0];
- }
- }
- else
- bins[0] = first;
- for(unsigned u = first_positive; u < bin_count - 1; u++) {
- bins[u + 1] = first + bin_sizes[u];
- bin_sizes[u + 1] += bin_sizes[u];
- }
-
- //Swap into place
- RandomAccessIter nextbinstart = first;
- for(unsigned u = 0; u < bin_count; ++u) {
- nextbinstart = first + bin_sizes[u];
- inner_swap_loop<RandomAccessIter, div_type, data_type, right_shift>(bins, nextbinstart, u, shift, log_divisor, div_min);
- }
-
- //Return if we've completed bucketsorting
- if(!log_divisor)
- return;
-
- //Handling negative values first
- size_t max_count = get_max_count(log_divisor, last - first);
- RandomAccessIter lastPos = first;
- for(int ii = cache_offset + first_positive - 1; ii >= (int)cache_offset ; lastPos = bin_cache[ii--]) {
- size_t count = bin_cache[ii] - lastPos;
- if(count < 2)
- continue;
- if(count < max_count)
- std::sort(lastPos, bin_cache[ii]);
- //sort negative values using reversed-bin spread_sort
- else
- negative_float_sort_rec<RandomAccessIter, div_type, data_type, right_shift>(lastPos, bin_cache[ii], bin_cache, cache_end, bin_sizes, shift, comp);
- }
-
- for(unsigned u = cache_offset + first_positive; u < cache_end; lastPos = bin_cache[u], ++u) {
- size_t count = bin_cache[u] - lastPos;
- if(count < 2)
- continue;
- if(count < max_count)
- std::sort(lastPos, bin_cache[u]);
- //sort positive values using normal spread_sort
- else
- spread_sort_rec<RandomAccessIter, div_type, data_type, right_shift>(lastPos, bin_cache[u], bin_cache, cache_end, bin_sizes, shift, comp);
- }
- }
-
- template <class RandomAccessIter, class cast_type, class data_type>
- inline void
- float_Sort(RandomAccessIter first, RandomAccessIter last, cast_type, data_type)
- {
- std::vector<size_t> bin_sizes;
- std::vector<RandomAccessIter> bin_cache;
- float_sort_rec<RandomAccessIter, cast_type, data_type>(first, last, bin_cache, 0, bin_sizes);
- }
-
- template <class RandomAccessIter, class div_type, class data_type, class right_shift>
- inline void
- float_Sort(RandomAccessIter first, RandomAccessIter last, div_type, data_type, right_shift shift)
- {
- std::vector<size_t> bin_sizes;
- std::vector<RandomAccessIter> bin_cache;
- float_sort_rec<RandomAccessIter, div_type, data_type, right_shift>(first, last, bin_cache, 0, bin_sizes, shift);
- }
-
- template <class RandomAccessIter, class div_type, class data_type, class right_shift, class compare>
- inline void
- float_Sort(RandomAccessIter first, RandomAccessIter last, div_type, data_type, right_shift shift, compare comp)
- {
- std::vector<size_t> bin_sizes;
- std::vector<RandomAccessIter> bin_cache;
- float_sort_rec<RandomAccessIter, div_type, data_type, right_shift>(first, last, bin_cache, 0, bin_sizes, shift, comp);
- }
- }
-
- //float_sort with casting
- //The cast_type must be equal in size to the data type, and must be a signed integer
- template <class RandomAccessIter, class cast_type>
- inline void float_sort_cast(RandomAccessIter first, RandomAccessIter last, cast_type cVal)
- {
- if(last - first < detail::MIN_SORT_SIZE)
- std::sort(first, last);
- else
- detail::float_Sort(first, last, cVal, *first);
- }
-
- //float_sort with casting to an int
- //Only use this with IEEE floating-point numbers
- template <class RandomAccessIter>
- inline void float_sort_cast_to_int(RandomAccessIter first, RandomAccessIter last)
- {
- int cVal = 0;
- float_sort_cast(first, last, cVal);
- }
-
- //float_sort with functors
- template <class RandomAccessIter, class right_shift>
- inline void float_sort(RandomAccessIter first, RandomAccessIter last, right_shift shift)
- {
- if(last - first < detail::MIN_SORT_SIZE)
- std::sort(first, last);
- else
- detail::float_Sort(first, last, shift(*first, 0), *first, shift);
- }
-
- template <class RandomAccessIter, class right_shift, class compare>
- inline void float_sort(RandomAccessIter first, RandomAccessIter last, right_shift shift, compare comp)
- {
- if(last - first < detail::MIN_SORT_SIZE)
- std::sort(first, last, comp);
- else
- detail::float_Sort(first, last, shift(*first, 0), *first, shift, comp);
- }
-
- //------------------------------------------------- string_sort source ---------------------------------------------
- namespace detail {
- //Offsetting on identical characters. This function works a character at a time for optimal worst-case performance.
- template<class RandomAccessIter>
- inline void
- update_offset(RandomAccessIter first, RandomAccessIter finish, unsigned &char_offset)
- {
- unsigned nextOffset = char_offset;
- bool done = false;
- while(!done) {
- RandomAccessIter curr = first;
- do {
- //ignore empties, but if the nextOffset would exceed the length or not match, exit; we've found the last matching character
- if((*curr).size() > char_offset && ((*curr).size() <= (nextOffset + 1) || (*curr)[nextOffset] != (*first)[nextOffset])) {
- done = true;
- break;
- }
- } while(++curr != finish);
- if(!done)
- ++nextOffset;
- }
- char_offset = nextOffset;
- }
-
- //Offsetting on identical characters. This function works a character at a time for optimal worst-case performance.
- template<class RandomAccessIter, class get_char, class get_length>
- inline void
- update_offset(RandomAccessIter first, RandomAccessIter finish, unsigned &char_offset, get_char getchar, get_length length)
- {
- unsigned nextOffset = char_offset;
- bool done = false;
- while(!done) {
- RandomAccessIter curr = first;
- do {
- //ignore empties, but if the nextOffset would exceed the length or not match, exit; we've found the last matching character
- if(length(*curr) > char_offset && (length(*curr) <= (nextOffset + 1) || getchar((*curr), nextOffset) != getchar((*first), nextOffset))) {
- done = true;
- break;
- }
- } while(++curr != finish);
- if(!done)
- ++nextOffset;
- }
- char_offset = nextOffset;
- }
-
- //A comparison functor for strings that assumes they are identical up to char_offset
- template<class data_type, class unsignedchar_type>
- struct offset_lessthan {
- offset_lessthan(unsigned char_offset) : fchar_offset(char_offset){}
- inline bool operator()(const data_type &x, const data_type &y) const
- {
- unsigned minSize = std::min(x.size(), y.size());
- for(unsigned u = fchar_offset; u < minSize; ++u) {
- if(static_cast<unsignedchar_type>(x[u]) < static_cast<unsignedchar_type>(y[u]))
- return true;
- else if(static_cast<unsignedchar_type>(y[u]) < static_cast<unsignedchar_type>(x[u]))
- return false;
- }
- return x.size() < y.size();
- }
- unsigned fchar_offset;
- };
-
- //A comparison functor for strings that assumes they are identical up to char_offset
- template<class data_type, class unsignedchar_type>
- struct offset_greaterthan {
- offset_greaterthan(unsigned char_offset) : fchar_offset(char_offset){}
- inline bool operator()(const data_type &x, const data_type &y) const
- {
- unsigned minSize = std::min(x.size(), y.size());
- for(unsigned u = fchar_offset; u < minSize; ++u) {
- if(static_cast<unsignedchar_type>(x[u]) > static_cast<unsignedchar_type>(y[u]))
- return true;
- else if(static_cast<unsignedchar_type>(y[u]) > static_cast<unsignedchar_type>(x[u]))
- return false;
- }
- return x.size() > y.size();
- }
- unsigned fchar_offset;
- };
-
- //A comparison functor for strings that assumes they are identical up to char_offset
- template<class data_type, class get_char, class get_length>
- struct offset_char_lessthan {
- offset_char_lessthan(unsigned char_offset) : fchar_offset(char_offset){}
- inline bool operator()(const data_type &x, const data_type &y) const
- {
- unsigned minSize = std::min(length(x), length(y));
- for(unsigned u = fchar_offset; u < minSize; ++u) {
- if(getchar(x, u) < getchar(y, u))
- return true;
- else if(getchar(y, u) < getchar(x, u))
- return false;
- }
- return length(x) < length(y);
- }
- unsigned fchar_offset;
- get_char getchar;
- get_length length;
- };
-
- //String sorting recursive implementation
- template <class RandomAccessIter, class data_type, class unsignedchar_type>
- inline void
- string_sort_rec(RandomAccessIter first, RandomAccessIter last, unsigned char_offset, std::vector<RandomAccessIter> &bin_cache
- , unsigned cache_offset, std::vector<size_t> &bin_sizes)
- {
- //This section is not strictly necessary, but makes handling of long identical substrings much faster, with a mild average performance impact.
- //Iterate to the end of the empties. If all empty, return
- while((*first).size() <= char_offset) {
- if(++first == last)
- return;
- }
- RandomAccessIter finish = last - 1;
- //Getting the last non-empty
- for(;(*finish).size() <= char_offset; --finish) { }
- ++finish;
- //Offsetting on identical characters. This section works a character at a time for optimal worst-case performance.
- update_offset(first, finish, char_offset);
-
- const unsigned bin_count = (1 << (sizeof(unsignedchar_type)*8));
- //Equal worst-case between radix and comparison-based is when bin_count = n*log(n).
- const unsigned max_size = bin_count;
- const unsigned membin_count = bin_count + 1;
- unsigned cache_end;
- RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, membin_count) + 1;
-
- //Calculating the size of each bin; this takes roughly 10% of runtime
- for (RandomAccessIter current = first; current != last; ++current) {
- if((*current).size() <= char_offset) {
- bin_sizes[0]++;
- }
- else
- bin_sizes[static_cast<unsignedchar_type>((*current)[char_offset]) + 1]++;
- }
- //Assign the bin positions
- bin_cache[cache_offset] = first;
- for(unsigned u = 0; u < membin_count - 1; u++)
- bin_cache[cache_offset + u + 1] = bin_cache[cache_offset + u] + bin_sizes[u];
-
- //Swap into place
- RandomAccessIter nextbinstart = first;
- //handling empty bins
- RandomAccessIter * local_bin = &(bin_cache[cache_offset]);
- nextbinstart += bin_sizes[0];
- RandomAccessIter * target_bin;
- //Iterating over each element in the bin of empties
- for(RandomAccessIter current = *local_bin; current < nextbinstart; ++current) {
- //empties belong in this bin
- while((*current).size() > char_offset) {
- target_bin = bins + static_cast<unsignedchar_type>((*current)[char_offset]);
- iter_swap(current, (*target_bin)++);
- }
- }
- *local_bin = nextbinstart;
- //iterate backwards to find the last bin with elements in it; this saves iterations in multiple loops
- unsigned last_bin = bin_count - 1;
- for(; last_bin && !bin_sizes[last_bin + 1]; --last_bin) { }
- //This dominates runtime, mostly in the swap and bin lookups
- for(unsigned u = 0; u < last_bin; ++u) {
- local_bin = bins + u;
- nextbinstart += bin_sizes[u + 1];
- //Iterating over each element in this bin
- for(RandomAccessIter current = *local_bin; current < nextbinstart; ++current) {
- //Swapping elements in current into place until the correct element has been swapped in
- for(target_bin = bins + static_cast<unsignedchar_type>((*current)[char_offset]); target_bin != local_bin;
- target_bin = bins + static_cast<unsignedchar_type>((*current)[char_offset]))
- iter_swap(current, (*target_bin)++);
- }
- *local_bin = nextbinstart;
- }
- bins[last_bin] = last;
- //Recursing
- RandomAccessIter lastPos = bin_cache[cache_offset];
- //Skip this loop for empties
- for(unsigned u = cache_offset + 1; u < cache_offset + last_bin + 2; lastPos = bin_cache[u], ++u) {
- size_t count = bin_cache[u] - lastPos;
- //don't sort unless there are at least two items to compare
- if(count < 2)
- continue;
- //using std::sort if its worst-case is better
- if(count < max_size)
- std::sort(lastPos, bin_cache[u], offset_lessthan<data_type, unsignedchar_type>(char_offset + 1));
- else
- string_sort_rec<RandomAccessIter, data_type, unsignedchar_type>(lastPos, bin_cache[u], char_offset + 1, bin_cache, cache_end, bin_sizes);
- }
- }
-
- //Sorts strings in reverse order, with empties at the end
- template <class RandomAccessIter, class data_type, class unsignedchar_type>
- inline void
- reverse_string_sort_rec(RandomAccessIter first, RandomAccessIter last, unsigned char_offset, std::vector<RandomAccessIter> &bin_cache
- , unsigned cache_offset, std::vector<size_t> &bin_sizes)
- {
- //This section is not strictly necessary, but makes handling of long identical substrings much faster, with a mild average performance impact.
- RandomAccessIter curr = first;
- //Iterate to the end of the empties. If all empty, return
- while((*curr).size() <= char_offset) {
- if(++curr == last)
- return;
- }
- //Getting the last non-empty
- while((*(--last)).size() <= char_offset) { }
- ++last;
- //Offsetting on identical characters. This section works a character at a time for optimal worst-case performance.
- update_offset(curr, last, char_offset);
- RandomAccessIter * target_bin;
-
- const unsigned bin_count = (1 << (sizeof(unsignedchar_type)*8));
- //Equal worst-case between radix and comparison-based is when bin_count = n*log(n).
- const unsigned max_size = bin_count;
- const unsigned membin_count = bin_count + 1;
- const unsigned max_bin = bin_count - 1;
- unsigned cache_end;
- RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, membin_count);
- RandomAccessIter * end_bin = &(bin_cache[cache_offset + max_bin]);
-
- //Calculating the size of each bin; this takes roughly 10% of runtime
- for (RandomAccessIter current = first; current != last; ++current) {
- if((*current).size() <= char_offset) {
- bin_sizes[bin_count]++;
- }
- else
- bin_sizes[max_bin - static_cast<unsignedchar_type>((*current)[char_offset])]++;
- }
- //Assign the bin positions
- bin_cache[cache_offset] = first;
- for(unsigned u = 0; u < membin_count - 1; u++)
- bin_cache[cache_offset + u + 1] = bin_cache[cache_offset + u] + bin_sizes[u];
-
- //Swap into place
- RandomAccessIter nextbinstart = last;
- //handling empty bins
- RandomAccessIter * local_bin = &(bin_cache[cache_offset + bin_count]);
- RandomAccessIter lastFull = *local_bin;
- //Iterating over each element in the bin of empties
- for(RandomAccessIter current = *local_bin; current < nextbinstart; ++current) {
- //empties belong in this bin
- while((*current).size() > char_offset) {
- target_bin = end_bin - static_cast<unsignedchar_type>((*current)[char_offset]);
- iter_swap(current, (*target_bin)++);
- }
- }
- *local_bin = nextbinstart;
- nextbinstart = first;
- //iterate backwards to find the last bin with elements in it; this saves iterations in multiple loops
- unsigned last_bin = max_bin;
- for(; last_bin && !bin_sizes[last_bin]; --last_bin) { }
- //This dominates runtime, mostly in the swap and bin lookups
- for(unsigned u = 0; u < last_bin; ++u) {
- local_bin = bins + u;
- nextbinstart += bin_sizes[u];
- //Iterating over each element in this bin
- for(RandomAccessIter current = *local_bin; current < nextbinstart; ++current) {
- //Swapping elements in current into place until the correct element has been swapped in
- for(target_bin = end_bin - static_cast<unsignedchar_type>((*current)[char_offset]); target_bin != local_bin;
- target_bin = end_bin - static_cast<unsignedchar_type>((*current)[char_offset]))
- iter_swap(current, (*target_bin)++);
- }
- *local_bin = nextbinstart;
- }
- bins[last_bin] = lastFull;
- //Recursing
- RandomAccessIter lastPos = first;
- //Skip this loop for empties
- for(unsigned u = cache_offset; u <= cache_offset + last_bin; lastPos = bin_cache[u], ++u) {
- size_t count = bin_cache[u] - lastPos;
- //don't sort unless there are at least two items to compare
- if(count < 2)
- continue;
- //using std::sort if its worst-case is better
- if(count < max_size)
- std::sort(lastPos, bin_cache[u], offset_greaterthan<data_type, unsignedchar_type>(char_offset + 1));
- else
- reverse_string_sort_rec<RandomAccessIter, data_type, unsignedchar_type>(lastPos, bin_cache[u], char_offset + 1, bin_cache, cache_end, bin_sizes);
- }
- }
-
- //String sorting recursive implementation
- template <class RandomAccessIter, class data_type, class unsignedchar_type, class get_char, class get_length>
- inline void
- string_sort_rec(RandomAccessIter first, RandomAccessIter last, unsigned char_offset, std::vector<RandomAccessIter> &bin_cache
- , unsigned cache_offset, std::vector<size_t> &bin_sizes, get_char getchar, get_length length)
- {
- //This section is not strictly necessary, but makes handling of long identical substrings much faster, with a mild average performance impact.
- //Iterate to the end of the empties. If all empty, return
- while(length(*first) <= char_offset) {
- if(++first == last)
- return;
- }
- RandomAccessIter finish = last - 1;
- //Getting the last non-empty
- for(;length(*finish) <= char_offset; --finish) { }
- ++finish;
- update_offset(first, finish, char_offset, getchar, length);
-
- const unsigned bin_count = (1 << (sizeof(unsignedchar_type)*8));
- //Equal worst-case between radix and comparison-based is when bin_count = n*log(n).
- const unsigned max_size = bin_count;
- const unsigned membin_count = bin_count + 1;
- unsigned cache_end;
- RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, membin_count) + 1;
-
- //Calculating the size of each bin; this takes roughly 10% of runtime
- for (RandomAccessIter current = first; current != last; ++current) {
- if(length(*current) <= char_offset) {
- bin_sizes[0]++;
- }
- else
- bin_sizes[getchar((*current), char_offset) + 1]++;
- }
- //Assign the bin positions
- bin_cache[cache_offset] = first;
- for(unsigned u = 0; u < membin_count - 1; u++)
- bin_cache[cache_offset + u + 1] = bin_cache[cache_offset + u] + bin_sizes[u];
-
- //Swap into place
- RandomAccessIter nextbinstart = first;
- //handling empty bins
- RandomAccessIter * local_bin = &(bin_cache[cache_offset]);
- nextbinstart += bin_sizes[0];
- RandomAccessIter * target_bin;
- //Iterating over each element in the bin of empties
- for(RandomAccessIter current = *local_bin; current < nextbinstart; ++current) {
- //empties belong in this bin
- while(length(*current) > char_offset) {
- target_bin = bins + getchar((*current), char_offset);
- iter_swap(current, (*target_bin)++);
- }
- }
- *local_bin = nextbinstart;
- //iterate backwards to find the last bin with elements in it; this saves iterations in multiple loops
- unsigned last_bin = bin_count - 1;
- for(; last_bin && !bin_sizes[last_bin + 1]; --last_bin) { }
- //This dominates runtime, mostly in the swap and bin lookups
- for(unsigned ii = 0; ii < last_bin; ++ii) {
- local_bin = bins + ii;
- nextbinstart += bin_sizes[ii + 1];
- //Iterating over each element in this bin
- for(RandomAccessIter current = *local_bin; current < nextbinstart; ++current) {
- //Swapping elements in current into place until the correct element has been swapped in
- for(target_bin = bins + getchar((*current), char_offset); target_bin != local_bin;
- target_bin = bins + getchar((*current), char_offset))
- iter_swap(current, (*target_bin)++);
- }
- *local_bin = nextbinstart;
- }
- bins[last_bin] = last;
-
- //Recursing
- RandomAccessIter lastPos = bin_cache[cache_offset];
- //Skip this loop for empties
- for(unsigned u = cache_offset + 1; u < cache_offset + last_bin + 2; lastPos = bin_cache[u], ++u) {
- size_t count = bin_cache[u] - lastPos;
- //don't sort unless there are at least two items to compare
- if(count < 2)
- continue;
- //using std::sort if its worst-case is better
- if(count < max_size)
- std::sort(lastPos, bin_cache[u], offset_char_lessthan<data_type, get_char, get_length>(char_offset + 1));
- else
- string_sort_rec<RandomAccessIter, data_type, unsignedchar_type, get_char, get_length>(lastPos, bin_cache[u], char_offset + 1, bin_cache, cache_end, bin_sizes, getchar, length);
- }
- }
-
- //String sorting recursive implementation
- template <class RandomAccessIter, class data_type, class unsignedchar_type, class get_char, class get_length, class compare>
- inline void
- string_sort_rec(RandomAccessIter first, RandomAccessIter last, unsigned char_offset, std::vector<RandomAccessIter> &bin_cache
- , unsigned cache_offset, std::vector<size_t> &bin_sizes, get_char getchar, get_length length, compare comp)
- {
- //This section is not strictly necessary, but makes handling of long identical substrings much faster, with a mild average performance impact.
- //Iterate to the end of the empties. If all empty, return
- while(length(*first) <= char_offset) {
- if(++first == last)
- return;
- }
- RandomAccessIter finish = last - 1;
- //Getting the last non-empty
- for(;length(*finish) <= char_offset; --finish) { }
- ++finish;
- update_offset(first, finish, char_offset, getchar, length);
-
- const unsigned bin_count = (1 << (sizeof(unsignedchar_type)*8));
- //Equal worst-case between radix and comparison-based is when bin_count = n*log(n).
- const unsigned max_size = bin_count;
- const unsigned membin_count = bin_count + 1;
- unsigned cache_end;
- RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, membin_count) + 1;
-
- //Calculating the size of each bin; this takes roughly 10% of runtime
- for (RandomAccessIter current = first; current != last; ++current) {
- if(length(*current) <= char_offset) {
- bin_sizes[0]++;
- }
- else
- bin_sizes[getchar((*current), char_offset) + 1]++;
- }
- //Assign the bin positions
- bin_cache[cache_offset] = first;
- for(unsigned u = 0; u < membin_count - 1; u++)
- bin_cache[cache_offset + u + 1] = bin_cache[cache_offset + u] + bin_sizes[u];
-
- //Swap into place
- RandomAccessIter nextbinstart = first;
- //handling empty bins
- RandomAccessIter * local_bin = &(bin_cache[cache_offset]);
- nextbinstart += bin_sizes[0];
- RandomAccessIter * target_bin;
- //Iterating over each element in the bin of empties
- for(RandomAccessIter current = *local_bin; current < nextbinstart; ++current) {
- //empties belong in this bin
- while(length(*current) > char_offset) {
- target_bin = bins + getchar((*current), char_offset);
- iter_swap(current, (*target_bin)++);
- }
- }
- *local_bin = nextbinstart;
- //iterate backwards to find the last bin with elements in it; this saves iterations in multiple loops
- unsigned last_bin = bin_count - 1;
- for(; last_bin && !bin_sizes[last_bin + 1]; --last_bin) { }
- //This dominates runtime, mostly in the swap and bin lookups
- for(unsigned u = 0; u < last_bin; ++u) {
- local_bin = bins + u;
- nextbinstart += bin_sizes[u + 1];
- //Iterating over each element in this bin
- for(RandomAccessIter current = *local_bin; current < nextbinstart; ++current) {
- //Swapping elements in current into place until the correct element has been swapped in
- for(target_bin = bins + getchar((*current), char_offset); target_bin != local_bin;
- target_bin = bins + getchar((*current), char_offset))
- iter_swap(current, (*target_bin)++);
- }
- *local_bin = nextbinstart;
- }
- bins[last_bin] = last;
-
- //Recursing
- RandomAccessIter lastPos = bin_cache[cache_offset];
- //Skip this loop for empties
- for(unsigned u = cache_offset + 1; u < cache_offset + last_bin + 2; lastPos = bin_cache[u], ++u) {
- size_t count = bin_cache[u] - lastPos;
- //don't sort unless there are at least two items to compare
- if(count < 2)
- continue;
- //using std::sort if its worst-case is better
- if(count < max_size)
- std::sort(lastPos, bin_cache[u], comp);
- else
- string_sort_rec<RandomAccessIter, data_type, unsignedchar_type, get_char, get_length, compare>(lastPos
- , bin_cache[u], char_offset + 1, bin_cache, cache_end, bin_sizes, getchar, length, comp);
- }
- }
-
- //Sorts strings in reverse order, with empties at the end
- template <class RandomAccessIter, class data_type, class unsignedchar_type, class get_char, class get_length, class compare>
- inline void
- reverse_string_sort_rec(RandomAccessIter first, RandomAccessIter last, unsigned char_offset, std::vector<RandomAccessIter> &bin_cache
- , unsigned cache_offset, std::vector<size_t> &bin_sizes, get_char getchar, get_length length, compare comp)
- {
- //This section is not strictly necessary, but makes handling of long identical substrings much faster, with a mild average performance impact.
- RandomAccessIter curr = first;
- //Iterate to the end of the empties. If all empty, return
- while(length(*curr) <= char_offset) {
- if(++curr == last)
- return;
- }
- //Getting the last non-empty
- while(length(*(--last)) <= char_offset) { }
- ++last;
- //Offsetting on identical characters. This section works a character at a time for optimal worst-case performance.
- update_offset(first, last, char_offset, getchar, length);
-
- const unsigned bin_count = (1 << (sizeof(unsignedchar_type)*8));
- //Equal worst-case between radix and comparison-based is when bin_count = n*log(n).
- const unsigned max_size = bin_count;
- const unsigned membin_count = bin_count + 1;
- const unsigned max_bin = bin_count - 1;
- unsigned cache_end;
- RandomAccessIter * bins = size_bins(bin_sizes, bin_cache, cache_offset, cache_end, membin_count);
- RandomAccessIter *end_bin = &(bin_cache[cache_offset + max_bin]);
-
- //Calculating the size of each bin; this takes roughly 10% of runtime
- for (RandomAccessIter current = first; current != last; ++current) {
- if(length(*current) <= char_offset) {
- bin_sizes[bin_count]++;
- }
- else
- bin_sizes[max_bin - getchar((*current), char_offset)]++;
- }
- //Assign the bin positions
- bin_cache[cache_offset] = first;
- for(unsigned u = 0; u < membin_count - 1; u++)
- bin_cache[cache_offset + u + 1] = bin_cache[cache_offset + u] + bin_sizes[u];
-
- //Swap into place
- RandomAccessIter nextbinstart = last;
- //handling empty bins
- RandomAccessIter * local_bin = &(bin_cache[cache_offset + bin_count]);
- RandomAccessIter lastFull = *local_bin;
- RandomAccessIter * target_bin;
- //Iterating over each element in the bin of empties
- for(RandomAccessIter current = *local_bin; current < nextbinstart; ++current) {
- //empties belong in this bin
- while(length(*current) > char_offset) {
- target_bin = end_bin - getchar((*current), char_offset);
- iter_swap(current, (*target_bin)++);
- }
- }
- *local_bin = nextbinstart;
- nextbinstart = first;
- //iterate backwards to find the last bin with elements in it; this saves iterations in multiple loops
- unsigned last_bin = max_bin;
- for(; last_bin && !bin_sizes[last_bin]; --last_bin) { }
- //This dominates runtime, mostly in the swap and bin lookups
- for(unsigned u = 0; u < last_bin; ++u) {
- local_bin = bins + u;
- nextbinstart += bin_sizes[u];
- //Iterating over each element in this bin
- for(RandomAccessIter current = *local_bin; current < nextbinstart; ++current) {
- //Swapping elements in current into place until the correct element has been swapped in
- for(target_bin = end_bin - getchar((*current), char_offset); target_bin != local_bin;
- target_bin = end_bin - getchar((*current), char_offset))
- iter_swap(current, (*target_bin)++);
- }
- *local_bin = nextbinstart;
- }
- bins[last_bin] = lastFull;
- //Recursing
- RandomAccessIter lastPos = first;
- //Skip this loop for empties
- for(unsigned u = cache_offset; u <= cache_offset + last_bin; lastPos = bin_cache[u], ++u) {
- size_t count = bin_cache[u] - lastPos;
- //don't sort unless there are at least two items to compare
- if(count < 2)
- continue;
- //using std::sort if its worst-case is better
- if(count < max_size)
- std::sort(lastPos, bin_cache[u], comp);
- else
- reverse_string_sort_rec<RandomAccessIter, data_type, unsignedchar_type, get_char, get_length, compare>(lastPos
- , bin_cache[u], char_offset + 1, bin_cache, cache_end, bin_sizes, getchar, length, comp);
- }
- }
-
- //Holds the bin vector and makes the initial recursive call
- template <class RandomAccessIter, class data_type, class unsignedchar_type>
- inline void
- string_sort(RandomAccessIter first, RandomAccessIter last, data_type, unsignedchar_type)
- {
- std::vector<size_t> bin_sizes;
- std::vector<RandomAccessIter> bin_cache;
- string_sort_rec<RandomAccessIter, data_type, unsignedchar_type>(first, last, 0, bin_cache, 0, bin_sizes);
- }
-
- //Holds the bin vector and makes the initial recursive call
- template <class RandomAccessIter, class data_type, class unsignedchar_type>
- inline void
- reverse_string_sort(RandomAccessIter first, RandomAccessIter last, data_type, unsignedchar_type)
- {
- std::vector<size_t> bin_sizes;
- std::vector<RandomAccessIter> bin_cache;
- reverse_string_sort_rec<RandomAccessIter, data_type, unsignedchar_type>(first, last, 0, bin_cache, 0, bin_sizes);
- }
-
- //Holds the bin vector and makes the initial recursive call
- template <class RandomAccessIter, class get_char, class get_length, class data_type, class unsignedchar_type>
- inline void
- string_sort(RandomAccessIter first, RandomAccessIter last, get_char getchar, get_length length, data_type, unsignedchar_type)
- {
- std::vector<size_t> bin_sizes;
- std::vector<RandomAccessIter> bin_cache;
- string_sort_rec<RandomAccessIter, data_type, unsignedchar_type, get_char, get_length>(first, last, 0, bin_cache, 0, bin_sizes, getchar, length);
- }
-
- //Holds the bin vector and makes the initial recursive call
- template <class RandomAccessIter, class get_char, class get_length, class compare, class data_type, class unsignedchar_type>
- inline void
- string_sort(RandomAccessIter first, RandomAccessIter last, get_char getchar, get_length length, compare comp, data_type, unsignedchar_type)
- {
- std::vector<size_t> bin_sizes;
- std::vector<RandomAccessIter> bin_cache;
- string_sort_rec<RandomAccessIter, data_type, unsignedchar_type, get_char, get_length, compare>(first, last, 0, bin_cache, 0, bin_sizes, getchar, length, comp);
- }
-
- //Holds the bin vector and makes the initial recursive call
- template <class RandomAccessIter, class get_char, class get_length, class compare, class data_type, class unsignedchar_type>
- inline void
- reverse_string_sort(RandomAccessIter first, RandomAccessIter last, get_char getchar, get_length length, compare comp, data_type, unsignedchar_type)
- {
- std::vector<size_t> bin_sizes;
- std::vector<RandomAccessIter> bin_cache;
- reverse_string_sort_rec<RandomAccessIter, data_type, unsignedchar_type, get_char, get_length, compare>(first, last, 0, bin_cache, 0, bin_sizes, getchar, length, comp);
- }
- }
-
- //Allows character-type overloads
- template <class RandomAccessIter, class unsignedchar_type>
- inline void string_sort(RandomAccessIter first, RandomAccessIter last, unsignedchar_type unused)
- {
- //Don't sort if it's too small to optimize
- if(last - first < detail::MIN_SORT_SIZE)
- std::sort(first, last);
- else
- detail::string_sort(first, last, *first, unused);
- }
-
- //Top-level sorting call; wraps using default of unsigned char
- template <class RandomAccessIter>
- inline void string_sort(RandomAccessIter first, RandomAccessIter last)
- {
- unsigned char unused = '\0';
- string_sort(first, last, unused);
- }
-
- //Allows character-type overloads
- template <class RandomAccessIter, class compare, class unsignedchar_type>
- inline void reverse_string_sort(RandomAccessIter first, RandomAccessIter last, compare comp, unsignedchar_type unused)
- {
- //Don't sort if it's too small to optimize
- if(last - first < detail::MIN_SORT_SIZE)
- std::sort(first, last, comp);
- else
- detail::reverse_string_sort(first, last, *first, unused);
- }
-
- //Top-level sorting call; wraps using default of unsigned char
- template <class RandomAccessIter, class compare>
- inline void reverse_string_sort(RandomAccessIter first, RandomAccessIter last, compare comp)
- {
- unsigned char unused = '\0';
- reverse_string_sort(first, last, comp, unused);
- }
-
- template <class RandomAccessIter, class get_char, class get_length>
- inline void string_sort(RandomAccessIter first, RandomAccessIter last, get_char getchar, get_length length)
- {
- //Don't sort if it's too small to optimize
- if(last - first < detail::MIN_SORT_SIZE)
- std::sort(first, last);
- else {
- //skipping past empties at the beginning, which allows us to get the character type
- //.empty() is not used so as not to require a user declaration of it
- while(!length(*first)) {
- if(++first == last)
- return;
- }
- detail::string_sort(first, last, getchar, length, *first, getchar((*first), 0));
- }
- }
-
- template <class RandomAccessIter, class get_char, class get_length, class compare>
- inline void string_sort(RandomAccessIter first, RandomAccessIter last, get_char getchar, get_length length, compare comp)
- {
- //Don't sort if it's too small to optimize
- if(last - first < detail::MIN_SORT_SIZE)
- std::sort(first, last, comp);
- else {
- //skipping past empties at the beginning, which allows us to get the character type
- //.empty() is not used so as not to require a user declaration of it
- while(!length(*first)) {
- if(++first == last)
- return;
- }
- detail::string_sort(first, last, getchar, length, comp, *first, getchar((*first), 0));
- }
- }
-
- template <class RandomAccessIter, class get_char, class get_length, class compare>
- inline void reverse_string_sort(RandomAccessIter first, RandomAccessIter last, get_char getchar, get_length length, compare comp)
- {
- //Don't sort if it's too small to optimize
- if(last - first < detail::MIN_SORT_SIZE)
- std::sort(first, last, comp);
- else {
- //skipping past empties at the beginning, which allows us to get the character type
- //.empty() is not used so as not to require a user declaration of it
- while(!length(*(--last))) {
- //Note: if there is just one non-empty, and it's at the beginning, then it's already in sorted order
- if(first == last)
- return;
- }
- //making last just after the end of the non-empty part of the array
- ++last;
- detail::reverse_string_sort(first, last, getchar, length, comp, *first, getchar((*first), 0));
- }
- }
-}
-
-#endif
diff --git a/src/system_wrappers/source/system_wrappers.gyp b/src/system_wrappers/source/system_wrappers.gyp
deleted file mode 100644
index 0448941..0000000
--- a/src/system_wrappers/source/system_wrappers.gyp
+++ /dev/null
@@ -1,146 +0,0 @@
-# Copyright (c) 2009 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# TODO: Rename files to use *_linux.cpp etc. names, to automatically include relevant files. Remove conditions section.
-
-{
- 'includes': [
- '../../common_settings.gypi', # Common settings
- ],
- 'targets': [
- {
- 'target_name': 'system_wrappers',
- 'type': '<(library)',
- 'include_dirs': [
- 'spreadsortlib',
- '../interface',
- ],
- 'direct_dependent_settings': {
- 'include_dirs': [
- '../interface',
- ],
- },
- 'sources': [
- '../interface/aligned_malloc.h',
- '../interface/atomic32_wrapper.h',
- '../interface/condition_variable_wrapper.h',
- '../interface/cpu_wrapper.h',
- '../interface/cpu_features_wrapper.h',
- '../interface/critical_section_wrapper.h',
- '../interface/event_wrapper.h',
- '../interface/file_wrapper.h',
- '../interface/list_wrapper.h',
- '../interface/map_wrapper.h',
- '../interface/rw_lock_wrapper.h',
- '../interface/sort.h',
- '../interface/thread_wrapper.h',
- '../interface/tick_util.h',
- '../interface/trace.h',
- 'aligned_malloc.cc',
- 'atomic32.cc',
- 'atomic32_linux.h',
- 'atomic32_mac.h',
- 'atomic32_windows.h',
- 'condition_variable.cc',
- 'condition_variable_linux.h',
- 'condition_variable_windows.h',
- 'cpu.cc',
- 'cpu_linux.h',
- 'cpu_mac.h',
- 'cpu_windows.h',
- 'cpu_features.cc',
- 'critical_section.cc',
- 'critical_section_linux.h',
- 'critical_section_windows.h',
- 'event.cc',
- 'event_linux.h',
- 'event_windows.h',
- 'file_impl.cc',
- 'file_impl.h',
- 'list_no_stl.cc',
- 'map.cc',
- 'rw_lock.cc',
- 'rw_lock_linux.h',
- 'rw_lock_windows.h',
- 'sort.cc',
- 'thread.cc',
- 'thread_linux.h',
- 'thread_windows.h',
- 'trace_impl.cc',
- 'trace_impl.h',
- 'trace_linux.h',
- 'trace_windows.h',
- ],
- 'conditions': [
- ['OS=="linux"', {
- 'sources': [
- 'condition_variable_linux.cc',
- 'cpu_linux.cc',
- 'critical_section_linux.cc',
- 'event_linux.cc',
- 'thread_linux.cc',
- 'trace_linux.cc',
- 'rw_lock_linux.cc',
- ],
- 'link_settings': {
- 'libraries': [
- '-lrt',
- ],
- },
- }],
- ['OS=="mac"', {
- 'sources': [
- 'condition_variable_linux.cc',
- 'cpu_mac.cc',
- 'critical_section_linux.cc',
- 'event_linux.cc',
- 'rw_lock_linux.cc',
- 'thread_linux.cc',
- 'trace_linux.cc',
- ],
- }],
- ['OS=="win"', {
- 'sources': [
- 'atomic32_windows.h',
- 'condition_variable_windows.cc',
- 'condition_variable_windows.h',
- 'cpu_windows.cc',
- 'cpu_windows.h',
- 'critical_section_windows.cc',
- 'critical_section_windows.h',
- 'event_windows.cc',
- 'event_windows.h',
- 'rw_lock_windows.cc',
- 'rw_lock_windows.h',
- 'thread_windows.cc',
- 'thread_windows.h',
- 'trace_windows.cc',
- 'trace_windows.h',
- ],
- 'link_settings': {
- 'libraries': [
- '-lwinmm.lib',
- ],
- },
- }],
- ] # conditions
- },
- {
- 'target_name': 'system_wrappersTest',
- 'type': 'executable',
- 'dependencies': [
- 'system_wrappers'
- ],
- 'sources': [
- '../test/Test.cpp',
- ],
- },
- ], # targets
-}
-
-# Local Variables:
-# tab-width:2
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/src/system_wrappers/source/system_wrappers_tests.gyp b/src/system_wrappers/source/system_wrappers_tests.gyp
deleted file mode 100644
index 856f0c1..0000000
--- a/src/system_wrappers/source/system_wrappers_tests.gyp
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS. All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-{
- 'includes': [
- '../../common_settings.gypi',
- ],
- 'targets': [
- {
- 'target_name': 'unittest',
- 'type': 'executable',
- 'dependencies': [
- '../../system_wrappers/source/system_wrappers.gyp:system_wrappers',
- '../../../testing/gtest.gyp:gtest',
- '../../../testing/gtest.gyp:gtest_main',
- ],
- 'include_dirs': [
- '../../../testing/gtest/include',
- ],
- 'sources': [
- 'list_unittest.cc',
- 'map_unittest.cc',
- ],
- },
- ],
-}
-
-# Local Variables:
-# tab-width:2
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/src/system_wrappers/source/thread.cc b/src/system_wrappers/source/thread.cc
deleted file mode 100644
index a136cba..0000000
--- a/src/system_wrappers/source/thread.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "thread_wrapper.h"
-
-#if defined(_WIN32)
- #include "thread_windows.h"
-#else
- #include "thread_linux.h"
-#endif
-
-namespace webrtc {
-ThreadWrapper* ThreadWrapper::CreateThread(ThreadRunFunction func,
- ThreadObj obj, ThreadPriority prio,
- const char* threadName)
-{
-#if defined(_WIN32)
- return new ThreadWindows(func, obj, prio, threadName);
-#else
- return ThreadLinux::Create(func, obj, prio, threadName);
-#endif
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/thread_linux.cc b/src/system_wrappers/source/thread_linux.cc
deleted file mode 100644
index 1281c1b..0000000
--- a/src/system_wrappers/source/thread_linux.cc
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "thread_linux.h"
-
-#include <errno.h>
-#include <string.h> // strncpy
-#include <time.h> // nanosleep
-#include <unistd.h>
-#ifdef WEBRTC_LINUX
-#include <sys/types.h>
-#include <sched.h>
-#include <sys/syscall.h>
-#include <linux/unistd.h>
-#include <sys/prctl.h>
-#endif
-
-#include "event_wrapper.h"
-#include "trace.h"
-
-namespace webrtc {
-extern "C"
-{
- static void* StartThread(void* lpParameter)
- {
- static_cast<ThreadLinux*>(lpParameter)->Run();
- return 0;
- }
-}
-
-#if (defined(WEBRTC_LINUX) && !defined(ANDROID))
-static pid_t gettid()
-{
-#if defined(__NR_gettid)
- return syscall(__NR_gettid);
-#else
- return -1;
-#endif
-}
-#endif
-
-ThreadWrapper* ThreadLinux::Create(ThreadRunFunction func, ThreadObj obj,
- ThreadPriority prio, const char* threadName)
-{
- ThreadLinux* ptr = new ThreadLinux(func, obj, prio, threadName);
- if (!ptr)
- {
- return NULL;
- }
- const int error = ptr->Construct();
- if (error)
- {
- delete ptr;
- return NULL;
- }
- return ptr;
-}
-
-ThreadLinux::ThreadLinux(ThreadRunFunction func, ThreadObj obj,
- ThreadPriority prio, const char* threadName)
- : _runFunction(func),
- _obj(obj),
- _alive(false),
- _dead(true),
- _prio(prio),
- _event(EventWrapper::Create()),
- _setThreadName(false)
-{
-#ifdef WEBRTC_LINUX
- _linuxPid = -1;
-#endif
- if (threadName != NULL)
- {
- _setThreadName = true;
- strncpy(_name, threadName, kThreadMaxNameLength);
- }
-}
-
-int ThreadLinux::Construct()
-{
- int result = 0;
-#if !defined(ANDROID)
- // Enable immediate cancellation if requested, see Shutdown()
- result = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
- if (result != 0)
- {
- return -1;
- }
- result = pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
- if (result != 0)
- {
- return -1;
- }
-#endif
- result = pthread_attr_init(&_attr);
- if (result != 0)
- {
- return -1;
- }
-
- return 0;
-}
-
-ThreadLinux::~ThreadLinux()
-{
- pthread_attr_destroy(&_attr);
- delete _event;
-}
-
-#define HAS_THREAD_ID !defined(MAC_IPHONE) && !defined(MAC_IPHONE_SIM) && \
- !defined(WEBRTC_MAC) && !defined(WEBRTC_MAC_INTEL) && \
- !defined(MAC_DYLIB) && !defined(MAC_INTEL_DYLIB)
-#if HAS_THREAD_ID
-bool ThreadLinux::Start(unsigned int& threadID)
-#else
-bool ThreadLinux::Start(unsigned int& /*threadID*/)
-#endif
-{
- if (!_runFunction)
- {
- return false;
- }
- int result = pthread_attr_setdetachstate(&_attr, PTHREAD_CREATE_DETACHED);
- // Set the stack stack size to 1M.
- result |= pthread_attr_setstacksize(&_attr, 1024*1024);
-#ifdef WEBRTC_THREAD_RR
- const int policy = SCHED_RR;
-#else
- const int policy = SCHED_FIFO;
-#endif
- _event->Reset();
- result |= pthread_create(&_thread, &_attr, &StartThread, this);
- if (result != 0)
- {
- return false;
- }
-
- // Wait up to 10 seconds for the OS to call the callback function. Prevents
- // race condition if Stop() is called too quickly after start.
- if (kEventSignaled != _event->Wait(WEBRTC_EVENT_10_SEC))
- {
- // Timed out. Something went wrong.
- _runFunction = NULL;
- return false;
- }
-
-#if HAS_THREAD_ID
- threadID = static_cast<unsigned int>(_thread);
-#endif
- sched_param param;
-
- const int minPrio = sched_get_priority_min(policy);
- const int maxPrio = sched_get_priority_max(policy);
- if ((minPrio == EINVAL) || (maxPrio == EINVAL))
- {
- return false;
- }
-
- switch (_prio)
- {
- case kLowPriority:
- param.sched_priority = minPrio + 1;
- break;
- case kNormalPriority:
- param.sched_priority = (minPrio + maxPrio) / 2;
- break;
- case kHighPriority:
- param.sched_priority = maxPrio - 3;
- break;
- case kHighestPriority:
- param.sched_priority = maxPrio - 2;
- break;
- case kRealtimePriority:
- param.sched_priority = maxPrio - 1;
- break;
- default:
- return false;
- }
- result = pthread_setschedparam(_thread, policy, ¶m);
- if (result == EINVAL)
- {
- return false;
- }
- return true;
-}
-
-#if (defined(WEBRTC_LINUX) && !defined(ANDROID))
-bool ThreadLinux::SetAffinity(const int* processorNumbers,
- const unsigned int amountOfProcessors)
-{
- if (!processorNumbers || (amountOfProcessors == 0))
- {
- return false;
- }
-
- cpu_set_t mask;
- CPU_ZERO(&mask);
-
- for(unsigned int processor = 0;
- processor < amountOfProcessors;
- processor++)
- {
- CPU_SET(processorNumbers[processor], &mask);
- }
- const int result = sched_setaffinity(_linuxPid, (unsigned int)sizeof(mask),
- &mask);
- if (result != 0)
- {
- return false;
-
- }
- return true;
-}
-#else
-// NOTE: On Mac OS X, use the Thread affinity API in
-// /usr/include/mach/thread_policy.h: thread_policy_set and mach_thread_self()
-// instead of Linux gettid() syscall.
-bool ThreadLinux::SetAffinity(const int* , const unsigned int)
-{
- return false;
-}
-#endif
-
-void ThreadLinux::SetNotAlive()
-{
- _alive = false;
-}
-
-bool ThreadLinux::Shutdown()
-{
-#if !defined(ANDROID)
- if (_thread && (0 != pthread_cancel(_thread)))
- {
- return false;
- }
-
- return true;
-#else
- return false;
-#endif
-}
-
-bool ThreadLinux::Stop()
-{
- _alive = false;
-
- // TODO (hellner) why not use an event here?
- // Wait up to 10 seconds for the thread to terminate
- for (int i = 0; i < 1000 && !_dead; i++)
- {
- timespec t;
- t.tv_sec = 0;
- t.tv_nsec = 10*1000*1000;
- nanosleep(&t, NULL);
- }
- if (_dead)
- {
- return true;
- }
- else
- {
- return false;
- }
-}
-
-void ThreadLinux::Run()
-{
- _alive = true;
- _dead = false;
-#ifdef WEBRTC_LINUX
- if(_linuxPid == -1)
- {
- _linuxPid = gettid();
- }
-#endif
- // The event the Start() is waiting for.
- _event->Set();
-
- if (_setThreadName)
- {
-#ifdef WEBRTC_LINUX
- WEBRTC_TRACE(kTraceStateInfo, kTraceUtility,-1,
- "Thread with id:%d name:%s started ", _linuxPid, _name);
- prctl(PR_SET_NAME, (unsigned long)_name, 0, 0, 0);
-#else
- WEBRTC_TRACE(kTraceStateInfo, kTraceUtility,-1,
- "Thread with name:%s started ", _name);
-#endif
- }else
- {
-#ifdef WEBRTC_LINUX
- WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1,
- "Thread with id:%d without name started", _linuxPid);
-#else
- WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1,
- "Thread without name started");
-#endif
- }
- do
- {
- if (_runFunction)
- {
- if (!_runFunction(_obj))
- {
- _alive = false;
- }
- }
- else
- {
- _alive = false;
- }
- }
- while (_alive);
-
- if (_setThreadName)
- {
- // Don't set the name for the trace thread because it may cause a
- // deadlock. TODO (hellner) there should be a better solution than
- // coupling the thread and the trace class like this.
- if (strcmp(_name, "Trace"))
- {
- WEBRTC_TRACE(kTraceStateInfo, kTraceUtility,-1,
- "Thread with name:%s stopped", _name);
- }
- }
- else
- {
- WEBRTC_TRACE(kTraceStateInfo, kTraceUtility,-1,
- "Thread without name stopped");
- }
- _dead = true;
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/thread_linux.h b/src/system_wrappers/source/thread_linux.h
deleted file mode 100644
index 3e2b908..0000000
--- a/src/system_wrappers/source/thread_linux.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_THREAD_LINUX_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_THREAD_LINUX_H_
-
-#include "thread_wrapper.h"
-#include <pthread.h>
-
-namespace webrtc {
-class EventWrapper;
-
-class ThreadLinux : public ThreadWrapper
-{
-public:
- static ThreadWrapper* Create(ThreadRunFunction func, ThreadObj obj,
- ThreadPriority prio, const char* threadName);
-
- ThreadLinux(ThreadRunFunction func, ThreadObj obj, ThreadPriority prio,
- const char* threadName);
- ~ThreadLinux();
-
- // From ThreadWrapper
- virtual void SetNotAlive();
- virtual bool Start(unsigned int& id);
- // Not implemented on Mac
- virtual bool SetAffinity(const int* processorNumbers,
- unsigned int amountOfProcessors);
- virtual bool Stop();
- virtual bool Shutdown();
-
- void Run();
-
-private:
- int Construct();
-
-private:
- // processing function
- ThreadRunFunction _runFunction;
- ThreadObj _obj;
-
- // internal state
- bool _alive;
- bool _dead;
- ThreadPriority _prio;
- EventWrapper* _event;
-
- // zero-terminated thread name string
- char _name[kThreadMaxNameLength];
- bool _setThreadName;
-
- // handle to thread
- pthread_attr_t _attr;
- pthread_t _thread;
-#ifdef WEBRTC_LINUX
- pid_t _linuxPid;
-#endif
-
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_THREAD_LINUX_H_
diff --git a/src/system_wrappers/source/trace_impl.cc b/src/system_wrappers/source/trace_impl.cc
deleted file mode 100644
index 0a5f9db..0000000
--- a/src/system_wrappers/source/trace_impl.cc
+++ /dev/null
@@ -1,949 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "trace_impl.h"
-
-#include <cassert>
-#include <string.h> // memset
-
-#ifdef _WIN32
-#include "trace_windows.h"
-#include "fix_interlocked_exchange_pointer_windows.h"
-#else
-#include <stdio.h>
-#include <time.h>
-#include <stdarg.h>
-#include "trace_linux.h"
-#endif // _WIN32
-
-#define KEY_LEN_CHARS 31
-
-#ifdef _WIN32
- #pragma warning(disable:4355)
-// VS 2005: Disable warnings for default initialized arrays.
- #pragma warning(disable:4351)
-#endif // _WIN32
-
-namespace webrtc {
-static WebRtc_UWord32 levelFilter = kTraceDefault;
-
-// Construct On First Use idiom. Avoids "static initialization order fiasco".
-Trace* TraceImpl::StaticInstance(TraceCount inc, const TraceLevel level)
-{
- // TODO (hellner): use atomic wrapper instead.
- static volatile long theTraceCount = 0;
- static Trace* volatile theTrace = NULL;
-
- TraceCreate state = WEBRTC_TRACE_EXIST;
-
- // Sanitys to avoid taking lock unless absolutely necessary (for
- // performance reasons). inc == WEBRTC_TRACE_INC_NO_CREATE) implies that
- // a message will be written to file.
- if(level != kTraceAll && inc == WEBRTC_TRACE_INC_NO_CREATE)
- {
- if(!(level & levelFilter))
- {
- return NULL;
- }
- }
-
-#ifndef _WIN32
- // TODO (pwestin): crtiSect is never reclaimed. Fix memory leak.
- static CriticalSectionWrapper* crtiSect(
- CriticalSectionWrapper::CreateCriticalSection());
- CriticalSectionScoped lock(*crtiSect);
-
- if(inc == WEBRTC_TRACE_INC_NO_CREATE && theTraceCount == 0)
- {
- return NULL;
- }
-
- if(inc == WEBRTC_TRACE_INC || inc == WEBRTC_TRACE_INC_NO_CREATE)
- {
- theTraceCount++;
- if(theTraceCount == 1)
- {
- state = WEBRTC_TRACE_CREATE;
- }
- } else {
- theTraceCount--;
- if(theTraceCount == 0)
- {
- state = WEBRTC_TRACE_DESTROY;
- }
- }
- if(state == WEBRTC_TRACE_CREATE)
- {
- theTrace = TraceImpl::CreateTrace();
-
- } else if(state == WEBRTC_TRACE_DESTROY) {
- Trace* oldValue = theTrace;
- theTrace = NULL;
- // The lock is held by the scoped critical section. Release the lock
- // temporarily so that the trace can be safely deleted. If the lock
- // was kept during the delete, e.g. creating and destroying the trace
- // too quickly may lead to a deadlock.
- // This is due to the fact that starting and stopping a ThreadWrapper
- // thread will trigger writing of trace messages.
- // TODO (hellner): remove the tight coupling with the thread
- // implementation.
- crtiSect->Leave();
- if(oldValue)
- {
- delete static_cast<TraceImpl*>(oldValue);
- }
- // Re-aqcuire the lock.
- crtiSect->Enter();
- return NULL;
- }
-#else // _WIN32
- if(inc == WEBRTC_TRACE_INC_NO_CREATE && theTraceCount == 0)
- {
- return NULL;
- }
- if(inc == WEBRTC_TRACE_INC_NO_CREATE)
- {
- if(1 == InterlockedIncrement(&theTraceCount))
- {
- // The trace has been destroyed by some other thread. Rollback.
- InterlockedDecrement(&theTraceCount);
- assert(false);
- return NULL;
- }
- // Sanity to catch corrupt state.
- if(theTrace == NULL)
- {
- assert(false);
- InterlockedDecrement(&theTraceCount);
- return NULL;
- }
- } else if(inc == WEBRTC_TRACE_INC) {
- if(theTraceCount == 0)
- {
- state = WEBRTC_TRACE_CREATE;
- } else {
- if(1 == InterlockedIncrement(&theTraceCount))
- {
- // InterlockedDecrement because reference count should not be
- // updated just yet (that's done when the trace is created).
- InterlockedDecrement(&theTraceCount);
- state = WEBRTC_TRACE_CREATE;
- }
- }
- } else {
- int newValue = InterlockedDecrement(&theTraceCount);
- if(newValue == 0)
- {
- state = WEBRTC_TRACE_DESTROY;
- }
- }
-
- if(state == WEBRTC_TRACE_CREATE)
- {
- // Create trace and let whichever thread finishes first assign its local
- // copy to the global instance. All other threads reclaim their local
- // copy.
- Trace* newTrace = TraceImpl::CreateTrace();
- if(1 == InterlockedIncrement(&theTraceCount))
- {
- Trace* oldValue = (Trace*)InterlockedExchangePointer(
- reinterpret_cast<void* volatile*>(&theTrace), newTrace);
- assert(oldValue == NULL);
- assert(theTrace);
- } else {
- InterlockedDecrement(&theTraceCount);
- if(newTrace)
- {
- delete static_cast<TraceImpl*>(newTrace);
- }
- }
- return NULL;
- } else if(state == WEBRTC_TRACE_DESTROY)
- {
- Trace* oldValue = (Trace*)InterlockedExchangePointer(
- reinterpret_cast<void* volatile*>(&theTrace), NULL);
- if(oldValue)
- {
- delete static_cast<TraceImpl*>(oldValue);
- }
- return NULL;
- }
-#endif // #ifndef _WIN32
- return theTrace;
-}
-
-void Trace::CreateTrace()
-{
- TraceImpl::StaticInstance(WEBRTC_TRACE_INC);
-}
-
-void Trace::ReturnTrace()
-{
- TraceImpl::StaticInstance(WEBRTC_TRACE_DEC);
-}
-
-TraceImpl* TraceImpl::GetTrace(const TraceLevel level)
-{
- return (TraceImpl*)StaticInstance(WEBRTC_TRACE_INC_NO_CREATE, level);
-}
-
-Trace* TraceImpl::CreateTrace()
-{
-#if defined(_WIN32)
- return new TraceWindows();
-#else
- return new TraceLinux();
-#endif
-}
-
-TraceImpl::TraceImpl()
- : _critsectInterface(*CriticalSectionWrapper::CreateCriticalSection()),
- _callback(NULL),
- _rowCountText(0),
- _fileCountText(0),
- _traceFile(*FileWrapper::Create()),
- _thread(*ThreadWrapper::CreateThread(TraceImpl::Run, this,
- kHighestPriority, "Trace")),
- _event(*EventWrapper::Create()),
- _critsectArray(*CriticalSectionWrapper::CreateCriticalSection()),
- _nextFreeIdx(),
- _level(),
- _length(),
- _messageQueue(),
- _activeQueue(0)
-{
- _nextFreeIdx[0] = 0;
- _nextFreeIdx[1] = 0;
-
- unsigned int tid = 0;
- _thread.Start(tid);
-
- for(int m = 0; m < WEBRTC_TRACE_NUM_ARRAY; m++)
- {
- for(int n = 0; n < WEBRTC_TRACE_MAX_QUEUE; n++)
- {
- _messageQueue[m][n] = new
- WebRtc_Word8[WEBRTC_TRACE_MAX_MESSAGE_SIZE];
- }
- }
-}
-
-bool TraceImpl::StopThread()
-{
- // Release the worker thread so that it can flush any lingering messages.
- _event.Set();
-
- // Allow 10 ms for pending messages to be flushed out.
- // TODO (hellner): why not use condition variables to do this? Or let the
- // worker thread die and let this thread flush remaining
- // messages?
-#ifdef _WIN32
- Sleep(10);
-#else
- timespec t;
- t.tv_sec = 0;
- t.tv_nsec = 10*1000000;
- nanosleep(&t,NULL);
-#endif
-
- _thread.SetNotAlive();
- // Make sure the thread finishes as quickly as possible (instead of having
- // to wait for the timeout).
- _event.Set();
- bool stopped = _thread.Stop();
-
- CriticalSectionScoped lock(_critsectInterface);
- _traceFile.Flush();
- _traceFile.CloseFile();
- return stopped;
-}
-
-TraceImpl::~TraceImpl()
-{
- StopThread();
- delete &_event;
- delete &_traceFile;
- delete &_thread;
- delete &_critsectInterface;
- delete &_critsectArray;
-
- for(int m = 0; m < WEBRTC_TRACE_NUM_ARRAY; m++)
- {
- for(int n = 0; n < WEBRTC_TRACE_MAX_QUEUE; n++)
- {
- delete [] _messageQueue[m][n];
- }
- }
-}
-
-WebRtc_Word32 TraceImpl::AddLevel(char* szMessage, const TraceLevel level) const
-{
- switch (level)
- {
- case kTraceStateInfo:
- sprintf (szMessage, "STATEINFO ; ");
- break;
- case kTraceWarning:
- sprintf (szMessage, "WARNING ; ");
- break;
- case kTraceError:
- sprintf (szMessage, "ERROR ; ");
- break;
- case kTraceCritical:
- sprintf (szMessage, "CRITICAL ; ");
- break;
- case kTraceInfo:
- sprintf (szMessage, "DEBUGINFO ; ");
- break;
- case kTraceModuleCall:
- sprintf (szMessage, "MODULECALL; ");
- break;
- case kTraceMemory:
- sprintf (szMessage, "MEMORY ; ");
- break;
- case kTraceTimer:
- sprintf (szMessage, "TIMER ; ");
- break;
- case kTraceStream:
- sprintf (szMessage, "STREAM ; ");
- break;
- case kTraceApiCall:
- sprintf (szMessage, "APICALL ; ");
- break;
- case kTraceDebug:
- sprintf (szMessage, "DEBUG ; ");
- break;
- default:
- assert(false);
- return 0;
- }
- // All messages are 12 characters.
- return 12;
-}
-
-WebRtc_Word32 TraceImpl::AddModuleAndId(char* traceMessage,
- const TraceModule module,
- const WebRtc_Word32 id) const
-{
- // Use long int to prevent problems with different definitions of
- // WebRtc_Word32.
- // TODO (hellner): is this actually a problem? If so, it should be better to
- // clean up WebRtc_Word32
- const long int idl = id;
- if(idl != -1)
- {
- const unsigned long int idEngine = id>>16;
- const unsigned long int idChannel = id & 0xffff;
-
- switch (module)
- {
- case kTraceVoice:
- sprintf(traceMessage, " VOICE:%5ld %5ld;", idEngine,
- idChannel);
- break;
- case kTraceVideo:
- sprintf(traceMessage, " VIDEO:%5ld %5ld;", idEngine,
- idChannel);
- break;
- case kTraceUtility:
- sprintf(traceMessage, " UTILITY:%5ld %5ld;", idEngine,
- idChannel);
- break;
- case kTraceRtpRtcp:
- sprintf(traceMessage, " RTP/RTCP:%5ld %5ld;", idEngine,
- idChannel);
- break;
- case kTraceTransport:
- sprintf(traceMessage, " TRANSPORT:%5ld %5ld;", idEngine,
- idChannel);
- break;
- case kTraceAudioCoding:
- sprintf(traceMessage, "AUDIO CODING:%5ld %5ld;", idEngine,
- idChannel);
- break;
- case kTraceSrtp:
- sprintf(traceMessage, " SRTP:%5ld %5ld;", idEngine,
- idChannel);
- break;
- case kTraceAudioMixerServer:
- sprintf(traceMessage, " AUDIO MIX/S:%5ld %5ld;", idEngine,
- idChannel);
- break;
- case kTraceAudioMixerClient:
- sprintf(traceMessage, " AUDIO MIX/C:%5ld %5ld;", idEngine,
- idChannel);
- break;
- case kTraceVideoCoding:
- sprintf(traceMessage, "VIDEO CODING:%5ld %5ld;", idEngine,
- idChannel);
- break;
- case kTraceVideoMixer:
- // Print sleep time and API call
- sprintf(traceMessage, " VIDEO MIX:%5ld %5ld;", idEngine,
- idChannel);
- break;
- case kTraceFile:
- sprintf(traceMessage, " FILE:%5ld %5ld;", idEngine,
- idChannel);
- break;
- case kTraceAudioProcessing:
- sprintf(traceMessage, " AUDIO PROC:%5ld %5ld;", idEngine,
- idChannel);
- break;
- case kTraceAudioDevice:
- sprintf(traceMessage, "AUDIO DEVICE:%5ld %5ld;", idEngine,
- idChannel);
- break;
- case kTraceVideoRenderer:
- sprintf(traceMessage, "VIDEO RENDER:%5ld %5ld;", idEngine,
- idChannel);
- break;
- case kTraceVideoCapture:
- sprintf(traceMessage, "VIDEO CAPTUR:%5ld %5ld;", idEngine,
- idChannel);
- break;
- case kTraceVideoPreocessing:
- sprintf(traceMessage, " VIDEO PROC:%5ld %5ld;", idEngine,
- idChannel);
- break;
- default:
- assert(false);
- return 0;
- }
- } else {
- switch (module)
- {
- case kTraceVoice:
- sprintf (traceMessage, " VOICE:%11ld;", idl);
- break;
- case kTraceVideo:
- sprintf (traceMessage, " VIDEO:%11ld;", idl);
- break;
- case kTraceUtility:
- sprintf (traceMessage, " UTILITY:%11ld;", idl);
- break;
- case kTraceRtpRtcp:
- sprintf (traceMessage, " RTP/RTCP:%11ld;", idl);
- break;
- case kTraceTransport:
- sprintf (traceMessage, " TRANSPORT:%11ld;", idl);
- break;
- case kTraceAudioCoding:
- sprintf (traceMessage, "AUDIO CODING:%11ld;", idl);
- break;
- case kTraceSrtp:
- sprintf (traceMessage, " SRTP:%11ld;", idl);
- break;
- case kTraceAudioMixerServer:
- sprintf (traceMessage, " AUDIO MIX/S:%11ld;", idl);
- break;
- case kTraceAudioMixerClient:
- sprintf (traceMessage, " AUDIO MIX/C:%11ld;", idl);
- break;
- case kTraceVideoCoding:
- sprintf (traceMessage, "VIDEO CODING:%11ld;", idl);
- break;
- case kTraceVideoMixer:
- sprintf (traceMessage, " VIDEO MIX:%11ld;", idl);
- break;
- case kTraceFile:
- sprintf (traceMessage, " FILE:%11ld;", idl);
- break;
- case kTraceAudioProcessing:
- sprintf (traceMessage, " AUDIO PROC:%11ld;", idl);
- break;
- case kTraceAudioDevice:
- sprintf (traceMessage, "AUDIO DEVICE:%11ld;", idl);
- break;
- case kTraceVideoRenderer:
- sprintf (traceMessage, "VIDEO RENDER:%11ld;", idl);
- break;
- case kTraceVideoCapture:
- sprintf (traceMessage, "VIDEO CAPTUR:%11ld;", idl);
- break;
- case kTraceVideoPreocessing:
- sprintf (traceMessage, " VIDEO PROC:%11ld;", idl);
- break;
- default:
- assert(false);
- return 0;
- }
- }
- // All messages are 25 characters.
- return 25;
-}
-
-WebRtc_Word32 TraceImpl::SetTraceFileImpl(const WebRtc_Word8* fileNameUTF8,
- const bool addFileCounter)
-{
- CriticalSectionScoped lock(_critsectInterface);
-
- _traceFile.Flush();
- _traceFile.CloseFile();
-
- if(fileNameUTF8)
- {
- if(addFileCounter)
- {
- _fileCountText = 1;
-
- WebRtc_Word8 fileNameWithCounterUTF8[FileWrapper::kMaxFileNameSize];
- CreateFileName(fileNameUTF8, fileNameWithCounterUTF8,
- _fileCountText);
- if(_traceFile.OpenFile(fileNameWithCounterUTF8, false, false,
- true) == -1)
- {
- return -1;
- }
- }else {
- _fileCountText = 0;
- if(_traceFile.OpenFile(fileNameUTF8, false, false, true) == -1)
- {
- return -1;
- }
- }
- }
- _rowCountText = 0;
- return 0;
-}
-
-WebRtc_Word32 TraceImpl::TraceFileImpl(
- WebRtc_Word8 fileNameUTF8[FileWrapper::kMaxFileNameSize])
-{
- CriticalSectionScoped lock(_critsectInterface);
- return _traceFile.FileName(fileNameUTF8, FileWrapper::kMaxFileNameSize);
-}
-
-WebRtc_Word32 TraceImpl::SetTraceCallbackImpl(TraceCallback* callback)
-{
- CriticalSectionScoped lock(_critsectInterface);
- _callback = callback;
- return 0;
-}
-
-WebRtc_Word32 TraceImpl::AddMessage(
- char* traceMessage,
- const char msg[WEBRTC_TRACE_MAX_MESSAGE_SIZE],
- const WebRtc_UWord16 writtenSoFar) const
-
-{
- int length = 0;
- if(writtenSoFar >= WEBRTC_TRACE_MAX_MESSAGE_SIZE)
- {
- return -1;
- }
- // - 2 to leave room for newline and NULL termination
-#ifdef _WIN32
- length = _snprintf(traceMessage,
- WEBRTC_TRACE_MAX_MESSAGE_SIZE - writtenSoFar - 2,
- "%s",msg);
- if(length < 0)
- {
- length = WEBRTC_TRACE_MAX_MESSAGE_SIZE - writtenSoFar - 2;
- traceMessage[length] = 0;
- }
-#else
- length = snprintf(traceMessage,
- WEBRTC_TRACE_MAX_MESSAGE_SIZE-writtenSoFar-2, "%s",msg);
- if(length < 0 || length > WEBRTC_TRACE_MAX_MESSAGE_SIZE-writtenSoFar - 2)
- {
- length = WEBRTC_TRACE_MAX_MESSAGE_SIZE - writtenSoFar - 2;
- traceMessage[length] = 0;
- }
-#endif
- // Length with NULL termination.
- return length+1;
-}
-
-void TraceImpl::AddMessageToList(
- const char traceMessage[WEBRTC_TRACE_MAX_MESSAGE_SIZE],
- const WebRtc_UWord16 length,
- const TraceLevel level)
-{
- CriticalSectionScoped lock(_critsectArray);
-
- if(_nextFreeIdx[_activeQueue] >= WEBRTC_TRACE_MAX_QUEUE)
- {
- if( ! _traceFile.Open() &&
- !_callback)
- {
- // Keep at least the last 1/4 of old messages when not logging.
- // TODO (hellner): isn't this redundant. The user will make it known
- // when to start logging. Why keep messages before
- // that?
- for(int n = 0; n < WEBRTC_TRACE_MAX_QUEUE/4; n++)
- {
- const int lastQuarterOffset = (3*WEBRTC_TRACE_MAX_QUEUE/4);
- memcpy(_messageQueue[_activeQueue][n],
- _messageQueue[_activeQueue][n + lastQuarterOffset],
- WEBRTC_TRACE_MAX_MESSAGE_SIZE);
- }
- _nextFreeIdx[_activeQueue] = WEBRTC_TRACE_MAX_QUEUE/4;
- } else {
- // More messages are being written than there is room for in the
- // buffer. Drop any new messages.
- // TODO (hellner): its probably better to drop old messages instead
- // of new ones. One step further: if this happens
- // it's due to writing faster than what can be
- // processed. Maybe modify the filter at this point.
- // E.g. turn of STREAM.
- return;
- }
- }
-
- WebRtc_UWord16 idx = _nextFreeIdx[_activeQueue];
- _nextFreeIdx[_activeQueue]++;
-
- _level[_activeQueue][idx] = level;
- _length[_activeQueue][idx] = length;
- memcpy(_messageQueue[_activeQueue][idx], traceMessage, length);
-
- if(_nextFreeIdx[_activeQueue] == WEBRTC_TRACE_MAX_QUEUE-1)
- {
- // Loggin more messages than can be worked off. Log a warning.
- memcpy(_messageQueue[_activeQueue][_nextFreeIdx[_activeQueue]],
- "WARNING MISSING TRACE MESSAGES\n", 32);
- _nextFreeIdx[_activeQueue]++;
- }
-}
-
-bool TraceImpl::Run(void* obj)
-{
- return static_cast<TraceImpl*>(obj)->Process();
-}
-
-bool TraceImpl::Process()
-{
- if(_event.Wait(1000) == kEventSignaled)
- {
- if(_traceFile.Open() || _callback)
- {
- // File mode (not calback mode).
- WriteToFile();
- }
- } else {
- _traceFile.Flush();
- }
- return true;
-}
-
-void TraceImpl::WriteToFile()
-{
- WebRtc_UWord8 localQueueActive = 0;
- WebRtc_UWord16 localNextFreeIdx = 0;
-
- // There are two buffer. One for reading (for writing to file) and one for
- // writing (for storing new messages). Let new messages be posted to the
- // unused buffer so that the current buffer can be flushed safely.
- {
- CriticalSectionScoped lock(_critsectArray);
- localNextFreeIdx = _nextFreeIdx[_activeQueue];
- _nextFreeIdx[_activeQueue] = 0;
- localQueueActive = _activeQueue;
- if(_activeQueue == 0)
- {
- _activeQueue = 1;
- } else
- {
- _activeQueue = 0;
- }
- }
- if(localNextFreeIdx == 0)
- {
- return;
- }
-
- CriticalSectionScoped lock(_critsectInterface);
-
- for(WebRtc_UWord16 idx = 0; idx <localNextFreeIdx; idx++)
- {
- TraceLevel localLevel = _level[localQueueActive][idx];
- if(_callback)
- {
- _callback->Print(localLevel, _messageQueue[localQueueActive][idx],
- _length[localQueueActive][idx]);
- }
- if(_traceFile.Open())
- {
- if(_rowCountText > WEBRTC_TRACE_MAX_FILE_SIZE)
- {
- // wrap file
- _rowCountText = 0;
- _traceFile.Flush();
-
- if(_fileCountText == 0)
- {
- _traceFile.Rewind();
- } else
- {
- WebRtc_Word8 oldFileName[FileWrapper::kMaxFileNameSize];
- WebRtc_Word8 newFileName[FileWrapper::kMaxFileNameSize];
-
- // get current name
- _traceFile.FileName(oldFileName,
- FileWrapper::kMaxFileNameSize);
- _traceFile.CloseFile();
-
- _fileCountText++;
-
- UpdateFileName(oldFileName, newFileName, _fileCountText);
-
- if(_traceFile.OpenFile(newFileName, false, false,
- true) == -1)
- {
- return;
- }
- }
- }
- if(_rowCountText == 0)
- {
- WebRtc_Word8 message[WEBRTC_TRACE_MAX_MESSAGE_SIZE + 1];
- WebRtc_Word32 length = AddDateTimeInfo(message);
- if(length != -1)
- {
- message[length] = 0;
- message[length-1] = '\n';
- _traceFile.Write(message, length);
- _rowCountText++;
- }
- length = AddBuildInfo(message);
- if(length != -1)
- {
- message[length+1] = 0;
- message[length] = '\n';
- message[length-1] = '\n';
- _traceFile.Write(message, length+1);
- _rowCountText++;
- _rowCountText++;
- }
- }
- WebRtc_UWord16 length = _length[localQueueActive][idx];
- _messageQueue[localQueueActive][idx][length] = 0;
- _messageQueue[localQueueActive][idx][length-1] = '\n';
- _traceFile.Write(_messageQueue[localQueueActive][idx], length);
- _rowCountText++;
- }
- }
-}
-
-void TraceImpl::AddImpl(const TraceLevel level, const TraceModule module,
- const WebRtc_Word32 id,
- const char msg[WEBRTC_TRACE_MAX_MESSAGE_SIZE])
-{
- if (TraceCheck(level))
- {
- char traceMessage[WEBRTC_TRACE_MAX_MESSAGE_SIZE];
- char* meassagePtr = traceMessage;
-
- WebRtc_Word32 len = 0;
- WebRtc_Word32 ackLen = 0;
-
- len = AddLevel(meassagePtr, level);
- if(len == -1)
- {
- return;
- }
- meassagePtr += len;
- ackLen += len;
-
- len = AddTime(meassagePtr, level);
- if(len == -1)
- {
- return;
- }
- meassagePtr += len;
- ackLen += len;
-
- len = AddModuleAndId(meassagePtr, module, id);
- if(len == -1)
- {
- return;
- }
- meassagePtr += len;
- ackLen += len;
-
- len = AddThreadId(meassagePtr);
- if(len == -1)
- {
- return;
- }
- meassagePtr += len;
- ackLen += len;
-
- len = AddMessage(meassagePtr, msg, (WebRtc_UWord16)ackLen);
- if(len == -1)
- {
- return;
- }
- ackLen += len;
- AddMessageToList(traceMessage,(WebRtc_UWord16)ackLen, level);
-
- // Make sure that messages are written as soon as possible.
- _event.Set();
- }
-}
-
-bool TraceImpl::TraceCheck(const TraceLevel level) const
-{
- return (level & levelFilter)? true:false;
-}
-
-bool TraceImpl::UpdateFileName(
- const WebRtc_Word8 fileNameUTF8[FileWrapper::kMaxFileNameSize],
- WebRtc_Word8 fileNameWithCounterUTF8[FileWrapper::kMaxFileNameSize],
- const WebRtc_UWord32 newCount) const
-{
- WebRtc_Word32 length = (WebRtc_Word32)strlen(fileNameUTF8);
- if(length < 0)
- {
- return false;
- }
-
- WebRtc_Word32 lengthWithoutFileEnding = length-1;
- while(lengthWithoutFileEnding > 0)
- {
- if(fileNameUTF8[lengthWithoutFileEnding] == '.')
- {
- break;
- } else {
- lengthWithoutFileEnding--;
- }
- }
- if(lengthWithoutFileEnding == 0)
- {
- lengthWithoutFileEnding = length;
- }
- WebRtc_Word32 lengthTo_ = lengthWithoutFileEnding - 1;
- while(lengthTo_ > 0)
- {
- if(fileNameUTF8[lengthTo_] == '_')
- {
- break;
- } else {
- lengthTo_--;
- }
- }
-
- memcpy(fileNameWithCounterUTF8, fileNameUTF8, lengthTo_);
- sprintf(fileNameWithCounterUTF8+lengthTo_, "_%lu%s", newCount,
- fileNameUTF8+lengthWithoutFileEnding);
- return true;
-}
-
-bool TraceImpl::CreateFileName(
- const WebRtc_Word8 fileNameUTF8[FileWrapper::kMaxFileNameSize],
- WebRtc_Word8 fileNameWithCounterUTF8[FileWrapper::kMaxFileNameSize],
- const WebRtc_UWord32 newCount) const
-{
- WebRtc_Word32 length = (WebRtc_Word32)strlen(fileNameUTF8);
- if(length < 0)
- {
- return false;
- }
-
- WebRtc_Word32 lengthWithoutFileEnding = length-1;
- while(lengthWithoutFileEnding > 0)
- {
- if(fileNameUTF8[lengthWithoutFileEnding] == '.')
- {
- break;
- }else
- {
- lengthWithoutFileEnding--;
- }
- }
- if(lengthWithoutFileEnding == 0)
- {
- lengthWithoutFileEnding = length;
- }
- memcpy(fileNameWithCounterUTF8, fileNameUTF8, lengthWithoutFileEnding);
- sprintf(fileNameWithCounterUTF8+lengthWithoutFileEnding, "_%lu%s",
- newCount, fileNameUTF8+lengthWithoutFileEnding);
- return true;
-}
-
-WebRtc_Word32 Trace::SetLevelFilter(WebRtc_UWord32 filter)
-{
- levelFilter = filter;
- return 0;
-};
-
-WebRtc_Word32 Trace::LevelFilter(WebRtc_UWord32& filter)
-{
- filter = levelFilter;
- return 0;
-};
-
-WebRtc_Word32 Trace::TraceFile(WebRtc_Word8 fileName[FileWrapper::kMaxFileNameSize])
-{
- TraceImpl* trace = TraceImpl::GetTrace();
- if(trace)
- {
- int retVal = trace->TraceFileImpl(fileName);
- ReturnTrace();
- return retVal;
- }
- return -1;
-}
-
-WebRtc_Word32 Trace::SetTraceFile(const WebRtc_Word8* fileName,
- const bool addFileCounter)
-{
- TraceImpl* trace = TraceImpl::GetTrace();
- if(trace)
- {
- int retVal = trace->SetTraceFileImpl(fileName, addFileCounter);
- ReturnTrace();
- return retVal;
- }
- return -1;
-}
-
-WebRtc_Word32 Trace::SetTraceCallback(TraceCallback* callback)
-{
- TraceImpl* trace = TraceImpl::GetTrace();
- if(trace)
- {
- int retVal = trace->SetTraceCallbackImpl(callback);
- ReturnTrace();
- return retVal;
- }
- return -1;
-}
-
-void Trace::Add(const TraceLevel level, const TraceModule module,
- const WebRtc_Word32 id, const char* msg, ...)
-
-{
- TraceImpl* trace = TraceImpl::GetTrace(level);
- if(trace)
- {
- if(trace->TraceCheck(level))
- {
- char tempBuff[WEBRTC_TRACE_MAX_MESSAGE_SIZE];
- char* buff = 0;
- if(msg)
- {
- va_list args;
- va_start(args, msg);
-#ifdef _WIN32
- _vsnprintf(tempBuff,WEBRTC_TRACE_MAX_MESSAGE_SIZE-1,msg,args);
-#else
- vsnprintf(tempBuff,WEBRTC_TRACE_MAX_MESSAGE_SIZE-1,msg,args);
-#endif
- va_end(args);
- buff = tempBuff;
- }
- trace->AddImpl(level, module, id, buff);
- }
- ReturnTrace();
- }
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/trace_impl.h b/src/system_wrappers/source/trace_impl.h
deleted file mode 100644
index 42e82fe..0000000
--- a/src/system_wrappers/source/trace_impl.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_TRACE_IMPL_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_TRACE_IMPL_H_
-
-#include "system_wrappers/interface/critical_section_wrapper.h"
-#include "system_wrappers/interface/event_wrapper.h"
-#include "system_wrappers/interface/file_wrapper.h"
-#include "system_wrappers/interface/trace.h"
-#include "system_wrappers/interface/thread_wrapper.h"
-
-namespace webrtc {
-enum TraceCount
-{
- WEBRTC_TRACE_DEC = 0,
- WEBRTC_TRACE_INC = 1,
- WEBRTC_TRACE_INC_NO_CREATE = 2
-};
-
-enum TraceCreate
-{
- WEBRTC_TRACE_EXIST = 0,
- WEBRTC_TRACE_CREATE = 1,
- WEBRTC_TRACE_DESTROY = 2
-};
-
-// TODO (pwestin) WEBRTC_TRACE_MAX_QUEUE needs to be tweaked
-// TODO (hellner) the buffer should be close to how much the system can write to
-// file. Increasing the buffer will not solve anything. Sooner or
-// later the buffer is going to fill up anyways.
-#if defined(MAC_IPHONE)
- #define WEBRTC_TRACE_MAX_QUEUE 2000
-#else
- #define WEBRTC_TRACE_MAX_QUEUE 8000
-#endif
-#define WEBRTC_TRACE_NUM_ARRAY 2
-#define WEBRTC_TRACE_MAX_MESSAGE_SIZE 256
-// Total buffer size is WEBRTC_TRACE_NUM_ARRAY (number of buffer partitions) *
-// WEBRTC_TRACE_MAX_QUEUE (number of lines per buffer partition) *
-// WEBRTC_TRACE_MAX_MESSAGE_SIZE (number of 1 byte charachters per line) =
-// 1 or 4 Mbyte
-
-#define WEBRTC_TRACE_MAX_FILE_SIZE 100*1000
-// Number of rows that may be written to file. On average 110 bytes per row (max
-// 256 bytes per row). So on average 110*100*1000 = 11 Mbyte, max 256*100*1000 =
-// 25.6 Mbyte
-
-class TraceImpl : public Trace
-{
-public:
- virtual ~TraceImpl();
-
- static Trace* CreateTrace();
- static TraceImpl* GetTrace(const TraceLevel level = kTraceAll);
-
- static Trace* StaticInstance(TraceCount inc,
- const TraceLevel level = kTraceAll);
-
- WebRtc_Word32 SetTraceFileImpl(const WebRtc_Word8* fileName,
- const bool addFileCounter);
- WebRtc_Word32 TraceFileImpl(
- WebRtc_Word8 fileName[FileWrapper::kMaxFileNameSize]);
-
- WebRtc_Word32 SetTraceCallbackImpl(TraceCallback* callback);
-
- void AddImpl(const TraceLevel level, const TraceModule module,
- const WebRtc_Word32 id, const char* msg);
-
- bool StopThread();
-
- bool TraceCheck(const TraceLevel level) const;
-
-protected:
- TraceImpl();
-
- // OS specific implementations
- virtual WebRtc_Word32 AddThreadId(char* traceMessage) const = 0;
- virtual WebRtc_Word32 AddTime(char* traceMessage,
- const TraceLevel level) const = 0;
-
- virtual WebRtc_Word32 AddBuildInfo(char* traceMessage) const = 0;
- virtual WebRtc_Word32 AddDateTimeInfo(char* traceMessage) const = 0;
-
- static bool Run(void* obj);
- bool Process();
-
-private:
- WebRtc_Word32 AddLevel(char* szMessage, const TraceLevel level) const;
-
- WebRtc_Word32 AddModuleAndId(char* traceMessage, const TraceModule module,
- const WebRtc_Word32 id) const;
-
- WebRtc_Word32 AddMessage(char* traceMessage,
- const char msg[WEBRTC_TRACE_MAX_MESSAGE_SIZE],
- const WebRtc_UWord16 writtenSoFar) const;
-
- void AddMessageToList(
- const char traceMessage[WEBRTC_TRACE_MAX_MESSAGE_SIZE],
- const WebRtc_UWord16 length,
- const TraceLevel level);
-
- bool UpdateFileName(
- const WebRtc_Word8 fileNameUTF8[FileWrapper::kMaxFileNameSize],
- WebRtc_Word8 fileNameWithCounterUTF8[FileWrapper::kMaxFileNameSize],
- const WebRtc_UWord32 newCount) const;
-
- bool CreateFileName(
- const WebRtc_Word8 fileNameUTF8[FileWrapper::kMaxFileNameSize],
- WebRtc_Word8 fileNameWithCounterUTF8[FileWrapper::kMaxFileNameSize],
- const WebRtc_UWord32 newCount) const;
-
- void WriteToFile();
-
- CriticalSectionWrapper& _critsectInterface;
- TraceCallback* _callback;
- WebRtc_UWord32 _rowCountText;
- WebRtc_UWord32 _fileCountText;
-
- FileWrapper& _traceFile;
- ThreadWrapper& _thread;
- EventWrapper& _event;
-
- // _critsectArray protects _activeQueue
- CriticalSectionWrapper& _critsectArray;
- WebRtc_UWord16 _nextFreeIdx[WEBRTC_TRACE_NUM_ARRAY];
- TraceLevel _level[WEBRTC_TRACE_NUM_ARRAY][WEBRTC_TRACE_MAX_QUEUE];
- WebRtc_UWord16 _length[WEBRTC_TRACE_NUM_ARRAY][WEBRTC_TRACE_MAX_QUEUE];
- WebRtc_Word8* _messageQueue[WEBRTC_TRACE_NUM_ARRAY][WEBRTC_TRACE_MAX_QUEUE];
- WebRtc_UWord8 _activeQueue;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_TRACE_IMPL_H_
diff --git a/src/system_wrappers/source/trace_linux.cc b/src/system_wrappers/source/trace_linux.cc
deleted file mode 100644
index 8dba3be..0000000
--- a/src/system_wrappers/source/trace_linux.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "trace_linux.h"
-
-#include <cassert>
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-#include <time.h>
-
-#ifdef ANDROID
- #include <pthread.h>
-#else
- #include <iostream>
-#endif
-
-#if defined(_DEBUG)
- #define BUILDMODE "d"
-#elif defined(DEBUG)
- #define BUILDMODE "d"
-#elif defined(NDEBUG)
- #define BUILDMODE "r"
-#else
- #define BUILDMODE "?"
-#endif
-#define BUILDTIME __TIME__
-#define BUILDDATE __DATE__
-// example: "Oct 10 2002 12:05:30 r"
-#define BUILDINFO BUILDDATE " " BUILDTIME " " BUILDMODE
-
-namespace webrtc {
-TraceLinux::TraceLinux()
-{
- _prevAPITickCount = time(NULL);
- _prevTickCount = _prevAPITickCount;
-}
-
-TraceLinux::~TraceLinux()
-{
- StopThread();
-}
-
-WebRtc_Word32 TraceLinux::AddThreadId(char* traceMessage) const
-{
- WebRtc_UWord64 threadId = (WebRtc_UWord64)pthread_self();
- sprintf(traceMessage, "%10llu; ", threadId);
- // 12 bytes are written.
- return 12;
-}
-
-WebRtc_Word32 TraceLinux::AddTime(char* traceMessage,
- const TraceLevel level) const
-{
- time_t dwCurrentTimeInSeconds = time(NULL);
- struct tm systemTime;
- gmtime_r(&dwCurrentTimeInSeconds, &systemTime);
-
- if(level == kTraceApiCall)
- {
- WebRtc_UWord32 dwDeltaTime = dwCurrentTimeInSeconds - _prevTickCount;
- _prevTickCount = dwCurrentTimeInSeconds;
-
- if(_prevTickCount == 0)
- {
- dwDeltaTime = 0;
- }
- if(dwDeltaTime > 0x0fffffff)
- {
- // Either wraparound or data race.
- dwDeltaTime = 0;
- }
- if(dwDeltaTime > 99999)
- {
- dwDeltaTime = 99999;
- }
-
- sprintf(traceMessage, "(%2u:%2u:%2u:%3u |%5lu) ", systemTime.tm_hour,
- systemTime.tm_min, systemTime.tm_sec, 0,
- static_cast<unsigned long>(dwDeltaTime));
- } else {
- WebRtc_UWord32 dwDeltaTime = dwCurrentTimeInSeconds - _prevAPITickCount;
- _prevAPITickCount = dwCurrentTimeInSeconds;
- if(_prevAPITickCount == 0)
- {
- dwDeltaTime = 0;
- }
- if(dwDeltaTime > 0x0fffffff)
- {
- // Either wraparound or data race.
- dwDeltaTime = 0;
- }
- if(dwDeltaTime > 99999)
- {
- dwDeltaTime = 99999;
- }
- sprintf(traceMessage, "(%2u:%2u:%2u:%3u |%5lu) ", systemTime.tm_hour,
- systemTime.tm_min, systemTime.tm_sec, 0,
- static_cast<unsigned long>(dwDeltaTime));
- }
- // Messages is 22 characters.
- return 22;
-}
-
-WebRtc_Word32 TraceLinux::AddBuildInfo(char* traceMessage) const
-{
- sprintf(traceMessage, "Build info: %s", BUILDINFO);
- // Include NULL termination (hence + 1).
- return strlen(traceMessage) + 1;
-}
-
-WebRtc_Word32 TraceLinux::AddDateTimeInfo(char* traceMessage) const
-{
- time_t t;
- time(&t);
- sprintf(traceMessage, "Local Date: %s", ctime(&t));
- WebRtc_Word32 len = static_cast<WebRtc_Word32>(strlen(traceMessage));
-
- if ('\n' == traceMessage[len - 1])
- {
- traceMessage[len - 1] = '\0';
- --len;
- }
-
- // Messages is 12 characters.
- return len + 1;
-}
-} // namespace webrtc
diff --git a/src/system_wrappers/source/trace_linux.h b/src/system_wrappers/source/trace_linux.h
deleted file mode 100644
index 6e327a0..0000000
--- a/src/system_wrappers/source/trace_linux.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_TRACE_LINUX_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_TRACE_LINUX_H_
-
-#include "critical_section_wrapper.h"
-#include "trace_impl.h"
-
-namespace webrtc {
-class TraceLinux : public TraceImpl
-{
-public:
- TraceLinux();
- virtual ~TraceLinux();
-
- virtual WebRtc_Word32 AddThreadId(char *traceMessage) const;
- virtual WebRtc_Word32 AddTime(char* traceMessage,
- const TraceLevel level) const;
-
- virtual WebRtc_Word32 AddBuildInfo(char* traceMessage) const;
- virtual WebRtc_Word32 AddDateTimeInfo(char* traceMessage) const;
-
-private:
- volatile mutable WebRtc_UWord32 _prevAPITickCount;
- volatile mutable WebRtc_UWord32 _prevTickCount;
-};
-} // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_TRACE_LINUX_H_
diff --git a/src/system_wrappers/test/Test.cpp b/src/system_wrappers/test/Test.cpp
deleted file mode 100644
index 7a34166..0000000
--- a/src/system_wrappers/test/Test.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <cassert>
-#include <iostream>
-
-#ifdef _WIN32
- #include <windows.h>
- #include <tchar.h>
-#else
- #include <stdio.h>
- #define Sleep(x) usleep(x*1000)
-#endif
-
-#include "common_types.h"
-#include "trace.h"
-#include "cpu_wrapper.h"
-
-
-#ifdef _WIN32
-int _tmain(int argc, _TCHAR* argv[])
-#else
-int main(int argc, char* argv[])
-#endif
-{
- Trace::CreateTrace();
- Trace::SetTraceFile("testTrace.txt");
- Trace::SetLevelFilter(webrtc::kTraceAll);
-
- printf("Start system wrapper test\n");
-
- printf("Number of cores detected:%u\n", (unsigned int)CpuWrapper::DetectNumberOfCores());
-
- CpuWrapper* cpu = CpuWrapper::CreateCpu();
-
- WebRtc_UWord32 numCores;
- WebRtc_UWord32* cores;
-
- for(int i = 0; i< 10;i++)
- {
- WebRtc_Word32 total = cpu->CpuUsageMultiCore(numCores, cores);
-
- printf("\nNumCores:%d\n", (int)numCores);
- printf("Total cpu:%d\n", (int)total);
-
- for (WebRtc_UWord32 i = 0; i< numCores;i++)
- {
- printf("Core:%lu CPU:%lu \n", i, cores[i]);
- }
- Sleep(1000);
- }
-
- printf("Done system wrapper test\n");
-
- delete cpu;
-
- Trace::ReturnTrace();
-};
diff --git a/src/system_wrappers/test/TestSort/TestSort.cpp b/src/system_wrappers/test/TestSort/TestSort.cpp
deleted file mode 100644
index 6846a71..0000000
--- a/src/system_wrappers/test/TestSort/TestSort.cpp
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <cstdio>
-#include <algorithm>
-#include <cstring>
-
-#include "sort.h"
-#include "tick_util.h"
-
-// Excellent work polluting the global namespace Visual Studio...
-#undef max
-#undef min
-#include <limits>
-
-template<typename KeyType>
-struct LotsOfData
-{
- KeyType key;
- char data[64];
-};
-
-template<typename DataType>
-int Compare(const void* dataX, const void* dataY)
-{
- DataType dataX = (DataType)*(const DataType*)dataX;
- DataType dataY = (DataType)*(const DataType*)dataY;
- if (dataX > dataY)
- {
- return 1;
- }
- else if (dataX < dataY)
- {
- return -1;
- }
-
- return 0;
-};
-
-template<typename DataType, typename KeyType>
-int CompareKey(const void* dataX, const void* dataY)
-{
- KeyType keyX = ((const DataType*)dataX)->key;
- KeyType keyY = ((const DataType*)dataY)->key;
- if (keyX > keyY)
- {
- return 1;
- }
- else if (keyX < keyY)
- {
- return -1;
- }
-
- return 0;
-}
-
-template<typename DataType>
-struct KeyLessThan
-{
- bool operator()(const DataType &dataX, const DataType &dataY) const
- {
- return dataX.key < dataY.key;
- }
-};
-
-const char* TypeEnumToString(webrtc::Type type)
-{
- switch (type)
- {
- using namespace webrtc;
- case TYPE_Word8:
- return "Word8";
- case TYPE_UWord8:
- return "UWord8";
- case TYPE_Word16:
- return "Word16";
- case TYPE_UWord16:
- return "UWord16";
- case TYPE_Word32:
- return "Word32";
- case TYPE_UWord32:
- return "UWord32";
- case TYPE_Word64:
- return "Word64";
- case TYPE_UWord64:
- return "UWord64";
- case TYPE_Float32:
- return "Float32";
- case TYPE_Float64:
- return "Float64";
- default:
- return "Unrecognized";
- }
-}
-
-template<typename Type>
-Type TypedRand()
-{
- if (std::numeric_limits<Type>::is_integer)
- {
- double floatRand = static_cast<double>(rand()) / RAND_MAX;
- if (std::numeric_limits<Type>::is_signed)
- {
- floatRand -= 0.5;
- }
-
- // Uniform [-max()/2, max()/2] for signed
- // [0, max()] for unsigned
- return static_cast<Type>(floatRand * std::numeric_limits<Type>::max());
- }
- else // Floating point
- {
- // Uniform [-0.5, 0.5]
- // The outer cast is to remove template warnings.
- return static_cast<Type>((static_cast<Type>(rand()) / RAND_MAX) - 0.5);
- }
-}
-
-template<typename KeyType>
-void RunSortTest(webrtc::Type sortType, bool keySort)
-{
- enum { DataLength = 1000 };
- enum { NumOfTests = 10000 };
- KeyType key[DataLength];
- KeyType keyRef[DataLength];
- LotsOfData<KeyType> data[DataLength];
- LotsOfData<KeyType> dataRef[DataLength];
- WebRtc_Word32 retVal = 0;
-
- if (keySort)
- {
- printf("Running %s KeySort() tests...\n", TypeEnumToString(sortType));
- }
- else
- {
- printf("Running %s Sort() tests...\n", TypeEnumToString(sortType));
- }
-
- TickInterval accTicks;
- for (int i = 0; i < NumOfTests; i++)
- {
- for (int j = 0; j < DataLength; j++)
- {
- key[j] = TypedRand<KeyType>();
- data[j].key = key[j];
- // Write index to payload. We use this later for verification.
- sprintf(data[j].data, "%d", j);
- }
-
- memcpy(dataRef, data, sizeof(data));
- memcpy(keyRef, key, sizeof(key));
-
- retVal = 0;
- TickTime t0 = TickTime::Now();
- if (keySort)
- {
- retVal = webrtc::KeySort(data, key, DataLength, sizeof(LotsOfData<KeyType>),
- sortType);
-
- //std::sort(data, data + DataLength, KeyLessThan<KeyType>());
- //qsort(data, DataLength, sizeof(LotsOfData<KeyType>),
- // CompareKey<LotsOfData<KeyType>, KeyType>);
- }
- else
- {
- retVal = webrtc::Sort(key, DataLength, sortType);
-
- //std::sort(key, key + DataLength);
- //qsort(key, DataLength, sizeof(KeyType), Compare<KeyType>);
- }
- TickTime t1 = TickTime::Now();
- accTicks += (t1 - t0);
-
- if (retVal != 0)
- {
- printf("Test failed at iteration %d:\n", i);
- printf("Sort returned an error. ");
- printf("It likely does not support the requested type\nExiting...\n");
- exit(0);
- }
-
- // Reference sort.
- if (!keySort)
- {
- std::sort(keyRef, keyRef + DataLength);
- }
-
- if (keySort)
- {
- for (int j = 0; j < DataLength - 1; j++)
- {
- if (data[j].key > data[j + 1].key)
- {
- printf("Test failed at iteration %d:\n", i);
- printf("Keys are not monotonically increasing\nExiting...\n");
- exit(0);
- }
-
- int index = atoi(data[j].data);
- if (index < 0 || index >= DataLength || data[j].key != dataRef[index].key)
- {
- printf("Test failed at iteration %d:\n", i);
- printf("Payload data is corrupt\nExiting...\n");
- exit(0);
- }
- }
- }
- else
- {
- for (int j = 0; j < DataLength - 1; j++)
- {
- if (key[j] > key[j + 1])
- {
- printf("Test failed at iteration %d:\n", i);
- printf("Data is not monotonically increasing\nExiting...\n");
- exit(0);
- }
- }
-
- if (memcmp(key, keyRef, sizeof(key)) != 0)
- {
- printf("Test failed at iteration %d:\n", i);
- printf("Sort data differs from std::sort reference\nExiting...\n");
- exit(0);
- }
- }
- }
-
- printf("Compliance test passed over %d iterations\n", NumOfTests);
-
- WebRtc_Word64 executeTime = accTicks.Milliseconds();
- printf("Execute time: %.2f s\n\n", (float)executeTime / 1000);
-}
-
-int main()
-{
- // Seed rand().
- srand(42);
- bool keySort = false;
- for (int i = 0; i < 2; i++) {
- RunSortTest<WebRtc_Word8>(webrtc::TYPE_Word8, keySort);
- RunSortTest<WebRtc_UWord8>(webrtc::TYPE_UWord8, keySort);
- RunSortTest<WebRtc_Word16>(webrtc::TYPE_Word16, keySort);
- RunSortTest<WebRtc_UWord16>(webrtc::TYPE_UWord16, keySort);
- RunSortTest<WebRtc_Word32>(webrtc::TYPE_Word32, keySort);
- RunSortTest<WebRtc_UWord32>(webrtc::TYPE_UWord32, keySort);
- RunSortTest<WebRtc_Word64>(webrtc::TYPE_Word64, keySort);
- RunSortTest<WebRtc_UWord64>(webrtc::TYPE_UWord64, keySort);
- RunSortTest<float>(webrtc::TYPE_Float32, keySort);
- RunSortTest<double>(webrtc::TYPE_Float64, keySort);
-
- keySort = !keySort;
- }
-
- printf("All tests passed\n");
-
- return 0;
-}
diff --git a/src/system_wrappers/test/list/list.cc b/src/system_wrappers/test/list/list.cc
deleted file mode 100644
index 5c4f0b9..0000000
--- a/src/system_wrappers/test/list/list.cc
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "list_wrapper.h"
-
-const int kNumberOfElements = 10;
-
-void FailTest(bool failed)
-{
- if (failed)
- {
- printf("Test failed!\n");
- printf("Press enter to continue:");
- getchar();
- exit(0);
- }
-}
-
-int GetStoredIntegerValue(ListItem* list_item)
-{
- void* list_item_pointer = list_item->GetItem();
- if (list_item_pointer != NULL)
- {
- return *(reinterpret_cast<int*>(list_item_pointer));
- }
- return static_cast<int>(list_item->GetUnsignedItem());
-}
-
-void PrintList(ListWrapper& list)
-{
- ListItem* list_item = list.First();
- printf("List: ");
- while (list_item != NULL)
- {
- int item_value = GetStoredIntegerValue(list_item);
- FailTest(item_value < 0);
- printf(" %d",item_value);
- list_item = list.Next(list_item);
- }
- printf("\n");
-}
-
-// The list should always be in ascending order
-void ListSanity(ListWrapper& list)
-{
- if(list.Empty())
- {
- return;
- }
- ListItem* item_iter = list.First();
- // Fake a previous value for the first iteration
- int previous_value = GetStoredIntegerValue(item_iter) - 1;
- while (item_iter != NULL)
- {
- const int value = GetStoredIntegerValue(item_iter);
- FailTest(value != previous_value + 1);
- previous_value = value;
- item_iter = list.Next(item_iter);
- }
-}
-
-int main(int /*argc*/, char* /*argv*/[])
-{
- printf("List Test:\n");
- int element_array[kNumberOfElements];
- for (int i = 0; i < kNumberOfElements; i++)
- {
- element_array[i] = i;
- }
- // Test PushBack 1
- ListWrapper test_list;
- for (int i = 2; i < kNumberOfElements - 2; i++)
- {
- FailTest(test_list.PushBack((void*)&element_array[i]) != 0);
- }
- // Test PushBack 2
- FailTest(test_list.PushBack(element_array[kNumberOfElements - 2]) != 0);
- FailTest(test_list.PushBack(element_array[kNumberOfElements - 1]) != 0);
- // Test PushFront 2
- FailTest(test_list.PushFront(element_array[1]) != 0);
- // Test PushFront 1
- FailTest(test_list.PushFront((void*)&element_array[0]) != 0);
- // Test GetSize
- FailTest(test_list.GetSize() != kNumberOfElements);
- PrintList(test_list);
- //Test PopFront
- FailTest(test_list.PopFront() != 0);
- //Test PopBack
- FailTest(test_list.PopBack() != 0);
- // Test GetSize
- FailTest(test_list.GetSize() != kNumberOfElements - 2);
- // Test Empty
- FailTest(test_list.Empty());
- // Test First
- ListItem* first_item = test_list.First();
- FailTest(first_item == NULL);
- // Test Last
- ListItem* last_item = test_list.Last();
- FailTest(last_item == NULL);
- // Test Next
- ListItem* second_item = test_list.Next(first_item);
- FailTest(second_item == NULL);
- FailTest(test_list.Next(last_item) != NULL);
- FailTest(test_list.Next(NULL) != NULL);
- // Test Previous
- ListItem* second_to_last_item = test_list.Previous(last_item);
- FailTest(second_to_last_item == NULL);
- FailTest(test_list.Previous(first_item) != NULL);
- FailTest(test_list.Previous(NULL) != NULL);
- // Test GetUnsignedItem
- FailTest(last_item->GetUnsignedItem() !=
- kNumberOfElements - 2);
- FailTest(last_item->GetItem() !=
- NULL);
- // Test GetItem
- FailTest(GetStoredIntegerValue(second_to_last_item) !=
- kNumberOfElements - 3);
- FailTest(second_to_last_item->GetUnsignedItem() != 0);
- // Pop last and first since they are pushed as unsigned items.
- FailTest(test_list.PopFront() != 0);
- FailTest(test_list.PopBack() != 0);
- // Test Insert. Please note that old iterators are no longer valid at
- // this point.
- ListItem* insert_item_last = new ListItem(reinterpret_cast<void*>(&element_array[kNumberOfElements - 2]));
- FailTest(test_list.Insert(test_list.Last(),insert_item_last) != 0);
- FailTest(test_list.Insert(NULL,insert_item_last) == 0);
- ListItem* insert_item_last2 = new ListItem(reinterpret_cast<void*>(&element_array[kNumberOfElements - 2]));
- FailTest(test_list.Insert(insert_item_last2,NULL) == 0);
- // test InsertBefore
- ListItem* insert_item_first = new ListItem(reinterpret_cast<void*>(&element_array[1]));
- FailTest(test_list.InsertBefore(test_list.First(),insert_item_first) != 0);
- FailTest(test_list.InsertBefore(NULL,insert_item_first) == 0);
- ListItem* insert_item_first2 = new ListItem(reinterpret_cast<void*>(&element_array[1]));
- FailTest(test_list.InsertBefore(insert_item_first2,NULL) == 0);
- PrintList(test_list);
- ListSanity(test_list);
- // Erase the whole list
- int counter = 0;
- while (test_list.PopFront() == 0)
- {
- FailTest(counter++ > kNumberOfElements);
- }
- PrintList(test_list);
- // Test APIs when list is empty
- FailTest(test_list.GetSize() != 0);
- FailTest(test_list.PopFront() != -1);
- FailTest(test_list.PopBack() != -1);
- FailTest(!test_list.Empty());
- FailTest(test_list.First() != NULL);
- FailTest(test_list.Last() != NULL);
- FailTest(test_list.Next(NULL) != NULL);
- FailTest(test_list.Previous(NULL) != NULL);
- FailTest(test_list.Erase(NULL) != -1);
- // Test Insert APIs when list is empty
- ListItem* new_item = new ListItem(reinterpret_cast<void*>(&element_array[0]));
- FailTest(test_list.Insert(NULL,new_item) != 0);
- FailTest(test_list.Empty());
- FailTest(test_list.PopFront() != 0);
- ListItem* new_item2 = new ListItem(reinterpret_cast<void*>(&element_array[0]));
- FailTest(test_list.InsertBefore(NULL,new_item2) != 0);
- FailTest(test_list.Empty());
-
- printf("Tests passed successfully!\n");
-}
diff --git a/src/system_wrappers/test/map/map.cc b/src/system_wrappers/test/map/map.cc
deleted file mode 100644
index 8a0d3e3..0000000
--- a/src/system_wrappers/test/map/map.cc
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "map_wrapper.h"
-
-const int kNumberOfElements = 10;
-
-void FailTest(bool failed)
-{
- if (failed)
- {
- printf("Test failed!\n");
- printf("Press enter to continue:");
- getchar();
- exit(0);
- }
-}
-
-int GetStoredIntegerValue(MapItem* map_item)
-{
- void* map_item_pointer = map_item->GetItem();
- if (map_item_pointer != NULL)
- {
- return *(reinterpret_cast<int*>(map_item_pointer));
- }
- return static_cast<int>(map_item->GetUnsignedId());
-}
-
-void PrintMap(MapWrapper& map)
-{
- MapItem* map_item = map.First();
- printf("Map: ");
- while (map_item != NULL)
- {
- int item_value = GetStoredIntegerValue(map_item);
- FailTest(item_value < 0);
- printf(" %d",item_value);
- map_item = map.Next(map_item);
- }
- printf("\n");
-}
-
-int main(int /*argc*/, char* /*argv*/[])
-{
- int element_array[kNumberOfElements];
- for (int i = 0; i < kNumberOfElements; i++)
- {
- element_array[i] = i;
- }
- // Test insert
- MapWrapper test_map;
- for (int i = 0; i < kNumberOfElements; i++)
- {
- test_map.Insert(i,(void*)&element_array[i]);
- }
- // Test Erase1
- MapItem* remove_item = test_map.Find(2);
- FailTest(remove_item == NULL);
- FailTest(test_map.Erase(remove_item) != 0);
- FailTest(test_map.Find(2) != NULL);
- remove_item = NULL;
- FailTest(test_map.Erase(remove_item) != -1);
- // Test Erase2
- FailTest(test_map.Erase(1) != 0);
- FailTest(test_map.Find(1) != NULL);
- FailTest(test_map.Erase(1) != -1);
- // Test Size
- FailTest(test_map.Size() != kNumberOfElements - 2);
- PrintMap(test_map);
- // Test First
- MapItem* first_item = test_map.First();
- FailTest(first_item == NULL);
- FailTest(GetStoredIntegerValue(first_item) != 0);
- // Test Last
- MapItem* last_item = test_map.Last();
- FailTest(last_item == NULL);
- FailTest(GetStoredIntegerValue(last_item) != 9);
- // Test Next
- MapItem* second_item = test_map.Next(first_item);
- FailTest(second_item == NULL);
- FailTest(GetStoredIntegerValue(second_item) != 3);
- FailTest(test_map.Next(last_item) != NULL);
- // Test Previous
- MapItem* second_to_last_item = test_map.Previous(last_item);
- FailTest(second_to_last_item == NULL);
- FailTest(GetStoredIntegerValue(second_to_last_item) != 8);
- FailTest(test_map.Previous(first_item) != NULL);
- // Test Find (only improper usage untested)
- FailTest(test_map.Find(kNumberOfElements + 2) != NULL);
- // Test GetId
- FailTest(*(reinterpret_cast<int*>(second_to_last_item->GetItem())) !=
- second_to_last_item->GetId());
- FailTest(second_to_last_item->GetUnsignedId() !=
- static_cast<unsigned int>(second_to_last_item->GetId()));
- // Test SetItem
- int swapped_item = kNumberOfElements;
- last_item->SetItem(reinterpret_cast<void*>(&swapped_item));
- FailTest(GetStoredIntegerValue(last_item) !=
- swapped_item);
-
- printf("Tests passed successfully!\n");
-}
diff --git a/src/typedefs.h b/src/typedefs.h
deleted file mode 100644
index ae71690..0000000
--- a/src/typedefs.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-/*
- *
- * This file contains type definitions used in all WebRtc APIs.
- *
- */
-
-/* Reserved words definitions */
-#define WEBRTC_EXTERN extern
-#define G_CONST const
-#define WEBRTC_INLINE extern __inline
-
-#ifndef WEBRTC_TYPEDEFS_H
-#define WEBRTC_TYPEDEFS_H
-
-/* Define WebRtc preprocessor identifiers based on the current build platform */
-#if defined(WIN32)
- // Windows & Windows Mobile
- #if !defined(WEBRTC_TARGET_PC)
- #define WEBRTC_TARGET_PC
- #endif
-#elif defined(__APPLE__)
- // Mac OS X
- #if defined(__LITTLE_ENDIAN__ ) //TODO: is this used?
- #if !defined(WEBRTC_TARGET_MAC_INTEL)
- #define WEBRTC_TARGET_MAC_INTEL
- #endif
- #else
- #if !defined(WEBRTC_TARGET_MAC)
- #define WEBRTC_TARGET_MAC
- #endif
- #endif
-#else
- // Linux etc.
- #if !defined(WEBRTC_TARGET_PC)
- #define WEBRTC_TARGET_PC
- #endif
-#endif
-
-#if defined(WEBRTC_TARGET_PC)
-
-#if !defined(_MSC_VER)
- #include <stdint.h>
-#else
- // Define C99 equivalent types.
- // Since MSVC doesn't include these headers, we have to write our own
- // version to provide a compatibility layer between MSVC and the WebRTC
- // headers.
- typedef signed char int8_t;
- typedef signed short int16_t;
- typedef signed int int32_t;
- typedef signed long long int64_t;
- typedef unsigned char uint8_t;
- typedef unsigned short uint16_t;
- typedef unsigned int uint32_t;
- typedef unsigned long long uint64_t;
-#endif
-
-#if defined(WIN32)
- typedef __int64 WebRtc_Word64;
- typedef unsigned __int64 WebRtc_UWord64;
-#else
- typedef int64_t WebRtc_Word64;
- typedef uint64_t WebRtc_UWord64;
-#endif
- typedef int32_t WebRtc_Word32;
- typedef uint32_t WebRtc_UWord32;
- typedef int16_t WebRtc_Word16;
- typedef uint16_t WebRtc_UWord16;
- typedef char WebRtc_Word8;
- typedef uint8_t WebRtc_UWord8;
-
- /* Define endian for the platform */
- #define WEBRTC_LITTLE_ENDIAN
-
-#elif defined(WEBRTC_TARGET_MAC_INTEL)
- #include <stdint.h>
-
- typedef int64_t WebRtc_Word64;
- typedef uint64_t WebRtc_UWord64;
- typedef int32_t WebRtc_Word32;
- typedef uint32_t WebRtc_UWord32;
- typedef int16_t WebRtc_Word16;
- typedef char WebRtc_Word8;
- typedef uint16_t WebRtc_UWord16;
- typedef uint8_t WebRtc_UWord8;
-
- /* Define endian for the platform */
- #define WEBRTC_LITTLE_ENDIAN
-
-#else
-
- #error "No platform defined for WebRtc type definitions (webrtc_typedefs.h)"
-
-#endif
-
-
-#endif // WEBRTC_TYPEDEFS_H