| /* | |
| * Copyright (c) 2012 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 delay estimation on binary converted spectra. | |
| // The return value is 0 - OK and -1 - Error, unless otherwise stated. | |
| #ifndef MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_H_ | |
| #define MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_H_ | |
| #include <stdint.h> | |
| namespace webrtc { | |
| static const int32_t kMaxBitCountsQ9 = (32 << 9); // 32 matching bits in Q9. | |
| typedef struct { | |
| // Pointer to bit counts. | |
| int* far_bit_counts; | |
| // Binary history variables. | |
| uint32_t* binary_far_history; | |
| int history_size; | |
| } BinaryDelayEstimatorFarend; | |
| typedef struct { | |
| // Pointer to bit counts. | |
| int32_t* mean_bit_counts; | |
| // Array only used locally in ProcessBinarySpectrum() but whose size is | |
| // determined at run-time. | |
| int32_t* bit_counts; | |
| // Binary history variables. | |
| uint32_t* binary_near_history; | |
| int near_history_size; | |
| int history_size; | |
| // Delay estimation variables. | |
| int32_t minimum_probability; | |
| int last_delay_probability; | |
| // Delay memory. | |
| int last_delay; | |
| // Robust validation | |
| int robust_validation_enabled; | |
| int allowed_offset; | |
| int last_candidate_delay; | |
| int compare_delay; | |
| int candidate_hits; | |
| float* histogram; | |
| float last_delay_histogram; | |
| // For dynamically changing the lookahead when using SoftReset...(). | |
| int lookahead; | |
| // Far-end binary spectrum history buffer etc. | |
| BinaryDelayEstimatorFarend* farend; | |
| } BinaryDelayEstimator; | |
| // Releases the memory allocated by | |
| // WebRtc_CreateBinaryDelayEstimatorFarend(...). | |
| // Input: | |
| // - self : Pointer to the binary delay estimation far-end | |
| // instance which is the return value of | |
| // WebRtc_CreateBinaryDelayEstimatorFarend(). | |
| // | |
| void WebRtc_FreeBinaryDelayEstimatorFarend(BinaryDelayEstimatorFarend* self); | |
| // Allocates the memory needed by the far-end part of the binary delay | |
| // estimation. The memory needs to be initialized separately through | |
| // WebRtc_InitBinaryDelayEstimatorFarend(...). | |
| // | |
| // Inputs: | |
| // - history_size : Size of the far-end binary spectrum history. | |
| // | |
| // Return value: | |
| // - BinaryDelayEstimatorFarend* | |
| // : Created `handle`. If the memory can't be allocated | |
| // or if any of the input parameters are invalid NULL | |
| // is returned. | |
| // | |
| BinaryDelayEstimatorFarend* WebRtc_CreateBinaryDelayEstimatorFarend( | |
| int history_size); | |
| // Re-allocates the buffers. | |
| // | |
| // Inputs: | |
| // - self : Pointer to the binary estimation far-end instance | |
| // which is the return value of | |
| // WebRtc_CreateBinaryDelayEstimatorFarend(). | |
| // - history_size : Size of the far-end binary spectrum history. | |
| // | |
| // Return value: | |
| // - history_size : The history size allocated. | |
| int WebRtc_AllocateFarendBufferMemory(BinaryDelayEstimatorFarend* self, | |
| int history_size); | |
| // Initializes the delay estimation far-end instance created with | |
| // WebRtc_CreateBinaryDelayEstimatorFarend(...). | |
| // | |
| // Input: | |
| // - self : Pointer to the delay estimation far-end instance. | |
| // | |
| // Output: | |
| // - self : Initialized far-end instance. | |
| // | |
| void WebRtc_InitBinaryDelayEstimatorFarend(BinaryDelayEstimatorFarend* self); | |
| // Soft resets the delay estimation far-end instance created with | |
| // WebRtc_CreateBinaryDelayEstimatorFarend(...). | |
| // | |
| // Input: | |
| // - delay_shift : The amount of blocks to shift history buffers. | |
| // | |
| void WebRtc_SoftResetBinaryDelayEstimatorFarend( | |
| BinaryDelayEstimatorFarend* self, | |
| int delay_shift); | |
| // Adds the binary far-end spectrum to the internal far-end history buffer. This | |
| // spectrum is used as reference when calculating the delay using | |
| // WebRtc_ProcessBinarySpectrum(). | |
| // | |
| // Inputs: | |
| // - self : Pointer to the delay estimation far-end | |
| // instance. | |
| // - binary_far_spectrum : Far-end binary spectrum. | |
| // | |
| // Output: | |
| // - self : Updated far-end instance. | |
| // | |
| void WebRtc_AddBinaryFarSpectrum(BinaryDelayEstimatorFarend* self, | |
| uint32_t binary_far_spectrum); | |
| // Releases the memory allocated by WebRtc_CreateBinaryDelayEstimator(...). | |
| // | |
| // Note that BinaryDelayEstimator utilizes BinaryDelayEstimatorFarend, but does | |
| // not take ownership of it, hence the BinaryDelayEstimator has to be torn down | |
| // before the far-end. | |
| // | |
| // Input: | |
| // - self : Pointer to the binary delay estimation instance | |
| // which is the return value of | |
| // WebRtc_CreateBinaryDelayEstimator(). | |
| // | |
| void WebRtc_FreeBinaryDelayEstimator(BinaryDelayEstimator* self); | |
| // Allocates the memory needed by the binary delay estimation. The memory needs | |
| // to be initialized separately through WebRtc_InitBinaryDelayEstimator(...). | |
| // | |
| // See WebRtc_CreateDelayEstimator(..) in delay_estimator_wrapper.c for detailed | |
| // description. | |
| BinaryDelayEstimator* WebRtc_CreateBinaryDelayEstimator( | |
| BinaryDelayEstimatorFarend* farend, | |
| int max_lookahead); | |
| // Re-allocates `history_size` dependent buffers. The far-end buffers will be | |
| // updated at the same time if needed. | |
| // | |
| // Input: | |
| // - self : Pointer to the binary estimation instance which is | |
| // the return value of | |
| // WebRtc_CreateBinaryDelayEstimator(). | |
| // - history_size : Size of the history buffers. | |
| // | |
| // Return value: | |
| // - history_size : The history size allocated. | |
| int WebRtc_AllocateHistoryBufferMemory(BinaryDelayEstimator* self, | |
| int history_size); | |
| // Initializes the delay estimation instance created with | |
| // WebRtc_CreateBinaryDelayEstimator(...). | |
| // | |
| // Input: | |
| // - self : Pointer to the delay estimation instance. | |
| // | |
| // Output: | |
| // - self : Initialized instance. | |
| // | |
| void WebRtc_InitBinaryDelayEstimator(BinaryDelayEstimator* self); | |
| // Soft resets the delay estimation instance created with | |
| // WebRtc_CreateBinaryDelayEstimator(...). | |
| // | |
| // Input: | |
| // - delay_shift : The amount of blocks to shift history buffers. | |
| // | |
| // Return value: | |
| // - actual_shifts : The actual number of shifts performed. | |
| // | |
| int WebRtc_SoftResetBinaryDelayEstimator(BinaryDelayEstimator* self, | |
| int delay_shift); | |
| // Estimates and returns the delay between the binary far-end and binary near- | |
| // end spectra. It is assumed the binary far-end spectrum has been added using | |
| // WebRtc_AddBinaryFarSpectrum() prior to this call. The value will be offset by | |
| // the lookahead (i.e. the lookahead should be subtracted from the returned | |
| // value). | |
| // | |
| // Inputs: | |
| // - self : Pointer to the delay estimation instance. | |
| // - binary_near_spectrum : Near-end binary spectrum of the current block. | |
| // | |
| // Output: | |
| // - self : Updated instance. | |
| // | |
| // Return value: | |
| // - delay : >= 0 - Calculated delay value. | |
| // -2 - Insufficient data for estimation. | |
| // | |
| int WebRtc_ProcessBinarySpectrum(BinaryDelayEstimator* self, | |
| uint32_t binary_near_spectrum); | |
| // Returns the last calculated delay updated by the function | |
| // WebRtc_ProcessBinarySpectrum(...). | |
| // | |
| // Input: | |
| // - self : Pointer to the delay estimation instance. | |
| // | |
| // Return value: | |
| // - delay : >= 0 - Last calculated delay value | |
| // -2 - Insufficient data for estimation. | |
| // | |
| int WebRtc_binary_last_delay(BinaryDelayEstimator* self); | |
| // Returns the estimation quality of the last calculated delay updated by the | |
| // function WebRtc_ProcessBinarySpectrum(...). The estimation quality is a value | |
| // in the interval [0, 1]. The higher the value, the better the quality. | |
| // | |
| // Return value: | |
| // - delay_quality : >= 0 - Estimation quality of last calculated | |
| // delay value. | |
| float WebRtc_binary_last_delay_quality(BinaryDelayEstimator* self); | |
| // Updates the `mean_value` recursively with a step size of 2^-`factor`. This | |
| // function is used internally in the Binary Delay Estimator as well as the | |
| // Fixed point wrapper. | |
| // | |
| // Inputs: | |
| // - new_value : The new value the mean should be updated with. | |
| // - factor : The step size, in number of right shifts. | |
| // | |
| // Input/Output: | |
| // - mean_value : Pointer to the mean value. | |
| // | |
| void WebRtc_MeanEstimatorFix(int32_t new_value, | |
| int factor, | |
| int32_t* mean_value); | |
| } // namespace webrtc | |
| #endif // MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_H_ |