Trigger rtt and stats update on report block rather than receiver report.
ReportBlock is the the real receiver report. Triggering rtt update on ReportBlock support clients that send receiver report blocks attached to SenderReport rather than ReceiverReport. Bug: webrtc:7996 Change-Id: Ie826fa09fd1bf0e5256e995649f66811b5192761 Reviewed-on: https://webrtc-review.googlesource.com/4040 Reviewed-by: Åsa Persson <asapersson@webrtc.org> Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/master@{#20014}
This commit is contained in:
committed by
Commit Bot
parent
cff9ee650e
commit
760c4b4da9
@ -123,7 +123,7 @@ RTCPReceiver::RTCPReceiver(
|
||||
xr_rrtr_status_(false),
|
||||
xr_rr_rtt_ms_(0),
|
||||
oldest_tmmbr_info_ms_(0),
|
||||
last_received_rr_ms_(0),
|
||||
last_received_rb_ms_(0),
|
||||
last_increased_sequence_number_ms_(0),
|
||||
stats_callback_(nullptr),
|
||||
packet_type_counter_observer_(packet_type_counter_observer),
|
||||
@ -146,9 +146,9 @@ void RTCPReceiver::IncomingPacket(const uint8_t* packet, size_t packet_size) {
|
||||
TriggerCallbacksFromRtcpPacket(packet_information);
|
||||
}
|
||||
|
||||
int64_t RTCPReceiver::LastReceivedReceiverReport() const {
|
||||
int64_t RTCPReceiver::LastReceivedReportBlockMs() const {
|
||||
rtc::CritScope lock(&rtcp_receiver_lock_);
|
||||
return last_received_rr_ms_;
|
||||
return last_received_rb_ms_;
|
||||
}
|
||||
|
||||
void RTCPReceiver::SetRemoteSSRC(uint32_t ssrc) {
|
||||
@ -422,8 +422,6 @@ void RTCPReceiver::HandleReceiverReport(const CommonHeader& rtcp_block,
|
||||
return;
|
||||
}
|
||||
|
||||
last_received_rr_ms_ = clock_->TimeInMilliseconds();
|
||||
|
||||
const uint32_t remote_ssrc = receiver_report.sender_ssrc();
|
||||
|
||||
packet_information->remote_ssrc = remote_ssrc;
|
||||
@ -455,6 +453,8 @@ void RTCPReceiver::HandleReportBlock(const ReportBlock& report_block,
|
||||
if (registered_ssrcs_.count(report_block.source_ssrc()) == 0)
|
||||
return;
|
||||
|
||||
last_received_rb_ms_ = clock_->TimeInMilliseconds();
|
||||
|
||||
ReportBlockWithRtt* report_block_info =
|
||||
&received_report_blocks_[report_block.source_ssrc()][remote_ssrc];
|
||||
report_block_info->report_block.sender_ssrc = remote_ssrc;
|
||||
@ -534,13 +534,13 @@ RTCPReceiver::TmmbrInformation* RTCPReceiver::GetTmmbrInformation(
|
||||
|
||||
bool RTCPReceiver::RtcpRrTimeout(int64_t rtcp_interval_ms) {
|
||||
rtc::CritScope lock(&rtcp_receiver_lock_);
|
||||
if (last_received_rr_ms_ == 0)
|
||||
if (last_received_rb_ms_ == 0)
|
||||
return false;
|
||||
|
||||
int64_t time_out_ms = kRrTimeoutIntervals * rtcp_interval_ms;
|
||||
if (clock_->TimeInMilliseconds() > last_received_rr_ms_ + time_out_ms) {
|
||||
if (clock_->TimeInMilliseconds() > last_received_rb_ms_ + time_out_ms) {
|
||||
// Reset the timer to only trigger one log.
|
||||
last_received_rr_ms_ = 0;
|
||||
last_received_rb_ms_ = 0;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
@ -61,7 +61,7 @@ class RTCPReceiver {
|
||||
|
||||
void IncomingPacket(const uint8_t* packet, size_t packet_size);
|
||||
|
||||
int64_t LastReceivedReceiverReport() const;
|
||||
int64_t LastReceivedReportBlockMs() const;
|
||||
|
||||
void SetSsrcs(uint32_t main_ssrc, const std::set<uint32_t>& registered_ssrcs);
|
||||
void SetRemoteSSRC(uint32_t ssrc);
|
||||
@ -245,8 +245,8 @@ class RTCPReceiver {
|
||||
std::map<uint32_t, std::string> received_cnames_
|
||||
RTC_GUARDED_BY(rtcp_receiver_lock_);
|
||||
|
||||
// The last time we received an RTCP RR.
|
||||
int64_t last_received_rr_ms_ RTC_GUARDED_BY(rtcp_receiver_lock_);
|
||||
// The last time we received an RTCP Report block for this module.
|
||||
int64_t last_received_rb_ms_ RTC_GUARDED_BY(rtcp_receiver_lock_);
|
||||
|
||||
// The time we last received an RTCP RR telling we have successfully
|
||||
// delivered RTP packet to the remote side.
|
||||
|
||||
@ -274,7 +274,6 @@ TEST_F(RtcpReceiverTest, InjectRrPacket) {
|
||||
OnReceivedRtcpReceiverReport(IsEmpty(), _, now));
|
||||
InjectRtcpPacket(rr);
|
||||
|
||||
EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
|
||||
std::vector<RTCPReportBlock> report_blocks;
|
||||
rtcp_receiver_.StatisticsReceived(&report_blocks);
|
||||
EXPECT_TRUE(report_blocks.empty());
|
||||
@ -293,7 +292,7 @@ TEST_F(RtcpReceiverTest, InjectRrPacketWithReportBlockNotToUsIgnored) {
|
||||
OnReceivedRtcpReceiverReport(IsEmpty(), _, now));
|
||||
InjectRtcpPacket(rr);
|
||||
|
||||
EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
|
||||
EXPECT_EQ(0, rtcp_receiver_.LastReceivedReportBlockMs());
|
||||
std::vector<RTCPReportBlock> received_blocks;
|
||||
rtcp_receiver_.StatisticsReceived(&received_blocks);
|
||||
EXPECT_TRUE(received_blocks.empty());
|
||||
@ -313,7 +312,27 @@ TEST_F(RtcpReceiverTest, InjectRrPacketWithOneReportBlock) {
|
||||
OnReceivedRtcpReceiverReport(SizeIs(1), _, now));
|
||||
InjectRtcpPacket(rr);
|
||||
|
||||
EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
|
||||
EXPECT_EQ(now, rtcp_receiver_.LastReceivedReportBlockMs());
|
||||
std::vector<RTCPReportBlock> received_blocks;
|
||||
rtcp_receiver_.StatisticsReceived(&received_blocks);
|
||||
EXPECT_EQ(1u, received_blocks.size());
|
||||
}
|
||||
|
||||
TEST_F(RtcpReceiverTest, InjectSrPacketWithOneReportBlock) {
|
||||
int64_t now = system_clock_.TimeInMilliseconds();
|
||||
|
||||
rtcp::ReportBlock rb;
|
||||
rb.SetMediaSsrc(kReceiverMainSsrc);
|
||||
rtcp::SenderReport sr;
|
||||
sr.SetSenderSsrc(kSenderSsrc);
|
||||
sr.AddReportBlock(rb);
|
||||
|
||||
EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(1)));
|
||||
EXPECT_CALL(bandwidth_observer_,
|
||||
OnReceivedRtcpReceiverReport(SizeIs(1), _, now));
|
||||
InjectRtcpPacket(sr);
|
||||
|
||||
EXPECT_EQ(now, rtcp_receiver_.LastReceivedReportBlockMs());
|
||||
std::vector<RTCPReportBlock> received_blocks;
|
||||
rtcp_receiver_.StatisticsReceived(&received_blocks);
|
||||
EXPECT_EQ(1u, received_blocks.size());
|
||||
@ -345,7 +364,7 @@ TEST_F(RtcpReceiverTest, InjectRrPacketWithTwoReportBlocks) {
|
||||
OnReceivedRtcpReceiverReport(SizeIs(2), _, now));
|
||||
InjectRtcpPacket(rr1);
|
||||
|
||||
EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
|
||||
EXPECT_EQ(now, rtcp_receiver_.LastReceivedReportBlockMs());
|
||||
std::vector<RTCPReportBlock> received_blocks;
|
||||
rtcp_receiver_.StatisticsReceived(&received_blocks);
|
||||
EXPECT_THAT(received_blocks,
|
||||
@ -419,7 +438,7 @@ TEST_F(RtcpReceiverTest, InjectRrPacketsFromTwoRemoteSsrcs) {
|
||||
OnReceivedRtcpReceiverReport(SizeIs(1), _, now));
|
||||
InjectRtcpPacket(rr1);
|
||||
|
||||
EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
|
||||
EXPECT_EQ(now, rtcp_receiver_.LastReceivedReportBlockMs());
|
||||
|
||||
std::vector<RTCPReportBlock> received_blocks;
|
||||
rtcp_receiver_.StatisticsReceived(&received_blocks);
|
||||
@ -486,7 +505,7 @@ TEST_F(RtcpReceiverTest, GetRtt) {
|
||||
EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
|
||||
InjectRtcpPacket(rr);
|
||||
|
||||
EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
|
||||
EXPECT_EQ(now, rtcp_receiver_.LastReceivedReportBlockMs());
|
||||
EXPECT_EQ(
|
||||
0, rtcp_receiver_.RTT(kSenderSsrc, nullptr, nullptr, nullptr, nullptr));
|
||||
}
|
||||
|
||||
@ -178,10 +178,10 @@ void ModuleRtpRtcpImpl::Process() {
|
||||
|
||||
bool process_rtt = now >= last_rtt_process_time_ + kRtpRtcpRttProcessTimeMs;
|
||||
if (rtcp_sender_.Sending()) {
|
||||
// Process RTT if we have received a receiver report and we haven't
|
||||
// Process RTT if we have received a report block and we haven't
|
||||
// processed RTT for at least |kRtpRtcpRttProcessTimeMs| milliseconds.
|
||||
if (rtcp_receiver_.LastReceivedReceiverReport() >
|
||||
last_rtt_process_time_ && process_rtt) {
|
||||
if (rtcp_receiver_.LastReceivedReportBlockMs() > last_rtt_process_time_ &&
|
||||
process_rtt) {
|
||||
std::vector<RTCPReportBlock> receive_blocks;
|
||||
rtcp_receiver_.StatisticsReceived(&receive_blocks);
|
||||
int64_t max_rtt = 0;
|
||||
|
||||
Reference in New Issue
Block a user