Adding a config struct to NetEq

With this change, the parameters sent to the NetEq::Create method are
collected in one NetEq::Config struct. The benefit is that it is easier
to set, change and override default values, and easier to expand with
more parameters in the future.

BUG=3083
R=turaj@webrtc.org

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

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5902 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_receiver.cc b/webrtc/modules/audio_coding/main/acm2/acm_receiver.cc
index 7c124c7..1205568 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_receiver.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_receiver.cc
@@ -35,7 +35,6 @@
 
 namespace {
 
-const int kNeteqInitSampleRateHz = 16000;
 const int kNackThresholdPackets = 2;
 
 // |vad_activity_| field of |audio_frame| is set to |previous_audio_activity_|
@@ -119,13 +118,14 @@
 
 AcmReceiver::AcmReceiver()
     : id_(0),
-      neteq_(NetEq::Create(kNeteqInitSampleRateHz)),
+      neteq_config_(),
+      neteq_(NetEq::Create(neteq_config_)),
       last_audio_decoder_(-1),  // Invalid value.
       decode_lock_(RWLockWrapper::CreateRWLock()),
       neteq_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
       vad_enabled_(true),
       previous_audio_activity_(AudioFrame::kVadPassive),
-      current_sample_rate_hz_(kNeteqInitSampleRateHz),
+      current_sample_rate_hz_(neteq_config_.sample_rate_hz),
       nack_(),
       nack_enabled_(false),
       av_sync_(false),
@@ -774,7 +774,7 @@
     current_sample_rate_hz_ = ACMCodecDB::database_[last_audio_decoder_].plfreq;
     frame->num_channels_ = decoders_[last_audio_decoder_].channels;
   } else {
-    current_sample_rate_hz_ = kNeteqInitSampleRateHz;
+    current_sample_rate_hz_ = neteq_config_.sample_rate_hz;
     frame->num_channels_ = 1;
   }
 
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_receiver.h b/webrtc/modules/audio_coding/main/acm2/acm_receiver.h
index 81eb520..33c55f7 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_receiver.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_receiver.h
@@ -340,6 +340,7 @@
   void InsertStreamOfSyncPackets(InitialDelayManager::SyncStream* sync_stream);
 
   int id_;
+  NetEq::Config neteq_config_;
   NetEq* neteq_;
   Decoder decoders_[ACMCodecDB::kMaxNumCodecs];
   int last_audio_decoder_;
