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