diff --git a/modules/rtp_rtcp/source/rtcp_transceiver.cc b/modules/rtp_rtcp/source/rtcp_transceiver.cc index c0b829c53e..a5dd8dc941 100644 --- a/modules/rtp_rtcp/source/rtcp_transceiver.cc +++ b/modules/rtp_rtcp/source/rtcp_transceiver.cc @@ -106,18 +106,12 @@ void RtcpTransceiver::SendNack(uint32_t ssrc, task_queue_->PostTask(Closure{ptr_, ssrc, std::move(sequence_numbers)}); } -void RtcpTransceiver::SendPictureLossIndication(std::vector ssrcs) { - // TODO(danilchap): Replace with lambda with move capture when available. - struct Closure { - void operator()() { - if (ptr) - ptr->SendPictureLossIndication(ssrcs); - } - - rtc::WeakPtr ptr; - std::vector ssrcs; - }; - task_queue_->PostTask(Closure{ptr_, std::move(ssrcs)}); +void RtcpTransceiver::SendPictureLossIndication(uint32_t ssrc) { + rtc::WeakPtr ptr = ptr_; + task_queue_->PostTask([ptr, ssrc] { + if (ptr) + ptr->SendPictureLossIndication(ssrc); + }); } void RtcpTransceiver::SendFullIntraRequest(std::vector ssrcs) { diff --git a/modules/rtp_rtcp/source/rtcp_transceiver.h b/modules/rtp_rtcp/source/rtcp_transceiver.h index 417943a164..5388d18776 100644 --- a/modules/rtp_rtcp/source/rtcp_transceiver.h +++ b/modules/rtp_rtcp/source/rtcp_transceiver.h @@ -49,7 +49,7 @@ class RtcpTransceiver { // Requests new key frame. // using PLI, https://tools.ietf.org/html/rfc4585#section-6.3.1.1 - void SendPictureLossIndication(std::vector ssrcs); + void SendPictureLossIndication(uint32_t ssrc); // using FIR, https://tools.ietf.org/html/rfc5104#section-4.3.1.2 void SendFullIntraRequest(std::vector ssrcs); diff --git a/modules/rtp_rtcp/source/rtcp_transceiver_impl.cc b/modules/rtp_rtcp/source/rtcp_transceiver_impl.cc index fbe1717c2a..deb8c0df9c 100644 --- a/modules/rtp_rtcp/source/rtcp_transceiver_impl.cc +++ b/modules/rtp_rtcp/source/rtcp_transceiver_impl.cc @@ -134,39 +134,29 @@ void RtcpTransceiverImpl::UnsetRemb() { void RtcpTransceiverImpl::SendNack(uint32_t ssrc, std::vector sequence_numbers) { RTC_DCHECK(!sequence_numbers.empty()); - SendImmediateFeedback([&](PacketSender* sender) { - rtcp::Nack nack; - nack.SetSenderSsrc(config_.feedback_ssrc); - nack.SetMediaSsrc(ssrc); - nack.SetPacketIds(std::move(sequence_numbers)); - sender->AppendPacket(nack); - }); + rtcp::Nack nack; + nack.SetSenderSsrc(config_.feedback_ssrc); + nack.SetMediaSsrc(ssrc); + nack.SetPacketIds(std::move(sequence_numbers)); + SendImmediateFeedback(nack); } -void RtcpTransceiverImpl::SendPictureLossIndication( - rtc::ArrayView ssrcs) { - RTC_DCHECK(!ssrcs.empty()); - SendImmediateFeedback([this, ssrcs](PacketSender* sender) { - for (uint32_t media_ssrc : ssrcs) { - rtcp::Pli pli; - pli.SetSenderSsrc(config_.feedback_ssrc); - pli.SetMediaSsrc(media_ssrc); - sender->AppendPacket(pli); - } - }); +void RtcpTransceiverImpl::SendPictureLossIndication(uint32_t ssrc) { + rtcp::Pli pli; + pli.SetSenderSsrc(config_.feedback_ssrc); + pli.SetMediaSsrc(ssrc); + SendImmediateFeedback(pli); } void RtcpTransceiverImpl::SendFullIntraRequest( rtc::ArrayView ssrcs) { RTC_DCHECK(!ssrcs.empty()); - SendImmediateFeedback([this, ssrcs](PacketSender* sender) { - rtcp::Fir fir; - fir.SetSenderSsrc(config_.feedback_ssrc); - for (uint32_t media_ssrc : ssrcs) - fir.AddRequestTo(media_ssrc, - remote_senders_[media_ssrc].fir_sequence_number++); - sender->AppendPacket(fir); - }); + rtcp::Fir fir; + fir.SetSenderSsrc(config_.feedback_ssrc); + for (uint32_t media_ssrc : ssrcs) + fir.AddRequestTo(media_ssrc, + remote_senders_[media_ssrc].fir_sequence_number++); + SendImmediateFeedback(fir); } void RtcpTransceiverImpl::HandleReceivedPacket( @@ -255,15 +245,17 @@ void RtcpTransceiverImpl::SendPeriodicCompoundPacket() { } void RtcpTransceiverImpl::SendImmediateFeedback( - rtc::FunctionView append_feedback) { + const rtcp::RtcpPacket& rtcp_packet) { PacketSender sender(config_.outgoing_transport, config_.max_packet_size); + // Compound mode requires every sent rtcp packet to be compound, i.e. start + // with a sender or receiver report. if (config_.rtcp_mode == RtcpMode::kCompound) CreateCompoundPacket(&sender); - append_feedback(&sender); - + sender.AppendPacket(rtcp_packet); sender.Send(); + // If compound packet was sent, delay (reschedule) the periodic one. if (config_.rtcp_mode == RtcpMode::kCompound) ReschedulePeriodicCompoundPackets(); } diff --git a/modules/rtp_rtcp/source/rtcp_transceiver_impl.h b/modules/rtp_rtcp/source/rtcp_transceiver_impl.h index 8cde921213..c3193d058b 100644 --- a/modules/rtp_rtcp/source/rtcp_transceiver_impl.h +++ b/modules/rtp_rtcp/source/rtcp_transceiver_impl.h @@ -23,7 +23,6 @@ #include "modules/rtp_rtcp/source/rtcp_packet/report_block.h" #include "modules/rtp_rtcp/source/rtcp_transceiver_config.h" #include "rtc_base/constructormagic.h" -#include "rtc_base/function_view.h" #include "rtc_base/weak_ptr.h" #include "system_wrappers/include/ntp_time.h" @@ -46,7 +45,7 @@ class RtcpTransceiverImpl { void SendNack(uint32_t ssrc, std::vector sequence_numbers); - void SendPictureLossIndication(rtc::ArrayView ssrcs); + void SendPictureLossIndication(uint32_t ssrc); void SendFullIntraRequest(rtc::ArrayView ssrcs); private: @@ -63,8 +62,7 @@ class RtcpTransceiverImpl { void CreateCompoundPacket(PacketSender* sender); // Sends RTCP packets. void SendPeriodicCompoundPacket(); - void SendImmediateFeedback( - rtc::FunctionView append_feedback); + void SendImmediateFeedback(const rtcp::RtcpPacket& rtcp_packet); // Generate Report Blocks to be send in Sender or Receiver Report. std::vector CreateReportBlocks(); diff --git a/modules/rtp_rtcp/source/rtcp_transceiver_impl_unittest.cc b/modules/rtp_rtcp/source/rtcp_transceiver_impl_unittest.cc index 9690506854..b5f36b18b4 100644 --- a/modules/rtp_rtcp/source/rtcp_transceiver_impl_unittest.cc +++ b/modules/rtp_rtcp/source/rtcp_transceiver_impl_unittest.cc @@ -476,7 +476,7 @@ TEST(RtcpTransceiverImplTest, SendsNack) { TEST(RtcpTransceiverImplTest, RequestKeyFrameWithPictureLossIndication) { const uint32_t kSenderSsrc = 1234; - const uint32_t kRemoteSsrcs[] = {4321, 5321}; + const uint32_t kRemoteSsrc = 4321; RtcpTransceiverConfig config; config.feedback_ssrc = kSenderSsrc; config.schedule_periodic_compound_packets = false; @@ -485,14 +485,12 @@ TEST(RtcpTransceiverImplTest, RequestKeyFrameWithPictureLossIndication) { config.outgoing_transport = &transport; RtcpTransceiverImpl rtcp_transceiver(config); - rtcp_transceiver.SendPictureLossIndication(kRemoteSsrcs); + rtcp_transceiver.SendPictureLossIndication(kRemoteSsrc); - // Expect a pli packet per ssrc in the sent single compound packet. EXPECT_EQ(transport.num_packets(), 1); - EXPECT_EQ(rtcp_parser.pli()->num_packets(), 2); + EXPECT_EQ(rtcp_parser.pli()->num_packets(), 1); EXPECT_EQ(rtcp_parser.pli()->sender_ssrc(), kSenderSsrc); - // test::RtcpPacketParser overwrites first pli packet with second one. - EXPECT_EQ(rtcp_parser.pli()->media_ssrc(), kRemoteSsrcs[1]); + EXPECT_EQ(rtcp_parser.pli()->media_ssrc(), kRemoteSsrc); } TEST(RtcpTransceiverImplTest, RequestKeyFrameWithFullIntraRequest) {