In RtcpTransceiver avoid generating rtcp sender reports for inactive senders
Bug: webrtc:8239 Change-Id: I97d50c628db04c56669179ab7039a3fe3bd61d34 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/251901 Reviewed-by: Emil Lundmark <lndmrk@webrtc.org> Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/main@{#36030}
This commit is contained in:
parent
d15f3e1220
commit
8968bcae8d
@ -56,6 +56,7 @@ struct RtcpTransceiverImpl::RemoteSenderState {
|
|||||||
|
|
||||||
struct RtcpTransceiverImpl::LocalSenderState {
|
struct RtcpTransceiverImpl::LocalSenderState {
|
||||||
uint32_t ssrc;
|
uint32_t ssrc;
|
||||||
|
size_t last_num_sent_bytes = 0;
|
||||||
RtpStreamRtcpHandler* handler = nullptr;
|
RtpStreamRtcpHandler* handler = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -527,6 +528,17 @@ RtcpTransceiverImpl::CompoundPacketInfo RtcpTransceiverImpl::FillReports(
|
|||||||
LocalSenderState& rtp_sender = *it;
|
LocalSenderState& rtp_sender = *it;
|
||||||
RtpStreamRtcpHandler::RtpStats stats = rtp_sender.handler->SentStats();
|
RtpStreamRtcpHandler::RtpStats stats = rtp_sender.handler->SentStats();
|
||||||
|
|
||||||
|
if (stats.num_sent_bytes() < rtp_sender.last_num_sent_bytes) {
|
||||||
|
RTC_LOG(LS_ERROR) << "Inconsistent SR for SSRC " << rtp_sender.ssrc
|
||||||
|
<< ". Number of total sent bytes decreased.";
|
||||||
|
rtp_sender.last_num_sent_bytes = 0;
|
||||||
|
}
|
||||||
|
if (stats.num_sent_bytes() == rtp_sender.last_num_sent_bytes) {
|
||||||
|
// Skip because no RTP packet was send for this SSRC since last report.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
rtp_sender.last_num_sent_bytes = stats.num_sent_bytes();
|
||||||
|
|
||||||
last_handled_sender_it = it;
|
last_handled_sender_it = it;
|
||||||
rtcp::SenderReport sender_report;
|
rtcp::SenderReport sender_report;
|
||||||
sender_report.SetSenderSsrc(rtp_sender.ssrc);
|
sender_report.SetSenderSsrc(rtp_sender.ssrc);
|
||||||
|
|||||||
@ -69,7 +69,21 @@ class MockMediaReceiverRtcpObserver : public MediaReceiverRtcpObserver {
|
|||||||
|
|
||||||
class MockRtpStreamRtcpHandler : public RtpStreamRtcpHandler {
|
class MockRtpStreamRtcpHandler : public RtpStreamRtcpHandler {
|
||||||
public:
|
public:
|
||||||
|
MockRtpStreamRtcpHandler() {
|
||||||
|
// With each next call increase number of sent packets and bytes to simulate
|
||||||
|
// active RTP sender.
|
||||||
|
ON_CALL(*this, SentStats).WillByDefault([this] {
|
||||||
|
RtpStats stats;
|
||||||
|
stats.set_num_sent_packets(++num_calls_);
|
||||||
|
stats.set_num_sent_bytes(1'000 * num_calls_);
|
||||||
|
return stats;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
MOCK_METHOD(RtpStats, SentStats, (), (override));
|
MOCK_METHOD(RtpStats, SentStats, (), (override));
|
||||||
|
|
||||||
|
private:
|
||||||
|
int num_calls_ = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class MockNetworkLinkRtcpObserver : public NetworkLinkRtcpObserver {
|
class MockNetworkLinkRtcpObserver : public NetworkLinkRtcpObserver {
|
||||||
@ -1472,5 +1486,56 @@ TEST(RtcpTransceiverImplTest, RotatesSendersWhenAllSenderReportDoNotFit) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(RtcpTransceiverImplTest, SkipsSenderReportForInactiveSender) {
|
||||||
|
static constexpr uint32_t kSenderSsrc[] = {12345, 23456};
|
||||||
|
RtcpTransceiverConfig config = DefaultTestConfig();
|
||||||
|
RtcpPacketParser rtcp_parser;
|
||||||
|
RtcpParserTransport transport(&rtcp_parser);
|
||||||
|
config.outgoing_transport = &transport;
|
||||||
|
RtcpTransceiverImpl rtcp_transceiver(config);
|
||||||
|
|
||||||
|
RtpStreamRtcpHandler::RtpStats sender_stats[2];
|
||||||
|
NiceMock<MockRtpStreamRtcpHandler> sender[2];
|
||||||
|
ON_CALL(sender[0], SentStats).WillByDefault([&] { return sender_stats[0]; });
|
||||||
|
ON_CALL(sender[1], SentStats).WillByDefault([&] { return sender_stats[1]; });
|
||||||
|
rtcp_transceiver.AddMediaSender(kSenderSsrc[0], &sender[0]);
|
||||||
|
rtcp_transceiver.AddMediaSender(kSenderSsrc[1], &sender[1]);
|
||||||
|
|
||||||
|
// Start with both senders beeing active.
|
||||||
|
sender_stats[0].set_num_sent_packets(10);
|
||||||
|
sender_stats[0].set_num_sent_bytes(1'000);
|
||||||
|
sender_stats[1].set_num_sent_packets(5);
|
||||||
|
sender_stats[1].set_num_sent_bytes(2'000);
|
||||||
|
rtcp_transceiver.SendCompoundPacket();
|
||||||
|
EXPECT_EQ(transport.num_packets(), 1);
|
||||||
|
EXPECT_EQ(rtcp_parser.sender_report()->num_packets(), 2);
|
||||||
|
|
||||||
|
// Keep 1st sender active, but make 2nd second look inactive by returning the
|
||||||
|
// same RtpStats.
|
||||||
|
sender_stats[0].set_num_sent_packets(15);
|
||||||
|
sender_stats[0].set_num_sent_bytes(2'000);
|
||||||
|
rtcp_transceiver.SendCompoundPacket();
|
||||||
|
EXPECT_EQ(transport.num_packets(), 2);
|
||||||
|
EXPECT_EQ(rtcp_parser.sender_report()->num_packets(), 3);
|
||||||
|
EXPECT_EQ(rtcp_parser.sender_report()->sender_ssrc(), kSenderSsrc[0]);
|
||||||
|
|
||||||
|
// Swap active sender.
|
||||||
|
sender_stats[1].set_num_sent_packets(20);
|
||||||
|
sender_stats[1].set_num_sent_bytes(3'000);
|
||||||
|
rtcp_transceiver.SendCompoundPacket();
|
||||||
|
EXPECT_EQ(transport.num_packets(), 3);
|
||||||
|
EXPECT_EQ(rtcp_parser.sender_report()->num_packets(), 4);
|
||||||
|
EXPECT_EQ(rtcp_parser.sender_report()->sender_ssrc(), kSenderSsrc[1]);
|
||||||
|
|
||||||
|
// Activate both senders again.
|
||||||
|
sender_stats[0].set_num_sent_packets(20);
|
||||||
|
sender_stats[0].set_num_sent_bytes(3'000);
|
||||||
|
sender_stats[1].set_num_sent_packets(25);
|
||||||
|
sender_stats[1].set_num_sent_bytes(3'500);
|
||||||
|
rtcp_transceiver.SendCompoundPacket();
|
||||||
|
EXPECT_EQ(transport.num_packets(), 4);
|
||||||
|
EXPECT_EQ(rtcp_parser.sender_report()->num_packets(), 6);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user