Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(167)

Side by Side Diff: webrtc/modules/audio_processing/aec/echo_cancellation.c

Issue 1187943005: Reland "Revert "audio_processing/aec: make delay estimator aware of starving farend buffer"" (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Adjusted device buffer mapping w.r.t. extended_filter Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 aecpc->delayCtr = 0; 228 aecpc->delayCtr = 0;
229 aecpc->sampFactor = (aecpc->scSampFreq * 1.0f) / aecpc->splitSampFreq; 229 aecpc->sampFactor = (aecpc->scSampFreq * 1.0f) / aecpc->splitSampFreq;
230 // Sampling frequency multiplier (SWB is processed as 160 frame size). 230 // Sampling frequency multiplier (SWB is processed as 160 frame size).
231 aecpc->rate_factor = aecpc->splitSampFreq / 8000; 231 aecpc->rate_factor = aecpc->splitSampFreq / 8000;
232 232
233 aecpc->sum = 0; 233 aecpc->sum = 0;
234 aecpc->counter = 0; 234 aecpc->counter = 0;
235 aecpc->checkBuffSize = 1; 235 aecpc->checkBuffSize = 1;
236 aecpc->firstVal = 0; 236 aecpc->firstVal = 0;
237 237
238 aecpc->startup_phase = WebRtcAec_reported_delay_enabled(aecpc->aec); 238 // We skip the startup_phase completely (setting to 0) if DA-AEC is enabled,
239 // but not extended_filter mode.
240 aecpc->startup_phase = WebRtcAec_extended_filter_enabled(aecpc->aec) ||
241 WebRtcAec_reported_delay_enabled(aecpc->aec);
239 aecpc->bufSizeStart = 0; 242 aecpc->bufSizeStart = 0;
240 aecpc->checkBufSizeCtr = 0; 243 aecpc->checkBufSizeCtr = 0;
241 aecpc->msInSndCardBuf = 0; 244 aecpc->msInSndCardBuf = 0;
242 aecpc->filtDelay = -1; // -1 indicates an initialized state. 245 aecpc->filtDelay = -1; // -1 indicates an initialized state.
243 aecpc->timeForDelayChange = 0; 246 aecpc->timeForDelayChange = 0;
244 aecpc->knownDelay = 0; 247 aecpc->knownDelay = 0;
245 aecpc->lastDelayDiff = 0; 248 aecpc->lastDelayDiff = 0;
246 249
247 aecpc->skewFrCtr = 0; 250 aecpc->skewFrCtr = 0;
248 aecpc->resample = kAecFalse; 251 aecpc->resample = kAecFalse;
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after
711 // to the buffer and no delay compensation nor AEC processing 714 // to the buffer and no delay compensation nor AEC processing
712 // has been done. 715 // has been done.
713 WebRtcAec_MoveFarReadPtr(aecpc->aec, overhead_elements); 716 WebRtcAec_MoveFarReadPtr(aecpc->aec, overhead_elements);
714 717
715 // Enable the AEC 718 // Enable the AEC
716 aecpc->startup_phase = 0; 719 aecpc->startup_phase = 0;
717 } 720 }
718 } 721 }
719 } else { 722 } else {
720 // AEC is enabled. 723 // AEC is enabled.
721 if (WebRtcAec_reported_delay_enabled(aecpc->aec)) { 724 EstBufDelayNormal(aecpc);
722 EstBufDelayNormal(aecpc);
723 }
724 725
725 // Call the AEC. 726 // Call the AEC.
726 // TODO(bjornv): Re-structure such that we don't have to pass 727 // TODO(bjornv): Re-structure such that we don't have to pass
727 // |aecpc->knownDelay| as input. Change name to something like 728 // |aecpc->knownDelay| as input. Change name to something like
728 // |system_buffer_diff|. 729 // |system_buffer_diff|.
729 WebRtcAec_ProcessFrames(aecpc->aec, 730 WebRtcAec_ProcessFrames(aecpc->aec,
730 nearend, 731 nearend,
731 num_bands, 732 num_bands,
732 nrOfSamples, 733 nrOfSamples,
733 aecpc->knownDelay, 734 aecpc->knownDelay,
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 } 776 }
776 return; 777 return;
777 } 778 }
778 if (self->startup_phase) { 779 if (self->startup_phase) {
779 // In the extended mode, there isn't a startup "phase", just a special 780 // In the extended mode, there isn't a startup "phase", just a special
780 // action on the first frame. In the trusted delay case, we'll take the 781 // action on the first frame. In the trusted delay case, we'll take the
781 // current reported delay, unless it's less then our conservative 782 // current reported delay, unless it's less then our conservative
782 // measurement. 783 // measurement.
783 int startup_size_ms = 784 int startup_size_ms =
784 reported_delay_ms < kFixedDelayMs ? kFixedDelayMs : reported_delay_ms; 785 reported_delay_ms < kFixedDelayMs ? kFixedDelayMs : reported_delay_ms;
786 #if defined(WEBRTC_ANDROID)
785 int target_delay = startup_size_ms * self->rate_factor * 8; 787 int target_delay = startup_size_ms * self->rate_factor * 8;
786 #if !defined(WEBRTC_ANDROID) 788 #else
787 // To avoid putting the AEC in a non-causal state we're being slightly 789 // To avoid putting the AEC in a non-causal state we're being slightly
788 // conservative and scale by 2. On Android we use a fixed delay and 790 // conservative and scale by 2. On Android we use a fixed delay and
789 // therefore there is no need to scale the target_delay. 791 // therefore there is no need to scale the target_delay.
790 target_delay /= 2; 792 int target_delay = startup_size_ms * self->rate_factor * 8 / 2;
791 #endif 793 #endif
792 int overhead_elements = 794 int overhead_elements =
793 (WebRtcAec_system_delay(self->aec) - target_delay) / PART_LEN; 795 (WebRtcAec_system_delay(self->aec) - target_delay) / PART_LEN;
794 WebRtcAec_MoveFarReadPtr(self->aec, overhead_elements); 796 WebRtcAec_MoveFarReadPtr(self->aec, overhead_elements);
795 self->startup_phase = 0; 797 self->startup_phase = 0;
796 } 798 }
797 799
798 if (WebRtcAec_reported_delay_enabled(self->aec)) { 800 EstBufDelayExtended(self);
799 EstBufDelayExtended(self);
800 }
801 801
802 { 802 {
803 // |delay_diff_offset| gives us the option to manually rewind the delay on 803 // |delay_diff_offset| gives us the option to manually rewind the delay on
804 // very low delay platforms which can't be expressed purely through 804 // very low delay platforms which can't be expressed purely through
805 // |reported_delay_ms|. 805 // |reported_delay_ms|.
806 const int adjusted_known_delay = 806 const int adjusted_known_delay =
807 WEBRTC_SPL_MAX(0, self->knownDelay + delay_diff_offset); 807 WEBRTC_SPL_MAX(0, self->knownDelay + delay_diff_offset);
808 808
809 WebRtcAec_ProcessFrames(self->aec, 809 WebRtcAec_ProcessFrames(self->aec,
810 near, 810 near,
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
914 } 914 }
915 } else { 915 } else {
916 self->timeForDelayChange = 0; 916 self->timeForDelayChange = 0;
917 } 917 }
918 self->lastDelayDiff = delay_difference; 918 self->lastDelayDiff = delay_difference;
919 919
920 if (self->timeForDelayChange > 25) { 920 if (self->timeForDelayChange > 25) {
921 self->knownDelay = WEBRTC_SPL_MAX((int)self->filtDelay - 256, 0); 921 self->knownDelay = WEBRTC_SPL_MAX((int)self->filtDelay - 256, 0);
922 } 922 }
923 } 923 }
OLDNEW
« no previous file with comments | « webrtc/modules/audio_processing/aec/aec_core.c ('k') | webrtc/modules/audio_processing/aec/system_delay_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698