Rename APM Config ReportedDelay to DelayAgnostic

We use this Config struct for enabling/disabling the delay agnostic
AEC. This change renames it to DelayAgnostic for readability reasons.

NOTE: The logic is reversed in this CL. The old ReportedDelay config
turned DA-AEC off, while the new DelayAgnostic turns it on.

The old Config is kept in parallel with the new during a transition
period. This is to avoid problems with API breakages. During this
period, ReportedDelay is disabled or DelayAgnostic is enabled, DA-AEC
is engaged in APM.

BUG=webrtc:4651
R=bjornv@webrtc.org, tommi@webrtc.org

Review URL: https://codereview.webrtc.org/1211053006

Cr-Commit-Position: refs/heads/master@{#9531}
diff --git a/talk/media/webrtc/webrtcvoiceengine.cc b/talk/media/webrtc/webrtcvoiceengine.cc
index 84a26c5..284afed 100644
--- a/talk/media/webrtc/webrtcvoiceengine.cc
+++ b/talk/media/webrtc/webrtcvoiceengine.cc
@@ -844,8 +844,8 @@
   bool delay_agnostic_aec;
   if (delay_agnostic_aec_.Get(&delay_agnostic_aec)) {
     LOG(LS_INFO) << "Delay agnostic aec is enabled? " << delay_agnostic_aec;
-    config.Set<webrtc::ReportedDelay>(
-        new webrtc::ReportedDelay(!delay_agnostic_aec));
+    config.Set<webrtc::DelayAgnostic>(
+        new webrtc::DelayAgnostic(delay_agnostic_aec));
   }
 
   extended_filter_aec_.SetFrom(options.extended_filter_aec);
diff --git a/webrtc/modules/audio_processing/aec/aec_core.c b/webrtc/modules/audio_processing/aec/aec_core.c
index a3f9f24..7092707 100644
--- a/webrtc/modules/audio_processing/aec/aec_core.c
+++ b/webrtc/modules/audio_processing/aec/aec_core.c
@@ -1452,12 +1452,12 @@
     return NULL;
   }
 #ifdef WEBRTC_ANDROID
-  aec->reported_delay_enabled = 0;  // DA-AEC enabled by default.
+  aec->delay_agnostic_enabled = 1;  // DA-AEC enabled by default.
   // DA-AEC assumes the system is causal from the beginning and will self adjust
   // the lookahead when shifting is required.
   WebRtc_set_lookahead(aec->delay_estimator, 0);
 #else
-  aec->reported_delay_enabled = 1;
+  aec->delay_agnostic_enabled = 0;
   WebRtc_set_lookahead(aec->delay_estimator, kLookaheadBlocks);
 #endif
   aec->extended_filter_enabled = 0;
@@ -1786,7 +1786,7 @@
       WebRtcAec_MoveFarReadPtr(aec, -(aec->mult + 1));
     }
 
-    if (aec->reported_delay_enabled) {
+    if (!aec->delay_agnostic_enabled) {
       // 2 a) Compensate for a possible change in the system delay.
 
       // TODO(bjornv): Investigate how we should round the delay difference;
@@ -1900,18 +1900,18 @@
   }
   // Turn on delay logging if it is either set explicitly or if delay agnostic
   // AEC is enabled (which requires delay estimates).
-  self->delay_logging_enabled = delay_logging || !self->reported_delay_enabled;
+  self->delay_logging_enabled = delay_logging || self->delay_agnostic_enabled;
   if (self->delay_logging_enabled) {
     memset(self->delay_histogram, 0, sizeof(self->delay_histogram));
   }
 }
 
