Simplify setting/unsetting REMB in RtcpSender
follow up of https://webrtc-review.googlesource.com/c/src/+/7983
Bug: None
Change-Id: I408c21408478d801a769e2e9d5f2eb9408430a4b
Reviewed-on: https://webrtc-review.googlesource.com/12520
Reviewed-by: Åsa Persson <asapersson@webrtc.org>
Reviewed-by: Elad Alon <eladalon@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20359}
diff --git a/modules/rtp_rtcp/source/rtcp_sender.cc b/modules/rtp_rtcp/source/rtcp_sender.cc
index d79e199..9eda2a0 100644
--- a/modules/rtp_rtcp/source/rtcp_sender.cc
+++ b/modules/rtp_rtcp/source/rtcp_sender.cc
@@ -154,7 +154,6 @@
transport_(outgoing_transport),
using_nack_(false),
sending_(false),
- remb_enabled_(false),
next_time_to_send_rtcp_(0),
timestamp_offset_(0),
last_rtp_timestamp_(0),
@@ -237,33 +236,23 @@
return 0;
}
-bool RTCPSender::REMB() const {
- rtc::CritScope lock(&critical_section_rtcp_sender_);
- return remb_enabled_;
-}
-
-void RTCPSender::SetREMBStatus(bool enable) {
- rtc::CritScope lock(&critical_section_rtcp_sender_);
- remb_enabled_ = enable;
- if (!enable) {
- // Stop sending remb each report until it is reenabled and remb data set.
- ConsumeFlag(kRtcpRemb, true);
- }
-}
-
-void RTCPSender::SetREMBData(uint32_t bitrate,
- const std::vector<uint32_t>& ssrcs) {
+void RTCPSender::SetRemb(uint32_t bitrate, const std::vector<uint32_t>& ssrcs) {
rtc::CritScope lock(&critical_section_rtcp_sender_);
remb_bitrate_ = bitrate;
remb_ssrcs_ = ssrcs;
- if (remb_enabled_)
- SetFlag(kRtcpRemb, false);
+ SetFlag(kRtcpRemb, /*is_volatile=*/false);
// Send a REMB immediately if we have a new REMB. The frequency of REMBs is
// throttled by the caller.
next_time_to_send_rtcp_ = clock_->TimeInMilliseconds();
}
+void RTCPSender::UnsetRemb() {
+ rtc::CritScope lock(&critical_section_rtcp_sender_);
+ // Stop sending REMB each report until it is reenabled and REMB data set.
+ ConsumeFlag(kRtcpRemb, /*forced=*/true);
+}
+
bool RTCPSender::TMMBR() const {
rtc::CritScope lock(&critical_section_rtcp_sender_);
return IsFlagPresent(RTCPPacketType::kRtcpTmmbr);
diff --git a/modules/rtp_rtcp/source/rtcp_sender.h b/modules/rtp_rtcp/source/rtcp_sender.h
index 69a0de5..3896559 100644
--- a/modules/rtp_rtcp/source/rtcp_sender.h
+++ b/modules/rtp_rtcp/source/rtcp_sender.h
@@ -120,11 +120,9 @@
int32_t nackSize = 0,
const uint16_t* nackList = 0);
- bool REMB() const;
+ void SetRemb(uint32_t bitrate, const std::vector<uint32_t>& ssrcs);
- void SetREMBStatus(bool enable);
-
- void SetREMBData(uint32_t bitrate, const std::vector<uint32_t>& ssrcs);
+ void UnsetRemb();
bool TMMBR() const;
@@ -199,7 +197,6 @@
rtc::CriticalSection critical_section_rtcp_sender_;
bool using_nack_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
bool sending_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
- bool remb_enabled_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
int64_t next_time_to_send_rtcp_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
diff --git a/modules/rtp_rtcp/source/rtcp_sender_unittest.cc b/modules/rtp_rtcp/source/rtcp_sender_unittest.cc
index 589db34..9ba7689 100644
--- a/modules/rtp_rtcp/source/rtcp_sender_unittest.cc
+++ b/modules/rtp_rtcp/source/rtcp_sender_unittest.cc
@@ -497,44 +497,39 @@
EXPECT_THAT(parser()->nack()->packet_ids(), ElementsAre(0, 1, 16));
}
-TEST_F(RtcpSenderTest, RembStatus) {
+TEST_F(RtcpSenderTest, RembNotIncludedBeforeSet) {
+ rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
+
+ rtcp_sender_->SendRTCP(feedback_state(), kRtcpRr);
+
+ ASSERT_EQ(1, parser()->receiver_report()->num_packets());
+ EXPECT_EQ(0, parser()->remb()->num_packets());
+}
+
+TEST_F(RtcpSenderTest, RembNotIncludedAfterUnset) {
const uint64_t kBitrate = 261011;
const std::vector<uint32_t> kSsrcs = {kRemoteSsrc, kRemoteSsrc + 1};
rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-
- EXPECT_FALSE(rtcp_sender_->REMB());
+ rtcp_sender_->SetRemb(kBitrate, kSsrcs);
rtcp_sender_->SendRTCP(feedback_state(), kRtcpRr);
ASSERT_EQ(1, parser()->receiver_report()->num_packets());
- EXPECT_EQ(0, parser()->remb()->num_packets());
+ EXPECT_EQ(1, parser()->remb()->num_packets());
- rtcp_sender_->SetREMBStatus(true);
- EXPECT_TRUE(rtcp_sender_->REMB());
- rtcp_sender_->SetREMBData(kBitrate, kSsrcs);
+ // Turn off REMB. rtcp_sender no longer should send it.
+ rtcp_sender_->UnsetRemb();
rtcp_sender_->SendRTCP(feedback_state(), kRtcpRr);
ASSERT_EQ(2, parser()->receiver_report()->num_packets());
EXPECT_EQ(1, parser()->remb()->num_packets());
-
- // Sending another report sends remb again, even if no new remb data was set.
- rtcp_sender_->SendRTCP(feedback_state(), kRtcpRr);
- ASSERT_EQ(3, parser()->receiver_report()->num_packets());
- EXPECT_EQ(2, parser()->remb()->num_packets());
-
- // Turn off remb. rtcp_sender no longer should send it.
- rtcp_sender_->SetREMBStatus(false);
- EXPECT_FALSE(rtcp_sender_->REMB());
- rtcp_sender_->SendRTCP(feedback_state(), kRtcpRr);
- ASSERT_EQ(4, parser()->receiver_report()->num_packets());
- EXPECT_EQ(2, parser()->remb()->num_packets());
}
TEST_F(RtcpSenderTest, SendRemb) {
const uint64_t kBitrate = 261011;
- std::vector<uint32_t> ssrcs;
- ssrcs.push_back(kRemoteSsrc);
- ssrcs.push_back(kRemoteSsrc + 1);
+ const std::vector<uint32_t> kSsrcs = {kRemoteSsrc, kRemoteSsrc + 1};
rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
- rtcp_sender_->SetREMBData(kBitrate, ssrcs);
- EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpRemb));
+ rtcp_sender_->SetRemb(kBitrate, kSsrcs);
+
+ rtcp_sender_->SendRTCP(feedback_state(), kRtcpRemb);
+
EXPECT_EQ(1, parser()->remb()->num_packets());
EXPECT_EQ(kSenderSsrc, parser()->remb()->sender_ssrc());
EXPECT_EQ(kBitrate, parser()->remb()->bitrate_bps());
@@ -542,32 +537,19 @@
ElementsAre(kRemoteSsrc, kRemoteSsrc + 1));
}
-TEST_F(RtcpSenderTest, RembIncludedInCompoundPacketIfEnabled) {
+TEST_F(RtcpSenderTest, RembIncludedInEachCompoundPacketAfterSet) {
const int kBitrate = 261011;
- std::vector<uint32_t> ssrcs;
- ssrcs.push_back(kRemoteSsrc);
+ const std::vector<uint32_t> kSsrcs = {kRemoteSsrc, kRemoteSsrc + 1};
rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
- rtcp_sender_->SetREMBStatus(true);
- EXPECT_TRUE(rtcp_sender_->REMB());
- rtcp_sender_->SetREMBData(kBitrate, ssrcs);
- EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport));
+ rtcp_sender_->SetRemb(kBitrate, kSsrcs);
+
+ rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport);
EXPECT_EQ(1, parser()->remb()->num_packets());
// REMB should be included in each compound packet.
- EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport));
+ rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport);
EXPECT_EQ(2, parser()->remb()->num_packets());
}
-TEST_F(RtcpSenderTest, RembNotIncludedInCompoundPacketIfNotEnabled) {
- const int kBitrate = 261011;
- std::vector<uint32_t> ssrcs;
- ssrcs.push_back(kRemoteSsrc);
- rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
- rtcp_sender_->SetREMBData(kBitrate, ssrcs);
- EXPECT_FALSE(rtcp_sender_->REMB());
- EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport));
- EXPECT_EQ(0, parser()->remb()->num_packets());
-}
-
TEST_F(RtcpSenderTest, SendXrWithVoipMetric) {
rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
RTCPVoIPMetric metric;
@@ -757,7 +739,7 @@
std::vector<uint32_t> ssrcs;
ssrcs.push_back(kRemoteSsrc);
rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
- rtcp_sender_->SetREMBData(kBitrate, ssrcs);
+ rtcp_sender_->SetRemb(kBitrate, ssrcs);
std::set<RTCPPacketType> packet_types;
packet_types.insert(kRtcpRemb);
packet_types.insert(kRtcpPli);
@@ -766,7 +748,6 @@
EXPECT_EQ(1, parser()->pli()->num_packets());
}
-
// This test is written to verify that BYE is always the last packet
// type in a RTCP compoud packet. The rtcp_sender_ is recreated with
// mock_transport, which is used to check for whether BYE at the end
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
index b1c9109..cfd994a 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
+++ b/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
@@ -631,12 +631,11 @@
// (REMB) Receiver Estimated Max Bitrate.
void ModuleRtpRtcpImpl::SetRemb(uint32_t bitrate_bps,
const std::vector<uint32_t>& ssrcs) {
- rtcp_sender_.SetREMBStatus(true);
- rtcp_sender_.SetREMBData(bitrate_bps, ssrcs);
+ rtcp_sender_.SetRemb(bitrate_bps, ssrcs);
}
void ModuleRtpRtcpImpl::UnsetRemb() {
- rtcp_sender_.SetREMBStatus(false);
+ rtcp_sender_.UnsetRemb();
}
int32_t ModuleRtpRtcpImpl::RegisterSendRtpHeaderExtension(
diff --git a/video/video_send_stream_tests.cc b/video/video_send_stream_tests.cc
index e21bc06..91675be 100644
--- a/video/video_send_stream_tests.cc
+++ b/video/video_send_stream_tests.cc
@@ -1232,8 +1232,7 @@
rtcp_sender.SetRTCPStatus(RtcpMode::kReducedSize);
rtcp_sender.SetRemoteSSRC(kVideoSendSsrcs[0]);
if (remb_value > 0) {
- rtcp_sender.SetREMBStatus(true);
- rtcp_sender.SetREMBData(remb_value, std::vector<uint32_t>());
+ rtcp_sender.SetRemb(remb_value, std::vector<uint32_t>());
}
RTCPSender::FeedbackState feedback_state;
EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr));