| /* |
| * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #include "webrtc/modules/remote_bitrate_estimator/bitrate_estimator.h" |
| |
| namespace webrtc { |
| |
| const float kBitrateAverageWindowMs = 500.0f; |
| |
| BitRateStats::BitRateStats() |
| : data_samples_(), |
| accumulated_bytes_(0) { |
| } |
| |
| BitRateStats::~BitRateStats() { |
| Init(); |
| } |
| |
| void BitRateStats::Init() { |
| accumulated_bytes_ = 0; |
| while (data_samples_.size() > 0) { |
| delete data_samples_.front(); |
| data_samples_.pop_front(); |
| } |
| } |
| |
| void BitRateStats::Update(uint32_t packet_size_bytes, int64_t now_ms) { |
| // Find an empty slot for storing the new sample and at the same time |
| // accumulate the history. |
| data_samples_.push_back(new DataTimeSizeTuple(packet_size_bytes, now_ms)); |
| accumulated_bytes_ += packet_size_bytes; |
| EraseOld(now_ms); |
| } |
| |
| void BitRateStats::EraseOld(int64_t now_ms) { |
| while (data_samples_.size() > 0) { |
| if (now_ms - data_samples_.front()->time_complete_ms > |
| kBitrateAverageWindowMs) { |
| // Delete old sample |
| accumulated_bytes_ -= data_samples_.front()->size_bytes; |
| delete data_samples_.front(); |
| data_samples_.pop_front(); |
| } else { |
| break; |
| } |
| } |
| } |
| |
| uint32_t BitRateStats::BitRate(int64_t now_ms) { |
| // Calculate the average bit rate the past BITRATE_AVERAGE_WINDOW ms. |
| // Removes any old samples from the list. |
| EraseOld(now_ms); |
| return static_cast<uint32_t>(accumulated_bytes_ * 8.0f * 1000.0f / |
| kBitrateAverageWindowMs + 0.5f); |
| } |
| } // namespace webrtc |