Implement recieving PLI in RtcpTranceiver
Bug: webrtc:8239 Change-Id: I99f818991f4a0edd8afa90044bcb1db7e4a478d9 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/256105 Reviewed-by: Emil Lundmark <lndmrk@webrtc.org> Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/main@{#36330}
This commit is contained in:
parent
e5b2220650
commit
887754af75
@ -100,6 +100,7 @@ class RtpStreamRtcpHandler {
|
||||
|
||||
virtual void OnNack(uint32_t sender_ssrc,
|
||||
rtc::ArrayView<const uint16_t> sequence_numbers) {}
|
||||
virtual void OnPli(uint32_t sender_ssrc) {}
|
||||
};
|
||||
|
||||
struct RtcpTransceiverConfig {
|
||||
|
||||
@ -336,18 +336,40 @@ void RtcpTransceiverImpl::HandleReceiverReport(
|
||||
void RtcpTransceiverImpl::HandlePayloadSpecificFeedback(
|
||||
const rtcp::CommonHeader& rtcp_packet_header,
|
||||
Timestamp now) {
|
||||
// Remb is the only payload specific message handled right now.
|
||||
if (rtcp_packet_header.fmt() != rtcp::Psfb::kAfbMessageType ||
|
||||
config_.network_link_observer == nullptr) {
|
||||
switch (rtcp_packet_header.fmt()) {
|
||||
case rtcp::Pli::kFeedbackMessageType:
|
||||
HandlePli(rtcp_packet_header);
|
||||
break;
|
||||
case rtcp::Psfb::kAfbMessageType:
|
||||
HandleRemb(rtcp_packet_header, now);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void RtcpTransceiverImpl::HandlePli(
|
||||
const rtcp::CommonHeader& rtcp_packet_header) {
|
||||
rtcp::Pli pli;
|
||||
if (local_senders_.empty() || !pli.Parse(rtcp_packet_header)) {
|
||||
return;
|
||||
}
|
||||
rtcp::Remb remb;
|
||||
if (remb.Parse(rtcp_packet_header)) {
|
||||
config_.network_link_observer->OnReceiverEstimatedMaxBitrate(
|
||||
now, DataRate::BitsPerSec(remb.bitrate_bps()));
|
||||
auto it = local_senders_by_ssrc_.find(pli.media_ssrc());
|
||||
if (it != local_senders_by_ssrc_.end()) {
|
||||
it->second->handler->OnPli(pli.sender_ssrc());
|
||||
}
|
||||
}
|
||||
|
||||
void RtcpTransceiverImpl::HandleRemb(
|
||||
const rtcp::CommonHeader& rtcp_packet_header,
|
||||
Timestamp now) {
|
||||
rtcp::Remb remb;
|
||||
if (config_.network_link_observer == nullptr ||
|
||||
!remb.Parse(rtcp_packet_header)) {
|
||||
return;
|
||||
}
|
||||
config_.network_link_observer->OnReceiverEstimatedMaxBitrate(
|
||||
now, DataRate::BitsPerSec(remb.bitrate_bps()));
|
||||
}
|
||||
|
||||
void RtcpTransceiverImpl::HandleRtpFeedback(
|
||||
const rtcp::CommonHeader& rtcp_packet_header,
|
||||
Timestamp now) {
|
||||
|
||||
@ -105,6 +105,8 @@ class RtcpTransceiverImpl {
|
||||
Timestamp now);
|
||||
void HandleRtpFeedback(const rtcp::CommonHeader& rtcp_packet_header,
|
||||
Timestamp now);
|
||||
void HandlePli(const rtcp::CommonHeader& rtcp_packet_header);
|
||||
void HandleRemb(const rtcp::CommonHeader& rtcp_packet_header, Timestamp now);
|
||||
void HandleNack(const rtcp::CommonHeader& rtcp_packet_header);
|
||||
void HandleTransportFeedback(const rtcp::CommonHeader& rtcp_packet_header,
|
||||
Timestamp now);
|
||||
|
||||
@ -87,6 +87,7 @@ class MockRtpStreamRtcpHandler : public RtpStreamRtcpHandler {
|
||||
OnNack,
|
||||
(uint32_t, rtc::ArrayView<const uint16_t>),
|
||||
(override));
|
||||
MOCK_METHOD(void, OnPli, (uint32_t), (override));
|
||||
|
||||
private:
|
||||
int num_calls_ = 0;
|
||||
@ -1094,6 +1095,27 @@ TEST(RtcpTransceiverImplTest, RequestKeyFrameWithPictureLossIndication) {
|
||||
EXPECT_EQ(rtcp_parser.pli()->media_ssrc(), kRemoteSsrc);
|
||||
}
|
||||
|
||||
TEST(RtcpTransceiverImplTest, ReceivesPictureLossIndication) {
|
||||
static constexpr uint32_t kRemoteSsrc = 4321;
|
||||
static constexpr uint32_t kMediaSsrc1 = 1234;
|
||||
static constexpr uint32_t kMediaSsrc2 = 1235;
|
||||
RtcpTransceiverConfig config = DefaultTestConfig();
|
||||
RtcpTransceiverImpl rtcp_transceiver(config);
|
||||
|
||||
MockRtpStreamRtcpHandler local_stream1;
|
||||
MockRtpStreamRtcpHandler local_stream2;
|
||||
EXPECT_CALL(local_stream1, OnPli(kRemoteSsrc));
|
||||
EXPECT_CALL(local_stream2, OnPli).Times(0);
|
||||
|
||||
EXPECT_TRUE(rtcp_transceiver.AddMediaSender(kMediaSsrc1, &local_stream1));
|
||||
EXPECT_TRUE(rtcp_transceiver.AddMediaSender(kMediaSsrc2, &local_stream2));
|
||||
|
||||
rtcp::Pli pli;
|
||||
pli.SetSenderSsrc(kRemoteSsrc);
|
||||
pli.SetMediaSsrc(kMediaSsrc1);
|
||||
rtcp_transceiver.ReceivePacket(pli.Build(), config.clock->CurrentTime());
|
||||
}
|
||||
|
||||
TEST(RtcpTransceiverImplTest, RequestKeyFrameWithFullIntraRequest) {
|
||||
const uint32_t kSenderSsrc = 1234;
|
||||
const uint32_t kRemoteSsrcs[] = {4321, 5321};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user