Re-land r8342 "Switch to using AudioEncoderIsac instead of ACMISAC""

This reverts r8372, with a bug fix: allowing zero rate in
AudioEncoderIsac::Config. Without this fix, setting the rate to zero
triggered a CHECK. Existing callers assumed that zero was a valid
value. Setting the rate to zero will result in the default rate 32000
being set.

BUG=4228,chromium:458638
COAUTHOR=kwiberg@webrtc.org
R=tina.legrand@webrtc.org
TBR=tina.legrand@webrtc.org
CC=jmarusic@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/39159004

Cr-Commit-Position: refs/heads/master@{#8378}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8378 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h b/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h
index 17e533f..39daa00 100644
--- a/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h
+++ b/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h
@@ -23,6 +23,7 @@
 
 const int kIsacPayloadType = 103;
 const int kInvalidPayloadType = -1;
+const int kDefaultBitRate = 32000;
 
 template <typename T>
 AudioEncoderDecoderIsacT<T>::Config::Config()
@@ -30,7 +31,7 @@
       red_payload_type(kInvalidPayloadType),
       sample_rate_hz(16000),
       frame_size_ms(30),
-      bit_rate(32000),
+      bit_rate(kDefaultBitRate),
       max_bit_rate(-1),
       max_payload_size_bytes(-1) {
 }
@@ -48,7 +49,7 @@
       if (max_payload_size_bytes > 400)
         return false;
       return (frame_size_ms == 30 || frame_size_ms == 60) &&
-             bit_rate >= 10000 && bit_rate <= 32000;
+             ((bit_rate >= 10000 && bit_rate <= 32000) || bit_rate == 0);
     case 32000:
     case 48000:
       if (max_bit_rate > 160000)
@@ -56,7 +57,8 @@
       if (max_payload_size_bytes > 600)
         return false;
       return T::has_swb &&
-             (frame_size_ms == 30 && bit_rate >= 10000 && bit_rate <= 56000);
+             (frame_size_ms == 30 &&
+              ((bit_rate >= 10000 && bit_rate <= 56000) || bit_rate == 0));
     default:
       return false;
   }
@@ -68,7 +70,7 @@
       red_payload_type(kInvalidPayloadType),
       sample_rate_hz(16000),
       initial_frame_size_ms(30),
