In RtpRtcp use BitrateTracker instead of RateStatistics to measure bitrate
BitrateTracker uses RateStatistics underneath, thus algorithm is the same, but it provides Timestamp/TimeDelta friendly interface Bug: webrtc:13757 Change-Id: I9f2fcb3d498b2a137b531b94b660d15aa273c4bf Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/312600 Reviewed-by: Erik Språng <sprang@webrtc.org> Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/main@{#40465}
This commit is contained in:
parent
666d707450
commit
950e231b63
@ -305,6 +305,7 @@ rtc_library("rtp_rtcp") {
|
||||
"../../logging:rtc_event_rtp_rtcp",
|
||||
"../../modules/audio_coding:audio_coding_module_typedefs",
|
||||
"../../rtc_base:bit_buffer",
|
||||
"../../rtc_base:bitrate_tracker",
|
||||
"../../rtc_base:bitstream_reader",
|
||||
"../../rtc_base:buffer",
|
||||
"../../rtc_base:byte_buffer",
|
||||
@ -365,11 +366,11 @@ rtc_source_set("rtp_rtcp_legacy") {
|
||||
"../../api/units:timestamp",
|
||||
"../../api/video:video_bitrate_allocation",
|
||||
"../../logging:rtc_event_rtp_rtcp",
|
||||
"../../rtc_base:bitrate_tracker",
|
||||
"../../rtc_base:checks",
|
||||
"../../rtc_base:gtest_prod",
|
||||
"../../rtc_base:logging",
|
||||
"../../rtc_base:macromagic",
|
||||
"../../rtc_base:rate_statistics",
|
||||
"../../rtc_base/synchronization:mutex",
|
||||
"../../system_wrappers",
|
||||
"../remote_bitrate_estimator",
|
||||
|
||||
@ -24,8 +24,8 @@
|
||||
#include "modules/rtp_rtcp/source/rtp_header_extension_size.h"
|
||||
#include "modules/rtp_rtcp/source/ulpfec_generator.h"
|
||||
#include "modules/rtp_rtcp/source/video_fec_generator.h"
|
||||
#include "rtc_base/bitrate_tracker.h"
|
||||
#include "rtc_base/random.h"
|
||||
#include "rtc_base/rate_statistics.h"
|
||||
#include "rtc_base/synchronization/mutex.h"
|
||||
|
||||
namespace webrtc {
|
||||
@ -96,7 +96,7 @@ class FlexfecSender : public VideoFecGenerator {
|
||||
const size_t header_extensions_size_;
|
||||
|
||||
mutable Mutex mutex_;
|
||||
RateStatistics fec_bitrate_ RTC_GUARDED_BY(mutex_);
|
||||
BitrateTracker fec_bitrate_ RTC_GUARDED_BY(mutex_);
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
@ -24,7 +24,7 @@ namespace webrtc {
|
||||
namespace {
|
||||
constexpr uint32_t kTimestampTicksPerMs = 90;
|
||||
constexpr int kSendSideDelayWindowMs = 1000;
|
||||
constexpr int kBitrateStatisticsWindowMs = 1000;
|
||||
constexpr TimeDelta kBitrateStatisticsWindow = TimeDelta::Seconds(1);
|
||||
constexpr size_t kRtpSequenceNumberMapMaxEntries = 1 << 13;
|
||||
|
||||
} // namespace
|
||||
@ -82,8 +82,7 @@ DEPRECATED_RtpSenderEgress::DEPRECATED_RtpSenderEgress(
|
||||
timestamp_offset_(0),
|
||||
max_delay_it_(send_delays_.end()),
|
||||
sum_delays_ms_(0),
|
||||
send_rates_(kNumMediaTypes,
|
||||
{kBitrateStatisticsWindowMs, RateStatistics::kBpsScale}),
|
||||
send_rates_(kNumMediaTypes, BitrateTracker(kBitrateStatisticsWindow)),
|
||||
rtp_sequence_number_map_(need_rtp_packet_infos_
|
||||
? std::make_unique<RtpSequenceNumberMap>(
|
||||
kRtpSequenceNumberMapMaxEntries)
|
||||
@ -221,12 +220,11 @@ RtpSendRates DEPRECATED_RtpSenderEgress::GetSendRates() const {
|
||||
}
|
||||
|
||||
RtpSendRates DEPRECATED_RtpSenderEgress::GetSendRatesLocked() const {
|
||||
const int64_t now_ms = clock_->TimeInMilliseconds();
|
||||
const Timestamp now = clock_->CurrentTime();
|
||||
RtpSendRates current_rates;
|
||||
for (size_t i = 0; i < kNumMediaTypes; ++i) {
|
||||
RtpPacketMediaType type = static_cast<RtpPacketMediaType>(i);
|
||||
current_rates[type] =
|
||||
DataRate::BitsPerSec(send_rates_[i].Rate(now_ms).value_or(0));
|
||||
current_rates[type] = send_rates_[i].Rate(now).value_or(DataRate::Zero());
|
||||
}
|
||||
return current_rates;
|
||||
}
|
||||
@ -453,7 +451,7 @@ void DEPRECATED_RtpSenderEgress::UpdateRtpStats(const RtpPacketToSend& packet) {
|
||||
|
||||
RTC_DCHECK(packet.packet_type().has_value());
|
||||
send_rates_[static_cast<size_t>(*packet.packet_type())].Update(packet.size(),
|
||||
now.ms());
|
||||
now);
|
||||
|
||||
if (rtp_stats_callback_) {
|
||||
rtp_stats_callback_->DataCountersUpdated(*counters, packet.Ssrc());
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
#include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
|
||||
#include "modules/rtp_rtcp/source/rtp_rtcp_interface.h"
|
||||
#include "modules/rtp_rtcp/source/rtp_sequence_number_map.h"
|
||||
#include "rtc_base/rate_statistics.h"
|
||||
#include "rtc_base/bitrate_tracker.h"
|
||||
#include "rtc_base/synchronization/mutex.h"
|
||||
#include "rtc_base/thread_annotations.h"
|
||||
|
||||
@ -136,7 +136,7 @@ class DEPRECATED_RtpSenderEgress {
|
||||
StreamDataCounters rtp_stats_ RTC_GUARDED_BY(lock_);
|
||||
StreamDataCounters rtx_rtp_stats_ RTC_GUARDED_BY(lock_);
|
||||
// One element per value in RtpPacketMediaType, with index matching value.
|
||||
std::vector<RateStatistics> send_rates_ RTC_GUARDED_BY(lock_);
|
||||
std::vector<BitrateTracker> send_rates_ RTC_GUARDED_BY(lock_);
|
||||
|
||||
// Maps sent packets' sequence numbers to a tuple consisting of:
|
||||
// 1. The timestamp, without the randomizing offset mandated by the RFC.
|
||||
|
||||
@ -99,7 +99,7 @@ FlexfecSender::FlexfecSender(
|
||||
RegisterSupportedExtensions(rtp_header_extensions)),
|
||||
header_extensions_size_(
|
||||
RtpHeaderExtensionSize(extension_sizes, rtp_header_extension_map_)),
|
||||
fec_bitrate_(/*max_window_size_ms=*/1000, RateStatistics::kBpsScale) {
|
||||
fec_bitrate_(/*max_window_size=*/TimeDelta::Seconds(1)) {
|
||||
// This object should not have been instantiated if FlexFEC is disabled.
|
||||
RTC_DCHECK_GE(payload_type, 0);
|
||||
RTC_DCHECK_LE(payload_type, 127);
|
||||
@ -179,7 +179,7 @@ std::vector<std::unique_ptr<RtpPacketToSend>> FlexfecSender::GetFecPackets() {
|
||||
}
|
||||
|
||||
MutexLock lock(&mutex_);
|
||||
fec_bitrate_.Update(total_fec_data_bytes, now.ms());
|
||||
fec_bitrate_.Update(total_fec_data_bytes, now);
|
||||
|
||||
return fec_packets_to_send;
|
||||
}
|
||||
@ -191,8 +191,7 @@ size_t FlexfecSender::MaxPacketOverhead() const {
|
||||
|
||||
DataRate FlexfecSender::CurrentFecRate() const {
|
||||
MutexLock lock(&mutex_);
|
||||
return DataRate::BitsPerSec(
|
||||
fec_bitrate_.Rate(clock_->TimeInMilliseconds()).value_or(0));
|
||||
return fec_bitrate_.Rate(clock_->CurrentTime()).value_or(DataRate::Zero());
|
||||
}
|
||||
|
||||
absl::optional<RtpState> FlexfecSender::GetRtpState() {
|
||||
|
||||
@ -47,8 +47,7 @@ StreamStatisticianImpl::StreamStatisticianImpl(uint32_t ssrc,
|
||||
: ssrc_(ssrc),
|
||||
clock_(clock),
|
||||
delta_internal_unix_epoch_(UnixEpochDelta(*clock_)),
|
||||
incoming_bitrate_(kStatisticsProcessInterval.ms(),
|
||||
RateStatistics::kBpsScale),
|
||||
incoming_bitrate_(/*max_window_size=*/kStatisticsProcessInterval),
|
||||
max_reordering_threshold_(max_reordering_threshold),
|
||||
enable_retransmit_detection_(false),
|
||||
cumulative_loss_is_capped_(false),
|
||||
@ -117,7 +116,7 @@ void StreamStatisticianImpl::UpdateCounters(const RtpPacketReceived& packet) {
|
||||
RTC_DCHECK_EQ(ssrc_, packet.Ssrc());
|
||||
Timestamp now = clock_->CurrentTime();
|
||||
|
||||
incoming_bitrate_.Update(packet.size(), now.ms());
|
||||
incoming_bitrate_.Update(packet.size(), now);
|
||||
receive_counters_.transmitted.AddPacket(packet);
|
||||
--cumulative_loss_;
|
||||
|
||||
@ -310,7 +309,9 @@ StreamDataCounters StreamStatisticianImpl::GetReceiveStreamDataCounters()
|
||||
}
|
||||
|
||||
uint32_t StreamStatisticianImpl::BitrateReceived() const {
|
||||
return incoming_bitrate_.Rate(clock_->TimeInMilliseconds()).value_or(0);
|
||||
return incoming_bitrate_.Rate(clock_->CurrentTime())
|
||||
.value_or(DataRate::Zero())
|
||||
.bps<uint32_t>();
|
||||
}
|
||||
|
||||
bool StreamStatisticianImpl::IsRetransmitOfOldPacket(
|
||||
|
||||
@ -22,9 +22,9 @@
|
||||
#include "api/units/timestamp.h"
|
||||
#include "modules/rtp_rtcp/include/receive_statistics.h"
|
||||
#include "modules/rtp_rtcp/source/rtcp_packet/report_block.h"
|
||||
#include "rtc_base/bitrate_tracker.h"
|
||||
#include "rtc_base/containers/flat_map.h"
|
||||
#include "rtc_base/numerics/sequence_number_unwrapper.h"
|
||||
#include "rtc_base/rate_statistics.h"
|
||||
#include "rtc_base/synchronization/mutex.h"
|
||||
#include "rtc_base/thread_annotations.h"
|
||||
|
||||
@ -80,7 +80,7 @@ class StreamStatisticianImpl : public StreamStatisticianImplInterface {
|
||||
Clock* const clock_;
|
||||
// Delta used to map internal timestamps to Unix epoch ones.
|
||||
const TimeDelta delta_internal_unix_epoch_;
|
||||
RateStatistics incoming_bitrate_;
|
||||
BitrateTracker incoming_bitrate_;
|
||||
// In number of packets or sequence numbers.
|
||||
int max_reordering_threshold_;
|
||||
bool enable_retransmit_detection_;
|
||||
|
||||
@ -30,7 +30,6 @@
|
||||
#include "modules/rtp_rtcp/source/rtp_rtcp_config.h"
|
||||
#include "modules/rtp_rtcp/source/rtp_rtcp_interface.h"
|
||||
#include "rtc_base/random.h"
|
||||
#include "rtc_base/rate_statistics.h"
|
||||
#include "rtc_base/synchronization/mutex.h"
|
||||
#include "rtc_base/thread_annotations.h"
|
||||
|
||||
|
||||
@ -24,10 +24,9 @@ namespace webrtc {
|
||||
namespace {
|
||||
constexpr uint32_t kTimestampTicksPerMs = 90;
|
||||
constexpr TimeDelta kSendSideDelayWindow = TimeDelta::Seconds(1);
|
||||
constexpr int kBitrateStatisticsWindowMs = 1000;
|
||||
constexpr TimeDelta kBitrateStatisticsWindow = TimeDelta::Seconds(1);
|
||||
constexpr size_t kRtpSequenceNumberMapMaxEntries = 1 << 13;
|
||||
constexpr TimeDelta kUpdateInterval =
|
||||
TimeDelta::Millis(kBitrateStatisticsWindowMs);
|
||||
constexpr TimeDelta kUpdateInterval = kBitrateStatisticsWindow;
|
||||
} // namespace
|
||||
|
||||
RtpSenderEgress::NonPacedPacketSender::NonPacedPacketSender(
|
||||
@ -106,8 +105,7 @@ RtpSenderEgress::RtpSenderEgress(const RtpRtcpInterface::Configuration& config,
|
||||
timestamp_offset_(0),
|
||||
max_delay_it_(send_delays_.end()),
|
||||
sum_delays_(TimeDelta::Zero()),
|
||||
send_rates_(kNumMediaTypes,
|
||||
{kBitrateStatisticsWindowMs, RateStatistics::kBpsScale}),
|
||||
send_rates_(kNumMediaTypes, BitrateTracker(kBitrateStatisticsWindow)),
|
||||
rtp_sequence_number_map_(need_rtp_packet_infos_
|
||||
? std::make_unique<RtpSequenceNumberMap>(
|
||||
kRtpSequenceNumberMapMaxEntries)
|
||||
@ -304,8 +302,7 @@ RtpSendRates RtpSenderEgress::GetSendRates(Timestamp now) const {
|
||||
RtpSendRates current_rates;
|
||||
for (size_t i = 0; i < kNumMediaTypes; ++i) {
|
||||
RtpPacketMediaType type = static_cast<RtpPacketMediaType>(i);
|
||||
current_rates[type] =
|
||||
DataRate::BitsPerSec(send_rates_[i].Rate(now.ms()).value_or(0));
|
||||
current_rates[type] = send_rates_[i].Rate(now).value_or(DataRate::Zero());
|
||||
}
|
||||
return current_rates;
|
||||
}
|
||||
@ -564,7 +561,7 @@ void RtpSenderEgress::UpdateRtpStats(Timestamp now,
|
||||
}
|
||||
counters->transmitted.Add(counter);
|
||||
|
||||
send_rates_[static_cast<size_t>(packet_type)].Update(packet_size, now.ms());
|
||||
send_rates_[static_cast<size_t>(packet_type)].Update(packet_size, now);
|
||||
if (bitrate_callback_) {
|
||||
send_rates = GetSendRates(now);
|
||||
}
|
||||
|
||||
@ -32,7 +32,7 @@
|
||||
#include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
|
||||
#include "modules/rtp_rtcp/source/rtp_rtcp_interface.h"
|
||||
#include "modules/rtp_rtcp/source/rtp_sequence_number_map.h"
|
||||
#include "rtc_base/rate_statistics.h"
|
||||
#include "rtc_base/bitrate_tracker.h"
|
||||
#include "rtc_base/synchronization/mutex.h"
|
||||
#include "rtc_base/system/no_unique_address.h"
|
||||
#include "rtc_base/task_utils/repeating_task.h"
|
||||
@ -170,7 +170,7 @@ class RtpSenderEgress {
|
||||
StreamDataCounters rtp_stats_ RTC_GUARDED_BY(worker_queue_);
|
||||
StreamDataCounters rtx_rtp_stats_ RTC_GUARDED_BY(worker_queue_);
|
||||
// One element per value in RtpPacketMediaType, with index matching value.
|
||||
std::vector<RateStatistics> send_rates_ RTC_GUARDED_BY(worker_queue_);
|
||||
std::vector<BitrateTracker> send_rates_ RTC_GUARDED_BY(worker_queue_);
|
||||
absl::optional<std::pair<FecProtectionParams, FecProtectionParams>>
|
||||
pending_fec_params_ RTC_GUARDED_BY(worker_queue_);
|
||||
|
||||
|
||||
@ -141,7 +141,7 @@ RTPSenderVideo::RTPSenderVideo(const Config& config)
|
||||
red_payload_type_(config.red_payload_type),
|
||||
fec_type_(config.fec_type),
|
||||
fec_overhead_bytes_(config.fec_overhead_bytes),
|
||||
post_encode_overhead_bitrate_(1000, RateStatistics::kBpsScale),
|
||||
post_encode_overhead_bitrate_(/*max_window_size=*/TimeDelta::Seconds(1)),
|
||||
frame_encryptor_(config.frame_encryptor),
|
||||
require_frame_encryption_(config.require_frame_encryption),
|
||||
generic_descriptor_auth_experiment_(!absl::StartsWith(
|
||||
@ -181,8 +181,7 @@ void RTPSenderVideo::LogAndSendToNetwork(
|
||||
// unpacketized.
|
||||
if (packetized_payload_size >= encoder_output_size) {
|
||||
post_encode_overhead_bitrate_.Update(
|
||||
packetized_payload_size - encoder_output_size,
|
||||
clock_->TimeInMilliseconds());
|
||||
packetized_payload_size - encoder_output_size, clock_->CurrentTime());
|
||||
}
|
||||
}
|
||||
|
||||
@ -801,9 +800,8 @@ bool RTPSenderVideo::SendEncodedImage(int payload_type,
|
||||
|
||||
DataRate RTPSenderVideo::PostEncodeOverhead() const {
|
||||
MutexLock lock(&stats_mutex_);
|
||||
return DataRate::BitsPerSec(
|
||||
post_encode_overhead_bitrate_.Rate(clock_->TimeInMilliseconds())
|
||||
.value_or(0));
|
||||
return post_encode_overhead_bitrate_.Rate(clock_->CurrentTime())
|
||||
.value_or(DataRate::Zero());
|
||||
}
|
||||
|
||||
bool RTPSenderVideo::AllowRetransmission(
|
||||
|
||||
@ -35,6 +35,7 @@
|
||||
#include "modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.h"
|
||||
#include "modules/rtp_rtcp/source/rtp_video_header.h"
|
||||
#include "modules/rtp_rtcp/source/video_fec_generator.h"
|
||||
#include "rtc_base/bitrate_tracker.h"
|
||||
#include "rtc_base/one_time_event.h"
|
||||
#include "rtc_base/race_checker.h"
|
||||
#include "rtc_base/rate_statistics.h"
|
||||
@ -248,7 +249,7 @@ class RTPSenderVideo : public RTPVideoFrameSenderInterface {
|
||||
const size_t fec_overhead_bytes_; // Per packet max FEC overhead.
|
||||
|
||||
mutable Mutex stats_mutex_;
|
||||
RateStatistics post_encode_overhead_bitrate_ RTC_GUARDED_BY(stats_mutex_);
|
||||
BitrateTracker post_encode_overhead_bitrate_ RTC_GUARDED_BY(stats_mutex_);
|
||||
|
||||
std::map<int, TemporalLayerStats> frame_stats_by_temporal_layer_
|
||||
RTC_GUARDED_BY(stats_mutex_);
|
||||
|
||||
@ -77,7 +77,7 @@ UlpfecGenerator::UlpfecGenerator(int red_payload_type,
|
||||
num_protected_frames_(0),
|
||||
min_num_media_packets_(1),
|
||||
media_contains_keyframe_(false),
|
||||
fec_bitrate_(/*max_window_size_ms=*/1000, RateStatistics::kBpsScale) {}
|
||||
fec_bitrate_(/*max_window_size=*/TimeDelta::Seconds(1)) {}
|
||||
|
||||
// Used by FlexFecSender, payload types are unused.
|
||||
UlpfecGenerator::UlpfecGenerator(std::unique_ptr<ForwardErrorCorrection> fec,
|
||||
@ -89,7 +89,7 @@ UlpfecGenerator::UlpfecGenerator(std::unique_ptr<ForwardErrorCorrection> fec,
|
||||
num_protected_frames_(0),
|
||||
min_num_media_packets_(1),
|
||||
media_contains_keyframe_(false),
|
||||
fec_bitrate_(/*max_window_size_ms=*/1000, RateStatistics::kBpsScale) {}
|
||||
fec_bitrate_(/*max_window_size=*/TimeDelta::Seconds(1)) {}
|
||||
|
||||
UlpfecGenerator::~UlpfecGenerator() = default;
|
||||
|
||||
@ -235,15 +235,14 @@ std::vector<std::unique_ptr<RtpPacketToSend>> UlpfecGenerator::GetFecPackets() {
|
||||
ResetState();
|
||||
|
||||
MutexLock lock(&mutex_);
|
||||
fec_bitrate_.Update(total_fec_size_bytes, clock_->TimeInMilliseconds());
|
||||
fec_bitrate_.Update(total_fec_size_bytes, clock_->CurrentTime());
|
||||
|
||||
return fec_packets;
|
||||
}
|
||||
|
||||
DataRate UlpfecGenerator::CurrentFecRate() const {
|
||||
MutexLock lock(&mutex_);
|
||||
return DataRate::BitsPerSec(
|
||||
fec_bitrate_.Rate(clock_->TimeInMilliseconds()).value_or(0));
|
||||
return fec_bitrate_.Rate(clock_->CurrentTime()).value_or(DataRate::Zero());
|
||||
}
|
||||
|
||||
int UlpfecGenerator::Overhead() const {
|
||||
|
||||
@ -21,8 +21,8 @@
|
||||
#include "modules/include/module_fec_types.h"
|
||||
#include "modules/rtp_rtcp/source/forward_error_correction.h"
|
||||
#include "modules/rtp_rtcp/source/video_fec_generator.h"
|
||||
#include "rtc_base/bitrate_tracker.h"
|
||||
#include "rtc_base/race_checker.h"
|
||||
#include "rtc_base/rate_statistics.h"
|
||||
#include "rtc_base/synchronization/mutex.h"
|
||||
|
||||
namespace webrtc {
|
||||
@ -115,7 +115,7 @@ class UlpfecGenerator : public VideoFecGenerator {
|
||||
|
||||
mutable Mutex mutex_;
|
||||
absl::optional<Params> pending_params_ RTC_GUARDED_BY(mutex_);
|
||||
RateStatistics fec_bitrate_ RTC_GUARDED_BY(mutex_);
|
||||
BitrateTracker fec_bitrate_ RTC_GUARDED_BY(mutex_);
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user