diff options
author | stefan@webrtc.org <stefan@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2013-02-01 14:33:42 +0000 |
---|---|---|
committer | stefan@webrtc.org <stefan@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2013-02-01 14:33:42 +0000 |
commit | 2a5dbce193b4ee594f0bb66c4f1a2bb24f31e621 (patch) | |
tree | 7243924ec4896e092c1b988a0f1c926bfee0f1d8 /video_engine/vie_remb.cc | |
parent | e515356466ba55bd87de4d4383825c13f086ed1b (diff) | |
download | webrtc-2a5dbce193b4ee594f0bb66c4f1a2bb24f31e621.tar.gz |
Break out RemoteBitrateEstimator from RtpRtcp module and make RemoteBitrateEstimator::Process trigger new REMB messages.
Also make sure RTT is computed independently of whether it's time to send RTCP messages or not.
BUG=1298
Review URL: https://webrtc-codereview.appspot.com/1060005
git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@3455 4adac7df-926f-26a2-2b94-8c16560cd09d
Diffstat (limited to 'video_engine/vie_remb.cc')
-rw-r--r-- | video_engine/vie_remb.cc | 60 |
1 files changed, 18 insertions, 42 deletions
diff --git a/video_engine/vie_remb.cc b/video_engine/vie_remb.cc index ea795ac1..8cc47326 100644 --- a/video_engine/vie_remb.cc +++ b/video_engine/vie_remb.cc @@ -28,19 +28,13 @@ const unsigned int kRembMinimumBitrateKbps = 50; // % threshold for if we should send a new REMB asap. const unsigned int kSendThresholdPercent = 97; -VieRemb::VieRemb(ProcessThread* process_thread) - : process_thread_(process_thread), - list_crit_(CriticalSectionWrapper::CreateCriticalSection()), +VieRemb::VieRemb() + : list_crit_(CriticalSectionWrapper::CreateCriticalSection()), last_remb_time_(TickTime::MillisecondTimestamp()), last_send_bitrate_(0), - bitrate_(0), - bitrate_update_time_ms_(-1) { - process_thread->RegisterModule(this); -} + bitrate_(0) {} -VieRemb::~VieRemb() { - process_thread_->DeRegisterModule(this); -} +VieRemb::~VieRemb() {} void VieRemb::AddReceiveChannel(RtpRtcp* rtp_rtcp) { assert(rtp_rtcp); @@ -115,7 +109,7 @@ void VieRemb::OnReceiveBitrateChanged(std::vector<unsigned int>* ssrcs, WEBRTC_TRACE(kTraceStream, kTraceVideo, -1, "VieRemb::UpdateBitrateEstimate(bitrate: %u)", bitrate); assert(ssrcs); - CriticalSectionScoped cs(list_crit_.get()); + list_crit_->Enter(); // If we already have an estimate, check if the new total estimate is below // kSendThresholdPercent of the previous estimate. if (last_send_bitrate_ > 0) { @@ -128,40 +122,23 @@ void VieRemb::OnReceiveBitrateChanged(std::vector<unsigned int>* ssrcs, } } bitrate_ = bitrate; + // TODO(holmer): Remove |ssrcs_| from this class as the REMB is produced + // immediately upon a call to this function. ssrcs_.resize(ssrcs->size()); std::copy(ssrcs->begin(), ssrcs->end(), ssrcs_.begin()); - bitrate_update_time_ms_ = TickTime::MillisecondTimestamp(); -} - -WebRtc_Word32 VieRemb::ChangeUniqueId(const WebRtc_Word32 id) { - return 0; -} - -WebRtc_Word32 VieRemb::TimeUntilNextProcess() { - return kRembSendIntervallMs - - (TickTime::MillisecondTimestamp() - last_remb_time_); -} -WebRtc_Word32 VieRemb::Process() { + // Calculate total receive bitrate estimate. int64_t now = TickTime::MillisecondTimestamp(); - if (now - last_remb_time_ < kRembSendIntervallMs) - return 0; + if (now - last_remb_time_ < kRembSendIntervallMs) { + list_crit_->Leave(); + return; + } last_remb_time_ = now; - // Calculate total receive bitrate estimate. - list_crit_->Enter(); - - // Reset the estimate if it has timed out. - if (TickTime::MillisecondTimestamp() - bitrate_update_time_ms_ > - kRembTimeOutThresholdMs) { - bitrate_ = 0; - bitrate_update_time_ms_ = -1; - } - if (bitrate_update_time_ms_ == -1 || ssrcs_.empty() || - receive_modules_.empty()) { + if (ssrcs_.empty() || receive_modules_.empty()) { list_crit_->Leave(); - return 0; + return; } // Send a REMB packet. @@ -179,18 +156,17 @@ WebRtc_Word32 VieRemb::Process() { } // Copy SSRCs to avoid race conditions. int ssrcs_length = ssrcs_.size(); - unsigned int* ssrcs = new unsigned int[ssrcs_length]; + unsigned int* ssrcs_copy = new unsigned int[ssrcs_length]; for (int i = 0; i < ssrcs_length; ++i) { - ssrcs[i] = ssrcs_[i]; + ssrcs_copy[i] = ssrcs_[i]; } list_crit_->Leave(); if (sender) { // TODO(holmer): Change RTP module API to take a vector pointer. - sender->SetREMBData(bitrate_, ssrcs_length, ssrcs); + sender->SetREMBData(bitrate_, ssrcs_length, ssrcs_copy); } - delete [] ssrcs; - return 0; + delete [] ssrcs_copy; } } // namespace webrtc |