Add a TickTimer object to NetEqImpl

The TickTimer is incremented on each call to GetAudioInternal(). Other
than that, the new object is not used yet.

Also adding a unit test in NetEqImplTest to verify that the tick timer
is incremented in the call to NetEq::GetAudio.

BUG=webrtc:5608

Review URL: https://codereview.webrtc.org/1903153005

Cr-Commit-Position: refs/heads/master@{#12493}
diff --git a/webrtc/modules/audio_coding/neteq/neteq.cc b/webrtc/modules/audio_coding/neteq/neteq.cc
index c31dbdc..bc6319d 100644
--- a/webrtc/modules/audio_coding/neteq/neteq.cc
+++ b/webrtc/modules/audio_coding/neteq/neteq.cc
@@ -24,6 +24,7 @@
 #include "webrtc/modules/audio_coding/neteq/packet_buffer.h"
 #include "webrtc/modules/audio_coding/neteq/payload_splitter.h"
 #include "webrtc/modules/audio_coding/neteq/preemptive_expand.h"
+#include "webrtc/modules/audio_coding/neteq/tick_timer.h"
 #include "webrtc/modules/audio_coding/neteq/timestamp_scaler.h"
 
 namespace webrtc {
@@ -44,6 +45,7 @@
 // Creates all classes needed and inject them into a new NetEqImpl object.
 // Return the new object.
 NetEq* NetEq::Create(const NetEq::Config& config) {
+  std::unique_ptr<TickTimer> tick_timer(new TickTimer);
   BufferLevelFilter* buffer_level_filter = new BufferLevelFilter;
   DecoderDatabase* decoder_database = new DecoderDatabase;
   DelayPeakDetector* delay_peak_detector = new DelayPeakDetector;
@@ -59,19 +61,11 @@
   ExpandFactory* expand_factory = new ExpandFactory;
   PreemptiveExpandFactory* preemptive_expand_factory =
       new PreemptiveExpandFactory;
-  return new NetEqImpl(config,
-                       buffer_level_filter,
-                       decoder_database,
-                       delay_manager,
-                       delay_peak_detector,
-                       dtmf_buffer,
-                       dtmf_tone_generator,
-                       packet_buffer,
-                       payload_splitter,
-                       timestamp_scaler,
-                       accelerate_factory,
-                       expand_factory,
-                       preemptive_expand_factory);
+  return new NetEqImpl(config, std::move(tick_timer), buffer_level_filter,
+                       decoder_database, delay_manager, delay_peak_detector,
+                       dtmf_buffer, dtmf_tone_generator, packet_buffer,
+                       payload_splitter, timestamp_scaler, accelerate_factory,
+                       expand_factory, preemptive_expand_factory);
 }
 
 }  // namespace webrtc
diff --git a/webrtc/modules/audio_coding/neteq/neteq_impl.cc b/webrtc/modules/audio_coding/neteq/neteq_impl.cc
index b6ec655..ef470e5 100644
--- a/webrtc/modules/audio_coding/neteq/neteq_impl.cc
+++ b/webrtc/modules/audio_coding/neteq/neteq_impl.cc
@@ -43,6 +43,7 @@
 #include "webrtc/modules/audio_coding/neteq/post_decode_vad.h"
 #include "webrtc/modules/audio_coding/neteq/preemptive_expand.h"
 #include "webrtc/modules/audio_coding/neteq/sync_buffer.h"
+#include "webrtc/modules/audio_coding/neteq/tick_timer.h"
 #include "webrtc/modules/audio_coding/neteq/timestamp_scaler.h"
 #include "webrtc/modules/include/module_common_types.h"
 
@@ -54,6 +55,7 @@
 namespace webrtc {
 
 NetEqImpl::NetEqImpl(const NetEq::Config& config,
+                     std::unique_ptr<TickTimer> tick_timer,
                      BufferLevelFilter* buffer_level_filter,
                      DecoderDatabase* decoder_database,
                      DelayManager* delay_manager,
@@ -67,7 +69,8 @@
                      ExpandFactory* expand_factory,
                      PreemptiveExpandFactory* preemptive_expand_factory,
                      bool create_components)
-    : buffer_level_filter_(buffer_level_filter),
+    : tick_timer_(std::move(tick_timer)),
+      buffer_level_filter_(buffer_level_filter),
       decoder_database_(decoder_database),
       delay_manager_(delay_manager),
       delay_peak_detector_(delay_peak_detector),
@@ -795,6 +798,7 @@
   DtmfEvent dtmf_event;
   Operations operation;
   bool play_dtmf;
+  tick_timer_->Increment();
   int return_value = GetDecision(&operation, &packet_list, &dtmf_event,
                                  &play_dtmf);
   if (return_value != 0) {
diff --git a/webrtc/modules/audio_coding/neteq/neteq_impl.h b/webrtc/modules/audio_coding/neteq/neteq_impl.h
index 75055a7..9d4a9ff 100644
--- a/webrtc/modules/audio_coding/neteq/neteq_impl.h
+++ b/webrtc/modules/audio_coding/neteq/neteq_impl.h
@@ -24,6 +24,7 @@
 #include "webrtc/modules/audio_coding/neteq/random_vector.h"
 #include "webrtc/modules/audio_coding/neteq/rtcp.h"
 #include "webrtc/modules/audio_coding/neteq/statistics_calculator.h"
+#include "webrtc/modules/audio_coding/neteq/tick_timer.h"
 #include "webrtc/typedefs.h"
 
 namespace webrtc {
@@ -68,6 +69,7 @@
   // Creates a new NetEqImpl object. The object will assume ownership of all
   // injected dependencies, and will delete them when done.
   NetEqImpl(const NetEq::Config& config,
+            std::unique_ptr<TickTimer> tick_timer,
             BufferLevelFilter* buffer_level_filter,
             DecoderDatabase* decoder_database,
             DelayManager* delay_manager,
@@ -328,6 +330,7 @@
   virtual void CreateDecisionLogic() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
 
   rtc::CriticalSection crit_sect_;
+  const std::unique_ptr<TickTimer> tick_timer_ GUARDED_BY(crit_sect_);
   const std::unique_ptr<BufferLevelFilter> buffer_level_filter_
       GUARDED_BY(crit_sect_);
   const std::unique_ptr<DecoderDatabase> decoder_database_
diff --git a/webrtc/modules/audio_coding/neteq/neteq_impl_unittest.cc b/webrtc/modules/audio_coding/neteq/neteq_impl_unittest.cc
index e9291d1..4c6f0eb 100644
--- a/webrtc/modules/audio_coding/neteq/neteq_impl_unittest.cc
+++ b/webrtc/modules/audio_coding/neteq/neteq_impl_unittest.cc
@@ -57,6 +57,7 @@
   NetEqImplTest()
       : neteq_(NULL),
         config_(),
+        tick_timer_(new TickTimer),
         mock_buffer_level_filter_(NULL),
         buffer_level_filter_(NULL),
         use_mock_buffer_level_filter_(true),
@@ -146,19 +147,12 @@
     PreemptiveExpandFactory* preemptive_expand_factory =
         new PreemptiveExpandFactory;
 
-    neteq_ = new NetEqImpl(config_,
-                           buffer_level_filter_,
-                           decoder_database_,
-                           delay_manager_,
-                           delay_peak_detector_,
-                           dtmf_buffer_,
-                           dtmf_tone_generator_,
-                           packet_buffer_,
-                           payload_splitter_,
-                           timestamp_scaler_,
-                           accelerate_factory,
-                           expand_factory,
-                           preemptive_expand_factory);
+    neteq_ = new NetEqImpl(
+        config_, std::unique_ptr<TickTimer>(tick_timer_), buffer_level_filter_,
+        decoder_database_, delay_manager_, delay_peak_detector_, dtmf_buffer_,
+        dtmf_tone_generator_, packet_buffer_, payload_splitter_,
+        timestamp_scaler_, accelerate_factory, expand_factory,
+        preemptive_expand_factory);
     ASSERT_TRUE(neteq_ != NULL);
   }
 
@@ -201,6 +195,7 @@
 
   NetEqImpl* neteq_;
   NetEq::Config config_;
+  TickTimer* tick_timer_;
   MockBufferLevelFilter* mock_buffer_level_filter_;
   BufferLevelFilter* buffer_level_filter_;
   bool use_mock_buffer_level_filter_;
@@ -1198,4 +1193,14 @@
   EXPECT_EQ(48000, neteq_->last_output_sample_rate_hz());
 }
 
+TEST_F(NetEqImplTest, TickTimerIncrement) {
+  UseNoMocks();
+  CreateInstance();
+  ASSERT_TRUE(tick_timer_);
+  EXPECT_EQ(0u, tick_timer_->ticks());
+  AudioFrame output;
+  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output));
+  EXPECT_EQ(1u, tick_timer_->ticks());
+}
+
 }// namespace webrtc