Add a new parameter to ACMGenericCodec constructor

Adding the same parameter to the constructors in all subclasses.

This change is in preparation for changes to come where this will be
needed.

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

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

Cr-Commit-Position: refs/heads/master@{#8210}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8210 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_amr.cc b/webrtc/modules/audio_coding/main/acm2/acm_amr.cc
index 6c958a5..f8e6450 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_amr.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_amr.cc
@@ -46,8 +46,9 @@
 namespace acm2 {
 
 #ifndef WEBRTC_CODEC_AMR
-ACMAMR::ACMAMR(int16_t /* codec_id */)
-    : encoder_inst_ptr_(NULL),
+ACMAMR::ACMAMR(int16_t /* codec_id */, bool enable_red)
+    : ACMGenericCodec(enable_red),
+      encoder_inst_ptr_(NULL),
       encoding_mode_(-1),  // Invalid value.
       encoding_rate_(0),   // Invalid value.
       encoder_packing_format_(AMRBandwidthEfficient) {
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_amr.h b/webrtc/modules/audio_coding/main/acm2/acm_amr.h
index ab22300..09d9e43 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_amr.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_amr.h
@@ -25,7 +25,7 @@
 
 class ACMAMR : public ACMGenericCodec {
  public:
-  explicit ACMAMR(int16_t codec_id);
+  ACMAMR(int16_t codec_id, bool enable_red);
   ~ACMAMR();
 
   // for FEC
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_amrwb.cc b/webrtc/modules/audio_coding/main/acm2/acm_amrwb.cc
index 5c9540f..0aad31e 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_amrwb.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_amrwb.cc
@@ -43,8 +43,9 @@
 namespace acm2 {
 
 #ifndef WEBRTC_CODEC_AMRWB
-ACMAMRwb::ACMAMRwb(int16_t /* codec_id */)
-    : encoder_inst_ptr_(NULL),
+ACMAMRwb::ACMAMRwb(int16_t /* codec_id */, bool enable_red)
+    : ACMGenericCodec(enable_red),
+      encoder_inst_ptr_(NULL),
       encoding_mode_(-1),  // invalid value
       encoding_rate_(0),   // invalid value
       encoder_packing_format_(AMRBandwidthEfficient) {}
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_amrwb.h b/webrtc/modules/audio_coding/main/acm2/acm_amrwb.h
index 5b90e0b..9e09b6b 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_amrwb.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_amrwb.h
@@ -23,7 +23,7 @@
 
 class ACMAMRwb : public ACMGenericCodec {
  public:
-  explicit ACMAMRwb(int16_t codec_id);
+  ACMAMRwb(int16_t codec_id, bool enable_red);
   ~ACMAMRwb();
 
   // for FEC
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_cng.cc b/webrtc/modules/audio_coding/main/acm2/acm_cng.cc
index 8fef66e..acb6a30 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_cng.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_cng.cc
@@ -19,7 +19,8 @@
 
 namespace acm2 {
 
-ACMCNG::ACMCNG(int16_t codec_id) {
+ACMCNG::ACMCNG(int16_t codec_id, bool enable_red)
+    : ACMGenericCodec(enable_red) {
   encoder_inst_ptr_ = NULL;
   codec_id_ = codec_id;
   samp_freq_hz_ = ACMCodecDB::CodecFreq(codec_id_);
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_cng.h b/webrtc/modules/audio_coding/main/acm2/acm_cng.h
index d3a8bd3..374b0fc 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_cng.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_cng.h
@@ -23,7 +23,7 @@
 
 class ACMCNG: public ACMGenericCodec {
  public:
-  explicit ACMCNG(int16_t codec_id);
+  ACMCNG(int16_t codec_id, bool enable_red);
   ~ACMCNG();
 
   // for FEC
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 1899abb..18caa61 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_codec_database.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_codec_database.cc
@@ -572,38 +572,38 @@
   // 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);
+    return new ACMISAC(kISAC, false);
 #endif
   } else if (!STR_CASE_CMP(codec_inst.plname, "PCMU")) {
     if (codec_inst.channels == 1) {
-      return new ACMPCMU(kPCMU);
+      return new ACMPCMU(kPCMU, false);
     } else {
-      return new ACMPCMU(kPCMU_2ch);
+      return new ACMPCMU(kPCMU_2ch, false);
     }
   } else if (!STR_CASE_CMP(codec_inst.plname, "PCMA")) {
     if (codec_inst.channels == 1) {
-      return new ACMPCMA(kPCMA);
+      return new ACMPCMA(kPCMA, false);
     } else {
-      return new ACMPCMA(kPCMA_2ch);
+      return new ACMPCMA(kPCMA_2ch, false);
     }
   } else if (!STR_CASE_CMP(codec_inst.plname, "ILBC")) {
 #ifdef WEBRTC_CODEC_ILBC
-    return new ACMILBC(kILBC);
+    return new ACMILBC(kILBC, false);
 #endif
   } else if (!STR_CASE_CMP(codec_inst.plname, "AMR")) {
 #ifdef WEBRTC_CODEC_AMR
-    return new ACMAMR(kGSMAMR);
+    return new ACMAMR(kGSMAMR, false);
 #endif
   } else if (!STR_CASE_CMP(codec_inst.plname, "AMR-WB")) {
 #ifdef WEBRTC_CODEC_AMRWB
-    return new ACMAMRwb(kGSMAMRWB);
+    return new ACMAMRwb(kGSMAMRWB, false);
 #endif
   } else if (!STR_CASE_CMP(codec_inst.plname, "G722")) {
 #ifdef WEBRTC_CODEC_G722
     if (codec_inst.channels == 1) {
-      return new ACMG722(kG722);
+      return new ACMG722(kG722, false);
     } else {
-      return new ACMG722(kG722_2ch);
+      return new ACMG722(kG722_2ch, false);
     }
 #endif
   } else if (!STR_CASE_CMP(codec_inst.plname, "G7221")) {
@@ -628,7 +628,7 @@
             return NULL;
           }
         }
-        return new ACMG722_1(codec_id);
+        return new ACMG722_1(codec_id, false);
 #endif
         FALLTHROUGH();
       }
@@ -652,7 +652,7 @@
             return NULL;
           }
         }
-        return new ACMG722_1C(codec_id);
+        return new ACMG722_1C(codec_id, false);
 #endif
         FALLTHROUGH();
       }
@@ -685,18 +685,18 @@
         return NULL;
       }
     }
-    return new ACMCNG(codec_id);
+    return new ACMCNG(codec_id, false);
   } else if (!STR_CASE_CMP(codec_inst.plname, "G729")) {
 #ifdef WEBRTC_CODEC_G729
-    return new ACMG729(kG729);
+    return new ACMG729(kG729, false);
 #endif
   } else if (!STR_CASE_CMP(codec_inst.plname, "G7291")) {
 #ifdef WEBRTC_CODEC_G729_1
-    return new ACMG729_1(kG729_1);
+    return new ACMG729_1(kG729_1, false);
 #endif
   } else if (!STR_CASE_CMP(codec_inst.plname, "opus")) {
 #ifdef WEBRTC_CODEC_OPUS
-    return new ACMOpus(kOpus);
+    return new ACMOpus(kOpus, false);
 #endif
   } else if (!STR_CASE_CMP(codec_inst.plname, "speex")) {
 #ifdef WEBRTC_CODEC_SPEEX
@@ -714,7 +714,7 @@
         return NULL;
       }
     }
