In RtcpTrasnceiver notify RtpStreamRtcpHandler on related report blocks

Bug: webrtc:8239
Change-Id: Ib914775020b5d889b68d1fe178a9fff6acbaeb8f
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/257283
Reviewed-by: Emil Lundmark <lndmrk@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#36398}
This commit is contained in:
Danil Chapovalov 2022-03-31 14:43:56 +02:00 committed by WebRTC LUCI CQ
parent 128addb1a2
commit 3455481554
4 changed files with 73 additions and 0 deletions

View File

@ -102,6 +102,8 @@ class RtpStreamRtcpHandler {
rtc::ArrayView<const uint16_t> sequence_numbers) {}
virtual void OnFir(uint32_t sender_ssrc) {}
virtual void OnPli(uint32_t sender_ssrc) {}
virtual void OnReportBlock(uint32_t sender_ssrc,
const rtcp::ReportBlock& report_block) {}
};
struct RtcpTransceiverConfig {

View File

@ -316,6 +316,7 @@ void RtcpTransceiverImpl::HandleSenderReport(
remote_senders_[sender_report.sender_ssrc()];
remote_sender.last_received_sender_report = {{now, sender_report.ntp()}};
const auto& received_report_blocks = sender_report.report_blocks();
CallbackOnReportBlocks(sender_report.sender_ssrc(), received_report_blocks);
report_blocks.insert(report_blocks.end(), received_report_blocks.begin(),
received_report_blocks.end());
@ -332,10 +333,25 @@ void RtcpTransceiverImpl::HandleReceiverReport(
return;
}
const auto& received_report_blocks = receiver_report.report_blocks();
CallbackOnReportBlocks(receiver_report.sender_ssrc(), received_report_blocks);
report_blocks.insert(report_blocks.end(), received_report_blocks.begin(),
received_report_blocks.end());
}
void RtcpTransceiverImpl::CallbackOnReportBlocks(
uint32_t sender_ssrc,
rtc::ArrayView<const rtcp::ReportBlock> report_blocks) {
if (local_senders_.empty()) {
return;
}
for (const rtcp::ReportBlock& block : report_blocks) {
auto sender_it = local_senders_by_ssrc_.find(block.source_ssrc());
if (sender_it != local_senders_by_ssrc_.end()) {
sender_it->second->handler->OnReportBlock(sender_ssrc, block);
}
}
}
void RtcpTransceiverImpl::HandlePayloadSpecificFeedback(
const rtcp::CommonHeader& rtcp_packet_header,
Timestamp now) {

View File

@ -100,6 +100,9 @@ class RtcpTransceiverImpl {
std::vector<rtcp::ReportBlock>& report_blocks);
void HandleReceiverReport(const rtcp::CommonHeader& rtcp_packet_header,
std::vector<rtcp::ReportBlock>& report_blocks);
void CallbackOnReportBlocks(
uint32_t sender_ssrc,
rtc::ArrayView<const rtcp::ReportBlock> report_blocks);
void HandlePayloadSpecificFeedback(
const rtcp::CommonHeader& rtcp_packet_header,
Timestamp now);

View File

@ -89,6 +89,10 @@ class MockRtpStreamRtcpHandler : public RtpStreamRtcpHandler {
(override));
MOCK_METHOD(void, OnFir, (uint32_t), (override));
MOCK_METHOD(void, OnPli, (uint32_t), (override));
MOCK_METHOD(void,
OnReportBlock,
(uint32_t, const rtcp::ReportBlock&),
(override));
private:
int num_calls_ = 0;
@ -1539,6 +1543,54 @@ TEST(RtcpTransceiverImplTest,
rtcp_transceiver.ReceivePacket(packet.Build(), receive_time);
}
TEST(RtcpTransceiverImplTest,
CallbackOnReportBlocksFromSenderAndReceiverReports) {
static constexpr uint32_t kRemoteSsrc = 5678;
// Has registered sender, report block attached to sender report.
static constexpr uint32_t kMediaSsrc1 = 1234;
// No registered sender, report block attached to receiver report.
// Such report block shouldn't prevent handling following report block.
static constexpr uint32_t kMediaSsrc2 = 1235;
// Has registered sender, no report block attached.
static constexpr uint32_t kMediaSsrc3 = 1236;
// Has registered sender, report block attached to receiver report.
static constexpr uint32_t kMediaSsrc4 = 1237;
MockNetworkLinkRtcpObserver link_observer;
RtcpTransceiverConfig config = DefaultTestConfig();
Timestamp receive_time = Timestamp::Seconds(5678);
RtcpTransceiverImpl rtcp_transceiver(config);
MockRtpStreamRtcpHandler local_stream1;
MockRtpStreamRtcpHandler local_stream3;
MockRtpStreamRtcpHandler local_stream4;
EXPECT_CALL(local_stream1, OnReportBlock(kRemoteSsrc, _));
EXPECT_CALL(local_stream3, OnReportBlock).Times(0);
EXPECT_CALL(local_stream4, OnReportBlock(kRemoteSsrc, _));
ASSERT_TRUE(rtcp_transceiver.AddMediaSender(kMediaSsrc1, &local_stream1));
ASSERT_TRUE(rtcp_transceiver.AddMediaSender(kMediaSsrc3, &local_stream3));
ASSERT_TRUE(rtcp_transceiver.AddMediaSender(kMediaSsrc4, &local_stream4));
// Assemble compound packet with multiple RTCP packets in it.
rtcp::CompoundPacket packet;
auto sr = std::make_unique<rtcp::SenderReport>();
sr->SetSenderSsrc(kRemoteSsrc);
std::vector<ReportBlock> rb(1);
rb[0].SetMediaSsrc(kMediaSsrc1);
sr->SetReportBlocks(std::move(rb));
packet.Append(std::move(sr));
auto rr = std::make_unique<rtcp::ReceiverReport>();
rr->SetSenderSsrc(kRemoteSsrc);
rb = std::vector<ReportBlock>(2);
rb[0].SetMediaSsrc(kMediaSsrc2);
rb[1].SetMediaSsrc(kMediaSsrc4);
rr->SetReportBlocks(std::move(rb));
packet.Append(std::move(rr));
rtcp_transceiver.ReceivePacket(packet.Build(), receive_time);
}
TEST(RtcpTransceiverImplTest, FailsToRegisterTwoSendersWithTheSameSsrc) {
RtcpTransceiverImpl rtcp_transceiver(DefaultTestConfig());
MockRtpStreamRtcpHandler sender1;