• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
Configuration()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 
CreateRtpRtcp(const RtpRtcp::Configuration & configuration)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 
ModuleRtpRtcpImpl(const Configuration & configuration)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.
TimeUntilNextProcess()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).
Process()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 
SetRtxSendStatus(int mode)201 void ModuleRtpRtcpImpl::SetRtxSendStatus(int mode) {
202   rtp_sender_.SetRtxStatus(mode);
203 }
204 
RtxSendStatus() const205 int ModuleRtpRtcpImpl::RtxSendStatus() const {
206   return rtp_sender_.RtxStatus();
207 }
208 
SetRtxSsrc(uint32_t ssrc)209 void ModuleRtpRtcpImpl::SetRtxSsrc(uint32_t ssrc) {
210   rtp_sender_.SetRtxSsrc(ssrc);
211 }
212 
SetRtxSendPayloadType(int payload_type,int associated_payload_type)213 void ModuleRtpRtcpImpl::SetRtxSendPayloadType(int payload_type,
214                                               int associated_payload_type) {
215   rtp_sender_.SetRtxPayloadType(payload_type, associated_payload_type);
216 }
217 
RtxSendPayloadType() const218 std::pair<int, int> ModuleRtpRtcpImpl::RtxSendPayloadType() const {
219   return rtp_sender_.RtxPayloadType();
220 }
221 
IncomingRtcpPacket(const uint8_t * rtcp_packet,const size_t length)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 
RegisterSendPayload(const CodecInst & voice_codec)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 
RegisterSendPayload(const VideoCodec & video_codec)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 
DeRegisterSendPayload(const int8_t payload_type)261 int32_t ModuleRtpRtcpImpl::DeRegisterSendPayload(const int8_t payload_type) {
262   return rtp_sender_.DeRegisterSendPayload(payload_type);
263 }
264 
SendPayloadType() const265 int8_t ModuleRtpRtcpImpl::SendPayloadType() const {
266   return rtp_sender_.SendPayloadType();
267 }
268 
StartTimestamp() const269 uint32_t ModuleRtpRtcpImpl::StartTimestamp() const {
270   return rtp_sender_.StartTimestamp();
271 }
272 
273 // Configure start timestamp, default is a random number.
SetStartTimestamp(const uint32_t timestamp)274 void ModuleRtpRtcpImpl::SetStartTimestamp(const uint32_t timestamp) {
275   rtcp_sender_.SetStartTimestamp(timestamp);
276   rtp_sender_.SetStartTimestamp(timestamp, true);
277 }
278 
SequenceNumber() const279 uint16_t ModuleRtpRtcpImpl::SequenceNumber() const {
280   return rtp_sender_.SequenceNumber();
281 }
282 
283 // Set SequenceNumber, default is a random number.
SetSequenceNumber(const uint16_t seq_num)284 void ModuleRtpRtcpImpl::SetSequenceNumber(const uint16_t seq_num) {
285   rtp_sender_.SetSequenceNumber(seq_num);
286 }
287 
SetRtpStateForSsrc(uint32_t ssrc,const RtpState & rtp_state)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 
GetRtpStateForSsrc(uint32_t ssrc,RtpState * rtp_state)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 
SSRC() const313 uint32_t ModuleRtpRtcpImpl::SSRC() const {
314   return rtp_sender_.SSRC();
315 }
316 
317 // Configure SSRC, default is a random number.
SetSSRC(const uint32_t ssrc)318 void ModuleRtpRtcpImpl::SetSSRC(const uint32_t ssrc) {
319   rtp_sender_.SetSSRC(ssrc);
320   rtcp_sender_.SetSSRC(ssrc);
321   SetRtcpReceiverSsrcs(ssrc);
322 }
323 
SetCsrcs(const std::vector<uint32_t> & csrcs)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).
GetFeedbackState()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 
CurrentSendFrequencyHz() const356 int ModuleRtpRtcpImpl::CurrentSendFrequencyHz() const {
357   return rtp_sender_.SendPayloadFrequency();
358 }
359 
SetSendingStatus(const bool sending)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 
Sending() const388 bool ModuleRtpRtcpImpl::Sending() const {
389   return rtcp_sender_.Sending();
390 }
391 
SetSendingMediaStatus(const bool sending)392 void ModuleRtpRtcpImpl::SetSendingMediaStatus(const bool sending) {
393   rtp_sender_.SetSendingMediaStatus(sending);
394 }
395 
SendingMedia() const396 bool ModuleRtpRtcpImpl::SendingMedia() const {
397   return rtp_sender_.SendingMedia();
398 }
399 
SendOutgoingData(FrameType frame_type,int8_t payload_type,uint32_t time_stamp,int64_t capture_time_ms,const uint8_t * payload_data,size_t payload_size,const RTPFragmentationHeader * fragmentation,const RTPVideoHeader * rtp_video_hdr)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 
TimeToSendPacket(uint32_t ssrc,uint16_t sequence_number,int64_t capture_time_ms,bool retransmission)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 
TimeToSendPadding(size_t bytes)431 size_t ModuleRtpRtcpImpl::TimeToSendPadding(size_t bytes) {
432   return rtp_sender_.TimeToSendPadding(bytes);
433 }
434 
MaxPayloadLength() const435 uint16_t ModuleRtpRtcpImpl::MaxPayloadLength() const {
436   return rtp_sender_.MaxPayloadLength();
437 }
438 
MaxDataPayloadLength() const439 uint16_t ModuleRtpRtcpImpl::MaxDataPayloadLength() const {
440   return rtp_sender_.MaxDataPayloadLength();
441 }
442 
SetTransportOverhead(const bool tcp,const bool ipv6,const uint8_t authentication_overhead)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 
SetMaxTransferUnit(const uint16_t mtu)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 
RTCP() const483 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.
SetRTCPStatus(const RtcpMode method)491 void ModuleRtpRtcpImpl::SetRTCPStatus(const RtcpMode method) {
492   rtcp_sender_.SetRTCPStatus(method);
493   rtcp_receiver_.SetRTCPStatus(method);
494 }
495 
SetCNAME(const char * c_name)496 int32_t ModuleRtpRtcpImpl::SetCNAME(const char* c_name) {
497   return rtcp_sender_.SetCNAME(c_name);
498 }
499 
AddMixedCNAME(uint32_t ssrc,const char * c_name)500 int32_t ModuleRtpRtcpImpl::AddMixedCNAME(uint32_t ssrc, const char* c_name) {
501   return rtcp_sender_.AddMixedCNAME(ssrc, c_name);
502 }
503 
RemoveMixedCNAME(const uint32_t ssrc)504 int32_t ModuleRtpRtcpImpl::RemoveMixedCNAME(const uint32_t ssrc) {
505   return rtcp_sender_.RemoveMixedCNAME(ssrc);
506 }
507 
RemoteCNAME(const uint32_t remote_ssrc,char c_name[RTCP_CNAME_SIZE]) const508 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 
RemoteNTP(uint32_t * received_ntpsecs,uint32_t * received_ntpfrac,uint32_t * rtcp_arrival_time_secs,uint32_t * rtcp_arrival_time_frac,uint32_t * rtcp_timestamp) const514 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.
RTT(const uint32_t remote_ssrc,int64_t * rtt,int64_t * avg_rtt,int64_t * min_rtt,int64_t * max_rtt) const530 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.
SendRTCP(RTCPPacketType packet_type)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.
SendCompoundRTCP(const std::set<RTCPPacketType> & packet_types)551 int32_t ModuleRtpRtcpImpl::SendCompoundRTCP(
552     const std::set<RTCPPacketType>& packet_types) {
553   return rtcp_sender_.SendCompoundRTCP(GetFeedbackState(), packet_types);
554 }
555 
SetRTCPApplicationSpecificData(const uint8_t sub_type,const uint32_t name,const uint8_t * data,const uint16_t length)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.
SetRTCPVoIPMetrics(const RTCPVoIPMetric * voip_metric)565 int32_t ModuleRtpRtcpImpl::SetRTCPVoIPMetrics(
566   const RTCPVoIPMetric* voip_metric) {
567   return  rtcp_sender_.SetRTCPVoIPMetrics(voip_metric);
568 }
569 
SetRtcpXrRrtrStatus(bool enable)570 void ModuleRtpRtcpImpl::SetRtcpXrRrtrStatus(bool enable) {
571   return rtcp_sender_.SendRtcpXrReceiverReferenceTime(enable);
572 }
573 
RtcpXrRrtrStatus() const574 bool ModuleRtpRtcpImpl::RtcpXrRrtrStatus() const {
575   return rtcp_sender_.RtcpXrReceiverReferenceTime();
576 }
577 
578 // TODO(asapersson): Replace this method with the one below.
DataCountersRTP(size_t * bytes_sent,uint32_t * packets_sent) const579 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 
GetSendStreamDataCounters(StreamDataCounters * rtp_counters,StreamDataCounters * rtx_counters) const601 void ModuleRtpRtcpImpl::GetSendStreamDataCounters(
602     StreamDataCounters* rtp_counters,
603     StreamDataCounters* rtx_counters) const {
604   rtp_sender_.GetDataCounters(rtp_counters, rtx_counters);
605 }
606 
GetRtpPacketLossStats(bool outgoing,uint32_t ssrc,struct RtpPacketLossStats * loss_stats) const607 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 
RemoteRTCPStat(RTCPSenderInfo * sender_info)632 int32_t ModuleRtpRtcpImpl::RemoteRTCPStat(RTCPSenderInfo* sender_info) {
633   return rtcp_receiver_.SenderInfoReceived(sender_info);
634 }
635 
636 // Received RTCP report.
RemoteRTCPStat(std::vector<RTCPReportBlock> * receive_blocks) const637 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.
REMB() const643 bool ModuleRtpRtcpImpl::REMB() const {
644   return rtcp_sender_.REMB();
645 }
646 
SetREMBStatus(const bool enable)647 void ModuleRtpRtcpImpl::SetREMBStatus(const bool enable) {
648   rtcp_sender_.SetREMBStatus(enable);
649 }
650 
SetREMBData(const uint32_t bitrate,const std::vector<uint32_t> & ssrcs)651 void ModuleRtpRtcpImpl::SetREMBData(const uint32_t bitrate,
652                                     const std::vector<uint32_t>& ssrcs) {
653   rtcp_sender_.SetREMBData(bitrate, ssrcs);
654 }
655 
RegisterSendRtpHeaderExtension(const RTPExtensionType type,const uint8_t id)656 int32_t ModuleRtpRtcpImpl::RegisterSendRtpHeaderExtension(
657     const RTPExtensionType type,
658     const uint8_t id) {
659   return rtp_sender_.RegisterRtpHeaderExtension(type, id);
660 }
661 
DeregisterSendRtpHeaderExtension(const RTPExtensionType type)662 int32_t ModuleRtpRtcpImpl::DeregisterSendRtpHeaderExtension(
663     const RTPExtensionType type) {
664   return rtp_sender_.DeregisterRtpHeaderExtension(type);
665 }
666 
667 // (TMMBR) Temporary Max Media Bit Rate.
TMMBR() const668 bool ModuleRtpRtcpImpl::TMMBR() const {
669   return rtcp_sender_.TMMBR();
670 }
671 
SetTMMBRStatus(const bool enable)672 void ModuleRtpRtcpImpl::SetTMMBRStatus(const bool enable) {
673   rtcp_sender_.SetTMMBRStatus(enable);
674 }
675 
SetTMMBN(const TMMBRSet * bounding_set)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.
SelectiveRetransmissions() const683 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.
SetSelectiveRetransmissions(uint8_t settings)689 int ModuleRtpRtcpImpl::SetSelectiveRetransmissions(uint8_t settings) {
690   return rtp_sender_.SetSelectiveRetransmissions(settings);
691 }
692 
693 // Send a Negative acknowledgment packet.
SendNACK(const uint16_t * nack_list,const uint16_t size)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 
TimeToSendFullNackList(int64_t now) const732 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.
SetStorePacketsStatus(const bool enable,const uint16_t number_to_store)753 void ModuleRtpRtcpImpl::SetStorePacketsStatus(const bool enable,
754                                               const uint16_t number_to_store) {
755   rtp_sender_.SetStorePacketsStatus(enable, number_to_store);
756 }
757 
StorePackets() const758 bool ModuleRtpRtcpImpl::StorePackets() const {
759   return rtp_sender_.StorePackets();
760 }
761 
RegisterRtcpStatisticsCallback(RtcpStatisticsCallback * callback)762 void ModuleRtpRtcpImpl::RegisterRtcpStatisticsCallback(
763     RtcpStatisticsCallback* callback) {
764   rtcp_receiver_.RegisterRtcpStatisticsCallback(callback);
765 }
766 
GetRtcpStatisticsCallback()767 RtcpStatisticsCallback* ModuleRtpRtcpImpl::GetRtcpStatisticsCallback() {
768   return rtcp_receiver_.GetRtcpStatisticsCallback();
769 }
770 
SendFeedbackPacket(const rtcp::TransportFeedback & packet)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).
SendTelephoneEventOutband(const uint8_t key,const uint16_t time_ms,const uint8_t level)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).
SetAudioPacketSize(const uint16_t packet_size_samples)786 int32_t ModuleRtpRtcpImpl::SetAudioPacketSize(
787     const uint16_t packet_size_samples) {
788   return rtp_sender_.SetAudioPacketSize(packet_size_samples);
789 }
790 
SetAudioLevel(const uint8_t level_d_bov)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.
SetSendREDPayloadType(const int8_t payload_type)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.
SendREDPayloadType(int8_t * payload_type) const803 int32_t ModuleRtpRtcpImpl::SendREDPayloadType(int8_t* payload_type) const {
804   return rtp_sender_.RED(payload_type);
805 }
806 
SetTargetSendBitrate(uint32_t bitrate_bps)807 void ModuleRtpRtcpImpl::SetTargetSendBitrate(uint32_t bitrate_bps) {
808   rtp_sender_.SetTargetBitrate(bitrate_bps);
809 }
810 
SetKeyFrameRequestMethod(const KeyFrameRequestMethod method)811 int32_t ModuleRtpRtcpImpl::SetKeyFrameRequestMethod(
812     const KeyFrameRequestMethod method) {
813   key_frame_req_method_ = method;
814   return 0;
815 }
816 
RequestKeyFrame()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 
SendRTCPSliceLossIndication(const uint8_t picture_id)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 
SetGenericFECStatus(const bool enable,const uint8_t payload_type_red,const uint8_t payload_type_fec)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 
GenericFECStatus(bool * enable,uint8_t * payload_type_red,uint8_t * payload_type_fec)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 
SetFecParameters(const FecProtectionParams * delta_params,const FecProtectionParams * key_params)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 
SetRemoteSSRC(const uint32_t ssrc)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 
BitrateSent(uint32_t * total_rate,uint32_t * video_rate,uint32_t * fec_rate,uint32_t * nack_rate) const876 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 
OnRequestIntraFrame()886 void ModuleRtpRtcpImpl::OnRequestIntraFrame() {
887   RequestKeyFrame();
888 }
889 
OnRequestSendReport()890 void ModuleRtpRtcpImpl::OnRequestSendReport() {
891   SendRTCP(kRtcpSr);
892 }
893 
SendRTCPReferencePictureSelection(const uint64_t picture_id)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 
SendTimeOfSendReport(const uint32_t send_report)900 int64_t ModuleRtpRtcpImpl::SendTimeOfSendReport(
901     const uint32_t send_report) {
902   return rtcp_sender_.SendTimeOfSendReport(send_report);
903 }
904 
SendTimeOfXrRrReport(uint32_t mid_ntp,int64_t * time_ms) const905 bool ModuleRtpRtcpImpl::SendTimeOfXrRrReport(
906     uint32_t mid_ntp, int64_t* time_ms) const {
907   return rtcp_sender_.SendTimeOfXrRrReport(mid_ntp, time_ms);
908 }
909 
OnReceivedNACK(const std::list<uint16_t> & nack_sequence_numbers)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 
LastReceivedNTP(uint32_t * rtcp_arrival_time_secs,uint32_t * rtcp_arrival_time_frac,uint32_t * remote_sr) const927 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 
LastReceivedXrReferenceTimeInfo(RtcpReceiveTimeInfo * info) const947 bool ModuleRtpRtcpImpl::LastReceivedXrReferenceTimeInfo(
948     RtcpReceiveTimeInfo* info) const {
949   return rtcp_receiver_.LastReceivedXrReferenceTimeInfo(info);
950 }
951 
UpdateRTCPReceiveInformationTimers()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.
BoundingSet(bool * tmmbr_owner,TMMBRSet * bounding_set)959 int32_t ModuleRtpRtcpImpl::BoundingSet(bool* tmmbr_owner,
960                                        TMMBRSet* bounding_set) {
961   return rtcp_receiver_.BoundingSet(tmmbr_owner, bounding_set);
962 }
963 
RtcpReportInterval()964 int64_t ModuleRtpRtcpImpl::RtcpReportInterval() {
965   if (audio_)
966     return RTCP_INTERVAL_AUDIO_MS;
967   else
968     return RTCP_INTERVAL_VIDEO_MS;
969 }
970 
SetRtcpReceiverSsrcs(uint32_t main_ssrc)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 
set_rtt_ms(int64_t rtt_ms)979 void ModuleRtpRtcpImpl::set_rtt_ms(int64_t rtt_ms) {
980   CriticalSectionScoped cs(critical_section_rtt_.get());
981   rtt_ms_ = rtt_ms;
982 }
983 
rtt_ms() const984 int64_t ModuleRtpRtcpImpl::rtt_ms() const {
985   CriticalSectionScoped cs(critical_section_rtt_.get());
986   return rtt_ms_;
987 }
988 
RegisterSendChannelRtpStatisticsCallback(StreamDataCountersCallback * callback)989 void ModuleRtpRtcpImpl::RegisterSendChannelRtpStatisticsCallback(
990     StreamDataCountersCallback* callback) {
991   rtp_sender_.RegisterRtpStatisticsCallback(callback);
992 }
993 
994 StreamDataCountersCallback*
GetSendChannelRtpStatisticsCallback() const995     ModuleRtpRtcpImpl::GetSendChannelRtpStatisticsCallback() const {
996   return rtp_sender_.GetRtpStatisticsCallback();
997 }
998 }  // namespace webrtc
999