diff --git a/webrtc/modules/audio_coding/neteq4/interface/neteq.h b/webrtc/modules/audio_coding/neteq4/interface/neteq.h
index c0f7fd6..0f6f406 100644
--- a/webrtc/modules/audio_coding/neteq4/interface/neteq.h
+++ b/webrtc/modules/audio_coding/neteq4/interface/neteq.h
@@ -67,6 +67,15 @@
 // This is the interface class for NetEq.
 class NetEq {
  public:
+  struct Config {
+    Config()
+        : sample_rate_hz(16000),
+          enable_audio_classifier(false) {}
+
+    int sample_rate_hz;  // Initial vale. Will change with input data.
+    bool enable_audio_classifier;
+  };
+
   enum ReturnCodes {
     kOK = 0,
     kFail = -1,
@@ -105,11 +114,10 @@
   static const int kMaxNumPacketsInBuffer = 50;  // TODO(hlundin): Remove.
   static const int kMaxBytesInBuffer = 113280;  // TODO(hlundin): Remove.
 
-  // Creates a new NetEq object, starting at the sample rate |sample_rate_hz|.
-  // (Note that it will still change the sample rate depending on what payloads
-  // are being inserted; |sample_rate_hz| is just for startup configuration.)
-  static NetEq* Create(int sample_rate_hz,
-                       bool enable_audio_classifier = false);
+  // Creates a new NetEq object, with parameters set in |config|. The |config|
+  // object will only have to be valid for the duration of the call to this
+  // method.
+  static NetEq* Create(const NetEq::Config& config);
 
   virtual ~NetEq() {}
 
diff --git a/webrtc/modules/audio_coding/neteq4/neteq.cc b/webrtc/modules/audio_coding/neteq4/neteq.cc
index 9f36a96..bfcd86a 100644
--- a/webrtc/modules/audio_coding/neteq4/neteq.cc
+++ b/webrtc/modules/audio_coding/neteq4/neteq.cc
@@ -28,13 +28,13 @@
 
 // Creates all classes needed and inject them into a new NetEqImpl object.
 // Return the new object.
-NetEq* NetEq::Create(int sample_rate_hz, bool enable_audio_classifier) {
+NetEq* NetEq::Create(const NetEq::Config& config) {
   BufferLevelFilter* buffer_level_filter = new BufferLevelFilter;
   DecoderDatabase* decoder_database = new DecoderDatabase;
   DelayPeakDetector* delay_peak_detector = new DelayPeakDetector;
   DelayManager* delay_manager = new DelayManager(kMaxNumPacketsInBuffer,
                                                  delay_peak_detector);
-  DtmfBuffer* dtmf_buffer = new DtmfBuffer(sample_rate_hz);
+  DtmfBuffer* dtmf_buffer = new DtmfBuffer(config.sample_rate_hz);
   DtmfToneGenerator* dtmf_tone_generator = new DtmfToneGenerator;
   PacketBuffer* packet_buffer = new PacketBuffer(kMaxNumPacketsInBuffer,
                                                  kMaxBytesInBuffer);
@@ -44,7 +44,7 @@
   ExpandFactory* expand_factory = new ExpandFactory;
   PreemptiveExpandFactory* preemptive_expand_factory =
       new PreemptiveExpandFactory;
-  return new NetEqImpl(sample_rate_hz,
+  return new NetEqImpl(config.sample_rate_hz,
                        buffer_level_filter,
                        decoder_database,
                        delay_manager,
diff --git a/webrtc/modules/audio_coding/neteq4/neteq_external_decoder_unittest.cc b/webrtc/modules/audio_coding/neteq4/neteq_external_decoder_unittest.cc
index fec25e9..0b6706b 100644
--- a/webrtc/modules/audio_coding/neteq4/neteq_external_decoder_unittest.cc
+++ b/webrtc/modules/audio_coding/neteq4/neteq_external_decoder_unittest.cc
@@ -45,13 +45,15 @@
         frame_size_ms_(10),
         frame_size_samples_(frame_size_ms_ * samples_per_ms_),
         output_size_samples_(frame_size_ms_ * samples_per_ms_),
-        neteq_external_(NetEq::Create(sample_rate_hz_)),
-        neteq_(NetEq::Create(sample_rate_hz_)),
         external_decoder_(new MockExternalPcm16B(kDecoderPCM16Bswb32kHz)),
         rtp_generator_(samples_per_ms_),
         payload_size_bytes_(0),
         last_send_time_(0),
         last_arrival_time_(0) {
+    NetEq::Config config;
+    config.sample_rate_hz = sample_rate_hz_;
+    neteq_external_ = NetEq::Create(config);
+    neteq_ = NetEq::Create(config);
     input_ = new int16_t[frame_size_samples_];
     encoded_ = new uint8_t[2 * frame_size_samples_];
   }
diff --git a/webrtc/modules/audio_coding/neteq4/neteq_impl_unittest.cc b/webrtc/modules/audio_coding/neteq4/neteq_impl_unittest.cc
index 58dff48..27e8b52 100644
--- a/webrtc/modules/audio_coding/neteq4/neteq_impl_unittest.cc
+++ b/webrtc/modules/audio_coding/neteq4/neteq_impl_unittest.cc
@@ -48,9 +48,9 @@
 
 class NetEqImplTest : public ::testing::Test {
  protected:
-  static const int kInitSampleRateHz = 8000;
   NetEqImplTest()
       : neteq_(NULL),
+        config_(),
         mock_buffer_level_filter_(NULL),
         buffer_level_filter_(NULL),
         use_mock_buffer_level_filter_(true),
@@ -75,7 +75,9 @@
         mock_payload_splitter_(NULL),
         payload_splitter_(NULL),
         use_mock_payload_splitter_(true),
-        timestamp_scaler_(NULL) {}
+        timestamp_scaler_(NULL) {
+    config_.sample_rate_hz = 8000;
+  }
 
   void CreateInstance() {
     if (use_mock_buffer_level_filter_) {
@@ -109,10 +111,10 @@
           new DelayManager(NetEq::kMaxNumPacketsInBuffer, delay_peak_detector_);
     }
     if (use_mock_dtmf_buffer_) {
-      mock_dtmf_buffer_ = new MockDtmfBuffer(kInitSampleRateHz);
+      mock_dtmf_buffer_ = new MockDtmfBuffer(config_.sample_rate_hz);
       dtmf_buffer_ = mock_dtmf_buffer_;
     } else {
-      dtmf_buffer_ = new DtmfBuffer(kInitSampleRateHz);
+      dtmf_buffer_ = new DtmfBuffer(config_.sample_rate_hz);
     }
     if (use_mock_dtmf_tone_generator_) {
       mock_dtmf_tone_generator_ = new MockDtmfToneGenerator;
@@ -140,7 +142,7 @@
     PreemptiveExpandFactory* preemptive_expand_factory =
         new PreemptiveExpandFactory;
 
-    neteq_ = new NetEqImpl(kInitSampleRateHz,
+    neteq_ = new NetEqImpl(config_.sample_rate_hz,
                            buffer_level_filter_,
                            decoder_database_,
                            delay_manager_,
@@ -194,6 +196,7 @@
   }
 
   NetEqImpl* neteq_;
+  NetEq::Config config_;
   MockBufferLevelFilter* mock_buffer_level_filter_;
   BufferLevelFilter* buffer_level_filter_;
   bool use_mock_buffer_level_filter_;
@@ -225,7 +228,8 @@
 // This tests the interface class NetEq.
 // TODO(hlundin): Move to separate file?
 TEST(NetEq, CreateAndDestroy) {
-  NetEq* neteq = NetEq::Create(8000);
+  NetEq::Config config;
+  NetEq* neteq = NetEq::Create(config);
   delete neteq;
 }
 
diff --git a/webrtc/modules/audio_coding/neteq4/neteq_stereo_unittest.cc b/webrtc/modules/audio_coding/neteq4/neteq_stereo_unittest.cc
index df212db..e1d6441 100644
--- a/webrtc/modules/audio_coding/neteq4/neteq_stereo_unittest.cc
+++ b/webrtc/modules/audio_coding/neteq4/neteq_stereo_unittest.cc
@@ -54,14 +54,16 @@
         frame_size_ms_(GetParam().frame_size),
         frame_size_samples_(frame_size_ms_ * samples_per_ms_),
         output_size_samples_(10 * samples_per_ms_),
-        neteq_mono_(NetEq::Create(sample_rate_hz_)),
-        neteq_(NetEq::Create(sample_rate_hz_)),
         rtp_generator_mono_(samples_per_ms_),
         rtp_generator_(samples_per_ms_),
         payload_size_bytes_(0),
         multi_payload_size_bytes_(0),
         last_send_time_(0),
         last_arrival_time_(0) {
+    NetEq::Config config;
+    config.sample_rate_hz = sample_rate_hz_;
+    neteq_mono_ = NetEq::Create(config);
+    neteq_ = NetEq::Create(config);
     input_ = new int16_t[frame_size_samples_];
     encoded_ = new uint8_t[2 * frame_size_samples_];
     input_multi_channel_ = new int16_t[frame_size_samples_ * num_channels_];
diff --git a/webrtc/modules/audio_coding/neteq4/neteq_unittest.cc b/webrtc/modules/audio_coding/neteq4/neteq_unittest.cc
index 1e8c128..90dc717 100644
--- a/webrtc/modules/audio_coding/neteq4/neteq_unittest.cc
+++ b/webrtc/modules/audio_coding/neteq4/neteq_unittest.cc
@@ -254,7 +254,9 @@
 }
 
 void NetEqDecodingTest::SetUp() {
-  neteq_ = NetEq::Create(kInitSampleRateHz);
+  NetEq::Config config;
+  config.sample_rate_hz = kInitSampleRateHz;
+  neteq_ = NetEq::Create(config);
   NetEqNetworkStatistics stat;
   ASSERT_EQ(0, neteq_->NetworkStatistics(&stat));
   algorithmic_delay_ms_ = stat.current_buffer_size_ms;
diff --git a/webrtc/modules/audio_coding/neteq4/tools/neteq_performance_test.cc b/webrtc/modules/audio_coding/neteq4/tools/neteq_performance_test.cc
index 203ea04..2eb7462 100644
--- a/webrtc/modules/audio_coding/neteq4/tools/neteq_performance_test.cc
+++ b/webrtc/modules/audio_coding/neteq4/tools/neteq_performance_test.cc
@@ -36,7 +36,9 @@
   const int kPayloadType = 95;
 
   // Initialize NetEq instance.
-  NetEq* neteq = NetEq::Create(kSampRateHz);
+  NetEq::Config config;
+  config.sample_rate_hz = kSampRateHz;
+  NetEq* neteq = NetEq::Create(config);
   // Register decoder in |neteq|.
   if (neteq->RegisterPayloadType(kDecoderType, kPayloadType) != 0)
     return -1;
diff --git a/webrtc/modules/audio_coding/neteq4/tools/neteq_quality_test.cc b/webrtc/modules/audio_coding/neteq4/tools/neteq_quality_test.cc
index c56e5b9..8daca18 100644
--- a/webrtc/modules/audio_coding/neteq4/tools/neteq_quality_test.cc
+++ b/webrtc/modules/audio_coding/neteq4/tools/neteq_quality_test.cc
@@ -42,8 +42,10 @@
       in_file_(new InputAudioFile(in_filename_)),
       out_file_(NULL),
       rtp_generator_(new RtpGenerator(in_sampling_khz_, 0, 0,
-                                      decodable_time_ms_)),
-      neteq_(NetEq::Create(out_sampling_khz_ * 1000)) {
+                                      decodable_time_ms_)) {
+  NetEq::Config config;
+  config.sample_rate_hz = out_sampling_khz_ * 1000;
+  neteq_.reset(NetEq::Create(config));
   max_payload_bytes_ = in_size_samples_ * channels_ * sizeof(int16_t);
   in_data_.reset(new int16_t[in_size_samples_ * channels_]);
   payload_.reset(new uint8_t[max_payload_bytes_]);
diff --git a/webrtc/modules/audio_coding/neteq4/tools/neteq_rtpplay.cc b/webrtc/modules/audio_coding/neteq4/tools/neteq_rtpplay.cc
index d2c4a5c..1308bf5 100644
--- a/webrtc/modules/audio_coding/neteq4/tools/neteq_rtpplay.cc
+++ b/webrtc/modules/audio_coding/neteq4/tools/neteq_rtpplay.cc
@@ -176,7 +176,9 @@
 
   // Initialize NetEq instance.
   int sample_rate_hz = 16000;
-  NetEq* neteq = NetEq::Create(sample_rate_hz);
+  NetEq::Config config;
+  config.sample_rate_hz = sample_rate_hz;
+  NetEq* neteq = NetEq::Create(config);
   RegisterPayloadTypes(neteq);
 
   // Read first packet.