Adding possibility to use encoding time when trigger underuse for frame based overuse detection.

BUG=
TEST=Added unittest.
R=asapersson@webrtc.org

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

git-svn-id: http://webrtc.googlecode.com/svn/trunk@4452 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/video_engine/overuse_frame_detector.h b/webrtc/video_engine/overuse_frame_detector.h
index e382c7d..7772266 100644
--- a/webrtc/video_engine/overuse_frame_detector.h
+++ b/webrtc/video_engine/overuse_frame_detector.h
@@ -12,6 +12,8 @@
 #define WEBRTC_VIDEO_ENGINE_OVERUSE_FRAME_DETECTOR_H_
 
 #include <list>
+#include <map>
+#include <utility>
 
 #include "webrtc/modules/interface/module.h"
 #include "webrtc/system_wrappers/interface/constructor_magic.h"
@@ -30,20 +32,39 @@
   explicit OveruseFrameDetector(Clock* clock);
   ~OveruseFrameDetector();
 
+  // Registers an observer receiving overuse and underuse callbacks. Set
+  // 'observer' to NULL to disable callbacks.
   void SetObserver(CpuOveruseObserver* observer);
 
-  // Called for each new captured frame.
-  void CapturedFrame();
+  // TODO(mflodman): Move to another API?
+  // Enables usage of encode time to trigger normal usage after an overuse,
+  // default false.
+  void set_underuse_encode_timing_enabled(bool enable);
+
+  // Called for each captured frame.
+  void FrameCaptured();
 
   // Called for every encoded frame.
-  void EncodedFrame();
+  void FrameEncoded(int64_t encode_time, size_t width, size_t height);
 
   // Implements Module.
   virtual int32_t TimeUntilNextProcess();
   virtual int32_t Process();
 
  private:
-  void CleanOldSamples();
+  // All private functions are assumed to be critical section protected.
+  // Clear samples older than the overuse history.
+  void RemoveOldSamples();
+  // Clears the entire history, including samples still affecting the
+  // calculations.
+  void RemoveAllSamples();
+  int64_t CalculateAverageEncodeTime() const;
+  // Returns true and resets calculations and history if a new resolution is
+  // discovered, false otherwise.
+  bool MaybeResetResolution(size_t width, size_t height);
+
+  bool IsOverusing();
+  bool IsUnderusing(int64_t time_now);
 
   // Protecting all members.
   scoped_ptr<CriticalSectionWrapper> crit_;
@@ -55,11 +76,21 @@
   int64_t last_process_time_;
   int64_t last_callback_time_;
 
-  // Capture time for frames.
+  // Sorted list of times captured frames were delivered, oldest frame first.
   std::list<int64_t> capture_times_;
+  // <Encode report time, time spent encoding the frame>.
+  typedef std::pair<int64_t, int64_t> EncodeTime;
+  // Sorted list with oldest frame first.
+  std::list<EncodeTime> encode_times_;
 
-  // Start encode time for a frame.
-  std::list<int64_t> encode_times_;
+  // True if encode time should be considered to trigger an underuse.
+  bool underuse_encode_timing_enabled_;
+  // Number of pixels in the currently encoded resolution.
+  int num_pixels_;
+  // Maximum resolution encoded.
+  int max_num_pixels_;
+  // <number of pixels, average encode time triggering an overuse>.
+  std::map<int, int64_t> encode_overuse_times_;
 
   DISALLOW_COPY_AND_ASSIGN(OveruseFrameDetector);
 };