/* * 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 "Bitrate.h" #include "rtp_utility.h" namespace webrtc { Bitrate::Bitrate(RtpRtcpClock* clock) : _clock(*clock), _packetRate(0), _bitrate(0), _bitrateNextIdx(0), _timeLastRateUpdate(0), _bytesCount(0), _packetCount(0) { memset(_packetRateArray, 0, sizeof(_packetRateArray)); memset(_bitrateDiffMS, 0, sizeof(_bitrateDiffMS)); memset(_bitrateArray, 0, sizeof(_bitrateArray)); } void Bitrate::Update(const WebRtc_Word32 bytes) { _bytesCount += bytes; _packetCount++; } WebRtc_UWord32 Bitrate::PacketRate() const { return _packetRate; } WebRtc_UWord32 Bitrate::BitrateLast() const { return _bitrate; } WebRtc_UWord32 Bitrate::BitrateNow() const { WebRtc_Word64 now = _clock.GetTimeInMS(); WebRtc_Word64 diffMS = now -_timeLastRateUpdate; if(diffMS > 10000) { // 10 sec // too high diff ignore return _bitrate; // bits/s } WebRtc_Word64 bitsSinceLastRateUpdate = 8 * _bytesCount * 1000; // have to consider the time when the measurement was done // ((bits/sec * sec) + (bits)) / sec WebRtc_Word64 bitrate = (static_cast(_bitrate) * 1000 + bitsSinceLastRateUpdate) / (1000 + diffMS); return static_cast(bitrate); } void Bitrate::Process() { // Triggered by timer. WebRtc_Word64 now = _clock.GetTimeInMS(); WebRtc_Word64 diffMS = now -_timeLastRateUpdate; if (diffMS < 100) { // Not enough data, wait... return; } if (diffMS > 10000) { // 10 sec // too high diff ignore _timeLastRateUpdate = now; _bytesCount = 0; _packetCount = 0; return; } _packetRateArray[_bitrateNextIdx] = (_packetCount * 1000) / diffMS; _bitrateArray[_bitrateNextIdx] = 8 * ((_bytesCount * 1000) / diffMS); _bitrateDiffMS[_bitrateNextIdx] = diffMS; _bitrateNextIdx++; if (_bitrateNextIdx >= 10) { _bitrateNextIdx = 0; } WebRtc_Word64 sumDiffMS = 0; WebRtc_Word64 sumBitrateMS = 0; WebRtc_Word64 sumPacketrateMS = 0; for (int i = 0; i < 10; i++) { sumDiffMS += _bitrateDiffMS[i]; sumBitrateMS += _bitrateArray[i] * _bitrateDiffMS[i]; sumPacketrateMS += _packetRateArray[i] * _bitrateDiffMS[i]; } _timeLastRateUpdate = now; _bytesCount = 0; _packetCount = 0; _packetRate = static_cast(sumPacketrateMS / sumDiffMS); _bitrate = static_cast(sumBitrateMS / sumDiffMS); } } // namespace webrtc