-      initial_bit_rate(32000),
+      initial_bit_rate(kDefaultBitRate),
       max_bit_rate(-1),
       enforce_frame_size(false),
       max_payload_size_bytes(-1) {
@@ -114,7 +116,9 @@
   CHECK_EQ(0, T::Create(&isac_state_));
   CHECK_EQ(0, T::EncoderInit(isac_state_, 1));
   CHECK_EQ(0, T::SetEncSampRate(isac_state_, config.sample_rate_hz));
-  CHECK_EQ(0, T::Control(isac_state_, config.bit_rate, config.frame_size_ms));
+  CHECK_EQ(0, T::Control(isac_state_, config.bit_rate == 0 ? kDefaultBitRate
+                                                           : config.bit_rate,
+                         config.frame_size_ms));
   // When config.sample_rate_hz is set to 48000 Hz (iSAC-fb), the decoder is
   // still set to 32000 Hz, since there is no full-band mode in the decoder.
   CHECK_EQ(0, T::SetDecSampRate(isac_state_,
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_codec_database.cc b/webrtc/modules/audio_coding/main/acm2/acm_codec_database.cc
index c366295..17d49a9 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_codec_database.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_codec_database.cc
@@ -578,7 +578,9 @@
   // All we have support for right now.
   if (!STR_CASE_CMP(codec_inst.plname, "ISAC")) {
 #if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX))
-    return new ACMISAC(kISAC, enable_red);
+    return new ACMGenericCodecWrapper(codec_inst, cng_pt_nb, cng_pt_wb,
+                                      cng_pt_swb, cng_pt_fb, enable_red,
+                                      red_payload_type);
 #endif
   } else if (!STR_CASE_CMP(codec_inst.plname, "PCMU") ||
              !STR_CASE_CMP(codec_inst.plname, "PCMA")) {
diff --git a/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.cc b/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.cc
index fc1191a..8d0f318 100644
--- a/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.cc
+++ b/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.cc
@@ -270,7 +270,6 @@
   FrameType frame_type = kAudioFrameSpeech;
   uint8_t current_payload_type = 0;
   bool has_data_to_send = false;
-  bool red_active = false;
   RTPFragmentationHeader my_fragmentation;
 
   // Keep the scope of the ACM critical section limited.
@@ -302,36 +301,32 @@
         }
         case kActiveNormalEncoded:
         case kPassiveNormalEncoded: {
-          current_payload_type = static_cast<uint8_t>(send_codec_inst_.pltype);
           frame_type = kAudioFrameSpeech;
           break;
         }
         case kPassiveDTXNB: {
-          current_payload_type = cng_nb_pltype_;
           frame_type = kAudioFrameCN;
           is_first_red_ = true;
           break;
         }
         case kPassiveDTXWB: {
-          current_payload_type = cng_wb_pltype_;
           frame_type = kAudioFrameCN;
           is_first_red_ = true;
           break;
         }
         case kPassiveDTXSWB: {
-          current_payload_type = cng_swb_pltype_;
           frame_type = kAudioFrameCN;
           is_first_red_ = true;
           break;
         }
         case kPassiveDTXFB: {
-          current_payload_type = cng_fb_pltype_;
           frame_type = kAudioFrameCN;
           is_first_red_ = true;
           break;
         }
       }
       has_data_to_send = true;
+      current_payload_type = encoded_info.payload_type;
       previous_pltype_ = current_payload_type;
 
       ConvertEncodedInfoToFragmentationHeader(encoded_info, &my_fragmentation);
@@ -348,8 +343,9 @@
       // have been switched to the new AudioEncoder interface.
       if ((codecs_[current_send_codec_idx_]->ExternalRedNeeded()) &&
           ((encoding_type == kActiveNormalEncoded) ||
-              (encoding_type == kPassiveNormalEncoded))) {
+           (encoding_type == kPassiveNormalEncoded))) {
         DCHECK(encoded_info.redundant.empty());
+        FATAL() << "Don't go here!";
         // RED is enabled within this scope.
         //
         // Note that, a special solution exists for iSAC since it is the only
@@ -389,7 +385,6 @@
         //
         //  Hence, even if every second packet is dropped, perfect
         //  reconstruction is possible.
-        red_active = true;
 
         has_data_to_send = false;
         // Skip the following part for the first packet in a RED session.
@@ -457,7 +452,7 @@
     CriticalSectionScoped lock(callback_crit_sect_);
 
     if (packetization_callback_ != NULL) {
-      if (red_active || my_fragmentation.fragmentationVectorSize > 0) {
+      if (my_fragmentation.fragmentationVectorSize > 0) {
         // Callback with payload data, including redundant data (RED).
         packetization_callback_->SendData(frame_type, current_payload_type,
                                           rtp_timestamp, stream, length_bytes,
diff --git a/webrtc/modules/audio_coding/main/acm2/audio_coding_module_unittest.cc b/webrtc/modules/audio_coding/main/acm2/audio_coding_module_unittest.cc
index 4ee5339..5185c12 100644
--- a/webrtc/modules/audio_coding/main/acm2/audio_coding_module_unittest.cc
+++ b/webrtc/modules/audio_coding/main/acm2/audio_coding_module_unittest.cc
@@ -809,15 +809,14 @@
   ASSERT_NO_FATAL_FAILURE(
       SetUpTest(acm2::ACMCodecDB::kISACSWB, 1, 104, 960, 960));
   Run(AcmReceiverBitExactness::PlatformChecksum(
-          "98d960600eb4ddb3fcbe11f5057ddfd7",
+          "2b3c387d06f00b7b7aad4c9be56fb83d",
           "",
-          "2f6dfe142f735f1d96f6bd86d2526f42"),
+          "5683b58da0fbf2063c7adc2e6bfb3fb8"),
       AcmReceiverBitExactness::PlatformChecksum(
-          "cc9d2d86a71d6f99f97680a5c27e2762",
+          "bcc2041e7744c7ebd9f701866856849c",
           "",
-          "7b214fc3a5e33d68bf30e77969371f31"),
-      33,
-      test::AcmReceiveTest::kMonoOutput);
+          "ce86106a93419aefb063097108ec94ab"),
+      33, test::AcmReceiveTest::kMonoOutput);
 }
 
 TEST_F(AcmSenderBitExactness, Pcm16_8000khz_10ms) {
diff --git a/webrtc/modules/audio_coding/main/acm2/audio_coding_module_unittest_oldapi.cc b/webrtc/modules/audio_coding/main/acm2/audio_coding_module_unittest_oldapi.cc
index 1501d03..329edd3 100644
--- a/webrtc/modules/audio_coding/main/acm2/audio_coding_module_unittest_oldapi.cc
+++ b/webrtc/modules/audio_coding/main/acm2/audio_coding_module_unittest_oldapi.cc
@@ -932,15 +932,14 @@
 TEST_F(AcmSenderBitExactnessOldApi, DISABLED_ON_ANDROID(IsacSwb30ms)) {
   ASSERT_NO_FATAL_FAILURE(SetUpTest("ISAC", 32000, 1, 104, 960, 960));
   Run(AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "98d960600eb4ddb3fcbe11f5057ddfd7",
+          "2b3c387d06f00b7b7aad4c9be56fb83d",
           "",
-          "2f6dfe142f735f1d96f6bd86d2526f42"),
+          "5683b58da0fbf2063c7adc2e6bfb3fb8"),
       AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "cc9d2d86a71d6f99f97680a5c27e2762",
+          "bcc2041e7744c7ebd9f701866856849c",
           "",
-          "7b214fc3a5e33d68bf30e77969371f31"),
-      33,
-      test::AcmReceiveTestOldApi::kMonoOutput);
+          "ce86106a93419aefb063097108ec94ab"),
+      33, test::AcmReceiveTestOldApi::kMonoOutput);
 }
 
 TEST_F(AcmSenderBitExactnessOldApi, Pcm16_8000khz_10ms) {