Home | History | Annotate | Download | only in source
      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 "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h"
     12 
     13 #include <string.h>
     14 
     15 #include <set>
     16 
     17 #include "webrtc/base/checks.h"
     18 #include "webrtc/base/logging.h"
     19 #include "webrtc/common_types.h"
     20 #include "webrtc/system_wrappers/include/trace.h"
     21 
     22 #ifdef _WIN32
     23 // Disable warning C4355: 'this' : used in base member initializer list.
     24 #pragma warning(disable : 4355)
     25 #endif
     26 
     27 namespace webrtc {
     28 
     29 RtpRtcp::Configuration::Configuration()
     30     : audio(false),
     31       receiver_only(false),
     32       clock(nullptr),
     33       receive_statistics(NullObjectReceiveStatistics()),
     34       outgoing_transport(nullptr),
     35       intra_frame_callback(nullptr),
     36       bandwidth_callback(nullptr),
     37       transport_feedback_callback(nullptr),
     38       rtt_stats(nullptr),
     39       rtcp_packet_type_counter_observer(nullptr),
     40       audio_messages(NullObjectRtpAudioFeedback()),
     41       remote_bitrate_estimator(nullptr),
     42       paced_sender(nullptr),
     43       transport_sequence_number_allocator(nullptr),
     44       send_bitrate_observer(nullptr),
     45       send_frame_count_observer(nullptr),
     46       send_side_delay_observer(nullptr) {}
     47 
     48 RtpRtcp* RtpRtcp::CreateRtpRtcp(const RtpRtcp::Configuration& configuration) {
     49   if (configuration.clock) {
     50     return new ModuleRtpRtcpImpl(configuration);
     51   } else {
     52     // No clock implementation provided, use default clock.
     53     RtpRtcp::Configuration configuration_copy;
     54     memcpy(&configuration_copy, &configuration,
     55            sizeof(RtpRtcp::Configuration));
     56     configuration_copy.clock = Clock::GetRealTimeClock();
     57     return new ModuleRtpRtcpImpl(configuration_copy);
     58   }
     59 }
     60 
     61 ModuleRtpRtcpImpl::ModuleRtpRtcpImpl(const Configuration& configuration)
     62     : rtp_sender_(configuration.audio,
     63                   configuration.clock,
     64                   configuration.outgoing_transport,
     65                   configuration.audio_messages,
     66                   configuration.paced_sender,
     67                   configuration.transport_sequence_number_allocator,
     68                   configuration.transport_feedback_callback,
     69                   configuration.send_bitrate_observer,
     70                   configuration.send_frame_count_observer,
     71                   configuration.send_side_delay_observer),
     72       rtcp_sender_(configuration.audio,
     73                    configuration.clock,
     74                    configuration.receive_statistics,
     75                    configuration.rtcp_packet_type_counter_observer,
     76                    configuration.outgoing_transport),
     77       rtcp_receiver_(configuration.clock,
     78                      configuration.receiver_only,
     79                      configuration.rtcp_packet_type_counter_observer,
     80                      configuration.bandwidth_callback,
     81                      configuration.intra_frame_callback,
     82                      configuration.transport_feedback_callback,
     83                      this),
     84       clock_(configuration.clock),
     85       audio_(configuration.audio),
     86       collision_detected_(false),
     87       last_process_time_(configuration.clock->TimeInMilliseconds()),
     88       last_bitrate_process_time_(configuration.clock->TimeInMilliseconds()),
     89       last_rtt_process_time_(configuration.clock->TimeInMilliseconds()),
     90       packet_overhead_(28),                     // IPV4 UDP.
     91       padding_index_(static_cast<size_t>(-1)),  // Start padding at first child.
     92       nack_method_(kNackOff),
     93       nack_last_time_sent_full_(0),
     94       nack_last_time_sent_full_prev_(0),
     95       nack_last_seq_number_sent_(0),
     96       key_frame_req_method_(kKeyFrameReqPliRtcp),
     97       remote_bitrate_(configuration.remote_bitrate_estimator),
     98       rtt_stats_(configuration.rtt_stats),
     99       critical_section_rtt_(CriticalSectionWrapper::CreateCriticalSection()),
    100       rtt_ms_(0) {
    101   send_video_codec_.codecType = kVideoCodecUnknown;
    102 
    103   // Make sure that RTCP objects are aware of our SSRC.
    104   uint32_t SSRC = rtp_sender_.SSRC();
    105   rtcp_sender_.SetSSRC(SSRC);
    106   SetRtcpReceiverSsrcs(SSRC);
    107 }
    108 
    109 // Returns the number of milliseconds until the module want a worker thread
    110 // to call Process.
    111 int64_t ModuleRtpRtcpImpl::TimeUntilNextProcess() {
    112   const int64_t now = clock_->TimeInMilliseconds();
    113   const int64_t kRtpRtcpMaxIdleTimeProcessMs = 5;
    114   return kRtpRtcpMaxIdleTimeProcessMs - (now - last_process_time_);
    115 }
    116 
    117 // Process any pending tasks such as timeouts (non time critical events).
    118 int32_t ModuleRtpRtcpImpl::Process() {
    119   const int64_t now = clock_->TimeInMilliseconds();
    120   last_process_time_ = now;
    121 
    122   const int64_t kRtpRtcpBitrateProcessTimeMs = 10;
    123   if (now >= last_bitrate_process_time_ + kRtpRtcpBitrateProcessTimeMs) {
    124     rtp_sender_.ProcessBitrate();
    125     last_bitrate_process_time_ = now;
    126   }
    127 
    128   const int64_t kRtpRtcpRttProcessTimeMs = 1000;
    129   bool process_rtt = now >= last_rtt_process_time_ + kRtpRtcpRttProcessTimeMs;
    130   if (rtcp_sender_.Sending()) {
    131     // Process RTT if we have received a receiver report and we haven't
    132     // processed RTT for at least |kRtpRtcpRttProcessTimeMs| milliseconds.
    133     if (rtcp_receiver_.LastReceivedReceiverReport() >
    134         last_rtt_process_time_ && process_rtt) {
    135       std::vector<RTCPReportBlock> receive_blocks;
    136       rtcp_receiver_.StatisticsReceived(&receive_blocks);
    137       int64_t max_rtt = 0;
    138       for (std::vector<RTCPReportBlock>::iterator it = receive_blocks.begin();
    139            it != receive_blocks.end(); ++it) {
    140         int64_t rtt = 0;
    141         rtcp_receiver_.RTT(it->remoteSSRC, &rtt, NULL, NULL, NULL);
    142         max_rtt = (rtt > max_rtt) ? rtt : max_rtt;
    143       }
    144       // Report the rtt.
    145       if (rtt_stats_ && max_rtt != 0)
    146         rtt_stats_->OnRttUpdate(max_rtt);
    147     }
    148 
    149     // Verify receiver reports are delivered and the reported sequence number
    150     // is increasing.
    151     int64_t rtcp_interval = RtcpReportInterval();
    152     if (rtcp_receiver_.RtcpRrTimeout(rtcp_interval)) {
    153       LOG_F(LS_WARNING) << "Timeout: No RTCP RR received.";
    154     } else if (rtcp_receiver_.RtcpRrSequenceNumberTimeout(rtcp_interval)) {
    155       LOG_F(LS_WARNING) <<
    156           "Timeout: No increase in RTCP RR extended highest sequence number.";
    157     }
    158 
    159     if (remote_bitrate_ && rtcp_sender_.TMMBR()) {
    160       unsigned int target_bitrate = 0;
    161       std::vector<unsigned int> ssrcs;
    162       if (remote_bitrate_->LatestEstimate(&ssrcs, &target_bitrate)) {
    163         if (!ssrcs.empty()) {
    164           target_bitrate = target_bitrate / ssrcs.size();
    165         }
    166         rtcp_sender_.SetTargetBitrate(target_bitrate);
    167       }
    168     }
    169   } else {
    170     // Report rtt from receiver.
    171     if (process_rtt) {
    172        int64_t rtt_ms;
    173        if (rtt_stats_ && rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms)) {
    174          rtt_stats_->OnRttUpdate(rtt_ms);
    175        }
    176     }
    177   }
    178 
    179   // Get processed rtt.
    180   if (process_rtt) {
    181     last_rtt_process_time_ = now;
    182     if (rtt_stats_)
    183       set_rtt_ms(rtt_stats_->LastProcessedRtt());
    184   }
    185 
    186   // For sending streams, make sure to not send a SR before media has been sent.
    187   if (rtcp_sender_.TimeToSendRTCPReport()) {
    188     RTCPSender::FeedbackState state = GetFeedbackState();
    189     // Prevent sending streams to send SR before any media has been sent.
    190     if (!rtcp_sender_.Sending() || state.packets_sent > 0)
    191       rtcp_sender_.SendRTCP(state, kRtcpReport);
    192   }
    193 
    194   if (UpdateRTCPReceiveInformationTimers()) {
    195     // A receiver has timed out
    196     rtcp_receiver_.UpdateTMMBR();
    197   }
    198   return 0;
    199 }
    200 
    201 void ModuleRtpRtcpImpl::SetRtxSendStatus(int mode) {
    202   rtp_sender_.SetRtxStatus(mode);
    203 }
    204 
    205 int ModuleRtpRtcpImpl::RtxSendStatus() const {
    206   return rtp_sender_.RtxStatus();
    207 }
    208 
    209 void ModuleRtpRtcpImpl::SetRtxSsrc(uint32_t ssrc) {
    210   rtp_sender_.SetRtxSsrc(ssrc);
    211 }
    212 
    213 void ModuleRtpRtcpImpl::SetRtxSendPayloadType(int payload_type,
    214                                               int associated_payload_type) {
    215   rtp_sender_.SetRtxPayloadType(payload_type, associated_payload_type);
    216 }
    217 
    218 std::pair<int, int> ModuleRtpRtcpImpl::RtxSendPayloadType() const {
    219   return rtp_sender_.RtxPayloadType();
    220 }
    221 
    222 int32_t ModuleRtpRtcpImpl::IncomingRtcpPacket(
    223     const uint8_t* rtcp_packet,
    224     const size_t length) {
    225   // Allow receive of non-compound RTCP packets.
    226   RTCPUtility::RTCPParserV2 rtcp_parser(rtcp_packet, length, true);
    227 
    228   const bool valid_rtcpheader = rtcp_parser.IsValid();
    229   if (!valid_rtcpheader) {
    230     LOG(LS_WARNING) << "Incoming invalid RTCP packet";
    231     return -1;
    232   }
    233   RTCPHelp::RTCPPacketInformation rtcp_packet_information;
    234   int32_t ret_val = rtcp_receiver_.IncomingRTCPPacket(
    235       rtcp_packet_information, &rtcp_parser);
    236   if (ret_val == 0) {
    237     rtcp_receiver_.TriggerCallbacksFromRTCPPacket(rtcp_packet_information);
    238   }
    239   return ret_val;
    240 }
    241 
    242 int32_t ModuleRtpRtcpImpl::RegisterSendPayload(
    243     const CodecInst& voice_codec) {
    244   return rtp_sender_.RegisterPayload(
    245            voice_codec.plname,
    246            voice_codec.pltype,
    247            voice_codec.plfreq,
    248            voice_codec.channels,
    249            (voice_codec.rate < 0) ? 0 : voice_codec.rate);
    250 }
    251 
    252 int32_t ModuleRtpRtcpImpl::RegisterSendPayload(const VideoCodec& video_codec) {
    253   send_video_codec_ = video_codec;
    254   return rtp_sender_.RegisterPayload(video_codec.plName,
    255                                      video_codec.plType,
    256                                      90000,
    257                                      0,
    258                                      video_codec.maxBitrate);
    259 }
    260 
    261 int32_t ModuleRtpRtcpImpl::DeRegisterSendPayload(const int8_t payload_type) {
    262   return rtp_sender_.DeRegisterSendPayload(payload_type);
    263 }
    264 
    265 int8_t ModuleRtpRtcpImpl::SendPayloadType() const {
    266   return rtp_sender_.SendPayloadType();
    267 }
    268 
    269 uint32_t ModuleRtpRtcpImpl::StartTimestamp() const {
    270   return rtp_sender_.StartTimestamp();
    271 }
    272 
    273 // Configure start timestamp, default is a random number.
    274 void ModuleRtpRtcpImpl::SetStartTimestamp(const uint32_t timestamp) {
    275   rtcp_sender_.SetStartTimestamp(timestamp);
    276   rtp_sender_.SetStartTimestamp(timestamp, true);
    277 }
    278 
    279 uint16_t ModuleRtpRtcpImpl::SequenceNumber() const {
    280   return rtp_sender_.SequenceNumber();
    281 }
    282 
    283 // Set SequenceNumber, default is a random number.
    284 void ModuleRtpRtcpImpl::SetSequenceNumber(const uint16_t seq_num) {
    285   rtp_sender_.SetSequenceNumber(seq_num);
    286 }
    287 
    288 bool ModuleRtpRtcpImpl::SetRtpStateForSsrc(uint32_t ssrc,
    289                                            const RtpState& rtp_state) {
    290   if (rtp_sender_.SSRC() == ssrc) {
    291     rtp_sender_.SetRtpState(rtp_state);
    292     return true;
    293   }
    294   if (rtp_sender_.RtxSsrc() == ssrc) {
    295     rtp_sender_.SetRtxRtpState(rtp_state);
    296     return true;
    297   }
    298   return false;
    299 }
    300 
    301 bool ModuleRtpRtcpImpl::GetRtpStateForSsrc(uint32_t ssrc, RtpState* rtp_state) {
    302   if (rtp_sender_.SSRC() == ssrc) {
    303     *rtp_state = rtp_sender_.GetRtpState();
    304     return true;
    305   }
    306   if (rtp_sender_.RtxSsrc() == ssrc) {
    307     *rtp_state = rtp_sender_.GetRtxRtpState();
    308     return true;
    309   }
    310   return false;
    311 }
    312 
    313 uint32_t ModuleRtpRtcpImpl::SSRC() const {
    314   return rtp_sender_.SSRC();
    315 }
    316 
    317 // Configure SSRC, default is a random number.
    318 void ModuleRtpRtcpImpl::SetSSRC(const uint32_t ssrc) {
    319   rtp_sender_.SetSSRC(ssrc);
    320   rtcp_sender_.SetSSRC(ssrc);
    321   SetRtcpReceiverSsrcs(ssrc);
    322 }
    323 
    324 void ModuleRtpRtcpImpl::SetCsrcs(const std::vector<uint32_t>& csrcs) {
    325   rtcp_sender_.SetCsrcs(csrcs);
    326   rtp_sender_.SetCsrcs(csrcs);
    327 }
    328 
    329 // TODO(pbos): Handle media and RTX streams separately (separate RTCP
    330 // feedbacks).
    331 RTCPSender::FeedbackState ModuleRtpRtcpImpl::GetFeedbackState() {
    332   StreamDataCounters rtp_stats;
    333   StreamDataCounters rtx_stats;
    334   rtp_sender_.GetDataCounters(&rtp_stats, &rtx_stats);
    335 
    336   RTCPSender::FeedbackState state;
    337   state.send_payload_type = SendPayloadType();
    338   state.frequency_hz = CurrentSendFrequencyHz();
    339   state.packets_sent = rtp_stats.transmitted.packets +
    340                        rtx_stats.transmitted.packets;
    341   state.media_bytes_sent = rtp_stats.transmitted.payload_bytes +
    342                            rtx_stats.transmitted.payload_bytes;
    343   state.module = this;
    344 
    345   LastReceivedNTP(&state.last_rr_ntp_secs,
    346                   &state.last_rr_ntp_frac,
    347                   &state.remote_sr);
    348 
    349   state.has_last_xr_rr = LastReceivedXrReferenceTimeInfo(&state.last_xr_rr);
    350 
    351   uint32_t tmp;
    352   BitrateSent(&state.send_bitrate, &tmp, &tmp, &tmp);
    353   return state;
    354 }
    355 
    356 int ModuleRtpRtcpImpl::CurrentSendFrequencyHz() const {
    357   return rtp_sender_.SendPayloadFrequency();
    358 }
    359 
    360 int32_t ModuleRtpRtcpImpl::SetSendingStatus(const bool sending) {
    361   if (rtcp_sender_.Sending() != sending) {
    362     // Sends RTCP BYE when going from true to false
    363     if (rtcp_sender_.SetSendingStatus(GetFeedbackState(), sending) != 0) {
    364       LOG(LS_WARNING) << "Failed to send RTCP BYE";
    365     }
    366 
    367     collision_detected_ = false;
    368 
    369     // Generate a new time_stamp if true and not configured via API
    370     // Generate a new SSRC for the next "call" if false
    371     rtp_sender_.SetSendingStatus(sending);
    372     if (sending) {
    373       // Make sure the RTCP sender has the same timestamp offset.
    374       rtcp_sender_.SetStartTimestamp(rtp_sender_.StartTimestamp());
    375     }
    376 
    377     // Make sure that RTCP objects are aware of our SSRC (it could have changed
    378     // Due to collision)
    379     uint32_t SSRC = rtp_sender_.SSRC();
    380     rtcp_sender_.SetSSRC(SSRC);
    381     SetRtcpReceiverSsrcs(SSRC);
    382 
    383     return 0;
    384   }
    385   return 0;
    386 }
    387 
    388 bool ModuleRtpRtcpImpl::Sending() const {
    389   return rtcp_sender_.Sending();
    390 }
    391 
    392 void ModuleRtpRtcpImpl::SetSendingMediaStatus(const bool sending) {
    393   rtp_sender_.SetSendingMediaStatus(sending);
    394 }
    395 
    396 bool ModuleRtpRtcpImpl::SendingMedia() const {
    397   return rtp_sender_.SendingMedia();
    398 }
    399 
    400 int32_t ModuleRtpRtcpImpl::SendOutgoingData(
    401     FrameType frame_type,
    402     int8_t payload_type,
    403     uint32_t time_stamp,
    404     int64_t capture_time_ms,
    405     const uint8_t* payload_data,
    406     size_t payload_size,
    407     const RTPFragmentationHeader* fragmentation,
    408     const RTPVideoHeader* rtp_video_hdr) {
    409   rtcp_sender_.SetLastRtpTime(time_stamp, capture_time_ms);
    410   // Make sure an RTCP report isn't queued behind a key frame.
    411   if (rtcp_sender_.TimeToSendRTCPReport(kVideoFrameKey == frame_type)) {
    412       rtcp_sender_.SendRTCP(GetFeedbackState(), kRtcpReport);
    413   }
    414   return rtp_sender_.SendOutgoingData(
    415       frame_type, payload_type, time_stamp, capture_time_ms, payload_data,
    416       payload_size, fragmentation, rtp_video_hdr);
    417 }
    418 
    419 bool ModuleRtpRtcpImpl::TimeToSendPacket(uint32_t ssrc,
    420                                          uint16_t sequence_number,
    421                                          int64_t capture_time_ms,
    422                                          bool retransmission) {
    423   if (SendingMedia() && ssrc == rtp_sender_.SSRC()) {
    424     return rtp_sender_.TimeToSendPacket(
    425         sequence_number, capture_time_ms, retransmission);
    426   }
    427   // No RTP sender is interested in sending this packet.
    428   return true;
    429 }
    430 
    431 size_t ModuleRtpRtcpImpl::TimeToSendPadding(size_t bytes) {
    432   return rtp_sender_.TimeToSendPadding(bytes);
    433 }
    434 
    435 uint16_t ModuleRtpRtcpImpl::MaxPayloadLength() const {
    436   return rtp_sender_.MaxPayloadLength();
    437 }
    438 
    439 uint16_t ModuleRtpRtcpImpl::MaxDataPayloadLength() const {
    440   return rtp_sender_.MaxDataPayloadLength();
    441 }
    442 
    443 int32_t ModuleRtpRtcpImpl::SetTransportOverhead(
    444     const bool tcp,
    445     const bool ipv6,
    446     const uint8_t authentication_overhead) {
    447   uint16_t packet_overhead = 0;
    448   if (ipv6) {
    449     packet_overhead = 40;
    450   } else {
    451     packet_overhead = 20;
    452   }
    453   if (tcp) {
    454     // TCP.
    455     packet_overhead += 20;
    456   } else {
    457     // UDP.
    458     packet_overhead += 8;
    459   }
    460   packet_overhead += authentication_overhead;
    461 
    462   if (packet_overhead == packet_overhead_) {
    463     // Ok same as before.
    464     return 0;
    465   }
    466   // Calc diff.
    467   int16_t packet_over_head_diff = packet_overhead - packet_overhead_;
    468 
    469   // Store new.
    470   packet_overhead_ = packet_overhead;
    471 
    472   uint16_t length =
    473       rtp_sender_.MaxPayloadLength() - packet_over_head_diff;
    474   return rtp_sender_.SetMaxPayloadLength(length, packet_overhead_);
    475 }
    476 
    477 int32_t ModuleRtpRtcpImpl::SetMaxTransferUnit(const uint16_t mtu) {
    478   RTC_DCHECK_LE(mtu, IP_PACKET_SIZE) << "Invalid mtu: " << mtu;
    479   return rtp_sender_.SetMaxPayloadLength(mtu - packet_overhead_,
    480                                          packet_overhead_);
    481 }
    482 
    483 RtcpMode ModuleRtpRtcpImpl::RTCP() const {
    484   if (rtcp_sender_.Status() != RtcpMode::kOff) {
    485     return rtcp_receiver_.Status();
    486   }
    487   return RtcpMode::kOff;
    488 }
    489 
    490 // Configure RTCP status i.e on/off.
    491 void ModuleRtpRtcpImpl::SetRTCPStatus(const RtcpMode method) {
    492   rtcp_sender_.SetRTCPStatus(method);
    493   rtcp_receiver_.SetRTCPStatus(method);
    494 }
    495 
    496 int32_t ModuleRtpRtcpImpl::SetCNAME(const char* c_name) {
    497   return rtcp_sender_.SetCNAME(c_name);
    498 }
    499 
    500 int32_t ModuleRtpRtcpImpl::AddMixedCNAME(uint32_t ssrc, const char* c_name) {
    501   return rtcp_sender_.AddMixedCNAME(ssrc, c_name);
    502 }
    503 
    504 int32_t ModuleRtpRtcpImpl::RemoveMixedCNAME(const uint32_t ssrc) {
    505   return rtcp_sender_.RemoveMixedCNAME(ssrc);
    506 }
    507 
    508 int32_t ModuleRtpRtcpImpl::RemoteCNAME(
    509     const uint32_t remote_ssrc,
    510     char c_name[RTCP_CNAME_SIZE]) const {
    511   return rtcp_receiver_.CNAME(remote_ssrc, c_name);
    512 }
    513 
    514 int32_t ModuleRtpRtcpImpl::RemoteNTP(
    515     uint32_t* received_ntpsecs,
    516     uint32_t* received_ntpfrac,
    517     uint32_t* rtcp_arrival_time_secs,
    518     uint32_t* rtcp_arrival_time_frac,
    519     uint32_t* rtcp_timestamp) const {
    520   return rtcp_receiver_.NTP(received_ntpsecs,
    521                             received_ntpfrac,
    522                             rtcp_arrival_time_secs,
    523                             rtcp_arrival_time_frac,
    524                             rtcp_timestamp)
    525              ? 0
    526              : -1;
    527 }
    528 
    529 // Get RoundTripTime.
    530 int32_t ModuleRtpRtcpImpl::RTT(const uint32_t remote_ssrc,
    531                                int64_t* rtt,
    532                                int64_t* avg_rtt,
    533                                int64_t* min_rtt,
    534                                int64_t* max_rtt) const {
    535   int32_t ret = rtcp_receiver_.RTT(remote_ssrc, rtt, avg_rtt, min_rtt, max_rtt);
    536   if (rtt && *rtt == 0) {
    537     // Try to get RTT from RtcpRttStats class.
    538     *rtt = rtt_ms();
    539   }
    540   return ret;
    541 }
    542 
    543 // Force a send of an RTCP packet.
    544 // Normal SR and RR are triggered via the process function.
    545 int32_t ModuleRtpRtcpImpl::SendRTCP(RTCPPacketType packet_type) {
    546   return rtcp_sender_.SendRTCP(GetFeedbackState(), packet_type);
    547 }
    548 
    549 // Force a send of an RTCP packet.
    550 // Normal SR and RR are triggered via the process function.
    551 int32_t ModuleRtpRtcpImpl::SendCompoundRTCP(
    552     const std::set<RTCPPacketType>& packet_types) {
    553   return rtcp_sender_.SendCompoundRTCP(GetFeedbackState(), packet_types);
    554 }
    555 
    556 int32_t ModuleRtpRtcpImpl::SetRTCPApplicationSpecificData(
    557     const uint8_t sub_type,
    558     const uint32_t name,
    559     const uint8_t* data,
    560     const uint16_t length) {
    561   return  rtcp_sender_.SetApplicationSpecificData(sub_type, name, data, length);
    562 }
    563 
    564 // (XR) VOIP metric.
    565 int32_t ModuleRtpRtcpImpl::SetRTCPVoIPMetrics(
    566   const RTCPVoIPMetric* voip_metric) {
    567   return  rtcp_sender_.SetRTCPVoIPMetrics(voip_metric);
    568 }
    569 
    570 void ModuleRtpRtcpImpl::SetRtcpXrRrtrStatus(bool enable) {
    571   return rtcp_sender_.SendRtcpXrReceiverReferenceTime(enable);
    572 }
    573 
    574 bool ModuleRtpRtcpImpl::RtcpXrRrtrStatus() const {
    575   return rtcp_sender_.RtcpXrReceiverReferenceTime();
    576 }
    577 
    578 // TODO(asapersson): Replace this method with the one below.
    579 int32_t ModuleRtpRtcpImpl::DataCountersRTP(
    580     size_t* bytes_sent,
    581     uint32_t* packets_sent) const {
    582   StreamDataCounters rtp_stats;
    583   StreamDataCounters rtx_stats;
    584   rtp_sender_.GetDataCounters(&rtp_stats, &rtx_stats);
    585 
    586   if (bytes_sent) {
    587     *bytes_sent = rtp_stats.transmitted.payload_bytes +
    588                   rtp_stats.transmitted.padding_bytes +
    589                   rtp_stats.transmitted.header_bytes +
    590                   rtx_stats.transmitted.payload_bytes +
    591                   rtx_stats.transmitted.padding_bytes +
    592                   rtx_stats.transmitted.header_bytes;
    593   }
    594   if (packets_sent) {
    595     *packets_sent = rtp_stats.transmitted.packets +
    596                     rtx_stats.transmitted.packets;
    597   }
    598   return 0;
    599 }
    600 
    601 void ModuleRtpRtcpImpl::GetSendStreamDataCounters(
    602     StreamDataCounters* rtp_counters,
    603     StreamDataCounters* rtx_counters) const {
    604   rtp_sender_.GetDataCounters(rtp_counters, rtx_counters);
    605 }
    606 
    607 void ModuleRtpRtcpImpl::GetRtpPacketLossStats(
    608     bool outgoing,
    609     uint32_t ssrc,
    610     struct RtpPacketLossStats* loss_stats) const {
    611   if (!loss_stats) return;
    612   const PacketLossStats* stats_source = NULL;
    613   if (outgoing) {
    614     if (SSRC() == ssrc) {
    615       stats_source = &send_loss_stats_;
    616     }
    617   } else {
    618     if (rtcp_receiver_.RemoteSSRC() == ssrc) {
    619       stats_source = &receive_loss_stats_;
    620     }
    621   }
    622   if (stats_source) {
    623     loss_stats->single_packet_loss_count =
    624         stats_source->GetSingleLossCount();
    625     loss_stats->multiple_packet_loss_event_count =
    626         stats_source->GetMultipleLossEventCount();
    627     loss_stats->multiple_packet_loss_packet_count =
    628         stats_source->GetMultipleLossPacketCount();
    629   }
    630 }
    631 
    632 int32_t ModuleRtpRtcpImpl::RemoteRTCPStat(RTCPSenderInfo* sender_info) {
    633   return rtcp_receiver_.SenderInfoReceived(sender_info);
    634 }
    635 
    636 // Received RTCP report.
    637 int32_t ModuleRtpRtcpImpl::RemoteRTCPStat(
    638     std::vector<RTCPReportBlock>* receive_blocks) const {
    639   return rtcp_receiver_.StatisticsReceived(receive_blocks);
    640 }
    641 
    642 // (REMB) Receiver Estimated Max Bitrate.
    643 bool ModuleRtpRtcpImpl::REMB() const {
    644   return rtcp_sender_.REMB();
    645 }
    646 
    647 void ModuleRtpRtcpImpl::SetREMBStatus(const bool enable) {
    648   rtcp_sender_.SetREMBStatus(enable);
    649 }
    650 
    651 void ModuleRtpRtcpImpl::SetREMBData(const uint32_t bitrate,
    652                                     const std::vector<uint32_t>& ssrcs) {
    653   rtcp_sender_.SetREMBData(bitrate, ssrcs);
    654 }
    655 
    656 int32_t ModuleRtpRtcpImpl::RegisterSendRtpHeaderExtension(
    657     const RTPExtensionType type,
    658     const uint8_t id) {
    659   return rtp_sender_.RegisterRtpHeaderExtension(type, id);
    660 }
    661 
    662 int32_t ModuleRtpRtcpImpl::DeregisterSendRtpHeaderExtension(
    663     const RTPExtensionType type) {
    664   return rtp_sender_.DeregisterRtpHeaderExtension(type);
    665 }
    666 
    667 // (TMMBR) Temporary Max Media Bit Rate.
    668 bool ModuleRtpRtcpImpl::TMMBR() const {
    669   return rtcp_sender_.TMMBR();
    670 }
    671 
    672 void ModuleRtpRtcpImpl::SetTMMBRStatus(const bool enable) {
    673   rtcp_sender_.SetTMMBRStatus(enable);
    674 }
    675 
    676 int32_t ModuleRtpRtcpImpl::SetTMMBN(const TMMBRSet* bounding_set) {
    677   uint32_t max_bitrate_kbit =
    678       rtp_sender_.MaxConfiguredBitrateVideo() / 1000;
    679   return rtcp_sender_.SetTMMBN(bounding_set, max_bitrate_kbit);
    680 }
    681 
    682 // Returns the currently configured retransmission mode.
    683 int ModuleRtpRtcpImpl::SelectiveRetransmissions() const {
    684   return rtp_sender_.SelectiveRetransmissions();
    685 }
    686 
    687 // Enable or disable a retransmission mode, which decides which packets will
    688 // be retransmitted if NACKed.
    689 int ModuleRtpRtcpImpl::SetSelectiveRetransmissions(uint8_t settings) {
    690   return rtp_sender_.SetSelectiveRetransmissions(settings);
    691 }
    692 
    693 // Send a Negative acknowledgment packet.
    694 int32_t ModuleRtpRtcpImpl::SendNACK(const uint16_t* nack_list,
    695                                     const uint16_t size) {
    696   for (int i = 0; i < size; ++i) {
    697     receive_loss_stats_.AddLostPacket(nack_list[i]);
    698   }
    699   uint16_t nack_length = size;
    700   uint16_t start_id = 0;
    701   int64_t now = clock_->TimeInMilliseconds();
    702   if (TimeToSendFullNackList(now)) {
    703     nack_last_time_sent_full_ = now;
    704     nack_last_time_sent_full_prev_ = now;
    705   } else {
    706     // Only send extended list.
    707     if (nack_last_seq_number_sent_ == nack_list[size - 1]) {
    708       // Last sequence number is the same, do not send list.
    709       return 0;
    710     }
    711     // Send new sequence numbers.
    712     for (int i = 0; i < size; ++i) {
    713       if (nack_last_seq_number_sent_ == nack_list[i]) {
    714         start_id = i + 1;
    715         break;
    716       }
    717     }
    718     nack_length = size - start_id;
    719   }
    720 
    721   // Our RTCP NACK implementation is limited to kRtcpMaxNackFields sequence
    722   // numbers per RTCP packet.
    723   if (nack_length > kRtcpMaxNackFields) {
    724     nack_length = kRtcpMaxNackFields;
    725   }
    726   nack_last_seq_number_sent_ = nack_list[start_id + nack_length - 1];
    727 
    728   return rtcp_sender_.SendRTCP(
    729       GetFeedbackState(), kRtcpNack, nack_length, &nack_list[start_id]);
    730 }
    731 
    732 bool ModuleRtpRtcpImpl::TimeToSendFullNackList(int64_t now) const {
    733   // Use RTT from RtcpRttStats class if provided.
    734   int64_t rtt = rtt_ms();
    735   if (rtt == 0) {
    736     rtcp_receiver_.RTT(rtcp_receiver_.RemoteSSRC(), NULL, &rtt, NULL, NULL);
    737   }
    738 
    739   const int64_t kStartUpRttMs = 100;
    740   int64_t wait_time = 5 + ((rtt * 3) >> 1);  // 5 + RTT * 1.5.
    741   if (rtt == 0) {
    742     wait_time = kStartUpRttMs;
    743   }
    744 
    745   // Send a full NACK list once within every |wait_time|.
    746   if (rtt_stats_) {
    747     return now - nack_last_time_sent_full_ > wait_time;
    748   }
    749   return now - nack_last_time_sent_full_prev_ > wait_time;
    750 }
    751 
    752 // Store the sent packets, needed to answer to Negative acknowledgment requests.
    753 void ModuleRtpRtcpImpl::SetStorePacketsStatus(const bool enable,
    754                                               const uint16_t number_to_store) {
    755   rtp_sender_.SetStorePacketsStatus(enable, number_to_store);
    756 }
    757 
    758 bool ModuleRtpRtcpImpl::StorePackets() const {
    759   return rtp_sender_.StorePackets();
    760 }
    761 
    762 void ModuleRtpRtcpImpl::RegisterRtcpStatisticsCallback(
    763     RtcpStatisticsCallback* callback) {
    764   rtcp_receiver_.RegisterRtcpStatisticsCallback(callback);
    765 }
    766 
    767 RtcpStatisticsCallback* ModuleRtpRtcpImpl::GetRtcpStatisticsCallback() {
    768   return rtcp_receiver_.GetRtcpStatisticsCallback();
    769 }
    770 
    771 bool ModuleRtpRtcpImpl::SendFeedbackPacket(
    772     const rtcp::TransportFeedback& packet) {
    773   return rtcp_sender_.SendFeedbackPacket(packet);
    774 }
    775 
    776 // Send a TelephoneEvent tone using RFC 2833 (4733).
    777 int32_t ModuleRtpRtcpImpl::SendTelephoneEventOutband(
    778     const uint8_t key,
    779     const uint16_t time_ms,
    780     const uint8_t level) {
    781   return rtp_sender_.SendTelephoneEvent(key, time_ms, level);
    782 }
    783 
    784 // Set audio packet size, used to determine when it's time to send a DTMF
    785 // packet in silence (CNG).
    786 int32_t ModuleRtpRtcpImpl::SetAudioPacketSize(
    787     const uint16_t packet_size_samples) {
    788   return rtp_sender_.SetAudioPacketSize(packet_size_samples);
    789 }
    790 
    791 int32_t ModuleRtpRtcpImpl::SetAudioLevel(
    792     const uint8_t level_d_bov) {
    793   return rtp_sender_.SetAudioLevel(level_d_bov);
    794 }
    795 
    796 // Set payload type for Redundant Audio Data RFC 2198.
    797 int32_t ModuleRtpRtcpImpl::SetSendREDPayloadType(
    798     const int8_t payload_type) {
    799   return rtp_sender_.SetRED(payload_type);
    800 }
    801 
    802 // Get payload type for Redundant Audio Data RFC 2198.
    803 int32_t ModuleRtpRtcpImpl::SendREDPayloadType(int8_t* payload_type) const {
    804   return rtp_sender_.RED(payload_type);
    805 }
    806 
    807 void ModuleRtpRtcpImpl::SetTargetSendBitrate(uint32_t bitrate_bps) {
    808   rtp_sender_.SetTargetBitrate(bitrate_bps);
    809 }
    810 
    811 int32_t ModuleRtpRtcpImpl::SetKeyFrameRequestMethod(
    812     const KeyFrameRequestMethod method) {
    813   key_frame_req_method_ = method;
    814   return 0;
    815 }
    816 
    817 int32_t ModuleRtpRtcpImpl::RequestKeyFrame() {
    818   switch (key_frame_req_method_) {
    819     case kKeyFrameReqPliRtcp:
    820       return SendRTCP(kRtcpPli);
    821     case kKeyFrameReqFirRtcp:
    822       return SendRTCP(kRtcpFir);
    823   }
    824   return -1;
    825 }
    826 
    827 int32_t ModuleRtpRtcpImpl::SendRTCPSliceLossIndication(
    828     const uint8_t picture_id) {
    829   return rtcp_sender_.SendRTCP(
    830       GetFeedbackState(), kRtcpSli, 0, 0, false, picture_id);
    831 }
    832 
    833 void ModuleRtpRtcpImpl::SetGenericFECStatus(
    834     const bool enable,
    835     const uint8_t payload_type_red,
    836     const uint8_t payload_type_fec) {
    837   rtp_sender_.SetGenericFECStatus(enable, payload_type_red, payload_type_fec);
    838 }
    839 
    840 void ModuleRtpRtcpImpl::GenericFECStatus(bool* enable,
    841                                          uint8_t* payload_type_red,
    842                                          uint8_t* payload_type_fec) {
    843   rtp_sender_.GenericFECStatus(enable, payload_type_red, payload_type_fec);
    844 }
    845 
    846 int32_t ModuleRtpRtcpImpl::SetFecParameters(
    847     const FecProtectionParams* delta_params,
    848     const FecProtectionParams* key_params) {
    849   return rtp_sender_.SetFecParameters(delta_params, key_params);
    850 }
    851 
    852 void ModuleRtpRtcpImpl::SetRemoteSSRC(const uint32_t ssrc) {
    853   // Inform about the incoming SSRC.
    854   rtcp_sender_.SetRemoteSSRC(ssrc);
    855   rtcp_receiver_.SetRemoteSSRC(ssrc);
    856 
    857   // Check for a SSRC collision.
    858   if (rtp_sender_.SSRC() == ssrc && !collision_detected_) {
    859     // If we detect a collision change the SSRC but only once.
    860     collision_detected_ = true;
    861     uint32_t new_ssrc = rtp_sender_.GenerateNewSSRC();
    862     if (new_ssrc == 0) {
    863       // Configured via API ignore.
    864       return;
    865     }
    866     if (RtcpMode::kOff != rtcp_sender_.Status()) {
    867       // Send RTCP bye on the current SSRC.
    868       SendRTCP(kRtcpBye);
    869     }
    870     // Change local SSRC and inform all objects about the new SSRC.
    871     rtcp_sender_.SetSSRC(new_ssrc);
    872     SetRtcpReceiverSsrcs(new_ssrc);
    873   }
    874 }
    875 
    876 void ModuleRtpRtcpImpl::BitrateSent(uint32_t* total_rate,
    877                                     uint32_t* video_rate,
    878                                     uint32_t* fec_rate,
    879                                     uint32_t* nack_rate) const {
    880   *total_rate = rtp_sender_.BitrateSent();
    881   *video_rate = rtp_sender_.VideoBitrateSent();
    882   *fec_rate = rtp_sender_.FecOverheadRate();
    883   *nack_rate = rtp_sender_.NackOverheadRate();
    884 }
    885 
    886 void ModuleRtpRtcpImpl::OnRequestIntraFrame() {
    887   RequestKeyFrame();
    888 }
    889 
    890 void ModuleRtpRtcpImpl::OnRequestSendReport() {
    891   SendRTCP(kRtcpSr);
    892 }
    893 
    894 int32_t ModuleRtpRtcpImpl::SendRTCPReferencePictureSelection(
    895     const uint64_t picture_id) {
    896   return rtcp_sender_.SendRTCP(
    897       GetFeedbackState(), kRtcpRpsi, 0, 0, false, picture_id);
    898 }
    899 
    900 int64_t ModuleRtpRtcpImpl::SendTimeOfSendReport(
    901     const uint32_t send_report) {
    902   return rtcp_sender_.SendTimeOfSendReport(send_report);
    903 }
    904 
    905 bool ModuleRtpRtcpImpl::SendTimeOfXrRrReport(
    906     uint32_t mid_ntp, int64_t* time_ms) const {
    907   return rtcp_sender_.SendTimeOfXrRrReport(mid_ntp, time_ms);
    908 }
    909 
    910 void ModuleRtpRtcpImpl::OnReceivedNACK(
    911     const std::list<uint16_t>& nack_sequence_numbers) {
    912   for (uint16_t nack_sequence_number : nack_sequence_numbers) {
    913     send_loss_stats_.AddLostPacket(nack_sequence_number);
    914   }
    915   if (!rtp_sender_.StorePackets() ||
    916       nack_sequence_numbers.size() == 0) {
    917     return;
    918   }
    919   // Use RTT from RtcpRttStats class if provided.
    920   int64_t rtt = rtt_ms();
    921   if (rtt == 0) {
    922     rtcp_receiver_.RTT(rtcp_receiver_.RemoteSSRC(), NULL, &rtt, NULL, NULL);
    923   }
    924   rtp_sender_.OnReceivedNACK(nack_sequence_numbers, rtt);
    925 }
    926 
    927 bool ModuleRtpRtcpImpl::LastReceivedNTP(
    928     uint32_t* rtcp_arrival_time_secs,  // When we got the last report.
    929     uint32_t* rtcp_arrival_time_frac,
    930     uint32_t* remote_sr) const {
    931   // Remote SR: NTP inside the last received (mid 16 bits from sec and frac).
    932   uint32_t ntp_secs = 0;
    933   uint32_t ntp_frac = 0;
    934 
    935   if (!rtcp_receiver_.NTP(&ntp_secs,
    936                           &ntp_frac,
    937                           rtcp_arrival_time_secs,
    938                           rtcp_arrival_time_frac,
    939                           NULL)) {
    940     return false;
    941   }
    942   *remote_sr =
    943       ((ntp_secs & 0x0000ffff) << 16) + ((ntp_frac & 0xffff0000) >> 16);
    944   return true;
    945 }
    946 
    947 bool ModuleRtpRtcpImpl::LastReceivedXrReferenceTimeInfo(
    948     RtcpReceiveTimeInfo* info) const {
    949   return rtcp_receiver_.LastReceivedXrReferenceTimeInfo(info);
    950 }
    951 
    952 bool ModuleRtpRtcpImpl::UpdateRTCPReceiveInformationTimers() {
    953   // If this returns true this channel has timed out.
    954   // Periodically check if this is true and if so call UpdateTMMBR.
    955   return rtcp_receiver_.UpdateRTCPReceiveInformationTimers();
    956 }
    957 
    958 // Called from RTCPsender.
    959 int32_t ModuleRtpRtcpImpl::BoundingSet(bool* tmmbr_owner,
    960                                        TMMBRSet* bounding_set) {
    961   return rtcp_receiver_.BoundingSet(tmmbr_owner, bounding_set);
    962 }
    963 
    964 int64_t ModuleRtpRtcpImpl::RtcpReportInterval() {
    965   if (audio_)
    966     return RTCP_INTERVAL_AUDIO_MS;
    967   else
    968     return RTCP_INTERVAL_VIDEO_MS;
    969 }
    970 
    971 void ModuleRtpRtcpImpl::SetRtcpReceiverSsrcs(uint32_t main_ssrc) {
    972   std::set<uint32_t> ssrcs;
    973   ssrcs.insert(main_ssrc);
    974   if (rtp_sender_.RtxStatus() != kRtxOff)
    975     ssrcs.insert(rtp_sender_.RtxSsrc());
    976   rtcp_receiver_.SetSsrcs(main_ssrc, ssrcs);
    977 }
    978 
    979 void ModuleRtpRtcpImpl::set_rtt_ms(int64_t rtt_ms) {
    980   CriticalSectionScoped cs(critical_section_rtt_.get());
    981   rtt_ms_ = rtt_ms;
    982 }
    983 
    984 int64_t ModuleRtpRtcpImpl::rtt_ms() const {
    985   CriticalSectionScoped cs(critical_section_rtt_.get());
    986   return rtt_ms_;
    987 }
    988 
    989 void ModuleRtpRtcpImpl::RegisterSendChannelRtpStatisticsCallback(
    990     StreamDataCountersCallback* callback) {
    991   rtp_sender_.RegisterRtpStatisticsCallback(callback);
    992 }
    993 
    994 StreamDataCountersCallback*
    995     ModuleRtpRtcpImpl::GetSendChannelRtpStatisticsCallback() const {
    996   return rtp_sender_.GetRtpStatisticsCallback();
    997 }
    998 }  // namespace webrtc
    999