Added measure of encode time. Added encode time to the ViE CpuOveruseMeasure api.

R=mflodman@webrtc.org

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

git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@5178 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/video_engine/include/vie_base.h b/video_engine/include/vie_base.h
index 997ae74..1801e7b 100644
--- a/video_engine/include/vie_base.h
+++ b/video_engine/include/vie_base.h
@@ -122,8 +122,9 @@
 
   // Gets the last cpu overuse measure.
   // TODO(asapersson): Remove default implementation.
-  virtual int CpuOveruseMeasure(int channel,
-                                int* capture_jitter_ms) { return -1; }
+  virtual int CpuOveruseMeasures(int channel,
+                                 int* capture_jitter_ms,
+                                 int* avg_encode_time_ms) { return -1; }
 
   // Specifies the VoiceEngine and VideoEngine channel pair to use for
   // audio/video synchronization.
diff --git a/video_engine/overuse_frame_detector.cc b/video_engine/overuse_frame_detector.cc
index 262c767..c284f64 100644
--- a/video_engine/overuse_frame_detector.cc
+++ b/video_engine/overuse_frame_detector.cc
@@ -47,6 +47,8 @@
 // Expontential back-off factor, to prevent annoying up-down behaviour.
 const double kRampUpBackoffFactor = 2.0;
 
+// The initial average encode time (set to a fairly small value).
+const float kInitialAvgEncodeTimeMs = 5.0f;
 }  // namespace
 
 Statistics::Statistics() :
@@ -117,7 +119,7 @@
       in_quick_rampup_(false),
       current_rampup_delay_ms_(kStandardRampUpDelayMs),
       num_pixels_(0),
-      last_capture_jitter_ms_(-1) {}
+      avg_encode_time_ms_(kInitialAvgEncodeTimeMs) {}
 
 OveruseFrameDetector::~OveruseFrameDetector() {
 }
@@ -145,9 +147,21 @@
   last_capture_time_ = time;
 }
 
-int OveruseFrameDetector::last_capture_jitter_ms() {
+void OveruseFrameDetector::FrameEncoded(int encode_time_ms) {
   CriticalSectionScoped cs(crit_.get());
-  return last_capture_jitter_ms_;
+  const float kWeight = 0.1f;
+  avg_encode_time_ms_ = kWeight * encode_time_ms +
+                        (1.0f - kWeight) * avg_encode_time_ms_;
+}
+
+int OveruseFrameDetector::last_capture_jitter_ms() const {
+  CriticalSectionScoped cs(crit_.get());
+  return static_cast<int>(capture_deltas_.StdDev() + 0.5);
+}
+
+int OveruseFrameDetector::avg_encode_time_ms() const {
+  CriticalSectionScoped cs(crit_.get());
+  return static_cast<int>(avg_encode_time_ms_ + 0.5);
 }
 
 int32_t OveruseFrameDetector::TimeUntilNextProcess() {
@@ -214,7 +228,6 @@
       overuse_stddev_ms_,
       normaluse_stddev_ms_);
 
-  last_capture_jitter_ms_ = static_cast<int>(capture_deltas_.StdDev());
   return 0;
 }
 
diff --git a/video_engine/overuse_frame_detector.h b/video_engine/overuse_frame_detector.h
index 4c2d129..356e27f 100644
--- a/video_engine/overuse_frame_detector.h
+++ b/video_engine/overuse_frame_detector.h
@@ -71,7 +71,13 @@
   // Called for each captured frame.
   void FrameCaptured(int width, int height);
 
-  int last_capture_jitter_ms();
+  void FrameEncoded(int encode_time_ms);
+
+  int last_capture_jitter_ms() const;
+
+  // Running average of reported encode time (FrameEncoded()).
+  // Only used for stats.
+  int avg_encode_time_ms() const;
 
   // Implements Module.
   virtual int32_t TimeUntilNextProcess() OVERRIDE;
@@ -107,7 +113,7 @@
   // Number of pixels of last captured frame.
   int num_pixels_;
 
-  int last_capture_jitter_ms_;
+  float avg_encode_time_ms_;
 
   DISALLOW_COPY_AND_ASSIGN(OveruseFrameDetector);
 };
diff --git a/video_engine/overuse_frame_detector_unittest.cc b/video_engine/overuse_frame_detector_unittest.cc
index 8b25294..131bbfd 100644
--- a/video_engine/overuse_frame_detector_unittest.cc
+++ b/video_engine/overuse_frame_detector_unittest.cc
@@ -96,9 +96,17 @@
 }
 
 TEST_F(OveruseFrameDetectorTest, LastCaptureJitter) {
-  EXPECT_EQ(-1, overuse_detector_->last_capture_jitter_ms());
+  EXPECT_EQ(0, overuse_detector_->last_capture_jitter_ms());
   TriggerOveruse();
   EXPECT_GT(overuse_detector_->last_capture_jitter_ms(), 0);
 }
 
