blob: c8f10ac4814a79d0353699a259cee006a1dfc851 [file] [log] [blame]
Tommi3a5742c2020-05-20 09:32:51 +02001/*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "modules/rtp_rtcp/source/rtp_rtcp_impl2.h"
12
13#include <string.h>
14
15#include <algorithm>
16#include <cstdint>
17#include <memory>
18#include <set>
19#include <string>
20#include <utility>
21
22#include "api/transport/field_trial_based_config.h"
23#include "modules/rtp_rtcp/source/rtcp_packet/dlrr.h"
24#include "modules/rtp_rtcp/source/rtp_rtcp_config.h"
25#include "rtc_base/checks.h"
26#include "rtc_base/logging.h"
27
28#ifdef _WIN32
29// Disable warning C4355: 'this' : used in base member initializer list.
30#pragma warning(disable : 4355)
31#endif
32
33namespace webrtc {
34namespace {
35const int64_t kRtpRtcpMaxIdleTimeProcessMs = 5;
36const int64_t kRtpRtcpRttProcessTimeMs = 1000;
37const int64_t kRtpRtcpBitrateProcessTimeMs = 10;
38const int64_t kDefaultExpectedRetransmissionTimeMs = 125;
39} // namespace
40
41ModuleRtpRtcpImpl2::RtpSenderContext::RtpSenderContext(
42 const RtpRtcp::Configuration& config)
43 : packet_history(config.clock, config.enable_rtx_padding_prioritization),
44 packet_sender(config, &packet_history),
45 non_paced_sender(&packet_sender),
46 packet_generator(
47 config,
48 &packet_history,
49 config.paced_sender ? config.paced_sender : &non_paced_sender) {}
50
51std::unique_ptr<RtpRtcp> RtpRtcp::Create(const Configuration& configuration) {
52 RTC_DCHECK(configuration.clock);
53 return std::make_unique<ModuleRtpRtcpImpl2>(configuration);
54}
55
56ModuleRtpRtcpImpl2::ModuleRtpRtcpImpl2(const Configuration& configuration)
57 : rtcp_sender_(configuration),
58 rtcp_receiver_(configuration, this),
59 clock_(configuration.clock),
60 last_bitrate_process_time_(clock_->TimeInMilliseconds()),
61 last_rtt_process_time_(clock_->TimeInMilliseconds()),
62 next_process_time_(clock_->TimeInMilliseconds() +
63 kRtpRtcpMaxIdleTimeProcessMs),
64 packet_overhead_(28), // IPV4 UDP.
65 nack_last_time_sent_full_ms_(0),
66 nack_last_seq_number_sent_(0),
67 remote_bitrate_(configuration.remote_bitrate_estimator),
68 rtt_stats_(configuration.rtt_stats),
69 rtt_ms_(0) {
70 process_thread_checker_.Detach();
71 if (!configuration.receiver_only) {
72 rtp_sender_ = std::make_unique<RtpSenderContext>(configuration);
73 // Make sure rtcp sender use same timestamp offset as rtp sender.
74 rtcp_sender_.SetTimestampOffset(
75 rtp_sender_->packet_generator.TimestampOffset());
76 }
77
78 // Set default packet size limit.
79 // TODO(nisse): Kind-of duplicates
80 // webrtc::VideoSendStream::Config::Rtp::kDefaultMaxPacketSize.
81 const size_t kTcpOverIpv4HeaderSize = 40;
82 SetMaxRtpPacketSize(IP_PACKET_SIZE - kTcpOverIpv4HeaderSize);
83}
84
85ModuleRtpRtcpImpl2::~ModuleRtpRtcpImpl2() {
86 RTC_DCHECK_RUN_ON(&construction_thread_checker_);
87}
88
89// Returns the number of milliseconds until the module want a worker thread
90// to call Process.
91int64_t ModuleRtpRtcpImpl2::TimeUntilNextProcess() {
92 RTC_DCHECK_RUN_ON(&process_thread_checker_);
93 return std::max<int64_t>(0,
94 next_process_time_ - clock_->TimeInMilliseconds());
95}
96
97// Process any pending tasks such as timeouts (non time critical events).
98void ModuleRtpRtcpImpl2::Process() {
99 RTC_DCHECK_RUN_ON(&process_thread_checker_);
100 const int64_t now = clock_->TimeInMilliseconds();
101 // TODO(bugs.webrtc.org/11581): Figure out why we need to call Process() 200
102 // times a second.
103 next_process_time_ = now + kRtpRtcpMaxIdleTimeProcessMs;
104
105 if (rtp_sender_) {
106 if (now >= last_bitrate_process_time_ + kRtpRtcpBitrateProcessTimeMs) {
107 rtp_sender_->packet_sender.ProcessBitrateAndNotifyObservers();
108 last_bitrate_process_time_ = now;
109 // TODO(bugs.webrtc.org/11581): Is this a bug? At the top of the function,
110 // next_process_time_ is incremented by 5ms, here we effectively do a
111 // std::min() of (now + 5ms, now + 10ms). Seems like this is a no-op?
112 next_process_time_ =
113 std::min(next_process_time_, now + kRtpRtcpBitrateProcessTimeMs);
114 }
115 }
116
117 // TODO(bugs.webrtc.org/11581): We update the RTT once a second, whereas other
118 // things that run in this method are updated much more frequently. Move the
119 // RTT checking over to the worker thread, which matches better with where the
120 // stats are maintained.
121 bool process_rtt = now >= last_rtt_process_time_ + kRtpRtcpRttProcessTimeMs;
122 if (rtcp_sender_.Sending()) {
123 // Process RTT if we have received a report block and we haven't
124 // processed RTT for at least |kRtpRtcpRttProcessTimeMs| milliseconds.
125 // Note that LastReceivedReportBlockMs() grabs a lock, so check
126 // |process_rtt| first.
127 if (process_rtt &&
128 rtcp_receiver_.LastReceivedReportBlockMs() > last_rtt_process_time_) {
129 std::vector<RTCPReportBlock> receive_blocks;
130 rtcp_receiver_.StatisticsReceived(&receive_blocks);
131 int64_t max_rtt = 0;
132 for (std::vector<RTCPReportBlock>::iterator it = receive_blocks.begin();
133 it != receive_blocks.end(); ++it) {
134 int64_t rtt = 0;
135 rtcp_receiver_.RTT(it->sender_ssrc, &rtt, NULL, NULL, NULL);
136 max_rtt = (rtt > max_rtt) ? rtt : max_rtt;
137 }
138 // Report the rtt.
139 if (rtt_stats_ && max_rtt != 0)
140 rtt_stats_->OnRttUpdate(max_rtt);
141 }
142
143 // Verify receiver reports are delivered and the reported sequence number
144 // is increasing.
145 // TODO(bugs.webrtc.org/11581): The timeout value needs to be checked every
146 // few seconds (see internals of RtcpRrTimeout). Here, we may be polling it
147 // a couple of hundred times a second, which isn't great since it grabs a
148 // lock. Note also that LastReceivedReportBlockMs() (called above) and
149 // RtcpRrTimeout() both grab the same lock and check the same timer, so
150 // it should be possible to consolidate that work somehow.
151 if (rtcp_receiver_.RtcpRrTimeout()) {
152 RTC_LOG_F(LS_WARNING) << "Timeout: No RTCP RR received.";
153 } else if (rtcp_receiver_.RtcpRrSequenceNumberTimeout()) {
154 RTC_LOG_F(LS_WARNING) << "Timeout: No increase in RTCP RR extended "
155 "highest sequence number.";
156 }
157
158 if (remote_bitrate_ && rtcp_sender_.TMMBR()) {
159 unsigned int target_bitrate = 0;
160 std::vector<unsigned int> ssrcs;
161 if (remote_bitrate_->LatestEstimate(&ssrcs, &target_bitrate)) {
162 if (!ssrcs.empty()) {
163 target_bitrate = target_bitrate / ssrcs.size();
164 }
165 rtcp_sender_.SetTargetBitrate(target_bitrate);
166 }
167 }
168 } else {
169 // Report rtt from receiver.
170 if (process_rtt) {
171 int64_t rtt_ms;
172 if (rtt_stats_ && rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms)) {
173 rtt_stats_->OnRttUpdate(rtt_ms);
174 }
175 }
176 }
177
178 // Get processed rtt.
179 if (process_rtt) {
180 last_rtt_process_time_ = now;
181 // TODO(bugs.webrtc.org/11581): Is this a bug? At the top of the function,
182 // next_process_time_ is incremented by 5ms, here we effectively do a
183 // std::min() of (now + 5ms, now + 1000ms). Seems like this is a no-op?
184 next_process_time_ = std::min(
185 next_process_time_, last_rtt_process_time_ + kRtpRtcpRttProcessTimeMs);
186 if (rtt_stats_) {
187 // Make sure we have a valid RTT before setting.
188 int64_t last_rtt = rtt_stats_->LastProcessedRtt();
189 if (last_rtt >= 0)
190 set_rtt_ms(last_rtt);
191 }
192 }
193
194 if (rtcp_sender_.TimeToSendRTCPReport())
195 rtcp_sender_.SendRTCP(GetFeedbackState(), kRtcpReport);
196
197 if (TMMBR() && rtcp_receiver_.UpdateTmmbrTimers()) {
198 rtcp_receiver_.NotifyTmmbrUpdated();
199 }
200}
201
202void ModuleRtpRtcpImpl2::SetRtxSendStatus(int mode) {
203 rtp_sender_->packet_generator.SetRtxStatus(mode);
204}
205
206int ModuleRtpRtcpImpl2::RtxSendStatus() const {
207 return rtp_sender_ ? rtp_sender_->packet_generator.RtxStatus() : kRtxOff;
208}
209
210void ModuleRtpRtcpImpl2::SetRtxSendPayloadType(int payload_type,
211 int associated_payload_type) {
212 rtp_sender_->packet_generator.SetRtxPayloadType(payload_type,
213 associated_payload_type);
214}
215
216absl::optional<uint32_t> ModuleRtpRtcpImpl2::RtxSsrc() const {
217 return rtp_sender_ ? rtp_sender_->packet_generator.RtxSsrc() : absl::nullopt;
218}
219
220absl::optional<uint32_t> ModuleRtpRtcpImpl2::FlexfecSsrc() const {
221 if (rtp_sender_) {
222 return rtp_sender_->packet_generator.FlexfecSsrc();
223 }
224 return absl::nullopt;
225}
226
227void ModuleRtpRtcpImpl2::IncomingRtcpPacket(const uint8_t* rtcp_packet,
228 const size_t length) {
229 rtcp_receiver_.IncomingPacket(rtcp_packet, length);
230}
231
232void ModuleRtpRtcpImpl2::RegisterSendPayloadFrequency(int payload_type,
233 int payload_frequency) {
234 rtcp_sender_.SetRtpClockRate(payload_type, payload_frequency);
235}
236
237int32_t ModuleRtpRtcpImpl2::DeRegisterSendPayload(const int8_t payload_type) {
238 return 0;
239}
240
241uint32_t ModuleRtpRtcpImpl2::StartTimestamp() const {
242 return rtp_sender_->packet_generator.TimestampOffset();
243}
244
245// Configure start timestamp, default is a random number.
246void ModuleRtpRtcpImpl2::SetStartTimestamp(const uint32_t timestamp) {
247 rtcp_sender_.SetTimestampOffset(timestamp);
248 rtp_sender_->packet_generator.SetTimestampOffset(timestamp);
249 rtp_sender_->packet_sender.SetTimestampOffset(timestamp);
250}
251
252uint16_t ModuleRtpRtcpImpl2::SequenceNumber() const {
253 return rtp_sender_->packet_generator.SequenceNumber();
254}
255
256// Set SequenceNumber, default is a random number.
257void ModuleRtpRtcpImpl2::SetSequenceNumber(const uint16_t seq_num) {
258 rtp_sender_->packet_generator.SetSequenceNumber(seq_num);
259}
260
261void ModuleRtpRtcpImpl2::SetRtpState(const RtpState& rtp_state) {
262 rtp_sender_->packet_generator.SetRtpState(rtp_state);
263 rtp_sender_->packet_sender.SetMediaHasBeenSent(rtp_state.media_has_been_sent);
264 rtcp_sender_.SetTimestampOffset(rtp_state.start_timestamp);
265}
266
267void ModuleRtpRtcpImpl2::SetRtxState(const RtpState& rtp_state) {
268 rtp_sender_->packet_generator.SetRtxRtpState(rtp_state);
269}
270
271RtpState ModuleRtpRtcpImpl2::GetRtpState() const {
272 RtpState state = rtp_sender_->packet_generator.GetRtpState();
273 state.media_has_been_sent = rtp_sender_->packet_sender.MediaHasBeenSent();
274 return state;
275}
276
277RtpState ModuleRtpRtcpImpl2::GetRtxState() const {
278 return rtp_sender_->packet_generator.GetRtxRtpState();
279}
280
281void ModuleRtpRtcpImpl2::SetRid(const std::string& rid) {
282 if (rtp_sender_) {
283 rtp_sender_->packet_generator.SetRid(rid);
284 }
285}
286
287void ModuleRtpRtcpImpl2::SetMid(const std::string& mid) {
288 if (rtp_sender_) {
289 rtp_sender_->packet_generator.SetMid(mid);
290 }
291 // TODO(bugs.webrtc.org/4050): If we end up supporting the MID SDES item for
292 // RTCP, this will need to be passed down to the RTCPSender also.
293}
294
295void ModuleRtpRtcpImpl2::SetCsrcs(const std::vector<uint32_t>& csrcs) {
296 rtcp_sender_.SetCsrcs(csrcs);
297 rtp_sender_->packet_generator.SetCsrcs(csrcs);
298}
299
300// TODO(pbos): Handle media and RTX streams separately (separate RTCP
301// feedbacks).
302RTCPSender::FeedbackState ModuleRtpRtcpImpl2::GetFeedbackState() {
303 RTCPSender::FeedbackState state;
304 // This is called also when receiver_only is true. Hence below
305 // checks that rtp_sender_ exists.
306 if (rtp_sender_) {
307 StreamDataCounters rtp_stats;
308 StreamDataCounters rtx_stats;
309 rtp_sender_->packet_sender.GetDataCounters(&rtp_stats, &rtx_stats);
310 state.packets_sent =
311 rtp_stats.transmitted.packets + rtx_stats.transmitted.packets;
312 state.media_bytes_sent = rtp_stats.transmitted.payload_bytes +
313 rtx_stats.transmitted.payload_bytes;
314 state.send_bitrate =
315 rtp_sender_->packet_sender.GetSendRates().Sum().bps<uint32_t>();
316 }
317 state.receiver = &rtcp_receiver_;
318
319 LastReceivedNTP(&state.last_rr_ntp_secs, &state.last_rr_ntp_frac,
320 &state.remote_sr);
321
322 state.last_xr_rtis = rtcp_receiver_.ConsumeReceivedXrReferenceTimeInfo();
323
324 return state;
325}
326
327// TODO(nisse): This method shouldn't be called for a receive-only
328// stream. Delete rtp_sender_ check as soon as all applications are
329// updated.
330int32_t ModuleRtpRtcpImpl2::SetSendingStatus(const bool sending) {
331 if (rtcp_sender_.Sending() != sending) {
332 // Sends RTCP BYE when going from true to false
333 if (rtcp_sender_.SetSendingStatus(GetFeedbackState(), sending) != 0) {
334 RTC_LOG(LS_WARNING) << "Failed to send RTCP BYE";
335 }
336 }
337 return 0;
338}
339
340bool ModuleRtpRtcpImpl2::Sending() const {
341 return rtcp_sender_.Sending();
342}
343
344// TODO(nisse): This method shouldn't be called for a receive-only
345// stream. Delete rtp_sender_ check as soon as all applications are
346// updated.
347void ModuleRtpRtcpImpl2::SetSendingMediaStatus(const bool sending) {
348 if (rtp_sender_) {
349 rtp_sender_->packet_generator.SetSendingMediaStatus(sending);
350 } else {
351 RTC_DCHECK(!sending);
352 }
353}
354
355bool ModuleRtpRtcpImpl2::SendingMedia() const {
356 return rtp_sender_ ? rtp_sender_->packet_generator.SendingMedia() : false;
357}
358
359bool ModuleRtpRtcpImpl2::IsAudioConfigured() const {
360 return rtp_sender_ ? rtp_sender_->packet_generator.IsAudioConfigured()
361 : false;
362}
363
364void ModuleRtpRtcpImpl2::SetAsPartOfAllocation(bool part_of_allocation) {
365 RTC_CHECK(rtp_sender_);
366 rtp_sender_->packet_sender.ForceIncludeSendPacketsInAllocation(
367 part_of_allocation);
368}
369
370bool ModuleRtpRtcpImpl2::OnSendingRtpFrame(uint32_t timestamp,
371 int64_t capture_time_ms,
372 int payload_type,
373 bool force_sender_report) {
374 if (!Sending())
375 return false;
376
377 rtcp_sender_.SetLastRtpTime(timestamp, capture_time_ms, payload_type);
378 // Make sure an RTCP report isn't queued behind a key frame.
379 if (rtcp_sender_.TimeToSendRTCPReport(force_sender_report))
380 rtcp_sender_.SendRTCP(GetFeedbackState(), kRtcpReport);
381
382 return true;
383}
384
385bool ModuleRtpRtcpImpl2::TrySendPacket(RtpPacketToSend* packet,
386 const PacedPacketInfo& pacing_info) {
387 RTC_DCHECK(rtp_sender_);
388 // TODO(sprang): Consider if we can remove this check.
389 if (!rtp_sender_->packet_generator.SendingMedia()) {
390 return false;
391 }
392 rtp_sender_->packet_sender.SendPacket(packet, pacing_info);
393 return true;
394}
395
396void ModuleRtpRtcpImpl2::OnPacketsAcknowledged(
397 rtc::ArrayView<const uint16_t> sequence_numbers) {
398 RTC_DCHECK(rtp_sender_);
399 rtp_sender_->packet_history.CullAcknowledgedPackets(sequence_numbers);
400}
401
402bool ModuleRtpRtcpImpl2::SupportsPadding() const {
403 RTC_DCHECK(rtp_sender_);
404 return rtp_sender_->packet_generator.SupportsPadding();
405}
406
407bool ModuleRtpRtcpImpl2::SupportsRtxPayloadPadding() const {
408 RTC_DCHECK(rtp_sender_);
409 return rtp_sender_->packet_generator.SupportsRtxPayloadPadding();
410}
411
412std::vector<std::unique_ptr<RtpPacketToSend>>
413ModuleRtpRtcpImpl2::GeneratePadding(size_t target_size_bytes) {
414 RTC_DCHECK(rtp_sender_);
415 return rtp_sender_->packet_generator.GeneratePadding(
416 target_size_bytes, rtp_sender_->packet_sender.MediaHasBeenSent());
417}
418
419std::vector<RtpSequenceNumberMap::Info>
420ModuleRtpRtcpImpl2::GetSentRtpPacketInfos(
421 rtc::ArrayView<const uint16_t> sequence_numbers) const {
422 RTC_DCHECK(rtp_sender_);
423 return rtp_sender_->packet_sender.GetSentRtpPacketInfos(sequence_numbers);
424}
425
426size_t ModuleRtpRtcpImpl2::ExpectedPerPacketOverhead() const {
427 if (!rtp_sender_) {
428 return 0;
429 }
430 return rtp_sender_->packet_generator.ExpectedPerPacketOverhead();
431}
432
433size_t ModuleRtpRtcpImpl2::MaxRtpPacketSize() const {
434 RTC_DCHECK(rtp_sender_);
435 return rtp_sender_->packet_generator.MaxRtpPacketSize();
436}
437
438void ModuleRtpRtcpImpl2::SetMaxRtpPacketSize(size_t rtp_packet_size) {
439 RTC_DCHECK_LE(rtp_packet_size, IP_PACKET_SIZE)
440 << "rtp packet size too large: " << rtp_packet_size;
441 RTC_DCHECK_GT(rtp_packet_size, packet_overhead_)
442 << "rtp packet size too small: " << rtp_packet_size;
443
444 rtcp_sender_.SetMaxRtpPacketSize(rtp_packet_size);
445 if (rtp_sender_) {
446 rtp_sender_->packet_generator.SetMaxRtpPacketSize(rtp_packet_size);
447 }
448}
449
450RtcpMode ModuleRtpRtcpImpl2::RTCP() const {
451 return rtcp_sender_.Status();
452}
453
454// Configure RTCP status i.e on/off.
455void ModuleRtpRtcpImpl2::SetRTCPStatus(const RtcpMode method) {
456 rtcp_sender_.SetRTCPStatus(method);
457}
458
459int32_t ModuleRtpRtcpImpl2::SetCNAME(const char* c_name) {
460 return rtcp_sender_.SetCNAME(c_name);
461}
462
463int32_t ModuleRtpRtcpImpl2::AddMixedCNAME(uint32_t ssrc, const char* c_name) {
464 return rtcp_sender_.AddMixedCNAME(ssrc, c_name);
465}
466
467int32_t ModuleRtpRtcpImpl2::RemoveMixedCNAME(const uint32_t ssrc) {
468 return rtcp_sender_.RemoveMixedCNAME(ssrc);
469}
470
471int32_t ModuleRtpRtcpImpl2::RemoteCNAME(const uint32_t remote_ssrc,
472 char c_name[RTCP_CNAME_SIZE]) const {
473 return rtcp_receiver_.CNAME(remote_ssrc, c_name);
474}
475
476int32_t ModuleRtpRtcpImpl2::RemoteNTP(uint32_t* received_ntpsecs,
477 uint32_t* received_ntpfrac,
478 uint32_t* rtcp_arrival_time_secs,
479 uint32_t* rtcp_arrival_time_frac,
480 uint32_t* rtcp_timestamp) const {
481 return rtcp_receiver_.NTP(received_ntpsecs, received_ntpfrac,
482 rtcp_arrival_time_secs, rtcp_arrival_time_frac,
483 rtcp_timestamp)
484 ? 0
485 : -1;
486}
487
488// Get RoundTripTime.
489int32_t ModuleRtpRtcpImpl2::RTT(const uint32_t remote_ssrc,
490 int64_t* rtt,
491 int64_t* avg_rtt,
492 int64_t* min_rtt,
493 int64_t* max_rtt) const {
494 int32_t ret = rtcp_receiver_.RTT(remote_ssrc, rtt, avg_rtt, min_rtt, max_rtt);
495 if (rtt && *rtt == 0) {
496 // Try to get RTT from RtcpRttStats class.
497 *rtt = rtt_ms();
498 }
499 return ret;
500}
501
502int64_t ModuleRtpRtcpImpl2::ExpectedRetransmissionTimeMs() const {
503 int64_t expected_retransmission_time_ms = rtt_ms();
504 if (expected_retransmission_time_ms > 0) {
505 return expected_retransmission_time_ms;
506 }
507 // No rtt available (|kRtpRtcpRttProcessTimeMs| not yet passed?), so try to
508 // poll avg_rtt_ms directly from rtcp receiver.
509 if (rtcp_receiver_.RTT(rtcp_receiver_.RemoteSSRC(), nullptr,
510 &expected_retransmission_time_ms, nullptr,
511 nullptr) == 0) {
512 return expected_retransmission_time_ms;
513 }
514 return kDefaultExpectedRetransmissionTimeMs;
515}
516
517// Force a send of an RTCP packet.
518// Normal SR and RR are triggered via the process function.
519int32_t ModuleRtpRtcpImpl2::SendRTCP(RTCPPacketType packet_type) {
520 return rtcp_sender_.SendRTCP(GetFeedbackState(), packet_type);
521}
522
523int32_t ModuleRtpRtcpImpl2::SetRTCPApplicationSpecificData(
524 const uint8_t sub_type,
525 const uint32_t name,
526 const uint8_t* data,
527 const uint16_t length) {
528 return rtcp_sender_.SetApplicationSpecificData(sub_type, name, data, length);
529}
530
531void ModuleRtpRtcpImpl2::SetRtcpXrRrtrStatus(bool enable) {
532 rtcp_receiver_.SetRtcpXrRrtrStatus(enable);
533 rtcp_sender_.SendRtcpXrReceiverReferenceTime(enable);
534}
535
536bool ModuleRtpRtcpImpl2::RtcpXrRrtrStatus() const {
537 return rtcp_sender_.RtcpXrReceiverReferenceTime();
538}
539
540// TODO(asapersson): Replace this method with the one below.
541int32_t ModuleRtpRtcpImpl2::DataCountersRTP(size_t* bytes_sent,
542 uint32_t* packets_sent) const {
543 StreamDataCounters rtp_stats;
544 StreamDataCounters rtx_stats;
545 rtp_sender_->packet_sender.GetDataCounters(&rtp_stats, &rtx_stats);
546
547 if (bytes_sent) {
548 // TODO(http://crbug.com/webrtc/10525): Bytes sent should only include
549 // payload bytes, not header and padding bytes.
550 *bytes_sent = rtp_stats.transmitted.payload_bytes +
551 rtp_stats.transmitted.padding_bytes +
552 rtp_stats.transmitted.header_bytes +
553 rtx_stats.transmitted.payload_bytes +
554 rtx_stats.transmitted.padding_bytes +
555 rtx_stats.transmitted.header_bytes;
556 }
557 if (packets_sent) {
558 *packets_sent =
559 rtp_stats.transmitted.packets + rtx_stats.transmitted.packets;
560 }
561 return 0;
562}
563
564void ModuleRtpRtcpImpl2::GetSendStreamDataCounters(
565 StreamDataCounters* rtp_counters,
566 StreamDataCounters* rtx_counters) const {
567 rtp_sender_->packet_sender.GetDataCounters(rtp_counters, rtx_counters);
568}
569
570// Received RTCP report.
571int32_t ModuleRtpRtcpImpl2::RemoteRTCPStat(
572 std::vector<RTCPReportBlock>* receive_blocks) const {
573 return rtcp_receiver_.StatisticsReceived(receive_blocks);
574}
575
576std::vector<ReportBlockData> ModuleRtpRtcpImpl2::GetLatestReportBlockData()
577 const {
578 return rtcp_receiver_.GetLatestReportBlockData();
579}
580
581// (REMB) Receiver Estimated Max Bitrate.
582void ModuleRtpRtcpImpl2::SetRemb(int64_t bitrate_bps,
583 std::vector<uint32_t> ssrcs) {
584 rtcp_sender_.SetRemb(bitrate_bps, std::move(ssrcs));
585}
586
587void ModuleRtpRtcpImpl2::UnsetRemb() {
588 rtcp_sender_.UnsetRemb();
589}
590
591void ModuleRtpRtcpImpl2::SetExtmapAllowMixed(bool extmap_allow_mixed) {
592 rtp_sender_->packet_generator.SetExtmapAllowMixed(extmap_allow_mixed);
593}
594
595int32_t ModuleRtpRtcpImpl2::RegisterSendRtpHeaderExtension(
596 const RTPExtensionType type,
597 const uint8_t id) {
598 return rtp_sender_->packet_generator.RegisterRtpHeaderExtension(type, id);
599}
600
601void ModuleRtpRtcpImpl2::RegisterRtpHeaderExtension(absl::string_view uri,
602 int id) {
603 bool registered =
604 rtp_sender_->packet_generator.RegisterRtpHeaderExtension(uri, id);
605 RTC_CHECK(registered);
606}
607
608int32_t ModuleRtpRtcpImpl2::DeregisterSendRtpHeaderExtension(
609 const RTPExtensionType type) {
610 return rtp_sender_->packet_generator.DeregisterRtpHeaderExtension(type);
611}
612void ModuleRtpRtcpImpl2::DeregisterSendRtpHeaderExtension(
613 absl::string_view uri) {
614 rtp_sender_->packet_generator.DeregisterRtpHeaderExtension(uri);
615}
616
617// (TMMBR) Temporary Max Media Bit Rate.
618bool ModuleRtpRtcpImpl2::TMMBR() const {
619 return rtcp_sender_.TMMBR();
620}
621
622void ModuleRtpRtcpImpl2::SetTMMBRStatus(const bool enable) {
623 rtcp_sender_.SetTMMBRStatus(enable);
624}
625
626void ModuleRtpRtcpImpl2::SetTmmbn(std::vector<rtcp::TmmbItem> bounding_set) {
627 rtcp_sender_.SetTmmbn(std::move(bounding_set));
628}
629
630// Send a Negative acknowledgment packet.
631int32_t ModuleRtpRtcpImpl2::SendNACK(const uint16_t* nack_list,
632 const uint16_t size) {
633 uint16_t nack_length = size;
634 uint16_t start_id = 0;
635 int64_t now_ms = clock_->TimeInMilliseconds();
636 if (TimeToSendFullNackList(now_ms)) {
637 nack_last_time_sent_full_ms_ = now_ms;
638 } else {
639 // Only send extended list.
640 if (nack_last_seq_number_sent_ == nack_list[size - 1]) {
641 // Last sequence number is the same, do not send list.
642 return 0;
643 }
644 // Send new sequence numbers.
645 for (int i = 0; i < size; ++i) {
646 if (nack_last_seq_number_sent_ == nack_list[i]) {
647 start_id = i + 1;
648 break;
649 }
650 }
651 nack_length = size - start_id;
652 }
653
654 // Our RTCP NACK implementation is limited to kRtcpMaxNackFields sequence
655 // numbers per RTCP packet.
656 if (nack_length > kRtcpMaxNackFields) {
657 nack_length = kRtcpMaxNackFields;
658 }
659 nack_last_seq_number_sent_ = nack_list[start_id + nack_length - 1];
660
661 return rtcp_sender_.SendRTCP(GetFeedbackState(), kRtcpNack, nack_length,
662 &nack_list[start_id]);
663}
664
665void ModuleRtpRtcpImpl2::SendNack(
666 const std::vector<uint16_t>& sequence_numbers) {
667 rtcp_sender_.SendRTCP(GetFeedbackState(), kRtcpNack, sequence_numbers.size(),
668 sequence_numbers.data());
669}
670
671bool ModuleRtpRtcpImpl2::TimeToSendFullNackList(int64_t now) const {
672 // Use RTT from RtcpRttStats class if provided.
673 int64_t rtt = rtt_ms();
674 if (rtt == 0) {
675 rtcp_receiver_.RTT(rtcp_receiver_.RemoteSSRC(), NULL, &rtt, NULL, NULL);
676 }
677
678 const int64_t kStartUpRttMs = 100;
679 int64_t wait_time = 5 + ((rtt * 3) >> 1); // 5 + RTT * 1.5.
680 if (rtt == 0) {
681 wait_time = kStartUpRttMs;
682 }
683
684 // Send a full NACK list once within every |wait_time|.
685 return now - nack_last_time_sent_full_ms_ > wait_time;
686}
687
688// Store the sent packets, needed to answer to Negative acknowledgment requests.
689void ModuleRtpRtcpImpl2::SetStorePacketsStatus(const bool enable,
690 const uint16_t number_to_store) {
691 rtp_sender_->packet_history.SetStorePacketsStatus(
692 enable ? RtpPacketHistory::StorageMode::kStoreAndCull
693 : RtpPacketHistory::StorageMode::kDisabled,
694 number_to_store);
695}
696
697bool ModuleRtpRtcpImpl2::StorePackets() const {
698 return rtp_sender_->packet_history.GetStorageMode() !=
699 RtpPacketHistory::StorageMode::kDisabled;
700}
701
702void ModuleRtpRtcpImpl2::SendCombinedRtcpPacket(
703 std::vector<std::unique_ptr<rtcp::RtcpPacket>> rtcp_packets) {
704 rtcp_sender_.SendCombinedRtcpPacket(std::move(rtcp_packets));
705}
706
707int32_t ModuleRtpRtcpImpl2::SendLossNotification(uint16_t last_decoded_seq_num,
708 uint16_t last_received_seq_num,
709 bool decodability_flag,
710 bool buffering_allowed) {
711 return rtcp_sender_.SendLossNotification(
712 GetFeedbackState(), last_decoded_seq_num, last_received_seq_num,
713 decodability_flag, buffering_allowed);
714}
715
716void ModuleRtpRtcpImpl2::SetRemoteSSRC(const uint32_t ssrc) {
717 // Inform about the incoming SSRC.
718 rtcp_sender_.SetRemoteSSRC(ssrc);
719 rtcp_receiver_.SetRemoteSSRC(ssrc);
720}
721
722// TODO(nisse): Delete video_rate amd fec_rate arguments.
723void ModuleRtpRtcpImpl2::BitrateSent(uint32_t* total_rate,
724 uint32_t* video_rate,
725 uint32_t* fec_rate,
726 uint32_t* nack_rate) const {
727 RtpSendRates send_rates = rtp_sender_->packet_sender.GetSendRates();
728 *total_rate = send_rates.Sum().bps<uint32_t>();
729 if (video_rate)
730 *video_rate = 0;
731 if (fec_rate)
732 *fec_rate = 0;
733 *nack_rate = send_rates[RtpPacketMediaType::kRetransmission].bps<uint32_t>();
734}
735
736RtpSendRates ModuleRtpRtcpImpl2::GetSendRates() const {
737 return rtp_sender_->packet_sender.GetSendRates();
738}
739
740void ModuleRtpRtcpImpl2::OnRequestSendReport() {
741 SendRTCP(kRtcpSr);
742}
743
744void ModuleRtpRtcpImpl2::OnReceivedNack(
745 const std::vector<uint16_t>& nack_sequence_numbers) {
746 if (!rtp_sender_)
747 return;
748
749 if (!StorePackets() || nack_sequence_numbers.empty()) {
750 return;
751 }
752 // Use RTT from RtcpRttStats class if provided.
753 int64_t rtt = rtt_ms();
754 if (rtt == 0) {
755 rtcp_receiver_.RTT(rtcp_receiver_.RemoteSSRC(), NULL, &rtt, NULL, NULL);
756 }
757 rtp_sender_->packet_generator.OnReceivedNack(nack_sequence_numbers, rtt);
758}
759
760void ModuleRtpRtcpImpl2::OnReceivedRtcpReportBlocks(
761 const ReportBlockList& report_blocks) {
762 if (rtp_sender_) {
763 uint32_t ssrc = SSRC();
764 absl::optional<uint32_t> rtx_ssrc;
765 if (rtp_sender_->packet_generator.RtxStatus() != kRtxOff) {
766 rtx_ssrc = rtp_sender_->packet_generator.RtxSsrc();
767 }
768
769 for (const RTCPReportBlock& report_block : report_blocks) {
770 if (ssrc == report_block.source_ssrc) {
771 rtp_sender_->packet_generator.OnReceivedAckOnSsrc(
772 report_block.extended_highest_sequence_number);
773 } else if (rtx_ssrc && *rtx_ssrc == report_block.source_ssrc) {
774 rtp_sender_->packet_generator.OnReceivedAckOnRtxSsrc(
775 report_block.extended_highest_sequence_number);
776 }
777 }
778 }
779}
780
781bool ModuleRtpRtcpImpl2::LastReceivedNTP(
782 uint32_t* rtcp_arrival_time_secs, // When we got the last report.
783 uint32_t* rtcp_arrival_time_frac,
784 uint32_t* remote_sr) const {
785 // Remote SR: NTP inside the last received (mid 16 bits from sec and frac).
786 uint32_t ntp_secs = 0;
787 uint32_t ntp_frac = 0;
788
789 if (!rtcp_receiver_.NTP(&ntp_secs, &ntp_frac, rtcp_arrival_time_secs,
790 rtcp_arrival_time_frac, NULL)) {
791 return false;
792 }
793 *remote_sr =
794 ((ntp_secs & 0x0000ffff) << 16) + ((ntp_frac & 0xffff0000) >> 16);
795 return true;
796}
797
798void ModuleRtpRtcpImpl2::set_rtt_ms(int64_t rtt_ms) {
799 {
800 rtc::CritScope cs(&critical_section_rtt_);
801 rtt_ms_ = rtt_ms;
802 }
803 if (rtp_sender_) {
804 rtp_sender_->packet_history.SetRtt(rtt_ms);
805 }
806}
807
808int64_t ModuleRtpRtcpImpl2::rtt_ms() const {
809 rtc::CritScope cs(&critical_section_rtt_);
810 return rtt_ms_;
811}
812
813void ModuleRtpRtcpImpl2::SetVideoBitrateAllocation(
814 const VideoBitrateAllocation& bitrate) {
815 rtcp_sender_.SetVideoBitrateAllocation(bitrate);
816}
817
818RTPSender* ModuleRtpRtcpImpl2::RtpSender() {
819 return rtp_sender_ ? &rtp_sender_->packet_generator : nullptr;
820}
821
822const RTPSender* ModuleRtpRtcpImpl2::RtpSender() const {
823 return rtp_sender_ ? &rtp_sender_->packet_generator : nullptr;
824}
825
826DataRate ModuleRtpRtcpImpl2::SendRate() const {
827 RTC_DCHECK(rtp_sender_);
828 return rtp_sender_->packet_sender.GetSendRates().Sum();
829}
830
831DataRate ModuleRtpRtcpImpl2::NackOverheadRate() const {
832 RTC_DCHECK(rtp_sender_);
833 return rtp_sender_->packet_sender
834 .GetSendRates()[RtpPacketMediaType::kRetransmission];
835}
836
837} // namespace webrtc