Line data Source code
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_sender.h"
12 :
13 : #include <algorithm>
14 : #include <utility>
15 :
16 : #include "webrtc/base/checks.h"
17 : #include "webrtc/base/logging.h"
18 : #include "webrtc/base/rate_limiter.h"
19 : #include "webrtc/base/trace_event.h"
20 : #include "webrtc/base/timeutils.h"
21 : #include "webrtc/call/call.h"
22 : #include "webrtc/logging/rtc_event_log/rtc_event_log.h"
23 : #include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
24 : #include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h"
25 : #include "webrtc/modules/rtp_rtcp/source/byte_io.h"
26 : #include "webrtc/modules/rtp_rtcp/source/playout_delay_oracle.h"
27 : #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
28 : #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
29 : #include "webrtc/modules/rtp_rtcp/source/rtp_sender_audio.h"
30 : #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h"
31 : #include "webrtc/modules/rtp_rtcp/source/time_util.h"
32 : #include "webrtc/system_wrappers/include/field_trial.h"
33 :
34 : namespace webrtc {
35 :
36 : namespace {
37 : // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP.
38 : constexpr size_t kMaxPaddingLength = 224;
39 : constexpr int kSendSideDelayWindowMs = 1000;
40 : constexpr size_t kRtpHeaderLength = 12;
41 : constexpr uint16_t kMaxInitRtpSeqNumber = 32767; // 2^15 -1.
42 : constexpr uint32_t kTimestampTicksPerMs = 90;
43 : constexpr int kBitrateStatisticsWindowMs = 1000;
44 :
45 : constexpr size_t kMinFlexfecPacketsToStoreForPacing = 50;
46 :
47 0 : const char* FrameTypeToString(FrameType frame_type) {
48 0 : switch (frame_type) {
49 : case kEmptyFrame:
50 0 : return "empty";
51 0 : case kAudioFrameSpeech: return "audio_speech";
52 0 : case kAudioFrameCN: return "audio_cn";
53 0 : case kVideoFrameKey: return "video_key";
54 0 : case kVideoFrameDelta: return "video_delta";
55 : }
56 0 : return "";
57 : }
58 :
59 0 : void CountPacket(RtpPacketCounter* counter, const RtpPacketToSend& packet) {
60 0 : ++counter->packets;
61 0 : counter->header_bytes += packet.headers_size();
62 0 : counter->padding_bytes += packet.padding_size();
63 0 : counter->payload_bytes += packet.payload_size();
64 0 : }
65 :
66 : } // namespace
67 :
68 0 : RTPSender::RTPSender(
69 : bool audio,
70 : Clock* clock,
71 : Transport* transport,
72 : RtpPacketSender* paced_sender,
73 : FlexfecSender* flexfec_sender,
74 : TransportSequenceNumberAllocator* sequence_number_allocator,
75 : TransportFeedbackObserver* transport_feedback_observer,
76 : BitrateStatisticsObserver* bitrate_callback,
77 : FrameCountObserver* frame_count_observer,
78 : SendSideDelayObserver* send_side_delay_observer,
79 : RtcEventLog* event_log,
80 : SendPacketObserver* send_packet_observer,
81 : RateLimiter* retransmission_rate_limiter,
82 0 : OverheadObserver* overhead_observer)
83 : : clock_(clock),
84 : // TODO(holmer): Remove this conversion?
85 0 : clock_delta_ms_(clock_->TimeInMilliseconds() - rtc::TimeMillis()),
86 0 : random_(clock_->TimeInMicroseconds()),
87 : audio_configured_(audio),
88 0 : audio_(audio ? new RTPSenderAudio(clock, this) : nullptr),
89 0 : video_(audio ? nullptr : new RTPSenderVideo(clock, this, flexfec_sender)),
90 : paced_sender_(paced_sender),
91 : transport_sequence_number_allocator_(sequence_number_allocator),
92 : transport_feedback_observer_(transport_feedback_observer),
93 : last_capture_time_ms_sent_(0),
94 : transport_(transport),
95 : sending_media_(true), // Default to sending media.
96 : max_packet_size_(IP_PACKET_SIZE - 28), // Default is IP-v4/UDP.
97 : payload_type_(-1),
98 : payload_type_map_(),
99 : rtp_header_extension_map_(),
100 : rid_{0},
101 : packet_history_(clock),
102 : flexfec_packet_history_(clock),
103 : // Statistics
104 : rtp_stats_callback_(nullptr),
105 : total_bitrate_sent_(kBitrateStatisticsWindowMs,
106 : RateStatistics::kBpsScale),
107 : nack_bitrate_sent_(kBitrateStatisticsWindowMs, RateStatistics::kBpsScale),
108 : frame_count_observer_(frame_count_observer),
109 : send_side_delay_observer_(send_side_delay_observer),
110 : event_log_(event_log),
111 : send_packet_observer_(send_packet_observer),
112 : bitrate_callback_(bitrate_callback),
113 : // RTP variables
114 0 : ssrc_db_(SSRCDatabase::GetSSRCDatabase()),
115 : remote_ssrc_(0),
116 : sequence_number_forced_(false),
117 : ssrc_forced_(false),
118 : last_rtp_timestamp_(0),
119 : capture_time_ms_(0),
120 : last_timestamp_time_ms_(0),
121 : media_has_been_sent_(false),
122 : last_packet_marker_bit_(false),
123 : csrcs_(),
124 : rtx_(kRtxOff),
125 : rtp_overhead_bytes_per_packet_(0),
126 : retransmission_rate_limiter_(retransmission_rate_limiter),
127 0 : overhead_observer_(overhead_observer) {
128 0 : ssrc_ = ssrc_db_->CreateSSRC();
129 0 : RTC_DCHECK(ssrc_ != 0);
130 0 : ssrc_rtx_ = ssrc_db_->CreateSSRC();
131 0 : RTC_DCHECK(ssrc_rtx_ != 0);
132 :
133 : // This random initialization is not intended to be cryptographic strong.
134 0 : timestamp_offset_ = random_.Rand<uint32_t>();
135 : // Random start, 16 bits. Can't be 0.
136 0 : sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber);
137 0 : sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
138 :
139 : // Store FlexFEC packets in the packet history data structure, so they can
140 : // be found when paced.
141 0 : if (flexfec_sender) {
142 0 : flexfec_packet_history_.SetStorePacketsStatus(
143 0 : true, kMinFlexfecPacketsToStoreForPacing);
144 : }
145 0 : }
146 :
147 0 : RTPSender::~RTPSender() {
148 : // TODO(tommi): Use a thread checker to ensure the object is created and
149 : // deleted on the same thread. At the moment this isn't possible due to
150 : // voe::ChannelOwner in voice engine. To reproduce, run:
151 : // voe_auto_test --automated --gtest_filter=*MixManyChannelsForStressOpus
152 :
153 : // TODO(tommi,holmer): We don't grab locks in the dtor before accessing member
154 : // variables but we grab them in all other methods. (what's the design?)
155 : // Start documenting what thread we're on in what method so that it's easier
156 : // to understand performance attributes and possibly remove locks.
157 0 : if (remote_ssrc_ != 0) {
158 0 : ssrc_db_->ReturnSSRC(remote_ssrc_);
159 : }
160 0 : ssrc_db_->ReturnSSRC(ssrc_);
161 :
162 0 : SSRCDatabase::ReturnSSRCDatabase();
163 0 : while (!payload_type_map_.empty()) {
164 : std::map<int8_t, RtpUtility::Payload*>::iterator it =
165 0 : payload_type_map_.begin();
166 0 : delete it->second;
167 0 : payload_type_map_.erase(it);
168 : }
169 0 : }
170 :
171 0 : uint16_t RTPSender::ActualSendBitrateKbit() const {
172 0 : rtc::CritScope cs(&statistics_crit_);
173 : return static_cast<uint16_t>(
174 0 : total_bitrate_sent_.Rate(clock_->TimeInMilliseconds()).value_or(0) /
175 0 : 1000);
176 : }
177 :
178 0 : uint32_t RTPSender::VideoBitrateSent() const {
179 0 : if (video_) {
180 0 : return video_->VideoBitrateSent();
181 : }
182 0 : return 0;
183 : }
184 :
185 0 : uint32_t RTPSender::FecOverheadRate() const {
186 0 : if (video_) {
187 0 : return video_->FecOverheadRate();
188 : }
189 0 : return 0;
190 : }
191 :
192 0 : uint32_t RTPSender::NackOverheadRate() const {
193 0 : rtc::CritScope cs(&statistics_crit_);
194 0 : return nack_bitrate_sent_.Rate(clock_->TimeInMilliseconds()).value_or(0);
195 : }
196 :
197 0 : int32_t RTPSender::SetRID(const char* rid) {
198 0 : rtc::CritScope lock(&send_critsect_);
199 0 : const size_t len = rid ? strlen(rid) : 0;
200 0 : if (!len || len >= sizeof(rid_)) {
201 0 : rid_[0] = '\0';
202 : } else {
203 0 : memmove(&rid_[0], rid, len + 1);
204 : }
205 0 : return 0;
206 : }
207 :
208 0 : int32_t RTPSender::RegisterRtpHeaderExtension(RTPExtensionType type,
209 : uint8_t id) {
210 0 : rtc::CritScope lock(&send_critsect_);
211 0 : switch (type) {
212 : case kRtpExtensionVideoRotation:
213 : case kRtpExtensionPlayoutDelay:
214 : case kRtpExtensionTransmissionTimeOffset:
215 : case kRtpExtensionAbsoluteSendTime:
216 : case kRtpExtensionAudioLevel:
217 : case kRtpExtensionTransportSequenceNumber:
218 : case kRtpExtensionRtpStreamId:
219 0 : return rtp_header_extension_map_.Register(type, id);
220 : case kRtpExtensionNone:
221 : case kRtpExtensionNumberOfExtensions:
222 0 : LOG(LS_ERROR) << "Invalid RTP extension type for registration";
223 0 : return -1;
224 : }
225 0 : return -1;
226 : }
227 :
228 0 : bool RTPSender::IsRtpHeaderExtensionRegistered(RTPExtensionType type) {
229 0 : rtc::CritScope lock(&send_critsect_);
230 0 : return rtp_header_extension_map_.IsRegistered(type);
231 : }
232 :
233 0 : int32_t RTPSender::DeregisterRtpHeaderExtension(RTPExtensionType type) {
234 0 : rtc::CritScope lock(&send_critsect_);
235 0 : return rtp_header_extension_map_.Deregister(type);
236 : }
237 :
238 0 : int32_t RTPSender::RegisterPayload(
239 : const char payload_name[RTP_PAYLOAD_NAME_SIZE],
240 : int8_t payload_number,
241 : uint32_t frequency,
242 : size_t channels,
243 : uint32_t rate) {
244 0 : RTC_DCHECK_LT(strlen(payload_name), RTP_PAYLOAD_NAME_SIZE);
245 0 : rtc::CritScope lock(&send_critsect_);
246 :
247 : std::map<int8_t, RtpUtility::Payload*>::iterator it =
248 0 : payload_type_map_.find(payload_number);
249 :
250 0 : if (payload_type_map_.end() != it) {
251 : // We already use this payload type.
252 0 : RtpUtility::Payload* payload = it->second;
253 0 : assert(payload);
254 :
255 : // Check if it's the same as we already have.
256 0 : if (RtpUtility::StringCompare(
257 : payload->name, payload_name, RTP_PAYLOAD_NAME_SIZE - 1)) {
258 0 : if (audio_configured_ && payload->audio &&
259 0 : payload->typeSpecific.Audio.frequency == frequency &&
260 0 : (payload->typeSpecific.Audio.rate == rate ||
261 0 : payload->typeSpecific.Audio.rate == 0 || rate == 0)) {
262 0 : payload->typeSpecific.Audio.rate = rate;
263 : // Ensure that we update the rate if new or old is zero.
264 0 : return 0;
265 : }
266 0 : if (!audio_configured_ && !payload->audio) {
267 0 : return 0;
268 : }
269 : }
270 0 : return -1;
271 : }
272 0 : int32_t ret_val = 0;
273 0 : RtpUtility::Payload* payload = nullptr;
274 0 : if (audio_configured_) {
275 : // TODO(mflodman): Change to CreateAudioPayload and make static.
276 0 : ret_val = audio_->RegisterAudioPayload(payload_name, payload_number,
277 0 : frequency, channels, rate, &payload);
278 : } else {
279 0 : payload = video_->CreateVideoPayload(payload_name, payload_number);
280 : }
281 0 : if (payload) {
282 0 : payload_type_map_[payload_number] = payload;
283 : }
284 0 : return ret_val;
285 : }
286 :
287 0 : int32_t RTPSender::DeRegisterSendPayload(int8_t payload_type) {
288 0 : rtc::CritScope lock(&send_critsect_);
289 :
290 : std::map<int8_t, RtpUtility::Payload*>::iterator it =
291 0 : payload_type_map_.find(payload_type);
292 :
293 0 : if (payload_type_map_.end() == it) {
294 0 : return -1;
295 : }
296 0 : RtpUtility::Payload* payload = it->second;
297 : delete payload;
298 0 : payload_type_map_.erase(it);
299 0 : return 0;
300 : }
301 :
302 0 : void RTPSender::SetSendPayloadType(int8_t payload_type) {
303 0 : rtc::CritScope lock(&send_critsect_);
304 0 : payload_type_ = payload_type;
305 0 : }
306 :
307 0 : int8_t RTPSender::SendPayloadType() const {
308 0 : rtc::CritScope lock(&send_critsect_);
309 0 : return payload_type_;
310 : }
311 :
312 0 : void RTPSender::SetMaxRtpPacketSize(size_t max_packet_size) {
313 : // Sanity check.
314 0 : RTC_DCHECK(max_packet_size >= 100 && max_packet_size <= IP_PACKET_SIZE)
315 0 : << "Invalid max payload length: " << max_packet_size;
316 0 : rtc::CritScope lock(&send_critsect_);
317 0 : max_packet_size_ = max_packet_size;
318 0 : }
319 :
320 0 : size_t RTPSender::MaxPayloadSize() const {
321 0 : if (audio_configured_) {
322 0 : return max_packet_size_ - RtpHeaderLength();
323 : } else {
324 0 : return max_packet_size_ - RtpHeaderLength() // RTP overhead.
325 0 : - video_->FecPacketOverhead() // FEC/ULP/RED overhead.
326 0 : - (RtxStatus() ? kRtxHeaderSize : 0); // RTX overhead.
327 : }
328 : }
329 :
330 0 : size_t RTPSender::MaxRtpPacketSize() const {
331 0 : return max_packet_size_;
332 : }
333 :
334 0 : void RTPSender::SetRtxStatus(int mode) {
335 0 : rtc::CritScope lock(&send_critsect_);
336 0 : rtx_ = mode;
337 0 : }
338 :
339 0 : int RTPSender::RtxStatus() const {
340 0 : rtc::CritScope lock(&send_critsect_);
341 0 : return rtx_;
342 : }
343 :
344 0 : void RTPSender::SetRtxSsrc(uint32_t ssrc) {
345 0 : rtc::CritScope lock(&send_critsect_);
346 0 : ssrc_rtx_ = ssrc;
347 0 : }
348 :
349 0 : uint32_t RTPSender::RtxSsrc() const {
350 0 : rtc::CritScope lock(&send_critsect_);
351 0 : return ssrc_rtx_;
352 : }
353 :
354 0 : void RTPSender::SetRtxPayloadType(int payload_type,
355 : int associated_payload_type) {
356 0 : rtc::CritScope lock(&send_critsect_);
357 0 : RTC_DCHECK_LE(payload_type, 127);
358 0 : RTC_DCHECK_LE(associated_payload_type, 127);
359 0 : if (payload_type < 0) {
360 0 : LOG(LS_ERROR) << "Invalid RTX payload type: " << payload_type;
361 0 : return;
362 : }
363 :
364 0 : rtx_payload_type_map_[associated_payload_type] = payload_type;
365 : }
366 :
367 0 : int32_t RTPSender::CheckPayloadType(int8_t payload_type,
368 : RtpVideoCodecTypes* video_type) {
369 0 : rtc::CritScope lock(&send_critsect_);
370 :
371 0 : if (payload_type < 0) {
372 0 : LOG(LS_ERROR) << "Invalid payload_type " << payload_type;
373 0 : return -1;
374 : }
375 0 : if (payload_type_ == payload_type) {
376 0 : if (!audio_configured_) {
377 0 : *video_type = video_->VideoCodecType();
378 : }
379 0 : return 0;
380 : }
381 : std::map<int8_t, RtpUtility::Payload*>::iterator it =
382 0 : payload_type_map_.find(payload_type);
383 0 : if (it == payload_type_map_.end()) {
384 0 : LOG(LS_WARNING) << "Payload type " << static_cast<int>(payload_type)
385 0 : << " not registered.";
386 0 : return -1;
387 : }
388 0 : SetSendPayloadType(payload_type);
389 0 : RtpUtility::Payload* payload = it->second;
390 0 : assert(payload);
391 0 : if (!payload->audio && !audio_configured_) {
392 0 : video_->SetVideoCodecType(payload->typeSpecific.Video.videoCodecType);
393 0 : *video_type = payload->typeSpecific.Video.videoCodecType;
394 : }
395 0 : return 0;
396 : }
397 :
398 0 : bool RTPSender::SendOutgoingData(FrameType frame_type,
399 : int8_t payload_type,
400 : uint32_t capture_timestamp,
401 : int64_t capture_time_ms,
402 : const uint8_t* payload_data,
403 : size_t payload_size,
404 : const RTPFragmentationHeader* fragmentation,
405 : const RTPVideoHeader* rtp_header,
406 : uint32_t* transport_frame_id_out) {
407 : uint32_t ssrc;
408 : uint16_t sequence_number;
409 : uint32_t rtp_timestamp;
410 : {
411 : // Drop this packet if we're not sending media packets.
412 0 : rtc::CritScope lock(&send_critsect_);
413 0 : ssrc = ssrc_;
414 0 : sequence_number = sequence_number_;
415 0 : rtp_timestamp = timestamp_offset_ + capture_timestamp;
416 0 : if (transport_frame_id_out)
417 0 : *transport_frame_id_out = rtp_timestamp;
418 0 : if (!sending_media_)
419 0 : return true;
420 : }
421 0 : RtpVideoCodecTypes video_type = kRtpVideoGeneric;
422 0 : if (CheckPayloadType(payload_type, &video_type) != 0) {
423 0 : LOG(LS_ERROR) << "Don't send data with unknown payload type: "
424 0 : << static_cast<int>(payload_type) << ".";
425 0 : return false;
426 : }
427 :
428 : bool result;
429 0 : if (audio_configured_) {
430 0 : TRACE_EVENT_ASYNC_STEP1("webrtc", "Audio", rtp_timestamp, "Send", "type",
431 : FrameTypeToString(frame_type));
432 0 : assert(frame_type == kAudioFrameSpeech || frame_type == kAudioFrameCN ||
433 : frame_type == kEmptyFrame);
434 :
435 0 : result = audio_->SendAudio(frame_type, payload_type, rtp_timestamp,
436 0 : payload_data, payload_size, fragmentation);
437 : } else {
438 0 : TRACE_EVENT_ASYNC_STEP1("webrtc", "Video", capture_time_ms,
439 : "Send", "type", FrameTypeToString(frame_type));
440 0 : assert(frame_type != kAudioFrameSpeech && frame_type != kAudioFrameCN);
441 :
442 0 : if (frame_type == kEmptyFrame)
443 0 : return true;
444 :
445 0 : if (rtp_header) {
446 0 : playout_delay_oracle_.UpdateRequest(ssrc, rtp_header->playout_delay,
447 0 : sequence_number);
448 : }
449 :
450 0 : result = video_->SendVideo(video_type, frame_type, payload_type,
451 : rtp_timestamp, capture_time_ms, payload_data,
452 : payload_size, fragmentation, rtp_header,
453 0 : &rid_[0]);
454 : }
455 :
456 0 : rtc::CritScope cs(&statistics_crit_);
457 : // Note: This is currently only counting for video.
458 0 : if (frame_type == kVideoFrameKey) {
459 0 : ++frame_counts_.key_frames;
460 0 : } else if (frame_type == kVideoFrameDelta) {
461 0 : ++frame_counts_.delta_frames;
462 : }
463 0 : if (frame_count_observer_) {
464 0 : frame_count_observer_->FrameCountUpdated(frame_counts_, ssrc);
465 : }
466 :
467 0 : return result;
468 : }
469 :
470 0 : size_t RTPSender::TrySendRedundantPayloads(size_t bytes_to_send,
471 : int probe_cluster_id) {
472 : {
473 0 : rtc::CritScope lock(&send_critsect_);
474 0 : if (!sending_media_)
475 0 : return 0;
476 0 : if ((rtx_ & kRtxRedundantPayloads) == 0)
477 0 : return 0;
478 : }
479 :
480 0 : int bytes_left = static_cast<int>(bytes_to_send);
481 0 : while (bytes_left > 0) {
482 : std::unique_ptr<RtpPacketToSend> packet =
483 0 : packet_history_.GetBestFittingPacket(bytes_left);
484 0 : if (!packet)
485 0 : break;
486 0 : size_t payload_size = packet->payload_size();
487 0 : if (!PrepareAndSendPacket(std::move(packet), true, false, probe_cluster_id))
488 0 : break;
489 0 : bytes_left -= payload_size;
490 : }
491 0 : return bytes_to_send - bytes_left;
492 : }
493 :
494 0 : size_t RTPSender::SendPadData(size_t bytes, int probe_cluster_id) {
495 : // Always send full padding packets. This is accounted for by the
496 : // RtpPacketSender, which will make sure we don't send too much padding even
497 : // if a single packet is larger than requested.
498 : size_t padding_bytes_in_packet =
499 0 : std::min(MaxPayloadSize(), kMaxPaddingLength);
500 0 : size_t bytes_sent = 0;
501 0 : while (bytes_sent < bytes) {
502 0 : int64_t now_ms = clock_->TimeInMilliseconds();
503 : uint32_t ssrc;
504 : uint32_t timestamp;
505 : int64_t capture_time_ms;
506 : uint16_t sequence_number;
507 : int payload_type;
508 : bool over_rtx;
509 : {
510 0 : rtc::CritScope lock(&send_critsect_);
511 0 : if (!sending_media_)
512 0 : break;
513 0 : timestamp = last_rtp_timestamp_;
514 0 : capture_time_ms = capture_time_ms_;
515 0 : if (rtx_ == kRtxOff) {
516 : // Without RTX we can't send padding in the middle of frames.
517 0 : if (!last_packet_marker_bit_)
518 0 : break;
519 0 : ssrc = ssrc_;
520 0 : sequence_number = sequence_number_;
521 0 : ++sequence_number_;
522 0 : payload_type = payload_type_;
523 0 : over_rtx = false;
524 : } else {
525 : // Without abs-send-time or transport sequence number a media packet
526 : // must be sent before padding so that the timestamps used for
527 : // estimation are correct.
528 0 : if (!media_has_been_sent_ &&
529 0 : !(rtp_header_extension_map_.IsRegistered(AbsoluteSendTime::kId) ||
530 0 : (rtp_header_extension_map_.IsRegistered(
531 0 : TransportSequenceNumber::kId) &&
532 0 : transport_sequence_number_allocator_))) {
533 0 : break;
534 : }
535 : // Only change change the timestamp of padding packets sent over RTX.
536 : // Padding only packets over RTP has to be sent as part of a media
537 : // frame (and therefore the same timestamp).
538 0 : if (last_timestamp_time_ms_ > 0) {
539 0 : timestamp +=
540 0 : (now_ms - last_timestamp_time_ms_) * kTimestampTicksPerMs;
541 0 : capture_time_ms += (now_ms - last_timestamp_time_ms_);
542 : }
543 0 : ssrc = ssrc_rtx_;
544 0 : sequence_number = sequence_number_rtx_;
545 0 : ++sequence_number_rtx_;
546 0 : payload_type = rtx_payload_type_map_.begin()->second;
547 0 : over_rtx = true;
548 : }
549 : }
550 :
551 0 : std::unique_ptr<RtpPacketToSend> padding_packet(new RtpPacketToSend(&rtp_header_extension_map_));
552 0 : padding_packet->SetPayloadType(payload_type);
553 0 : padding_packet->SetMarker(false);
554 0 : padding_packet->SetSequenceNumber(sequence_number);
555 0 : padding_packet->SetTimestamp(timestamp);
556 0 : padding_packet->SetSsrc(ssrc);
557 :
558 0 : if (capture_time_ms > 0) {
559 0 : padding_packet->SetExtension<TransmissionOffset>(
560 0 : (now_ms - capture_time_ms) * kTimestampTicksPerMs);
561 : }
562 0 : padding_packet->SetExtension<AbsoluteSendTime>(now_ms);
563 0 : PacketOptions options;
564 : bool has_transport_seq_num =
565 0 : UpdateTransportSequenceNumber(padding_packet.get(), &options.packet_id);
566 0 : padding_packet->SetPadding(padding_bytes_in_packet, &random_);
567 :
568 0 : if (has_transport_seq_num) {
569 0 : AddPacketToTransportFeedback(options.packet_id, *padding_packet,
570 0 : probe_cluster_id);
571 : }
572 :
573 0 : if (!SendPacketToNetwork(*padding_packet, options))
574 0 : break;
575 0 : UpdateRtpStats(*padding_packet, over_rtx, false);
576 :
577 0 : packet_history_.PutRtpPacket(std::move(padding_packet),
578 : kAllowRetransmission,
579 0 : true);
580 :
581 0 : bytes_sent += padding_bytes_in_packet;
582 : }
583 :
584 0 : return bytes_sent;
585 : }
586 :
587 0 : void RTPSender::SetStorePacketsStatus(bool enable, uint16_t number_to_store) {
588 0 : packet_history_.SetStorePacketsStatus(enable, number_to_store);
589 0 : }
590 :
591 0 : bool RTPSender::StorePackets() const {
592 0 : return packet_history_.StorePackets();
593 : }
594 :
595 0 : int32_t RTPSender::ReSendPacket(uint16_t packet_id, int64_t min_resend_time) {
596 : std::unique_ptr<RtpPacketToSend> packet =
597 0 : packet_history_.GetPacketAndSetSendTime(packet_id, min_resend_time, true);
598 0 : if (!packet) {
599 : // Packet not found.
600 0 : return 0;
601 : }
602 :
603 : // Check if we're overusing retransmission bitrate.
604 : // TODO(sprang): Add histograms for nack success or failure reasons.
605 0 : RTC_DCHECK(retransmission_rate_limiter_);
606 0 : if (!retransmission_rate_limiter_->TryUseRate(packet->size()))
607 0 : return -1;
608 :
609 0 : if (paced_sender_) {
610 : // Convert from TickTime to Clock since capture_time_ms is based on
611 : // TickTime.
612 : int64_t corrected_capture_tims_ms =
613 0 : packet->capture_time_ms() + clock_delta_ms_;
614 0 : paced_sender_->InsertPacket(RtpPacketSender::kNormalPriority,
615 0 : packet->Ssrc(), packet->SequenceNumber(),
616 : corrected_capture_tims_ms,
617 0 : packet->payload_size(), true);
618 :
619 0 : return packet->size();
620 : }
621 0 : bool rtx = (RtxStatus() & kRtxRetransmitted) > 0;
622 0 : int32_t packet_size = static_cast<int32_t>(packet->size());
623 0 : if (!PrepareAndSendPacket(std::move(packet), rtx, true,
624 : PacketInfo::kNotAProbe))
625 0 : return -1;
626 0 : return packet_size;
627 : }
628 :
629 0 : bool RTPSender::SendPacketToNetwork(const RtpPacketToSend& packet,
630 : const PacketOptions& options) {
631 0 : int bytes_sent = -1;
632 0 : if (transport_) {
633 0 : UpdateRtpOverhead(packet);
634 0 : bytes_sent = transport_->SendRtp(packet.data(), packet.size(), options)
635 0 : ? static_cast<int>(packet.size())
636 : : -1;
637 0 : if (event_log_ && bytes_sent > 0) {
638 0 : event_log_->LogRtpHeader(kOutgoingPacket, MediaType::ANY, packet.data(),
639 0 : packet.size());
640 : }
641 : }
642 0 : TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
643 : "RTPSender::SendPacketToNetwork", "size", packet.size(),
644 : "sent", bytes_sent);
645 : // TODO(pwestin): Add a separate bitrate for sent bitrate after pacer.
646 0 : if (bytes_sent <= 0) {
647 0 : LOG(LS_WARNING) << "Transport failed to send packet";
648 0 : return false;
649 : }
650 0 : return true;
651 : }
652 :
653 0 : int RTPSender::SelectiveRetransmissions() const {
654 0 : if (!video_)
655 0 : return -1;
656 0 : return video_->SelectiveRetransmissions();
657 : }
658 :
659 0 : int RTPSender::SetSelectiveRetransmissions(uint8_t settings) {
660 0 : if (!video_)
661 0 : return -1;
662 0 : video_->SetSelectiveRetransmissions(settings);
663 0 : return 0;
664 : }
665 :
666 0 : void RTPSender::OnReceivedNack(
667 : const std::vector<uint16_t>& nack_sequence_numbers,
668 : int64_t avg_rtt) {
669 0 : TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
670 : "RTPSender::OnReceivedNACK", "num_seqnum",
671 : nack_sequence_numbers.size(), "avg_rtt", avg_rtt);
672 0 : for (uint16_t seq_no : nack_sequence_numbers) {
673 0 : const int32_t bytes_sent = ReSendPacket(seq_no, 5 + avg_rtt);
674 0 : if (bytes_sent < 0) {
675 : // Failed to send one Sequence number. Give up the rest in this nack.
676 0 : LOG(LS_WARNING) << "Failed resending RTP packet " << seq_no
677 0 : << ", Discard rest of packets";
678 0 : break;
679 : }
680 : }
681 0 : }
682 :
683 0 : void RTPSender::OnReceivedRtcpReportBlocks(
684 : const ReportBlockList& report_blocks) {
685 0 : playout_delay_oracle_.OnReceivedRtcpReportBlocks(report_blocks);
686 0 : }
687 :
688 : // Called from pacer when we can send the packet.
689 0 : bool RTPSender::TimeToSendPacket(uint32_t ssrc,
690 : uint16_t sequence_number,
691 : int64_t capture_time_ms,
692 : bool retransmission,
693 : int probe_cluster_id) {
694 0 : if (!SendingMedia())
695 0 : return true;
696 :
697 0 : std::unique_ptr<RtpPacketToSend> packet;
698 0 : if (ssrc == SSRC()) {
699 0 : packet = packet_history_.GetPacketAndSetSendTime(sequence_number, 0,
700 0 : retransmission);
701 0 : } else if (ssrc == FlexfecSsrc()) {
702 0 : packet = flexfec_packet_history_.GetPacketAndSetSendTime(sequence_number, 0,
703 0 : retransmission);
704 : }
705 :
706 0 : if (!packet) {
707 : // Packet cannot be found.
708 0 : return true;
709 : }
710 :
711 0 : return PrepareAndSendPacket(
712 0 : std::move(packet),
713 0 : retransmission && (RtxStatus() & kRtxRetransmitted) > 0, retransmission,
714 0 : probe_cluster_id);
715 : }
716 :
717 0 : bool RTPSender::PrepareAndSendPacket(std::unique_ptr<RtpPacketToSend> packet,
718 : bool send_over_rtx,
719 : bool is_retransmit,
720 : int probe_cluster_id) {
721 0 : RTC_DCHECK(packet);
722 0 : int64_t capture_time_ms = packet->capture_time_ms();
723 0 : RtpPacketToSend* packet_to_send = packet.get();
724 :
725 0 : if (!is_retransmit && packet->Marker()) {
726 0 : TRACE_EVENT_ASYNC_END0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PacedSend",
727 : capture_time_ms);
728 : }
729 :
730 0 : TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
731 : "PrepareAndSendPacket", "timestamp", packet->Timestamp(),
732 : "seqnum", packet->SequenceNumber());
733 :
734 0 : std::unique_ptr<RtpPacketToSend> packet_rtx;
735 0 : if (send_over_rtx) {
736 0 : packet_rtx = BuildRtxPacket(*packet);
737 0 : if (!packet_rtx)
738 0 : return false;
739 0 : packet_to_send = packet_rtx.get();
740 : }
741 :
742 0 : int64_t now_ms = clock_->TimeInMilliseconds();
743 0 : int64_t diff_ms = now_ms - capture_time_ms;
744 0 : packet_to_send->SetExtension<TransmissionOffset>(kTimestampTicksPerMs *
745 0 : diff_ms);
746 0 : packet_to_send->SetExtension<AbsoluteSendTime>(now_ms);
747 :
748 0 : PacketOptions options;
749 0 : if (UpdateTransportSequenceNumber(packet_to_send, &options.packet_id)) {
750 0 : AddPacketToTransportFeedback(options.packet_id, *packet_to_send,
751 0 : probe_cluster_id);
752 : }
753 :
754 0 : if (!is_retransmit && !send_over_rtx) {
755 0 : UpdateDelayStatistics(packet->capture_time_ms(), now_ms);
756 0 : UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(),
757 0 : packet->Ssrc());
758 : }
759 :
760 0 : if (!SendPacketToNetwork(*packet_to_send, options))
761 0 : return false;
762 :
763 : {
764 0 : rtc::CritScope lock(&send_critsect_);
765 0 : media_has_been_sent_ = true;
766 : }
767 0 : UpdateRtpStats(*packet_to_send, send_over_rtx, is_retransmit);
768 0 : return true;
769 : }
770 :
771 0 : void RTPSender::UpdateRtpStats(const RtpPacketToSend& packet,
772 : bool is_rtx,
773 : bool is_retransmit) {
774 0 : int64_t now_ms = clock_->TimeInMilliseconds();
775 :
776 0 : rtc::CritScope lock(&statistics_crit_);
777 0 : StreamDataCounters* counters = is_rtx ? &rtx_rtp_stats_ : &rtp_stats_;
778 :
779 0 : total_bitrate_sent_.Update(packet.size(), now_ms);
780 :
781 0 : if (counters->first_packet_time_ms == -1)
782 0 : counters->first_packet_time_ms = now_ms;
783 :
784 0 : if (IsFecPacket(packet))
785 0 : CountPacket(&counters->fec, packet);
786 :
787 0 : if (is_retransmit) {
788 0 : CountPacket(&counters->retransmitted, packet);
789 0 : nack_bitrate_sent_.Update(packet.size(), now_ms);
790 : }
791 0 : CountPacket(&counters->transmitted, packet);
792 :
793 0 : if (rtp_stats_callback_)
794 0 : rtp_stats_callback_->DataCountersUpdated(*counters, packet.Ssrc());
795 0 : }
796 :
797 0 : bool RTPSender::IsFecPacket(const RtpPacketToSend& packet) const {
798 0 : if (!video_)
799 0 : return false;
800 :
801 : // FlexFEC.
802 0 : if (packet.Ssrc() == FlexfecSsrc())
803 0 : return true;
804 :
805 : // RED+ULPFEC.
806 : int pt_red;
807 : int pt_fec;
808 0 : video_->GetUlpfecConfig(&pt_red, &pt_fec);
809 0 : return static_cast<int>(packet.PayloadType()) == pt_red &&
810 0 : static_cast<int>(packet.payload()[0]) == pt_fec;
811 : }
812 :
813 0 : size_t RTPSender::TimeToSendPadding(size_t bytes, int probe_cluster_id) {
814 0 : if (audio_configured_ || bytes == 0)
815 0 : return 0;
816 0 : size_t bytes_sent = TrySendRedundantPayloads(bytes, probe_cluster_id);
817 0 : if (bytes_sent < bytes)
818 0 : bytes_sent += SendPadData(bytes - bytes_sent, probe_cluster_id);
819 0 : return bytes_sent;
820 : }
821 :
822 0 : bool RTPSender::SendToNetwork(std::unique_ptr<RtpPacketToSend> packet,
823 : StorageType storage,
824 : RtpPacketSender::Priority priority) {
825 0 : RTC_DCHECK(packet);
826 0 : int64_t now_ms = clock_->TimeInMilliseconds();
827 :
828 : // |capture_time_ms| <= 0 is considered invalid.
829 : // TODO(holmer): This should be changed all over Video Engine so that negative
830 : // time is consider invalid, while 0 is considered a valid time.
831 0 : if (packet->capture_time_ms() > 0) {
832 0 : packet->SetExtension<TransmissionOffset>(
833 0 : kTimestampTicksPerMs * (now_ms - packet->capture_time_ms()));
834 : }
835 0 : packet->SetExtension<AbsoluteSendTime>(now_ms);
836 :
837 0 : if (video_) {
838 : BWE_TEST_LOGGING_PLOT_WITH_SSRC(1, "VideoTotBitrate_kbps", now_ms,
839 : ActualSendBitrateKbit(), packet->Ssrc());
840 : BWE_TEST_LOGGING_PLOT_WITH_SSRC(1, "VideoFecBitrate_kbps", now_ms,
841 : FecOverheadRate() / 1000, packet->Ssrc());
842 : BWE_TEST_LOGGING_PLOT_WITH_SSRC(1, "VideoNackBitrate_kbps", now_ms,
843 : NackOverheadRate() / 1000, packet->Ssrc());
844 : } else {
845 : BWE_TEST_LOGGING_PLOT_WITH_SSRC(1, "AudioTotBitrate_kbps", now_ms,
846 : ActualSendBitrateKbit(), packet->Ssrc());
847 : BWE_TEST_LOGGING_PLOT_WITH_SSRC(1, "AudioNackBitrate_kbps", now_ms,
848 : NackOverheadRate() / 1000, packet->Ssrc());
849 : }
850 :
851 0 : uint32_t ssrc = packet->Ssrc();
852 0 : rtc::Optional<uint32_t> flexfec_ssrc = FlexfecSsrc();
853 0 : if (paced_sender_) {
854 0 : uint16_t seq_no = packet->SequenceNumber();
855 : // Correct offset between implementations of millisecond time stamps in
856 : // TickTime and Clock.
857 0 : int64_t corrected_time_ms = packet->capture_time_ms() + clock_delta_ms_;
858 0 : size_t payload_length = packet->payload_size();
859 0 : if (ssrc == flexfec_ssrc) {
860 : // Store FlexFEC packets in the history here, so they can be found
861 : // when the pacer calls TimeToSendPacket.
862 0 : flexfec_packet_history_.PutRtpPacket(std::move(packet), storage, false);
863 : } else {
864 0 : packet_history_.PutRtpPacket(std::move(packet), storage, false);
865 : }
866 :
867 0 : paced_sender_->InsertPacket(priority, ssrc, seq_no, corrected_time_ms,
868 0 : payload_length, false);
869 0 : if (last_capture_time_ms_sent_ == 0 ||
870 0 : corrected_time_ms > last_capture_time_ms_sent_) {
871 0 : last_capture_time_ms_sent_ = corrected_time_ms;
872 0 : TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
873 : "PacedSend", corrected_time_ms,
874 : "capture_time_ms", corrected_time_ms);
875 : }
876 0 : return true;
877 : }
878 :
879 0 : PacketOptions options;
880 0 : if (UpdateTransportSequenceNumber(packet.get(), &options.packet_id)) {
881 0 : AddPacketToTransportFeedback(options.packet_id, *packet.get(),
882 0 : PacketInfo::kNotAProbe);
883 : }
884 :
885 0 : UpdateDelayStatistics(packet->capture_time_ms(), now_ms);
886 0 : UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(),
887 0 : packet->Ssrc());
888 :
889 0 : bool sent = SendPacketToNetwork(*packet, options);
890 :
891 0 : if (sent) {
892 : {
893 0 : rtc::CritScope lock(&send_critsect_);
894 0 : media_has_been_sent_ = true;
895 : }
896 0 : UpdateRtpStats(*packet, false, false);
897 : }
898 :
899 : // To support retransmissions, we store the media packet as sent in the
900 : // packet history (even if send failed).
901 0 : if (storage == kAllowRetransmission) {
902 : // TODO(brandtr): Uncomment the DCHECK line below when |ssrc_| cannot
903 : // change after the first packet has been sent. For more details, see
904 : // https://bugs.chromium.org/p/webrtc/issues/detail?id=6887.
905 : // RTC_DCHECK_EQ(ssrc, SSRC());
906 0 : packet_history_.PutRtpPacket(std::move(packet), storage, true);
907 : }
908 :
909 0 : return sent;
910 : }
911 :
912 0 : void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) {
913 0 : if (!send_side_delay_observer_ || capture_time_ms <= 0)
914 0 : return;
915 :
916 : uint32_t ssrc;
917 0 : int avg_delay_ms = 0;
918 0 : int max_delay_ms = 0;
919 : {
920 0 : rtc::CritScope lock(&send_critsect_);
921 0 : ssrc = ssrc_;
922 : }
923 : {
924 0 : rtc::CritScope cs(&statistics_crit_);
925 : // TODO(holmer): Compute this iteratively instead.
926 0 : send_delays_[now_ms] = now_ms - capture_time_ms;
927 0 : send_delays_.erase(send_delays_.begin(),
928 0 : send_delays_.lower_bound(now_ms -
929 0 : kSendSideDelayWindowMs));
930 0 : int num_delays = 0;
931 0 : for (auto it = send_delays_.upper_bound(now_ms - kSendSideDelayWindowMs);
932 0 : it != send_delays_.end(); ++it) {
933 0 : max_delay_ms = std::max(max_delay_ms, it->second);
934 0 : avg_delay_ms += it->second;
935 0 : ++num_delays;
936 : }
937 0 : if (num_delays == 0)
938 0 : return;
939 0 : avg_delay_ms = (avg_delay_ms + num_delays / 2) / num_delays;
940 : }
941 0 : send_side_delay_observer_->SendSideDelayUpdated(avg_delay_ms, max_delay_ms,
942 0 : ssrc);
943 : }
944 :
945 0 : void RTPSender::UpdateOnSendPacket(int packet_id,
946 : int64_t capture_time_ms,
947 : uint32_t ssrc) {
948 0 : if (!send_packet_observer_ || capture_time_ms <= 0 || packet_id == -1)
949 0 : return;
950 :
951 0 : send_packet_observer_->OnSendPacket(packet_id, capture_time_ms, ssrc);
952 : }
953 :
954 0 : void RTPSender::ProcessBitrate() {
955 0 : if (!bitrate_callback_)
956 0 : return;
957 0 : int64_t now_ms = clock_->TimeInMilliseconds();
958 : uint32_t ssrc;
959 : {
960 0 : rtc::CritScope lock(&send_critsect_);
961 0 : ssrc = ssrc_;
962 : }
963 :
964 0 : rtc::CritScope lock(&statistics_crit_);
965 0 : bitrate_callback_->Notify(total_bitrate_sent_.Rate(now_ms).value_or(0),
966 0 : nack_bitrate_sent_.Rate(now_ms).value_or(0), ssrc);
967 : }
968 :
969 0 : size_t RTPSender::RtpHeaderLength() const {
970 0 : rtc::CritScope lock(&send_critsect_);
971 0 : size_t rtp_header_length = kRtpHeaderLength;
972 0 : rtp_header_length += sizeof(uint32_t) * csrcs_.size();
973 0 : rtp_header_length += rtp_header_extension_map_.GetTotalLengthInBytes();
974 0 : return rtp_header_length;
975 : }
976 :
977 0 : uint16_t RTPSender::AllocateSequenceNumber(uint16_t packets_to_send) {
978 0 : rtc::CritScope lock(&send_critsect_);
979 0 : uint16_t first_allocated_sequence_number = sequence_number_;
980 0 : sequence_number_ += packets_to_send;
981 0 : return first_allocated_sequence_number;
982 : }
983 :
984 0 : void RTPSender::GetDataCounters(StreamDataCounters* rtp_stats,
985 : StreamDataCounters* rtx_stats) const {
986 0 : rtc::CritScope lock(&statistics_crit_);
987 0 : *rtp_stats = rtp_stats_;
988 0 : *rtx_stats = rtx_rtp_stats_;
989 0 : }
990 :
991 0 : std::unique_ptr<RtpPacketToSend> RTPSender::AllocatePacket() const {
992 0 : rtc::CritScope lock(&send_critsect_);
993 : std::unique_ptr<RtpPacketToSend> packet(
994 0 : new RtpPacketToSend(&rtp_header_extension_map_, max_packet_size_));
995 0 : packet->SetSsrc(ssrc_);
996 0 : packet->SetCsrcs(csrcs_);
997 : // Reserve extensions, if registered, RtpSender set in SendToNetwork.
998 0 : packet->ReserveExtension<AbsoluteSendTime>();
999 0 : packet->ReserveExtension<TransmissionOffset>();
1000 0 : packet->ReserveExtension<TransportSequenceNumber>();
1001 0 : if (playout_delay_oracle_.send_playout_delay()) {
1002 0 : packet->SetExtension<PlayoutDelayLimits>(
1003 0 : playout_delay_oracle_.playout_delay());
1004 : }
1005 0 : return packet;
1006 : }
1007 :
1008 0 : bool RTPSender::AssignSequenceNumber(RtpPacketToSend* packet) {
1009 0 : rtc::CritScope lock(&send_critsect_);
1010 0 : if (!sending_media_)
1011 0 : return false;
1012 0 : RTC_DCHECK_EQ(packet->Ssrc(), ssrc_);
1013 0 : packet->SetSequenceNumber(sequence_number_++);
1014 :
1015 : // Remember marker bit to determine if padding can be inserted with
1016 : // sequence number following |packet|.
1017 0 : last_packet_marker_bit_ = packet->Marker();
1018 : // Save timestamps to generate timestamp field and extensions for the padding.
1019 0 : last_rtp_timestamp_ = packet->Timestamp();
1020 0 : last_timestamp_time_ms_ = clock_->TimeInMilliseconds();
1021 0 : capture_time_ms_ = packet->capture_time_ms();
1022 0 : return true;
1023 : }
1024 :
1025 0 : bool RTPSender::UpdateTransportSequenceNumber(RtpPacketToSend* packet,
1026 : int* packet_id) const {
1027 0 : RTC_DCHECK(packet);
1028 0 : RTC_DCHECK(packet_id);
1029 0 : rtc::CritScope lock(&send_critsect_);
1030 0 : if (!rtp_header_extension_map_.IsRegistered(TransportSequenceNumber::kId))
1031 0 : return false;
1032 :
1033 0 : if (!transport_sequence_number_allocator_)
1034 0 : return false;
1035 :
1036 0 : *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber();
1037 :
1038 0 : if (!packet->SetExtension<TransportSequenceNumber>(*packet_id))
1039 0 : return false;
1040 :
1041 0 : return true;
1042 : }
1043 :
1044 0 : void RTPSender::SetSendingStatus(bool enabled) {
1045 0 : if (!enabled) {
1046 0 : rtc::CritScope lock(&send_critsect_);
1047 0 : if (!ssrc_forced_) {
1048 : // Generate a new SSRC.
1049 0 : ssrc_db_->ReturnSSRC(ssrc_);
1050 0 : ssrc_ = ssrc_db_->CreateSSRC();
1051 0 : RTC_DCHECK(ssrc_ != 0);
1052 : }
1053 : // Don't initialize seq number if SSRC passed externally.
1054 0 : if (!sequence_number_forced_ && !ssrc_forced_) {
1055 : // Generate a new sequence number.
1056 0 : sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
1057 : }
1058 : }
1059 0 : }
1060 :
1061 0 : void RTPSender::SetSendingMediaStatus(bool enabled) {
1062 0 : rtc::CritScope lock(&send_critsect_);
1063 0 : sending_media_ = enabled;
1064 0 : }
1065 :
1066 0 : bool RTPSender::SendingMedia() const {
1067 0 : rtc::CritScope lock(&send_critsect_);
1068 0 : return sending_media_;
1069 : }
1070 :
1071 0 : void RTPSender::SetTimestampOffset(uint32_t timestamp) {
1072 0 : rtc::CritScope lock(&send_critsect_);
1073 0 : timestamp_offset_ = timestamp;
1074 0 : }
1075 :
1076 0 : uint32_t RTPSender::TimestampOffset() const {
1077 0 : rtc::CritScope lock(&send_critsect_);
1078 0 : return timestamp_offset_;
1079 : }
1080 :
1081 0 : uint32_t RTPSender::GenerateNewSSRC() {
1082 : // If configured via API, return 0.
1083 0 : rtc::CritScope lock(&send_critsect_);
1084 :
1085 0 : if (ssrc_forced_) {
1086 0 : return 0;
1087 : }
1088 0 : ssrc_ = ssrc_db_->CreateSSRC();
1089 0 : RTC_DCHECK(ssrc_ != 0);
1090 0 : return ssrc_;
1091 : }
1092 :
1093 0 : void RTPSender::SetSSRC(uint32_t ssrc) {
1094 : // This is configured via the API.
1095 0 : rtc::CritScope lock(&send_critsect_);
1096 :
1097 0 : if (ssrc_ == ssrc && ssrc_forced_) {
1098 0 : return; // Since it's same ssrc, don't reset anything.
1099 : }
1100 0 : ssrc_forced_ = true;
1101 0 : ssrc_db_->ReturnSSRC(ssrc_);
1102 0 : ssrc_db_->RegisterSSRC(ssrc);
1103 0 : ssrc_ = ssrc;
1104 0 : if (!sequence_number_forced_) {
1105 0 : sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
1106 : }
1107 : }
1108 :
1109 0 : uint32_t RTPSender::SSRC() const {
1110 0 : rtc::CritScope lock(&send_critsect_);
1111 0 : return ssrc_;
1112 : }
1113 :
1114 0 : rtc::Optional<uint32_t> RTPSender::FlexfecSsrc() const {
1115 0 : if (video_) {
1116 0 : return video_->FlexfecSsrc();
1117 : }
1118 0 : return rtc::Optional<uint32_t>();
1119 : }
1120 :
1121 0 : void RTPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) {
1122 0 : assert(csrcs.size() <= kRtpCsrcSize);
1123 0 : rtc::CritScope lock(&send_critsect_);
1124 0 : csrcs_ = csrcs;
1125 0 : }
1126 :
1127 0 : void RTPSender::SetSequenceNumber(uint16_t seq) {
1128 0 : rtc::CritScope lock(&send_critsect_);
1129 0 : sequence_number_forced_ = true;
1130 0 : sequence_number_ = seq;
1131 0 : }
1132 :
1133 0 : uint16_t RTPSender::SequenceNumber() const {
1134 0 : rtc::CritScope lock(&send_critsect_);
1135 0 : return sequence_number_;
1136 : }
1137 :
1138 : // Audio.
1139 0 : int32_t RTPSender::SendTelephoneEvent(uint8_t key,
1140 : uint16_t time_ms,
1141 : uint8_t level) {
1142 0 : if (!audio_configured_) {
1143 0 : return -1;
1144 : }
1145 0 : return audio_->SendTelephoneEvent(key, time_ms, level);
1146 : }
1147 :
1148 0 : int32_t RTPSender::SetAudioPacketSize(uint16_t packet_size_samples) {
1149 0 : if (!audio_configured_) {
1150 0 : return -1;
1151 : }
1152 0 : return 0;
1153 : }
1154 :
1155 0 : int32_t RTPSender::SetAudioLevel(uint8_t level_d_bov) {
1156 0 : return audio_->SetAudioLevel(level_d_bov);
1157 : }
1158 :
1159 0 : RtpVideoCodecTypes RTPSender::VideoCodecType() const {
1160 0 : assert(!audio_configured_ && "Sender is an audio stream!");
1161 0 : return video_->VideoCodecType();
1162 : }
1163 :
1164 0 : void RTPSender::SetUlpfecConfig(int red_payload_type, int ulpfec_payload_type) {
1165 0 : RTC_DCHECK(!audio_configured_);
1166 0 : video_->SetUlpfecConfig(red_payload_type, ulpfec_payload_type);
1167 0 : }
1168 :
1169 0 : bool RTPSender::SetFecParameters(const FecProtectionParams& delta_params,
1170 : const FecProtectionParams& key_params) {
1171 0 : if (audio_configured_) {
1172 0 : return false;
1173 : }
1174 0 : video_->SetFecParameters(delta_params, key_params);
1175 0 : return true;
1176 : }
1177 :
1178 0 : std::unique_ptr<RtpPacketToSend> RTPSender::BuildRtxPacket(
1179 : const RtpPacketToSend& packet) {
1180 : // TODO(danilchap): Create rtx packet with extra capacity for SRTP
1181 : // when transport interface would be updated to take buffer class.
1182 : std::unique_ptr<RtpPacketToSend> rtx_packet(new RtpPacketToSend(
1183 0 : &rtp_header_extension_map_, packet.size() + kRtxHeaderSize));
1184 : // Add original RTP header.
1185 0 : rtx_packet->CopyHeaderFrom(packet);
1186 : {
1187 0 : rtc::CritScope lock(&send_critsect_);
1188 0 : if (!sending_media_)
1189 0 : return nullptr;
1190 :
1191 : // Replace payload type.
1192 0 : auto kv = rtx_payload_type_map_.find(packet.PayloadType());
1193 0 : if (kv == rtx_payload_type_map_.end())
1194 0 : return nullptr;
1195 0 : rtx_packet->SetPayloadType(kv->second);
1196 :
1197 : // Replace sequence number.
1198 0 : rtx_packet->SetSequenceNumber(sequence_number_rtx_++);
1199 :
1200 : // Replace SSRC.
1201 0 : rtx_packet->SetSsrc(ssrc_rtx_);
1202 : }
1203 :
1204 : uint8_t* rtx_payload =
1205 0 : rtx_packet->AllocatePayload(packet.payload_size() + kRtxHeaderSize);
1206 0 : RTC_DCHECK(rtx_payload);
1207 : // Add OSN (original sequence number).
1208 0 : ByteWriter<uint16_t>::WriteBigEndian(rtx_payload, packet.SequenceNumber());
1209 :
1210 : // Add original payload data.
1211 0 : auto payload = packet.payload();
1212 0 : memcpy(rtx_payload + kRtxHeaderSize, payload.data(), payload.size());
1213 :
1214 0 : return rtx_packet;
1215 : }
1216 :
1217 0 : void RTPSender::RegisterRtpStatisticsCallback(
1218 : StreamDataCountersCallback* callback) {
1219 0 : rtc::CritScope cs(&statistics_crit_);
1220 0 : rtp_stats_callback_ = callback;
1221 0 : }
1222 :
1223 0 : StreamDataCountersCallback* RTPSender::GetRtpStatisticsCallback() const {
1224 0 : rtc::CritScope cs(&statistics_crit_);
1225 0 : return rtp_stats_callback_;
1226 : }
1227 :
1228 0 : uint32_t RTPSender::BitrateSent() const {
1229 0 : rtc::CritScope cs(&statistics_crit_);
1230 0 : return total_bitrate_sent_.Rate(clock_->TimeInMilliseconds()).value_or(0);
1231 : }
1232 :
1233 0 : void RTPSender::SetRtpState(const RtpState& rtp_state) {
1234 0 : rtc::CritScope lock(&send_critsect_);
1235 0 : sequence_number_ = rtp_state.sequence_number;
1236 0 : sequence_number_forced_ = true;
1237 0 : timestamp_offset_ = rtp_state.start_timestamp;
1238 0 : last_rtp_timestamp_ = rtp_state.timestamp;
1239 0 : capture_time_ms_ = rtp_state.capture_time_ms;
1240 0 : last_timestamp_time_ms_ = rtp_state.last_timestamp_time_ms;
1241 0 : media_has_been_sent_ = rtp_state.media_has_been_sent;
1242 0 : }
1243 :
1244 0 : RtpState RTPSender::GetRtpState() const {
1245 0 : rtc::CritScope lock(&send_critsect_);
1246 :
1247 0 : RtpState state;
1248 0 : state.sequence_number = sequence_number_;
1249 0 : state.start_timestamp = timestamp_offset_;
1250 0 : state.timestamp = last_rtp_timestamp_;
1251 0 : state.capture_time_ms = capture_time_ms_;
1252 0 : state.last_timestamp_time_ms = last_timestamp_time_ms_;
1253 0 : state.media_has_been_sent = media_has_been_sent_;
1254 :
1255 0 : return state;
1256 : }
1257 :
1258 0 : void RTPSender::SetRtxRtpState(const RtpState& rtp_state) {
1259 0 : rtc::CritScope lock(&send_critsect_);
1260 0 : sequence_number_rtx_ = rtp_state.sequence_number;
1261 0 : }
1262 :
1263 0 : RtpState RTPSender::GetRtxRtpState() const {
1264 0 : rtc::CritScope lock(&send_critsect_);
1265 :
1266 0 : RtpState state;
1267 0 : state.sequence_number = sequence_number_rtx_;
1268 0 : state.start_timestamp = timestamp_offset_;
1269 :
1270 0 : return state;
1271 : }
1272 :
1273 0 : void RTPSender::AddPacketToTransportFeedback(uint16_t packet_id,
1274 : const RtpPacketToSend& packet,
1275 : int probe_cluster_id) {
1276 0 : size_t packet_size = packet.payload_size() + packet.padding_size();
1277 0 : if (webrtc::field_trial::FindFullName("WebRTC-SendSideBwe-WithOverhead") ==
1278 : "Enabled") {
1279 0 : packet_size = packet.size();
1280 : }
1281 :
1282 0 : if (transport_feedback_observer_) {
1283 0 : transport_feedback_observer_->AddPacket(packet_id, packet_size,
1284 0 : probe_cluster_id);
1285 : }
1286 0 : }
1287 :
1288 0 : void RTPSender::UpdateRtpOverhead(const RtpPacketToSend& packet) {
1289 0 : if (!overhead_observer_)
1290 0 : return;
1291 : size_t overhead_bytes_per_packet;
1292 : {
1293 0 : rtc::CritScope lock(&send_critsect_);
1294 0 : if (rtp_overhead_bytes_per_packet_ == packet.headers_size()) {
1295 0 : return;
1296 : }
1297 0 : rtp_overhead_bytes_per_packet_ = packet.headers_size();
1298 0 : overhead_bytes_per_packet = rtp_overhead_bytes_per_packet_;
1299 : }
1300 0 : overhead_observer_->OnOverheadChanged(overhead_bytes_per_packet);
1301 : }
1302 :
1303 : } // namespace webrtc
|