+TEST_F(OveruseFrameDetectorTest, EncodedFrame) {
+  const int kInitialAvgEncodeTimeInMs = 5;
+  EXPECT_EQ(kInitialAvgEncodeTimeInMs, overuse_detector_->avg_encode_time_ms());
+  for (int i = 0; i < 30; i++)
+    overuse_detector_->FrameEncoded(2);
+  EXPECT_EQ(2, overuse_detector_->avg_encode_time_ms());
+}
+
 }  // namespace webrtc
diff --git a/video_engine/vie_base_impl.cc b/video_engine/vie_base_impl.cc
index 873327a..8d6aeb2 100644
--- a/video_engine/vie_base_impl.cc
+++ b/video_engine/vie_base_impl.cc
@@ -117,7 +117,9 @@
   return 0;
 }
 
-int ViEBaseImpl::CpuOveruseMeasure(int video_channel, int* capture_jitter_ms) {
+int ViEBaseImpl::CpuOveruseMeasures(int video_channel,
+                                    int* capture_jitter_ms,
+                                    int* avg_encode_time_ms) {
   ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
   ViEChannel* vie_channel = cs.Channel(video_channel);
   if (!vie_channel) {
@@ -138,7 +140,7 @@
   if (provider) {
     ViECapturer* capturer = is.Capture(provider->Id());
     if (capturer) {
-      *capture_jitter_ms = capturer->CpuOveruseMeasure();
+      capturer->CpuOveruseMeasures(capture_jitter_ms, avg_encode_time_ms);
       return 0;
     }
   }
diff --git a/video_engine/vie_base_impl.h b/video_engine/vie_base_impl.h
index b44754a..1411caf 100644
--- a/video_engine/vie_base_impl.h
+++ b/video_engine/vie_base_impl.h
@@ -33,7 +33,9 @@
   virtual int SetVoiceEngine(VoiceEngine* voice_engine);
   virtual int RegisterCpuOveruseObserver(int channel,
                                          CpuOveruseObserver* observer);
-  virtual int CpuOveruseMeasure(int channel, int* capture_jitter_ms);
+  virtual int CpuOveruseMeasures(int channel,
+                                 int* capture_jitter_ms,
+                                 int* avg_encode_time_ms);
   virtual int CreateChannel(int& video_channel);  // NOLINT
   virtual int CreateChannel(int& video_channel,  // NOLINT
                             int original_channel);
diff --git a/video_engine/vie_capturer.cc b/video_engine/vie_capturer.cc
index b8de7cd..c5844e2 100644
--- a/video_engine/vie_capturer.cc
+++ b/video_engine/vie_capturer.cc
@@ -266,8 +266,10 @@
   overuse_detector_->SetObserver(observer);
 }
 
-int ViECapturer::CpuOveruseMeasure() {
-  return overuse_detector_->last_capture_jitter_ms();
+void ViECapturer::CpuOveruseMeasures(int* capture_jitter_ms,
+                                     int* avg_encode_time_ms) const {
+  *capture_jitter_ms = overuse_detector_->last_capture_jitter_ms();
+  *avg_encode_time_ms = overuse_detector_->avg_encode_time_ms();
 }
 
 int32_t ViECapturer::SetCaptureDelay(int32_t delay_ms) {
@@ -530,8 +532,10 @@
 
 bool ViECapturer::ViECaptureProcess() {
   if (capture_event_.Wait(kThreadWaitTimeMs) == kEventSignaled) {
+    int64_t encode_start_time = -1;
     deliver_cs_->Enter();
     if (SwapCapturedAndDeliverFrameIfAvailable()) {
+      encode_start_time = Clock::GetRealTimeClock()->TimeInMilliseconds();
       DeliverI420Frame(&deliver_frame_);
     }
     deliver_cs_->Leave();
@@ -542,6 +546,11 @@
         reported_brightness_level_ = current_brightness_level_;
       }
     }
+    // Update the overuse detector with the duration.
+    if (encode_start_time != -1) {
+      overuse_detector_->FrameEncoded(
+          Clock::GetRealTimeClock()->TimeInMilliseconds() - encode_start_time);
+    }
   }
   // We're done!
   return true;
diff --git a/video_engine/vie_capturer.h b/video_engine/vie_capturer.h
index 1b12c45..7900e55 100644
--- a/video_engine/vie_capturer.h
+++ b/video_engine/vie_capturer.h
@@ -104,7 +104,8 @@
 
   void RegisterCpuOveruseObserver(CpuOveruseObserver* observer);
 
-  int CpuOveruseMeasure();
+  void CpuOveruseMeasures(int* capture_jitter_ms,
+                          int* avg_encode_time_ms) const;
 
  protected:
   ViECapturer(int capture_id,