tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

rtp_rtcp_impl2.cc (29591B)


      1 /*
      2 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
      3 *
      4 *  Use of this source code is governed by a BSD-style license
      5 *  that can be found in the LICENSE file in the root of the source
      6 *  tree. An additional intellectual property rights grant can be found
      7 *  in the file PATENTS.  All contributing project authors may
      8 *  be found in the AUTHORS file in the root of the source tree.
      9 */
     10 
     11 #include "modules/rtp_rtcp/source/rtp_rtcp_impl2.h"
     12 
     13 #include <cstdint>
     14 #include <cstring>
     15 #include <memory>
     16 #include <optional>
     17 #include <utility>
     18 #include <vector>
     19 
     20 #include "absl/functional/any_invocable.h"
     21 #include "absl/strings/string_view.h"
     22 #include "api/array_view.h"
     23 #include "api/environment/environment.h"
     24 #include "api/rtp_headers.h"
     25 #include "api/sequence_checker.h"
     26 #include "api/task_queue/pending_task_safety_flag.h"
     27 #include "api/task_queue/task_queue_base.h"
     28 #include "api/units/time_delta.h"
     29 #include "api/units/timestamp.h"
     30 #include "api/video/video_bitrate_allocation.h"
     31 #include "modules/include/module_fec_types.h"
     32 #include "modules/rtp_rtcp/include/report_block_data.h"
     33 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
     34 #include "modules/rtp_rtcp/source/ntp_time_util.h"
     35 #include "modules/rtp_rtcp/source/rtcp_packet.h"
     36 #include "modules/rtp_rtcp/source/rtcp_packet/tmmb_item.h"
     37 #include "modules/rtp_rtcp/source/rtcp_receiver.h"
     38 #include "modules/rtp_rtcp/source/rtcp_sender.h"
     39 #include "modules/rtp_rtcp/source/rtp_packet_history.h"
     40 #include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
     41 #include "modules/rtp_rtcp/source/rtp_rtcp_config.h"
     42 #include "modules/rtp_rtcp/source/rtp_rtcp_interface.h"
     43 #include "modules/rtp_rtcp/source/rtp_sender.h"
     44 #include "modules/rtp_rtcp/source/rtp_sequence_number_map.h"
     45 #include "rtc_base/checks.h"
     46 #include "rtc_base/logging.h"
     47 #include "rtc_base/synchronization/mutex.h"
     48 #include "rtc_base/task_utils/repeating_task.h"
     49 #include "system_wrappers/include/ntp_time.h"
     50 
     51 #ifdef _WIN32
     52 // Disable warning C4355: 'this' : used in base member initializer list.
     53 #pragma warning(disable : 4355)
     54 #endif
     55 
     56 namespace webrtc {
     57 namespace {
     58 constexpr TimeDelta kDefaultExpectedRetransmissionTime = TimeDelta::Millis(125);
     59 constexpr TimeDelta kRttUpdateInterval = TimeDelta::Millis(1000);
     60 }  // namespace
     61 
     62 ModuleRtpRtcpImpl2::RtpSenderContext::RtpSenderContext(
     63    const Environment& env,
     64    TaskQueueBase& worker_queue,
     65    const RtpRtcpInterface::Configuration& config)
     66    : packet_history(env, RtpPacketHistory::PaddingMode::kRecentLargePacket),
     67      sequencer(config.local_media_ssrc,
     68                config.rtx_send_ssrc,
     69                /*require_marker_before_media_padding=*/!config.audio,
     70                &env.clock()),
     71      packet_sender(env, config, &packet_history),
     72      non_paced_sender(worker_queue, &packet_sender, &sequencer),
     73      packet_generator(
     74          env,
     75          config,
     76          &packet_history,
     77          config.paced_sender ? config.paced_sender : &non_paced_sender) {}
     78 
     79 ModuleRtpRtcpImpl2::ModuleRtpRtcpImpl2(const Environment& env,
     80                                       const Configuration& configuration)
     81    : env_(env),
     82      worker_queue_(TaskQueueBase::Current()),
     83      rtcp_sender_(
     84          env_,
     85          {.audio = configuration.audio,
     86           .local_media_ssrc = configuration.local_media_ssrc,
     87           .outgoing_transport = configuration.outgoing_transport,
     88           .non_sender_rtt_measurement =
     89               configuration.non_sender_rtt_measurement,
     90           .schedule_next_rtcp_send_evaluation =
     91               [this](TimeDelta duration) {
     92                 ScheduleRtcpSendEvaluation(duration);
     93               },
     94           .rtcp_report_interval =
     95               configuration.rtcp_report_interval_ms > 0
     96                   ? TimeDelta::Millis(configuration.rtcp_report_interval_ms)
     97                   : (configuration.audio ? TimeDelta::Seconds(5)
     98                                          : TimeDelta::Seconds(1)),
     99           .receive_statistics = configuration.receive_statistics,
    100           .rtcp_packet_type_counter_observer =
    101               configuration.rtcp_packet_type_counter_observer}),
    102      rtcp_receiver_(env_, configuration, this),
    103      packet_overhead_(28),  // IPV4 UDP.
    104      nack_last_time_sent_full_ms_(0),
    105      nack_last_seq_number_sent_(0),
    106      rtt_stats_(configuration.rtt_stats),
    107      rtt_ms_(0) {
    108  RTC_DCHECK(worker_queue_);
    109  rtcp_thread_checker_.Detach();
    110  if (!configuration.receiver_only) {
    111    rtp_sender_ =
    112        std::make_unique<RtpSenderContext>(env_, *worker_queue_, configuration);
    113    rtp_sender_->sequencing_checker.Detach();
    114    // Make sure rtcp sender use same timestamp offset as rtp sender.
    115    rtcp_sender_.SetTimestampOffset(
    116        rtp_sender_->packet_generator.TimestampOffset());
    117    rtp_sender_->packet_sender.SetTimestampOffset(
    118        rtp_sender_->packet_generator.TimestampOffset());
    119  }
    120 
    121  // Set default packet size limit.
    122  // TODO(nisse): Kind-of duplicates
    123  // VideoSendStream::Config::Rtp::kDefaultMaxPacketSize.
    124  const size_t kTcpOverIpv4HeaderSize = 40;
    125  SetMaxRtpPacketSize(IP_PACKET_SIZE - kTcpOverIpv4HeaderSize);
    126  rtt_update_task_ = RepeatingTaskHandle::DelayedStart(
    127      worker_queue_, kRttUpdateInterval, [this]() {
    128        PeriodicUpdate();
    129        return kRttUpdateInterval;
    130      });
    131 }
    132 
    133 ModuleRtpRtcpImpl2::~ModuleRtpRtcpImpl2() {
    134  RTC_DCHECK_RUN_ON(worker_queue_);
    135  rtt_update_task_.Stop();
    136 }
    137 
    138 void ModuleRtpRtcpImpl2::SetRtxSendStatus(int mode) {
    139  rtp_sender_->packet_generator.SetRtxStatus(mode);
    140 }
    141 
    142 int ModuleRtpRtcpImpl2::RtxSendStatus() const {
    143  return rtp_sender_ ? rtp_sender_->packet_generator.RtxStatus() : kRtxOff;
    144 }
    145 
    146 void ModuleRtpRtcpImpl2::SetRtxSendPayloadType(int payload_type,
    147                                               int associated_payload_type) {
    148  rtp_sender_->packet_generator.SetRtxPayloadType(payload_type,
    149                                                  associated_payload_type);
    150 }
    151 
    152 std::optional<uint32_t> ModuleRtpRtcpImpl2::RtxSsrc() const {
    153  return rtp_sender_ ? rtp_sender_->packet_generator.RtxSsrc() : std::nullopt;
    154 }
    155 
    156 std::optional<uint32_t> ModuleRtpRtcpImpl2::FlexfecSsrc() const {
    157  if (rtp_sender_) {
    158    return rtp_sender_->packet_generator.FlexfecSsrc();
    159  }
    160  return std::nullopt;
    161 }
    162 
    163 void ModuleRtpRtcpImpl2::IncomingRtcpPacket(
    164    ArrayView<const uint8_t> rtcp_packet) {
    165  RTC_DCHECK_RUN_ON(&rtcp_thread_checker_);
    166  rtcp_receiver_.IncomingPacket(rtcp_packet);
    167 }
    168 
    169 void ModuleRtpRtcpImpl2::RegisterSendPayloadFrequency(int payload_type,
    170                                                      int payload_frequency) {
    171  rtcp_sender_.SetRtpClockRate(payload_type, payload_frequency);
    172 }
    173 
    174 int32_t ModuleRtpRtcpImpl2::DeRegisterSendPayload(
    175    const int8_t /* payload_type */) {
    176  return 0;
    177 }
    178 
    179 uint32_t ModuleRtpRtcpImpl2::StartTimestamp() const {
    180  return rtp_sender_->packet_generator.TimestampOffset();
    181 }
    182 
    183 // Configure start timestamp, default is a random number.
    184 void ModuleRtpRtcpImpl2::SetStartTimestamp(const uint32_t timestamp) {
    185  rtcp_sender_.SetTimestampOffset(timestamp);
    186  rtp_sender_->packet_generator.SetTimestampOffset(timestamp);
    187  rtp_sender_->packet_sender.SetTimestampOffset(timestamp);
    188 }
    189 
    190 uint16_t ModuleRtpRtcpImpl2::SequenceNumber() const {
    191  RTC_DCHECK_RUN_ON(&rtp_sender_->sequencing_checker);
    192  return rtp_sender_->sequencer.media_sequence_number();
    193 }
    194 
    195 // Set SequenceNumber, default is a random number.
    196 void ModuleRtpRtcpImpl2::SetSequenceNumber(const uint16_t seq_num) {
    197  RTC_DCHECK_RUN_ON(&rtp_sender_->sequencing_checker);
    198  if (rtp_sender_->sequencer.media_sequence_number() != seq_num) {
    199    rtp_sender_->sequencer.set_media_sequence_number(seq_num);
    200    rtp_sender_->packet_history.Clear();
    201  }
    202 }
    203 
    204 void ModuleRtpRtcpImpl2::SetRtpState(const RtpState& rtp_state) {
    205  RTC_DCHECK_RUN_ON(&rtp_sender_->sequencing_checker);
    206  rtp_sender_->packet_generator.SetRtpState(rtp_state);
    207  rtp_sender_->sequencer.SetRtpState(rtp_state);
    208  rtcp_sender_.SetTimestampOffset(rtp_state.start_timestamp);
    209  rtp_sender_->packet_sender.SetTimestampOffset(rtp_state.start_timestamp);
    210 }
    211 
    212 void ModuleRtpRtcpImpl2::SetRtxState(const RtpState& rtp_state) {
    213  RTC_DCHECK_RUN_ON(&rtp_sender_->sequencing_checker);
    214  rtp_sender_->packet_generator.SetRtxRtpState(rtp_state);
    215  rtp_sender_->sequencer.set_rtx_sequence_number(rtp_state.sequence_number);
    216 }
    217 
    218 RtpState ModuleRtpRtcpImpl2::GetRtpState() const {
    219  RTC_DCHECK_RUN_ON(&rtp_sender_->sequencing_checker);
    220  RtpState state = rtp_sender_->packet_generator.GetRtpState();
    221  rtp_sender_->sequencer.PopulateRtpState(state);
    222  return state;
    223 }
    224 
    225 RtpState ModuleRtpRtcpImpl2::GetRtxState() const {
    226  RTC_DCHECK_RUN_ON(&rtp_sender_->sequencing_checker);
    227  RtpState state = rtp_sender_->packet_generator.GetRtxRtpState();
    228  state.sequence_number = rtp_sender_->sequencer.rtx_sequence_number();
    229  return state;
    230 }
    231 
    232 void ModuleRtpRtcpImpl2::SetNonSenderRttMeasurement(bool enabled) {
    233  rtcp_sender_.SetNonSenderRttMeasurement(enabled);
    234  rtcp_receiver_.SetNonSenderRttMeasurement(enabled);
    235 }
    236 
    237 uint32_t ModuleRtpRtcpImpl2::local_media_ssrc() const {
    238  RTC_DCHECK_RUN_ON(&rtcp_thread_checker_);
    239  RTC_DCHECK_EQ(rtcp_receiver_.local_media_ssrc(), rtcp_sender_.SSRC());
    240  return rtcp_receiver_.local_media_ssrc();
    241 }
    242 
    243 void ModuleRtpRtcpImpl2::SetMid(absl::string_view mid) {
    244  if (rtp_sender_) {
    245    rtp_sender_->packet_generator.SetMid(mid);
    246  }
    247  // TODO(bugs.webrtc.org/4050): If we end up supporting the MID SDES item for
    248  // RTCP, this will need to be passed down to the RTCPSender also.
    249 }
    250 
    251 // TODO(pbos): Handle media and RTX streams separately (separate RTCP
    252 // feedbacks).
    253 RTCPSender::FeedbackState ModuleRtpRtcpImpl2::GetFeedbackState() {
    254  // TODO(bugs.webrtc.org/11581): Called by potentially multiple threads.
    255  // Mostly "Send*" methods. Make sure it's only called on the
    256  // construction thread.
    257 
    258  RTCPSender::FeedbackState state;
    259  // This is called also when receiver_only is true. Hence below
    260  // checks that rtp_sender_ exists.
    261  if (rtp_sender_) {
    262    StreamDataCounters rtp_stats;
    263    StreamDataCounters rtx_stats;
    264    rtp_sender_->packet_sender.GetDataCounters(&rtp_stats, &rtx_stats);
    265    state.packets_sent =
    266        rtp_stats.transmitted.packets + rtx_stats.transmitted.packets;
    267    state.media_bytes_sent = rtp_stats.transmitted.payload_bytes +
    268                             rtx_stats.transmitted.payload_bytes;
    269    state.send_bitrate =
    270        rtp_sender_->packet_sender.GetSendRates(env_.clock().CurrentTime())
    271            .Sum();
    272  }
    273  state.receiver = &rtcp_receiver_;
    274 
    275  if (std::optional<RtpRtcpInterface::SenderReportStats> last_sr =
    276          rtcp_receiver_.GetSenderReportStats();
    277      last_sr.has_value()) {
    278    state.remote_sr = CompactNtp(last_sr->last_remote_ntp_timestamp);
    279    state.last_rr = last_sr->last_arrival_ntp_timestamp;
    280  }
    281 
    282  state.last_xr_rtis = rtcp_receiver_.ConsumeReceivedXrReferenceTimeInfo();
    283 
    284  return state;
    285 }
    286 
    287 int32_t ModuleRtpRtcpImpl2::SetSendingStatus(const bool sending) {
    288  if (rtcp_sender_.Sending() != sending) {
    289    // Sends RTCP BYE when going from true to false
    290    rtcp_sender_.SetSendingStatus(GetFeedbackState(), sending);
    291  }
    292  return 0;
    293 }
    294 
    295 bool ModuleRtpRtcpImpl2::Sending() const {
    296  return rtcp_sender_.Sending();
    297 }
    298 
    299 void ModuleRtpRtcpImpl2::SetSendingMediaStatus(const bool sending) {
    300  rtp_sender_->packet_generator.SetSendingMediaStatus(sending);
    301 }
    302 
    303 bool ModuleRtpRtcpImpl2::SendingMedia() const {
    304  return rtp_sender_ ? rtp_sender_->packet_generator.SendingMedia() : false;
    305 }
    306 
    307 bool ModuleRtpRtcpImpl2::IsAudioConfigured() const {
    308  return rtp_sender_ ? rtp_sender_->packet_generator.IsAudioConfigured()
    309                     : false;
    310 }
    311 
    312 void ModuleRtpRtcpImpl2::SetAsPartOfAllocation(bool part_of_allocation) {
    313  RTC_CHECK(rtp_sender_);
    314  rtp_sender_->packet_sender.ForceIncludeSendPacketsInAllocation(
    315      part_of_allocation);
    316 }
    317 
    318 bool ModuleRtpRtcpImpl2::OnSendingRtpFrame(uint32_t timestamp,
    319                                           int64_t capture_time_ms,
    320                                           int payload_type,
    321                                           bool force_sender_report) {
    322  if (!Sending()) {
    323    return false;
    324  }
    325  // TODO(bugs.webrtc.org/12873): Migrate this method and it's users to use
    326  // optional Timestamps.
    327  std::optional<Timestamp> capture_time;
    328  if (capture_time_ms > 0) {
    329    capture_time = Timestamp::Millis(capture_time_ms);
    330  }
    331  std::optional<int> payload_type_optional;
    332  if (payload_type >= 0)
    333    payload_type_optional = payload_type;
    334 
    335  auto closure = [this, timestamp, capture_time, payload_type_optional,
    336                  force_sender_report] {
    337    RTC_DCHECK_RUN_ON(worker_queue_);
    338    rtcp_sender_.SetLastRtpTime(timestamp, capture_time, payload_type_optional);
    339    // Make sure an RTCP report isn't queued behind a key frame.
    340    if (rtcp_sender_.TimeToSendRTCPReport(force_sender_report))
    341      rtcp_sender_.SendRTCP(GetFeedbackState(), kRtcpReport);
    342  };
    343  if (worker_queue_->IsCurrent()) {
    344    closure();
    345  } else {
    346    worker_queue_->PostTask(SafeTask(task_safety_.flag(), std::move(closure)));
    347  }
    348  return true;
    349 }
    350 
    351 bool ModuleRtpRtcpImpl2::CanSendPacket(const RtpPacketToSend& packet) const {
    352  RTC_DCHECK(rtp_sender_);
    353  RTC_DCHECK_RUN_ON(&rtp_sender_->sequencing_checker);
    354  if (!rtp_sender_->packet_generator.SendingMedia()) {
    355    return false;
    356  }
    357  if (packet.packet_type() == RtpPacketMediaType::kPadding &&
    358      packet.Ssrc() == rtp_sender_->packet_generator.SSRC() &&
    359      !rtp_sender_->sequencer.CanSendPaddingOnMediaSsrc()) {
    360    // New media packet preempted this generated padding packet, discard it.
    361    return false;
    362  }
    363  return true;
    364 }
    365 
    366 void ModuleRtpRtcpImpl2::AssignSequenceNumber(RtpPacketToSend& packet) {
    367  RTC_DCHECK_RUN_ON(&rtp_sender_->sequencing_checker);
    368  bool is_flexfec =
    369      packet.packet_type() == RtpPacketMediaType::kForwardErrorCorrection &&
    370      packet.Ssrc() == rtp_sender_->packet_generator.FlexfecSsrc();
    371  if (!is_flexfec) {
    372    rtp_sender_->sequencer.Sequence(packet);
    373  }
    374 }
    375 
    376 void ModuleRtpRtcpImpl2::SendPacket(std::unique_ptr<RtpPacketToSend> packet,
    377                                    const PacedPacketInfo& pacing_info) {
    378  RTC_DCHECK_RUN_ON(&rtp_sender_->sequencing_checker);
    379  RTC_DCHECK(CanSendPacket(*packet));
    380  rtp_sender_->packet_sender.SendPacket(std::move(packet), pacing_info);
    381 }
    382 
    383 bool ModuleRtpRtcpImpl2::TrySendPacket(std::unique_ptr<RtpPacketToSend> packet,
    384                                       const PacedPacketInfo& pacing_info) {
    385  if (!packet || !CanSendPacket(*packet)) {
    386    return false;
    387  }
    388  AssignSequenceNumber(*packet);
    389  SendPacket(std::move(packet), pacing_info);
    390  return true;
    391 }
    392 
    393 void ModuleRtpRtcpImpl2::OnBatchComplete() {
    394  RTC_DCHECK(rtp_sender_);
    395  rtp_sender_->packet_sender.OnBatchComplete();
    396 }
    397 
    398 void ModuleRtpRtcpImpl2::SetFecProtectionParams(
    399    const FecProtectionParams& delta_params,
    400    const FecProtectionParams& key_params) {
    401  RTC_DCHECK(rtp_sender_);
    402  rtp_sender_->packet_sender.SetFecProtectionParameters(delta_params,
    403                                                        key_params);
    404 }
    405 
    406 std::vector<std::unique_ptr<RtpPacketToSend>>
    407 ModuleRtpRtcpImpl2::FetchFecPackets() {
    408  RTC_DCHECK(rtp_sender_);
    409  RTC_DCHECK_RUN_ON(&rtp_sender_->sequencing_checker);
    410  return rtp_sender_->packet_sender.FetchFecPackets();
    411 }
    412 
    413 void ModuleRtpRtcpImpl2::OnAbortedRetransmissions(
    414    ArrayView<const uint16_t> sequence_numbers) {
    415  RTC_DCHECK(rtp_sender_);
    416  RTC_DCHECK_RUN_ON(&rtp_sender_->sequencing_checker);
    417  rtp_sender_->packet_sender.OnAbortedRetransmissions(sequence_numbers);
    418 }
    419 
    420 void ModuleRtpRtcpImpl2::OnPacketsAcknowledged(
    421    ArrayView<const uint16_t> sequence_numbers) {
    422  RTC_DCHECK(rtp_sender_);
    423  rtp_sender_->packet_history.CullAcknowledgedPackets(sequence_numbers);
    424 }
    425 
    426 bool ModuleRtpRtcpImpl2::SupportsPadding() const {
    427  RTC_DCHECK(rtp_sender_);
    428  return rtp_sender_->packet_generator.SupportsPadding();
    429 }
    430 
    431 bool ModuleRtpRtcpImpl2::SupportsRtxPayloadPadding() const {
    432  RTC_DCHECK(rtp_sender_);
    433  return rtp_sender_->packet_generator.SupportsRtxPayloadPadding();
    434 }
    435 
    436 std::vector<std::unique_ptr<RtpPacketToSend>>
    437 ModuleRtpRtcpImpl2::GeneratePadding(size_t target_size_bytes) {
    438  RTC_DCHECK(rtp_sender_);
    439  RTC_DCHECK_RUN_ON(&rtp_sender_->sequencing_checker);
    440 
    441  return rtp_sender_->packet_generator.GeneratePadding(
    442      target_size_bytes, rtp_sender_->packet_sender.MediaHasBeenSent(),
    443      rtp_sender_->sequencer.CanSendPaddingOnMediaSsrc());
    444 }
    445 
    446 std::vector<RtpSequenceNumberMap::Info>
    447 ModuleRtpRtcpImpl2::GetSentRtpPacketInfos(
    448    ArrayView<const uint16_t> sequence_numbers) const {
    449  RTC_DCHECK(rtp_sender_);
    450  return rtp_sender_->packet_sender.GetSentRtpPacketInfos(sequence_numbers);
    451 }
    452 
    453 size_t ModuleRtpRtcpImpl2::ExpectedPerPacketOverhead() const {
    454  if (!rtp_sender_) {
    455    return 0;
    456  }
    457  return rtp_sender_->packet_generator.ExpectedPerPacketOverhead();
    458 }
    459 
    460 void ModuleRtpRtcpImpl2::OnPacketSendingThreadSwitched() {
    461  // Ownership of sequencing is being transferred to another thread.
    462  rtp_sender_->sequencing_checker.Detach();
    463 }
    464 
    465 size_t ModuleRtpRtcpImpl2::MaxRtpPacketSize() const {
    466  RTC_DCHECK(rtp_sender_);
    467  return rtp_sender_->packet_generator.MaxRtpPacketSize();
    468 }
    469 
    470 void ModuleRtpRtcpImpl2::SetMaxRtpPacketSize(size_t rtp_packet_size) {
    471  RTC_DCHECK_LE(rtp_packet_size, IP_PACKET_SIZE)
    472      << "rtp packet size too large: " << rtp_packet_size;
    473  RTC_DCHECK_GT(rtp_packet_size, packet_overhead_)
    474      << "rtp packet size too small: " << rtp_packet_size;
    475 
    476  rtcp_sender_.SetMaxRtpPacketSize(rtp_packet_size);
    477  if (rtp_sender_) {
    478    rtp_sender_->packet_generator.SetMaxRtpPacketSize(rtp_packet_size);
    479  }
    480 }
    481 
    482 RtcpMode ModuleRtpRtcpImpl2::RTCP() const {
    483  return rtcp_sender_.Status();
    484 }
    485 
    486 // Configure RTCP status i.e on/off.
    487 void ModuleRtpRtcpImpl2::SetRTCPStatus(const RtcpMode method) {
    488  rtcp_sender_.SetRTCPStatus(method);
    489 }
    490 
    491 int32_t ModuleRtpRtcpImpl2::SetCNAME(absl::string_view c_name) {
    492  return rtcp_sender_.SetCNAME(c_name);
    493 }
    494 
    495 std::optional<TimeDelta> ModuleRtpRtcpImpl2::LastRtt() const {
    496  std::optional<TimeDelta> rtt = rtcp_receiver_.LastRtt();
    497  if (!rtt.has_value()) {
    498    MutexLock lock(&mutex_rtt_);
    499    if (rtt_ms_ > 0) {
    500      rtt = TimeDelta::Millis(rtt_ms_);
    501    }
    502  }
    503  return rtt;
    504 }
    505 
    506 TimeDelta ModuleRtpRtcpImpl2::ExpectedRetransmissionTime() const {
    507  int64_t expected_retransmission_time_ms = rtt_ms();
    508  if (expected_retransmission_time_ms > 0) {
    509    return TimeDelta::Millis(expected_retransmission_time_ms);
    510  }
    511  // No rtt available (`kRttUpdateInterval` not yet passed?), so try to
    512  // poll avg_rtt_ms directly from rtcp receiver.
    513  if (std::optional<TimeDelta> rtt = rtcp_receiver_.AverageRtt()) {
    514    return *rtt;
    515  }
    516  return kDefaultExpectedRetransmissionTime;
    517 }
    518 
    519 // Force a send of an RTCP packet.
    520 // Normal SR and RR are triggered via the process function.
    521 int32_t ModuleRtpRtcpImpl2::SendRTCP(RTCPPacketType packet_type) {
    522  return rtcp_sender_.SendRTCP(GetFeedbackState(), packet_type);
    523 }
    524 
    525 void ModuleRtpRtcpImpl2::GetSendStreamDataCounters(
    526    StreamDataCounters* rtp_counters,
    527    StreamDataCounters* rtx_counters) const {
    528  rtp_sender_->packet_sender.GetDataCounters(rtp_counters, rtx_counters);
    529 }
    530 
    531 // Received RTCP report.
    532 void ModuleRtpRtcpImpl2::RemoteRTCPSenderInfo(
    533    uint32_t* packet_count, uint32_t* octet_count, int64_t* ntp_timestamp_ms,
    534    int64_t* remote_ntp_timestamp_ms) const {
    535  return rtcp_receiver_.RemoteRTCPSenderInfo(
    536      packet_count, octet_count, ntp_timestamp_ms, remote_ntp_timestamp_ms);
    537 }
    538 
    539 std::vector<ReportBlockData> ModuleRtpRtcpImpl2::GetLatestReportBlockData()
    540    const {
    541  return rtcp_receiver_.GetLatestReportBlockData();
    542 }
    543 
    544 std::optional<RtpRtcpInterface::SenderReportStats>
    545 ModuleRtpRtcpImpl2::GetSenderReportStats() const {
    546  return rtcp_receiver_.GetSenderReportStats();
    547 }
    548 
    549 std::optional<RtpRtcpInterface::NonSenderRttStats>
    550 ModuleRtpRtcpImpl2::GetNonSenderRttStats() const {
    551  RTCPReceiver::NonSenderRttStats non_sender_rtt_stats =
    552      rtcp_receiver_.GetNonSenderRTT();
    553  return {{
    554      .round_trip_time = non_sender_rtt_stats.round_trip_time(),
    555      .total_round_trip_time = non_sender_rtt_stats.total_round_trip_time(),
    556      .round_trip_time_measurements =
    557          non_sender_rtt_stats.round_trip_time_measurements(),
    558  }};
    559 }
    560 
    561 // (REMB) Receiver Estimated Max Bitrate.
    562 void ModuleRtpRtcpImpl2::SetRemb(int64_t bitrate_bps,
    563                                 std::vector<uint32_t> ssrcs) {
    564  rtcp_sender_.SetRemb(bitrate_bps, std::move(ssrcs));
    565 }
    566 
    567 void ModuleRtpRtcpImpl2::UnsetRemb() {
    568  rtcp_sender_.UnsetRemb();
    569 }
    570 
    571 void ModuleRtpRtcpImpl2::SetExtmapAllowMixed(bool extmap_allow_mixed) {
    572  rtp_sender_->packet_generator.SetExtmapAllowMixed(extmap_allow_mixed);
    573 }
    574 
    575 void ModuleRtpRtcpImpl2::RegisterRtpHeaderExtension(absl::string_view uri,
    576                                                    int id) {
    577  bool registered =
    578      rtp_sender_->packet_generator.RegisterRtpHeaderExtension(uri, id);
    579  RTC_CHECK(registered);
    580 }
    581 
    582 void ModuleRtpRtcpImpl2::DeregisterSendRtpHeaderExtension(
    583    absl::string_view uri) {
    584  rtp_sender_->packet_generator.DeregisterRtpHeaderExtension(uri);
    585 }
    586 
    587 void ModuleRtpRtcpImpl2::SetTmmbn(std::vector<rtcp::TmmbItem> bounding_set) {
    588  rtcp_sender_.SetTmmbn(std::move(bounding_set));
    589 }
    590 
    591 // Send a Negative acknowledgment packet.
    592 int32_t ModuleRtpRtcpImpl2::SendNACK(const uint16_t* nack_list,
    593                                     const uint16_t size) {
    594  uint16_t nack_length = size;
    595  uint16_t start_id = 0;
    596  int64_t now_ms = env_.clock().TimeInMilliseconds();
    597  if (TimeToSendFullNackList(now_ms)) {
    598    nack_last_time_sent_full_ms_ = now_ms;
    599  } else {
    600    // Only send extended list.
    601    if (nack_last_seq_number_sent_ == nack_list[size - 1]) {
    602      // Last sequence number is the same, do not send list.
    603      return 0;
    604    }
    605    // Send new sequence numbers.
    606    for (int i = 0; i < size; ++i) {
    607      if (nack_last_seq_number_sent_ == nack_list[i]) {
    608        start_id = i + 1;
    609        break;
    610      }
    611    }
    612    nack_length = size - start_id;
    613  }
    614 
    615  // Our RTCP NACK implementation is limited to kRtcpMaxNackFields sequence
    616  // numbers per RTCP packet.
    617  if (nack_length > kRtcpMaxNackFields) {
    618    nack_length = kRtcpMaxNackFields;
    619  }
    620  nack_last_seq_number_sent_ = nack_list[start_id + nack_length - 1];
    621 
    622  return rtcp_sender_.SendRTCP(
    623      GetFeedbackState(), kRtcpNack,
    624      MakeArrayView(&nack_list[start_id], nack_length));
    625 }
    626 
    627 void ModuleRtpRtcpImpl2::SendNack(
    628    const std::vector<uint16_t>& sequence_numbers) {
    629  rtcp_sender_.SendRTCP(GetFeedbackState(), kRtcpNack, sequence_numbers);
    630 }
    631 
    632 bool ModuleRtpRtcpImpl2::TimeToSendFullNackList(int64_t now) const {
    633  // Use RTT from RtcpRttStats class if provided.
    634  int64_t rtt = rtt_ms();
    635  if (rtt == 0) {
    636    if (std::optional<TimeDelta> average_rtt = rtcp_receiver_.AverageRtt()) {
    637      rtt = average_rtt->ms();
    638    }
    639  }
    640 
    641  const int64_t kStartUpRttMs = 100;
    642  int64_t wait_time = 5 + ((rtt * 3) >> 1);  // 5 + RTT * 1.5.
    643  if (rtt == 0) {
    644    wait_time = kStartUpRttMs;
    645  }
    646 
    647  // Send a full NACK list once within every `wait_time`.
    648  return now - nack_last_time_sent_full_ms_ > wait_time;
    649 }
    650 
    651 // Store the sent packets, needed to answer to Negative acknowledgment requests.
    652 void ModuleRtpRtcpImpl2::SetStorePacketsStatus(const bool enable,
    653                                               const uint16_t number_to_store) {
    654  rtp_sender_->packet_history.SetStorePacketsStatus(
    655      enable ? RtpPacketHistory::StorageMode::kStoreAndCull
    656             : RtpPacketHistory::StorageMode::kDisabled,
    657      number_to_store);
    658 }
    659 
    660 bool ModuleRtpRtcpImpl2::StorePackets() const {
    661  return rtp_sender_->packet_history.GetStorageMode() !=
    662         RtpPacketHistory::StorageMode::kDisabled;
    663 }
    664 
    665 void ModuleRtpRtcpImpl2::SendCombinedRtcpPacket(
    666    std::vector<std::unique_ptr<rtcp::RtcpPacket>> rtcp_packets) {
    667  rtcp_sender_.SendCombinedRtcpPacket(std::move(rtcp_packets));
    668 }
    669 
    670 int32_t ModuleRtpRtcpImpl2::SendLossNotification(uint16_t last_decoded_seq_num,
    671                                                 uint16_t last_received_seq_num,
    672                                                 bool decodability_flag,
    673                                                 bool buffering_allowed) {
    674  return rtcp_sender_.SendLossNotification(
    675      GetFeedbackState(), last_decoded_seq_num, last_received_seq_num,
    676      decodability_flag, buffering_allowed);
    677 }
    678 
    679 void ModuleRtpRtcpImpl2::SetRemoteSSRC(const uint32_t ssrc) {
    680  // Inform about the incoming SSRC.
    681  rtcp_sender_.SetRemoteSSRC(ssrc);
    682  rtcp_receiver_.SetRemoteSSRC(ssrc);
    683 }
    684 
    685 void ModuleRtpRtcpImpl2::SetLocalSsrc(uint32_t local_ssrc) {
    686  RTC_DCHECK_RUN_ON(&rtcp_thread_checker_);
    687  rtcp_receiver_.set_local_media_ssrc(local_ssrc);
    688  rtcp_sender_.SetSsrc(local_ssrc);
    689 }
    690 
    691 RtpSendRates ModuleRtpRtcpImpl2::GetSendRates() const {
    692  RTC_DCHECK_RUN_ON(&rtp_sender_->sequencing_checker);
    693  return rtp_sender_->packet_sender.GetSendRates(env_.clock().CurrentTime());
    694 }
    695 
    696 void ModuleRtpRtcpImpl2::OnRequestSendReport() {
    697  SendRTCP(kRtcpSr);
    698 }
    699 
    700 void ModuleRtpRtcpImpl2::OnReceivedNack(
    701    const std::vector<uint16_t>& nack_sequence_numbers) {
    702  if (!rtp_sender_)
    703    return;
    704 
    705  if (!StorePackets() || nack_sequence_numbers.empty()) {
    706    return;
    707  }
    708  // Use RTT from RtcpRttStats class if provided.
    709  int64_t rtt = rtt_ms();
    710  if (rtt == 0) {
    711    if (std::optional<TimeDelta> average_rtt = rtcp_receiver_.AverageRtt()) {
    712      rtt = average_rtt->ms();
    713    }
    714  }
    715  rtp_sender_->packet_generator.OnReceivedNack(nack_sequence_numbers, rtt);
    716 }
    717 
    718 void ModuleRtpRtcpImpl2::OnReceivedRtcpReportBlocks(
    719    ArrayView<const ReportBlockData> report_blocks) {
    720  if (rtp_sender_) {
    721    uint32_t ssrc = SSRC();
    722    std::optional<uint32_t> rtx_ssrc;
    723    if (rtp_sender_->packet_generator.RtxStatus() != kRtxOff) {
    724      rtx_ssrc = rtp_sender_->packet_generator.RtxSsrc();
    725    }
    726 
    727    for (const ReportBlockData& report_block : report_blocks) {
    728      if (ssrc == report_block.source_ssrc()) {
    729        rtp_sender_->packet_generator.OnReceivedAckOnSsrc(
    730            report_block.extended_highest_sequence_number());
    731      } else if (rtx_ssrc == report_block.source_ssrc()) {
    732        rtp_sender_->packet_generator.OnReceivedAckOnRtxSsrc(
    733            report_block.extended_highest_sequence_number());
    734      }
    735    }
    736  }
    737 }
    738 
    739 void ModuleRtpRtcpImpl2::set_rtt_ms(int64_t rtt_ms) {
    740  RTC_DCHECK_RUN_ON(worker_queue_);
    741  {
    742    MutexLock lock(&mutex_rtt_);
    743    rtt_ms_ = rtt_ms;
    744  }
    745  if (rtp_sender_) {
    746    rtp_sender_->packet_history.SetRtt(TimeDelta::Millis(rtt_ms));
    747  }
    748 }
    749 
    750 int64_t ModuleRtpRtcpImpl2::rtt_ms() const {
    751  MutexLock lock(&mutex_rtt_);
    752  return rtt_ms_;
    753 }
    754 
    755 void ModuleRtpRtcpImpl2::SetVideoBitrateAllocation(
    756    const VideoBitrateAllocation& bitrate) {
    757  rtcp_sender_.SetVideoBitrateAllocation(bitrate);
    758 }
    759 
    760 RTPSender* ModuleRtpRtcpImpl2::RtpSender() {
    761  return rtp_sender_ ? &rtp_sender_->packet_generator : nullptr;
    762 }
    763 
    764 const RTPSender* ModuleRtpRtcpImpl2::RtpSender() const {
    765  return rtp_sender_ ? &rtp_sender_->packet_generator : nullptr;
    766 }
    767 
    768 void ModuleRtpRtcpImpl2::PeriodicUpdate() {
    769  RTC_DCHECK_RUN_ON(worker_queue_);
    770 
    771  Timestamp check_since = env_.clock().CurrentTime() - kRttUpdateInterval;
    772  std::optional<TimeDelta> rtt =
    773      rtcp_receiver_.OnPeriodicRttUpdate(check_since, rtcp_sender_.Sending());
    774  if (rtt) {
    775    if (rtt_stats_) {
    776      rtt_stats_->OnRttUpdate(rtt->ms());
    777    }
    778    set_rtt_ms(rtt->ms());
    779  }
    780 }
    781 
    782 void ModuleRtpRtcpImpl2::MaybeSendRtcp() {
    783  RTC_DCHECK_RUN_ON(worker_queue_);
    784  if (rtcp_sender_.TimeToSendRTCPReport())
    785    rtcp_sender_.SendRTCP(GetFeedbackState(), kRtcpReport);
    786 }
    787 
    788 // TODO(bugs.webrtc.org/12889): Consider removing this function when the issue
    789 // is resolved.
    790 void ModuleRtpRtcpImpl2::MaybeSendRtcpAtOrAfterTimestamp(
    791    Timestamp execution_time) {
    792  RTC_DCHECK_RUN_ON(worker_queue_);
    793  Timestamp now = env_.clock().CurrentTime();
    794  if (now >= execution_time) {
    795    MaybeSendRtcp();
    796    return;
    797  }
    798 
    799  TimeDelta delta = execution_time - now;
    800  // TaskQueue may run task 1ms earlier, so don't print warning if in this case.
    801  if (delta > TimeDelta::Millis(1)) {
    802    RTC_DLOG(LS_WARNING) << "BUGBUG: Task queue scheduled delayed call "
    803                         << delta << " too early.";
    804  }
    805 
    806  ScheduleMaybeSendRtcpAtOrAfterTimestamp(execution_time, delta);
    807 }
    808 
    809 void ModuleRtpRtcpImpl2::ScheduleRtcpSendEvaluation(TimeDelta duration) {
    810  // We end up here under various sequences including the worker queue, and
    811  // the RTCPSender lock is held.
    812  // We're assuming that the fact that RTCPSender executes under other sequences
    813  // than the worker queue on which it's created on implies that external
    814  // synchronization is present and removes this activity before destruction.
    815  if (duration.IsZero()) {
    816    worker_queue_->PostTask(SafeTask(task_safety_.flag(), [this] {
    817      RTC_DCHECK_RUN_ON(worker_queue_);
    818      MaybeSendRtcp();
    819    }));
    820  } else {
    821    Timestamp execution_time = env_.clock().CurrentTime() + duration;
    822    ScheduleMaybeSendRtcpAtOrAfterTimestamp(execution_time, duration);
    823  }
    824 }
    825 
    826 void ModuleRtpRtcpImpl2::ScheduleMaybeSendRtcpAtOrAfterTimestamp(
    827    Timestamp execution_time,
    828    TimeDelta duration) {
    829  // We end up here under various sequences including the worker queue, and
    830  // the RTCPSender lock is held.
    831  // See note in ScheduleRtcpSendEvaluation about why `worker_queue_` can be
    832  // accessed.
    833  worker_queue_->PostDelayedTask(
    834      SafeTask(task_safety_.flag(),
    835               [this, execution_time] {
    836                 RTC_DCHECK_RUN_ON(worker_queue_);
    837                 MaybeSendRtcpAtOrAfterTimestamp(execution_time);
    838               }),
    839      duration.RoundUpTo(TimeDelta::Millis(1)));
    840 }
    841 
    842 }  // namespace webrtc