-    return new ACMSPEEX(codec_id);
+    return new ACMSPEEX(codec_id, false);
 #endif
   } else if (!STR_CASE_CMP(codec_inst.plname, "CN")) {
     // For CN we need to check sampling frequency to know what codec to create.
@@ -742,7 +742,7 @@
         return NULL;
       }
     }
-    return new ACMCNG(codec_id);
+    return new ACMCNG(codec_id, false);
   } else if (!STR_CASE_CMP(codec_inst.plname, "L16")) {
 #ifdef WEBRTC_CODEC_PCM16
     // For L16 we need to check sampling frequency to know what codec to create.
@@ -784,15 +784,15 @@
         }
       }
     }
-    return new ACMPCM16B(codec_id);
+    return new ACMPCM16B(codec_id, false);
 #endif
   } else if (!STR_CASE_CMP(codec_inst.plname, "telephone-event")) {
 #ifdef WEBRTC_CODEC_AVT
-    return new ACMDTMFPlayout(kAVT);
+    return new ACMDTMFPlayout(kAVT, false);
 #endif
   } else if (!STR_CASE_CMP(codec_inst.plname, "red")) {
 #ifdef WEBRTC_CODEC_RED
-    return new ACMRED(kRED);
+    return new ACMRED(kRED, false);
 #endif
   }
   return NULL;
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_dtmf_playout.cc b/webrtc/modules/audio_coding/main/acm2/acm_dtmf_playout.cc
index c9f4ded..e138a995 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_dtmf_playout.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_dtmf_playout.cc
@@ -46,7 +46,10 @@
 
 #else  //===================== Actual Implementation =======================
 
