Add new members to AudioEncoderOpus::Config

Adding fec_enabled and max_playback_rate_hz.

BUG=3926
COAUTHOR:kwiberg@webrtc.org

R=minyue@webrtc.org, tina.legrand@webrtc.org
TBR=kwiberg@webrtc.org

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

Cr-Commit-Position: refs/heads/master@{#8207}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8207 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
index d912fd7..e37e8f6 100644
--- a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
+++ b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
@@ -23,7 +23,6 @@
 // We always encode at 48 kHz.
 const int kSampleRateHz = 48000;
 
-
 int16_t ClampInt16(size_t x) {
   return static_cast<int16_t>(
       std::min(x, static_cast<size_t>(std::numeric_limits<int16_t>::max())));
@@ -41,13 +40,15 @@
       num_channels(1),
       payload_type(120),
       application(kVoip),
-      bitrate_bps(64000) {
+      bitrate_bps(64000),
+      fec_enabled(false),
+      max_playback_rate_hz(48000) {
 }
 
 bool AudioEncoderOpus::Config::IsOk() const {
   if (frame_size_ms <= 0 || frame_size_ms % 10 != 0)
     return false;
-  if (num_channels <= 0)
+  if (num_channels != 1 && num_channels != 2)
     return false;
   if (bitrate_bps < kMinBitrateBps || bitrate_bps > kMaxBitrateBps)
     return false;
@@ -67,6 +68,13 @@
   input_buffer_.reserve(num_10ms_frames_per_packet_ * samples_per_10ms_frame_);
   CHECK_EQ(0, WebRtcOpus_EncoderCreate(&inst_, num_channels_, application_));
   SetTargetBitrate(config.bitrate_bps);
+  if (config.fec_enabled) {
+    CHECK_EQ(0, WebRtcOpus_EnableFec(inst_));
+  } else {
+    CHECK_EQ(0, WebRtcOpus_DisableFec(inst_));
+  }
+  CHECK_EQ(0,
+           WebRtcOpus_SetMaxPlaybackRate(inst_, config.max_playback_rate_hz));
 }
 
 AudioEncoderOpus::~AudioEncoderOpus() {
diff --git a/webrtc/modules/audio_coding/codecs/opus/interface/audio_encoder_opus.h b/webrtc/modules/audio_coding/codecs/opus/interface/audio_encoder_opus.h
index c39af12..477ee8f 100644
--- a/webrtc/modules/audio_coding/codecs/opus/interface/audio_encoder_opus.h
+++ b/webrtc/modules/audio_coding/codecs/opus/interface/audio_encoder_opus.h
@@ -18,7 +18,10 @@
 
 namespace webrtc {
 
-class AudioEncoderOpus : public AudioEncoder {
+// NOTE: This class has neither ThreadChecker, nor locks. The owner of an
+// AudioEncoderOpus object must ensure that it is not accessed concurrently.
+
+class AudioEncoderOpus final : public AudioEncoder {
  public:
   enum ApplicationMode {
     kVoip = 0,
@@ -33,6 +36,8 @@
     int payload_type;
     ApplicationMode application;
     int bitrate_bps;
+    bool fec_enabled;
+    int max_playback_rate_hz;
   };
 
   explicit AudioEncoderOpus(const Config& config);