From a78a94e838467260f80b08b83b1b5b92564d6c91 Mon Sep 17 00:00:00 2001 From: "perkj@webrtc.org" Date: Tue, 17 Mar 2015 12:45:15 +0000 Subject: [PATCH] Fix RateTracker to set an initial reference time when first updated. BUG=4442 R=mflodman@webrtc.org, pbos@webrtc.org Review URL: https://webrtc-codereview.appspot.com/43829004 Cr-Commit-Position: refs/heads/master@{#8751} git-svn-id: http://webrtc.googlecode.com/svn/trunk@8751 4adac7df-926f-26a2-2b94-8c16560cd09d --- talk/media/base/videoengine_unittest.h | 11 ----------- webrtc/base/ratetracker.cc | 13 +++++++------ webrtc/base/ratetracker_unittest.cc | 7 +++++++ 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/talk/media/base/videoengine_unittest.h b/talk/media/base/videoengine_unittest.h index 28c7cbba5..7b5dc856a 100644 --- a/talk/media/base/videoengine_unittest.h +++ b/talk/media/base/videoengine_unittest.h @@ -844,17 +844,6 @@ class VideoMediaChannelTest : public testing::Test, EXPECT_TRUE(WaitAndSendFrame(1000 / fps)); EXPECT_FRAME_WAIT(frame + i * fps, codec.width, codec.height, kTimeout); } - cricket::VideoMediaInfo info; - EXPECT_TRUE(channel_->GetStats(&info)); - // For webrtc, |framerate_sent| and |framerate_rcvd| depend on periodic - // callbacks (1 sec). - // Received |fraction_lost| and |packets_lost| are from sent RTCP packet. - // One sent packet needed (sent about once per second). - // |framerate_input|, |framerate_decoded| and |framerate_output| are using - // RateTracker. RateTracker needs to be called twice (with >1 second in - // b/w calls) before a framerate is calculated. - // Therefore insert frames (and call GetStats each sec) for a few seconds - // before testing stats. } rtc::scoped_ptr p(GetRtpPacket(0)); EXPECT_EQ(codec.id, GetPayloadType(p.get())); diff --git a/webrtc/base/ratetracker.cc b/webrtc/base/ratetracker.cc index 31ecd9bbb..e03bfe0f2 100644 --- a/webrtc/base/ratetracker.cc +++ b/webrtc/base/ratetracker.cc @@ -15,7 +15,7 @@ namespace rtc { RateTracker::RateTracker() : total_units_(0), units_second_(0), - last_units_second_time_(static_cast(-1)), + last_units_second_time_(~0u), last_units_second_calc_(0) { } @@ -29,7 +29,10 @@ size_t RateTracker::units_second() { // a new reference point that is an integer number of seconds since the // last one, and compute the units over that interval. uint32 current_time = Time(); - if (last_units_second_time_ != static_cast(-1)) { + if (last_units_second_time_ == ~0u) { + last_units_second_time_ = current_time; + last_units_second_calc_ = total_units_; + } else { int delta = rtc::TimeDiff(current_time, last_units_second_time_); if (delta >= 1000) { int fraction_time = delta % 1000; @@ -44,15 +47,13 @@ size_t RateTracker::units_second() { last_units_second_calc_ = total_units_ - fraction_units; } } - if (last_units_second_time_ == static_cast(-1)) { - last_units_second_time_ = current_time; - last_units_second_calc_ = total_units_; - } return units_second_; } void RateTracker::Update(size_t units) { + if (last_units_second_time_ == ~0u) + last_units_second_time_ = Time(); total_units_ += units; } diff --git a/webrtc/base/ratetracker_unittest.cc b/webrtc/base/ratetracker_unittest.cc index e9fee2b9f..1c20fd05a 100644 --- a/webrtc/base/ratetracker_unittest.cc +++ b/webrtc/base/ratetracker_unittest.cc @@ -71,4 +71,11 @@ TEST(RateTrackerTest, TestBasics) { EXPECT_EQ(9876U * 5, tracker.units_second()); } +TEST(RateTrackerTest, TestGetUnitSecondsAfterInitialValue) { + RateTrackerForTest tracker; + tracker.Update(1234); + tracker.AdvanceTime(1000); + EXPECT_EQ(1234u, tracker.units_second()); +} + } // namespace rtc