-ACMDTMFPlayout::ACMDTMFPlayout(int16_t codec_id) { codec_id_ = codec_id; }
+ACMDTMFPlayout::ACMDTMFPlayout(int16_t codec_id, bool enable_red)
+    : ACMGenericCodec(enable_red) {
+  codec_id_ = codec_id;
+}
 
 ACMDTMFPlayout::~ACMDTMFPlayout() { return; }
 
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_dtmf_playout.h b/webrtc/modules/audio_coding/main/acm2/acm_dtmf_playout.h
index dd87df4..72f201b 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_dtmf_playout.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_dtmf_playout.h
@@ -19,7 +19,7 @@
 
 class ACMDTMFPlayout : public ACMGenericCodec {
  public:
-  explicit ACMDTMFPlayout(int16_t codec_id);
+  ACMDTMFPlayout(int16_t codec_id, bool enable_red);
   ~ACMDTMFPlayout();
 
   // for FEC
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_g722.cc b/webrtc/modules/audio_coding/main/acm2/acm_g722.cc
index dfe781e..d27ef00 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_g722.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_g722.cc
@@ -64,8 +64,10 @@
   G722DecInst* inst_right;  // instance for right channel in case of stereo
 };
 
-ACMG722::ACMG722(int16_t codec_id)
-    : encoder_inst_ptr_(NULL), encoder_inst_ptr_right_(NULL) {
+ACMG722::ACMG722(int16_t codec_id, bool enable_red)
+    : ACMGenericCodec(enable_red),
+      encoder_inst_ptr_(NULL),
+      encoder_inst_ptr_right_(NULL) {
   ptr_enc_str_ = new ACMG722EncStr;
   if (ptr_enc_str_ != NULL) {
     ptr_enc_str_->inst = NULL;
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_g722.h b/webrtc/modules/audio_coding/main/acm2/acm_g722.h
index dd3b766..79ddf28 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_g722.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_g722.h
@@ -27,7 +27,7 @@
 
 class ACMG722 : public ACMGenericCodec {
  public:
-  explicit ACMG722(int16_t codec_id);
+  ACMG722(int16_t codec_id, bool enable_red);
   ~ACMG722();
 
   // For FEC.
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_g7221.cc b/webrtc/modules/audio_coding/main/acm2/acm_g7221.cc
index 5739dd3..7e907bd 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_g7221.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_g7221.cc
@@ -84,8 +84,9 @@
 
 #ifndef WEBRTC_CODEC_G722_1
 
-ACMG722_1::ACMG722_1(int16_t /* codec_id */)
-    : operational_rate_(-1),
+ACMG722_1::ACMG722_1(int16_t /* codec_id */, bool enable_red)
+    : ACMGenericCodec(enable_red),
+      operational_rate_(-1),
       encoder_inst_ptr_(NULL),
       encoder_inst_ptr_right_(NULL),
       encoder_inst16_ptr_(NULL),
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_g7221.h b/webrtc/modules/audio_coding/main/acm2/acm_g7221.h
index 3935798..10a49ac 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_g7221.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_g7221.h
@@ -28,7 +28,7 @@
 
 class ACMG722_1 : public ACMGenericCodec {
  public:
-  explicit ACMG722_1(int16_t codec_id);
+  ACMG722_1(int16_t codec_id, bool enable_red);
   ~ACMG722_1();
 
   // for FEC
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_g7221c.cc b/webrtc/modules/audio_coding/main/acm2/acm_g7221c.cc
index 996eaf8..88d9b0b 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_g7221c.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_g7221c.cc
@@ -84,8 +84,9 @@
 
 #ifndef WEBRTC_CODEC_G722_1C
 
-ACMG722_1C::ACMG722_1C(int16_t /* codec_id */)
-    : operational_rate_(-1),
+ACMG722_1C::ACMG722_1C(int16_t /* codec_id */, bool enable_red)
+    : ACMGenericCodec(enable_red),
+      operational_rate_(-1),
       encoder_inst_ptr_(NULL),
       encoder_inst_ptr_right_(NULL),
       encoder_inst24_ptr_(NULL),
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_g7221c.h b/webrtc/modules/audio_coding/main/acm2/acm_g7221c.h
index 52a0db9..e22790d 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_g7221c.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_g7221c.h
@@ -28,7 +28,7 @@
 
 class ACMG722_1C : public ACMGenericCodec {
  public:
-  explicit ACMG722_1C(int16_t codec_id);
+  ACMG722_1C(int16_t codec_id, bool enable_red);
   ~ACMG722_1C();
 
   // for FEC
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_g729.cc b/webrtc/modules/audio_coding/main/acm2/acm_g729.cc
index de1af6e..c50379f 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_g729.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_g729.cc
@@ -26,7 +26,9 @@
 
 #ifndef WEBRTC_CODEC_G729
 
-ACMG729::ACMG729(int16_t /* codec_id */) : encoder_inst_ptr_(NULL) {}
+ACMG729::ACMG729(int16_t /* codec_id */, bool enable_red)
+    : ACMGenericCodec(enable_red), encoder_inst_ptr_(NULL) {
+}
 
 ACMG729::~ACMG729() { return; }
 
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_g729.h b/webrtc/modules/audio_coding/main/acm2/acm_g729.h
index be48c6e..e19ce5a 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_g729.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_g729.h
@@ -23,7 +23,7 @@
 
 class ACMG729 : public ACMGenericCodec {
  public:
-  explicit ACMG729(int16_t codec_id);
+  ACMG729(int16_t codec_id, bool enable_red);
   ~ACMG729();
 
   // for FEC
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_g7291.cc b/webrtc/modules/audio_coding/main/acm2/acm_g7291.cc
index e50d027..6328924 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_g7291.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_g7291.cc
@@ -25,8 +25,9 @@
 
 #ifndef WEBRTC_CODEC_G729_1
 
-ACMG729_1::ACMG729_1(int16_t /* codec_id */)
-    : encoder_inst_ptr_(NULL),
+ACMG729_1::ACMG729_1(int16_t /* codec_id */, bool enable_red)
+    : ACMGenericCodec(enable_red),
+      encoder_inst_ptr_(NULL),
       my_rate_(32000),
       flag_8khz_(0),
       flag_g729_mode_(0) {
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_g7291.h b/webrtc/modules/audio_coding/main/acm2/acm_g7291.h
index 8387dcf..908e64f 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_g7291.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_g7291.h
@@ -23,7 +23,7 @@
 
 class ACMG729_1 : public ACMGenericCodec {
  public:
-  explicit ACMG729_1(int16_t codec_id);
+  ACMG729_1(int16_t codec_id, bool enable_red);
   ~ACMG729_1();
 
   // for FEC
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_generic_codec.cc b/webrtc/modules/audio_coding/main/acm2/acm_generic_codec.cc
index 6b18095..209d589 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_generic_codec.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_generic_codec.cc
@@ -37,7 +37,7 @@
 // We set some of the variables to invalid values as a check point
 // if a proper initialization has happened. Another approach is
 // to initialize to a default codec that we are sure is always included.
-ACMGenericCodec::ACMGenericCodec()
+ACMGenericCodec::ACMGenericCodec(bool enable_red)
     : in_audio_ix_write_(0),
       in_audio_ix_read_(0),
       in_timestamp_ix_write_(0),
@@ -60,6 +60,7 @@
       sent_cn_previous_(false),
       prev_frame_cng_(0),
       has_internal_fec_(false),
+      copy_red_enabled_(enable_red),
       codec_wrapper_lock_(*RWLockWrapper::CreateRWLock()),
       last_timestamp_(0xD87F3F9F),
       unique_id_(0) {
@@ -202,6 +203,16 @@
   return 0;
 }
 
+void ACMGenericCodec::EnableCopyRed(bool enable, int /*red_payload_type*/) {
+  WriteLockScoped lockCodec(codec_wrapper_lock_);
+  copy_red_enabled_ = enable;
+}
+
+bool ACMGenericCodec::ExternalRedNeeded() {
+  ReadLockScoped lockCodec(codec_wrapper_lock_);
+  return copy_red_enabled_;
+}
+
 int16_t ACMGenericCodec::Encode(uint8_t* bitstream,
                                 int16_t* bitstream_len_byte,
                                 uint32_t* timestamp,
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_generic_codec.h b/webrtc/modules/audio_coding/main/acm2/acm_generic_codec.h
index b13719f..9d04510 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_generic_codec.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_generic_codec.h
@@ -40,7 +40,7 @@
   ///////////////////////////////////////////////////////////////////////////
   // Constructor of the class
   //
-  ACMGenericCodec();
+  explicit ACMGenericCodec(bool enable_red);
 
   ///////////////////////////////////////////////////////////////////////////
   // Destructor of the class.
@@ -614,6 +614,13 @@
   //
   virtual int SetPacketLossRate(int /* loss_rate */) { return 0; }
 
+  // Sets if CopyRed should be enabled.
+  virtual void EnableCopyRed(bool enable, int red_payload_type);
+
+  // Returns true if the caller needs to produce RED data manually (that is, if
+  // RED has been enabled but the codec isn't able to produce the data itself).
+  virtual bool ExternalRedNeeded();
+
  protected:
   ///////////////////////////////////////////////////////////////////////////
   // All the functions with FunctionNameSafe(...) contain the actual
@@ -953,6 +960,8 @@
   // FEC.
   bool has_internal_fec_ GUARDED_BY(codec_wrapper_lock_);
 
+  bool copy_red_enabled_ GUARDED_BY(codec_wrapper_lock_);
+
   WebRtcACMCodecParams encoder_params_ GUARDED_BY(codec_wrapper_lock_);
 
   // Used to lock wrapper internal data
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_gsmfr.cc b/webrtc/modules/audio_coding/main/acm2/acm_gsmfr.cc
index 1c37a1e..77cecd8 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_gsmfr.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_gsmfr.cc
@@ -25,7 +25,9 @@
 
 #ifndef WEBRTC_CODEC_GSMFR
 
-ACMGSMFR::ACMGSMFR(int16_t /* codec_id */) : encoder_inst_ptr_(NULL) {}
+ACMGSMFR::ACMGSMFR(int16_t /* codec_id */, bool enable_red)
+    : ACMGenericCodec(enable_red), encoder_inst_ptr_(NULL) {
+}
 
 ACMGSMFR::~ACMGSMFR() { return; }
 
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_gsmfr.h b/webrtc/modules/audio_coding/main/acm2/acm_gsmfr.h
index 2cf954b..5a84899 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_gsmfr.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_gsmfr.h
@@ -23,7 +23,7 @@
 
 class ACMGSMFR : public ACMGenericCodec {
  public:
-  explicit ACMGSMFR(int16_t codec_id);
+  ACMGSMFR(int16_t codec_id, bool enable_red);
   ~ACMGSMFR();
 
   // for FEC
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_ilbc.cc b/webrtc/modules/audio_coding/main/acm2/acm_ilbc.cc
index 94d655f..878d6e0 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_ilbc.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_ilbc.cc
@@ -44,7 +44,8 @@
 
 #else  //===================== Actual Implementation =======================
 
-ACMILBC::ACMILBC(int16_t codec_id) : encoder_inst_ptr_(NULL) {
+ACMILBC::ACMILBC(int16_t codec_id, bool enable_red)
+    : ACMGenericCodec(enable_red), encoder_inst_ptr_(NULL) {
   codec_id_ = codec_id;
   return;
 }
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_ilbc.h b/webrtc/modules/audio_coding/main/acm2/acm_ilbc.h
index 3cf2c73..870b7c9 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_ilbc.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_ilbc.h
@@ -23,7 +23,7 @@
 
 class ACMILBC : public ACMGenericCodec {
  public:
-  explicit ACMILBC(int16_t codec_id);
+  ACMILBC(int16_t codec_id, bool enable_red);
   ~ACMILBC();
 
   // for FEC
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_isac.cc b/webrtc/modules/audio_coding/main/acm2/acm_isac.cc
index 8a63410..ea6d0ba 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_isac.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_isac.cc
@@ -261,8 +261,9 @@
 
 #endif
 
-ACMISAC::ACMISAC(int16_t codec_id)
-    : codec_inst_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
+ACMISAC::ACMISAC(int16_t codec_id, bool enable_red)
+    : ACMGenericCodec(enable_red),
+      codec_inst_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
       is_enc_initialized_(false),
       isac_coding_mode_(CHANNEL_INDEPENDENT),
       enforce_frame_size_(false),
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_isac.h b/webrtc/modules/audio_coding/main/acm2/acm_isac.h
index b83d1d3..f614cfe 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_isac.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_isac.h
@@ -31,7 +31,7 @@
 
 class ACMISAC : public ACMGenericCodec, AudioDecoder {
  public:
-  explicit ACMISAC(int16_t codec_id);
+  ACMISAC(int16_t codec_id, bool enable_red);
   ~ACMISAC();
 
   int16_t InternalInitDecoder(WebRtcACMCodecParams* codec_params)
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_opus.cc b/webrtc/modules/audio_coding/main/acm2/acm_opus.cc
index 005e910..724c795 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_opus.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_opus.cc
@@ -63,11 +63,12 @@
 
 #else  //===================== Actual Implementation =======================
 
-ACMOpus::ACMOpus(int16_t codec_id)
-    : encoder_inst_ptr_(NULL),
-      sample_freq_(32000),  // Default sampling frequency.
-      bitrate_(20000),  // Default bit-rate.
-      channels_(1),  // Default mono.
+ACMOpus::ACMOpus(int16_t codec_id, bool enable_red)
+    : ACMGenericCodec(enable_red),
+      encoder_inst_ptr_(NULL),
+      sample_freq_(32000),   // Default sampling frequency.
+      bitrate_(20000),       // Default bit-rate.
+      channels_(1),          // Default mono.
       packet_loss_rate_(0),  // Initial packet loss rate.
       application_(kVoip) {  // Initial application mode.
   codec_id_ = codec_id;
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_opus.h b/webrtc/modules/audio_coding/main/acm2/acm_opus.h
index 3c7aea6..89f1e14 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_opus.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_opus.h
@@ -23,7 +23,7 @@
 
 class ACMOpus : public ACMGenericCodec {
  public:
-  explicit ACMOpus(int16_t codec_id);
+  ACMOpus(int16_t codec_id, bool enable_red);
   ~ACMOpus();
 
   ACMGenericCodec* CreateInstance(void);
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_opus_unittest.cc b/webrtc/modules/audio_coding/main/acm2/acm_opus_unittest.cc
index 421bbe5..2c4358f 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_opus_unittest.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_opus_unittest.cc
@@ -31,8 +31,7 @@
 
 class AcmOpusTest : public ACMOpus {
  public:
-  explicit AcmOpusTest(int16_t codec_id)
-      : ACMOpus(codec_id) {}
+  explicit AcmOpusTest(int16_t codec_id) : ACMOpus(codec_id, false) {}
   ~AcmOpusTest() {}
   int packet_loss_rate() { return packet_loss_rate_; }
   OpusApplicationMode application() { return application_; }
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_pcm16b.cc b/webrtc/modules/audio_coding/main/acm2/acm_pcm16b.cc
index 54c7860..04afb58 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_pcm16b.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_pcm16b.cc
@@ -44,7 +44,8 @@
 void ACMPCM16B::DestructEncoderSafe() { return; }
 
 #else  //===================== Actual Implementation =======================
-ACMPCM16B::ACMPCM16B(int16_t codec_id) {
+ACMPCM16B::ACMPCM16B(int16_t codec_id, bool enable_red)
+    : ACMGenericCodec(enable_red) {
   codec_id_ = codec_id;
   sampling_freq_hz_ = ACMCodecDB::CodecFreq(codec_id_);
 }
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_pcm16b.h b/webrtc/modules/audio_coding/main/acm2/acm_pcm16b.h
index 0811a17..176dcc9 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_pcm16b.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_pcm16b.h
@@ -19,7 +19,7 @@
 
 class ACMPCM16B : public ACMGenericCodec {
  public:
-  explicit ACMPCM16B(int16_t codec_id);
+  ACMPCM16B(int16_t codec_id, bool enable_red);
   ~ACMPCM16B();
 
   // For FEC.
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_pcma.cc b/webrtc/modules/audio_coding/main/acm2/acm_pcma.cc
index 41d4d08..008b1cf 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_pcma.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_pcma.cc
@@ -20,7 +20,10 @@
 
 namespace acm2 {
 
-ACMPCMA::ACMPCMA(int16_t codec_id) { codec_id_ = codec_id; }
+ACMPCMA::ACMPCMA(int16_t codec_id, bool enable_red)
+    : ACMGenericCodec(enable_red) {
+  codec_id_ = codec_id;
+}
 
 ACMPCMA::~ACMPCMA() { return; }
 
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_pcma.h b/webrtc/modules/audio_coding/main/acm2/acm_pcma.h
index d7d00b4..fa61ed5 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_pcma.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_pcma.h
@@ -19,7 +19,7 @@
 
 class ACMPCMA : public ACMGenericCodec {
  public:
-  explicit ACMPCMA(int16_t codec_id);
+  ACMPCMA(int16_t codec_id, bool enable_red);
   ~ACMPCMA();
 
   // For FEC.
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_pcmu.cc b/webrtc/modules/audio_coding/main/acm2/acm_pcmu.cc
index 4f16062..7ccc184 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_pcmu.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_pcmu.cc
@@ -20,7 +20,10 @@
 
 namespace acm2 {
 
-ACMPCMU::ACMPCMU(int16_t codec_id) { codec_id_ = codec_id; }
+ACMPCMU::ACMPCMU(int16_t codec_id, bool enable_red)
+    : ACMGenericCodec(enable_red) {
+  codec_id_ = codec_id;
+}
 
 ACMPCMU::~ACMPCMU() {}
 
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_pcmu.h b/webrtc/modules/audio_coding/main/acm2/acm_pcmu.h
index dccfffd..88be95b 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_pcmu.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_pcmu.h
@@ -19,7 +19,7 @@
 
 class ACMPCMU : public ACMGenericCodec {
  public:
-  explicit ACMPCMU(int16_t codec_id);
+  ACMPCMU(int16_t codec_id, bool enable_red);
   ~ACMPCMU();
 
   // For FEC.
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_red.cc b/webrtc/modules/audio_coding/main/acm2/acm_red.cc
index 05996e5..8025c7f 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_red.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_red.cc
@@ -17,7 +17,10 @@
 
 namespace acm2 {
 
-ACMRED::ACMRED(int16_t codec_id) { codec_id_ = codec_id; }
+ACMRED::ACMRED(int16_t codec_id, bool enable_red)
+    : ACMGenericCodec(enable_red) {
+  codec_id_ = codec_id;
+}
 
 ACMRED::~ACMRED() {}
 
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_red.h b/webrtc/modules/audio_coding/main/acm2/acm_red.h
index 73f904a..25cf053 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_red.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_red.h
@@ -19,7 +19,7 @@
 
 class ACMRED : public ACMGenericCodec {
  public:
-  explicit ACMRED(int16_t codec_id);
+  ACMRED(int16_t codec_id, bool enable_red);
   ~ACMRED();
 
   // For FEC.
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_speex.cc b/webrtc/modules/audio_coding/main/acm2/acm_speex.cc
index 85ead39..9c3f181 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_speex.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_speex.cc
@@ -24,8 +24,9 @@
 namespace acm2 {
 
 #ifndef WEBRTC_CODEC_SPEEX
-ACMSPEEX::ACMSPEEX(int16_t /* codec_id */)
-    : encoder_inst_ptr_(NULL),
+ACMSPEEX::ACMSPEEX(int16_t /* codec_id */, bool enable_red)
+    : ACMGenericCodec(enable_red),
+      encoder_inst_ptr_(NULL),
       compl_mode_(0),
       vbr_enabled_(false),
       encoding_rate_(-1),
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_speex.h b/webrtc/modules/audio_coding/main/acm2/acm_speex.h
index 931e3a9..c72bdc8 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_speex.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_speex.h
@@ -23,7 +23,7 @@
 
 class ACMSPEEX : public ACMGenericCodec {
  public:
-  explicit ACMSPEEX(int16_t codec_id);
+  ACMSPEEX(int16_t codec_id, bool enable_red);
   ~ACMSPEEX();
 
   // For FEC.