-void WebRtcAec_enable_reported_delay(AecCore* self, int enable) {
-  self->reported_delay_enabled = enable;
+void WebRtcAec_enable_delay_agnostic(AecCore* self, int enable) {
+  self->delay_agnostic_enabled = enable;
 }
 
-int WebRtcAec_reported_delay_enabled(AecCore* self) {
-  return self->reported_delay_enabled;
+int WebRtcAec_delay_agnostic_enabled(AecCore* self) {
+  return self->delay_agnostic_enabled;
 }
 
 void WebRtcAec_enable_extended_filter(AecCore* self, int enable) {
diff --git a/webrtc/modules/audio_processing/aec/aec_core.h b/webrtc/modules/audio_processing/aec/aec_core.h
index 2fa26db..2530527 100644
--- a/webrtc/modules/audio_processing/aec/aec_core.h
+++ b/webrtc/modules/audio_processing/aec/aec_core.h
@@ -103,10 +103,11 @@
                              int delay_logging);
 
 // Non-zero enables, zero disables.
-void WebRtcAec_enable_reported_delay(AecCore* self, int enable);
+void WebRtcAec_enable_delay_agnostic(AecCore* self, int enable);
 
-// Returns non-zero if reported delay is enabled and zero if disabled.
-int WebRtcAec_reported_delay_enabled(AecCore* self);
+// Returns non-zero if delay agnostic (i.e., signal based delay estimation) is
+// enabled and zero if disabled.
+int WebRtcAec_delay_agnostic_enabled(AecCore* self);
 
 // Enables or disables extended filter mode. Non-zero enables, zero disables.
 void WebRtcAec_enable_extended_filter(AecCore* self, int enable);
diff --git a/webrtc/modules/audio_processing/aec/aec_core_internal.h b/webrtc/modules/audio_processing/aec/aec_core_internal.h
index 2f79589..796ea2c 100644
--- a/webrtc/modules/audio_processing/aec/aec_core_internal.h
+++ b/webrtc/modules/audio_processing/aec/aec_core_internal.h
@@ -144,9 +144,9 @@
   float delay_quality_threshold;
   int frame_count;
 
-  // 0 = reported delay mode disabled (signal based delay correction enabled).
-  // otherwise enabled
-  int reported_delay_enabled;
+  // 0 = delay agnostic mode (signal based delay correction) disabled.
+  // Otherwise enabled.
+  int delay_agnostic_enabled;
   // 1 = extended filter mode enabled, 0 = disabled.
   int extended_filter_enabled;
   // Runtime selection of number of filter partitions.
diff --git a/webrtc/modules/audio_processing/aec/echo_cancellation.c b/webrtc/modules/audio_processing/aec/echo_cancellation.c
index 5dfe7ad..b31a84a 100644
--- a/webrtc/modules/audio_processing/aec/echo_cancellation.c
+++ b/webrtc/modules/audio_processing/aec/echo_cancellation.c
@@ -238,7 +238,7 @@
   // We skip the startup_phase completely (setting to 0) if DA-AEC is enabled,
   // but not extended_filter mode.
   aecpc->startup_phase = WebRtcAec_extended_filter_enabled(aecpc->aec) ||
-      WebRtcAec_reported_delay_enabled(aecpc->aec);
+      !WebRtcAec_delay_agnostic_enabled(aecpc->aec);
   aecpc->bufSizeStart = 0;
   aecpc->checkBufSizeCtr = 0;
   aecpc->msInSndCardBuf = 0;
diff --git a/webrtc/modules/audio_processing/aec/system_delay_unittest.cc b/webrtc/modules/audio_processing/aec/system_delay_unittest.cc
index 31401d4..5e26a31 100644
--- a/webrtc/modules/audio_processing/aec/system_delay_unittest.cc
+++ b/webrtc/modules/audio_processing/aec/system_delay_unittest.cc
@@ -136,7 +136,7 @@
   // Process().
   int buffer_size = BufferFillUp();
 
-  if (WebRtcAec_reported_delay_enabled(self_->aec) == 0) {
+  if (WebRtcAec_delay_agnostic_enabled(self_->aec) == 1) {
     // In extended_filter mode we set the buffer size after the first processed
     // 10 ms chunk. Hence, we don't need to wait for the reported system delay
     // values to become stable.
@@ -198,8 +198,8 @@
     WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
     EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
     for (int da_aec = 0; da_aec <= 1; ++da_aec) {
-      WebRtcAec_enable_reported_delay(self_->aec, 1 - da_aec);
-      EXPECT_EQ(1 - da_aec, WebRtcAec_reported_delay_enabled(self_->aec));
+      WebRtcAec_enable_delay_agnostic(self_->aec, da_aec);
+      EXPECT_EQ(da_aec, WebRtcAec_delay_agnostic_enabled(self_->aec));
       for (size_t i = 0; i < kNumSampleRates; i++) {
         Init(kSampleRateHz[i]);
         // Loop through a couple of calls to make sure the system delay
@@ -225,8 +225,8 @@
     WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
     EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
     for (int da_aec = 0; da_aec <= 1; ++da_aec) {
-      WebRtcAec_enable_reported_delay(self_->aec, 1 - da_aec);
-      EXPECT_EQ(1 - da_aec, WebRtcAec_reported_delay_enabled(self_->aec));
+      WebRtcAec_enable_delay_agnostic(self_->aec, da_aec);
+      EXPECT_EQ(da_aec, WebRtcAec_delay_agnostic_enabled(self_->aec));
       for (size_t i = 0; i < kNumSampleRates; i++) {
         Init(kSampleRateHz[i]);
         RunStableStartup();
@@ -253,8 +253,8 @@
   // it apply if DA-AEC is on because that overrides the startup procedure.
   WebRtcAec_enable_extended_filter(self_->aec, 0);
   EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(self_->aec));
-  WebRtcAec_enable_reported_delay(self_->aec, 1);
-  EXPECT_EQ(1, WebRtcAec_reported_delay_enabled(self_->aec));
+  WebRtcAec_enable_delay_agnostic(self_->aec, 0);
+  EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(self_->aec));
 
   // In an unstable system we would start processing after |kMaxConvergenceMs|.
   // On the last frame the AEC buffer is adjusted to 60% of the last reported
@@ -302,8 +302,8 @@
   // it apply if DA-AEC is on because that overrides the startup procedure.
   WebRtcAec_enable_extended_filter(self_->aec, 0);
   EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(self_->aec));
-  WebRtcAec_enable_reported_delay(self_->aec, 1);
-  EXPECT_EQ(1, WebRtcAec_reported_delay_enabled(self_->aec));
+  WebRtcAec_enable_delay_agnostic(self_->aec, 0);
+  EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(self_->aec));
 
   // In this test we start by establishing the device buffer size during stable
   // conditions, but with an empty internal far-end buffer. Once that is done we
@@ -367,8 +367,8 @@
     WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
     EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
     for (int da_aec = 0; da_aec <= 1; ++da_aec) {
-      WebRtcAec_enable_reported_delay(self_->aec, 1 - da_aec);
-      EXPECT_EQ(1 - da_aec, WebRtcAec_reported_delay_enabled(self_->aec));
+      WebRtcAec_enable_delay_agnostic(self_->aec, da_aec);
+      EXPECT_EQ(da_aec, WebRtcAec_delay_agnostic_enabled(self_->aec));
       for (size_t i = 0; i < kNumSampleRates; i++) {
         Init(kSampleRateHz[i]);
         RunStableStartup();
@@ -397,8 +397,8 @@
     WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
     EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
     for (int da_aec = 0; da_aec <= 1; ++da_aec) {
-      WebRtcAec_enable_reported_delay(self_->aec, 1 - da_aec);
-      EXPECT_EQ(1 - da_aec, WebRtcAec_reported_delay_enabled(self_->aec));
+      WebRtcAec_enable_delay_agnostic(self_->aec, da_aec);
+      EXPECT_EQ(da_aec, WebRtcAec_delay_agnostic_enabled(self_->aec));
       for (size_t i = 0; i < kNumSampleRates; i++) {
         Init(kSampleRateHz[i]);
         RunStableStartup();
@@ -441,8 +441,8 @@
     WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
     EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
     for (int da_aec = 0; da_aec <= 1; ++da_aec) {
-      WebRtcAec_enable_reported_delay(self_->aec, 1 - da_aec);
-      EXPECT_EQ(1 - da_aec, WebRtcAec_reported_delay_enabled(self_->aec));
+      WebRtcAec_enable_delay_agnostic(self_->aec, da_aec);
+      EXPECT_EQ(da_aec, WebRtcAec_delay_agnostic_enabled(self_->aec));
       for (size_t i = 0; i < kNumSampleRates; i++) {
         Init(kSampleRateHz[i]);
         RunStableStartup();
@@ -498,8 +498,8 @@
 
   // Should be DA-AEC independent.
   for (int da_aec = 0; da_aec <= 1; ++da_aec) {
-    WebRtcAec_enable_reported_delay(self_->aec, 1 - da_aec);
-    EXPECT_EQ(1 - da_aec, WebRtcAec_reported_delay_enabled(self_->aec));
+    WebRtcAec_enable_delay_agnostic(self_->aec, da_aec);
+    EXPECT_EQ(da_aec, WebRtcAec_delay_agnostic_enabled(self_->aec));
     // This spurious device buffer data test aims at verifying that the system
     // delay is unaffected by large outliers.
     // The system is said to be in a non-causal state if the difference between
@@ -552,8 +552,8 @@
     WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
     EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
     for (int da_aec = 0; da_aec <= 1; ++da_aec) {
-      WebRtcAec_enable_reported_delay(self_->aec, 1 - da_aec);
-      EXPECT_EQ(1 - da_aec, WebRtcAec_reported_delay_enabled(self_->aec));
+      WebRtcAec_enable_delay_agnostic(self_->aec, da_aec);
+      EXPECT_EQ(da_aec, WebRtcAec_delay_agnostic_enabled(self_->aec));
       if (extended_filter == 0 && da_aec == 1) {
         continue;
       }
diff --git a/webrtc/modules/audio_processing/echo_cancellation_impl.cc b/webrtc/modules/audio_processing/echo_cancellation_impl.cc
index dff47cc..96e77c5 100644
--- a/webrtc/modules/audio_processing/echo_cancellation_impl.cc
+++ b/webrtc/modules/audio_processing/echo_cancellation_impl.cc
@@ -68,7 +68,7 @@
       stream_has_echo_(false),
       delay_logging_enabled_(false),
       extended_filter_enabled_(false),
-      reported_delay_enabled_(true) {
+      delay_agnostic_enabled_(false) {
 }
 
 EchoCancellationImpl::~EchoCancellationImpl() {}
@@ -329,7 +329,8 @@
 
 void EchoCancellationImpl::SetExtraOptions(const Config& config) {
   extended_filter_enabled_ = config.Get<ExtendedFilter>().enabled;
-  reported_delay_enabled_ = config.Get<ReportedDelay>().enabled;
+  delay_agnostic_enabled_ = config.Get<DelayAgnostic>().enabled ||
+                            !config.Get<ReportedDelay>().enabled;
   Configure();
 }
 
@@ -363,8 +364,9 @@
   WebRtcAec_enable_extended_filter(
       WebRtcAec_aec_core(static_cast<Handle*>(handle)),
       extended_filter_enabled_ ? 1 : 0);
-  WebRtcAec_enable_reported_delay(WebRtcAec_aec_core(
-      static_cast<Handle*>(handle)), reported_delay_enabled_ ? 1 : 0);
+  WebRtcAec_enable_delay_agnostic(
+      WebRtcAec_aec_core(static_cast<Handle*>(handle)),
+      delay_agnostic_enabled_ ? 1 : 0);
   return WebRtcAec_set_config(static_cast<Handle*>(handle), config);
 }
 
diff --git a/webrtc/modules/audio_processing/echo_cancellation_impl.h b/webrtc/modules/audio_processing/echo_cancellation_impl.h
index cf3ebf6..9c2b32c 100644
--- a/webrtc/modules/audio_processing/echo_cancellation_impl.h
+++ b/webrtc/modules/audio_processing/echo_cancellation_impl.h
@@ -75,7 +75,7 @@
   bool stream_has_echo_;
   bool delay_logging_enabled_;
   bool extended_filter_enabled_;
-  bool reported_delay_enabled_;
+  bool delay_agnostic_enabled_;
 };
 
 }  // namespace webrtc
diff --git a/webrtc/modules/audio_processing/echo_cancellation_impl_unittest.cc b/webrtc/modules/audio_processing/echo_cancellation_impl_unittest.cc
index 63b6db9..b2e1198 100644
--- a/webrtc/modules/audio_processing/echo_cancellation_impl_unittest.cc
+++ b/webrtc/modules/audio_processing/echo_cancellation_impl_unittest.cc
@@ -48,7 +48,7 @@
   EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core));
 }
 
-TEST(EchoCancellationInternalTest, ReportedDelay) {
+TEST(EchoCancellationInternalTest, DelayAgnostic) {
   rtc::scoped_ptr<AudioProcessing> ap(AudioProcessing::Create());
   EXPECT_TRUE(ap->echo_cancellation()->aec_core() == NULL);
 
@@ -58,24 +58,24 @@
   AecCore* aec_core = ap->echo_cancellation()->aec_core();
   ASSERT_TRUE(aec_core != NULL);
   // Enabled by default.
-  EXPECT_EQ(1, WebRtcAec_reported_delay_enabled(aec_core));
+  EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
 
   Config config;
-  config.Set<ReportedDelay>(new ReportedDelay(false));
+  config.Set<DelayAgnostic>(new DelayAgnostic(true));
   ap->SetExtraOptions(config);
-  EXPECT_EQ(0, WebRtcAec_reported_delay_enabled(aec_core));
+  EXPECT_EQ(1, WebRtcAec_delay_agnostic_enabled(aec_core));
 
   // Retains setting after initialization.
   EXPECT_EQ(ap->kNoError, ap->Initialize());
-  EXPECT_EQ(0, WebRtcAec_reported_delay_enabled(aec_core));
+  EXPECT_EQ(1, WebRtcAec_delay_agnostic_enabled(aec_core));
 
-  config.Set<ReportedDelay>(new ReportedDelay(true));
+  config.Set<DelayAgnostic>(new DelayAgnostic(false));
   ap->SetExtraOptions(config);
-  EXPECT_EQ(1, WebRtcAec_reported_delay_enabled(aec_core));
+  EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
 
   // Retains setting after initialization.
   EXPECT_EQ(ap->kNoError, ap->Initialize());
-  EXPECT_EQ(1, WebRtcAec_reported_delay_enabled(aec_core));
+  EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
 }
 
 }  // namespace webrtc
diff --git a/webrtc/modules/audio_processing/include/audio_processing.h b/webrtc/modules/audio_processing/include/audio_processing.h
index 2163a9e..80b7b4d 100644
--- a/webrtc/modules/audio_processing/include/audio_processing.h
+++ b/webrtc/modules/audio_processing/include/audio_processing.h
@@ -66,11 +66,19 @@
 // and not EchoControlMobile and is set with AudioProcessing::SetExtraOptions().
 // Note that by disabling reported system delays the EchoCancellation may
 // regress in performance.
+// TODO(henrik.lundin): Remove ReportedDelay once DelayAgnostic has
+// propagated through to all channels
+// (https://code.google.com/p/webrtc/issues/detail?id=4651).
 struct ReportedDelay {
   ReportedDelay() : enabled(true) {}
   explicit ReportedDelay(bool enabled) : enabled(enabled) {}
   bool enabled;
 };
+struct DelayAgnostic {
+  DelayAgnostic() : enabled(false) {}
+  explicit DelayAgnostic(bool enabled) : enabled(enabled) {}
+  bool enabled;
+};
 
 // Use to enable experimental gain control (AGC). At startup the experimental
 // AGC moves the microphone volume up to |startup_min_volume| if the current
diff --git a/webrtc/modules/audio_processing/test/audio_processing_unittest.cc b/webrtc/modules/audio_processing/test/audio_processing_unittest.cc
index c19449a..c7c45f7 100644
--- a/webrtc/modules/audio_processing/test/audio_processing_unittest.cc
+++ b/webrtc/modules/audio_processing/test/audio_processing_unittest.cc
@@ -893,7 +893,7 @@
             apm_->echo_cancellation()->enable_delay_logging(true));
   EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
   Config config;
-  config.Set<ReportedDelay>(new ReportedDelay(true));
+  config.Set<DelayAgnostic>(new DelayAgnostic(false));
   apm_->SetExtraOptions(config);
 
   // Internally in the AEC the amount of lookahead the delay estimation can
diff --git a/webrtc/modules/audio_processing/test/process_test.cc b/webrtc/modules/audio_processing/test/process_test.cc
index 0f28a44..715762f 100644
--- a/webrtc/modules/audio_processing/test/process_test.cc
+++ b/webrtc/modules/audio_processing/test/process_test.cc
@@ -261,7 +261,10 @@
       config.Set<ExtendedFilter>(new ExtendedFilter(true));
 
     } else if (strcmp(argv[i], "--no_reported_delay") == 0) {
-      config.Set<ReportedDelay>(new ReportedDelay(false));
+      config.Set<DelayAgnostic>(new DelayAgnostic(true));
+
+    } else if (strcmp(argv[i], "--delay_agnostic") == 0) {
+      config.Set<DelayAgnostic>(new DelayAgnostic(true));
 
     } else if (strcmp(argv[i], "-aecm") == 0) {
       ASSERT_EQ(apm->kNoError, apm->echo_control_mobile()->Enable(true));