Implement recieving FIR in RtcpTranceiver

Bug: webrtc:8239
Change-Id: I2075af1598faf62b4eb3ab85e80590ff41cd2f49
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/256811
Reviewed-by: Emil Lundmark <lndmrk@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#36341}
This commit is contained in:
Danil Chapovalov
2022-03-25 14:56:03 +01:00
committed by WebRTC LUCI CQ
parent 3d6c6556b4
commit 56a04c3430
4 changed files with 106 additions and 0 deletions

View File

@ -32,6 +32,7 @@
#include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
#include "modules/rtp_rtcp/source/time_util.h"
#include "rtc_base/checks.h"
#include "rtc_base/containers/flat_map.h"
#include "rtc_base/logging.h"
#include "rtc_base/numerics/divide_round.h"
#include "rtc_base/task_utils/repeating_task.h"
@ -57,6 +58,8 @@ struct RtcpTransceiverImpl::RemoteSenderState {
struct RtcpTransceiverImpl::LocalSenderState {
uint32_t ssrc;
size_t last_num_sent_bytes = 0;
// Sequence number of the last FIR message per sender SSRC.
flat_map<uint32_t, uint8_t> last_fir;
RtpStreamRtcpHandler* handler = nullptr;
};
@ -337,6 +340,9 @@ void RtcpTransceiverImpl::HandlePayloadSpecificFeedback(
const rtcp::CommonHeader& rtcp_packet_header,
Timestamp now) {
switch (rtcp_packet_header.fmt()) {
case rtcp::Fir::kFeedbackMessageType:
HandleFir(rtcp_packet_header);
break;
case rtcp::Pli::kFeedbackMessageType:
HandlePli(rtcp_packet_header);
break;
@ -346,6 +352,26 @@ void RtcpTransceiverImpl::HandlePayloadSpecificFeedback(
}
}
void RtcpTransceiverImpl::HandleFir(
const rtcp::CommonHeader& rtcp_packet_header) {
rtcp::Fir fir;
if (local_senders_.empty() || !fir.Parse(rtcp_packet_header)) {
return;
}
for (const rtcp::Fir::Request& r : fir.requests()) {
auto it = local_senders_by_ssrc_.find(r.ssrc);
if (it == local_senders_by_ssrc_.end()) {
continue;
}
auto [fir_it, is_new] =
it->second->last_fir.emplace(fir.sender_ssrc(), r.seq_nr);
if (is_new || fir_it->second != r.seq_nr) {
it->second->handler->OnFir(fir.sender_ssrc());
fir_it->second = r.seq_nr;
}
}
}
void RtcpTransceiverImpl::HandlePli(
const rtcp::CommonHeader& rtcp_packet_header) {
rtcp::Pli pli;