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);
};