Introduce AudioCodingModuleImpl::current_encoder_

This replaces direct reference into the codecs_ array in many places.
The variables current_send_codec_idx_ and send_codec_registered_ are
replaced.

COAUTHOR=kwiberg@webrtc.org
BUG=4228
R=minyue@webrtc.org

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

Cr-Commit-Position: refs/heads/master@{#8890}
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 d0bce92..c4ab6a9 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
@@ -135,9 +135,8 @@
       vad_enabled_(false),
       dtx_enabled_(false),
       vad_mode_(VADNormal),
+      current_encoder_(nullptr),
       stereo_send_(false),
-      current_send_codec_idx_(-1),
-      send_codec_registered_(false),
       receiver_(config),
       red_enabled_(false),
       codec_fec_enabled_(false),
@@ -188,7 +187,6 @@
 AudioCodingModuleImpl::~AudioCodingModuleImpl() {
   {
     CriticalSectionScoped lock(acm_crit_sect_);
-    current_send_codec_idx_ = -1;
 
     for (int i = 0; i < ACMCodecDB::kMaxNumCodecs; i++) {
       if (codecs_[i] != NULL) {
@@ -231,8 +229,7 @@
       return -1;
     }
 
-    AudioEncoder* audio_encoder =
-        codecs_[current_send_codec_idx_]->GetAudioEncoder();
+    AudioEncoder* audio_encoder = current_encoder_->GetAudioEncoder();
     // Scale the timestamp to the codec's RTP timestamp rate.
     uint32_t rtp_timestamp =
         first_frame_ ? input_data.input_timestamp
@@ -298,8 +295,7 @@
   CriticalSectionScoped lock(acm_crit_sect_);
 
   // Start with invalid values.
-  send_codec_registered_ = false;
-  current_send_codec_idx_ = -1;
+  current_encoder_ = nullptr;
   send_codec_inst_.plname[0] = '\0';
 
   return 0;
@@ -406,10 +402,6 @@
 
   // Check for reported errors from function IsValidSendCodec().
   if (codec_id < 0) {
-    if (!send_codec_registered_) {
-      // This values has to be NULL if there is no codec registered.
-      current_send_codec_idx_ = -1;
-    }
     return -1;
   }
 
@@ -485,7 +477,7 @@
 
   // Check if the codec is already registered as send codec.
   bool is_send_codec;
-  if (send_codec_registered_) {
+  if (current_encoder_) {
     int send_codec_mirror_id;
     int send_codec_id = ACMCodecDB::CodecNumber(send_codec_inst_,
                                                 &send_codec_mirror_id);
@@ -526,8 +518,7 @@
 
       // Check if already have a registered codec.
       // Depending on that different messages are logged.
-      if (!send_codec_registered_) {
-        current_send_codec_idx_ = -1;
+      if (!current_encoder_) {
         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, id_,
                      "Cannot Initialize the encoder No Encoder is registered");
       } else {
@@ -544,7 +535,7 @@
     vad_mode_ = codec_params.vad_mode;
 
     // Everything is fine so we can replace the previous codec with this one.
-    if (send_codec_registered_) {
+    if (current_encoder_) {
       // If we change codec we start fresh with RED.
       // This is not strictly required by the standard.
 
@@ -567,8 +558,8 @@
       }
     }
 
-    current_send_codec_idx_ = codec_id;
-    send_codec_registered_ = true;
+    current_encoder_ = codecs_[codec_id];
+    DCHECK(current_encoder_);
     memcpy(&send_codec_inst_, &send_codec, sizeof(CodecInst));
     return 0;
   } else {
@@ -621,8 +612,7 @@
       codec_params.vad_mode = vad_mode_;
 
       // Force initialization.
-      if (codecs_[current_send_codec_idx_]->InitEncoder(&codec_params,
-                                                        true) < 0) {
+      if (current_encoder_->InitEncoder(&codec_params, true) < 0) {
         WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, id_,
                      "Could not change the codec packet-size.");
         return -1;
@@ -668,13 +658,13 @@
                "SendCodec()");
   CriticalSectionScoped lock(acm_crit_sect_);
 
-  if (!send_codec_registered_) {
+  if (!current_encoder_) {
     WEBRTC_TRACE(webrtc::kTraceStream, webrtc::kTraceAudioCoding, id_,
                  "SendCodec Failed, no codec is registered");
     return -1;
   }
   WebRtcACMCodecParams encoder_param;
-  codecs_[current_send_codec_idx_]->EncoderParams(&encoder_param);
+  current_encoder_->EncoderParams(&encoder_param);
   encoder_param.codec_inst.pltype = send_codec_inst_.pltype;
   memcpy(current_codec, &(encoder_param.codec_inst), sizeof(CodecInst));
 
@@ -687,7 +677,7 @@
                "SendFrequency()");
   CriticalSectionScoped lock(acm_crit_sect_);
 
-  if (!send_codec_registered_) {
+  if (!current_encoder_) {
     WEBRTC_TRACE(webrtc::kTraceStream, webrtc::kTraceAudioCoding, id_,
                  "SendFrequency Failed, no codec is registered");
     return -1;
@@ -703,14 +693,14 @@
 int AudioCodingModuleImpl::SendBitrate() const {
   CriticalSectionScoped lock(acm_crit_sect_);
 
-  if (!send_codec_registered_) {
+  if (!current_encoder_) {
     WEBRTC_TRACE(webrtc::kTraceStream, webrtc::kTraceAudioCoding, id_,
                  "SendBitrate Failed, no codec is registered");
     return -1;
   }
 
   WebRtcACMCodecParams encoder_param;
-  codecs_[current_send_codec_idx_]->EncoderParams(&encoder_param);
+  current_encoder_->EncoderParams(&encoder_param);
 
   return encoder_param.codec_inst.rate;
 }
@@ -924,7 +914,7 @@
   // If a send codec is registered, set RED for the codec. We now only support
   // copy red.
   if (HaveValidEncoder("SetCopyRed") &&
-      codecs_[current_send_codec_idx_]->SetCopyRed(enable_red) < 0) {
+      current_encoder_->SetCopyRed(enable_red) < 0) {
       WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, id_,
                    "SetREDStatus failed");
       return -1;
@@ -959,7 +949,7 @@
 
   // Set codec FEC.
   if (HaveValidEncoder("SetCodecFEC") &&
-      codecs_[current_send_codec_idx_]->SetFEC(enable_codec_fec) < 0) {
+      current_encoder_->SetFEC(enable_codec_fec) < 0) {
       WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, id_,
                    "Set codec internal FEC failed.");
     return -1;
@@ -971,7 +961,7 @@
 int AudioCodingModuleImpl::SetPacketLossRate(int loss_rate) {
   CriticalSectionScoped lock(acm_crit_sect_);
   if (HaveValidEncoder("SetPacketLossRate") &&
-      codecs_[current_send_codec_idx_]->SetPacketLossRate(loss_rate) < 0) {
+      current_encoder_->SetPacketLossRate(loss_rate) < 0) {
       WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, id_,
                    "Set packet loss rate failed.");
     return -1;
@@ -1019,8 +1009,8 @@
   vad_mode_ = mode;
 
   // If a send codec is registered, set VAD/DTX for the codec.
-  if (HaveValidEncoder("SetVAD") && codecs_[current_send_codec_idx_]->SetVAD(
-      &dtx_enabled_, &vad_enabled_,  &vad_mode_) < 0) {
+  if (HaveValidEncoder("SetVAD") &&
+      current_encoder_->SetVAD(&dtx_enabled_, &vad_enabled_, &vad_mode_) < 0) {
       // SetVAD failed.
       WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, id_,
                    "SetVAD failed");
@@ -1322,7 +1312,7 @@
     return -1;
   }
 
-  return codecs_[current_send_codec_idx_]->SetISACMaxRate(max_bit_per_sec);
+  return current_encoder_->SetISACMaxRate(max_bit_per_sec);
 }
 
 // TODO(henrik.lundin): Remove? Only used in tests. Deprecated in VoiceEngine.
@@ -1333,8 +1323,7 @@
     return -1;
   }
 
-  return codecs_[current_send_codec_idx_]->SetISACMaxPayloadSize(
-      max_size_bytes);
+  return current_encoder_->SetISACMaxPayloadSize(max_size_bytes);
 }
 
 // TODO(henrik.lundin): Remove? Only used in tests.
@@ -1360,8 +1349,8 @@
   if (!HaveValidEncoder("SetOpusApplication")) {
     return -1;
   }
-  return codecs_[current_send_codec_idx_]->SetOpusApplication(
-      application, disable_dtx_if_needed);
+  return current_encoder_->SetOpusApplication(application,
+                                              disable_dtx_if_needed);
 }
 
 // Informs Opus encoder of the maximum playback rate the receiver will render.
@@ -1370,7 +1359,7 @@
   if (!HaveValidEncoder("SetOpusMaxPlaybackRate")) {
     return -1;
   }
-  return codecs_[current_send_codec_idx_]->SetOpusMaxPlaybackRate(frequency_hz);
+  return current_encoder_->SetOpusMaxPlaybackRate(frequency_hz);
 }
 
 int AudioCodingModuleImpl::EnableOpusDtx(bool force_voip) {
@@ -1378,7 +1367,7 @@
   if (!HaveValidEncoder("EnableOpusDtx")) {
     return -1;
   }
-  return codecs_[current_send_codec_idx_]->EnableOpusDtx(force_voip);
+  return current_encoder_->EnableOpusDtx(force_voip);
 }
 
 int AudioCodingModuleImpl::DisableOpusDtx() {
@@ -1386,7 +1375,7 @@
   if (!HaveValidEncoder("DisableOpusDtx")) {
     return -1;
   }
-  return codecs_[current_send_codec_idx_]->DisableOpusDtx();
+  return current_encoder_->DisableOpusDtx();
 }
 
 int AudioCodingModuleImpl::PlayoutTimestamp(uint32_t* timestamp) {
@@ -1394,23 +1383,11 @@
 }
 
 bool AudioCodingModuleImpl::HaveValidEncoder(const char* caller_name) const {
-  if ((!send_codec_registered_) || (current_send_codec_idx_ < 0) ||
-      (current_send_codec_idx_ >= ACMCodecDB::kNumCodecs)) {
+  if (!current_encoder_) {
     WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, id_,
                  "%s failed: No send codec is registered.", caller_name);
     return false;
   }
-  if ((current_send_codec_idx_ < 0) ||
-      (current_send_codec_idx_ >= ACMCodecDB::kNumCodecs)) {
-    WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, id_,
-                 "%s failed: Send codec index out of range.", caller_name);
-    return false;
-  }
-  if (codecs_[current_send_codec_idx_] == NULL) {
-    WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, id_,
-                 "%s failed: Send codec is NULL pointer.", caller_name);
-    return false;
-  }
   return true;
 }
 
diff --git a/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.h b/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.h
index e41f857..04a2059 100644
--- a/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.h
+++ b/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.h
@@ -317,10 +317,9 @@
   ACMVADMode vad_mode_ GUARDED_BY(acm_crit_sect_);
   ACMGenericCodec* codecs_[ACMCodecDB::kMaxNumCodecs]
       GUARDED_BY(acm_crit_sect_);
+  ACMGenericCodec* current_encoder_ GUARDED_BY(acm_crit_sect_);
   int mirror_codec_idx_[ACMCodecDB::kMaxNumCodecs] GUARDED_BY(acm_crit_sect_);
   bool stereo_send_ GUARDED_BY(acm_crit_sect_);
-  int current_send_codec_idx_ GUARDED_BY(acm_crit_sect_);
-  bool send_codec_registered_ GUARDED_BY(acm_crit_sect_);
   ACMResampler resampler_ GUARDED_BY(acm_crit_sect_);
   AcmReceiver receiver_;  // AcmReceiver has it's own internal lock.