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